ng-material-date-range-picker
Version:
This library provides the date range selection with two views.
154 lines • 17.6 kB
JavaScript
import { DatePipe } from '@angular/common';
import { DATE_OPTION_TYPE } from '../constant/date-filter-const';
/**
* Resets the selection state for all options
* and marks the given option as selected if provided.
*
* @param options - List of date options
* @param selectedOption - Option to be marked as selected
*/
export function resetOptionSelection(options, selectedOption) {
options.forEach((option) => (option.isSelected = false));
if (selectedOption) {
selectedOption.isSelected = true;
}
}
/**
* Marks the custom date option as selected.
*
* @param options - List of date options
*/
export function selectCustomOption(options) {
const customOption = options.find((option) => option.optionType === DATE_OPTION_TYPE.CUSTOM);
if (customOption)
customOption.isSelected = true;
}
/**
* Returns a new date with the given year offset applied.
*
* @param offset - Number of years to add (negative for past years)
* @returns Date object with updated year
*/
export function getDateWithOffset(offset) {
const date = new Date();
date.setFullYear(date.getFullYear() + offset);
return date;
}
/**
* Creates a deep clone of the provided object or array.
*
* @param data - Data to be cloned
* @returns A deep copy of the data
*/
export function getClone(data) {
return JSON.parse(JSON.stringify(data));
}
/**
* Formats a date object into a string using Angular DatePipe.
*
* @param date - Date to be formatted
* @param dateFormat - Desired date format (e.g., 'dd/MM/yyyy')
* @returns Formatted date string
*/
export function getDateString(date, dateFormat) {
const datePipe = new DatePipe('en');
return datePipe.transform(date, dateFormat) ?? '';
}
/**
* Formats a date range into a string with start and end dates.
*
* @param range - Date range with start and end
* @param dateFormat - Desired date format
* @returns Formatted range string (e.g., '01/01/2023 - 07/01/2023')
*/
export function getFormattedDateString(range, dateFormat) {
if (!(range.start && range.end)) {
return '';
}
return (getDateString(range.start, dateFormat) +
' - ' +
getDateString(range.end, dateFormat));
}
/**
* Creates a standardized date option object for dropdowns.
*
* @param label - Display label for the option
* @param key - Option key from DEFAULT_DATE_OPTION_ENUM
* @param dateDiff - Offset in days from current date (default: 0)
* @param isVisible - Whether the option is visible (default: true)
* @returns ISelectDateOption object
*/
export function createOption(label, key, dateDiff = 0, isVisible = true) {
return {
optionLabel: label,
optionType: key,
dateDiff,
isSelected: false,
isVisible,
};
}
/**
* Returns the date of the next month based on the given date.
*
* @param currDate - Current date
* @returns A new Date object incremented by one month
*/
export function getDateOfNextMonth(currDate) {
const date = new Date(currDate);
date.setMonth(currDate.getMonth() + 1);
return date;
}
/**
* Returns the first day of the month following the given date.
*
* @param currDate - The current date
* @returns A Date object set to the first day of the next month
*/
export function getFirstDateOfNextMonth(currDate) {
return new Date(currDate.getFullYear(), currDate.getMonth() + 1, 1);
}
/**
* Returns the number of days in the month of the given date.
*
* @param date The date to calculate the days for.
* @returns Number of days in the month.
*/
export function getDaysInMonth(date) {
return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();
}
/**
* Overrides the `activeDate` setter for a MatCalendar instance, injecting custom handler logic
* while preserving the original setter behavior. Useful for reacting to internal date navigation
* events (e.g., month changes) in Angular Material's calendar.
*
* @param calendar - Instance of MatCalendar whose `activeDate` setter will be overridden.
* @param cdref - ChangeDetectorRef to trigger view updates after the setter runs.
* @param handler - Custom callback function executed whenever `activeDate` is set.
*/
export function overrideActiveDateSetter(calendar, cdref, handler) {
const proto = Object.getPrototypeOf(calendar);
const descriptor = Object.getOwnPropertyDescriptor(proto, 'activeDate');
if (!(descriptor?.set && descriptor?.get)) {
console.warn('overrideActiveDateSetter: activeDate setter/getter not found on MatCalendar prototype.');
return;
}
const originalSetter = descriptor.set;
const originalGetter = descriptor.get;
Object.defineProperty(calendar, 'activeDate', {
configurable: true,
enumerable: false,
get() {
return originalGetter.call(this);
},
set(value) {
const activeDate = {
previous: originalGetter.call(this) ?? value,
current: value,
};
originalSetter.call(this, value);
handler.call(this, activeDate);
cdref.markForCheck();
},
});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXItdXRpbGl0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZGF0ZS1waWNrZXIvc3JjL2xpYi91dGlscy9kYXRlLXBpY2tlci11dGlsaXRpZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBS2pFOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsT0FBNEIsRUFDNUIsY0FBa0M7SUFFbEMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDekQsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUNuQixjQUFjLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztJQUNuQyxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsT0FBNEI7SUFDN0QsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FDL0IsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEtBQUssZ0JBQWdCLENBQUMsTUFBTSxDQUMxRCxDQUFDO0lBQ0YsSUFBSSxZQUFZO1FBQUUsWUFBWSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7QUFDbkQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLE1BQWM7SUFDOUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUN4QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQztJQUM5QyxPQUFPLElBQUksQ0FB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QUFFLFlBQVksRUFBRTtRQUM1QyxZQUFZLEVBQUUsSUFBSTtRQUNsQixVQUFVLEVBQUUsS0FBSztRQUNqQixHQUFHO1lBQ0QsT0FBTyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFFRCxHQUFHLENBQUMsS0FBVztZQUNiLE1BQU0sVUFBVSxHQUFlO2dCQUM3QixRQUFRLEVBQUUsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLO2dCQUM1QyxPQUFPLEVBQUUsS0FBSzthQUNmLENBQUM7WUFDRixjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNqQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMvQixLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdkIsQ0FBQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRlUmFuZ2UsIE1hdENhbGVuZGFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XHJcbmltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgREFURV9PUFRJT05fVFlQRSB9IGZyb20gJy4uL2NvbnN0YW50L2RhdGUtZmlsdGVyLWNvbnN0JztcclxuaW1wb3J0IHsgSVNlbGVjdERhdGVPcHRpb24gfSBmcm9tICcuLi9tb2RlbC9zZWxlY3QtZGF0ZS1vcHRpb24ubW9kZWwnO1xyXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBY3RpdmVEYXRlIH0gZnJvbSAnLi4vbW9kZWwvYWN0aXZlLWRhdGUubW9kZWwnO1xyXG5cclxuLyoqXHJcbiAqIFJlc2V0cyB0aGUgc2VsZWN0aW9uIHN0YXRlIGZvciBhbGwgb3B0aW9uc1xyXG4gKiBhbmQgbWFya3MgdGhlIGdpdmVuIG9wdGlvbiBhcyBzZWxlY3RlZCBpZiBwcm92aWRlZC5cclxuICpcclxuICogQHBhcmFtIG9wdGlvbnMgLSBMaXN0IG9mIGRhdGUgb3B0aW9uc1xyXG4gKiBAcGFyYW0gc2VsZWN0ZWRPcHRpb24gLSBPcHRpb24gdG8gYmUgbWFya2VkIGFzIHNlbGVjdGVkXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRPcHRpb25TZWxlY3Rpb24oXHJcbiAgb3B0aW9uczogSVNlbGVjdERhdGVPcHRpb25bXSxcclxuICBzZWxlY3RlZE9wdGlvbj86IElTZWxlY3REYXRlT3B0aW9uXHJcbikge1xyXG4gIG9wdGlvbnMuZm9yRWFjaCgob3B0aW9uKSA9PiAob3B0aW9uLmlzU2VsZWN0ZWQgPSBmYWxzZSkpO1xyXG4gIGlmIChzZWxlY3RlZE9wdGlvbikge1xyXG4gICAgc2VsZWN0ZWRPcHRpb24uaXNTZWxlY3RlZCA9IHRydWU7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogTWFya3MgdGhlIGN1c3RvbSBkYXRlIG9wdGlvbiBhcyBzZWxlY3RlZC5cclxuICpcclxuICogQHBhcmFtIG9wdGlvbnMgLSBMaXN0IG9mIGRhdGUgb3B0aW9uc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEN1c3RvbU9wdGlvbihvcHRpb25zOiBJU2VsZWN0RGF0ZU9wdGlvbltdKTogdm9pZCB7XHJcbiAgY29uc3QgY3VzdG9tT3B0aW9uID0gb3B0aW9ucy5maW5kKFxyXG4gICAgKG9wdGlvbikgPT4gb3B0aW9uLm9wdGlvblR5cGUgPT09IERBVEVfT1BUSU9OX1RZUEUuQ1VTVE9NXHJcbiAgKTtcclxuICBpZiAoY3VzdG9tT3B0aW9uKSBjdXN0b21PcHRpb24uaXNTZWxlY3RlZCA9IHRydWU7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgbmV3IGRhdGUgd2l0aCB0aGUgZ2l2ZW4geWVhciBvZmZzZXQgYXBwbGllZC5cclxuICpcclxuICogQHBhcmFtIG9mZnNldCAtIE51bWJlciBvZiB5ZWFycyB0byBhZGQgKG5lZ2F0aXZlIGZvciBwYXN0IHllYXJzKVxyXG4gKiBAcmV0dXJucyBEYXRlIG9iamVjdCB3aXRoIHVwZGF0ZWQgeWVhclxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldERhdGVXaXRoT2Zmc2V0KG9mZnNldDogbnVtYmVyKSB7XHJcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgZGF0ZS5zZXRGdWxsWWVhcihkYXRlLmdldEZ1bGxZZWFyKCkgKyBvZmZzZXQpO1xyXG4gIHJldHVybiBkYXRlO1xyXG59XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhIGRlZXAgY2xvbmUgb2YgdGhlIHByb3ZpZGVkIG9iamVjdCBvciBhcnJheS5cclxuICpcclxuICogQHBhcmFtIGRhdGEgLSBEYXRhIHRvIGJlIGNsb25lZFxyXG4gKiBAcmV0dXJucyBBIGRlZXAgY29weSBvZiB0aGUgZGF0YVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldENsb25lPFQ+KGRhdGE6IFQpOiBUIHtcclxuICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBGb3JtYXRzIGEgZGF0ZSBvYmplY3QgaW50byBhIHN0cmluZyB1c2luZyBBbmd1bGFyIERhdGVQaXBlLlxyXG4gKlxyXG4gKiBAcGFyYW0gZGF0ZSAtIERhdGUgdG8gYmUgZm9ybWF0dGVkXHJcbiAqIEBwYXJhbSBkYXRlRm9ybWF0IC0gRGVzaXJlZCBkYXRlIGZvcm1hdCAoZS5nLiwgJ2RkL01NL3l5eXknKVxyXG4gKiBAcmV0dXJucyBGb3JtYXR0ZWQgZGF0ZSBzdHJpbmdcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRlU3RyaW5nKGRhdGU6IERhdGUsIGRhdGVGb3JtYXQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgY29uc3QgZGF0ZVBpcGUgPSBuZXcgRGF0ZVBpcGUoJ2VuJyk7XHJcbiAgcmV0dXJuIGRhdGVQaXBlLnRyYW5zZm9ybShkYXRlLCBkYXRlRm9ybWF0KSA/PyAnJztcclxufVxyXG5cclxuLyoqXHJcbiAqIEZvcm1hdHMgYSBkYXRlIHJhbmdlIGludG8gYSBzdHJpbmcgd2l0aCBzdGFydCBhbmQgZW5kIGRhdGVzLlxyXG4gKlxyXG4gKiBAcGFyYW0gcmFuZ2UgLSBEYXRlIHJhbmdlIHdpdGggc3RhcnQgYW5kIGVuZFxyXG4gKiBAcGFyYW0gZGF0ZUZvcm1hdCAtIERlc2lyZWQgZGF0ZSBmb3JtYXRcclxuICogQHJldHVybnMgRm9ybWF0dGVkIHJhbmdlIHN0cmluZyAoZS5nLiwgJzAxLzAxLzIwMjMgLSAwNy8wMS8yMDIzJylcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWREYXRlU3RyaW5nKFxyXG4gIHJhbmdlOiBEYXRlUmFuZ2U8RGF0ZT4sXHJcbiAgZGF0ZUZvcm1hdDogc3RyaW5nXHJcbikge1xyXG4gIGlmICghKHJhbmdlLnN0YXJ0ICYmIHJhbmdlLmVuZCkpIHtcclxuICAgIHJldHVybiAnJztcclxuICB9XHJcbiAgcmV0dXJuIChcclxuICAgIGdldERhdGVTdHJpbmcocmFuZ2Uuc3RhcnQsIGRhdGVGb3JtYXQpICtcclxuICAgICcgLSAnICtcclxuICAgIGdldERhdGVTdHJpbmcocmFuZ2UuZW5kLCBkYXRlRm9ybWF0KVxyXG4gICk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgc3RhbmRhcmRpemVkIGRhdGUgb3B0aW9uIG9iamVjdCBmb3IgZHJvcGRvd25zLlxyXG4gKlxyXG4gKiBAcGFyYW0gbGFiZWwgLSBEaXNwbGF5IGxhYmVsIGZvciB0aGUgb3B0aW9uXHJcbiAqIEBwYXJhbSBrZXkgLSBPcHRpb24ga2V5IGZyb20gREVGQVVMVF9EQVRFX09QVElPTl9FTlVNXHJcbiAqIEBwYXJhbSBkYXRlRGlmZiAtIE9mZnNldCBpbiBkYXlzIGZyb20gY3VycmVudCBkYXRlIChkZWZhdWx0OiAwKVxyXG4gKiBAcGFyYW0gaXNWaXNpYmxlIC0gV2hldGhlciB0aGUgb3B0aW9uIGlzIHZpc2libGUgKGRlZmF1bHQ6IHRydWUpXHJcbiAqIEByZXR1cm5zIElTZWxlY3REYXRlT3B0aW9uIG9iamVjdFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU9wdGlvbihcclxuICBsYWJlbDogc3RyaW5nLFxyXG4gIGtleTogREFURV9PUFRJT05fVFlQRSxcclxuICBkYXRlRGlmZiA9IDAsXHJcbiAgaXNWaXNpYmxlID0gdHJ1ZVxyXG4pOiBJU2VsZWN0RGF0ZU9wdGlvbiB7XHJcbiAgcmV0dXJuIHtcclxuICAgIG9wdGlvbkxhYmVsOiBsYWJlbCxcclxuICAgIG9wdGlvblR5cGU6IGtleSxcclxuICAgIGRhdGVEaWZmLFxyXG4gICAgaXNTZWxlY3RlZDogZmFsc2UsXHJcbiAgICBpc1Zpc2libGUsXHJcbiAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIGRhdGUgb2YgdGhlIG5leHQgbW9udGggYmFzZWQgb24gdGhlIGdpdmVuIGRhdGUuXHJcbiAqXHJcbiAqIEBwYXJhbSBjdXJyRGF0ZSAtIEN1cnJlbnQgZGF0ZVxyXG4gKiBAcmV0dXJucyBBIG5ldyBEYXRlIG9iamVjdCBpbmNyZW1lbnRlZCBieSBvbmUgbW9udGhcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRlT2ZOZXh0TW9udGgoY3VyckRhdGU6IERhdGUpOiBEYXRlIHtcclxuICBjb25zdCBkYXRlID0gbmV3IERhdGUoY3VyckRhdGUpO1xyXG4gIGRhdGUuc2V0TW9udGgoY3VyckRhdGUuZ2V0TW9udGgoKSArIDEpO1xyXG4gIHJldHVybiBkYXRlO1xyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgZmlyc3QgZGF5IG9mIHRoZSBtb250aCBmb2xsb3dpbmcgdGhlIGdpdmVuIGRhdGUuXHJcbiAqXHJcbiAqIEBwYXJhbSBjdXJyRGF0ZSAtIFRoZSBjdXJyZW50IGRhdGVcclxuICogQHJldHVybnMgQSBEYXRlIG9iamVjdCBzZXQgdG8gdGhlIGZpcnN0IGRheSBvZiB0aGUgbmV4dCBtb250aFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpcnN0RGF0ZU9mTmV4dE1vbnRoKGN1cnJEYXRlOiBEYXRlKTogRGF0ZSB7XHJcbiAgcmV0dXJuIG5ldyBEYXRlKGN1cnJEYXRlLmdldEZ1bGxZZWFyKCksIGN1cnJEYXRlLmdldE1vbnRoKCkgKyAxLCAxKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkYXlzIGluIHRoZSBtb250aCBvZiB0aGUgZ2l2ZW4gZGF0ZS5cclxuICpcclxuICogQHBhcmFtIGRhdGUgVGhlIGRhdGUgdG8gY2FsY3VsYXRlIHRoZSBkYXlzIGZvci5cclxuICogQHJldHVybnMgTnVtYmVyIG9mIGRheXMgaW4gdGhlIG1vbnRoLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldERheXNJbk1vbnRoKGRhdGU6IERhdGUpOiBudW1iZXIge1xyXG4gIHJldHVybiBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSArIDEsIDApLmdldERhdGUoKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIE92ZXJyaWRlcyB0aGUgYGFjdGl2ZURhdGVgIHNldHRlciBmb3IgYSBNYXRDYWxlbmRhciBpbnN0YW5jZSwgaW5qZWN0aW5nIGN1c3RvbSBoYW5kbGVyIGxvZ2ljXHJcbiAqIHdoaWxlIHByZXNlcnZpbmcgdGhlIG9yaWdpbmFsIHNldHRlciBiZWhhdmlvci4gVXNlZnVsIGZvciByZWFjdGluZyB0byBpbnRlcm5hbCBkYXRlIG5hdmlnYXRpb25cclxuICogZXZlbnRzIChlLmcuLCBtb250aCBjaGFuZ2VzKSBpbiBBbmd1bGFyIE1hdGVyaWFsJ3MgY2FsZW5kYXIuXHJcbiAqXHJcbiAqIEBwYXJhbSBjYWxlbmRhciAtIEluc3RhbmNlIG9mIE1hdENhbGVuZGFyIHdob3NlIGBhY3RpdmVEYXRlYCBzZXR0ZXIgd2lsbCBiZSBvdmVycmlkZGVuLlxyXG4gKiBAcGFyYW0gY2RyZWYgLSBDaGFuZ2VEZXRlY3RvclJlZiB0byB0cmlnZ2VyIHZpZXcgdXBkYXRlcyBhZnRlciB0aGUgc2V0dGVyIHJ1bnMuXHJcbiAqIEBwYXJhbSBoYW5kbGVyIC0gQ3VzdG9tIGNhbGxiYWNrIGZ1bmN0aW9uIGV4ZWN1dGVkIHdoZW5ldmVyIGBhY3RpdmVEYXRlYCBpcyBzZXQuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gb3ZlcnJpZGVBY3RpdmVEYXRlU2V0dGVyKFxyXG4gIGNhbGVuZGFyOiBNYXRDYWxlbmRhcjxEYXRlPixcclxuICBjZHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgaGFuZGxlcjogKGRhdGU6IEFjdGl2ZURhdGUpID0+IHZvaWRcclxuKTogdm9pZCB7XHJcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY2FsZW5kYXIpO1xyXG4gIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCAnYWN0aXZlRGF0ZScpO1xyXG5cclxuICBpZiAoIShkZXNjcmlwdG9yPy5zZXQgJiYgZGVzY3JpcHRvcj8uZ2V0KSkge1xyXG4gICAgY29uc29sZS53YXJuKFxyXG4gICAgICAnb3ZlcnJpZGVBY3RpdmVEYXRlU2V0dGVyOiBhY3RpdmVEYXRlIHNldHRlci9nZXR0ZXIgbm90IGZvdW5kIG9uIE1hdENhbGVuZGFyIHByb3RvdHlwZS4nXHJcbiAgICApO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuICBjb25zdCBvcmlnaW5hbFNldHRlciA9IGRlc2NyaXB0b3Iuc2V0O1xyXG4gIGNvbnN0IG9yaWdpbmFsR2V0dGVyID0gZGVzY3JpcHRvci5nZXQ7XHJcblxyXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjYWxlbmRhciwgJ2FjdGl2ZURhdGUnLCB7XHJcbiAgICBjb25maWd1cmFibGU6IHRydWUsXHJcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcclxuICAgIGdldCgpIHtcclxuICAgICAgcmV0dXJuIG9yaWdpbmFsR2V0dGVyLmNhbGwodGhpcyk7XHJcbiAgICB9LFxyXG5cclxuICAgIHNldCh2YWx1ZTogRGF0ZSkge1xyXG4gICAgICBjb25zdCBhY3RpdmVEYXRlOiBBY3RpdmVEYXRlID0ge1xyXG4gICAgICAgIHByZXZpb3VzOiBvcmlnaW5hbEdldHRlci5jYWxsKHRoaXMpID8/IHZhbHVlLFxyXG4gICAgICAgIGN1cnJlbnQ6IHZhbHVlLFxyXG4gICAgICB9O1xyXG4gICAgICBvcmlnaW5hbFNldHRlci5jYWxsKHRoaXMsIHZhbHVlKTtcclxuICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGFjdGl2ZURhdGUpO1xyXG4gICAgICBjZHJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH0sXHJcbiAgfSk7XHJcbn1cclxuIl19