@qeydar/datepicker
Version:
A comprehensive Date and Time Picker for Angular with Jalali calendar support
228 lines • 27.7 kB
JavaScript
import { Injectable } from '@angular/core';
import * as i0 from "@angular/core";
export class SelectionStrategyService {
/**
* Check if a date is selected (for single selection)
*/
isSelected(date, selectedDate, dateAdapter) {
return selectedDate && dateAdapter.isSameDay(date, selectedDate);
}
/**
* Check if a date is the start of a range
*/
isRangeStart(date, selectedStartDate, dateAdapter) {
return selectedStartDate && dateAdapter.isSameDay(date, selectedStartDate);
}
/**
* Check if a date is the end of a range
*/
isRangeEnd(date, selectedEndDate, dateAdapter) {
return selectedEndDate && dateAdapter.isSameDay(date, selectedEndDate);
}
/**
* Check if a date is in range (between start and end)
*/
isInRange(date, selectedStartDate, selectedEndDate, tempEndDate, dateAdapter) {
if (!selectedStartDate || (!selectedEndDate && !tempEndDate)) {
return false;
}
const endDate = selectedEndDate || tempEndDate;
return (dateAdapter.isAfter(date, selectedStartDate) &&
dateAdapter.isBefore(date, endDate));
}
/**
* Check if a date is selected (for range selection)
*/
isRangeSelected(date, selectedStartDate, selectedEndDate, dateAdapter) {
return (this.isRangeStart(date, selectedStartDate, dateAdapter) ||
this.isRangeEnd(date, selectedEndDate, dateAdapter));
}
/**
* Handle single date selection
*/
handleSingleSelection(date, selectedDate, showTimePicker, existingTime) {
let finalDate = date;
if (showTimePicker && existingTime) {
finalDate = this.applyTimeToDate(date, existingTime);
}
return {
selectedDate: finalDate,
shouldEmit: !showTimePicker,
};
}
/**
* Handle range date selection
*/
handleRangeSelection(date, selectedStartDate, selectedEndDate, showTimePicker, existingTime) {
let finalDate = date;
if (showTimePicker && existingTime) {
finalDate = this.applyTimeToDate(date, existingTime);
}
// If no start date or both dates are selected or new date is before start date
if (!selectedStartDate ||
(selectedStartDate && selectedEndDate) ||
this.isDateBefore(date, selectedStartDate)) {
return {
selectedStartDate: finalDate,
selectedEndDate: null,
shouldEmit: true,
activeInput: 'end',
};
}
else {
return {
selectedStartDate,
selectedEndDate: finalDate,
shouldEmit: true,
activeInput: 'end',
};
}
}
/**
* Check if a period is active (for sidebar periods)
*/
isActivePeriod(period, selectedStartDate, selectedEndDate, dateAdapter, allPeriods) {
if (!selectedStartDate || !selectedEndDate)
return false;
if (period.value === 'custom') {
const otherPeriods = allPeriods.filter((p) => p.value !== 'custom');
const hasActiveOther = otherPeriods.some((p) => this.isPeriodMatch(p, selectedStartDate, selectedEndDate, dateAdapter));
return !hasActiveOther;
}
return this.isPeriodMatch(period, selectedStartDate, selectedEndDate, dateAdapter);
}
/**
* Check if a period is matched (for sidebar periods)
*/
isPeriodMatch(period, selectedStartDate, selectedEndDate, dateAdapter) {
const [start, end] = period.value;
const sameStart = dateAdapter.isEqual(dateAdapter.startOfDay(start), dateAdapter.startOfDay(selectedStartDate));
const sameEnd = dateAdapter.isEqual(dateAdapter.startOfDay(end), dateAdapter.startOfDay(selectedEndDate));
return sameStart && sameEnd;
}
/**
* Handle period selection
*/
selectPeriod(period) {
if (period.value === 'custom') {
return {
selectedPeriod: 'custom',
isCustom: true,
};
}
const [start, end] = period.value;
return {
selectedPeriod: period.value,
dateRange: { start, end },
isCustom: false,
};
}
/**
* Apply time to a date
*/
applyTimeToDate(date, timeDate) {
const result = new Date(date);
result.setHours(timeDate.getHours());
result.setMinutes(timeDate.getMinutes());
result.setSeconds(timeDate.getSeconds());
return result;
}
/**
* Check if first date is before second date
*/
isDateBefore(date1, date2) {
return date1 < date2;
}
/**
* Create date range object
*/
createDateRange(start, end) {
if (!start)
return null;
return { start, end };
}
/**
* Check if range selection is complete
*/
isRangeComplete(selectedStartDate, selectedEndDate) {
return !!(selectedStartDate && selectedEndDate);
}
/**
* Get the active date for range selection
*/
getActiveDateForRange(activeInput, selectedStartDate, selectedEndDate) {
if (activeInput === 'start') {
return selectedStartDate;
}
else if (activeInput === 'end') {
return selectedEndDate;
}
return null;
}
/**
* Update time for range selection
*/
updateRangeTime(timeDate, activeInput, selectedStartDate, selectedEndDate) {
if (activeInput === 'start' && selectedStartDate) {
const updatedDate = this.applyTimeToDate(selectedStartDate, timeDate);
return {
selectedStartDate: updatedDate,
selectedEndDate,
shouldEmit: true,
};
}
else if (activeInput === 'end' && selectedEndDate) {
const updatedDate = this.applyTimeToDate(selectedEndDate, timeDate);
return {
selectedStartDate,
selectedEndDate: updatedDate,
shouldEmit: true,
};
}
return {
selectedStartDate,
selectedEndDate,
shouldEmit: false,
};
}
/**
* Update time for single selection
*/
updateSingleTime(timeDate, selectedDate) {
if (!selectedDate) {
return {
selectedDate: new Date(),
shouldEmit: false,
};
}
const updatedDate = this.applyTimeToDate(selectedDate, timeDate);
return {
selectedDate: updatedDate,
shouldEmit: false,
};
}
/**
* Handle mouse enter for range selection preview
*/
handleMouseEnter(date, selectedStartDate, selectedEndDate) {
if (selectedStartDate && !selectedEndDate) {
return date; // This will be used as tempEndDate
}
return null;
}
/**
* Check if date is today
*/
isToday(date, dateAdapter, showToday) {
return showToday && dateAdapter.isSameDay(date, dateAdapter.today());
}
}
SelectionStrategyService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SelectionStrategyService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
SelectionStrategyService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SelectionStrategyService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SelectionStrategyService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLXN0cmF0ZWd5LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9xZXlkYXItZGF0ZXBpY2tlci9zcmMvZGF0ZS1waWNrZXItcG9wdXAvc2VydmljZXMvc2VsZWN0aW9uLXN0cmF0ZWd5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFPM0MsTUFBTSxPQUFPLHdCQUF3QjtJQUNuQzs7T0FFRztJQUNILFVBQVUsQ0FDUixJQUFVLEVBQ1YsWUFBeUIsRUFDekIsV0FBOEI7UUFFOUIsT0FBTyxZQUFZLElBQUksV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBWSxDQUNWLElBQVUsRUFDVixpQkFBOEIsRUFDOUIsV0FBOEI7UUFFOUIsT0FBTyxpQkFBaUIsSUFBSSxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVUsQ0FDUixJQUFVLEVBQ1YsZUFBNEIsRUFDNUIsV0FBOEI7UUFFOUIsT0FBTyxlQUFlLElBQUksV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsU0FBUyxDQUNQLElBQVUsRUFDVixpQkFBOEIsRUFDOUIsZUFBNEIsRUFDNUIsV0FBd0IsRUFDeEIsV0FBOEI7UUFFOUIsSUFBSSxDQUFDLGlCQUFpQixJQUFJLENBQUMsQ0FBQyxlQUFlLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUM1RCxPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsTUFBTSxPQUFPLEdBQUcsZUFBZSxJQUFJLFdBQVcsQ0FBQztRQUMvQyxPQUFPLENBQ0ws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b250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRGF0ZUFkYXB0ZXIgfSBmcm9tICcuLi8uLi9kYXRlLWFkYXB0ZXInO1xyXG5pbXBvcnQgeyBDdXN0b21MYWJlbHMsIERhdGVSYW5nZSB9IGZyb20gJy4uLy4uL3V0aWxzL21vZGVscyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU2VsZWN0aW9uU3RyYXRlZ3lTZXJ2aWNlIHtcclxuICAvKipcclxuICAgKiBDaGVjayBpZiBhIGRhdGUgaXMgc2VsZWN0ZWQgKGZvciBzaW5nbGUgc2VsZWN0aW9uKVxyXG4gICAqL1xyXG4gIGlzU2VsZWN0ZWQoXHJcbiAgICBkYXRlOiBEYXRlLFxyXG4gICAgc2VsZWN0ZWREYXRlOiBEYXRlIHwgbnVsbCxcclxuICAgIGRhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxEYXRlPlxyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHNlbGVjdGVkRGF0ZSAmJiBkYXRlQWRhcHRlci5pc1NhbWVEYXkoZGF0ZSwgc2VsZWN0ZWREYXRlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIGEgZGF0ZSBpcyB0aGUgc3RhcnQgb2YgYSByYW5nZVxyXG4gICAqL1xyXG4gIGlzUmFuZ2VTdGFydChcclxuICAgIGRhdGU6IERhdGUsXHJcbiAgICBzZWxlY3RlZFN0YXJ0RGF0ZTogRGF0ZSB8IG51bGwsXHJcbiAgICBkYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8RGF0ZT5cclxuICApOiBib29sZWFuIHtcclxuICAgIHJldHVybiBzZWxlY3RlZFN0YXJ0RGF0ZSAmJiBkYXRlQWRhcHRlci5pc1NhbWVEYXkoZGF0ZSwgc2VsZWN0ZWRTdGFydERhdGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgYSBkYXRlIGlzIHRoZSBlbmQgb2YgYSByYW5nZVxyXG4gICAqL1xyXG4gIGlzUmFuZ2VFbmQoXHJcbiAgICBkYXRlOiBEYXRlLFxyXG4gICAgc2VsZWN0ZWRFbmREYXRlOiBEYXRlIHwgbnVsbCxcclxuICAgIGRhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxEYXRlPlxyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHNlbGVjdGVkRW5kRGF0ZSAmJiBkYXRlQWRhcHRlci5pc1NhbWVEYXkoZGF0ZSwgc2VsZWN0ZWRFbmREYXRlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIGEgZGF0ZSBpcyBpbiByYW5nZSAoYmV0d2VlbiBzdGFydCBhbmQgZW5kKVxyXG4gICAqL1xyXG4gIGlzSW5SYW5nZShcclxuICAgIGRhdGU6IERhdGUsXHJcbiAgICBzZWxlY3RlZFN0YXJ0RGF0ZTogRGF0ZSB8IG51bGwsXHJcbiAgICBzZWxlY3RlZEVuZERhdGU6IERhdGUgfCBudWxsLFxyXG4gICAgdGVtcEVuZERhdGU6IERhdGUgfCBudWxsLFxyXG4gICAgZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPERhdGU+XHJcbiAgKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXNlbGVjdGVkU3RhcnREYXRlIHx8ICghc2VsZWN0ZWRFbmREYXRlICYmICF0ZW1wRW5kRGF0ZSkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGVuZERhdGUgPSBzZWxlY3RlZEVuZERhdGUgfHwgdGVtcEVuZERhdGU7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBkYXRlQWRhcHRlci5pc0FmdGVyKGRhdGUsIHNlbGVjdGVkU3RhcnREYXRlKSAmJlxyXG4gICAgICBkYXRlQWRhcHRlci5pc0JlZm9yZShkYXRlLCBlbmREYXRlKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIGEgZGF0ZSBpcyBzZWxlY3RlZCAoZm9yIHJhbmdlIHNlbGVjdGlvbilcclxuICAgKi9cclxuICBpc1JhbmdlU2VsZWN0ZWQoXHJcbiAgICBkYXRlOiBEYXRlLFxyXG4gICAgc2VsZWN0ZWRTdGFydERhdGU6IERhdGUgfCBudWxsLFxyXG4gICAgc2VsZWN0ZWRFbmREYXRlOiBEYXRlIHwgbnVsbCxcclxuICAgIGRhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxEYXRlPlxyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5pc1JhbmdlU3RhcnQoZGF0ZSwgc2VsZWN0ZWRTdGFydERhdGUsIGRhdGVBZGFwdGVyKSB8fFxyXG4gICAgICB0aGlzLmlzUmFuZ2VFbmQoZGF0ZSwgc2VsZWN0ZWRFbmREYXRlLCBkYXRlQWRhcHRlcilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgc2luZ2xlIGRhdGUgc2VsZWN0aW9uXHJcbiAgICovXHJcbiAgaGFuZGxlU2luZ2xlU2VsZWN0aW9uKFxyXG4gICAgZGF0ZTogRGF0ZSxcclxuICAgIHNlbGVjdGVkRGF0ZTogRGF0ZSB8IG51bGwsXHJcbiAgICBzaG93VGltZVBpY2tlcjogYm9vbGVhbixcclxuICAgIGV4aXN0aW5nVGltZT86IERhdGVcclxuICApOiB7IHNlbGVjdGVkRGF0ZTogRGF0ZTsgc2hvdWxkRW1pdDogYm9vbGVhbiB9IHtcclxuICAgIGxldCBmaW5hbERhdGUgPSBkYXRlO1xyXG5cclxuICAgIGlmIChzaG93VGltZVBpY2tlciAmJiBleGlzdGluZ1RpbWUpIHtcclxuICAgICAgZmluYWxEYXRlID0gdGhpcy5hcHBseVRpbWVUb0RhdGUoZGF0ZSwgZXhpc3RpbmdUaW1lKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzZWxlY3RlZERhdGU6IGZpbmFsRGF0ZSxcclxuICAgICAgc2hvdWxkRW1pdDogIXNob3dUaW1lUGlja2VyLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSByYW5nZSBkYXRlIHNlbGVjdGlvblxyXG4gICAqL1xyXG4gIGhhbmRsZVJhbmdlU2VsZWN0aW9uKFxyXG4gICAgZGF0ZTogRGF0ZSxcclxuICAgIHNlbGVjdGVkU3RhcnREYXRlOiBEYXRlIHwgbnVsbCxcclxuICAgIHNlbGVjdGVkRW5kRGF0ZTogRGF0ZSB8IG51bGwsXHJcbiAgICBzaG93VGltZVBpY2tlcjogYm9vbGVhbixcclxuICAgIGV4aXN0aW5nVGltZT86IERhdGVcclxuICApOiB7XHJcbiAgICBzZWxlY3RlZFN0YXJ0RGF0ZTogRGF0ZSB8IG51bGw7XHJcbiAgICBzZWxlY3RlZEVuZERhdGU6IERhdGUgfCBudWxsO1xyXG4gICAgc2hvdWxkRW1pdDogYm9vbGVhbjtcclxuICAgIGFjdGl2ZUlucHV0OiAnc3RhcnQnIHwgJ2VuZCc7XHJcbiAgfSB7XHJcbiAgICBsZXQgZmluYWxEYXRlID0gZGF0ZTtcclxuXHJcbiAgICBpZiAoc2hvd1RpbWVQaWNrZXIgJiYgZXhpc3RpbmdUaW1lKSB7XHJcbiAgICAgIGZpbmFsRGF0ZSA9IHRoaXMuYXBwbHlUaW1lVG9EYXRlKGRhdGUsIGV4aXN0aW5nVGltZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgbm8gc3RhcnQgZGF0ZSBvciBib3RoIGRhdGVzIGFyZSBzZWxlY3RlZCBvciBuZXcgZGF0ZSBpcyBiZWZvcmUgc3RhcnQgZGF0ZVxyXG4gICAgaWYgKFxyXG4gICAgICAhc2VsZWN0ZWRTdGFydERhdGUgfHxcclxuICAgICAgKHNlbGVjdGVkU3RhcnREYXRlICYmIHNlbGVjdGVkRW5kRGF0ZSkgfHxcclxuICAgICAgdGhpcy5pc0RhdGVCZWZvcmUoZGF0ZSwgc2VsZWN0ZWRTdGFydERhdGUpXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBzZWxlY3RlZFN0YXJ0RGF0ZTogZmluYWxEYXRlLFxyXG4gICAgICAgIHNlbGVjdGVkRW5kRGF0ZTogbnVsbCxcclxuICAgICAgICBzaG91bGRFbWl0OiB0cnVlLFxyXG4gICAgICAgIGFjdGl2ZUlucHV0OiAnZW5kJyxcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgc2VsZWN0ZWRTdGFydERhdGUsXHJcbiAgICAgICAgc2VsZWN0ZWRFbmREYXRlOiBmaW5hbERhdGUsXHJcbiAgICAgICAgc2hvdWxkRW1pdDogdHJ1ZSxcclxuICAgICAgICBhY3RpdmVJbnB1dDogJ2VuZCcsXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiBhIHBlcmlvZCBpcyBhY3RpdmUgKGZvciBzaWRlYmFyIHBlcmlvZHMpXHJcbiAgICovXHJcbiAgaXNBY3RpdmVQZXJpb2QoXHJcbiAgICBwZXJpb2Q6IEN1c3RvbUxhYmVscyxcclxuICAgIHNlbGVjdGVkU3RhcnREYXRlOiBEYXRlIHwgbnVsbCxcclxuICAgIHNlbGVjdGVkRW5kRGF0ZTogRGF0ZSB8IG51bGwsXHJcbiAgICBkYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8RGF0ZT4sXHJcbiAgICBhbGxQZXJpb2RzOiBDdXN0b21MYWJlbHNbXVxyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFzZWxlY3RlZFN0YXJ0RGF0ZSB8fCAhc2VsZWN0ZWRFbmREYXRlKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKHBlcmlvZC52YWx1ZSA9PT0gJ2N1c3RvbScpIHtcclxuICAgICAgY29uc3Qgb3RoZXJQZXJpb2RzID0gYWxsUGVyaW9kcy5maWx0ZXIoKHApID0+IHAudmFsdWUgIT09ICdjdXN0b20nKTtcclxuICAgICAgY29uc3QgaGFzQWN0aXZlT3RoZXIgPSBvdGhlclBlcmlvZHMuc29tZSgocCkgPT5cclxuICAgICAgICB0aGlzLmlzUGVyaW9kTWF0Y2gocCwgc2VsZWN0ZWRTdGFydERhdGUsIHNlbGVjdGVkRW5kRGF0ZSwgZGF0ZUFkYXB0ZXIpXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiAhaGFzQWN0aXZlT3RoZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaXNQZXJpb2RNYXRjaChcclxuICAgICAgcGVyaW9kLFxyXG4gICAgICBzZWxlY3RlZFN0YXJ0RGF0ZSxcclxuICAgICAgc2VsZWN0ZWRFbmREYXRlLFxyXG4gICAgICBkYXRlQWRhcHRlclxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIGEgcGVyaW9kIGlzIG1hdGNoZWQgKGZvciBzaWRlYmFyIHBlcmlvZHMpXHJcbiAgICovXHJcbiAgaXNQZXJpb2RNYXRjaChcclxuICAgIHBlcmlvZDogQ3VzdG9tTGFiZWxzLFxyXG4gICAgc2VsZWN0ZWRTdGFydERhdGU6IERhdGUsXHJcbiAgICBzZWxlY3RlZEVuZERhdGU6IERhdGUsXHJcbiAgICBkYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8RGF0ZT5cclxuICApOiBib29sZWFuIHtcclxuICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IHBlcmlvZC52YWx1ZSBhcyBEYXRlW107XHJcblxyXG4gICAgY29uc3Qgc2FtZVN0YXJ0ID0gZGF0ZUFkYXB0ZXIuaXNFcXVhbChcclxuICAgICAgZGF0ZUFkYXB0ZXIuc3RhcnRPZkRheShzdGFydCksXHJcbiAgICAgIGRhdGVBZGFwdGVyLnN0YXJ0T2ZEYXkoc2VsZWN0ZWRTdGFydERhdGUpXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IHNhbWVFbmQgPSBkYXRlQWRhcHRlci5pc0VxdWFsKFxyXG4gICAgICBkYXRlQWRhcHRlci5zdGFydE9mRGF5KGVuZCksXHJcbiAgICAgIGRhdGVBZGFwdGVyLnN0YXJ0T2ZEYXkoc2VsZWN0ZWRFbmREYXRlKVxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gc2FtZVN0YXJ0ICYmIHNhbWVFbmQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgcGVyaW9kIHNlbGVjdGlvblxyXG4gICAqL1xyXG4gIHNlbGVjdFBlcmlvZChwZXJpb2Q6IEN1c3RvbUxhYmVscyk6IHtcclxuICAgIHNlbGVjdGVkUGVyaW9kOiBhbnk7XHJcbiAgICBkYXRlUmFuZ2U/OiBEYXRlUmFuZ2U7XHJcbiAgICBpc0N1c3RvbTogYm9vbGVhbjtcclxuICB9IHtcclxuICAgIGlmIChwZXJpb2QudmFsdWUgPT09ICdjdXN0b20nKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgc2VsZWN0ZWRQZXJpb2Q6ICdjdXN0b20nLFxyXG4gICAgICAgIGlzQ3VzdG9tOiB0cnVlLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IHBlcmlvZC52YWx1ZSBhcyBEYXRlW107XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzZWxlY3RlZFBlcmlvZDogcGVyaW9kLnZhbHVlLFxyXG4gICAgICBkYXRlUmFuZ2U6IHsgc3RhcnQsIGVuZCB9LFxyXG4gICAgICBpc0N1c3RvbTogZmFsc2UsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXBwbHkgdGltZSB0byBhIGRhdGVcclxuICAgKi9cclxuICBhcHBseVRpbWVUb0RhdGUoZGF0ZTogRGF0ZSwgdGltZURhdGU6IERhdGUpOiBEYXRlIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBEYXRlKGRhdGUpO1xyXG4gICAgcmVzdWx0LnNldEhvdXJzKHRpbWVEYXRlLmdldEhvdXJzKCkpO1xyXG4gICAgcmVzdWx0LnNldE1pbnV0ZXModGltZURhdGUuZ2V0TWludXRlcygpKTtcclxuICAgIHJlc3VsdC5zZXRTZWNvbmRzKHRpbWVEYXRlLmdldFNlY29uZHMoKSk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgZmlyc3QgZGF0ZSBpcyBiZWZvcmUgc2Vjb25kIGRhdGVcclxuICAgKi9cclxuICBwcml2YXRlIGlzRGF0ZUJlZm9yZShkYXRlMTogRGF0ZSwgZGF0ZTI6IERhdGUpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBkYXRlMSA8IGRhdGUyO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGRhdGUgcmFuZ2Ugb2JqZWN0XHJcbiAgICovXHJcbiAgY3JlYXRlRGF0ZVJhbmdlKHN0YXJ0OiBEYXRlIHwgbnVsbCwgZW5kOiBEYXRlIHwgbnVsbCk6IERhdGVSYW5nZSB8IG51bGwge1xyXG4gICAgaWYgKCFzdGFydCkgcmV0dXJuIG51bGw7XHJcbiAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiByYW5nZSBzZWxlY3Rpb24gaXMgY29tcGxldGVcclxuICAgKi9cclxuICBpc1JhbmdlQ29tcGxldGUoXHJcbiAgICBzZWxlY3RlZFN0YXJ0RGF0ZTogRGF0ZSB8IG51bGwsXHJcbiAgICBzZWxlY3RlZEVuZERhdGU6IERhdGUgfCBudWxsXHJcbiAgKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISEoc2VsZWN0ZWRTdGFydERhdGUgJiYgc2VsZWN0ZWRFbmREYXRlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgYWN0aXZlIGRhdGUgZm9yIHJhbmdlIHNlbGVjdGlvblxyXG4gICAqL1xyXG4gIGdldEFjdGl2ZURhdGVGb3JSYW5nZShcclxuICAgIGFjdGl2ZUlucHV0OiAnc3RhcnQnIHwgJ2VuZCcgfCAnJyxcclxuICAgIHNlbGVjdGVkU3RhcnREYXRlOiBEYXRlIHwgbnVsbCxcclxuICAgIHNlbGVjdGVkRW5kRGF0ZTogRGF0ZSB8IG51bGxcclxuICApOiBEYXRlIHwgbnVsbCB7XHJcbiAgICBpZiAoYWN0aXZlSW5wdXQgPT09ICdzdGFydCcpIHtcclxuICAgICAgcmV0dXJuIHNlbGVjdGVkU3RhcnREYXRlO1xyXG4gICAgfSBlbHNlIGlmIChhY3RpdmVJbnB1dCA9PT0gJ2VuZCcpIHtcclxuICAgICAgcmV0dXJuIHNlbGVjdGVkRW5kRGF0ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHRpbWUgZm9yIHJhbmdlIHNlbGVjdGlvblxyXG4gICAqL1xyXG4gIHVwZGF0ZVJhbmdlVGltZShcclxuICAgIHRpbWVEYXRlOiBEYXRlLFxyXG4gICAgYWN0aXZlSW5wdXQ6ICdzdGFydCcgfCAnZW5kJyB8ICcnLFxyXG4gICAgc2VsZWN0ZWRTdGFydERhdGU6IERhdGUgfCBudWxsLFxyXG4gICAgc2VsZWN0ZWRFbmREYXRlOiBEYXRlIHwgbnVsbFxyXG4gICk6IHtcclxuICAgIHNlbGVjdGVkU3RhcnREYXRlOiBEYXRlIHwgbnVsbDtcclxuICAgIHNlbGVjdGVkRW5kRGF0ZTogRGF0ZSB8IG51bGw7XHJcbiAgICBzaG91bGRFbWl0OiBib29sZWFuO1xyXG4gIH0ge1xyXG4gICAgaWYgKGFjdGl2ZUlucHV0ID09PSAnc3RhcnQnICYmIHNlbGVjdGVkU3RhcnREYXRlKSB7XHJcbiAgICAgIGNvbnN0IHVwZGF0ZWREYXRlID0gdGhpcy5hcHBseVRpbWVUb0RhdGUoc2VsZWN0ZWRTdGFydERhdGUsIHRpbWVEYXRlKTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBzZWxlY3RlZFN0YXJ0RGF0ZTogdXBkYXRlZERhdGUsXHJcbiAgICAgICAgc2VsZWN0ZWRFbmREYXRlLFxyXG4gICAgICAgIHNob3VsZEVtaXQ6IHRydWUsXHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2UgaWYgKGFjdGl2ZUlucHV0ID09PSAnZW5kJyAmJiBzZWxlY3RlZEVuZERhdGUpIHtcclxuICAgICAgY29uc3QgdXBkYXRlZERhdGUgPSB0aGlzLmFwcGx5VGltZVRvRGF0ZShzZWxlY3RlZEVuZERhdGUsIHRpbWVEYXRlKTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBzZWxlY3RlZFN0YXJ0RGF0ZSxcclxuICAgICAgICBzZWxlY3RlZEVuZERhdGU6IHVwZGF0ZWREYXRlLFxyXG4gICAgICAgIHNob3VsZEVtaXQ6IHRydWUsXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc2VsZWN0ZWRTdGFydERhdGUsXHJcbiAgICAgIHNlbGVjdGVkRW5kRGF0ZSxcclxuICAgICAgc2hvdWxkRW1pdDogZmFsc2UsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHRpbWUgZm9yIHNpbmdsZSBzZWxlY3Rpb25cclxuICAgKi9cclxuICB1cGRhdGVTaW5nbGVUaW1lKFxyXG4gICAgdGltZURhdGU6IERhdGUsXHJcbiAgICBzZWxlY3RlZERhdGU6IERhdGUgfCBudWxsXHJcbiAgKTogeyBzZWxlY3RlZERhdGU6IERhdGU7IHNob3VsZEVtaXQ6IGJvb2xlYW4gfSB7XHJcbiAgICBpZiAoIXNlbGVjdGVkRGF0ZSkge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHNlbGVjdGVkRGF0ZTogbmV3IERhdGUoKSxcclxuICAgICAgICBzaG91bGRFbWl0OiBmYWxzZSxcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB1cGRhdGVkRGF0ZSA9IHRoaXMuYXBwbHlUaW1lVG9EYXRlKHNlbGVjdGVkRGF0ZSwgdGltZURhdGUpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc2VsZWN0ZWREYXRlOiB1cGRhdGVkRGF0ZSxcclxuICAgICAgc2hvdWxkRW1pdDogZmFsc2UsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIG1vdXNlIGVudGVyIGZvciByYW5nZSBzZWxlY3Rpb24gcHJldmlld1xyXG4gICAqL1xyXG4gIGhhbmRsZU1vdXNlRW50ZXIoXHJcbiAgICBkYXRlOiBEYXRlLFxyXG4gICAgc2VsZWN0ZWRTdGFydERhdGU6IERhdGUgfCBudWxsLFxyXG4gICAgc2VsZWN0ZWRFbmREYXRlOiBEYXRlIHwgbnVsbFxyXG4gICk6IERhdGUgfCBudWxsIHtcclxuICAgIGlmIChzZWxlY3RlZFN0YXJ0RGF0ZSAmJiAhc2VsZWN0ZWRFbmREYXRlKSB7XHJcbiAgICAgIHJldHVybiBkYXRlOyAvLyBUaGlzIHdpbGwgYmUgdXNlZCBhcyB0ZW1wRW5kRGF0ZVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiBkYXRlIGlzIHRvZGF5XHJcbiAgICovXHJcbiAgaXNUb2RheShcclxuICAgIGRhdGU6IERhdGUsXHJcbiAgICBkYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8RGF0ZT4sXHJcbiAgICBzaG93VG9kYXk6IGJvb2xlYW5cclxuICApOiBib29sZWFuIHtcclxuICAgIHJldHVybiBzaG93VG9kYXkgJiYgZGF0ZUFkYXB0ZXIuaXNTYW1lRGF5KGRhdGUsIGRhdGVBZGFwdGVyLnRvZGF5KCkpO1xyXG4gIH1cclxufVxyXG4iXX0=