UNPKG

@candidosales/material-time-picker

Version:
95 lines 22.3 kB
import { CLOCK_TYPE, WClockComponent } from '../w-clock/w-clock.component'; import { Utils } from '../utils'; import { Component, EventEmitter, Input, Output } from '@angular/core'; import { Breakpoints } from '@angular/cdk/layout'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { MatToolbar } from '@angular/material/toolbar'; import { NgClass } from '@angular/common'; import * as i0 from "@angular/core"; import * as i1 from "@angular/cdk/layout"; export class WTimeComponent { constructor(breakpointObserver) { this.destroyed = new Subject(); this.userTimeChange = new EventEmitter(); this.onRevert = new EventEmitter(); this.onSubmit = new EventEmitter(); this.VIEW_HOURS = CLOCK_TYPE.HOURS; this.VIEW_MINUTES = CLOCK_TYPE.MINUTES; this.currentView = this.VIEW_HOURS; this.currentClassScreenSize = ''; breakpointObserver .observe([ Breakpoints.XSmall, Breakpoints.Small, ]) .pipe(takeUntil(this.destroyed)) .subscribe(result => { for (const query of Object.keys(result.breakpoints)) { if (result.breakpoints[query]) { this.currentClassScreenSize = 'vertical-time'; } else this.currentClassScreenSize = ''; } }); } ngOnInit() { if (!this.userTime) { this.userTime = { hour: 6, minute: 0, meriden: 'PM', format: 12 }; } if (!this.revertLabel) { this.revertLabel = 'Cancel'; } if (!this.submitLabel) { this.submitLabel = 'Okay'; } } formatHour(format, hour) { return Utils.formatHour(format, hour); } formatMinute(minute) { return Utils.formatMinute(minute); } setCurrentView(type) { this.currentView = type; } setMeridien(m) { this.userTime.meriden = m; } revert() { this.onRevert.emit(); } submit() { this.onSubmit.emit(this.userTime); } emituserTimeChange(event) { this.userTimeChange.emit(this.userTime); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: WTimeComponent, deps: [{ token: i1.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: WTimeComponent, isStandalone: true, selector: "w-time", inputs: { userTime: "userTime", revertLabel: "revertLabel", submitLabel: "submitLabel", color: "color" }, outputs: { userTimeChange: "userTimeChange", onRevert: "onRevert", onSubmit: "onSubmit" }, ngImport: i0, template: "<div class=\"d-flex flex-row flex-md-column justify-content-center align-items-center w-time\" [ngClass]=\"currentClassScreenSize\">\n <mat-toolbar class=\"d-flex flex-column flex-md-row justify-content-center align-items-center w-timepicker-time-container\" [color]=\"color\">\n\n <div class=\"w-timepicker-selected-time\">\n <span [class]=\"currentView === VIEW_HOURS ? 'active': ''\" (click)=\"setCurrentView(VIEW_HOURS)\">{{ formatHour(userTime.format, userTime.hour) }}:</span>\n <span [class]=\"currentView === VIEW_MINUTES ? 'active': ''\" (click)=\"setCurrentView(VIEW_MINUTES)\">{{ formatMinute(userTime.minute) }}</span>\n </div>\n @if (userTime.format === 12) {\n <div class=\"d-flex flex-column justify-content-center align-items-center w-timepicker-selected-ampm\">\n <span (click)=\"setMeridien('AM')\" [class]=\"userTime.meriden === 'AM' ? 'active' : ''\">AM</span>\n <span (click)=\"setMeridien('PM')\" [class]=\"userTime.meriden === 'PM' ? 'active' : ''\">PM</span>\n </div>\n }\n\n </mat-toolbar>\n\n <div class=\"d-flex flex-column flex-md-row justify-content-between align-items-center w-time-content\">\n <w-clock [color]=\"color\" class=\"w-animation-zoom\" [userTime]=\"userTime\" (userTimeChange)=\"emituserTimeChange($event)\" [(currentView)]=\"currentView\" (viewChange)=\"setCurrentView($event)\"></w-clock>\n\n <div class=\"d-flex align-items-end\">\n <button class=\"btn btn-sm\" (click)=\"revert()\">{{revertLabel}}</button>\n <button class=\"btn btn-sm btn-{{color}}\" (click)=\"submit()\">{{submitLabel}}</button>\n </div>\n </div>\n</div>\n", styles: [".d-flex{display:flex}.flex-row{flex-direction:row}.flex-column{flex-direction:column}.justify-content-center{justify-content:center}.justify-content-between{justify-content:space-between}.align-items-center{align-items:center}.align-items-end{align-items:end}@media (min-width: 768px){.flex-md-row{flex-direction:row}.flex-md-column{flex-direction:column}}:host{display:block}.w-time{max-height:100%;min-height:350px;height:350px}.w-time .w-timepicker-time-container{padding:15px;min-width:160px;height:100%}.w-time .w-timepicker-selected-time{font-size:3.5rem;font-weight:400;display:flex}.w-time .w-timepicker-selected-ampm{font-size:1rem;line-height:1.3rem;padding-top:2rem}.w-time .w-time-content{width:100%;height:100%;padding:6px}.w-time .w-time-content w-clock{padding:12px 0;height:calc(100% - 58px)}.w-time.vertical-time{height:auto}.w-time.vertical-time .w-timepicker-time-container{min-width:auto;width:100%;height:100px}.w-time.vertical-time .w-timepicker-time-container .w-timepicker-selected-ampm{padding:0 12px}.w-timepicker-selected-time>span,.w-timepicker-selected-ampm>span{outline:0;opacity:.5}.w-timepicker-selected-time>span:not(.active),.w-timepicker-selected-ampm>span:not(.active){cursor:pointer}.w-timepicker-selected-time>span.active,.w-timepicker-selected-ampm>span.active{opacity:1}.w-animate-next{opacity:0;-webkit-transform:translate3d(50%,0,1px);transform:translate3d(50%,0,1px)}.w-animate-next-remove{-webkit-transition:all .5s cubic-bezier(.35,0,.25,1);transition:all .5s cubic-bezier(.35,0,.25,1);opacity:0;-webkit-transform:translate3d(50%,0,1px);transform:translate3d(50%,0,1px)}.w-animate-next-remove-active{opacity:1;-webkit-transform:translate3d(0,0,1px);transform:translateZ(1px)}.w-animate-prev{opacity:0;-webkit-transform:translate3d(-50%,0,1px);transform:translate3d(-50%,0,1px)}.w-animate-prev-remove{-webkit-transition:all .3s cubic-bezier(.35,0,.25,1);transition:all .3s cubic-bezier(.35,0,.25,1);opacity:0;-webkit-transform:translate3d(-50%,0,1px);transform:translate3d(-50%,0,1px)}.w-animate-prev-remove-active{opacity:1;-webkit-transform:translate3d(0,0,1px);transform:translateZ(1px)}@-webkit-keyframes w-animation-bounce{0%{opacity:0;-webkit-transform:scale(.95);transform:scale(.95)}70%{opacity:1;-webkit-transform:scale(1.05);transform:scale(1.05)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes w-animation-bounce{0%{opacity:0;-webkit-transform:scale(.95);transform:scale(.95)}70%{opacity:1;-webkit-transform:scale(1.05);transform:scale(1.05)}to{-webkit-transform:scale(1);transform:scale(1)}}.w-animation-zoom.ng-enter{-webkit-transition:all .3s cubic-bezier(.35,0,.25,1);transition:all .3s cubic-bezier(.35,0,.25,1);-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-name:w-animation-bounce;animation-name:w-animation-bounce}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "component", type: WClockComponent, selector: "w-clock", inputs: ["userTime", "currentView", "color"], outputs: ["userTimeChange", "viewChange"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: WTimeComponent, decorators: [{ type: Component, args: [{ selector: 'w-time', standalone: true, imports: [NgClass, MatToolbar, WClockComponent], template: "<div class=\"d-flex flex-row flex-md-column justify-content-center align-items-center w-time\" [ngClass]=\"currentClassScreenSize\">\n <mat-toolbar class=\"d-flex flex-column flex-md-row justify-content-center align-items-center w-timepicker-time-container\" [color]=\"color\">\n\n <div class=\"w-timepicker-selected-time\">\n <span [class]=\"currentView === VIEW_HOURS ? 'active': ''\" (click)=\"setCurrentView(VIEW_HOURS)\">{{ formatHour(userTime.format, userTime.hour) }}:</span>\n <span [class]=\"currentView === VIEW_MINUTES ? 'active': ''\" (click)=\"setCurrentView(VIEW_MINUTES)\">{{ formatMinute(userTime.minute) }}</span>\n </div>\n @if (userTime.format === 12) {\n <div class=\"d-flex flex-column justify-content-center align-items-center w-timepicker-selected-ampm\">\n <span (click)=\"setMeridien('AM')\" [class]=\"userTime.meriden === 'AM' ? 'active' : ''\">AM</span>\n <span (click)=\"setMeridien('PM')\" [class]=\"userTime.meriden === 'PM' ? 'active' : ''\">PM</span>\n </div>\n }\n\n </mat-toolbar>\n\n <div class=\"d-flex flex-column flex-md-row justify-content-between align-items-center w-time-content\">\n <w-clock [color]=\"color\" class=\"w-animation-zoom\" [userTime]=\"userTime\" (userTimeChange)=\"emituserTimeChange($event)\" [(currentView)]=\"currentView\" (viewChange)=\"setCurrentView($event)\"></w-clock>\n\n <div class=\"d-flex align-items-end\">\n <button class=\"btn btn-sm\" (click)=\"revert()\">{{revertLabel}}</button>\n <button class=\"btn btn-sm btn-{{color}}\" (click)=\"submit()\">{{submitLabel}}</button>\n </div>\n </div>\n</div>\n", styles: [".d-flex{display:flex}.flex-row{flex-direction:row}.flex-column{flex-direction:column}.justify-content-center{justify-content:center}.justify-content-between{justify-content:space-between}.align-items-center{align-items:center}.align-items-end{align-items:end}@media (min-width: 768px){.flex-md-row{flex-direction:row}.flex-md-column{flex-direction:column}}:host{display:block}.w-time{max-height:100%;min-height:350px;height:350px}.w-time .w-timepicker-time-container{padding:15px;min-width:160px;height:100%}.w-time .w-timepicker-selected-time{font-size:3.5rem;font-weight:400;display:flex}.w-time .w-timepicker-selected-ampm{font-size:1rem;line-height:1.3rem;padding-top:2rem}.w-time .w-time-content{width:100%;height:100%;padding:6px}.w-time .w-time-content w-clock{padding:12px 0;height:calc(100% - 58px)}.w-time.vertical-time{height:auto}.w-time.vertical-time .w-timepicker-time-container{min-width:auto;width:100%;height:100px}.w-time.vertical-time .w-timepicker-time-container .w-timepicker-selected-ampm{padding:0 12px}.w-timepicker-selected-time>span,.w-timepicker-selected-ampm>span{outline:0;opacity:.5}.w-timepicker-selected-time>span:not(.active),.w-timepicker-selected-ampm>span:not(.active){cursor:pointer}.w-timepicker-selected-time>span.active,.w-timepicker-selected-ampm>span.active{opacity:1}.w-animate-next{opacity:0;-webkit-transform:translate3d(50%,0,1px);transform:translate3d(50%,0,1px)}.w-animate-next-remove{-webkit-transition:all .5s cubic-bezier(.35,0,.25,1);transition:all .5s cubic-bezier(.35,0,.25,1);opacity:0;-webkit-transform:translate3d(50%,0,1px);transform:translate3d(50%,0,1px)}.w-animate-next-remove-active{opacity:1;-webkit-transform:translate3d(0,0,1px);transform:translateZ(1px)}.w-animate-prev{opacity:0;-webkit-transform:translate3d(-50%,0,1px);transform:translate3d(-50%,0,1px)}.w-animate-prev-remove{-webkit-transition:all .3s cubic-bezier(.35,0,.25,1);transition:all .3s cubic-bezier(.35,0,.25,1);opacity:0;-webkit-transform:translate3d(-50%,0,1px);transform:translate3d(-50%,0,1px)}.w-animate-prev-remove-active{opacity:1;-webkit-transform:translate3d(0,0,1px);transform:translateZ(1px)}@-webkit-keyframes w-animation-bounce{0%{opacity:0;-webkit-transform:scale(.95);transform:scale(.95)}70%{opacity:1;-webkit-transform:scale(1.05);transform:scale(1.05)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes w-animation-bounce{0%{opacity:0;-webkit-transform:scale(.95);transform:scale(.95)}70%{opacity:1;-webkit-transform:scale(1.05);transform:scale(1.05)}to{-webkit-transform:scale(1);transform:scale(1)}}.w-animation-zoom.ng-enter{-webkit-transition:all .3s cubic-bezier(.35,0,.25,1);transition:all .3s cubic-bezier(.35,0,.25,1);-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-name:w-animation-bounce;animation-name:w-animation-bounce}\n"] }] }], ctorParameters: () => [{ type: i1.BreakpointObserver }], propDecorators: { userTime: [{ type: Input }], userTimeChange: [{ type: Output }], revertLabel: [{ type: Input }], submitLabel: [{ type: Input }], onRevert: [{ type: Output }], onSubmit: [{ type: Output }], color: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidy10aW1lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21hdGVyaWFsLXRpbWUtcGlja2VyL3NyYy9saWIvdy10aW1lL3ctdGltZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC10aW1lLXBpY2tlci9zcmMvbGliL3ctdGltZS93LXRpbWUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBUyxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2pDLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ0wsTUFBTSxlQUFlLENBQUM7QUFFekIsT0FBTyxFQUFxQixXQUFXLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7QUFTMUMsTUFBTSxPQUFPLGNBQWM7SUFvQnpCLFlBQVksa0JBQXNDO1FBbkJsRCxjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUd0QixtQkFBYyxHQUF3QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBS3pELGFBQVEsR0FBdUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNsRCxhQUFRLEdBQXdCLElBQUksWUFBWSxFQUFFLENBQUM7UUFJdEQsZUFBVSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDOUIsaUJBQVksR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDO1FBQ2xDLGdCQUFXLEdBQWUsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUVqRCwyQkFBc0IsR0FBVyxFQUFFLENBQUM7UUFHbEMsa0JBQWtCO2FBQ2pCLE9BQU8sQ0FBQztZQUNQLFdBQVcsQ0FBQyxNQUFNO1lBQ2xCLFdBQVcsQ0FBQyxLQUFLO1NBQ2xCLENBQUM7YUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUMvQixTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDbEIsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO2dCQUNwRCxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFFOUIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLGVBQWUsQ0FBQztnQkFDaEQsQ0FBQzs7b0JBRUMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztZQUNyQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFTCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRztnQkFDZCxJQUFJLEVBQUUsQ0FBQztnQkFDUCxNQUFNLEVBQUUsQ0FBQztnQkFDVCxPQUFPLEVBQUUsSUFBSTtnQkFDYixNQUFNLEVBQUUsRUFBRTthQUNYLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQztRQUM5QixDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVNLFVBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSTtRQUM1QixPQUFPLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFTSxZQUFZLENBQUMsTUFBTTtRQUN4QixPQUFPLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVNLGNBQWMsQ0FBQyxJQUFnQjtRQUNwQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztJQUMxQixDQUFDO0lBRU0sV0FBVyxDQUFDLENBQWM7UUFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFTSxNQUFNO1FBQ1gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRU0sTUFBTTtRQUNYLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRU0sa0JBQWtCLENBQUMsS0FBSztRQUM3QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUMsQ0FBQzs4R0FyRlUsY0FBYztrR0FBZCxjQUFjLHVRQ3ZCM0IsNG1EQXlCQSwyekZESmMsT0FBTyxvRkFBRSxVQUFVLHFHQUFFLGVBQWU7OzJGQUVyQyxjQUFjO2tCQVAxQixTQUFTOytCQUNJLFFBQVEsY0FHTixJQUFJLFdBQ1AsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLGVBQWUsQ0FBQzt1RkFLeEMsUUFBUTtzQkFBaEIsS0FBSztnQkFDSSxjQUFjO3NCQUF2QixNQUFNO2dCQUVFLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFFSSxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBRUUsS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ0xPQ0tfVFlQRSwgSVRpbWUsIFdDbG9ja0NvbXBvbmVudCB9IGZyb20gJy4uL3ctY2xvY2svdy1jbG9jay5jb21wb25lbnQnO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0XG4gIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7QnJlYWtwb2ludE9ic2VydmVyLCBCcmVha3BvaW50c30gZnJvbSAnQGFuZ3VsYXIvY2RrL2xheW91dCc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge3Rha2VVbnRpbH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTWF0VG9vbGJhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2xiYXInO1xuaW1wb3J0IHsgTmdDbGFzcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndy10aW1lJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vdy10aW1lLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi93LXRpbWUuY29tcG9uZW50LnNjc3MnXSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtOZ0NsYXNzLCBNYXRUb29sYmFyLCBXQ2xvY2tDb21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIFdUaW1lQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgZGVzdHJveWVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgXG4gIEBJbnB1dCgpIHVzZXJUaW1lOiBJVGltZTtcbiAgQE91dHB1dCgpIHVzZXJUaW1lQ2hhbmdlOiBFdmVudEVtaXR0ZXI8SVRpbWU+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBJbnB1dCgpIHJldmVydExhYmVsOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHN1Ym1pdExhYmVsOiBzdHJpbmc7XG5cbiAgQE91dHB1dCgpIG9uUmV2ZXJ0OiBFdmVudEVtaXR0ZXI8bnVsbD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBvblN1Ym1pdDogRXZlbnRFbWl0dGVyPElUaW1lPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBASW5wdXQoKSBjb2xvcjogc3RyaW5nO1xuXG4gIHB1YmxpYyBWSUVXX0hPVVJTID0gQ0xPQ0tfVFlQRS5IT1VSUztcbiAgcHVibGljIFZJRVdfTUlOVVRFUyA9IENMT0NLX1RZUEUuTUlOVVRFUztcbiAgcHVibGljIGN1cnJlbnRWaWV3OiBDTE9DS19UWVBFID0gdGhpcy5WSUVXX0hPVVJTO1xuXG4gIGN1cnJlbnRDbGFzc1NjcmVlblNpemU6IHN0cmluZyA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKGJyZWFrcG9pbnRPYnNlcnZlcjogQnJlYWtwb2ludE9ic2VydmVyKSB7XG4gICAgYnJlYWtwb2ludE9ic2VydmVyXG4gICAgLm9ic2VydmUoW1xuICAgICAgQnJlYWtwb2ludHMuWFNtYWxsLFxuICAgICAgQnJlYWtwb2ludHMuU21hbGwsXG4gICAgXSlcbiAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpKVxuICAgIC5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgIGZvciAoY29uc3QgcXVlcnkgb2YgT2JqZWN0LmtleXMocmVzdWx0LmJyZWFrcG9pbnRzKSkge1xuICAgICAgICBpZiAocmVzdWx0LmJyZWFrcG9pbnRzW3F1ZXJ5XSkge1xuXG4gICAgICAgICAgdGhpcy5jdXJyZW50Q2xhc3NTY3JlZW5TaXplID0gJ3ZlcnRpY2FsLXRpbWUnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgXG4gICAgICAgICAgdGhpcy5jdXJyZW50Q2xhc3NTY3JlZW5TaXplID0gJyc7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICghdGhpcy51c2VyVGltZSkge1xuICAgICAgdGhpcy51c2VyVGltZSA9IHtcbiAgICAgICAgaG91cjogNixcbiAgICAgICAgbWludXRlOiAwLFxuICAgICAgICBtZXJpZGVuOiAnUE0nLFxuICAgICAgICBmb3JtYXQ6IDEyXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICghdGhpcy5yZXZlcnRMYWJlbCkge1xuICAgICAgdGhpcy5yZXZlcnRMYWJlbCA9ICdDYW5jZWwnO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zdWJtaXRMYWJlbCkge1xuICAgICAgdGhpcy5zdWJtaXRMYWJlbCA9ICdPa2F5JztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZm9ybWF0SG91cihmb3JtYXQsIGhvdXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBVdGlscy5mb3JtYXRIb3VyKGZvcm1hdCwgaG91cik7XG4gIH1cblxuICBwdWJsaWMgZm9ybWF0TWludXRlKG1pbnV0ZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFV0aWxzLmZvcm1hdE1pbnV0ZShtaW51dGUpO1xuICB9XG5cbiAgcHVibGljIHNldEN1cnJlbnRWaWV3KHR5cGU6IENMT0NLX1RZUEUpIHtcbiAgICB0aGlzLmN1cnJlbnRWaWV3ID0gdHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRNZXJpZGllbihtOiAnUE0nIHwgJ0FNJykge1xuICAgIHRoaXMudXNlclRpbWUubWVyaWRlbiA9IG07XG4gIH1cblxuICBwdWJsaWMgcmV2ZXJ0KCkge1xuICAgIHRoaXMub25SZXZlcnQuZW1pdCgpO1xuICB9XG5cbiAgcHVibGljIHN1Ym1pdCgpIHtcbiAgICB0aGlzLm9uU3VibWl0LmVtaXQodGhpcy51c2VyVGltZSk7XG4gIH1cblxuICBwdWJsaWMgZW1pdHVzZXJUaW1lQ2hhbmdlKGV2ZW50KSB7XG4gICAgdGhpcy51c2VyVGltZUNoYW5nZS5lbWl0KHRoaXMudXNlclRpbWUpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93IGZsZXgtbWQtY29sdW1uIGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIHctdGltZVwiIFtuZ0NsYXNzXT1cImN1cnJlbnRDbGFzc1NjcmVlblNpemVcIj5cbiAgPG1hdC10b29sYmFyIGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGZsZXgtbWQtcm93IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIHctdGltZXBpY2tlci10aW1lLWNvbnRhaW5lclwiIFtjb2xvcl09XCJjb2xvclwiPlxuXG4gICAgPGRpdiBjbGFzcz1cInctdGltZXBpY2tlci1zZWxlY3RlZC10aW1lXCI+XG4gICAgICA8c3BhbiBbY2xhc3NdPVwiY3VycmVudFZpZXcgPT09IFZJRVdfSE9VUlMgPyAnYWN0aXZlJzogJydcIiAoY2xpY2spPVwic2V0Q3VycmVudFZpZXcoVklFV19IT1VSUylcIj57eyBmb3JtYXRIb3VyKHVzZXJUaW1lLmZvcm1hdCwgdXNlclRpbWUuaG91cikgfX06PC9zcGFuPlxuICAgICAgPHNwYW4gW2NsYXNzXT1cImN1cnJlbnRWaWV3ID09PSBWSUVXX01JTlVURVMgPyAnYWN0aXZlJzogJydcIiAoY2xpY2spPVwic2V0Q3VycmVudFZpZXcoVklFV19NSU5VVEVTKVwiPnt7IGZvcm1hdE1pbnV0ZSh1c2VyVGltZS5taW51dGUpIH19PC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIEBpZiAodXNlclRpbWUuZm9ybWF0ID09PSAxMikge1xuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciB3LXRpbWVwaWNrZXItc2VsZWN0ZWQtYW1wbVwiPlxuICAgICAgICA8c3BhbiAoY2xpY2spPVwic2V0TWVyaWRpZW4oJ0FNJylcIiBbY2xhc3NdPVwidXNlclRpbWUubWVyaWRlbiA9PT0gJ0FNJyA/ICdhY3RpdmUnIDogJydcIj5BTTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gKGNsaWNrKT1cInNldE1lcmlkaWVuKCdQTScpXCIgW2NsYXNzXT1cInVzZXJUaW1lLm1lcmlkZW4gPT09ICdQTScgPyAnYWN0aXZlJyA6ICcnXCI+UE08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgPC9tYXQtdG9vbGJhcj5cblxuICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGZsZXgtbWQtcm93IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciB3LXRpbWUtY29udGVudFwiPlxuICAgIDx3LWNsb2NrIFtjb2xvcl09XCJjb2xvclwiIGNsYXNzPVwidy1hbmltYXRpb24tem9vbVwiIFt1c2VyVGltZV09XCJ1c2VyVGltZVwiICh1c2VyVGltZUNoYW5nZSk9XCJlbWl0dXNlclRpbWVDaGFuZ2UoJGV2ZW50KVwiIFsoY3VycmVudFZpZXcpXT1cImN1cnJlbnRWaWV3XCIgKHZpZXdDaGFuZ2UpPVwic2V0Q3VycmVudFZpZXcoJGV2ZW50KVwiPjwvdy1jbG9jaz5cblxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtZW5kXCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbVwiIChjbGljayk9XCJyZXZlcnQoKVwiPnt7cmV2ZXJ0TGFiZWx9fTwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXt7Y29sb3J9fVwiIChjbGljayk9XCJzdWJtaXQoKVwiPnt7c3VibWl0TGFiZWx9fTwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19