ngx-jalali-date-picker
Version:
This is a configurable date-picker build for Angular applications. Supports latest (Angular 18) version. This date-picker is based on ng2-date-piker and ngx-jalali-date-picker date pickers.
175 lines • 25.3 kB
JavaScript
import { Injectable } from '@angular/core';
import moment from 'jalali-moment';
import * as i0 from "@angular/core";
import * as i1 from "../common/services/utils/utils.service";
export class DayCalendarService {
constructor(utilsService) {
this.utilsService = utilsService;
this.DEFAULT_CONFIG = {
showNearMonthDays: true,
showWeekNumbers: false,
firstDayOfWeek: 'su',
weekDayFormat: 'ddd',
format: 'DD-MM-YYYY',
allowMultiSelect: false,
monthFormat: 'MMM, YYYY',
enableMonthSelector: true,
locale: moment.locale(),
dayBtnFormat: 'DD',
unSelectOnClick: true
};
this.DAYS = ['su', 'mo', 'tu', 'we', 'th', 'fr', 'sa'];
}
getConfig(config) {
const _config = {
...this.DEFAULT_CONFIG,
...this.utilsService.clearUndefined(config)
};
this.utilsService.convertPropsToMoment(_config, _config.format, ['min', 'max']);
moment.locale(_config.locale);
return _config;
}
generateDaysMap(firstDayOfWeek) {
const firstDayIndex = this.DAYS.indexOf(firstDayOfWeek);
const daysArr = this.DAYS.slice(firstDayIndex, 7).concat(this.DAYS.slice(0, firstDayIndex));
return daysArr.reduce((map, day, index) => {
map[day] = index;
return map;
}, {});
}
generateMonthArray(config, month, selected) {
const parsedMonth = month.isValid() ? month.clone() : moment();
let monthArray = [];
const firstDayOfWeekIndex = this.DAYS.indexOf(config.firstDayOfWeek);
const firstDayOfBoard = parsedMonth.clone().startOf('month');
while (firstDayOfBoard.day() !== firstDayOfWeekIndex) {
firstDayOfBoard.subtract(1, 'day');
}
const current = firstDayOfBoard.clone();
const prevMonth = parsedMonth.clone().subtract(1, 'month');
const nextMonth = parsedMonth.clone().add(1, 'month');
const today = moment();
const daysOfCalendar = this.utilsService.createArray(42)
.reduce((array) => {
array.push({
date: current.clone(),
selected: !!selected.find(selectedDay => current.isSame(selectedDay, 'day')),
currentMonth: current.isSame(parsedMonth, 'month'),
prevMonth: current.isSame(prevMonth, 'month'),
nextMonth: current.isSame(nextMonth, 'month'),
currentDay: current.isSame(today, 'day'),
disabled: this.isDateDisabled(current, config)
});
current.add(1, 'day');
return array;
}, []);
daysOfCalendar.forEach((day, index) => {
const weekIndex = Math.floor(index / 7);
if (!monthArray[weekIndex]) {
monthArray.push([]);
}
monthArray[weekIndex].push(day);
});
if (!config.showNearMonthDays) {
monthArray = this.removeNearMonthWeeks(parsedMonth, monthArray);
}
return monthArray;
}
generateWeekdays(firstDayOfWeek, locale) {
const weekdayNames = ['su', 'mo', 'tu', 'we', 'th', 'fr', 'sa'].reduce((acc, d, i) => {
const m = moment();
if (locale) {
m.locale(locale);
}
m.day(i);
acc[d] = m;
return acc;
}, {});
const weekdays = [];
const daysMap = this.generateDaysMap(firstDayOfWeek);
for (const dayKey in daysMap) {
if (daysMap.hasOwnProperty(dayKey)) {
weekdays[daysMap[dayKey]] = weekdayNames[dayKey];
}
}
return weekdays;
}
isDateDisabled(date, config) {
if (config.isDayDisabledCallback) {
return config.isDayDisabledCallback(date);
}
if (config.min && date.isBefore(config.min, 'day')) {
return true;
}
return !!(config.max && date.isAfter(config.max, 'day'));
}
// todo:: add unit tests
getHeaderLabel(config, month) {
if (config.monthFormatter) {
return config.monthFormatter(month);
}
return month.format(config.monthFormat);
}
// todo:: add unit tests
shouldShowLeft(min, currentMonthView) {
return min ? min.isBefore(currentMonthView, 'month') : true;
}
// todo:: add unit tests
shouldShowRight(max, currentMonthView) {
return max ? max.isAfter(currentMonthView, 'month') : true;
}
generateDaysIndexMap(firstDayOfWeek) {
const firstDayIndex = this.DAYS.indexOf(firstDayOfWeek);
const daysArr = this.DAYS.slice(firstDayIndex, 7).concat(this.DAYS.slice(0, firstDayIndex));
return daysArr.reduce((map, day, index) => {
map[index] = day;
return map;
}, {});
}
getMonthCalendarConfig(componentConfig) {
return this.utilsService.clearUndefined({
min: componentConfig.min,
max: componentConfig.max,
format: componentConfig.format,
isNavHeaderBtnClickable: true,
allowMultiSelect: false,
locale: componentConfig.locale,
yearFormat: componentConfig.yearFormat,
yearFormatter: componentConfig.yearFormatter,
monthBtnFormat: componentConfig.monthBtnFormat,
monthBtnFormatter: componentConfig.monthBtnFormatter,
monthBtnCssClassCallback: componentConfig.monthBtnCssClassCallback,
isMonthDisabledCallback: componentConfig.isMonthDisabledCallback,
multipleYearsNavigateBy: componentConfig.multipleYearsNavigateBy,
showMultipleYearsNavigation: componentConfig.showMultipleYearsNavigation,
showGoToCurrent: componentConfig.showGoToCurrent,
numOfMonthRows: componentConfig.numOfMonthRows
});
}
getDayBtnText(config, day) {
if (config.dayBtnFormatter) {
return config.dayBtnFormatter(day);
}
return day.format(config.dayBtnFormat);
}
getDayBtnCssClass(config, day) {
if (config.dayBtnCssClassCallback) {
return config.dayBtnCssClassCallback(day);
}
return '';
}
removeNearMonthWeeks(currentMonth, monthArray) {
if (monthArray[monthArray.length - 1].find((day) => day.date.isSame(currentMonth, 'month'))) {
return monthArray;
}
else {
return monthArray.slice(0, -1);
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DayCalendarService, deps: [{ token: i1.UtilsService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DayCalendarService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DayCalendarService, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: i1.UtilsService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF5LWNhbGVuZGFyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtamFsYWxpLWRhdGUtcGlja2VyL3NyYy9saWIvZGF5LWNhbGVuZGFyL2RheS1jYWxlbmRhci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxNQUFnQixNQUFLLGVBQWUsQ0FBQzs7O0FBUTVDLE1BQU0sT0FBTyxrQkFBa0I7SUFnQjdCLFlBQW9CLFlBQTBCO1FBQTFCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBZnJDLG1CQUFjLEdBQXVCO1lBQzVDLGlCQUFpQixFQUFFLElBQUk7WUFDdkIsZUFBZSxFQUFFLEtBQUs7WUFDdEIsY0FBYyxFQUFFLElBQUk7WUFDcEIsYUFBYSxFQUFFLEtBQUs7WUFDcEIsTUFBTSxFQUFFLFlBQVk7WUFDcEIsZ0JBQWdCLEVBQUUsS0FBSztZQUN2QixXQUFXLEVBQUUsV0FBVztZQUN4QixtQkFBbUIsRUFBRSxJQUFJO1lBQ3pCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFO1lBQ3ZCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLGVBQWUsRUFBRSxJQUFJO1NBQ3RCLENBQUM7UUFDZSxTQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUduRSxDQUFDO0lBRUQsU0FBUyxDQUFDLE1BQTBCO1FBQ2xDLE1BQU0sT0FBTyxHQUErQjtZQUMxQyxHQUFHLElBQUksQ0FBQyxjQUFjO1lBQ3RCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDO1NBQzVDLENBQUM7UUFFRixJQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxP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LENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDNUYsT0FBTyxVQUFVLENBQUM7UUFDcEIsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsQ0FBQztJQUNILENBQUM7K0dBcE1VLGtCQUFrQjttSEFBbEIsa0JBQWtCOzs0RkFBbEIsa0JBQWtCO2tCQUQ5QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCBtb21lbnQsIHtNb21lbnR9IGZyb20namFsYWxpLW1vbWVudCc7XG5pbXBvcnQge1dlZWtEYXlzfSBmcm9tICcuLi9jb21tb24vdHlwZXMvd2Vlay1kYXlzLnR5cGUnO1xuaW1wb3J0IHtVdGlsc1NlcnZpY2V9IGZyb20gJy4uL2NvbW1vbi9zZXJ2aWNlcy91dGlscy91dGlscy5zZXJ2aWNlJztcbmltcG9ydCB7SURheX0gZnJvbSAnLi9kYXkubW9kZWwnO1xuaW1wb3J0IHtJRGF5Q2FsZW5kYXJDb25maWcsIElEYXlDYWxlbmRhckNvbmZpZ0ludGVybmFsfSBmcm9tICcuL2RheS1jYWxlbmRhci1jb25maWcubW9kZWwnO1xuaW1wb3J0IHtJTW9udGhDYWxlbmRhckNvbmZpZ30gZnJvbSAnLi4vbW9udGgtY2FsZW5kYXIvbW9udGgtY2FsZW5kYXItY29uZmlnJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERheUNhbGVuZGFyU2VydmljZSB7XG4gIHJlYWRvbmx5IERFRkFVTFRfQ09ORklHOiBJRGF5Q2FsZW5kYXJDb25maWcgPSB7XG4gICAgc2hvd05lYXJNb250aERheXM6IHRydWUsXG4gICAgc2hvd1dlZWtOdW1iZXJzOiBmYWxzZSxcbiAgICBmaXJzdERheU9mV2VlazogJ3N1JyxcbiAgICB3ZWVrRGF5Rm9ybWF0OiAnZGRkJyxcbiAgICBmb3JtYXQ6ICdERC1NTS1ZWVlZJyxcbiAgICBhbGxvd011bHRpU2VsZWN0OiBmYWxzZSxcbiAgICBtb250aEZvcm1hdDogJ01NTSwgWVlZWScsXG4gICAgZW5hYmxlTW9udGhTZWxlY3RvcjogdHJ1ZSxcbiAgICBsb2NhbGU6IG1vbWVudC5sb2NhbGUoKSxcbiAgICBkYXlCdG5Gb3JtYXQ6ICdERCcsXG4gICAgdW5TZWxlY3RPbkNsaWNrOiB0cnVlXG4gIH07XG4gIHByaXZhdGUgcmVhZG9ubHkgREFZUyA9IFsnc3UnLCAnbW8nLCAndHUnLCAnd2UnLCAndGgnLCAnZnInLCAnc2EnXTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHV0aWxzU2VydmljZTogVXRpbHNTZXJ2aWNlKSB7XG4gIH1cblxuICBnZXRDb25maWcoY29uZmlnOiBJRGF5Q2FsZW5kYXJDb25maWcpOiBJRGF5Q2FsZW5kYXJDb25maWdJbnRlcm5hbCB7XG4gICAgY29uc3QgX2NvbmZpZyA9IDxJRGF5Q2FsZW5kYXJDb25maWdJbnRlcm5hbD57XG4gICAgICAuLi50aGlzLkRFRkFVTFRfQ09ORklHLFxuICAgICAgLi4udGhpcy51dGlsc1NlcnZpY2UuY2xlYXJVbmRlZmluZWQoY29uZmlnKVxuICAgIH07XG5cbiAgICB0aGlzLnV0aWxzU2VydmljZS5jb252ZXJ0UHJvcHNUb01vbWVudChfY29uZmlnLCBfY29uZmlnLmZvcm1hdCwgWydtaW4nLCAnbWF4J10pO1xuXG4gICAgbW9tZW50LmxvY2FsZShfY29uZmlnLmxvY2FsZSk7XG5cbiAgICByZXR1cm4gX2NvbmZpZztcbiAgfVxuXG4gIGdlbmVyYXRlRGF5c01hcChmaXJzdERheU9mV2VlazogV2Vla0RheXMpIHtcbiAgICBjb25zdCBmaXJzdERheUluZGV4ID0gdGhpcy5EQVlTLmluZGV4T2YoZmlyc3REYXlPZldlZWspO1xuICAgIGNvbnN0IGRheXNBcnIgPSB0aGlzLkRBWVMuc2xpY2UoZmlyc3REYXlJbmRleCwgNykuY29uY2F0KHRoaXMuREFZUy5zbGljZSgwLCBmaXJzdERheUluZGV4KSk7XG4gICAgcmV0dXJuIGRheXNBcnIucmVkdWNlKChtYXAsIGRheSwgaW5kZXgpID0+IHtcbiAgICAgIG1hcFtkYXldID0gaW5kZXg7XG5cbiAgICAgIHJldHVybiBtYXA7XG4gICAgfSwgPHtba2V5OiBzdHJpbmddOiBudW1iZXJ9Pnt9KTtcbiAgfVxuXG4gIGdlbmVyYXRlTW9udGhBcnJheShjb25maWc6IElEYXlDYWxlbmRhckNvbmZpZ0ludGVybmFsLCBtb250aDogTW9tZW50LCBzZWxlY3RlZDogTW9tZW50W10pOiBJRGF5W11bXSB7XG4gICAgY29uc3QgcGFyc2VkTW9udGggPSBtb250aC5pc1ZhbGlkKCkgPyBtb250aC5jbG9uZSgpIDogbW9tZW50KCk7XG4gICAgbGV0IG1vbnRoQXJyYXk6IElEYXlbXVtdID0gW107XG4gICAgY29uc3QgZmlyc3REYXlPZldlZWtJbmRleCA9IHRoaXMuREFZUy5pbmRleE9mKGNvbmZpZy5maXJzdERheU9mV2Vlayk7XG4gICAgY29uc3QgZmlyc3REYXlPZkJvYXJkID0gcGFyc2VkTW9udGguY2xvbmUoKS5zdGFydE9mKCdtb250aCcpO1xuXG4gICAgd2hpbGUgKGZpcnN0RGF5T2ZCb2FyZC5kYXkoKSAhPT0gZmlyc3REYXlPZldlZWtJbmRleCkge1xuICAgICAgZmlyc3REYXlPZkJvYXJkLnN1YnRyYWN0KDEsICdkYXknKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50ID0gZmlyc3REYXlPZkJvYXJkLmNsb25lKCk7XG4gICAgY29uc3QgcHJldk1vbnRoID0gcGFyc2VkTW9udGguY2xvbmUoKS5zdWJ0cmFjdCgxLCAnbW9udGgnKTtcbiAgICBjb25zdCBuZXh0TW9udGggPSBwYXJzZWRNb250aC5jbG9uZSgpLmFkZCgxLCAnbW9udGgnKTtcbiAgICBjb25zdCB0b2RheSA9IG1vbWVudCgpO1xuXG4gICAgY29uc3QgZGF5c09mQ2FsZW5kYXI6IElEYXlbXSA9IHRoaXMudXRpbHNTZXJ2aWNlLmNyZWF0ZUFycmF5KDQyKVxuICAgICAgLnJlZHVjZSgoYXJyYXk6IElEYXlbXSkgPT4ge1xuICAgICAgICBhcnJheS5wdXNoKHtcbiAgICAgICAgICBkYXRlOiBjdXJyZW50LmNsb25lKCksXG4gICAgICAgICAgc2VsZWN0ZWQ6ICEhc2VsZWN0ZWQuZmluZChzZWxlY3RlZERheSA9PiBjdXJyZW50LmlzU2FtZShzZWxlY3RlZERheSwgJ2RheScpKSxcbiAgICAgICAgICBjdXJyZW50TW9udGg6IGN1cnJlbnQuaXNTYW1lKHBhcnNlZE1vbnRoLCAnbW9udGgnKSxcbiAgICAgICAgICBwcmV2TW9udGg6IGN1cnJlbnQuaXNTYW1lKHByZXZNb250aCwgJ21vbnRoJyksXG4gICAgICAgICAgbmV4dE1vbnRoOiBjdXJyZW50LmlzU2FtZShuZXh0TW9udGgsICdtb250aCcpLFxuICAgICAgICAgIGN1cnJlbnREYXk6IGN1cnJlbnQuaXNTYW1lKHRvZGF5LCAnZGF5JyksXG4gICAgICAgICAgZGlzYWJsZWQ6IHRoaXMuaXNEYXRlRGlzYWJsZWQoY3VycmVudCwgY29uZmlnKVxuICAgICAgICB9KTtcbiAgICAgICAgY3VycmVudC5hZGQoMSwgJ2RheScpO1xuXG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgIH0sIFtdKTtcblxuICAgIGRheXNPZkNhbGVuZGFyLmZvckVhY2goKGRheSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHdlZWtJbmRleCA9IE1hdGguZmxvb3IoaW5kZXggLyA3KTtcblxuICAgICAgaWYgKCFtb250aEFycmF5W3dlZWtJbmRleF0pIHtcbiAgICAgICAgbW9udGhBcnJheS5wdXNoKFtdKTtcbiAgICAgIH1cblxuICAgICAgbW9udGhBcnJheVt3ZWVrSW5kZXhdLnB1c2goZGF5KTtcbiAgICB9KTtcblxuICAgIGlmICghY29uZmlnLnNob3dOZWFyTW9udGhEYXlzKSB7XG4gICAgICBtb250aEFycmF5ID0gdGhpcy5yZW1vdmVOZWFyTW9udGhXZWVrcyhwYXJzZWRNb250aCwgbW9udGhBcnJheSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vbnRoQXJyYXk7XG4gIH1cblxuICBnZW5lcmF0ZVdlZWtkYXlzKGZpcnN0RGF5T2ZXZWVrOiBXZWVrRGF5cywgbG9jYWxlPzogc3RyaW5nKTogTW9tZW50W10ge1xuICAgIGNvbnN0IHdlZWtkYXlOYW1lczoge1trZXk6IHN0cmluZ106IE1vbWVudH0gPSBbJ3N1JywgJ21vJywgJ3R1JywgJ3dlJywgJ3RoJywgJ2ZyJywgJ3NhJ10ucmVkdWNlKChhY2MsIGQsIGkpID0+IHtcbiAgICAgIGNvbnN0IG0gPSBtb21lbnQoKTtcbiAgICAgIGlmIChsb2NhbGUpIHtcbiAgICAgICAgbS5sb2NhbGUobG9jYWxlKTtcbiAgICAgIH1cbiAgICAgIG0uZGF5KGkpO1xuICAgICAgYWNjW2RdID0gbTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xuICAgIGNvbnN0IHdlZWtkYXlzOiBNb21lbnRbXSA9IFtdO1xuICAgIGNvbnN0IGRheXNNYXAgPSB0aGlzLmdlbmVyYXRlRGF5c01hcChmaXJzdERheU9mV2Vlayk7XG5cbiAgICBmb3IgKGNvbnN0IGRheUtleSBpbiBkYXlzTWFwKSB7XG4gICAgICBpZiAoZGF5c01hcC5oYXNPd25Qcm9wZXJ0eShkYXlLZXkpKSB7XG4gICAgICAgIHdlZWtkYXlzW2RheXNNYXBbZGF5S2V5XV0gPSB3ZWVrZGF5TmFtZXNbZGF5S2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gd2Vla2RheXM7XG4gIH1cblxuICBpc0RhdGVEaXNhYmxlZChkYXRlOiBNb21lbnQsIGNvbmZpZzogSURheUNhbGVuZGFyQ29uZmlnSW50ZXJuYWwpOiBib29sZWFuIHtcbiAgICBpZiAoY29uZmlnLmlzRGF5RGlzYWJsZWRDYWxsYmFjaykge1xuICAgICAgcmV0dXJuIGNvbmZpZy5pc0RheURpc2FibGVkQ2FsbGJhY2soZGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5taW4gJiYgZGF0ZS5pc0JlZm9yZShjb25maWcubWluLCAnZGF5JykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiAhIShjb25maWcubWF4ICYmIGRhdGUuaXNBZnRlcihjb25maWcubWF4LCAnZGF5JykpO1xuICB9XG5cbiAgLy8gdG9kbzo6IGFkZCB1bml0IHRlc3RzXG4gIGdldEhlYWRlckxhYmVsKGNvbmZpZzogSURheUNhbGVuZGFyQ29uZmlnSW50ZXJuYWwsIG1vbnRoOiBNb21lbnQpOiBzdHJpbmcge1xuICAgIGlmIChjb25maWcubW9udGhGb3JtYXR0ZXIpIHtcbiAgICAgIHJldHVybiBjb25maWcubW9udGhGb3JtYXR0ZXIobW9udGgpO1xuICAgIH1cblxuICAgIHJldHVybiBtb250aC5mb3JtYXQoY29uZmlnLm1vbnRoRm9ybWF0KTtcbiAgfVxuXG4gIC8vIHRvZG86OiBhZGQgdW5pdCB0ZXN0c1xuICBzaG91bGRTaG93TGVmdChtaW46IE1vbWVudCwgY3VycmVudE1vbnRoVmlldzogTW9tZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG1pbiA/IG1pbi5pc0JlZm9yZShjdXJyZW50TW9udGhWaWV3LCAnbW9udGgnKSA6IHRydWU7XG4gIH1cblxuICAvLyB0b2RvOjogYWRkIHVuaXQgdGVzdHNcbiAgc2hvdWxkU2hvd1JpZ2h0KG1heDogTW9tZW50LCBjdXJyZW50TW9udGhWaWV3OiBNb21lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gbWF4ID8gbWF4LmlzQWZ0ZXIoY3VycmVudE1vbnRoVmlldywgJ21vbnRoJykgOiB0cnVlO1xuICB9XG5cbiAgZ2VuZXJhdGVEYXlzSW5kZXhNYXAoZmlyc3REYXlPZldlZWs6IFdlZWtEYXlzKSB7XG4gICAgY29uc3QgZmlyc3REYXlJbmRleCA9IHRoaXMuREFZUy5pbmRleE9mKGZpcnN0RGF5T2ZXZWVrKTtcbiAgICBjb25zdCBkYXlzQXJyID0gdGhpcy5EQVlTLnNsaWNlKGZpcnN0RGF5SW5kZXgsIDcpLmNvbmNhdCh0aGlzLkRBWVMuc2xpY2UoMCwgZmlyc3REYXlJbmRleCkpO1xuICAgIHJldHVybiBkYXlzQXJyLnJlZHVjZSgobWFwLCBkYXksIGluZGV4KSA9PiB7XG4gICAgICBtYXBbaW5kZXhdID0gZGF5O1xuXG4gICAgICByZXR1cm4gbWFwO1xuICAgIH0sIDx7W2tleTogbnVtYmVyXTogc3RyaW5nfT57fSk7XG4gIH1cblxuICBnZXRNb250aENhbGVuZGFyQ29uZmlnKGNvbXBvbmVudENvbmZpZzogSURheUNhbGVuZGFyQ29uZmlnSW50ZXJuYWwpOiBJTW9udGhDYWxlbmRhckNvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMudXRpbHNTZXJ2aWNlLmNsZWFyVW5kZWZpbmVkKHtcbiAgICAgIG1pbjogY29tcG9uZW50Q29uZmlnLm1pbixcbiAgICAgIG1heDogY29tcG9uZW50Q29uZmlnLm1heCxcbiAgICAgIGZvcm1hdDogY29tcG9uZW50Q29uZmlnLmZvcm1hdCxcbiAgICAgIGlzTmF2SGVhZGVyQnRuQ2xpY2thYmxlOiB0cnVlLFxuICAgICAgYWxsb3dNdWx0aVNlbGVjdDogZmFsc2UsXG4gICAgICBsb2NhbGU6IGNvbXBvbmVudENvbmZpZy5sb2NhbGUsXG4gICAgICB5ZWFyRm9ybWF0OiBjb21wb25lbnRDb25maWcueWVhckZvcm1hdCxcbiAgICAgIHllYXJGb3JtYXR0ZXI6IGNvbXBvbmVudENvbmZpZy55ZWFyRm9ybWF0dGVyLFxuICAgICAgbW9udGhCdG5Gb3JtYXQ6IGNvbXBvbmVudENvbmZpZy5tb250aEJ0bkZvcm1hdCxcbiAgICAgIG1vbnRoQnRuRm9ybWF0dGVyOiBjb21wb25lbnRDb25maWcubW9udGhCdG5Gb3JtYXR0ZXIsXG4gICAgICBtb250aEJ0bkNzc0NsYXNzQ2FsbGJhY2s6IGNvbXBvbmVudENvbmZpZy5tb250aEJ0bkNzc0NsYXNzQ2FsbGJhY2ssXG4gICAgICBpc01vbnRoRGlzYWJsZWRDYWxsYmFjazogY29tcG9uZW50Q29uZmlnLmlzTW9udGhEaXNhYmxlZENhbGxiYWNrLFxuICAgICAgbXVsdGlwbGVZZWFyc05hdmlnYXRlQnk6IGNvbXBvbmVudENvbmZpZy5tdWx0aXBsZVllYXJzTmF2aWdhdGVCeSxcbiAgICAgIHNob3dNdWx0aXBsZVllYXJzTmF2aWdhdGlvbjogY29tcG9uZW50Q29uZmlnLnNob3dNdWx0aXBsZVllYXJzTmF2aWdhdGlvbixcbiAgICAgIHNob3dHb1RvQ3VycmVudDogY29tcG9uZW50Q29uZmlnLnNob3dHb1RvQ3VycmVudCxcbiAgICAgIG51bU9mTW9udGhSb3dzOiBjb21wb25lbnRDb25maWcubnVtT2ZNb250aFJvd3NcbiAgICB9KTtcbiAgfVxuXG4gIGdldERheUJ0blRleHQoY29uZmlnOiBJRGF5Q2FsZW5kYXJDb25maWdJbnRlcm5hbCwgZGF5OiBNb21lbnQpOiBzdHJpbmcge1xuICAgIGlmIChjb25maWcuZGF5QnRuRm9ybWF0dGVyKSB7XG4gICAgICByZXR1cm4gY29uZmlnLmRheUJ0bkZvcm1hdHRlcihkYXkpO1xuICAgIH1cblxuICAgIHJldHVybiBkYXkuZm9ybWF0KGNvbmZpZy5kYXlCdG5Gb3JtYXQpO1xuICB9XG5cbiAgZ2V0RGF5QnRuQ3NzQ2xhc3MoY29uZmlnOiBJRGF5Q2FsZW5kYXJDb25maWdJbnRlcm5hbCwgZGF5OiBNb21lbnQpOiBzdHJpbmcge1xuICAgIGlmIChjb25maWcuZGF5QnRuQ3NzQ2xhc3NDYWxsYmFjaykge1xuICAgICAgcmV0dXJuIGNvbmZpZy5kYXlCdG5Dc3NDbGFzc0NhbGxiYWNrKGRheSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVOZWFyTW9udGhXZWVrcyhjdXJyZW50TW9udGg6IE1vbWVudCwgbW9udGhBcnJheTogSURheVtdW10pOiBJRGF5W11bXSB7XG4gICAgaWYgKG1vbnRoQXJyYXlbbW9udGhBcnJheS5sZW5ndGggLSAxXS5maW5kKChkYXkpID0+IGRheS5kYXRlLmlzU2FtZShjdXJyZW50TW9udGgsICdtb250aCcpKSkge1xuICAgICAgcmV0dXJuIG1vbnRoQXJyYXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBtb250aEFycmF5LnNsaWNlKDAsIC0xKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==