@daypilot/daypilot-lite-angular
Version:
DayPilot Lite for Angular
198 lines • 22.7 kB
JavaScript
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=