UNPKG

ngx-material-timepicker-decon

Version:
289 lines 27.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /* tslint:disable:triple-equals */ import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core'; import { TimeUnit } from '../../models/time-unit.enum'; import { TimeFormatterPipe } from '../../pipes/time-formatter.pipe'; import { NgxMaterialTimepickerService } from '../../services/ngx-material-timepicker.service'; import { NgxMaterialTimepickerComponent } from '../../ngx-material-timepicker.component'; var NgxMaterialTimepickerDialControlComponent = /** @class */ (function () { function NgxMaterialTimepickerDialControlComponent(TimepickerService) { var _this = this; this.TimepickerService = TimepickerService; this.shouldFocus = false; this.timeUnitChanged = new EventEmitter(); this.timeChanged = new EventEmitter(); this.focused = new EventEmitter(); this.unfocused = new EventEmitter(); this.eventListener = this.TimepickerService.keyboardClick.subscribe(function (e) { if (_this.isActive && _this.isEditable) { _this.onKeyDown(e); } }); } /** * @param {?} $event * @return {?} */ NgxMaterialTimepickerDialControlComponent.prototype.blurAll = /** * @param {?} $event * @return {?} */ function ($event) { NgxMaterialTimepickerComponent.blurAll(); $event.preventDefault(); }; Object.defineProperty(NgxMaterialTimepickerDialControlComponent.prototype, "selectedTime", { get: /** * @private * @return {?} */ function () { var _this = this; if (!!this.time) { return this.timeList.find(function (t) { return t.time === +_this.time; }); } }, enumerable: true, configurable: true }); /** * @param {?} changes * @return {?} */ NgxMaterialTimepickerDialControlComponent.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { if (changes['time'] && (changes['time'].currentValue !== undefined)) { if (this.isEditable && !changes['time'].firstChange) { return; } this.time = new TimeFormatterPipe().transform(+changes['time'].currentValue, this.timeUnit); } }; /** * @param {?} event * @param {?} unit * @return {?} */ NgxMaterialTimepickerDialControlComponent.prototype.saveTimeAndChangeTimeUnit = /** * @param {?} event * @param {?} unit * @return {?} */ function (event, unit) { event.preventDefault(); this.previousTime = this.time; this.timeUnitChanged.next(unit); this.focused.next(); }; /** * @return {?} */ NgxMaterialTimepickerDialControlComponent.prototype.updateTime = /** * @return {?} */ function () { this.time = parseInt(this.time, 10).toString().padStart(2, '0'); /** @type {?} */ var time = this.selectedTime; if (time) { this.timeChanged.next(time); this.previousTime = time.time; } }; /** * @return {?} */ NgxMaterialTimepickerDialControlComponent.prototype.formatTime = /** * @return {?} */ function () { if (this.isEditable) { /** @type {?} */ var time = this.time || this.previousTime; this.time = new TimeFormatterPipe().transform(+time, this.timeUnit); this.unfocused.next(); } }; /** * @param {?} e * @return {?} */ NgxMaterialTimepickerDialControlComponent.prototype.onKeyDown = /** * @param {?} e * @return {?} */ function (e) { var _this = this; /** @type {?} */ var char = e.key || String.fromCharCode(e.which || e.keyCode); if (isInputAllowed(e)) { if (e.keyCode === 46 || e.keyCode === 8) { this.time = (this.time + '').substr(0, this.time.length - 1) || '0'; char = ''; } if (isTimeDisabledToChange(this.time, char, this.timeList)) { if (!isTimeUnavailable(char, this.timeList)) { e.preventDefault(); this.time = char; this.updateTime(); this.formatTime(); this.shouldFocus = true; } } else { e.preventDefault(); this.time += char; this.updateTime(); this.formatTime(); /** @type {?} */ var input_1 = (/** @type {?} */ ((e.target || this.inputElement.nativeElement))); if (this.shouldFocus || e.keyCode === 9) { setTimeout(function () { try { /** @type {?} */ var nextInput = (/** @type {?} */ (input_1.parentNode.nextSibling.nextSibling.childNodes.item(0))); _this.unfocused.emit(); nextInput.focus(); } catch (e) { try { /** @type {?} */ var prevInput = (/** @type {?} */ (input_1.parentNode.previousSibling.previousSibling.childNodes.item(0))); _this.unfocused.emit(); prevInput.focus(); } catch (e) { } } _this.formatTime(); }, 0); } this.shouldFocus = false; } } else { this.shouldFocus = false; e.preventDefault(); } }; /** * @return {?} */ NgxMaterialTimepickerDialControlComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { this.eventListener.unsubscribe(); }; NgxMaterialTimepickerDialControlComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-material-timepicker-dial-control', template: "<!--suppress HtmlFormInputWithoutLabel -->\n<input #inputElement class=\"timepicker-dial__control timepicker-dial__item\"\n [ngClass]=\"{'timepicker-dial__item_active': isActive, 'timepicker-dial__control_editable': isEditable}\"\n [(ngModel)]=\"time\" (focus)=\"saveTimeAndChangeTimeUnit($event, timeUnit)\" (focusin)=\"blurAll($event)\"\n (blur)=\"formatTime()\" [timepickerAutofocus]=\"isActive\" (keydown)=\"onKeyDown($event)\" [readonly]=\"true\">\n", styles: [".timepicker-dial__item{cursor:pointer;color:rgba(255,255,255,.5);font-family:Roboto,sans-serif}@supports (font-family:var(--primary-font-family)){.timepicker-dial__item{font-family:var(--primary-font-family);color:var(--dial-inactive-color)}}.timepicker-dial__item_active{color:#fff}@supports (color:var(--dial-active-color)){.timepicker-dial__item_active{color:var(--dial-active-color)}}.timepicker-dial__control{border:none;background-color:transparent;font-size:50px;width:60px;padding:0;border-radius:3px}.timepicker-dial__control_editable:focus{color:#00bfff;background-color:#fff;outline:#00bfff}"] }] } ]; /** @nocollapse */ NgxMaterialTimepickerDialControlComponent.ctorParameters = function () { return [ { type: NgxMaterialTimepickerService } ]; }; NgxMaterialTimepickerDialControlComponent.propDecorators = { timeList: [{ type: Input }], timeUnit: [{ type: Input }], time: [{ type: Input }], isActive: [{ type: Input }], isEditable: [{ type: Input }], minutesGap: [{ type: Input }], timeUnitChanged: [{ type: Output }], timeChanged: [{ type: Output }], focused: [{ type: Output }], unfocused: [{ type: Output }], inputElement: [{ type: ViewChild, args: ['inputElement',] }] }; return NgxMaterialTimepickerDialControlComponent; }()); export { NgxMaterialTimepickerDialControlComponent }; if (false) { /** @type {?} */ NgxMaterialTimepickerDialControlComponent.prototype.previousTime; /** @type {?} */ NgxMaterialTimepickerDialControlComponent.prototype.shouldFocus; /** @type {?} */ NgxMaterialTimepickerDialControlComponent.prototype.timeList; /** @type {?} */ NgxMaterialTimepickerDialControlComponent.prototype.timeUnit; /** @type {?} */ NgxMaterialTimepickerDialControlComponent.prototype.time; /** @type {?} */ NgxMaterialTimepickerDialControlComponent.prototype.isActive; /** @type {?} */ NgxMaterialTimepickerDialControlComponent.prototype.isEditable; /** @type {?} */ NgxMaterialTimepickerDialControlComponent.prototype.minutesGap; /** @type {?} */ NgxMaterialTimepickerDialControlComponent.prototype.timeUnitChanged; /** @type {?} */ NgxMaterialTimepickerDialControlComponent.prototype.timeChanged; /** @type {?} */ NgxMaterialTimepickerDialControlComponent.prototype.focused; /** @type {?} */ NgxMaterialTimepickerDialControlComponent.prototype.unfocused; /** @type {?} */ NgxMaterialTimepickerDialControlComponent.prototype.inputElement; /** @type {?} */ NgxMaterialTimepickerDialControlComponent.prototype.eventListener; /** * @type {?} * @private */ NgxMaterialTimepickerDialControlComponent.prototype.TimepickerService; } /** * @param {?} e * @return {?} */ function isInputAllowed(e) { // Allow: backspace, delete, tab, escape, enter if ([46, 8, 9, 27, 13].some(function (n) { return n === e.keyCode; }) || // Allow: Ctrl/cmd+A (e.keyCode == 65 && (e.ctrlKey === true || e.metaKey === true)) || // Allow: Ctrl/cmd+C (e.keyCode == 67 && (e.ctrlKey === true || e.metaKey === true)) || // Allow: Ctrl/cmd+X (e.keyCode == 88 && (e.ctrlKey === true || e.metaKey === true)) || // Allow: home, end, left, right, up, down (e.keyCode >= 35 && e.keyCode <= 40)) { return true; } return !((e.keyCode < 48 || e.keyCode > 57) && (e.keyCode < 96 || e.keyCode > 105)); } /** * @param {?} currentTime * @param {?} nextTime * @param {?} timeList * @return {?} */ function isTimeDisabledToChange(currentTime, nextTime, timeList) { /** @type {?} */ var isNumber = /\d/.test(nextTime); if (isNumber) { /** @type {?} */ var time = currentTime + nextTime; return isTimeUnavailable(time, timeList); } } /** * @param {?} time * @param {?} timeList * @return {?} */ function isTimeUnavailable(time, timeList) { /** @type {?} */ var selectedTime = timeList.find(function (value) { return value.time === +time; }); return !selectedTime || (selectedTime && selectedTime.disabled); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW1hdGVyaWFsLXRpbWVwaWNrZXItZGlhbC1jb250cm9sLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1tYXRlcmlhbC10aW1lcGlja2VyLWRlY29uLyIsInNvdXJjZXMiOlsic3JjL2FwcC9tYXRlcmlhbC10aW1lcGlja2VyL2NvbXBvbmVudHMvdGltZXBpY2tlci1kaWFsLWNvbnRyb2wvbmd4LW1hdGVyaWFsLXRpbWVwaWNrZXItZGlhbC1jb250cm9sLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXdCLE1BQU0sRUFBaUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5JLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUU5RixPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUV6RjtJQXlCSSxtREFDWSxpQkFBK0M7UUFEM0QsaUJBUUM7UUFQVyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQThCO1FBbEIzRCxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQVNWLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQVksQ0FBQztRQUMvQyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFpQixDQUFDO1FBQ2hELFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ25DLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBUTNDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsVUFBQSxDQUFDO1lBQ2pFLElBQUksS0FBSSxDQUFDLFFBQVEsSUFBSSxLQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNsQyxLQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3JCO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOzs7OztJQUVELDJEQUFPOzs7O0lBQVAsVUFBUSxNQUFNO1FBQ1YsOEJBQThCLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDekMsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxzQkFBWSxtRUFBWTs7Ozs7UUFBeEI7WUFBQSxpQkFJQztZQUhHLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ2IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFJLENBQUMsSUFBSSxFQUFyQixDQUFxQixDQUFDLENBQUM7YUFDekQ7UUFDTCxDQUFDOzs7T0FBQTs7Ozs7SUFFRCwrREFBVzs7OztJQUFYLFVBQVksT0FBc0I7UUFDOUIsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxLQUFLLFNBQVMsQ0FBQyxFQUFFO1lBQ2pFLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUU7Z0JBQ2pELE9BQU87YUFDVjtZQUNELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxpQkFBaUIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQy9GO0lBQ0wsQ0FBQzs7Ozs7O0lBRUQsNkVBQXlCOzs7OztJQUF6QixVQUEwQixLQUFpQixFQUFFLElBQWM7UUFDdkQsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUM5QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3hCLENBQUM7Ozs7SUFFRCw4REFBVTs7O0lBQVY7UUFDSSxJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O1lBQzFELElBQUksR0FBRyxJQUFJLENBQUMsWUFBWTtRQUM5QixJQUFJLElBQUksRUFBRTtZQUNOLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztTQUNqQztJQUNMLENBQUM7Ozs7SUFFRCw4REFBVTs7O0lBQVY7UUFDSSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7O2dCQUNYLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxZQUFZO1lBQzNDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxpQkFBaUIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDcEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUN6QjtJQUNMLENBQUM7Ozs7O0lBRUQsNkRBQVM7Ozs7SUFBVCxVQUFVLENBQWdCO1FBQTFCLGlCQTRDQzs7WUEzQ08sSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFFN0QsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDbkIsSUFBSSxDQUFDLENBQUMsT0FBTyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsRUFBRTtnQkFDckMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUM7Z0JBQ3BFLElBQUksR0FBRyxFQUFFLENBQUM7YUFDYjtZQUNELElBQUksc0JBQXNCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUN4RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRTtvQkFDekMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUNuQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztvQkFDakIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUNsQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ2xCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO2lCQUMzQjthQUNKO2lCQUFNO2dCQUNILENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDbEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDOztvQkFDWixPQUFLLEdBQUcsbUJBQWtCLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxFQUFBO2dCQUM3RSxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLEVBQUU7b0JBQ3JDLFVBQVUsQ0FBQzt3QkFDUCxJQUFJOztnQ0FDTSxTQUFTLEdBQUcsbUJBQWtCLE9BQUssQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFBOzRCQUMvRixLQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDOzRCQUN0QixTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7eUJBQ3JCO3dCQUFDLE9BQU8sQ0FBQyxFQUFFOzRCQUNSLElBQUk7O29DQUNNLFNBQVMsR0FBRyxtQkFBa0IsT0FBSyxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUE7Z0NBQ3ZHLEtBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7Z0NBQ3RCLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs2QkFDckI7NEJBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRzt5QkFDbEI7d0JBQ0QsS0FBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUN0QixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7aUJBQ1Q7Z0JBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7YUFDNUI7U0FDSjthQUFNO1lBQ0gsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDekIsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3RCO0lBQ0wsQ0FBQzs7OztJQUVELCtEQUFXOzs7SUFBWDtRQUNJLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckMsQ0FBQzs7Z0JBL0hKLFNBQVMsU0FBQztvQkFDUCxRQUFRLEVBQUUsc0NBQXNDO29CQUNoRCxvZUFBa0U7O2lCQUVyRTs7OztnQkFSUSw0QkFBNEI7OzsyQkFjaEMsS0FBSzsyQkFDTCxLQUFLO3VCQUNMLEtBQUs7MkJBQ0wsS0FBSzs2QkFDTCxLQUFLOzZCQUNMLEtBQUs7a0NBRUwsTUFBTTs4QkFDTixNQUFNOzBCQUNOLE1BQU07NEJBQ04sTUFBTTsrQkFFTixTQUFTLFNBQUMsY0FBYzs7SUEyRzdCLGdEQUFDO0NBQUEsQUFqSUQsSUFpSUM7U0E1SFkseUNBQXlDOzs7SUFFbEQsaUVBQThCOztJQUM5QixnRUFBb0I7O0lBRXBCLDZEQUFtQzs7SUFDbkMsNkRBQTRCOztJQUM1Qix5REFBc0I7O0lBQ3RCLDZEQUEyQjs7SUFDM0IsK0RBQTZCOztJQUM3QiwrREFBNEI7O0lBRTVCLG9FQUF5RDs7SUFDekQsZ0VBQTBEOztJQUMxRCw0REFBNkM7O0lBQzdDLDhEQUErQzs7SUFFL0MsaUVBQW9EOztJQUNwRCxrRUFBNEI7Ozs7O0lBR3hCLHNFQUF1RDs7Ozs7O0FBeUcvRCxTQUFTLGNBQWMsQ0FBQyxDQUFnQjtJQUNwQywrQ0FBK0M7SUFDL0MsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBZixDQUFlLENBQUM7UUFDN0Msb0JBQW9CO1FBQ3BCLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQy9ELG9CQUFvQjtRQUNwQixDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQztRQUMvRCxvQkFBb0I7UUFDcEIsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDL0QsMENBQTBDO1FBQzFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsRUFBRTtRQUV0QyxPQUFPLElBQUksQ0FBQztLQUNmO0lBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3hGLENBQUM7Ozs7Ozs7QUFFRCxTQUFTLHNCQUFzQixDQUFDLFdBQW1CLEVBQUUsUUFBZ0IsRUFBRSxRQUF5Qjs7UUFDdEYsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBRXBDLElBQUksUUFBUSxFQUFFOztZQUNKLElBQUksR0FBRyxXQUFXLEdBQUcsUUFBUTtRQUNuQyxPQUFPLGlCQUFpQixDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztLQUM1QztBQUNMLENBQUM7Ozs7OztBQUVELFNBQVMsaUJBQWlCLENBQUMsSUFBWSxFQUFFLFFBQXlCOztRQUN4RCxZQUFZLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFBLEtBQUssSUFBSSxPQUFBLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQXBCLENBQW9CLENBQUM7SUFDakUsT0FBTyxDQUFDLFlBQVksSUFBSSxDQUFDLFlBQVksSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDcEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlOnRyaXBsZS1lcXVhbHMgKi9cbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDbG9ja0ZhY2VUaW1lIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2Nsb2NrLWZhY2UtdGltZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVGltZVVuaXQgfSBmcm9tICcuLi8uLi9tb2RlbHMvdGltZS11bml0LmVudW0nO1xuaW1wb3J0IHsgVGltZUZvcm1hdHRlclBpcGUgfSBmcm9tICcuLi8uLi9waXBlcy90aW1lLWZvcm1hdHRlci5waXBlJztcbmltcG9ydCB7IE5neE1hdGVyaWFsVGltZXBpY2tlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9uZ3gtbWF0ZXJpYWwtdGltZXBpY2tlci5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTmd4TWF0ZXJpYWxUaW1lcGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbmd4LW1hdGVyaWFsLXRpbWVwaWNrZXIuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduZ3gtbWF0ZXJpYWwtdGltZXBpY2tlci1kaWFsLWNvbnRyb2wnLFxuICAgIHRlbXBsYXRlVXJsOiAnbmd4LW1hdGVyaWFsLXRpbWVwaWNrZXItZGlhbC1jb250cm9sLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnbmd4LW1hdGVyaWFsLXRpbWVwaWNrZXItZGlhbC1jb250cm9sLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTmd4TWF0ZXJpYWxUaW1lcGlja2VyRGlhbENvbnRyb2xDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG5cbiAgICBwcmV2aW91c1RpbWU6IG51bWJlciB8IHN0cmluZztcbiAgICBzaG91bGRGb2N1cyA9IGZhbHNlO1xuXG4gICAgQElucHV0KCkgdGltZUxpc3Q6IENsb2NrRmFjZVRpbWVbXTtcbiAgICBASW5wdXQoKSB0aW1lVW5pdDogVGltZVVuaXQ7XG4gICAgQElucHV0KCkgdGltZTogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGlzQWN0aXZlOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGlzRWRpdGFibGU6IGJvb2xlYW47XG4gICAgQElucHV0KCkgbWludXRlc0dhcDogbnVtYmVyO1xuXG4gICAgQE91dHB1dCgpIHRpbWVVbml0Q2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8VGltZVVuaXQ+KCk7XG4gICAgQE91dHB1dCgpIHRpbWVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxDbG9ja0ZhY2VUaW1lPigpO1xuICAgIEBPdXRwdXQoKSBmb2N1c2VkID0gbmV3IEV2ZW50RW1pdHRlcjxudWxsPigpO1xuICAgIEBPdXRwdXQoKSB1bmZvY3VzZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bGw+KCk7XG5cbiAgICBAVmlld0NoaWxkKCdpbnB1dEVsZW1lbnQnKSBpbnB1dEVsZW1lbnQ6IEVsZW1lbnRSZWY7XG4gICAgZXZlbnRMaXN0ZW5lcjogU3Vic2NyaXB0aW9uO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgVGltZXBpY2tlclNlcnZpY2U6IE5neE1hdGVyaWFsVGltZXBpY2tlclNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgdGhpcy5ldmVudExpc3RlbmVyID0gdGhpcy5UaW1lcGlja2VyU2VydmljZS5rZXlib2FyZENsaWNrLnN1YnNjcmliZShlID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQWN0aXZlICYmIHRoaXMuaXNFZGl0YWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMub25LZXlEb3duKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBibHVyQWxsKCRldmVudCkge1xuICAgICAgICBOZ3hNYXRlcmlhbFRpbWVwaWNrZXJDb21wb25lbnQuYmx1ckFsbCgpO1xuICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBzZWxlY3RlZFRpbWUoKTogQ2xvY2tGYWNlVGltZSB7XG4gICAgICAgIGlmICghIXRoaXMudGltZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGltZUxpc3QuZmluZCh0ID0+IHQudGltZSA9PT0gK3RoaXMudGltZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIGlmIChjaGFuZ2VzWyd0aW1lJ10gJiYgKGNoYW5nZXNbJ3RpbWUnXS5jdXJyZW50VmFsdWUgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRWRpdGFibGUgJiYgIWNoYW5nZXNbJ3RpbWUnXS5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudGltZSA9IG5ldyBUaW1lRm9ybWF0dGVyUGlwZSgpLnRyYW5zZm9ybSgrY2hhbmdlc1sndGltZSddLmN1cnJlbnRWYWx1ZSwgdGhpcy50aW1lVW5pdCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzYXZlVGltZUFuZENoYW5nZVRpbWVVbml0KGV2ZW50OiBGb2N1c0V2ZW50LCB1bml0OiBUaW1lVW5pdCk6IHZvaWQge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnByZXZpb3VzVGltZSA9IHRoaXMudGltZTtcbiAgICAgICAgdGhpcy50aW1lVW5pdENoYW5nZWQubmV4dCh1bml0KTtcbiAgICAgICAgdGhpcy5mb2N1c2VkLm5leHQoKTtcbiAgICB9XG5cbiAgICB1cGRhdGVUaW1lKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRpbWUgPSBwYXJzZUludCh0aGlzLnRpbWUsIDEwKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICAgIGNvbnN0IHRpbWUgPSB0aGlzLnNlbGVjdGVkVGltZTtcbiAgICAgICAgaWYgKHRpbWUpIHtcbiAgICAgICAgICAgIHRoaXMudGltZUNoYW5nZWQubmV4dCh0aW1lKTtcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXNUaW1lID0gdGltZS50aW1lO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9ybWF0VGltZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNFZGl0YWJsZSkge1xuICAgICAgICAgICAgY29uc3QgdGltZSA9IHRoaXMudGltZSB8fCB0aGlzLnByZXZpb3VzVGltZTtcbiAgICAgICAgICAgIHRoaXMudGltZSA9IG5ldyBUaW1lRm9ybWF0dGVyUGlwZSgpLnRyYW5zZm9ybSgrdGltZSwgdGhpcy50aW1lVW5pdCk7XG4gICAgICAgICAgICB0aGlzLnVuZm9jdXNlZC5uZXh0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbktleURvd24oZTogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBsZXQgY2hhciA9IGUua2V5IHx8IFN0cmluZy5mcm9tQ2hhckNvZGUoZS53aGljaCB8fCBlLmtleUNvZGUpO1xuXG4gICAgICAgIGlmIChpc0lucHV0QWxsb3dlZChlKSkge1xuICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gNDYgfHwgZS5rZXlDb2RlID09PSA4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lID0gKHRoaXMudGltZSArICcnKS5zdWJzdHIoMCwgdGhpcy50aW1lLmxlbmd0aCAtIDEpIHx8ICcwJztcbiAgICAgICAgICAgICAgICBjaGFyID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNUaW1lRGlzYWJsZWRUb0NoYW5nZSh0aGlzLnRpbWUsIGNoYXIsIHRoaXMudGltZUxpc3QpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1RpbWVVbmF2YWlsYWJsZShjaGFyLCB0aGlzLnRpbWVMaXN0KSkge1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGltZSA9IGNoYXI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVGltZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1hdFRpbWUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG91bGRGb2N1cyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lICs9IGNoYXI7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVUaW1lKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtYXRUaW1lKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5wdXQgPSA8SFRNTElucHV0RWxlbWVudD4oZS50YXJnZXQgfHwgdGhpcy5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkRm9jdXMgfHwgZS5rZXlDb2RlID09PSA5KSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0SW5wdXQgPSA8SFRNTElucHV0RWxlbWVudD5pbnB1dC5wYXJlbnROb2RlLm5leHRTaWJsaW5nLm5leHRTaWJsaW5nLmNoaWxkTm9kZXMuaXRlbSgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVuZm9jdXNlZC5lbWl0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dElucHV0LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldklucHV0ID0gPEhUTUxJbnB1dEVsZW1lbnQ+aW5wdXQucGFyZW50Tm9kZS5wcmV2aW91c1NpYmxpbmcucHJldmlvdXNTaWJsaW5nLmNoaWxkTm9kZXMuaXRlbSgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51bmZvY3VzZWQuZW1pdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2SW5wdXQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybWF0VGltZSgpO1xuICAgICAgICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zaG91bGRGb2N1cyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zaG91bGRGb2N1cyA9IGZhbHNlO1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lci51bnN1YnNjcmliZSgpO1xuICAgIH1cblxufVxuXG5mdW5jdGlvbiBpc0lucHV0QWxsb3dlZChlOiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgLy8gQWxsb3c6IGJhY2tzcGFjZSwgZGVsZXRlLCB0YWIsIGVzY2FwZSwgZW50ZXJcbiAgICBpZiAoWzQ2LCA4LCA5LCAyNywgMTNdLnNvbWUobiA9PiBuID09PSBlLmtleUNvZGUpIHx8XG4gICAgICAgIC8vIEFsbG93OiBDdHJsL2NtZCtBXG4gICAgICAgIChlLmtleUNvZGUgPT0gNjUgJiYgKGUuY3RybEtleSA9PT0gdHJ1ZSB8fCBlLm1ldGFLZXkgPT09IHRydWUpKSB8fFxuICAgICAgICAvLyBBbGxvdzogQ3RybC9jbWQrQ1xuICAgICAgICAoZS5rZXlDb2RlID09IDY3ICYmIChlLmN0cmxLZXkgPT09IHRydWUgfHwgZS5tZXRhS2V5ID09PSB0cnVlKSkgfHxcbiAgICAgICAgLy8gQWxsb3c6IEN0cmwvY21kK1hcbiAgICAgICAgKGUua2V5Q29kZSA9PSA4OCAmJiAoZS5jdHJsS2V5ID09PSB0cnVlIHx8IGUubWV0YUtleSA9PT0gdHJ1ZSkpIHx8XG4gICAgICAgIC8vIEFsbG93OiBob21lLCBlbmQsIGxlZnQsIHJpZ2h0LCB1cCwgZG93blxuICAgICAgICAoZS5rZXlDb2RlID49IDM1ICYmIGUua2V5Q29kZSA8PSA0MCkpIHtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuICEoKGUua2V5Q29kZSA8IDQ4IHx8IGUua2V5Q29kZSA+IDU3KSAmJiAoZS5rZXlDb2RlIDwgOTYgfHwgZS5rZXlDb2RlID4gMTA1KSk7XG59XG5cbmZ1bmN0aW9uIGlzVGltZURpc2FibGVkVG9DaGFuZ2UoY3VycmVudFRpbWU6IHN0cmluZywgbmV4dFRpbWU6IHN0cmluZywgdGltZUxpc3Q6IENsb2NrRmFjZVRpbWVbXSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlzTnVtYmVyID0gL1xcZC8udGVzdChuZXh0VGltZSk7XG5cbiAgICBpZiAoaXNOdW1iZXIpIHtcbiAgICAgICAgY29uc3QgdGltZSA9IGN1cnJlbnRUaW1lICsgbmV4dFRpbWU7XG4gICAgICAgIHJldHVybiBpc1RpbWVVbmF2YWlsYWJsZSh0aW1lLCB0aW1lTGlzdCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc1RpbWVVbmF2YWlsYWJsZSh0aW1lOiBzdHJpbmcsIHRpbWVMaXN0OiBDbG9ja0ZhY2VUaW1lW10pOiBib29sZWFuIHtcbiAgICBjb25zdCBzZWxlY3RlZFRpbWUgPSB0aW1lTGlzdC5maW5kKHZhbHVlID0+IHZhbHVlLnRpbWUgPT09ICt0aW1lKTtcbiAgICByZXR1cm4gIXNlbGVjdGVkVGltZSB8fCAoc2VsZWN0ZWRUaW1lICYmIHNlbGVjdGVkVGltZS5kaXNhYmxlZCk7XG59XG4iXX0=