@qeydar/datepicker
Version:
A comprehensive Date and Time Picker for Angular with Jalali calendar support
238 lines • 25.9 kB
JavaScript
import { Injectable } from '@angular/core';
import * as i0 from "@angular/core";
export class CalendarUtilsService {
/**
* Generate days grid for calendar view
*/
generateDaysGrid(currentDate, dateAdapter) {
const firstDayOfMonth = dateAdapter.startOfMonth(currentDate);
const startDate = dateAdapter.startOfWeek(firstDayOfMonth);
return Array.from({ length: 42 }, (_, i) => dateAdapter.addDays(startDate, i));
}
/**
* Generate month list (1-12)
*/
generateMonthList() {
return Array.from({ length: 12 }, (_, i) => i + 1);
}
/**
* Generate year list around a specific year
*/
generateYearList(centerYear, length = 15) {
const start = centerYear - Math.floor(length / 2);
return Array.from({ length }, (_, i) => start + i);
}
/**
* Generate year ranges for year selector
*/
generateYearRanges(length = 15, dateAdapter) {
const yearCount = 15;
const currentYear = dateAdapter.getYear(new Date);
const startYear = currentYear - Math.floor(yearCount / 2) - (yearCount * Math.floor(length / 2));
const yearRanges = [];
for (let i = 0; i < length; i++) {
const start = startYear + i * yearCount;
yearRanges.push({ start, end: start + 14 });
}
return yearRanges;
}
/**
* Get week day names
*/
getWeekDays(dateAdapter) {
return dateAdapter.getDayOfWeekNames('short');
}
/**
* Get month names
*/
getMonthNames(dateAdapter, format = 'long') {
return dateAdapter.getMonthNames(format);
}
/**
* Get month name by number
*/
getMonthName(month, dateAdapter) {
return dateAdapter.getMonthNames('long')[month - 1];
}
/**
* Get current month name
*/
getCurrentMonthName(currentDate, dateAdapter) {
return dateAdapter.getMonthNames('long')[dateAdapter.getMonth(currentDate)];
}
/**
* Get current year
*/
getCurrentYear(currentDate, dateAdapter) {
return dateAdapter.getYear(currentDate);
}
/**
* Navigate to previous month
*/
navigateToPrevMonth(currentDate, dateAdapter) {
return dateAdapter.addMonths(currentDate, -1);
}
/**
* Navigate to next month
*/
navigateToNextMonth(currentDate, dateAdapter) {
return dateAdapter.addMonths(currentDate, 1);
}
/**
* Navigate to previous year
*/
navigateToPrevYear(currentDate, dateAdapter) {
return dateAdapter.addYears(currentDate, -1);
}
/**
* Navigate to next year
*/
navigateToNextYear(currentDate, dateAdapter) {
return dateAdapter.addYears(currentDate, 1);
}
/**
* Navigate to previous year range
*/
navigateToPrevYearRange(yearList) {
const yearStart = yearList[0] - 15;
return Array.from({ length: 15 }, (_, i) => yearStart + i);
}
/**
* Navigate to next year range
*/
navigateToNextYearRange(yearList) {
const yearStart = yearList[14] + 1;
return Array.from({ length: 15 }, (_, i) => yearStart + i);
}
/**
* Create date for month selection
*/
createDateForMonth(year, month, dateAdapter) {
return dateAdapter.createDate(year, month - 1, 1);
}
/**
* Create date for year selection
*/
createDateForYear(year, currentDate, dateAdapter) {
return dateAdapter.createDate(year, dateAdapter.getMonth(currentDate), 1);
}
/**
* Set year for existing date
*/
setYearForDate(date, year, dateAdapter) {
return dateAdapter.setYear(date, year);
}
/**
* Determine view mode based on datepicker mode
*/
determineViewMode(mode) {
switch (mode) {
case 'day':
return 'days';
case 'month':
return 'months';
case 'year':
return 'years';
default:
return 'days';
}
}
/**
* Generate default periods for range picker
*/
generateDefaultPeriods(today, lang) {
return [
{
label: lang.lastDay,
value: [this.addDays(today, -1), today]
},
{
label: lang.lastWeek,
value: [this.addDays(today, -7), today],
arrow: true
},
{
label: lang.lastMonth,
value: [this.addMonths(today, -1), today]
},
{
label: lang.custom,
value: 'custom'
}
];
}
/**
* Helper method to add days (used in generateDefaultPeriods)
*/
addDays(date, days) {
const result = new Date(date);
result.setDate(result.getDate() + days);
return result;
}
/**
* Helper method to add months (used in generateDefaultPeriods)
*/
addMonths(date, months) {
const result = new Date(date);
result.setMonth(result.getMonth() + months);
return result;
}
/**
* Check if two dates are in the same month
*/
isSameMonth(date1, date2, dateAdapter) {
return dateAdapter.isSameMonth(date1, date2);
}
/**
* Check if date is today
*/
isToday(date, dateAdapter) {
return dateAdapter.isSameDay(date, dateAdapter.today());
}
/**
* Check if month is active
*/
isActiveMonth(month, currentDate, dateAdapter) {
return dateAdapter.getMonth(currentDate) === month - 1;
}
/**
* Check if year is active
*/
isActiveYear(year, currentDate, dateAdapter) {
return year === dateAdapter.getYear(currentDate);
}
/**
* Check if year range is active
*/
isActiveYearRange(startYear, yearList) {
return yearList?.includes(startYear);
}
/**
* Get scroll item ID for different view modes
*/
getScrollItemId(viewMode, date, dateAdapter, yearRanges) {
if (!date)
return null;
switch (viewMode) {
case 'days':
return dateAdapter.getMonth(date) + 1;
case 'months':
return dateAdapter.getYear(date);
case 'years':
const currentYear = dateAdapter.getYear(date);
const currentRange = yearRanges?.find(range => range.start <= currentYear && range.end >= currentYear);
return currentRange?.start || null;
default:
return null;
}
}
}
CalendarUtilsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CalendarUtilsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
CalendarUtilsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CalendarUtilsService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CalendarUtilsService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItdXRpbHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3FleWRhci1kYXRlcGlja2VyL3NyYy9kYXRlLXBpY2tlci1wb3B1cC9zZXJ2aWNlcy9jYWxlbmRhci11dGlscy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBUTNDLE1BQU0sT0FBTyxvQkFBb0I7SUFFL0I7O09BRUc7SUFDSCxnQkFBZ0IsQ0FBQyxXQUFpQixFQUFFLFdBQThCO1FBQ2hFLE1BQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDOUQsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMzRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFRDs7T0FFRztJQUNILGlCQUFpQjtRQUNmLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxnQkFBZ0IsQ0FBQyxVQUFrQixFQUFFLFNBQWlCLEVBQUU7UUFDdEQsTUFBTSxLQUFLLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2xELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0s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QUssT0FBTztnQkFDVixNQUFNLFdBQVcsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM5QyxNQUFNLFlBQVksR0FBRyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQzVDLEtBQUssQ0FBQyxLQUFLLElBQUksV0FBVyxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUksV0FBVyxDQUN2RCxDQUFDO2dCQUNGLE9BQU8sWUFBWSxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUM7WUFDckM7Z0JBQ0UsT0FBTyxJQUFJLENBQUM7U0FDZjtJQUNILENBQUM7O2lIQXJRVSxvQkFBb0I7cUhBQXBCLG9CQUFvQixjQUZuQixNQUFNOzJGQUVQLG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERhdGVBZGFwdGVyIH0gZnJvbSAnLi4vLi4vZGF0ZS1hZGFwdGVyJztcclxuaW1wb3J0IHsgQ3VzdG9tTGFiZWxzLCBZZWFyUmFuZ2UgfSBmcm9tICcuLi8uLi91dGlscy9tb2RlbHMnO1xyXG5pbXBvcnQgeyBEYXRlcGlja2VyTW9kZSB9IGZyb20gJy4uLy4uL3V0aWxzL3R5cGVzJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIENhbGVuZGFyVXRpbHNTZXJ2aWNlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgZGF5cyBncmlkIGZvciBjYWxlbmRhciB2aWV3XHJcbiAgICovXHJcbiAgZ2VuZXJhdGVEYXlzR3JpZChjdXJyZW50RGF0ZTogRGF0ZSwgZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPERhdGU+KTogRGF0ZVtdIHtcclxuICAgIGNvbnN0IGZpcnN0RGF5T2ZNb250aCA9IGRhdGVBZGFwdGVyLnN0YXJ0T2ZNb250aChjdXJyZW50RGF0ZSk7XHJcbiAgICBjb25zdCBzdGFydERhdGUgPSBkYXRlQWRhcHRlci5zdGFydE9mV2VlayhmaXJzdERheU9mTW9udGgpO1xyXG4gICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IDQyIH0sIChfLCBpKSA9PiBkYXRlQWRhcHRlci5hZGREYXlzKHN0YXJ0RGF0ZSwgaSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgbW9udGggbGlzdCAoMS0xMilcclxuICAgKi9cclxuICBnZW5lcmF0ZU1vbnRoTGlzdCgpOiBudW1iZXJbXSB7XHJcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogMTIgfSwgKF8sIGkpID0+IGkgKyAxKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIHllYXIgbGlzdCBhcm91bmQgYSBzcGVjaWZpYyB5ZWFyXHJcbiAgICovXHJcbiAgZ2VuZXJhdGVZZWFyTGlzdChjZW50ZXJZZWFyOiBudW1iZXIsIGxlbmd0aDogbnVtYmVyID0gMTUpOiBudW1iZXJbXSB7XHJcbiAgICBjb25zdCBzdGFydCA9IGNlbnRlclllYXIgLSBNYXRoLmZsb29yKGxlbmd0aCAvIDIpO1xyXG4gICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGggfSwgKF8sIGkpID0+IHN0YXJ0ICsgaSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmF0ZSB5ZWFyIHJhbmdlcyBmb3IgeWVhciBzZWxlY3RvclxyXG4gICAqL1xyXG4gIGdlbmVyYXRlWWVhclJhbmdlcyhsZW5ndGg6IG51bWJlciA9IDE1LGRhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxEYXRlPik6IFllYXJSYW5nZVtdIHtcclxuICAgIGNvbnN0IHllYXJDb3VudCA9IDE1O1xyXG4gICAgY29uc3QgY3VycmVudFllYXIgPSBkYXRlQWRhcHRlci5nZXRZZWFyKG5ldyBEYXRlKTtcclxuICAgIGNvbnN0IHN0YXJ0WWVhciA9IGN1cnJlbnRZZWFyIC0gTWF0aC5mbG9vcih5ZWFyQ291bnQvMikgLSAoeWVhckNvdW50ICogTWF0aC5mbG9vcihsZW5ndGgvMikpO1xyXG4gICAgY29uc3QgeWVhclJhbmdlczogWWVhclJhbmdlW10gPSBbXTtcclxuICAgIFxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBzdGFydCA9IHN0YXJ0WWVhciArIGkgKiB5ZWFyQ291bnQ7XHJcbiAgICAgIHllYXJSYW5nZXMucHVzaCh7IHN0YXJ0LCBlbmQ6IHN0YXJ0ICsgMTQgfSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiB5ZWFyUmFuZ2VzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHdlZWsgZGF5IG5hbWVzXHJcbiAgICovXHJcbiAgZ2V0V2Vla0RheXMoZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPERhdGU+KTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIGRhdGVBZGFwdGVyLmdldERheU9mV2Vla05hbWVzKCdzaG9ydCcpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IG1vbnRoIG5hbWVzXHJcbiAgICovXHJcbiAgZ2V0TW9udGhOYW1lcyhkYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8RGF0ZT4sIGZvcm1hdDogJ2xvbmcnIHwgJ3Nob3J0JyA9ICdsb25nJyk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBkYXRlQWRhcHRlci5nZXRNb250aE5hbWVzKGZvcm1hdCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgbW9udGggbmFtZSBieSBudW1iZXJcclxuICAgKi9cclxuICBnZXRNb250aE5hbWUobW9udGg6IG51bWJlciwgZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPERhdGU+KTogc3RyaW5nIHtcclxuICAgIHJldHVybiBkYXRlQWRhcHRlci5nZXRNb250aE5hbWVzKCdsb25nJylbbW9udGggLSAxXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBjdXJyZW50IG1vbnRoIG5hbWVcclxuICAgKi9cclxuICBnZXRDdXJyZW50TW9udGhOYW1lKGN1cnJlbnREYXRlOiBEYXRlLCBkYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8RGF0ZT4pOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGRhdGVBZGFwdGVyLmdldE1vbnRoTmFtZXMoJ2xvbmcnKVtkYXRlQWRhcHRlci5nZXRNb250aChjdXJyZW50RGF0ZSldO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGN1cnJlbnQgeWVhclxyXG4gICAqL1xyXG4gIGdldEN1cnJlbnRZZWFyKGN1cnJlbnREYXRlOiBEYXRlLCBkYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8RGF0ZT4pOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIGRhdGVBZGFwdGVyLmdldFllYXIoY3VycmVudERhdGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTmF2aWdhdGUgdG8gcHJldmlvdXMgbW9udGhcclxuICAgKi9cclxuICBuYXZpZ2F0ZVRvUHJldk1vbnRoKGN1cnJlbnREYXRlOiBEYXRlLCBkYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8RGF0ZT4pOiBEYXRlIHtcclxuICAgIHJldHVybiBkYXRlQWRhcHRlci5hZGRNb250aHMoY3VycmVudERhdGUsIC0xKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE5hdmlnYXRlIHRvIG5leHQgbW9udGhcclxuICAgKi9cclxuICBuYXZpZ2F0ZVRvTmV4dE1vbnRoKGN1cnJlbnREYXRlOiBEYXRlLCBkYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8RGF0ZT4pOiBEYXRlIHtcclxuICAgIHJldHVybiBkYXRlQWRhcHRlci5hZGRNb250aHMoY3VycmVudERhdGUsIDEpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTmF2aWdhdGUgdG8gcHJldmlvdXMgeWVhclxyXG4gICAqL1xyXG4gIG5hdmlnYXRlVG9QcmV2WWVhcihjdXJyZW50RGF0ZTogRGF0ZSwgZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPERhdGU+KTogRGF0ZSB7XHJcbiAgICByZXR1cm4gZGF0ZUFkYXB0ZXIuYWRkWWVhcnMoY3VycmVudERhdGUsIC0xKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE5hdmlnYXRlIHRvIG5leHQgeWVhclxyXG4gICAqL1xyXG4gIG5hdmlnYXRlVG9OZXh0WWVhcihjdXJyZW50RGF0ZTogRGF0ZSwgZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPERhdGU+KTogRGF0ZSB7XHJcbiAgICByZXR1cm4gZGF0ZUFkYXB0ZXIuYWRkWWVhcnMoY3VycmVudERhdGUsIDEpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTmF2aWdhdGUgdG8gcHJldmlvdXMgeWVhciByYW5nZVxyXG4gICAqL1xyXG4gIG5hdmlnYXRlVG9QcmV2WWVhclJhbmdlKHllYXJMaXN0OiBudW1iZXJbXSk6IG51bWJlcltdIHtcclxuICAgIGNvbnN0IHllYXJTdGFydCA9IHllYXJMaXN0WzBdIC0gMTU7XHJcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogMTUgfSwgKF8sIGkpID0+IHllYXJTdGFydCArIGkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTmF2aWdhdGUgdG8gbmV4dCB5ZWFyIHJhbmdlXHJcbiAgICovXHJcbiAgbmF2aWdhdGVUb05leHRZZWFyUmFuZ2UoeWVhckxpc3Q6IG51bWJlcltdKTogbnVtYmVyW10ge1xyXG4gICAgY29uc3QgeWVhclN0YXJ0ID0geWVhckxpc3RbMTRdICsgMTtcclxuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiAxNSB9LCAoXywgaSkgPT4geWVhclN0YXJ0ICsgaSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgZGF0ZSBmb3IgbW9udGggc2VsZWN0aW9uXHJcbiAgICovXHJcbiAgY3JlYXRlRGF0ZUZvck1vbnRoKHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlciwgZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPERhdGU+KTogRGF0ZSB7XHJcbiAgICByZXR1cm4gZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZSh5ZWFyLCBtb250aCAtIDEsIDEpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGRhdGUgZm9yIHllYXIgc2VsZWN0aW9uXHJcbiAgICovXHJcbiAgY3JlYXRlRGF0ZUZvclllYXIoeWVhcjogbnVtYmVyLCBjdXJyZW50RGF0ZTogRGF0ZSwgZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPERhdGU+KTogRGF0ZSB7XHJcbiAgICByZXR1cm4gZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShcclxuICAgICAgeWVhciwgXHJcbiAgICAgIGRhdGVBZGFwdGVyLmdldE1vbnRoKGN1cnJlbnREYXRlKSwgXHJcbiAgICAgIDFcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgeWVhciBmb3IgZXhpc3RpbmcgZGF0ZVxyXG4gICAqL1xyXG4gIHNldFllYXJGb3JEYXRlKGRhdGU6IERhdGUsIHllYXI6IG51bWJlciwgZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPERhdGU+KTogRGF0ZSB7XHJcbiAgICByZXR1cm4gZGF0ZUFkYXB0ZXIuc2V0WWVhcihkYXRlLCB5ZWFyKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZSB2aWV3IG1vZGUgYmFzZWQgb24gZGF0ZXBpY2tlciBtb2RlXHJcbiAgICovXHJcbiAgZGV0ZXJtaW5lVmlld01vZGUobW9kZTogRGF0ZXBpY2tlck1vZGUpOiAnZGF5cycgfCAnbW9udGhzJyB8ICd5ZWFycycge1xyXG4gICAgc3dpdGNoIChtb2RlKSB7XHJcbiAgICAgIGNhc2UgJ2RheSc6XHJcbiAgICAgICAgcmV0dXJuICdkYXlzJztcclxuICAgICAgY2FzZSAnbW9udGgnOlxyXG4gICAgICAgIHJldHVybiAnbW9udGhzJztcclxuICAgICAgY2FzZSAneWVhcic6XHJcbiAgICAgICAgcmV0dXJuICd5ZWFycyc7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuICdkYXlzJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIGRlZmF1bHQgcGVyaW9kcyBmb3IgcmFuZ2UgcGlja2VyXHJcbiAgICovXHJcbiAgZ2VuZXJhdGVEZWZhdWx0UGVyaW9kcyh0b2RheTogRGF0ZSwgbGFuZzogYW55KTogQ3VzdG9tTGFiZWxzW10ge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgeyBcclxuICAgICAgICBsYWJlbDogbGFuZy5sYXN0RGF5LCBcclxuICAgICAgICB2YWx1ZTogW3RoaXMuYWRkRGF5cyh0b2RheSwgLTEpLCB0b2RheV0gXHJcbiAgICAgIH0sXHJcbiAgICAgIHsgXHJcbiAgICAgICAgbGFiZWw6IGxhbmcubGFzdFdlZWssIFxyXG4gICAgICAgIHZhbHVlOiBbdGhpcy5hZGREYXlzKHRvZGF5LCAtNyksIHRvZGF5XSwgXHJcbiAgICAgICAgYXJyb3c6IHRydWUgXHJcbiAgICAgIH0sXHJcbiAgICAgIHsgXHJcbiAgICAgICAgbGFiZWw6IGxhbmcubGFzdE1vbnRoLCBcclxuICAgICAgICB2YWx1ZTogW3RoaXMuYWRkTW9udGhzKHRvZGF5LCAtMSksIHRvZGF5XSBcclxuICAgICAgfSxcclxuICAgICAgeyBcclxuICAgICAgICBsYWJlbDogbGFuZy5jdXN0b20sIFxyXG4gICAgICAgIHZhbHVlOiAnY3VzdG9tJyBcclxuICAgICAgfVxyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhlbHBlciBtZXRob2QgdG8gYWRkIGRheXMgKHVzZWQgaW4gZ2VuZXJhdGVEZWZhdWx0UGVyaW9kcylcclxuICAgKi9cclxuICBwcml2YXRlIGFkZERheXMoZGF0ZTogRGF0ZSwgZGF5czogbnVtYmVyKTogRGF0ZSB7XHJcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgRGF0ZShkYXRlKTtcclxuICAgIHJlc3VsdC5zZXREYXRlKHJlc3VsdC5nZXREYXRlKCkgKyBkYXlzKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIZWxwZXIgbWV0aG9kIHRvIGFkZCBtb250aHMgKHVzZWQgaW4gZ2VuZXJhdGVEZWZhdWx0UGVyaW9kcylcclxuICAgKi9cclxuICBwcml2YXRlIGFkZE1vbnRocyhkYXRlOiBEYXRlLCBtb250aHM6IG51bWJlcik6IERhdGUge1xyXG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IERhdGUoZGF0ZSk7XHJcbiAgICByZXN1bHQuc2V0TW9udGgocmVzdWx0LmdldE1vbnRoKCkgKyBtb250aHMpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIHR3byBkYXRlcyBhcmUgaW4gdGhlIHNhbWUgbW9udGhcclxuICAgKi9cclxuICBpc1NhbWVNb250aChkYXRlMTogRGF0ZSwgZGF0ZTI6IERhdGUsIGRhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxEYXRlPik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGRhdGVBZGFwdGVyLmlzU2FtZU1vbnRoKGRhdGUxLCBkYXRlMik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiBkYXRlIGlzIHRvZGF5XHJcbiAgICovXHJcbiAgaXNUb2RheShkYXRlOiBEYXRlLCBkYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8RGF0ZT4pOiBib29sZWFuIHtcclxuICAgIHJldHVybiBkYXRlQWRhcHRlci5pc1NhbWVEYXkoZGF0ZSwgZGF0ZUFkYXB0ZXIudG9kYXkoKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiBtb250aCBpcyBhY3RpdmVcclxuICAgKi9cclxuICBpc0FjdGl2ZU1vbnRoKG1vbnRoOiBudW1iZXIsIGN1cnJlbnREYXRlOiBEYXRlLCBkYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8RGF0ZT4pOiBib29sZWFuIHtcclxuICAgIHJldHVybiBkYXRlQWRhcHRlci5nZXRNb250aChjdXJyZW50RGF0ZSkgPT09IG1vbnRoIC0gMTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIHllYXIgaXMgYWN0aXZlXHJcbiAgICovXHJcbiAgaXNBY3RpdmVZZWFyKHllYXI6IG51bWJlciwgY3VycmVudERhdGU6IERhdGUsIGRhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxEYXRlPik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHllYXIgPT09IGRhdGVBZGFwdGVyLmdldFllYXIoY3VycmVudERhdGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgeWVhciByYW5nZSBpcyBhY3RpdmVcclxuICAgKi9cclxuICBpc0FjdGl2ZVllYXJSYW5nZShzdGFydFllYXI6IG51bWJlciwgeWVhckxpc3Q6IG51bWJlcltdKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4geWVhckxpc3Q/LmluY2x1ZGVzKHN0YXJ0WWVhcik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgc2Nyb2xsIGl0ZW0gSUQgZm9yIGRpZmZlcmVudCB2aWV3IG1vZGVzXHJcbiAgICovXHJcbiAgZ2V0U2Nyb2xsSXRlbUlkKHZpZXdNb2RlOiAnZGF5cycgfCAnbW9udGhzJyB8ICd5ZWFycycsIGRhdGU6IERhdGUsIGRhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxEYXRlPiwgeWVhclJhbmdlcz86IFllYXJSYW5nZVtdKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICBpZiAoIWRhdGUpIHJldHVybiBudWxsO1xyXG5cclxuICAgIHN3aXRjaCAodmlld01vZGUpIHtcclxuICAgICAgY2FzZSAnZGF5cyc6XHJcbiAgICAgICAgcmV0dXJuIGRhdGVBZGFwdGVyLmdldE1vbnRoKGRhdGUpICsgMTtcclxuICAgICAgY2FzZSAnbW9udGhzJzpcclxuICAgICAgICByZXR1cm4gZGF0ZUFkYXB0ZXIuZ2V0WWVhcihkYXRlKTtcclxuICAgICAgY2FzZSAneWVhcnMnOlxyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRZZWFyID0gZGF0ZUFkYXB0ZXIuZ2V0WWVhcihkYXRlKTtcclxuICAgICAgICBjb25zdCBjdXJyZW50UmFuZ2UgPSB5ZWFyUmFuZ2VzPy5maW5kKHJhbmdlID0+IFxyXG4gICAgICAgICAgcmFuZ2Uuc3RhcnQgPD0gY3VycmVudFllYXIgJiYgcmFuZ2UuZW5kID49IGN1cnJlbnRZZWFyXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gY3VycmVudFJhbmdlPy5zdGFydCB8fCBudWxsO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=