UNPKG

cfc-ds

Version:

Design System do Conselho Federal de Contabilidade baseado no govbr-ds

118 lines 19.5 kB
import { Component, EventEmitter, Input, Output } from '@angular/core'; import { TimerType } from '../../enums/timer-type.enum'; import * as i0 from "@angular/core"; import * as i1 from "../../services/timer.service"; import * as i2 from "@angular/common"; import * as i3 from "@angular/flex-layout/flex"; import * as i4 from "@angular/flex-layout/extended"; export class TimerComponent { timerService; type = TimerType.primary; initialTime = '0:30:00'; criticalTime = 300; isGlobal = false; timeOutEvent = new EventEmitter(); timeEvent = new EventEmitter(); timeCriticalEvent = new EventEmitter(); displayTime = '30:00'; criticalTimeIsOut = false; timerTypes = TimerType; remainingTimeSubscription; localRemainingTime = 0; constructor(timerService) { this.timerService = timerService; } ngOnInit() { this.startTimer(); } ngOnDestroy() { if (this.isGlobal) { this.timerService.stopCountdown(); this.remainingTimeSubscription.unsubscribe(); } } startTimer() { if (this.isGlobal) { this.timerService.startCountdown(this.initialTime); this.remainingTimeSubscription = this.timerService.getCountdown().subscribe((remainingTime) => { if (remainingTime !== null) { this.updateDisplayTime(remainingTime); if (!this.criticalTimeIsOut && remainingTime <= this.criticalTime) { this.timeCriticalEvent.emit(); this.criticalTimeIsOut = true; } if (remainingTime <= 0) { this.timeOutEvent.emit(); } else { this.timeEvent.emit(); } } }); } else { // Contagem local quando isGlobal = false this.localRemainingTime = this.parseTimeToSeconds(this.initialTime); this.startLocalCountdown(); } } startLocalCountdown() { const intervalId = setInterval(() => { this.localRemainingTime--; this.updateDisplayTime(this.localRemainingTime); if (!this.criticalTimeIsOut && this.localRemainingTime <= this.criticalTime) { this.timeCriticalEvent.emit(); this.criticalTimeIsOut = true; } if (this.localRemainingTime <= 0) { clearInterval(intervalId); this.timeOutEvent.emit(); } else { this.timeEvent.emit(); } }, 1000); } updateDisplayTime(seconds) { const days = Math.floor(seconds / 86400); const hours = Math.floor((seconds % 86400) / 3600); const minutes = Math.floor((seconds % 3600) / 60); const remainingSeconds = seconds % 60; this.displayTime = days > 0 ? `${days} dias` : `${this.padZero(hours)}:${this.padZero(minutes)}:${this.padZero(remainingSeconds)}`; } padZero(number) { return number < 10 ? `0${number}` : `${number}`; } parseTimeToSeconds(time) { if (typeof time === 'number') { return time; } const parts = time.split(':').map(Number).reverse(); const [seconds = 0, minutes = 0, hours = 0, days = 0] = parts; return seconds + minutes * 60 + hours * 3600 + days * 86400; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TimerComponent, deps: [{ token: i1.TimerService }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TimerComponent, selector: "cfc-timer", inputs: { type: "type", initialTime: "initialTime", criticalTime: "criticalTime", isGlobal: "isGlobal" }, outputs: { timeOutEvent: "timeOutEvent", timeEvent: "timeEvent", timeCriticalEvent: "timeCriticalEvent" }, ngImport: i0, template: "<button\r\n class=\"br-button\"\r\n style=\"pointer-events: none; cursor: default; min-width: 9.3rem;\"\r\n [ngClass]=\"{\r\n 'bg-gray-2': (type === timerTypes.primary && !criticalTimeIsOut),\r\n 'bg-yellow-5': (type === timerTypes.primary && criticalTimeIsOut),\r\n 'text-pure-100': type === timerTypes.primary,\r\n 'bg-blue-warm-60': (type === timerTypes.secondary && !criticalTimeIsOut),\r\n 'bg-red-warm-20': (type === timerTypes.secondary && criticalTimeIsOut),\r\n 'text-blue-warm-60': (type === timerTypes.secondary && criticalTimeIsOut),\r\n 'text-pure-0': type === timerTypes.secondary && !criticalTimeIsOut\r\n }\"\r\n fxLayoutGap=\"0.1rem\"\r\n fxLayoutAlign=\"start center\">\r\n <i class=\"fas fa-clock\"></i>\r\n <span style=\"font-size: 14px;\">{{ displayTime }}</span>\r\n</button>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i3.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i4.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TimerComponent, decorators: [{ type: Component, args: [{ selector: 'cfc-timer', template: "<button\r\n class=\"br-button\"\r\n style=\"pointer-events: none; cursor: default; min-width: 9.3rem;\"\r\n [ngClass]=\"{\r\n 'bg-gray-2': (type === timerTypes.primary && !criticalTimeIsOut),\r\n 'bg-yellow-5': (type === timerTypes.primary && criticalTimeIsOut),\r\n 'text-pure-100': type === timerTypes.primary,\r\n 'bg-blue-warm-60': (type === timerTypes.secondary && !criticalTimeIsOut),\r\n 'bg-red-warm-20': (type === timerTypes.secondary && criticalTimeIsOut),\r\n 'text-blue-warm-60': (type === timerTypes.secondary && criticalTimeIsOut),\r\n 'text-pure-0': type === timerTypes.secondary && !criticalTimeIsOut\r\n }\"\r\n fxLayoutGap=\"0.1rem\"\r\n fxLayoutAlign=\"start center\">\r\n <i class=\"fas fa-clock\"></i>\r\n <span style=\"font-size: 14px;\">{{ displayTime }}</span>\r\n</button>\r\n" }] }], ctorParameters: () => [{ type: i1.TimerService }], propDecorators: { type: [{ type: Input }], initialTime: [{ type: Input }], criticalTime: [{ type: Input }], isGlobal: [{ type: Input }], timeOutEvent: [{ type: Output }], timeEvent: [{ type: Output }], timeCriticalEvent: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2ZjLWRzL3NyYy9saWIvY29tcG9uZW50cy90aW1lci90aW1lci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL3RpbWVyL3RpbWVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzFGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7Ozs7O0FBT3hELE1BQU0sT0FBTyxjQUFjO0lBa0JmO0lBakJELElBQUksR0FBYyxTQUFTLENBQUMsT0FBTyxDQUFDO0lBQ3BDLFdBQVcsR0FBb0IsU0FBUyxDQUFDO0lBQ3pDLFlBQVksR0FBRyxHQUFHLENBQUM7SUFDbkIsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUVoQixZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUN4QyxTQUFTLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUNyQyxpQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0lBRXZELFdBQVcsR0FBRyxPQUFPLENBQUM7SUFDdEIsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO0lBQzFCLFVBQVUsR0FBcUIsU0FBUyxDQUFDO0lBRWpDLHlCQUF5QixDQUFnQjtJQUN6QyxrQkFBa0IsR0FBVyxDQUFDLENBQUM7SUFFdkMsWUFDVSxZQUEwQjtRQUExQixpQkFBWSxHQUFaLFlBQVksQ0FBYztJQUNqQyxDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxD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QUFNO2dCQUNHLGlCQUFpQjtzQkFBMUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVGltZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGltZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFRpbWVyVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL3RpbWVyLXR5cGUuZW51bSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2NmYy10aW1lcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RpbWVyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90aW1lci5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVGltZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgQElucHV0KCkgdHlwZTogVGltZXJUeXBlID0gVGltZXJUeXBlLnByaW1hcnk7XHJcbiAgQElucHV0KCkgaW5pdGlhbFRpbWU6IHN0cmluZyB8IG51bWJlciA9ICcwOjMwOjAwJztcclxuICBASW5wdXQoKSBjcml0aWNhbFRpbWUgPSAzMDA7XHJcbiAgQElucHV0KCkgaXNHbG9iYWwgPSBmYWxzZTtcclxuXHJcbiAgQE91dHB1dCgpIHRpbWVPdXRFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAT3V0cHV0KCkgdGltZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gIEBPdXRwdXQoKSB0aW1lQ3JpdGljYWxFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgZGlzcGxheVRpbWUgPSAnMzA6MDAnO1xyXG4gIGNyaXRpY2FsVGltZUlzT3V0ID0gZmFsc2U7XHJcbiAgdGltZXJUeXBlczogdHlwZW9mIFRpbWVyVHlwZSA9IFRpbWVyVHlwZTtcclxuXHJcbiAgcHJpdmF0ZSByZW1haW5pbmdUaW1lU3Vic2NyaXB0aW9uITogU3Vic2NyaXB0aW9uO1xyXG4gIHByaXZhdGUgbG9jYWxSZW1haW5pbmdUaW1lOiBudW1iZXIgPSAwO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgdGltZXJTZXJ2aWNlOiBUaW1lclNlcnZpY2VcclxuICApIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdGFydFRpbWVyKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzR2xvYmFsKSB7XHJcbiAgICAgIHRoaXMudGltZXJTZXJ2aWNlLnN0b3BDb3VudGRvd24oKTtcclxuICAgICAgdGhpcy5yZW1haW5pbmdUaW1lU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGFydFRpbWVyKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNHbG9iYWwpIHtcclxuICAgICAgdGhpcy50aW1lclNlcnZpY2Uuc3RhcnRDb3VudGRvd24odGhpcy5pbml0aWFsVGltZSk7XHJcblxyXG4gICAgICB0aGlzLnJlbWFpbmluZ1RpbWVTdWJzY3JpcHRpb24gPSB0aGlzLnRpbWVyU2VydmljZS5nZXRDb3VudGRvd24oKS5zdWJzY3JpYmUoKHJlbWFpbmluZ1RpbWUpID0+IHtcclxuICAgICAgICBpZiAocmVtYWluaW5nVGltZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVEaXNwbGF5VGltZShyZW1haW5pbmdUaW1lKTtcclxuXHJcbiAgICAgICAgICBpZiAoIXRoaXMuY3JpdGljYWxUaW1lSXNPdXQgJiYgcmVtYWluaW5nVGltZSA8PSB0aGlzLmNyaXRpY2FsVGltZSkge1xyXG4gICAgICAgICAgICB0aGlzLnRpbWVDcml0aWNhbEV2ZW50LmVtaXQoKTtcclxuICAgICAgICAgICAgdGhpcy5jcml0aWNhbFRpbWVJc091dCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHJlbWFpbmluZ1RpbWUgPD0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnRpbWVPdXRFdmVudC5lbWl0KCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnRpbWVFdmVudC5lbWl0KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIENvbnRhZ2VtIGxvY2FsIHF1YW5kbyBpc0dsb2JhbCA9IGZhbHNlXHJcbiAgICAgIHRoaXMubG9jYWxSZW1haW5pbmdUaW1lID0gdGhpcy5wYXJzZVRpbWVUb1NlY29uZHModGhpcy5pbml0aWFsVGltZSk7XHJcbiAgICAgIHRoaXMuc3RhcnRMb2NhbENvdW50ZG93bigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGFydExvY2FsQ291bnRkb3duKCk6IHZvaWQge1xyXG4gICAgY29uc3QgaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgdGhpcy5sb2NhbFJlbWFpbmluZ1RpbWUtLTtcclxuXHJcbiAgICAgIHRoaXMudXBkYXRlRGlzcGxheVRpbWUodGhpcy5sb2NhbFJlbWFpbmluZ1RpbWUpO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLmNyaXRpY2FsVGltZUlzT3V0ICYmIHRoaXMubG9jYWxSZW1haW5pbmdUaW1lIDw9IHRoaXMuY3JpdGljYWxUaW1lKSB7XHJcbiAgICAgICAgdGhpcy50aW1lQ3JpdGljYWxFdmVudC5lbWl0KCk7XHJcbiAgICAgICAgdGhpcy5jcml0aWNhbFRpbWVJc091dCA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLmxvY2FsUmVtYWluaW5nVGltZSA8PSAwKSB7XHJcbiAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcclxuICAgICAgICB0aGlzLnRpbWVPdXRFdmVudC5lbWl0KCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy50aW1lRXZlbnQuZW1pdCgpO1xyXG4gICAgICB9XHJcbiAgICB9LCAxMDAwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRGlzcGxheVRpbWUoc2Vjb25kczogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCBkYXlzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gODY0MDApO1xyXG4gICAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKChzZWNvbmRzICUgODY0MDApIC8gMzYwMCk7XHJcbiAgICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcigoc2Vjb25kcyAlIDM2MDApIC8gNjApO1xyXG4gICAgY29uc3QgcmVtYWluaW5nU2Vjb25kcyA9IHNlY29uZHMgJSA2MDtcclxuXHJcbiAgICB0aGlzLmRpc3BsYXlUaW1lID1cclxuICAgICAgZGF5cyA+IDBcclxuICAgICAgICA/IGAke2RheXN9IGRpYXNgXHJcbiAgICAgICAgOiBgJHt0aGlzLnBhZFplcm8oaG91cnMpfToke3RoaXMucGFkWmVybyhtaW51dGVzKX06JHt0aGlzLnBhZFplcm8ocmVtYWluaW5nU2Vjb25kcyl9YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGFkWmVybyhudW1iZXI6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gbnVtYmVyIDwgMTAgPyBgMCR7bnVtYmVyfWAgOiBgJHtudW1iZXJ9YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGFyc2VUaW1lVG9TZWNvbmRzKHRpbWU6IHN0cmluZyB8IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBpZiAodHlwZW9mIHRpbWUgPT09ICdudW1iZXInKSB7XHJcbiAgICAgIHJldHVybiB0aW1lO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHBhcnRzID0gdGltZS5zcGxpdCgnOicpLm1hcChOdW1iZXIpLnJldmVyc2UoKTtcclxuICAgIGNvbnN0IFtzZWNvbmRzID0gMCwgbWludXRlcyA9IDAsIGhvdXJzID0gMCwgZGF5cyA9IDBdID0gcGFydHM7XHJcblxyXG4gICAgcmV0dXJuIHNlY29uZHMgKyBtaW51dGVzICogNjAgKyBob3VycyAqIDM2MDAgKyBkYXlzICogODY0MDA7XHJcbiAgfVxyXG59XHJcbiIsIjxidXR0b25cclxuICBjbGFzcz1cImJyLWJ1dHRvblwiXHJcbiAgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogbm9uZTsgY3Vyc29yOiBkZWZhdWx0OyBtaW4td2lkdGg6IDkuM3JlbTtcIlxyXG4gIFtuZ0NsYXNzXT1cIntcclxuICAgICdiZy1ncmF5LTInOiAodHlwZSA9PT0gdGltZXJUeXBlcy5wcmltYXJ5ICYmICFjcml0aWNhbFRpbWVJc091dCksXHJcbiAgICAnYmcteWVsbG93LTUnOiAodHlwZSA9PT0gdGltZXJUeXBlcy5wcmltYXJ5ICYmIGNyaXRpY2FsVGltZUlzT3V0KSxcclxuICAgICd0ZXh0LXB1cmUtMTAwJzogdHlwZSA9PT0gdGltZXJUeXBlcy5wcmltYXJ5LFxyXG4gICAgJ2JnLWJsdWUtd2FybS02MCc6ICh0eXBlID09PSB0aW1lclR5cGVzLnNlY29uZGFyeSAmJiAhY3JpdGljYWxUaW1lSXNPdXQpLFxyXG4gICAgJ2JnLXJlZC13YXJtLTIwJzogKHR5cGUgPT09IHRpbWVyVHlwZXMuc2Vjb25kYXJ5ICYmIGNyaXRpY2FsVGltZUlzT3V0KSxcclxuICAgICd0ZXh0LWJsdWUtd2FybS02MCc6ICh0eXBlID09PSB0aW1lclR5cGVzLnNlY29uZGFyeSAmJiBjcml0aWNhbFRpbWVJc091dCksXHJcbiAgICAndGV4dC1wdXJlLTAnOiB0eXBlID09PSB0aW1lclR5cGVzLnNlY29uZGFyeSAmJiAhY3JpdGljYWxUaW1lSXNPdXRcclxuICB9XCJcclxuICBmeExheW91dEdhcD1cIjAuMXJlbVwiXHJcbiAgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IGNlbnRlclwiPlxyXG4gIDxpIGNsYXNzPVwiZmFzIGZhLWNsb2NrXCI+PC9pPlxyXG4gIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxNHB4O1wiPnt7IGRpc3BsYXlUaW1lIH19PC9zcGFuPlxyXG48L2J1dHRvbj5cclxuIl19