ngx-pluto
Version:
715 lines • 65 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Injectable } from '@angular/core';
import * as moment_ from 'moment';
import * as i0 from "@angular/core";
import * as i1 from "@angular/cdk/overlay";
/** @type {?} */
var moment = moment_;
import { OverlayPositionBuilder, Overlay } from '@angular/cdk/overlay';
import { DATE_FORMAT, TIME_FORMAT } from './date-picker-const';
var NpDatePickerService = /** @class */ (function () {
function NpDatePickerService(overlayPositionBuilder, overlay) {
this.overlayPositionBuilder = overlayPositionBuilder;
this.overlay = overlay;
}
Object.defineProperty(NpDatePickerService.prototype, "locale", {
get: /**
* @return {?}
*/
function () {
return (/** @type {?} */ (moment.locale()));
},
enumerable: true,
configurable: true
});
/**
* 根据传入的moment时间及传入的年份生成年份范围数组YearData。
* 例如:year = 2020, 年份范围value示例为
*
* [
*
* 2019, 2020, 2021,
*
* 2022, 2023, 2024,
*
* 2025, 2026, 2027,
*
* 2028, 2029, 2030
*
* ]
* @param date Moment时间
* @param year 年份YYYY, 例:2020
* @param selectedDate 当前选中的日期
*/
/**
* 根据传入的moment时间及传入的年份生成年份范围数组YearData。
* 例如:year = 2020, 年份范围value示例为
*
* [
*
* 2019, 2020, 2021,
*
* 2022, 2023, 2024,
*
* 2025, 2026, 2027,
*
* 2028, 2029, 2030
*
* ]
* @param {?} date Moment时间
* @param {?} year 年份YYYY, 例:2020
* @param {?} selectedDate 当前选中的日期
* @return {?}
*/
NpDatePickerService.prototype.buildYearsPanel = /**
* 根据传入的moment时间及传入的年份生成年份范围数组YearData。
* 例如:year = 2020, 年份范围value示例为
*
* [
*
* 2019, 2020, 2021,
*
* 2022, 2023, 2024,
*
* 2025, 2026, 2027,
*
* 2028, 2029, 2030
*
* ]
* @param {?} date Moment时间
* @param {?} year 年份YYYY, 例:2020
* @param {?} selectedDate 当前选中的日期
* @return {?}
*/
function (date, year, selectedDate) {
/** @type {?} */
var years = [];
/** @type {?} */
var lastNumOfYear = +year.charAt(3);
/** @type {?} */
var start = lastNumOfYear;
/** @type {?} */
var end = 10 - lastNumOfYear;
/** @type {?} */
var copyDateStart = date.clone();
while (start >= 0) {
/** @type {?} */
var cur = copyDateStart.add(-1, 'year');
years.push({
available: start > 0,
value: cur.format('YYYY'),
isSelected: selectedDate ? selectedDate.format('YYYY') === cur.format('YYYY') : false,
date: cur.clone()
});
start--;
}
years.push({
available: true,
value: date.format('YYYY'),
isSelected: selectedDate ? selectedDate.format('YYYY') === date.format('YYYY') : false,
date: date.clone()
});
/** @type {?} */
var copyDateEnd = date.clone();
while (end <= 10 && end > 0) {
/** @type {?} */
var cur = copyDateEnd.add(1, 'year');
years.push({
available: end > 1,
value: cur.format('YYYY'),
isSelected: selectedDate ? selectedDate.format('YYYY') === cur.format('YYYY') : false,
date: cur.clone()
});
end--;
}
return years.sort((/**
* @param {?} a
* @param {?} b
* @return {?}
*/
function (a, b) { return (+a.value - +b.value); }));
};
/**
* 构建当前年份的全部月份
* @param selectedDate 当前选中的日期
*/
/**
* 构建当前年份的全部月份
* @param {?} date
* @param {?} selectedDate 当前选中的日期
* @return {?}
*/
NpDatePickerService.prototype.buildMonthsPanel = /**
* 构建当前年份的全部月份
* @param {?} date
* @param {?} selectedDate 当前选中的日期
* @return {?}
*/
function (date, selectedDate) {
/** @type {?} */
var m = moment.monthsShort();
/** @type {?} */
var months = [];
for (var i = 0; i < m.length; i++) {
months.push({
available: true,
value: m[i],
isSelected: selectedDate ? m[i] === selectedDate.format('MMM') : false,
date: moment(date.format('YYYY') + m[i] + date.format('DD'), 'YYYYMMMDD')
});
}
return months;
};
/**
* 根据传入的日期构建当前显示日历面板(当前这个月的天数面板)。
* 例如:传入日期为2020/08/20,则返回一个DayDataPerMonth数组,
* 其中的value示例如下:
*
* ['日', '一', '二', '三', '四', '五', '六',
*
* '26', '27', '28', '29', '30', '31', '1',
*
* '2', '3', '4', '5', '6', '7', '8',
*
* '9', '10', '11', '12', '13', '14', '15',
*
* '16', '17', '18', '19', '20', '21', '22',
*
* '23', '24', '25', '26', '27', '28', '29',
*
* '30', '31', '1', '2', '3', '4', '5']
* @param date 构建日期面板的日期
* @param selectedDate 当前选中的日期
* @param isRangePicker 是否是时间区间选择
* @param dates 当isRangePicker为true时,需要传入此时间区间字段,代表时间区间已选择的区间值
*/
/**
* 根据传入的日期构建当前显示日历面板(当前这个月的天数面板)。
* 例如:传入日期为2020/08/20,则返回一个DayDataPerMonth数组,
* 其中的value示例如下:
*
* ['日', '一', '二', '三', '四', '五', '六',
*
* '26', '27', '28', '29', '30', '31', '1',
*
* '2', '3', '4', '5', '6', '7', '8',
*
* '9', '10', '11', '12', '13', '14', '15',
*
* '16', '17', '18', '19', '20', '21', '22',
*
* '23', '24', '25', '26', '27', '28', '29',
*
* '30', '31', '1', '2', '3', '4', '5']
* @param {?} date 构建日期面板的日期
* @param {?} selectedDate 当前选中的日期
* @return {?}
*/
NpDatePickerService.prototype.buildDaysPanel = /**
* 根据传入的日期构建当前显示日历面板(当前这个月的天数面板)。
* 例如:传入日期为2020/08/20,则返回一个DayDataPerMonth数组,
* 其中的value示例如下:
*
* ['日', '一', '二', '三', '四', '五', '六',
*
* '26', '27', '28', '29', '30', '31', '1',
*
* '2', '3', '4', '5', '6', '7', '8',
*
* '9', '10', '11', '12', '13', '14', '15',
*
* '16', '17', '18', '19', '20', '21', '22',
*
* '23', '24', '25', '26', '27', '28', '29',
*
* '30', '31', '1', '2', '3', '4', '5']
* @param {?} date 构建日期面板的日期
* @param {?} selectedDate 当前选中的日期
* @return {?}
*/
function (date, selectedDate) {
/** @type {?} */
var total = 49;
/** @type {?} */
var days = [];
/** @type {?} */
var copyDate = date.clone();
/** @type {?} */
var weekdaysMin = this.getWeekdaysMin();
weekdaysMin.forEach((/**
* @param {?} item
* @return {?}
*/
function (item) {
days.push({ available: false, value: item, isSelected: false, isWeekDayMin: true, date: null });
}));
/** @type {?} */
var startOfMonth = copyDate.clone().startOf('month');
startOfMonth = moment(startOfMonth.format(DATE_FORMAT) + ' ' + copyDate.format(TIME_FORMAT));
// 获取当月第一天是周几,如2020/08/01是周六,则得到的是“六”
/** @type {?} */
var weekDayMin_startOfMonth = weekdaysMin[+startOfMonth.weekday() + 1];
/** @type {?} */
var index_weekDayMin_startOfMonth = weekdaysMin.indexOf(weekDayMin_startOfMonth);
// 添加上月后几天用以补足当前面板
while (index_weekDayMin_startOfMonth > 0) {
days.push({
available: false,
value: startOfMonth.clone().add(-index_weekDayMin_startOfMonth, 'day').format('D'),
isSelected: false,
isWeekDayMin: false,
date: startOfMonth.clone().add(-index_weekDayMin_startOfMonth, 'day').clone()
});
index_weekDayMin_startOfMonth--;
}
/** @type {?} */
var lastOfMonth = copyDate.clone().endOf('month');
lastOfMonth = moment(lastOfMonth.format(DATE_FORMAT) + ' ' + copyDate.format(TIME_FORMAT));
// 获取当月最后天是周几,如2020/08/31是周一,则得到的是“一”
// 添加当月到当前面板数组
while (startOfMonth <= lastOfMonth) {
days.push({
available: true,
value: startOfMonth.format('D'),
isSelected: selectedDate ? startOfMonth.format(DATE_FORMAT) === selectedDate.format(DATE_FORMAT) : false,
isWeekDayMin: false,
date: startOfMonth.clone()
});
startOfMonth = startOfMonth.add(1, 'day');
}
// 添加下月前几天用以补足当前面板
/** @type {?} */
var i = 1;
while (days.length < total) {
days.push({
available: false,
value: lastOfMonth.clone().add(i, 'day').format('D'),
isSelected: false,
isWeekDayMin: false,
date: lastOfMonth.clone().add(i, 'day').clone()
});
i++;
}
return days;
};
/**
* @param {?} dates
* @param {?=} asc
* @return {?}
*/
NpDatePickerService.prototype.sortDates = /**
* @param {?} dates
* @param {?=} asc
* @return {?}
*/
function (dates, asc) {
if (asc === void 0) { asc = true; }
return dates.sort((/**
* @param {?} a
* @param {?} b
* @return {?}
*/
function (a, b) { return asc ? a.diff(b) : b.diff(a); }));
};
/**
* @param {?} sDate
* @param {?} eDate
* @return {?}
*/
NpDatePickerService.prototype.buildStartAndEndDates = /**
* @param {?} sDate
* @param {?} eDate
* @return {?}
*/
function (sDate, eDate) {
if (!sDate || !eDate) {
return [];
}
if (moment(sDate) < moment(eDate)) {
return [sDate, eDate];
}
return [eDate, sDate];
};
/**
* @param {?} date
* @return {?}
*/
NpDatePickerService.prototype.day = /**
* @param {?} date
* @return {?}
*/
function (date) {
if (date) {
return moment(date.format(DATE_FORMAT + ' 00:00:00'), 'YYYY-MM-DD');
}
return moment();
};
/**
* @private
* @param {?} currentDate
* @param {?} hoverDate
* @param {?=} dates
* @return {?}
*/
NpDatePickerService.prototype.getDayStatus = /**
* @private
* @param {?} currentDate
* @param {?} hoverDate
* @param {?=} dates
* @return {?}
*/
function (currentDate, hoverDate, dates) {
if (dates === void 0) { dates = []; }
if (!dates || dates.length === 0) {
return 'normal';
}
/** @type {?} */
var day = (/**
* @param {?} date
* @return {?}
*/
function (date) {
if (date) {
return moment(date.format(DATE_FORMAT + ' 00:00:00'), 'YYYY-MM-DD');
}
return moment();
});
/** @type {?} */
var sortedDates = this.sortDates(tslib_1.__spread([hoverDate], dates));
if (currentDate < sortedDates[0] || currentDate > sortedDates[2]) {
return (/** @type {?} */ ('normal'));
}
if (day(hoverDate).diff(dates[0]) < 0) {
if (day(currentDate).diff(day(hoverDate)) < 0) {
return 'normal';
}
else if (day(currentDate).diff(hoverDate) >= 0 && day(currentDate).diff(dates[0]) < 0) {
return 'within-hover';
}
else if (day(currentDate).diff(dates[0]) >= 0 && day(currentDate).diff(dates[1]) <= 0) {
return 'within-selected';
}
else if (day(currentDate).diff(dates[1]) > 0) {
return 'normal';
}
}
if (day(hoverDate).diff(dates[0]) >= 0 && day(hoverDate).diff(dates[1]) <= 0) {
if (day(currentDate).diff(day(dates[0])) < 0) {
return 'normal';
}
else if (day(currentDate).diff(dates[0]) >= 0 && day(currentDate).diff(hoverDate) < 0) {
return 'within-selected-hover';
}
else if (day(currentDate).diff(hoverDate) >= 0 && day(currentDate).diff(dates[1]) <= 0) {
return 'within-selected';
}
else if (day(currentDate).diff(dates[1]) > 0) {
return 'normal';
}
}
if (day(hoverDate).diff(dates[1]) > 0) {
if (day(currentDate).diff(day(dates[0])) < 0) {
return 'normal';
}
else if (day(currentDate).diff(dates[0]) >= 0 && day(currentDate).diff(dates[1]) < 0) {
return 'within-selected';
}
else if (day(currentDate).diff(dates[1]) >= 0 && day(currentDate).diff(hoverDate) <= 0) {
return 'within-hover';
}
else if (day(currentDate).diff(hoverDate) > 0) {
return 'normal';
}
}
return (/** @type {?} */ ('normal'));
};
/**
* 构建时间区间选择当鼠标hover面板时的状态,同buildDaysPanel的功能,
* 增加对象DayDataPerMonth中对字段isWithinDateRangeHover的值的区分。
*
* @param date 构建日期面板的日期
* @param selectedDate 当前选中的日期
* @param hoverDate 当前hover的时间moment值
* @param dates 需要传入此时间区间字段,代表时间区间已选择的区间值
*/
/**
* 构建时间区间选择当鼠标hover面板时的状态,同buildDaysPanel的功能,
* 增加对象DayDataPerMonth中对字段isWithinDateRangeHover的值的区分。
*
* @param {?} date 构建日期面板的日期
* @param {?} selectedDate 当前选中的日期
* @param {?} hoverDate 当前hover的时间moment值
* @param {?=} dates 需要传入此时间区间字段,代表时间区间已选择的区间值
* @return {?}
*/
NpDatePickerService.prototype.buildDaysPanelForRangePicker = /**
* 构建时间区间选择当鼠标hover面板时的状态,同buildDaysPanel的功能,
* 增加对象DayDataPerMonth中对字段isWithinDateRangeHover的值的区分。
*
* @param {?} date 构建日期面板的日期
* @param {?} selectedDate 当前选中的日期
* @param {?} hoverDate 当前hover的时间moment值
* @param {?=} dates 需要传入此时间区间字段,代表时间区间已选择的区间值
* @return {?}
*/
function (date, selectedDate, hoverDate, dates) {
if (dates === void 0) { dates = []; }
/** @type {?} */
var total = 49;
/** @type {?} */
var days = [];
/** @type {?} */
var copyDate = date.clone();
/** @type {?} */
var weekdaysMin = this.getWeekdaysMin();
weekdaysMin.forEach((/**
* @param {?} item
* @return {?}
*/
function (item) {
days.push({ available: false, value: item, isSelected: false, isWeekDayMin: true, date: null, hoverDateType: 'normal' });
}));
/** @type {?} */
var startOfMonth = copyDate.clone().startOf('month');
startOfMonth = moment(startOfMonth.format(DATE_FORMAT) + ' ' + copyDate.format(TIME_FORMAT));
// 获取当月第一天是周几,如2020/08/01是周六,则得到的是“六”
/** @type {?} */
var weekDayMin_startOfMonth = weekdaysMin[+startOfMonth.weekday() + 1];
/** @type {?} */
var index_weekDayMin_startOfMonth = weekdaysMin.indexOf(weekDayMin_startOfMonth);
// 添加上月后几天用以补足当前面板
while (index_weekDayMin_startOfMonth > 0) {
/** @type {?} */
var cDate = startOfMonth.clone().add(-index_weekDayMin_startOfMonth, 'day').clone();
days.push({
available: false,
value: cDate.format('D'),
isSelected: false,
isWeekDayMin: false,
date: cDate,
hoverDateType: this.getDayStatus(cDate, hoverDate, dates)
});
index_weekDayMin_startOfMonth--;
}
/** @type {?} */
var lastOfMonth = copyDate.clone().endOf('month');
lastOfMonth = moment(lastOfMonth.format(DATE_FORMAT) + ' ' + copyDate.format(TIME_FORMAT));
// 获取当月最后天是周几,如2020/08/31是周一,则得到的是“一”
// 添加当月到当前面板数组
while (startOfMonth <= lastOfMonth) {
days.push({
available: true,
value: startOfMonth.format('D'),
isSelected: selectedDate ? startOfMonth.format(DATE_FORMAT) === selectedDate.format(DATE_FORMAT) : false,
isWeekDayMin: false,
date: startOfMonth.clone(),
hoverDateType: this.getDayStatus(startOfMonth.clone(), hoverDate, dates)
});
startOfMonth = startOfMonth.add(1, 'day');
}
// 添加下月前几天用以补足当前面板
/** @type {?} */
var i = 1;
while (days.length < total) {
/** @type {?} */
var cDate = lastOfMonth.clone().add(i, 'day').clone();
days.push({
available: false,
value: cDate.format('D'),
isSelected: false,
isWeekDayMin: false,
date: cDate.clone(),
hoverDateType: this.getDayStatus(cDate, hoverDate, dates)
});
i++;
}
return days;
};
/**
* @return {?}
*/
NpDatePickerService.prototype.getWeekdaysMin = /**
* @return {?}
*/
function () {
return moment.weekdaysMin();
};
/**
* @param {?} elementRef
* @return {?}
*/
NpDatePickerService.prototype.getOverlayRef = /**
* @param {?} elementRef
* @return {?}
*/
function (elementRef) {
/** @type {?} */
var popupPositions = [{
originX: "start",
originY: "bottom",
overlayX: "start",
overlayY: "top",
offsetX: 0,
offsetY: 1
}, {
originX: "start",
originY: "top",
overlayX: "start",
overlayY: "bottom",
offsetX: 0,
offsetY: -1
}];
/** @type {?} */
var positionStrategy = this.overlayPositionBuilder
.flexibleConnectedTo(elementRef)
.withPositions(popupPositions);
return this.overlay.create({
positionStrategy: positionStrategy,
hasBackdrop: true,
backdropClass: 'cdk-overlay-transparent-backdrop',
scrollStrategy: this.overlay.scrollStrategies.noop()
});
};
/**获取calendar时间,例如今天,昨天,明天等 */
/**
* 获取calendar时间,例如今天,昨天,明天等
* @param {?} date
* @param {?=} locale
* @return {?}
*/
NpDatePickerService.prototype.calendar = /**
* 获取calendar时间,例如今天,昨天,明天等
* @param {?} date
* @param {?=} locale
* @return {?}
*/
function (date, locale) {
if (locale === void 0) { locale = 'zh-cn'; }
/** @type {?} */
var calendarDate = '';
switch (locale) {
case 'zh-cn':
calendarDate = date.calendar({
sameDay: '[今天]',
nextDay: '[明天]',
nextWeek: 'dddd',
lastDay: '[昨天]',
lastWeek: '[上] dddd',
sameElse: 'DD/MM/YYYY'
});
break;
case 'en':
calendarDate = date.calendar({
sameDay: '[Today]',
nextDay: '[Tomorrow]',
nextWeek: 'dddd',
lastDay: '[Yesterday]',
lastWeek: '[Last] dddd',
sameElse: 'DD/MM/YYYY'
});
break;
default:
calendarDate = date.calendar({
sameDay: '[今天]',
nextDay: '[明天]',
nextWeek: 'dddd',
lastDay: '[昨天]',
lastWeek: '[上] dddd',
sameElse: 'DD/MM/YYYY'
});
break;
}
return calendarDate;
};
/**
* @param {?} date
* @return {?}
*/
NpDatePickerService.prototype.isValid = /**
* @param {?} date
* @return {?}
*/
function (date) {
return date && moment(date).isValid();
};
NpDatePickerService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
/** @nocollapse */
NpDatePickerService.ctorParameters = function () { return [
{ type: OverlayPositionBuilder },
{ type: Overlay }
]; };
/** @nocollapse */ NpDatePickerService.ngInjectableDef = i0.defineInjectable({ factory: function NpDatePickerService_Factory() { return new NpDatePickerService(i0.inject(i1.OverlayPositionBuilder), i0.inject(i1.Overlay)); }, token: NpDatePickerService, providedIn: "root" });
return NpDatePickerService;
}());
export { NpDatePickerService };
if (false) {
/**
* @type {?}
* @private
*/
NpDatePickerService.prototype.overlayPositionBuilder;
/**
* @type {?}
* @private
*/
NpDatePickerService.prototype.overlay;
}
/**
* @record
*/
export function DateData() { }
if (false) {
/**
* 是否可选
* @type {?}
*/
DateData.prototype.available;
/**
* 当前值
* @type {?}
*/
DateData.prototype.value;
/**
* 当前是否选中
* @type {?}
*/
DateData.prototype.isSelected;
/**
* 当前日期
* @type {?}
*/
DateData.prototype.date;
}
/**
* @record
*/
export function DayDataPerMonth() { }
if (false) {
/**
* 是否是第一行的周
* @type {?}
*/
DayDataPerMonth.prototype.isWeekDayMin;
/**
* 当datepickertype为date-range-picker的时候,鼠标hover后在候选时间区间的则为true,否则false
* @type {?|undefined}
*/
DayDataPerMonth.prototype.hoverDateType;
}
/**
* @record
*/
export function YearData() { }
/**
* @record
*/
export function MonthData() { }
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1wbHV0by8iLCJzb3VyY2VzIjpbImxpYi9kYXRlLXBpY2tlci9kYXRlLXBpY2tlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUN2RCxPQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQzs7OztJQUFPLE1BQU0sR0FBRyxPQUFPO0FBQ3pELE9BQU8sRUFBRSxzQkFBc0IsRUFBaUMsT0FBTyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFdEcsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUUvRDtJQVNJLDZCQUFvQixzQkFBOEMsRUFDdEQsT0FBZ0I7UUFEUiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQ3RELFlBQU8sR0FBUCxPQUFPLENBQVM7SUFBSSxDQUFDO0lBTGpDLHNCQUFXLHVDQUFNOzs7O1FBQWpCO1lBQ0ksT0FBTyxtQkFBQSxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQW9CLENBQUM7UUFDL0MsQ0FBQzs7O09BQUE7SUFLRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Ba0JHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFDSCw2Q0FBZTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFBZixVQUFnQixJQUFvQixFQUFFLElBQVksRUFBRSxZQUE0Qjs7WUFDeEUsS0FBSyxHQUFvQixFQUFFOztZQUUzQixhQUFhLEdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQzs7WUFDdkMsS0FBSyxHQUFHLGFBQWE7O1lBQ3JCLEdBQUcsR0FBRyxFQUFFLEdBQUcsYUFBYTs7WUFFeEIsYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUU7UUFDaEMsT0FBTyxLQUFLLElBQUksQ0FBQyxFQUFFOztnQkFDVCxHQUFHLEdBQUcsYUFBYSxDQUFD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LENBQUMsQ0FBQztnQkFDSCxNQUFNO1lBQ1Y7Z0JBQ0ksWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7b0JBQ3pCLE9BQU8sRUFBRSxNQUFNO29CQUNmLE9BQU8sRUFBRSxNQUFNO29CQUNmLFFBQVEsRUFBRSxNQUFNO29CQUNoQixPQUFPLEVBQUUsTUFBTTtvQkFDZixRQUFRLEVBQUUsVUFBVTtvQkFDcEIsUUFBUSxFQUFFLFlBQVk7aUJBQ3pCLENBQUMsQ0FBQztnQkFDSCxNQUFNO1NBQ2I7UUFFRCxPQUFPLFlBQVksQ0FBQztJQUN4QixDQUFDOzs7OztJQUVELHFDQUFPOzs7O0lBQVAsVUFBUSxJQUE2QjtRQUNqQyxPQUFPLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDMUMsQ0FBQzs7Z0JBL1lKLFVBQVUsU0FBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckI7Ozs7Z0JBTlEsc0JBQXNCO2dCQUFpQyxPQUFPOzs7OEJBRnZFO0NBc1pDLEFBaFpELElBZ1pDO1NBN1lZLG1CQUFtQjs7Ozs7O0lBTWhCLHFEQUFzRDs7Ozs7SUFDOUQsc0NBQXdCOzs7OztBQXdZaEMsOEJBU0M7Ozs7OztJQVBHLDZCQUFtQjs7Ozs7SUFFbkIseUJBQWM7Ozs7O0lBRWQsOEJBQW9COzs7OztJQUVwQix3QkFBcUI7Ozs7O0FBR3pCLHFDQUtDOzs7Ozs7SUFIRyx1Q0FBc0I7Ozs7O0lBRXRCLHdDQUF3Qzs7Ozs7QUFnQjVDLDhCQUE4Qzs7OztBQUU5QywrQkFBK0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCAqIGFzIG1vbWVudF8gZnJvbSAnbW9tZW50JzsgY29uc3QgbW9tZW50ID0gbW9tZW50X1xyXG5pbXBvcnQgeyBPdmVybGF5UG9zaXRpb25CdWlsZGVyLCBDb25uZWN0ZWRQb3NpdGlvbiwgT3ZlcmxheVJlZiwgT3ZlcmxheSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcclxuaW1wb3J0IHsgRGF0ZVBpY2tlckxvY2FsZSB9IGZyb20gJy4vcHVibGljLWFwaSc7XHJcbmltcG9ydCB7IERBVEVfRk9STUFULCBUSU1FX0ZPUk1BVCB9IGZyb20gJy4vZGF0ZS1waWNrZXItY29uc3QnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOcERhdGVQaWNrZXJTZXJ2aWNlIHtcclxuXHJcbiAgICBwdWJsaWMgZ2V0IGxvY2FsZSgpOiBEYXRlUGlja2VyTG9jYWxlIHtcclxuICAgICAgICByZXR1cm4gbW9tZW50LmxvY2FsZSgpIGFzIERhdGVQaWNrZXJMb2NhbGU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBvdmVybGF5UG9zaXRpb25CdWlsZGVyOiBPdmVybGF5UG9zaXRpb25CdWlsZGVyLFxyXG4gICAgICAgIHByaXZhdGUgb3ZlcmxheTogT3ZlcmxheSkgeyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmoLnmja7kvKDlhaXnmoRtb21lbnTml7bpl7Tlj4rkvKDlhaXnmoTlubTku73nlJ/miJDlubTku73ojIPlm7TmlbDnu4RZZWFyRGF0YeOAglxyXG4gICAgICog5L6L5aaC77yaeWVhciA9IDIwMjDvvIwg5bm05Lu96IyD5Zu0dmFsdWXnpLrkvovkuLpcclxuICAgICAqIFxyXG4gICAgICogW1xyXG4gICAgICogXHJcbiAgICAgKiAgICAgIDIwMTksIDIwMjAsIDIwMjEsIFxyXG4gICAgICogXHJcbiAgICAgKiAgICAgIDIwMjIsIDIwMjMsIDIwMjQsIFxyXG4gICAgICogXHJcbiAgICAgKiAgICAgIDIwMjUsIDIwMjYsIDIwMjcsIFxyXG4gICAgICogXHJcbiAgICAgKiAgICAgIDIwMjgsIDIwMjksIDIwMzBcclxuICAgICAqIFxyXG4gICAgICogXVxyXG4gICAgICogQHBhcmFtIGRhdGUgTW9tZW505pe26Ze0XHJcbiAgICAgKiBAcGFyYW0geWVhciDlubTku71ZWVlZ77yMIOS+i++8mjIwMjBcclxuICAgICAqIEBwYXJhbSBzZWxlY3RlZERhdGUg5b2T5YmN6YCJ5Lit55qE5pel5pyfXHJcbiAgICAgKi9cclxuICAgIGJ1aWxkWWVhcnNQYW5lbChkYXRlOiBtb21lbnRfLk1vbWVudCwgeWVhcjogc3RyaW5nLCBzZWxlY3RlZERhdGU6IG1vbWVudF8uTW9tZW50KTogQXJyYXk8WWVhckRhdGE+IHtcclxuICAgICAgICBsZXQgeWVhcnM6IEFycmF5PFllYXJEYXRhPiA9IFtdO1xyXG5cclxuICAgICAgICBsZXQgbGFzdE51bU9mWWVhcjogbnVtYmVyID0gK3llYXIuY2hhckF0KDMpO1xyXG4gICAgICAgIGxldCBzdGFydCA9IGxhc3ROdW1PZlllYXI7XHJcbiAgICAgICAgbGV0IGVuZCA9IDEwIC0gbGFzdE51bU9mWWVhcjtcclxuXHJcbiAgICAgICAgbGV0IGNvcHlEYXRlU3RhcnQgPSBkYXRlLmNsb25lKCk7XHJcbiAgICAgICAgd2hpbGUgKHN0YXJ0ID49IDApIHtcclxuICAgICAgICAgICAgY29uc3QgY3VyID0gY29weURhdGVTdGFydC5hZGQoLTEsICd5ZWFyJyk7XHJcbiAgICAgICAgICAgIHllYXJzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlOiBzdGFydCA+IDAsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogY3VyLmZvcm1hdCgnWVlZWScpLFxyXG4gICAgICAgICAgICAgICAgaXNTZWxlY3RlZDogc2VsZWN0ZWREYXRlID8gc2VsZWN0ZWREYXRlLmZvcm1hdCgnWVlZWScpID09PSBjdXIuZm9ybWF0KCdZWVlZJykgOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGRhdGU6IGN1ci5jbG9uZSgpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBzdGFydC0tO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgeWVhcnMucHVzaCh7XHJcbiAgICAgICAgICAgIGF2YWlsYWJsZTogdHJ1ZSxcclxuICAgICAgICAgICAgdmFsdWU6IGRhdGUuZm9ybWF0KCdZWVlZJyksXHJcbiAgICAgICAgICAgIGlzU2VsZWN0ZWQ6IHNlbGVjdGVkRGF0ZSA/IHNlbGVjdGVkRGF0ZS5mb3JtYXQoJ1lZWVknKSA9PT0gZGF0ZS5mb3JtYXQoJ1lZWVknKSA6IGZhbHNlLFxyXG4gICAgICAgICAgICBkYXRlOiBkYXRlLmNsb25lKClcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbGV0IGNvcHlEYXRlRW5kID0gZGF0ZS5jbG9uZSgpO1xyXG4gICAgICAgIHdoaWxlIChlbmQgPD0gMTAgJiYgZW5kID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBjdXIgPSBjb3B5RGF0ZUVuZC5hZGQoMSwgJ3llYXInKTtcclxuICAgICAgICAgICAgeWVhcnMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBhdmFpbGFibGU6IGVuZCA+IDEsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogY3VyLmZvcm1hdCgnWVlZWScpLFxyXG4gICAgICAgICAgICAgICAgaXNTZWxlY3RlZDogc2VsZWN0ZWREYXRlID8gc2VsZWN0ZWREYXRlLmZvcm1hdCgnWVlZWScpID09PSBjdXIuZm9ybWF0KCdZWVlZJykgOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGRhdGU6IGN1ci5jbG9uZSgpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBlbmQtLTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB5ZWFycy5zb3J0KChhLCBiKSA9PiB7IHJldHVybiAoK2EudmFsdWUgLSArYi52YWx1ZSk7IH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5p6E5bu65b2T5YmN5bm05Lu955qE5YWo6YOo5pyI5Lu9XHJcbiAgICAgKiBAcGFyYW0gc2VsZWN0ZWREYXRlIOW9k+WJjemAieS4reeahOaXpeacn1xyXG4gICAgICovXHJcbiAgICBidWlsZE1vbnRoc1BhbmVsKGRhdGU6IG1vbWVudF8uTW9tZW50LCBzZWxlY3RlZERhdGU6IG1vbWVudF8uTW9tZW50KTogQXJyYXk8TW9udGhEYXRhPiB7XHJcbiAgICAgICAgbGV0IG0gPSBtb21lbnQubW9udGhzU2hvcnQoKTtcclxuICAgICAgICBsZXQgbW9udGhzOiBBcnJheTxNb250aERhdGE+ID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIG1vbnRocy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGF2YWlsYWJsZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBtW2ldLFxyXG4gICAgICAgICAgICAgICAgaXNTZWxlY3RlZDogc2VsZWN0ZWREYXRlID8gbVtpXSA9PT0gc2VsZWN0ZWREYXRlLmZvcm1hdCgnTU1NJykgOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGRhdGU6IG1vbWVudChkYXRlLmZvcm1hdCgnWVlZWScpICsgbVtpXSArIGRhdGUuZm9ybWF0KCdERCcpLCAnWVlZWU1NTUREJylcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBtb250aHM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmoLnmja7kvKDlhaXnmoTml6XmnJ/mnoTlu7rlvZPliY3mmL7npLrml6XljobpnaLmnb/vvIjlvZPliY3ov5nkuKrmnIjnmoTlpKnmlbDpnaLmnb/vvInjgIJcclxuICAgICAqIOS+i+Wmgu+8muS8oOWFpeaXpeacn+S4ujIwMjAvMDgvMjDvvIzliJnov5Tlm57kuIDkuKpEYXlEYXRhUGVyTW9udGjmlbDnu4TvvIxcclxuICAgICAqIOWFtuS4reeahHZhbHVl56S65L6L5aaC5LiLOlxyXG4gICAgICogXHJcbiAgICAgKiBbJ+aXpScsICfkuIAnLCAn5LqMJywgJ+S4iScsICflm5snLCAn5LqUJywgJ+WFrScsIFxyXG4gICAgICogXHJcbiAgICAgKiAgJzI2JywgJzI3JywgJzI4JywgJzI5JywgJzMwJywgJzMxJywgJzEnLCBcclxuICAgICAqIFxyXG4gICAgICogICcyJywgICczJywgICc0JywgICc1JywgICc2JywgICc3JywgICc4JyxcclxuICAgICAqIFxyXG4gICAgICogICc5JywgICcxMCcsICcxMScsICcxMicsICcxMycsICcxNCcsICcxNScsXHJcbiAgICAgKiBcclxuICAgICAqICAnMTYnLCAnMTcnLCAnMTgnLCAnMTknLCAnMjAnLCAnMjEnLCAnMjInLFxyXG4gICAgICogXHJcbiAgICAgKiAgJzIzJywgJzI0JywgJzI1JywgJzI2JywgJzI3JywgJzI4JywgJzI5JyxcclxuICAgICAqIFxyXG4gICAgICogICczMCcsICczMScsICAnMScsICAnMicsICAnMycsICAnNCcsICAnNSddXHJcbiAgICAgKiBAcGFyYW0gZGF0ZSDmnoTlu7rml6XmnJ/pnaLmnb/nmoTml6XmnJ9cclxuICAgICAqIEBwYXJhbSBzZWxlY3RlZERhdGUg5b2T5YmN6YCJ5Lit55qE5pel5pyfXHJcbiAgICAgKiBAcGFyYW0gaXNSYW5nZVBpY2tlciDmmK/lkKbmmK/ml7bpl7TljLrpl7TpgInmi6lcclxuICAgICAqIEBwYXJhbSBkYXRlcyDlvZNpc1JhbmdlUGlja2Vy5Li6dHJ1ZeaXtu+8jOmcgOimgeS8oOWFpeatpOaXtumXtOWMuumXtOWtl+aute+8jOS7o+ihqOaXtumXtOWMuumXtOW3sumAieaLqeeahOWMuumXtOWAvFxyXG4gICAgICovXHJcbiAgICBidWlsZERheXNQYW5lbChkYXRlOiBtb21lbnRfLk1vbWVudCwgc2VsZWN0ZWREYXRlOiBtb21lbnRfLk1vbWVudCk6IEFycmF5PERheURhdGFQZXJNb250aD4ge1xyXG4gICAgICAgIGNvbnN0IHRvdGFsID0gNDk7XHJcbiAgICAgICAgbGV0IGRheXM6IEFycmF5PERheURhdGFQZXJNb250aD4gPSBbXTtcclxuICAgICAgICBsZXQgY29weURhdGUgPSBkYXRlLmNsb25lKCk7XHJcbiAgICAgICAgbGV0IHdlZWtkYXlzTWluID0gdGhpcy5nZXRXZWVrZGF5c01pbigpO1xyXG4gICAgICAgIHdlZWtkYXlzTWluLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIGRheXMucHVzaCh7IGF2YWlsYWJsZTogZmFsc2UsIHZhbHVlOiBpdGVtLCBpc1NlbGVjdGVkOiBmYWxzZSwgaXNXZWVrRGF5TWluOiB0cnVlLCBkYXRlOiBudWxsIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsZXQgc3RhcnRPZk1vbnRoID0gY29weURhdGUuY2xvbmUoKS5zdGFydE9mKCdtb250aCcpO1xyXG4gICAgICAgIHN0YXJ0T2ZNb250aCA9IG1vbWVudChzdGFydE9mTW9udGguZm9ybWF0KERBVEVfRk9STUFUKSArICcgJyArIGNvcHlEYXRlLmZvcm1hdChUSU1FX0ZPUk1BVCkpO1xyXG4gICAgICAgIC8vIOiOt+WPluW9k+aciOesrOS4gOWkqeaYr+WRqOWHoO+8jOWmgjIwMjAvMDgvMDHmmK/lkajlha3vvIzliJnlvpfliLDnmoTmmK/igJzlha3igJ1cclxuICAgICAgICBsZXQgd2Vla0RheU1pbl9zdGFydE9mTW9udGggPSB3ZWVrZGF5c01pblsrc3RhcnRPZk1vbnRoLndlZWtkYXkoKSArIDFdO1xyXG4gICAgICAgIGxldCBpbmRleF93ZWVrRGF5TWluX3N0YXJ0T2ZNb250aCA9IHdlZWtkYXlzTWluLmluZGV4T2Yod2Vla0RheU1pbl9zdGFydE9mTW9udGgpO1xyXG4gICAgICAgIC8vIOa3u+WKoOS4iuaciOWQjuWHoOWkqeeUqOS7peihpei2s+W9k+WJjemdouadv1xyXG4gICAgICAgIHdoaWxlIChpbmRleF93ZWVrRGF5TWluX3N0YXJ0T2ZNb250aCA+IDApIHtcclxuICAgICAgICAgICAgZGF5cy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGF2YWlsYWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogc3RhcnRPZk1vbnRoLmNsb25lKCkuYWRkKC1pbmRleF93ZWVrRGF5TWluX3N0YXJ0T2ZNb250aCwgJ2RheScpLmZvcm1hdCgnRCcpLFxyXG4gICAgICAgICAgICAgICAgaXNTZWxlY3RlZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBpc1dlZWtEYXlNaW46IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgZGF0ZTogc3RhcnRPZk1vbnRoLmNsb25lKCkuYWRkKC1pbmRleF93ZWVrRGF5TWluX3N0YXJ0T2ZNb250aCwgJ2RheScpLmNsb25lKClcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGluZGV4X3dlZWtEYXlNaW5fc3RhcnRPZk1vbnRoLS07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgbGFzdE9mTW9udGggPSBjb3B5RGF0ZS5jbG9uZSgpLmVuZE9mKCdtb250aCcpO1xyXG4gICAgICAgIGxhc3RPZk1vbnRoID0gbW9tZW50KGxhc3RPZk1vbnRoLmZvcm1hdChEQVRFX0ZPUk1BVCkgKyAnICcgKyBjb3B5RGF0ZS5mb3JtYXQoVElNRV9GT1JNQVQpKTtcclxuICAgICAgICAvLyDojrflj5blvZPmnIjmnIDlkI7lpKnmmK/lkajlh6DvvIzlpoIyMDIwLzA4LzMx5piv5ZGo5LiA77yM5YiZ5b6X5Yiw55qE5piv4oCc5LiA4oCdXHJcbiAgICAgICAgLy8g5re75Yqg5b2T5pyI5Yiw5b2T5YmN6Z2i5p2/5pWw57uEXHJcbiAgICAgICAgd2hpbGUgKHN0YXJ0T2ZNb250aCA8PSBsYXN0T2ZNb250aCkge1xyXG4gICAgICAgICAgICBkYXlzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IHN0YXJ0T2ZNb250aC5mb3JtYXQoJ0QnKSxcclxuICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWQ6IHNlbGVjdGVkRGF0ZSA/IHN0YXJ0T2ZNb250aC5mb3JtYXQoREFURV9GT1JNQVQpID09PSBzZWxlY3RlZERhdGUuZm9ybWF0KERBVEVfRk9STUFUKSA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgaXNXZWVrRGF5TWluOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGRhdGU6IHN0YXJ0T2ZNb250aC5jbG9uZSgpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBzdGFydE9mTW9udGggPSBzdGFydE9mTW9udGguYWRkKDEsICdkYXknKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIOa3u+WKoOS4i+aciOWJjeWHoOWkqeeUqOS7peihpei2s+W9k+WJjemdouadv1xyXG4gICAgICAgIGxldCBpID0gMTtcclxuICAgICAgICB3aGlsZSAoZGF5cy5sZW5ndGggPCB0b3RhbCkge1xyXG4gICAgICAgICAgICBkYXlzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBsYXN0T2ZNb250aC5jbG9uZSgpLmFkZChpLCAnZGF5JykuZm9ybWF0KCdEJyksXHJcbiAgICAgICAgICAgICAgICBpc1NlbGVjdGVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGlzV2Vla0RheU1pbjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBkYXRlOiBsYXN0T2ZNb250aC5jbG9uZSgpLmFkZChpLCAnZGF5JykuY2xvbmUoKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGRheXM7XHJcbiAgICB9XHJcblxyXG4gICAgc29ydERhdGVzKGRhdGVzOiBBcnJheTxtb21lbnRfLk1vbWVudD4sIGFzYzogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgICAgICByZXR1cm4gZGF0ZXMuc29ydCgoYSwgYikgPT4gYXNjID8gYS5kaWZmKGIpIDogYi5kaWZmKGEpKTtcclxuICAgIH1cclxuXHJcbiAgICBidWlsZFN0YXJ0QW5kRW5kRGF0ZXMoc0RhdGU6IG1vbWVudF8uTW9tZW50LCBlRGF0ZTogbW9tZW50Xy5Nb21lbnQpIHtcclxuICAgICAgICBpZiAoIXNEYXRlIHx8ICFlRGF0ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobW9tZW50KHNEYXRlKSA8IG1vbWVudChlRGF0ZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtzRGF0ZSwgZURhdGVdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFtlRGF0ZSwgc0RhdGVdO1xyXG4gICAgfVxyXG5cclxuICAgIGRheShkYXRlOiBtb21lbnRfLk1vbWVudCkge1xyXG4gICAgICAgIGlmIChkYXRlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBtb21lbnQoZGF0ZS5mb3JtYXQoREFURV9GT1JNQVQgKyAnIDAwOjAwOjAwJyksICdZWVlZLU1NLUREJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbW9tZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXREYXlTdGF0dXMoY3VycmVudERhdGU6IG1vbWVudF8uTW9tZW50LCBob3ZlckRhdGU6IG1vbWVudF8uTW9tZW50LCBkYXRlczogQXJyYXk8bW9tZW50Xy5Nb21lbnQ+ID0gW10pOiBEYXlTdGF0dXNGb3JSYW5nZVBpY2tlciB7XHJcbiAgICAgICAgaWYgKCFkYXRlcyB8fCBkYXRlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuICdub3JtYWwnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZGF5ID0gKGRhdGU6IG1vbWVudF8uTW9tZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChkYXRlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9tZW50KGRhdGUuZm9ybWF0KERBVEVfRk9STUFUICsgJyAwMDowMDowMCcpLCAnWVlZWS1NTS1ERCcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbW9tZW50KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgc29ydGVkRGF0ZXMgPSB0aGlzLnNvcnREYXRlcyhbaG92ZXJEYXRlLCAuLi5kYXRlc10pO1xyXG4gICAgICAgIGlmIChjdXJyZW50RGF0ZSA8IHNvcnRlZERhdGVzWzBdIHx8IGN1cnJlbnREYXRlID4gc29ydGVkRGF0ZXNbMl0pIHtcclxuICAgICAgICAgICAgcmV0dXJuICdub3JtYWwnIGFzIERheVN0YXR1c0ZvclJhbmdlUGlja2VyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGRheShob3ZlckRhdGUpLmRpZmYoZGF0ZXNbMF0pIDwgMCkge1xyXG4gICAgICAgICAgICBpZiAoZGF5KGN1cnJlbnREYXRlKS5kaWZmKGRheShob3ZlckRhdGUpKSA8IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnbm9ybWFsJztcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChkYXkoY3VycmVudERhdGUpLmRpZmYoaG92ZXJEYXRlKSA+PSAwICYmIGRheShjdXJyZW50RGF0ZSkuZGlmZihkYXRlc1swXSkgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3dpdGhpbi1ob3Zlcic7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF5KGN1cnJlbnREYXRlKS5kaWZmKGRhdGVzWzBdKSA+PSAwICYmIGRheShjdXJyZW50RGF0ZSkuZGlmZihkYXRlc1sxXSkgPD0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICd3aXRoaW4tc2VsZWN0ZWQnO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRheShjdXJyZW50RGF0ZSkuZGlmZihkYXRlc1sxXSkgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ25vcm1hbCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChkYXkoaG92ZXJEYXRlKS5kaWZmKGRhdGVzWzBdKSA+PSAwICYmIGRheShob3ZlckRhdGUpLmRpZmYoZGF0ZXNbMV0pIDw9IDApIHtcclxuICAgICAgICAgICAgaWYgKGRheShjdXJyZW50RGF0ZSkuZGlmZihkYXkoZGF0ZXNbMF0pKSA8IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnbm9ybWFsJztcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChkYXkoY3VycmVudERhdGUpLmRpZmYoZGF0ZXNbMF0pID49IDAgJiYgZGF5KGN1cnJlbnREYXRlKS5kaWZmKGhvdmVyRGF0ZSkgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3dpdGhpbi1zZWxlY3RlZC1ob3Zlcic7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF5KGN1cnJlbnREYXRlKS5kaWZmKGhvdmVyRGF0ZSkgPj0gMCAmJiBkYXkoY3VycmVudERhdGUpLmRpZmYoZGF0ZXNbMV0pIDw9IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnd2l0aGluLXNlbGVjdGVkJztcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChkYXkoY3VycmVudERhdGUpLmRpZmYoZGF0ZXNbMV0pID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdub3JtYWwnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZGF5KGhvdmVyRGF0ZSkuZGlmZihkYXRlc1sxXSkgPiAwKSB7XHJcbiAgICAgICAgICAgIGlmIChkYXkoY3VycmVudERhdGUpLmRpZmYoZGF5KGRhdGVzWzBdKSkgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ25vcm1hbCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF5KGN1cnJlbnREYXRlKS5kaWZmKGRhdGVzWzBdKSA+PSAwICYmIGRheShjdXJyZW50RGF0ZSkuZGlmZihkYXRlc1sxXSkgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3dpdGhpbi1zZWxlY3RlZCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF5KGN1cnJlbnREYXRlKS5kaWZmKGRhdGVzWzFdKSA+PSAwICYmIGRheShjdXJyZW50RGF0ZSkuZGlmZihob3ZlckRhdGUpIDw9IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnd2l0aGluLWhvdmVyJztcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChkYXkoY3VycmVudERhdGUpLmRpZmYoaG92ZXJEYXRlKSA+IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnbm9ybWFsJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuICdub3JtYWwnIGFzIERheVN0YXR1c0ZvclJhbmdlUGlja2VyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5p6E5bu65pe26Ze05Yy66Ze06YCJ5oup5b2T6byg5qCHaG92ZXLpnaLmnb/ml7bnmoTnirbmgIHvvIzlkIxidWlsZERheXNQYW5lbOeahOWKn+iDve+8jFxyXG4gICAgICog5aKe5Yqg5a+56LGhRGF5RGF0YVBlck1vbnRo5Lit5a+55a2X5q61aXNXaXRoaW5EYXRlUmFuZ2VIb3ZlcueahOWAvOeahOWMuuWIhuOAglxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gZGF0ZSDmnoTlu7rml6XmnJ/pnaLmnb/nmoTml6XmnJ9cclxuICAgICAqIEBwYXJhbSBzZWxlY3RlZERhdGUg5b2T5YmN6YCJ5Lit55qE5pel5pyfXHJcbiAgICAgKiBAcGFyYW0gaG92ZXJEYXRlIOW9k+WJjWhvdmVy55qE5pe26Ze0bW9tZW505YC8XHJcbiAgICAgKiBAcGFyYW0gZGF0ZXMg6ZyA6KaB5Lyg5YWl5q2k5pe26Ze05Yy66Ze05a2X5q6177yM5Luj6KGo5pe26Ze05Yy66Ze05bey6YCJ5oup55qE5Yy66Ze05YC8XHJcbiAgICAgKi9cclxuICAgIGJ1aWxkRGF5c1BhbmVsRm9yUmFuZ2VQaWNrZXIoZGF0ZTogbW9tZW50Xy5Nb21lbnQsIHNlbGVjdGVkRGF0ZTogbW9tZW50Xy5Nb21lbnQsXHJcbiAgICAgICAgaG92ZXJEYXRlOiBtb21lbnRfLk1vbWVudCwgZGF0ZXM6IEFycmF5PG1vbWVudF8uTW9tZW50PiA9IFtdKSB7XHJcbiAgICAgICAgY29uc3QgdG90YWwgPSA0OTtcclxuICAgICAgICBsZXQgZGF5czogQXJyYXk8RGF5RGF0YVBlck1vbnRoPiA9IFtdO1xyXG4gICAgICAgIGxldCBjb3B5RGF0ZSA9IGRhdGUuY2xvbmUoKTtcclxuICAgICAgICBsZXQgd2Vla2RheXNNaW4gPSB0aGlzLmdldFdlZWtkYXlzTWluKCk7XHJcbiAgICAgICAgd2Vla2RheXNNaW4uZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgZGF5cy5wdXNoKHsgYXZhaWxhYmxlOiBmYWxzZSwgdmFsdWU6IGl0ZW0sIGlzU2VsZWN0ZWQ6IGZhbHNlLCBpc1dlZWtEYXlNaW46IHRydWUsIGRhdGU6IG51bGwsIGhvdmVyRGF0ZVR5cGU6ICdub3JtYWwnIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsZXQgc3RhcnRPZk1vbnRoID0gY29weURhdGUuY2xvbmUoKS5zdGFydE9mKCdtb250aCcpO1xyXG4gICAgICAgIHN0YXJ0T2ZNb250aCA9IG1vbWVudChzdGFydE9mTW9udGguZm9ybWF0KERBVEVfRk9STUFUKSArICcgJyArIGNvcHlEYXRlLmZvcm1hdChUSU1FX0ZPUk1BVCkpO1xyXG4gICAgICAgIC8vIOiOt+WPluW9k+aciOesrOS4gOWkqeaYr+WRqOWHoO+8jOWmgjIwMjAvMDgvMDHmmK/lkajlha3vvIzliJnlvpfliLDnmoTmmK/igJzlha3igJ1cclxuICAgICAgICBsZXQgd2Vla0RheU1pbl9zdGFydE9mTW9udGggPSB3ZWVrZGF5c01pblsrc3RhcnRPZk1vbnRoLndlZWtkYXkoKSArIDFdO1xyXG4gICAgICAgIGxldCBpbmRleF93ZWVrRGF5TWluX3N0YXJ0T2ZNb250aCA9IHdlZWtkYXlzTWluLmluZGV4T2Yod2Vla0RheU1pbl9zdGFydE9mTW9udGgpO1xyXG4gICAgICAgIC8vIOa3u+WKoOS4iuaciOWQjuWHoOWkqeeUqOS7peihpei2s+W9k+WJjemdouadv1xyXG4gICAgICAgIHdoaWxlIChpbmRleF93ZWVrRGF5TWluX3N0YXJ0T2ZNb250aCA+IDApIHtcclxuICAgICAgICAgICAgbGV0IGNEYXRlID0gc3RhcnRPZk1vbnRoLmNsb25lKCkuYWRkKC1pbmRleF93ZWVrRGF5TWluX3N0YXJ0T2ZNb250aCwgJ2RheScpLmNsb25lKCk7XHJcbiAgICAgICAgICAgIGRheXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBhdmFpbGFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IGNEYXRlLmZvcm1hdCgnRCcpLFxyXG4gICAgICAgICAgICAgICAgaXNTZWxlY3RlZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBpc1dlZWtEYXlNaW46IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgZGF0ZTogY0RhdGUsXHJcbiAgICAgICAgICAgICAgICBob3ZlckRhdGVUeXBlOiB0aGlzLmdldERheVN0YXR1cyhjRGF0ZSwgaG92ZXJEYXRlLCBkYXRlcylcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGluZGV4X3dlZWtEYXlNaW5fc3RhcnRPZk1vbnRoLS07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgbGFzdE9mTW9udGggPSBjb3B5RGF0ZS5jbG9uZSgpLmVuZE9mKCdtb250aCcpO1xyXG4gICAgICAgIGxhc3RPZk1vbnRoID0gbW9tZW50KGxhc3RPZk1vbnRoLmZvcm1hdChEQVRFX0ZPUk1BVCkgKyAnICcgKyBjb3B5RGF0ZS5mb3JtYXQoVElNRV9GT1JNQVQpKTtcclxuICAgICAgICAvLyDojrflj5blvZPmnIjmnIDlkI7lpKnmmK/lkajlh6DvvIzlpoIyMDIwLzA4LzMx5piv5ZGo5LiA77yM5YiZ5b6X5Yiw55qE5piv4oCc5LiA4oCdXHJcbiAgICAgICAgLy8g5re75Yqg5b2T5pyI5Yiw5b2T5YmN6Z2i5p2/5pWw57uEXHJcbiAgICAgICAgd2hpbGUgKHN0YXJ0T2ZNb250aCA8PSBsYXN0T2ZNb250aCkge1xyXG4gICAgICAgICAgICBkYXlzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IHN0YXJ0T2ZNb250aC5mb3JtYXQoJ0QnKSxcclxuICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWQ6IHNlbGVjdGVkRGF0ZSA/IHN0YXJ0T2ZNb250aC5mb3JtYXQoREFURV9GT1JNQVQpID09PSBzZWxlY3RlZERhdGUuZm9ybWF0KERBVEVfRk9STUFUKSA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgaXNXZWVrRGF5TWluOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGRhdGU6IHN0YXJ0T2ZNb250aC5jbG9uZSgpLFxyXG4gICAgICAgICAgICAgICAgaG92ZXJEYXRlVHlwZTogdGhpcy5nZXREYXlTdGF0dXMoc3RhcnRPZk1vbnRoLmNsb25lKCksIGhvdmVyRGF0ZSwgZGF0ZXMpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBzdGFydE9mTW9udGggPSBzdGFydE9mTW9udGguYWRkKDEsICdkYXknKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIOa3u+WKoOS4i+aciOWJjeWHoOWkqeeUqOS7peihpei2s+W9k+WJjemdouadv1xyXG4gICAgICAgIGxldCBpID0gMTtcclxuICAgICAgICB3aGlsZSAoZGF5cy5sZW5ndGggPCB0b3RhbCkge1xyXG4gICAgICAgICAgICBsZXQgY0RhdGUgPSBsYXN0T2ZNb250aC5jbG9uZSgpLmFkZChpLCAnZGF5JykuY2xvbmUoKTtcclxuICAgICAgICAgICAgZGF5cy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGF2YWlsYWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogY0RhdGUuZm9ybWF0KCdEJyksXHJcbiAgICAgICAgICAgICAgICBpc1NlbGVjdGVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGlzV2Vla0RheU1pbjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBkYXRlOiBjRGF0ZS5jbG9uZSgpLFxyXG4gICAgICAgICAgICAgICAgaG92ZXJEYXRlVHlwZTogdGhpcy5nZXREYXlTdGF0dXMoY0RhdGUsIGhvdmVyRGF0ZSwgZGF0ZXMpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpKys7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZGF5cztcclxuICAgIH1cclxuXHJcbiAgICBnZXRXZWVrZGF5c01pbigpIHtcclxuICAgICAgICByZXR1cm4gbW9tZW50LndlZWtkYXlzTWluKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0T3ZlcmxheVJlZihlbGVtZW50UmVmOiBFbGVtZW50UmVmKTogT3ZlcmxheVJlZiB7XHJcbiAgICAgICAgY29uc3QgcG9wdXBQb3NpdGlvbnM6IENvbm5lY3RlZFBvc2l0aW9uW10gPSBbe1xyXG4gICAgICAgICAgICBvcmlnaW5YOiBcInN0YXJ0XCIsXHJcbiAgICAgICAgICAgIG9yaWdpblk6IFwiYm90dG9tXCIsXHJcbiAgICAgICAgICAgIG92ZXJsYXlYOiBcInN0YXJ0XCIsXHJcbiAgICAgICAgICAgIG92ZXJsYXlZOiBcInRvcFwiLFxyXG4gICAgICAgICAgICBvZmZzZXRYOiAwLFxyXG4gICAgICAgICAgICBvZmZzZXRZOiAxXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgICBvcmlnaW5YOiBcInN0YXJ0XCIsXHJcbiAgICAgICAgICAgIG9yaWdpblk6IFwidG9wXCIsXHJcbiAgICAgICAgICAgIG92ZXJsYXlYOiBcInN0YXJ0XCIsXHJcbiAgICAgICAgICAgIG92ZXJsYXlZOiBcImJvdHRvbVwiLFxyXG4gICAgICAgICAgICBvZmZzZXRYOiAwLFxyXG4gICAgICAgICAgICBvZmZzZXRZOiAtMVxyXG4gICAgICAgIH1dO1xyXG5cclxuICAgICAgICBjb25zdCBwb3NpdGlvblN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5UG9zaXRpb25CdWlsZGVyXHJcbiAgICAgICAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKGVsZW1lbnRSZWYpXHJcbiAgICAgICAgICAgIC53aXRoUG9zaXRpb25zKHBvcHVwUG9zaXRpb25zKTtcclxuXHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLm92ZXJsYXkuY3JlYXRlKHtcclxuICAgICAgICAgICAgcG9zaXRpb25TdHJhdGVneSxcclxuICAgICAgICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXHJcbiAgICAgICAgICAgIGJhY2tkcm9wQ2xhc3M6ICdjZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcCcsXHJcbiAgICAgICAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLm92ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5ub29wKClcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKirojrflj5ZjYWxlbmRhcuaXtumXtO+8jOS+i+WmguS7iuWkqe+8jOaYqOWkqe+8jOaYjuWkqeetiSAqL1xyXG4gICAgY2FsZW5kYXIoZGF0ZTogbW9tZW50Xy5Nb21lbnQsIGxvY2FsZTogRGF0ZVBpY2tlckxvY2FsZSA9ICd6aC1jbicpIHtcclxuICAgICAgICBsZXQgY2FsZW5kYXJEYXRlID0gJyc7XHJcbiAgICAgICAgc3dpdGNoIChsb2NhbGUpIHtcclxuICAgICAgICAgICAgY2FzZSAnemgtY24nOlxyXG4gICAgICAgICAgICAgICAgY2FsZW5kYXJEYXRlID0gZGF0ZS5jYWxlbmRhcih7XHJcbiAgICAgICAgICAgICAgICAgICAgc2FtZURheTogJ1vku4rlpKldJyxcclxuICAgICAgICAgICAgICAgICAgICBuZXh0RGF5OiAnW+aYjuWkqV0nLFxyXG4gICAgICAgICAgICAgICAgICAgIG5leHRXZWVrOiAnZGRkZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgbGFzdERheTogJ1vmmKjlpKldJyxcclxuICAgICAgICAgICAgICAgICAgICBsYXN0V2VlazogJ1vkuIpdIGRkZGQnLFxyXG4gICAgICAgICAgICAgICAgICAgIHNhbWVFbHNlOiAnREQvTU0vWVlZWSdcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ2VuJzpcclxuICAgICAgICAgICAgICAgIGNhbGVuZGFyRGF0ZSA9IGRhdGUuY2FsZW5kYXIoe1xyXG4gICAgICAgICAgICAgICAgICAgIHNhbWVEYXk6ICdbVG9kYXldJyxcclxuICAgICAgICAgICAgICAgICAgICBuZXh0RGF5OiAnW1RvbW9ycm93XScsXHJcbiAgICAgICAgICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkJyxcclxuICAgICAgICAgICAgICAgICAgICBsYXN0RGF5OiAnW1llc3RlcmRheV0nLFxyXG4gICAgICAgICAgICAgICAgICAgIGxhc3RXZWVrOiAnW0xhc3RdIGRkZGQnLFxyXG4gICAgICAgICAgICAgICAgICAgIHNhbWVFbHNlOiAnREQvTU0vWVlZWSdcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBjYWxlbmRhckRhdGUgPSBkYXRlLmNhbGVuZGFyKHtcclxuICAgICAgICAgICAgICAgICAgICBzYW1lRGF5OiAnW+S7iuWkqV0nLFxyXG4gICAgICAgICAgICAgICAgICAgIG5leHREYXk6ICdb5piO5aSpXScsXHJcbiAgICAgICAgICAgICAgICAgICAgbmV4dFdlZWs6ICdkZGRkJyxcclxuICAgICAgICAgICAgICAgICAgICBsYXN0RGF5OiAnW+aYqOWkqV0nLFxyXG4gICAgICAgICAgICAgICAgICAgIGxhc3RXZWVrOiAnW+S4il0gZGRkZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgc2FtZUVsc2U6ICdERC9NTS9ZWVlZJ1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjYWxlbmRhckRhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgaXNWYWxpZChkYXRlOiBtb21lbnRfLk1vbWVudCB8IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiBkYXRlICYmIG1vbWVudChkYXRlKS5pc1ZhbGlkKCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZURhdGEge1xyXG4gICAgLyoq5piv5ZCm5Y+v6YCJICovXHJcbiAgICBhdmFpbGFibGU6IGJvb2xlYW47XHJcbiAgICAvKirlvZPliY3lgLwgKi9cclxuICAgIHZhbHVlOiBzdHJpbmc7XHJcbiAgICAvKirlvZPliY3mmK/lkKbpgInkuK0gKi9cclxuICAgIGlzU2VsZWN0ZWQ6IGJvb2xlYW47XHJcbiAgICAvKirlvZPliY3ml6XmnJ8gKi9cclxuICAgIGRhdGU6IG1vbWVudF8uTW9tZW50O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERheURhdGFQZXJNb250aCBleHRlbmRzIERhdGVEYXRhIHtcclxuICAgIC8qKuaYr+WQpuaYr+esrOS4gOihjOeahOWRqCAqL1xyXG4gICAgaXNXZWVrRGF5TWluOiBib29sZWFuO1xyXG4gICAgLyoq5b2TZGF0ZXBpY2tlcnR5cGXkuLpkYXRlLXJhbmdlLXBpY2tlcueahOaXtuWAme+8jOm8oOagh2hvdmVy5ZCO5Zyo5YCZ6YCJ5pe26Ze05Yy66Ze055qE5YiZ5Li6dHJ1Ze+8jOWQpuWImWZhbHNlICovXHJcbiAgICBob3ZlckRhdGVUeXBlPzogRGF5U3RhdHVzRm9yUmFuZ2VQaWNrZXI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiDljLrpl7Tml7bpl7TpgInmi6nlnKjmiYDmnInml6XmnJ/lpKnmlbDpnaLmnb/nmoTnirbmgIHlj4rlr7nlupTmoLflvI9cclxuICogXHJcbiAqIG5vcm1hbCAtIOato+W4uOaXpeacn+WkqeaVsCDml6Dpop3lpJbmoLflvI9cclxuICogXHJcbiAqIHdpdGhpbi1ob3ZlciAtIOWcqGhvdmVy55qE5pe26Ze05Yy66Ze06YeM6Z2iIOacieiZmue6v+i+ueahhlxyXG4gKiBcclxuICogd2l0aGluLXNlbGVjdGVkIC0g5Zyo5bey6YCJ55qE5pe26Ze05Yy66Ze06YeM6Z2iIOacieiDjOaZr+iJslxyXG4gKiBcclxuICogd2l0aGluLXNlbGVjdGVkLWhvdmVyIC0g5Zyo5bey6YCJ55qE5pe26Ze05Yy66Ze06YeM6Z2i6KKraG92ZXIg5Yqg5rex6IOM5pmv6ImyXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBEYXlTdGF0dXNGb3JSYW5nZVBpY2tlciA9ICdub3JtYWwnIHwgJ3dpdGhpbi1ob3ZlcicgfCAnd2l0aGluLXNlbGVjdGVkJyB8ICd3aXRoaW4tc2VsZWN0ZWQtaG92ZXInO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBZZWFyRGF0YSBleHRlbmRzIERhdGVEYXRhIHsgfVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNb250aERhdGEgZXh0ZW5kcyBEYXRlRGF0YSB7IH0iXX0=