UNPKG

@daypilot/daypilot-lite-angular

Version:

DayPilot Lite for Angular

198 lines 22.7 kB
import { Component, effect, EventEmitter, Input, Output } from "@angular/core"; import { DayPilot } from "./core/daypilot-core"; import { optHash, rand } from "./util"; import * as i0 from "@angular/core"; class DayPilotNavigatorComponent { config; dateChange = new EventEmitter(); control; _requestUpdateFull = false; _requestUpdateEvents = false; _hashOptions = ""; _hashEvents = ""; _onTrs = null; _dateSet = false; _eventsSet = false; _date = DayPilot.Date.today(); get date() { return this._date; } // @Input() date: DayPilot.Date = DayPilot.Date.today(); set date(value) { this._date = value; this._dateSet = true; // Apply immediately when control exists (works even when config is a signal and ngDoCheck returns early) const dp = this.control; if (dp) { const current = dp.selectionDay; if (current && value && current.getTime() === value.getTime()) { this._dateSet = false; return; } this._dateSet = false; dp.select(value); } } _events = []; get events() { if (typeof this._events === 'function') { return this._events(); } return this._events; } set events(value) { this._eventsSet = true; this._events = value; } get configResolved() { return typeof this.config === 'function' ? this.config() : this.config; } _id = "dp_" + new Date().getTime() + rand(); get id() { return this._id; } constructor() { effect(() => { if (typeof this._events !== 'function') { return; } const control = this.control; const events = this._events(); if (control) { control.internal.upd({ events }); } }); effect(() => { if (typeof this.config !== 'function') { return; } const control = this.control; const config = this.config(); if (control) { const configToBeApplied = { ...config }; // Keep _onTrs synchronized even when handler is removed this._onTrs = typeof configToBeApplied.onTimeRangeSelected === "function" ? configToBeApplied.onTimeRangeSelected : null; delete configToBeApplied.onTimeRangeSelected; delete configToBeApplied.selectionDay; control.internal.upd(configToBeApplied); } }); } ngOnInit() { } ngOnDestroy() { this.dispose(); } ngAfterViewInit() { this.dispose(); this.control = new DayPilot.Navigator(this.id); let component = this; this.updateOptions(); this.updateEvents(); let dp = this.control; this.control.onTimeRangeSelected = function (args) { // emit event component.dateChange.emit(args.day); // call the original if (component._onTrs) { component._onTrs.call(dp, args); } }; this._requestUpdateFull = false; // config just loaded and calling init(), no need to call update again this._requestUpdateEvents = false; // config just loaded and calling init(), no need to call update again this.control.init(); if (this.control.selectionDay !== DayPilot.Date.today()) { component.dateChange.emit(this.control.selectionDay); } } ngDoCheck() { if (!this.control) { return; } const eventsAsSignal = typeof this._events === 'function' || !this._eventsSet; const configAsSignal = typeof this.config === 'function' || !this.config; if (eventsAsSignal && configAsSignal) { return; } if (!this.control) { return; } if (!configAsSignal) { this.updateOptions(); } if (!eventsAsSignal) { this.updateEvents(); } const control = this.control; if (this._requestUpdateFull) { control.internal.upd(); this._requestUpdateFull = false; this._requestUpdateEvents = false; } else if (this._requestUpdateEvents) { control.internal.upd({ "events": this.events }); this._requestUpdateEvents = false; } } dispose() { if (this.control) { this.control.dispose(); //@ts-ignore this.control = null; } } updateOptions() { let dp = this.control; const config = this.configResolved; let hash = optHash(this.config); if (hash !== this._hashOptions) { for (let name in config) { if (name === "selectionDay") { continue; // ignore } if (name === "onTimeRangeSelected") { // FIX: capture from resolved config (works when config is a signal) this._onTrs = config.onTimeRangeSelected; } else { dp[name] = config[name]; } this._requestUpdateFull = true; } } if (this._dateSet && this.date) { this._dateSet = false; dp.select(this.date); } this._hashOptions = hash; } updateEvents() { const hash = optHash(this.events); if (hash !== this._hashEvents) { const dp = this.control; if (dp) { dp.events.list = this.events; } this._requestUpdateEvents = true; } this._hashEvents = hash; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DayPilotNavigatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DayPilotNavigatorComponent, selector: "daypilot-navigator", inputs: { config: "config", date: "date", events: "events" }, outputs: { dateChange: "dateChange" }, ngImport: i0, template: ` <div id='{{id}}'></div>`, isInline: true, styles: [""] }); } export { DayPilotNavigatorComponent }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DayPilotNavigatorComponent, decorators: [{ type: Component, args: [{ selector: 'daypilot-navigator', template: ` <div id='{{id}}'></div>` }] }], ctorParameters: function () { return []; }, propDecorators: { config: [{ type: Input }], dateChange: [{ type: Output }], date: [{ type: Input }], events: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF5cGlsb3QtbmF2aWdhdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RheXBpbG90L2RheXBpbG90LWxpdGUtYW5ndWxhci9zcmMvbGliL2RheXBpbG90LW5hdmlnYXRvci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixTQUFTLEVBQVcsTUFBTSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN4SCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDOUMsT0FBTyxFQUFDLE9BQU8sRUFBa0IsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDOztBQUVyRCxNQU1hLDBCQUEwQjtJQUU1QixNQUFNLENBQXNCO0lBQzNCLFVBQVUsR0FBZ0MsSUFBSSxZQUFZLEVBQWlCLENBQUM7SUFDL0UsT0FBTyxDQUFzQjtJQUM1QixrQkFBa0IsR0FBWSxLQUFLLENBQUM7SUFDcEMsb0JBQW9CLEdBQVksS0FBSyxDQUFDO0lBQ3RDLFlBQVksR0FBVyxFQUFFLENBQUM7SUFDMUIsV0FBVyxHQUFXLEVBQUUsQ0FBQztJQUN6QixNQUFNLEdBQVEsSUFBSSxDQUFDO0lBQ25CLFFBQVEsR0FBWSxLQUFLLENBQUM7SUFDMUIsVUFBVSxHQUFZLEtBQUssQ0FBQztJQUU1QixLQUFLLEdBQWtCLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFFckQsSUFBVyxJQUFJO1FBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRCx3REFBd0Q7SUFDeEQsSUFDVyxJQUFJLENBQUMsS0FBb0I7UUFDbEMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFFckIseUdBQXlHO1FBQ3pHLE1BQU0s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RyxJQUFJLENBQUM7SUFDMUIsQ0FBQzt3R0FsTlUsMEJBQTBCOzRGQUExQiwwQkFBMEIsK0pBSjNCOzRCQUNnQjs7U0FHZiwwQkFBMEI7NEZBQTFCLDBCQUEwQjtrQkFOdEMsU0FBUzsrQkFDRSxvQkFBb0IsWUFDcEI7NEJBQ2dCOzBFQUtqQixNQUFNO3NCQUFkLEtBQUs7Z0JBQ0ksVUFBVTtzQkFBbkIsTUFBTTtnQkFrQkksSUFBSTtzQkFEZCxLQUFLO2dCQTRCSyxNQUFNO3NCQURoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIERvQ2hlY2ssIGVmZmVjdCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7RGF5UGlsb3R9IGZyb20gXCIuL2NvcmUvZGF5cGlsb3QtY29yZVwiO1xuaW1wb3J0IHtvcHRIYXNoLCBPcHRpb25hbFNpZ25hbCwgcmFuZH0gZnJvbSBcIi4vdXRpbFwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkYXlwaWxvdC1uYXZpZ2F0b3InLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgaWQ9J3t7aWR9fSc+PC9kaXY+YCxcbiAgc3R5bGVzOiBbYGBdXG59KVxuZXhwb3J0IGNsYXNzIERheVBpbG90TmF2aWdhdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQsIERvQ2hlY2sge1xuXG4gIEBJbnB1dCgpIGNvbmZpZzogT3B0aW9uYWxTaWduYWw8YW55PjtcbiAgQE91dHB1dCgpIGRhdGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxEYXlQaWxvdC5EYXRlPiA9IG5ldyBFdmVudEVtaXR0ZXI8RGF5UGlsb3QuRGF0ZT4oKTtcbiAgcHVibGljIGNvbnRyb2whOiBEYXlQaWxvdC5OYXZpZ2F0b3I7XG4gIHByaXZhdGUgX3JlcXVlc3RVcGRhdGVGdWxsOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3JlcXVlc3RVcGRhdGVFdmVudHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfaGFzaE9wdGlvbnM6IHN0cmluZyA9IFwiXCI7XG4gIHByaXZhdGUgX2hhc2hFdmVudHM6IHN0cmluZyA9IFwiXCI7XG4gIHByaXZhdGUgX29uVHJzOiBhbnkgPSBudWxsO1xuICBwcml2YXRlIF9kYXRlU2V0OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2V2ZW50c1NldDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX2RhdGU6IERheVBpbG90LkRhdGUgPSBEYXlQaWxvdC5EYXRlLnRvZGF5KCk7XG5cbiAgcHVibGljIGdldCBkYXRlKCk6IERheVBpbG90LkRhdGUge1xuICAgIHJldHVybiB0aGlzLl9kYXRlO1xuICB9XG5cbiAgLy8gQElucHV0KCkgZGF0ZTogRGF5UGlsb3QuRGF0ZSA9IERheVBpbG90LkRhdGUudG9kYXkoKTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBkYXRlKHZhbHVlOiBEYXlQaWxvdC5EYXRlKSB7XG4gICAgdGhpcy5fZGF0ZSA9IHZhbHVlO1xuICAgIHRoaXMuX2RhdGVTZXQgPSB0cnVlO1xuXG4gICAgLy8gQXBwbHkgaW1tZWRpYXRlbHkgd2hlbiBjb250cm9sIGV4aXN0cyAod29ya3MgZXZlbiB3aGVuIGNvbmZpZyBpcyBhIHNpZ25hbCBhbmQgbmdEb0NoZWNrIHJldHVybnMgZWFybHkpXG4gICAgY29uc3QgZHA6IGFueSA9IHRoaXMuY29udHJvbDtcbiAgICBpZiAoZHApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBkcC5zZWxlY3Rpb25EYXk7XG4gICAgICBpZiAoY3VycmVudCAmJiB2YWx1ZSAmJiBjdXJyZW50LmdldFRpbWUoKSA9PT0gdmFsdWUuZ2V0VGltZSgpKSB7XG4gICAgICAgIHRoaXMuX2RhdGVTZXQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fZGF0ZVNldCA9IGZhbHNlO1xuICAgICAgZHAuc2VsZWN0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9ldmVudHM6IE9wdGlvbmFsU2lnbmFsPERheVBpbG90LkV2ZW50RGF0YVtdPiA9IFtdO1xuXG4gIHB1YmxpYyBnZXQgZXZlbnRzKCk6IERheVBpbG90LkV2ZW50RGF0YVtdIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX2V2ZW50cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHRoaXMuX2V2ZW50cygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZXZlbnRzO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBldmVudHModmFsdWU6IE9wdGlvbmFsU2lnbmFsPERheVBpbG90LkV2ZW50RGF0YVtdPikge1xuICAgIHRoaXMuX2V2ZW50c1NldCA9IHRydWU7XG4gICAgdGhpcy5fZXZlbnRzID0gdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGdldCBjb25maWdSZXNvbHZlZCgpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMuY29uZmlnID09PSAnZnVuY3Rpb24nID8gdGhpcy5jb25maWcoKSA6IHRoaXMuY29uZmlnO1xuICB9XG5cbiAgcHJpdmF0ZSBfaWQ6IHN0cmluZyA9IFwiZHBfXCIgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIHJhbmQoKTtcblxuICBnZXQgaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5fZXZlbnRzICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbnRyb2w6IGFueSA9IHRoaXMuY29udHJvbDtcbiAgICAgIGNvbnN0IGV2ZW50cyA9ICg8YW55PnRoaXMuX2V2ZW50cykoKTtcbiAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgIGNvbnRyb2wuaW50ZXJuYWwudXBkKHtldmVudHN9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuY29uZmlnICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbnRyb2w6IGFueSA9IHRoaXMuY29udHJvbDtcbiAgICAgIGNvbnN0IGNvbmZpZyA9ICg8YW55PnRoaXMuY29uZmlnKSgpO1xuICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgY29uc3QgY29uZmlnVG9CZUFwcGxpZWQgPSB7IC4uLmNvbmZpZyB9O1xuXG4gICAgICAgIC8vIEtlZXAgX29uVHJzIHN5bmNocm9uaXplZCBldmVuIHdoZW4gaGFuZGxlciBpcyByZW1vdmVkXG4gICAgICAgIHRoaXMuX29uVHJzID0gdHlwZW9mIGNvbmZpZ1RvQmVBcHBsaWVkLm9uVGltZVJhbmdlU2VsZWN0ZWQgPT09IFwiZnVuY3Rpb25cIiA/IGNvbmZpZ1RvQmVBcHBsaWVkLm9uVGltZVJhbmdlU2VsZWN0ZWQgOiBudWxsO1xuICAgICAgICBkZWxldGUgY29uZmlnVG9CZUFwcGxpZWQub25UaW1lUmFuZ2VTZWxlY3RlZDtcblxuICAgICAgICBkZWxldGUgY29uZmlnVG9CZUFwcGxpZWQuc2VsZWN0aW9uRGF5O1xuICAgICAgICBjb250cm9sLmludGVybmFsLnVwZChjb25maWdUb0JlQXBwbGllZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcG9zZSgpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcG9zZSgpO1xuICAgIHRoaXMuY29udHJvbCA9IG5ldyBEYXlQaWxvdC5OYXZpZ2F0b3IodGhpcy5pZCk7XG4gICAgbGV0IGNvbXBvbmVudCA9IHRoaXM7XG5cbiAgICB0aGlzLnVwZGF0ZU9wdGlvbnMoKTtcbiAgICB0aGlzLnVwZGF0ZUV2ZW50cygpO1xuICAgIGxldCBkcCA9IHRoaXMuY29udHJvbDtcbiAgICB0aGlzLmNvbnRyb2wub25UaW1lUmFuZ2VTZWxlY3RlZCA9IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICAvLyBlbWl0IGV2ZW50XG4gICAgICBjb21wb25lbnQuZGF0ZUNoYW5nZS5lbWl0KGFyZ3MuZGF5KTtcbiAgICAgIC8vIGNhbGwgdGhlIG9yaWdpbmFsXG4gICAgICBpZiAoY29tcG9uZW50Ll9vblRycykge1xuICAgICAgICBjb21wb25lbnQuX29uVHJzLmNhbGwoZHAsIGFyZ3MpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5fcmVxdWVzdFVwZGF0ZUZ1bGwgPSBmYWxzZTsgLy8gY29uZmlnIGp1c3QgbG9hZGVkIGFuZCBjYWxsaW5nIGluaXQoKSwgbm8gbmVlZCB0byBjYWxsIHVwZGF0ZSBhZ2FpblxuICAgIHRoaXMuX3JlcXVlc3RVcGRhdGVFdmVudHMgPSBmYWxzZTsgLy8gY29uZmlnIGp1c3QgbG9hZGVkIGFuZCBjYWxsaW5nIGluaXQoKSwgbm8gbmVlZCB0byBjYWxsIHVwZGF0ZSBhZ2FpblxuICAgIHRoaXMuY29udHJvbC5pbml0KCk7XG5cbiAgICBpZiAodGhpcy5jb250cm9sLnNlbGVjdGlvbkRheSAhPT0gRGF5UGlsb3QuRGF0ZS50b2RheSgpKSB7XG4gICAgICBjb21wb25lbnQuZGF0ZUNoYW5nZS5lbWl0KHRoaXMuY29udHJvbC5zZWxlY3Rpb25EYXkpO1xuICAgIH1cblxuICB9XG5cbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb250cm9sKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZXZlbnRzQXNTaWduYWwgPSB0eXBlb2YgdGhpcy5fZXZlbnRzID09PSAnZnVuY3Rpb24nIHx8ICF0aGlzLl9ldmVudHNTZXQ7XG4gICAgY29uc3QgY29uZmlnQXNTaWduYWwgPSB0eXBlb2YgdGhpcy5jb25maWcgPT09ICdmdW5jdGlvbicgfHwgIXRoaXMuY29uZmlnO1xuXG4gICAgaWYgKGV2ZW50c0FzU2lnbmFsICYmIGNvbmZpZ0FzU2lnbmFsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNvbnRyb2wpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpZ0FzU2lnbmFsKSB7XG4gICAgICB0aGlzLnVwZGF0ZU9wdGlvbnMoKTtcbiAgICB9XG4gICAgaWYgKCFldmVudHNBc1NpZ25hbCkge1xuICAgICAgdGhpcy51cGRhdGVFdmVudHMoKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb250cm9sOiBhbnkgPSB0aGlzLmNvbnRyb2w7XG5cbiAgICBpZiAodGhpcy5fcmVxdWVzdFVwZGF0ZUZ1bGwpIHtcbiAgICAgIGNvbnRyb2wuaW50ZXJuYWwudXBkKCk7XG4gICAgICB0aGlzLl9yZXF1ZXN0VXBkYXRlRnVsbCA9IGZhbHNlO1xuICAgICAgdGhpcy5fcmVxdWVzdFVwZGF0ZUV2ZW50cyA9IGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIGlmICh0aGlzLl9yZXF1ZXN0VXBkYXRlRXZlbnRzKSB7XG4gICAgICBjb250cm9sLmludGVybmFsLnVwZCh7IFwiZXZlbnRzXCI6IHRoaXMuZXZlbnRzIH0pO1xuICAgICAgdGhpcy5fcmVxdWVzdFVwZGF0ZUV2ZW50cyA9IGZhbHNlO1xuICAgIH1cblxuICB9XG5cbiAgcHJpdmF0ZSBkaXNwb3NlKCkge1xuICAgIGlmICh0aGlzLmNvbnRyb2wpIHtcbiAgICAgIHRoaXMuY29udHJvbC5kaXNwb3NlKCk7XG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIHRoaXMuY29udHJvbCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVPcHRpb25zKCk6IHZvaWQge1xuICAgIGxldCBkcCA9IHRoaXMuY29udHJvbCBhcyBhbnk7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWdSZXNvbHZlZDtcbiAgICBsZXQgaGFzaCA9IG9wdEhhc2godGhpcy5jb25maWcpO1xuXG4gICAgaWYgKGhhc2ggIT09IHRoaXMuX2hhc2hPcHRpb25zKSB7XG4gICAgICBmb3IgKGxldCBuYW1lIGluIGNvbmZpZykge1xuICAgICAgICBpZiAobmFtZSA9PT0gXCJzZWxlY3Rpb25EYXlcIikge1xuICAgICAgICAgIGNvbnRpbnVlOyAvLyBpZ25vcmVcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSA9PT0gXCJvblRpbWVSYW5nZVNlbGVjdGVkXCIpIHtcbiAgICAgICAgICAvLyBGSVg6IGNhcHR1cmUgZnJvbSByZXNvbHZlZCBjb25maWcgKHdvcmtzIHdoZW4gY29uZmlnIGlzIGEgc2lnbmFsKVxuICAgICAgICAgIHRoaXMuX29uVHJzID0gKGNvbmZpZyBhcyBhbnkpLm9uVGltZVJhbmdlU2VsZWN0ZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZHBbbmFtZV0gPSBjb25maWdbbmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmVxdWVzdFVwZGF0ZUZ1bGwgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9kYXRlU2V0ICYmIHRoaXMuZGF0ZSkge1xuICAgICAgdGhpcy5fZGF0ZVNldCA9IGZhbHNlO1xuICAgICAgZHAuc2VsZWN0KHRoaXMuZGF0ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5faGFzaE9wdGlvbnMgPSBoYXNoO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVFdmVudHMoKTogdm9pZCB7XG4gICAgY29uc3QgaGFzaCA9IG9wdEhhc2godGhpcy5ldmVudHMpO1xuICAgIGlmIChoYXNoICE9PSB0aGlzLl9oYXNoRXZlbnRzKSB7XG4gICAgICBjb25zdCBkcCA9IHRoaXMuY29udHJvbDtcbiAgICAgIGlmIChkcCkge1xuICAgICAgICBkcC5ldmVudHMubGlzdCA9IHRoaXMuZXZlbnRzO1xuICAgICAgfVxuICAgICAgdGhpcy5fcmVxdWVzdFVwZGF0ZUV2ZW50cyA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuX2hhc2hFdmVudHMgPSBoYXNoO1xuICB9XG59XG4iXX0=