@indra2341/ionic4-datepicker
Version:
ionic4-datepicker inspired by rajeshwar patlolla ionic1 datepicker
787 lines • 90.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/ionic4-datepicker-modal/ionic4-datepicker-modal.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, ViewChild } from "@angular/core";
import { NavParams, ModalController, IonContent } from "@ionic/angular";
import * as moment_ from "moment";
import { Ionic4DatepickerService } from "../ionic4-datepicker.service";
/** @type {?} */
var moment = moment_;
var Ionic4DatepickerModalComponent = /** @class */ (function () {
function Ionic4DatepickerModalComponent(navParams, modalCtrl, datePickerService) {
this.navParams = navParams;
this.modalCtrl = modalCtrl;
this.datePickerService = datePickerService;
// inputs
this.mainObj = {};
this.selectedDate = {};
// component variables
this.selctedDateEpoch = 0;
this.disabledDates = [];
this.highlightedDates = {};
this.disableWeekdays = [];
this.data = {
currentMonth: "",
currentYear: "",
currentMonthSelected: ""
};
this.rows = [0, 7, 14, 21, 28, 35];
this.cols = [0, 1, 2, 3, 4, 5, 6];
this.monthsList = ["Jan", "Feb", "March", "April", "May", "June", "July", "Aug", "Sept", "Oct", "Nov", "Dec"];
this.weeksList = ["S", "M", "T", "W", "T", "F", "S"];
this.yearsList = [];
this.daysList = [];
this.yearInAscending = false;
this.momentLocale = "en-US";
// month year scroll variables
this.isMonthYearSelectorOpen = false;
this.scrollingMonthOrYearArray = [];
this.isSelectedDateFound = false;
this.today = this.resetHMSM(new Date()).getTime();
if (this.navParams.get("selectedDate")) {
// console.log('Selected date =>', this.navParams.get('selectedDate'));
this.selectedDate.date = this.navParams.get("selectedDate");
this.isSelectedDateFound = true;
}
this.mainObj = this.initDatePickerObj(this.navParams.get("objConfig"));
}
/**
* @return {?}
*/
Ionic4DatepickerModalComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.datePickerService.isModalOpen = true;
this.initDatePicker();
};
/**
* @return {?}
*/
Ionic4DatepickerModalComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.datePickerService.isModalOpen = false;
};
// Reset the hours, minutes, seconds and milli seconds
// Reset the hours, minutes, seconds and milli seconds
/**
* @param {?} currentDate
* @return {?}
*/
Ionic4DatepickerModalComponent.prototype.resetHMSM =
// Reset the hours, minutes, seconds and milli seconds
/**
* @param {?} currentDate
* @return {?}
*/
function (currentDate) {
currentDate.setHours(0);
currentDate.setMinutes(0);
currentDate.setSeconds(0);
currentDate.setMilliseconds(0);
return currentDate;
};
// this method change month or year list to dateList
// this method change month or year list to dateList
/**
* @return {?}
*/
Ionic4DatepickerModalComponent.prototype.changeToDateList =
// this method change month or year list to dateList
/**
* @return {?}
*/
function () {
// console.log('changeToDateList');
this.isMonthYearSelectorOpen = false;
};
// Virtual scroll create for select year and month
// Virtual scroll create for select year and month
/**
* @param {?} isMonthSelect
* @return {?}
*/
Ionic4DatepickerModalComponent.prototype.selectMonthYear =
// Virtual scroll create for select year and month
/**
* @param {?} isMonthSelect
* @return {?}
*/
function (isMonthSelect) {
// console.log('selectMonthYear', i);
this.isMonthYearSelectorOpen = true;
this.isMonthSelect = isMonthSelect;
this.scrollingMonthOrYearArray = isMonthSelect ? this.mainObj.monthsList : this.yearsList;
this.selectedYearOrMonth = isMonthSelect ? this.data.currentMonth : this.data.currentYear;
/** @type {?} */
var index = this.scrollingMonthOrYearArray.indexOf(this.selectedYearOrMonth);
/** @type {?} */
var iditem = index + "list";
setTimeout((/**
* @return {?}
*/
function () {
document.getElementById(iditem).scrollIntoView();
}), 100);
};
// select month or year
// select month or year
/**
* @param {?} monthYear
* @return {?}
*/
Ionic4DatepickerModalComponent.prototype.onChangeMonthYear =
// select month or year
/**
* @param {?} monthYear
* @return {?}
*/
function (monthYear) {
// console.log('onChangeMonthYear', monthYear);
if (monthYear) {
if (this.isMonthSelect) {
this.data.currentMonth = monthYear;
this.selectedYearOrMonth = this.data.currentMonth;
/** @type {?} */
var monthNumber = this.monthsList.indexOf(this.data.currentMonth);
this.currentDate.setDate(1);
this.currentDate.setMonth(monthNumber);
}
else {
this.data.currentYear = monthYear;
this.selectedYearOrMonth = this.data.currentYear;
this.currentDate.setFullYear(this.data.currentYear);
this.refreshDateList(this.currentDate);
}
this.refreshDateList(this.currentDate);
}
this.isMonthYearSelectorOpen = false;
};
// Previous month
// Previous month
/**
* @return {?}
*/
Ionic4DatepickerModalComponent.prototype.prevMonth =
// Previous month
/**
* @return {?}
*/
function () {
// console.log('prevNext', this.currentDate);
/** @type {?} */
var currentMonth = this.currentDate.getMonth();
/** @type {?} */
var currentYear = this.currentDate.getFullYear();
/** @type {?} */
var prevYear = currentYear - 1;
if (!this.yearsList.includes(prevYear) && currentMonth === 0) {
return;
}
if (currentMonth === 1) {
this.currentDate.setFullYear(currentYear);
}
this.currentDate.setMonth(currentMonth - 1);
this.data.currentMonth = this.mainObj.monthsList[currentMonth];
this.data.currentYear = currentYear;
this.refreshDateList(this.currentDate);
// this.changeDaySelected();
};
// Next month
// Next month
/**
* @return {?}
*/
Ionic4DatepickerModalComponent.prototype.nextMonth =
// Next month
/**
* @return {?}
*/
function () {
// console.log('nextNext', this.currentDate);
/** @type {?} */
var currentMonth = this.currentDate.getMonth();
/** @type {?} */
var currentYear = this.currentDate.getFullYear();
/** @type {?} */
var nextYear = currentYear + 1;
if (!this.yearsList.includes(nextYear) && currentMonth === 11) {
return;
}
if (currentMonth === 11) {
this.currentDate.setFullYear(currentYear);
}
this.currentDate.setDate(1);
this.currentDate.setMonth(currentMonth + 1);
this.data.currentMonth = this.mainObj.monthsList[currentMonth];
this.data.currentYear = currentYear;
this.refreshDateList(this.currentDate);
// this.changeDaySelected();
};
// changeDaySelected ( day selection changes )
// changeDaySelected ( day selection changes )
/**
* @return {?}
*/
Ionic4DatepickerModalComponent.prototype.changeDaySelected =
// changeDaySelected ( day selection changes )
/**
* @return {?}
*/
function () {
// console.log('changeDaySelected');
/** @type {?} */
var newSelectedDate = new Date(this.selctedDateEpoch);
newSelectedDate.setMonth(this.currentDate.getMonth());
newSelectedDate.setYear(this.currentDate.getFullYear());
this.selctedDateEpoch = newSelectedDate.getTime();
this.selectedDateString = this.formatDate();
// this.closeModal(this.selctedDateEpoch);
};
// Date selected
// Date selected
/**
* @param {?} selectedDate
* @return {?}
*/
Ionic4DatepickerModalComponent.prototype.dateSelected =
// Date selected
/**
* @param {?} selectedDate
* @return {?}
*/
function (selectedDate) {
// console.log('dateSelected =>', selectedDate);
if (selectedDate && !selectedDate.disabled) {
if (!selectedDate || Object.keys(selectedDate).length === 0) {
return;
}
this.isSelectedDateFound = true;
this.selctedDateEpoch = selectedDate.epoch;
this.selectedDateString = this.formatDate();
if (this.mainObj.closeOnSelect) {
this.closeModal(this.selctedDateEpoch);
}
}
};
// Set today as date for the modal
// Set today as date for the modal
/**
* @return {?}
*/
Ionic4DatepickerModalComponent.prototype.setIonicDatePickerTodayDate =
// Set today as date for the modal
/**
* @return {?}
*/
function () {
// console.log('setIonicDatePickerTodayDate');
/** @type {?} */
var today = new Date(this.today);
/** @type {?} */
var today_obj = {
date: today.getDate(),
month: today.getMonth(),
year: today.getFullYear(),
day: today.getDay(),
epoch: today.getTime(),
disabled: false
};
this.dateSelected(today_obj);
this.refreshDateList(new Date());
this.selctedDateEpoch = this.resetHMSM(today).getTime();
this.selectedDateString = this.formatDate();
// this.closeModal(this.selctedDateEpoch);
};
// Set date for the modal
// Set date for the modal
/**
* @return {?}
*/
Ionic4DatepickerModalComponent.prototype.setIonicDatePickerDate =
// Set date for the modal
/**
* @return {?}
*/
function () {
// console.log('setIonicDatePickerDate');
this.closeModal(this.selctedDateEpoch);
};
// Setting the disabled dates list.
// Setting the disabled dates list.
/**
* @param {?} obj
* @return {?}
*/
Ionic4DatepickerModalComponent.prototype.setDisabledDates =
// Setting the disabled dates list.
/**
* @param {?} obj
* @return {?}
*/
function (obj) {
// console.log('setDisabledDates =>', obj);
if (!obj.disabledDates || obj.disabledDates.length === 0) {
this.disabledDates = [];
}
else {
this.disabledDates = [];
for (var i = 0; i < obj.disabledDates.length; i++) {
// val = resetHMSM(new Date(val));
this.disabledDates.push(this.resetHMSM(new Date(obj.disabledDates[i])).getTime());
}
}
};
// Set hightlighted dates
// Set hightlighted dates
/**
* @param {?} obj
* @return {?}
*/
Ionic4DatepickerModalComponent.prototype.setHightlightedDates =
// Set hightlighted dates
/**
* @param {?} obj
* @return {?}
*/
function (obj) {
if (!obj.highlightedDates || obj.highlightedDates.length === 0) {
this.highlightedDates = {};
}
else {
this.highlightedDates = {};
for (var i = 0; i < obj.highlightedDates.length; i++) {
/** @type {?} */
var hDate = obj.highlightedDates[i].date;
/** @type {?} */
var hColor = obj.highlightedDates[i].color;
/** @type {?} */
var hFontColor = obj.highlightedDates[i].fontColor;
/** @type {?} */
var hDateTime = this.resetHMSM(new Date(hDate)).getTime();
this.highlightedDates[hDateTime] = { color: hColor, fontColor: hFontColor };
}
}
};
// Refresh the list of the dates of a month
// Refresh the list of the dates of a month
/**
* @param {?} currentDate
* @return {?}
*/
Ionic4DatepickerModalComponent.prototype.refreshDateList =
// Refresh the list of the dates of a month
/**
* @param {?} currentDate
* @return {?}
*/
function (currentDate) {
// console.log('refreshDateList =>', currentDate);
currentDate = this.resetHMSM(currentDate);
this.currentDate = currentDate;
/** @type {?} */
var firstDay = new Date(currentDate.getFullYear(), currentDate.getMonth(), 1).getDate();
/** @type {?} */
var lastDay = new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 0).getDate();
this.monthsList = [];
if (this.mainObj.monthsList && this.mainObj.monthsList.length === 12) {
this.monthsList = this.mainObj.monthsList;
}
else {
this.monthsList = this.monthsList;
}
this.yearsList = this.getYearsList(this.mainObj.from, this.mainObj.to);
this.daysList = [];
/** @type {?} */
var tempDate;
/** @type {?} */
var disabled;
this.firstDayEpoch = this.resetHMSM(new Date(currentDate.getFullYear(), currentDate.getMonth(), firstDay)).getTime();
this.lastDayEpoch = this.resetHMSM(new Date(currentDate.getFullYear(), currentDate.getMonth(), lastDay)).getTime();
for (var i = firstDay; i <= lastDay; i++) {
tempDate = new Date(currentDate.getFullYear(), currentDate.getMonth(), i);
disabled = false;
/** @type {?} */
var day = tempDate.getDay();
if (this.disableWeekdays.length > 0) {
if (this.disableWeekdays.indexOf(day) >= 0) {
disabled = this.disableWeekdays.indexOf(day) >= 0;
}
else {
disabled = false;
}
}
if (this.disabledDates.length > 0) {
if (this.disabledDates.indexOf(tempDate.getTime()) >= 0) {
disabled = true;
}
}
if (this.fromDate && !disabled) {
disabled = tempDate.getTime() < this.fromDate || this.mainObj.disableWeekDays.indexOf(tempDate.getDay()) >= 0;
}
if (this.toDate && !disabled) {
disabled = tempDate.getTime() > this.toDate || this.mainObj.disableWeekDays.indexOf(tempDate.getDay()) >= 0;
}
/** @type {?} */
var hightLightDate = this.highlightedDates[tempDate.getTime()];
/** @type {?} */
var fontColor = null;
if (tempDate.getDay() === 0 && this.mainObj.isSundayHighlighted && this.mainObj.isSundayHighlighted.fontColor) {
fontColor = this.mainObj.isSundayHighlighted.fontColor;
}
else if (hightLightDate && hightLightDate.fontColor) {
fontColor = hightLightDate.fontColor;
}
this.daysList.push({
date: tempDate.getDate(),
month: tempDate.getMonth(),
year: tempDate.getFullYear(),
day: tempDate.getDay(),
epoch: tempDate.getTime(),
disabled: disabled,
color: hightLightDate && hightLightDate.color ? hightLightDate.color : null,
fontColor: fontColor
// fontColor: hightLightDate && hightLightDate.fontColor ? hightLightDate.fontColor : null
});
}
// To set Monday as the first day of the week.
/** @type {?} */
var firstDayMonday = this.daysList[0].day - this.mainObj.mondayFirst;
firstDayMonday = firstDayMonday < 0 ? 6 : firstDayMonday;
for (var j = 0; j < firstDayMonday; j++) {
this.daysList.unshift({});
}
this.rows = [0, 7, 14, 21, 28, 35];
this.cols = [0, 1, 2, 3, 4, 5, 6];
this.data.currentMonth = this.mainObj.monthsList[currentDate.getMonth()];
this.data.currentYear = currentDate.getFullYear();
this.data.currentMonthSelected = this.data.currentMonth;
this.currentYearSelected = this.data.currentYear;
this.numColumns = 7;
};
// Setting up the initial object
// Setting up the initial object
/**
* @param {?} ipObj
* @return {?}
*/
Ionic4DatepickerModalComponent.prototype.setInitialObj =
// Setting up the initial object
/**
* @param {?} ipObj
* @return {?}
*/
function (ipObj) {
// console.log('setInitialObj =>', ipObj);
this.mainObj = ipObj;
if (this.isSelectedDateFound) {
this.isSelectedDateFound = true;
this.selctedDateEpoch = this.resetHMSM(this.mainObj.inputDate).getTime();
}
this.selectedDateString = this.formatDate();
if (this.mainObj.weeksList && this.mainObj.weeksList.length === 7) {
this.weeksList = this.mainObj.weeksList;
}
if (this.mainObj.mondayFirst) {
this.weeksList.push(this.mainObj.weeksList.shift());
}
if (this.mainObj.yearInAscending) {
this.yearInAscending = this.mainObj.yearInAscending;
}
if (this.mainObj.momentLocale) {
this.momentLocale = this.mainObj.momentLocale;
}
this.disableWeekdays = this.mainObj.disableWeekDays;
this.setDisabledDates(this.mainObj);
this.refreshDateList(this.mainObj.inputDate);
};
// for dismiss modal
// for dismiss modal
/**
* @param {?} selectedDate
* @return {?}
*/
Ionic4DatepickerModalComponent.prototype.closeModal =
// for dismiss modal
/**
* @param {?} selectedDate
* @return {?}
*/
function (selectedDate) {
// console.log('closeModal => ', selectedDate);
this.modalCtrl.getTop();
/** @type {?} */
var formattedDate = moment(selectedDate).format(this.mainObj.dateFormat);
this.modalCtrl.dismiss({ date: formattedDate });
};
// close modal button
// close modal button
/**
* @return {?}
*/
Ionic4DatepickerModalComponent.prototype.closeIonicDatePickerModal =
// close modal button
/**
* @return {?}
*/
function () {
// console.log('closeIonicDatePickerModal');
this.closeModal(null);
};
// get years list ( GIVE HERE MIN OR MAX YEAR IN DATE_PICKER )
// get years list ( GIVE HERE MIN OR MAX YEAR IN DATE_PICKER )
/**
* @param {?} from
* @param {?} to
* @return {?}
*/
Ionic4DatepickerModalComponent.prototype.getYearsList =
// get years list ( GIVE HERE MIN OR MAX YEAR IN DATE_PICKER )
/**
* @param {?} from
* @param {?} to
* @return {?}
*/
function (from, to) {
// console.log('getYearsList =>', from, to);
/** @type {?} */
var yearsList = [];
/** @type {?} */
var minYear = 1950;
/** @type {?} */
var maxYear = new Date().getFullYear() + 1;
minYear = from ? new Date(from).getFullYear() : minYear;
maxYear = to ? new Date(to).getFullYear() : maxYear;
// console.log('getYearsList: ', this.yearInAscending);
if (this.yearInAscending) {
for (var i = minYear; i <= maxYear; i++) {
yearsList.push(i);
}
}
else {
for (var i = maxYear; i >= minYear; i--) {
yearsList.push(i);
}
}
return yearsList;
};
// Init Date-Picker
// Init Date-Picker
/**
* @return {?}
*/
Ionic4DatepickerModalComponent.prototype.initDatePicker =
// Init Date-Picker
/**
* @return {?}
*/
function () {
this.fromDate = "";
this.toDate = "";
// $scope.mainObj = angular.extend({}, config, ipObj);
if (this.mainObj.from) {
this.fromDate = this.resetHMSM(new Date(this.mainObj.from)).getTime();
}
if (this.mainObj.to) {
this.toDate = this.resetHMSM(new Date(this.mainObj.to)).getTime();
}
// if (ipObj.disableWeekdays && this.config.disableWeekdays) {
// this.mainObj.disableWeekDays = ipObj.disableWeekdays.concat(this.config.disableWeekdays);
// }
this.setInitialObj(this.mainObj);
};
// Init DatePicker Object
// Init DatePicker Object
/**
* @param {?} config
* @return {?}
*/
Ionic4DatepickerModalComponent.prototype.initDatePickerObj =
// Init DatePicker Object
/**
* @param {?} config
* @return {?}
*/
function (config) {
// const config = this.mainObj;
if (config.inputDate && !this.selectedDate.date) {
this.isSelectedDateFound = true;
this.selectedDate.date = config.inputDate;
}
/** @type {?} */
var objConfig = {};
objConfig.from = config.fromDate ? config.fromDate : "";
objConfig.to = config.toDate ? config.toDate : "";
objConfig.showTodayButton = config.showTodayButton === undefined ? true : config.showTodayButton;
objConfig.closeOnSelect = config.closeOnSelect ? config.closeOnSelect : false;
objConfig.disableWeekDays = config.disableWeekDays ? config.disableWeekDays : [];
objConfig.mondayFirst = config.mondayFirst ? config.mondayFirst : false;
objConfig.setLabel = config.setLabel ? config.setLabel : "Set";
objConfig.todayLabel = config.todayLabel ? config.todayLabel : "Today";
objConfig.closeLabel = config.closeLabel ? config.closeLabel : "Close";
objConfig.disabledDates = config.disabledDates ? config.disabledDates : [];
objConfig.titleLabel = config.titleLabel ? config.titleLabel : null;
objConfig.monthsList = config.monthsList ? config.monthsList : this.monthsList;
objConfig.monthsList = tslib_1.__spread(objConfig.monthsList);
objConfig.weeksList = config.weeksList ? config.weeksList : this.weeksList;
objConfig.weeksList = tslib_1.__spread(objConfig.weeksList);
objConfig.dateFormat = config.dateFormat ? config.dateFormat : "DD MMM YYYY";
// console.log(this.selectedDate.date, objConfig.dateFormat, moment.locale());
objConfig.clearButton = config.clearButton ? config.clearButton : false;
objConfig.yearInAscending = config.yearInAscending ? config.yearInAscending : false;
objConfig.momentLocale = config.momentLocale ? config.momentLocale : "en-US";
moment.locale(objConfig.momentLocale);
objConfig.inputDate = this.selectedDate.date ? moment(this.selectedDate.date, objConfig.dateFormat).toDate() : new Date();
objConfig.btnCloseSetInReverse = config.btnCloseSetInReverse ? config.btnCloseSetInReverse : false;
objConfig.btnProperties = {};
if (config.btnProperties) {
/** @type {?} */
var btnProperties = config.btnProperties;
objConfig.btnProperties.expand = btnProperties.expand ? btnProperties.expand : "block";
objConfig.btnProperties.fill = btnProperties.fill ? btnProperties.fill : "solid";
objConfig.btnProperties.size = btnProperties.size ? btnProperties.size : "default";
objConfig.btnProperties.color = btnProperties.color ? btnProperties.color : "";
objConfig.btnProperties.disabled = btnProperties.disabled ? btnProperties.disabled : false;
objConfig.btnProperties.strong = btnProperties.strong ? btnProperties.strong : false;
}
else {
objConfig.btnProperties.expand = "block";
objConfig.btnProperties.fill = "solid";
objConfig.btnProperties.size = "default";
objConfig.btnProperties.disabled = false;
objConfig.btnProperties.strong = false;
}
objConfig.arrowNextPrev = {};
if (config.arrowNextPrev) {
/** @type {?} */
var arrowNextPrev = config.arrowNextPrev;
objConfig.arrowNextPrev.nextArrowSrc = arrowNextPrev.nextArrowSrc ? arrowNextPrev.nextArrowSrc : false;
objConfig.arrowNextPrev.prevArrowSrc = arrowNextPrev.prevArrowSrc ? arrowNextPrev.prevArrowSrc : false;
}
objConfig.highlightedDates = [];
if (config.highlightedDates && config.highlightedDates.length > 0) {
objConfig.highlightedDates = config.highlightedDates;
this.setHightlightedDates(objConfig);
}
objConfig.isSundayHighlighted = {};
if (config.isSundayHighlighted) {
/** @type {?} */
var isSundayHighlighted = config.isSundayHighlighted;
objConfig.isSundayHighlighted.fontColor = isSundayHighlighted.fontColor ? isSundayHighlighted.fontColor : null;
}
// console.log('config =>', objConfig);
return objConfig;
};
// Format date
// Format date
/**
* @return {?}
*/
Ionic4DatepickerModalComponent.prototype.formatDate =
// Format date
/**
* @return {?}
*/
function () {
// console.log('formatDate: ', this.selctedDateEpoch, new Date(this.selctedDateEpoch));
return moment(this.selctedDateEpoch).format(this.mainObj.dateFormat);
};
Ionic4DatepickerModalComponent.decorators = [
{ type: Component, args: [{
selector: "li-ionic4-datepicker-modal",
template: "<ion-header>\n <ion-toolbar (click)=\"changeToDateList()\">\n <ion-title>\n <h1 *ngIf=\"mainObj?.titleLabel\">{{mainObj?.titleLabel}}</h1>\n {{selectedDateString}}\n </ion-title>\n </ion-toolbar>\n</ion-header>\n\n\n<ion-content forceOverscroll=\"false\" no-padding class=\"ionic_datepicker_modal_content\">\n <ion-grid class=\"dp-month-year-container\" no-padding [ngClass]=\"isMonthYearSelectorOpen ? 'dp-virual-scroller-hide' : 'dp-virual-scroller-show'\">\n <ion-row>\n <ion-col size=\"1.5\" class=\"dp-left-right-arrow\" (click)=\"prevMonth()\">\n <ion-button [ngClass]=\"{'pointer_events_none':((firstDayEpoch - 86400000) < fromDate)}\">\n <ion-icon *ngIf=\"!mainObj?.arrowNextPrev?.prevArrowSrc\" name=\"arrow-back\"></ion-icon>\n <ion-icon *ngIf=\"mainObj?.arrowNextPrev?.prevArrowSrc\" src=\"{{mainObj?.arrowNextPrev?.prevArrowSrc}}\"></ion-icon>\n </ion-button>\n </ion-col>\n <ion-col size=\"9\">\n <ion-grid>\n <ion-row>\n <ion-col class=\"dp-select-month-year\" size=\"5.5\" no-padding (click)=\"selectMonthYear(true)\">\n <ion-button class=\"dp-buttons\">\n {{ data.currentMonth }}\n <ion-icon name=\"md-arrow-dropdown\" class=\"dp-down-arrow\"></ion-icon>\n </ion-button>\n </ion-col>\n <ion-col size=\"1\"></ion-col>\n <ion-col class=\"dp-select-month-year\" size=\"5.5\" no-padding (click)=\"selectMonthYear(false)\">\n <ion-button class=\"dp-buttons\">\n {{ data.currentYear }}\n <ion-icon name=\"md-arrow-dropdown\" class=\"dp-down-arrow\"></ion-icon>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-col>\n <ion-col size=\"1.5\" class=\"dp-left-right-arrow\" (click)=\"nextMonth()\">\n <ion-button [ngClass]=\"{'pointer_events_none':((lastDayEpoch + 86400000)> toDate)}\">\n <ion-icon *ngIf=\"!mainObj?.arrowNextPrev?.nextArrowSrc\" name=\"arrow-forward\"></ion-icon>\n <ion-icon *ngIf=\"mainObj?.arrowNextPrev?.nextArrowSrc\" src=\"{{mainObj?.arrowNextPrev?.nextArrowSrc}}\"></ion-icon>\n </ion-button>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col>\n <ion-grid class=\"dp-weeks-container\" *ngIf=\"daysList\" [ngClass]=\"isMonthYearSelectorOpen ? 'dp-virual-scroller-hide' : 'dp-virual-scroller-show'\">\n <ion-row class=\" dp-weeks-name\">\n <ion-col *ngFor=\"let weekName of mainObj?.weeksList; let i = index\">\n <!-- <div class=\"weeks\">{{weekName}} {{i}}</div> -->\n <div class=\"weeks\" *ngIf=\"mainObj?.mondayFirst\"\n [style.color]=\"mainObj?.isSundayHighlighted && i === 6 ? mainObj?.isSundayHighlighted.fontColor : ''\">\n {{weekName}}</div>\n <div class=\"weeks\" *ngIf=\"!mainObj?.mondayFirst\"\n [style.color]=\"mainObj?.isSundayHighlighted && i === 0 ? mainObj?.isSundayHighlighted.fontColor : ''\">\n {{weekName}}</div>\n </ion-col>\n </ion-row>\n <ion-row *ngFor=\"let row of rows;\" class=\"dp-days-list\">\n <ion-col *ngFor=\"let col of cols; let i = index ;\" (click)=\"dateSelected(daysList[row + i])\"\n [style.background-color]=\"(daysList[row + i]?.color) ? (daysList[row + i]?.color) : ''\"\n [style.border-radius]=\"(daysList[row + i]?.color) ? '4px' : ''\" no-padding [ngClass]=\"{\n 'dp-selecteddate': (daysList[row + i]?.epoch === selctedDateEpoch),\n 'dp-today' : (daysList[row + i]?.epoch == today),\n 'disabled' : (daysList[row + i]?.disabled)}\">\n <div class=\"days\" [style.color]=\"(daysList[row + i]?.fontColor) ? (daysList[row + i]?.fontColor) : ''\">\n {{daysList[row + col]?.date}}\n </div>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-col>\n </ion-row>\n </ion-grid>\n <ion-list class=\"dp-month-year-scroll-container\" [ngClass]=\"isMonthYearSelectorOpen ? 'dp-virual-scroller-show' : 'dp-virual-scroller-hide'\">\n <ion-item *ngFor=\"let monthYear of scrollingMonthOrYearArray;let i=index;\" id=\"{{i +'list'}}\" (click)=\"onChangeMonthYear(monthYear)\">\n <ion-label [ngClass]=\"selectedYearOrMonth === monthYear ? 'dp-selected' : ''\">{{ monthYear }}</ion-label>\n </ion-item>\n </ion-list>\n</ion-content>\n\n<ion-footer>\n <ion-toolbar>\n <ion-grid no-padding>\n <ion-row no-padding [ngClass]=\"mainObj?.btnCloseSetInReverse ? 'dp-btn-set-close-in-reverse' : ''\">\n <ion-col no-padding>\n <ion-button class=\"ion-button\" expand=\"{{mainObj?.btnProperties?.expand}}\" fill=\"{{mainObj?.btnProperties?.fill}}\"\n size=\"{{mainObj?.btnProperties?.size}}\" color=\"{{mainObj?.btnProperties?.color}}\" disabled=\"{{mainObj?.btnProperties?.disabled}}\"\n strong=\"{{mainObj?.btnProperties?.strong}}\" (click)=\"closeIonicDatePickerModal()\">\n {{mainObj?.closeLabel}}\n </ion-button>\n </ion-col>\n <ion-col no-padding *ngIf=\"mainObj?.showTodayButton\">\n <ion-button class=\"ion-button\" expand=\"{{mainObj?.btnProperties?.expand}}\" fill=\"{{mainObj?.btnProperties?.fill}}\"\n size=\"{{mainObj?.btnProperties?.size}}\" color=\"{{mainObj?.btnProperties?.color}}\" disabled=\"{{mainObj?.btnProperties?.disabled}}\"\n strong=\"{{mainObj?.btnProperties?.strong}}\" (click)=\"setIonicDatePickerTodayDate()\">\n {{mainObj?.todayLabel}}\n </ion-button>\n </ion-col>\n <ion-col no-padding *ngIf=\"!mainObj?.closeOnSelect\">\n <ion-button class=\"ion-button\" expand=\"{{mainObj?.btnProperties?.expand}}\"\n fill=\"{{mainObj?.btnProperties?.fill}}\" size=\"{{mainObj?.btnProperties?.size}}\"\n color=\"{{mainObj?.btnProperties?.color}}\"\n disabled=\"{{mainObj?.btnProperties?.disabled || !isSelectedDateFound}}\"\n strong=\"{{mainObj?.btnProperties?.strong}}\" (click)=\"setIonicDatePickerDate()\">\n {{mainObj?.setLabel}}\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-toolbar>\n</ion-footer>",
styles: [":host ion-header{height:60px}:host ion-header ion-toolbar{--background:var(--ion-color-primary);height:100%;-webkit-box-align:center;align-items:center;display:-webkit-box;display:flex;color:var(--ion-color-primary-contrast)}:host ion-header ion-toolbar ion-title{font-size:20px;font-weight:700;text-align:center;padding:0;display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center;height:100%;cursor:pointer}:host ion-header ion-toolbar ion-title h1{font-size:14px;margin:0 0 4px}:host .ionic_datepicker_modal_content .dp-month-year-container ion-col{display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center}:host .ionic_datepicker_modal_content .dp-month-year-container ion-col ion-grid{width:100%}:host .ionic_datepicker_modal_content .dp-month-year-container ion-col ion-grid .dp-select-month-year{border-bottom:1.5px solid;border-bottom-color:var(--ion-color-primary)}:host .ionic_datepicker_modal_content .dp-month-year-container ion-col ion-grid .dp-select-month-year .dp-buttons{width:100%;height:40px;margin:0;padding:0;color:var(--ion-color-primary);--background:transparent;--box-shadow:none}:host .ionic_datepicker_modal_content .dp-month-year-container ion-col ion-grid .dp-select-month-year .dp-buttons.activated{--background-activated:transparent;--color-activated:var(--ion-color-primary)}:host .ionic_datepicker_modal_content .dp-month-year-container ion-col ion-grid .dp-select-month-year .dp-down-arrow{position:absolute;width:16px;right:0;top:10px;color:var(--ion-color-primary)}:host .ionic_datepicker_modal_content .dp-month-year-container .dp-left-right-arrow ion-button{--background:transparent;--box-shadow:0;color:var(--ion-color-primary)}:host .ionic_datepicker_modal_content .dp-month-year-container .dp-left-right-arrow ion-button:focus{outline:0}:host .ionic_datepicker_modal_content .dp-month-year-container .dp-left-right-arrow ion-button.activated{--ion-color-primary-shade:transparent;--ion-color-primary-contrast:var(--ion-color-primary-tint)}:host .ionic_datepicker_modal_content .dp-weeks-container{margin:8px 0}:host .ionic_datepicker_modal_content .dp-weeks-container .dp-weeks-name ion-col{display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center}:host .ionic_datepicker_modal_content .dp-weeks-container .dp-weeks-name ion-col .weeks{width:14%;display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center;font-weight:700}:host .ionic_datepicker_modal_content .dp-weeks-container .dp-days-list ion-col{display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center;padding:10px;cursor:pointer}:host .ionic_datepicker_modal_content .dp-weeks-container .dp-days-list ion-col .days{width:14%;display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center}:host .ionic_datepicker_modal_content .dp-selecteddate{background:var(--ion-color-primary);color:var(--ion-color-primary-contrast);border-radius:4px;font-weight:500}:host .ionic_datepicker_modal_content .dp-today{border-radius:4px;font-weight:500;border:1px solid;border-color:var(--ion-color-primary)}:host .ionic_datepicker_modal_content .dp-month-year-scroll-container{position:absolute;top:0;bottom:0;left:0;right:0;margin:0;overflow-y:scroll}:host .ionic_datepicker_modal_content .dp-month-year-scroll-container ion-item{--padding-start:0;--inner-padding-end:0;--inner-border-width:0}:host .ionic_datepicker_modal_content .dp-month-year-scroll-container ion-item ion-label{text-align:center;margin:0;font-size:16px}:host .ionic_datepicker_modal_content .dp-month-year-scroll-container ion-item ion-label.dp-selected{color:var(--ion-color-primary);font-size:20px;font-weight:500}:host .disabled{color:#aaa}:host .dp-virual-scroller-show{-webkit-transition:opacity .3s ease-in;transition:opacity .3s ease-in;opacity:1;visibility:visible}:host .dp-virual-scroller-hide{opacity:0;visibility:hidden;height:auto}:host ion-footer{height:55px}:host ion-footer ion-toolbar{height:100%;--border-width:0;--padding-top:0px;--padding-bottom:0px;--padding-start:0px;--padding-end:0px}:host ion-footer ion-toolbar .toolbar-container{height:100%}:host ion-footer ion-toolbar .dp-btn-set-close-in-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;flex-direction:row-reverse}:host ion-footer ion-toolbar ion-button{--border-radius:0;height:55px;margin:0}:host ion-footer ion-toolbar ion-button:focus{outline:0}:host ion-footer ion-toolbar ion-button.activated{--background-activated:var(--ion-color-primary-tint);--color-activated:var(--ion-color-primary-contrast)}"]
}] }
];
/** @nocollapse */
Ionic4DatepickerModalComponent.ctorParameters = function () { return [
{ type: NavParams },
{ type: ModalController },
{ type: Ionic4DatepickerService }
]; };
Ionic4DatepickerModalComponent.propDecorators = {
content: [{ type: ViewChild, args: [IonContent,] }]
};
return Ionic4DatepickerModalComponent;
}());
export { Ionic4DatepickerModalComponent };
if (false) {
/** @type {?} */
Ionic4DatepickerModalComponent.prototype.content;
/** @type {?} */
Ionic4DatepickerModalComponent.prototype.currentDate;
/** @type {?} */
Ionic4DatepickerModalComponent.prototype.today;
/** @type {?} */
Ionic4DatepickerModalComponent.prototype.mainObj;
/** @type {?} */
Ionic4DatepickerModalComponent.prototype.selectedDate;
/** @type {?} */
Ionic4DatepickerModalComponent.prototype.selctedDateEpoch;
/** @type {?} */
Ionic4DatepickerModalComponent.prototype.firstDayEpoch;
/** @type {?} */
Ionic4DatepickerModalComponent.prototype.lastDayEpoch;
/** @type {?} */
Ionic4DatepickerModalComponent.prototype.disabledDates;
/** @type {?} */
Ionic4DatepickerModalComponent.prototype.highlightedDates;
/** @type {?} */
Ionic4DatepickerModalComponent.prototype.fromDate;
/** @type {?} */
Ionic4DatepickerModalComponent.prototype.toDate;
/** @type {?} */
Ionic4DatepickerModalComponent.prototype.disableWeekdays;
/** @type {?} */
Ionic4DatepickerModalComponent.prototype.data;
/** @type {?} */
Ionic4DatepickerModalComponent.prototype.currentYearSelected;
/** @type {?} */
Ionic4DatepickerModalComponent.prototype.numColumns;
/** @type {?} */
Ionic4DatepickerModalComponent.prototype.rows;
/** @type {?} */
Ionic4DatepickerModalComponent.prototype.cols;
/** @type {?} */
Ionic4DatepickerModalComponent.prototype.monthsList;
/** @type {?} */
Ionic4DatepickerModalComponent.prototype.weeksList;
/** @type {?} */
Ionic4DatepickerModalComponent.prototype.yearsList;
/** @type {?} */
Ionic4DatepickerModalComponent.prototype.daysList;
/** @type {?} */
Ionic4DatepickerModalComponent.prototype.yearInAscending;
/** @type {?} */
Ionic4DatepickerModalComponent.prototype.momentLocale;
/** @type {?} */
Ionic4DatepickerModalComponent.prototype.selectedDateString;
/** @type {?} */
Ionic4DatepickerModalComponent.prototype.isMonthYearSelectorOpen;
/** @type {?} */
Ionic4DatepickerModalComponent.prototype.selectedYearOrMonth;
/** @type {?} */
Ionic4DatepickerModalComponent.prototype.isMonthSelect;
/** @type {?} */
Ionic4DatepickerModalComponent.prototype.scrollingMonthOrYearArray;
/** @type {?} */
Ionic4DatepickerModalComponent.prototype.isSelectedDateFound;
/**
* @type {?}
* @private
*/
Ionic4DatepickerModalComponent.prototype.navParams;
/**
* @type {?}
* @private
*/
Ionic4DatepickerModalComponent.prototype.modalCtrl;
/** @type {?} */
Ionic4DatepickerModalComponent.prototype.datePickerService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW9uaWM0LWRhdGVwaWNrZXItbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGluZHJhMjM0MS9pb25pYzQtZGF0ZXBpY2tlci8iLCJzb3VyY2VzIjpbImxpYi9pb25pYzQtZGF0ZXBpY2tlci1tb2RhbC9pb25pYzQtZGF0ZXBpY2tlci1tb2RhbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDeEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEUsT0FBTyxLQUFLLE9BQU8sTUFBTSxRQUFRLENBQUM7QUFDbEMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7O0lBQ2pFLE1BQU0sR0FBRyxPQUFPO0FBRXRCO0lBb0RFLHdDQUFvQixTQUFvQixFQUFVLFNBQTBCLEVBQVMsaUJBQTBDO1FBQTNHLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFBVSxjQUFTLEdBQVQsU0FBUyxDQUFpQjtRQUFTLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBeUI7O1FBeEMvSCxZQUFPLEdBQVEsRUFBRSxDQUFDO1FBQ2xCLGlCQUFZLEdBQVEsRUFBRSxDQUFDOztRQUd2QixxQkFBZ0IsR0FBRyxDQUFDLENBQUM7UUFJckIsa0JBQWEsR0FBRyxFQUFFLENBQUM7UUFDbkIscUJBQWdCLEdBQVEsRUFBRSxDQUFDO1FBSTNCLG9CQUFlLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLFNBQUksR0FBUTtZQUNWLFlBQVksRUFBRSxFQUFFO1lBQ2hCLFdBQVcsRUFBRSxFQUFFO1lBQ2Ysb0JBQW9CLEVBQUUsRUFBRTtTQUN6QixDQUFDO1FBSUYsU0FBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMs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QUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQztRQUNqRyxTQUFTLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUM5RSxTQUFTLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNqRixTQUFTLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUN4RSxTQUFTLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUMvRCxTQUFTLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUN2RSxTQUFTLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUN2RSxTQUFTLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMzRSxTQUFTLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUVwRSxTQUFTLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElB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O1FBQ3ZDLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxjQUFjOzs7OztJQUNkLG1EQUFVOzs7OztJQUFWO1FBQ0UsdUZBQXVGO1FBQ3ZGLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7O2dCQWpmRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLDRCQUE0QjtvQkFDdEMsaXZNQUF1RDs7aUJBRXhEOzs7O2dCQVZRLFNBQVM7Z0JBQUUsZUFBZTtnQkFHMUIsdUJBQXVCOzs7MEJBUzdCLFNBQVMsU0FBQyxVQUFVOztJQTRldkIscUNBQUM7Q0FBQSxBQWxmRCxJQWtmQztTQTdlWSw4QkFBOEI7OztJQUN6QyxpREFBMkM7O0lBRTNDLHFEQUFZOztJQUNaLCtDQUFNOztJQUdOLGlEQUFrQjs7SUFDbEIsc0RBQXVCOztJQUd2QiwwREFBcUI7O0lBQ3JCLHVEQUFjOztJQUNkLHNEQUFhOztJQUViLHVEQUFtQjs7SUFDbkIsMERBQTJCOztJQUUzQixrREFBUzs7SUFDVCxnREFBTzs7SUFDUCx5REFBcUI7O0lBQ3JCLDhDQUlFOztJQUNGLDZEQUFvQjs7SUFDcEIsb0RBQVc7O0lBRVgsOENBQThCOztJQUM5Qiw4Q0FBNkI7O0lBQzdCLG9EQUF5Rzs7SUFDekcsbURBQWdEOztJQUNoRCxtREFBZTs7SUFDZixrREFBYzs7SUFDZCx5REFBd0I7O0lBQ3hCLHNEQUF1Qjs7SUFDdkIsNERBQW1COztJQUduQixpRUFBZ0M7O0lBQ2hDLDZEQUFvQjs7SUFDcEIsdURBQWM7O0lBQ2QsbUVBQW9DOztJQUVwQyw2REFBNEI7Ozs7O0lBRWhCLG1EQUE0Qjs7Ozs7SUFBRSxtREFBa0M7O0lBQUUsMkRBQWlEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCwgT25EZXN0cm95IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IE5hdlBhcmFtcywgTW9kYWxDb250cm9sbGVyLCBJb25Db250ZW50IH0gZnJvbSBcIkBpb25pYy9hbmd1bGFyXCI7XG5cbmltcG9ydCAqIGFzIG1vbWVudF8gZnJvbSBcIm1vbWVudFwiO1xuaW1wb3J0IHsgSW9uaWM0RGF0ZXBpY2tlclNlcnZpY2UgfSBmcm9tIFwiLi4vaW9uaWM0LWRhdGVwaWNrZXIuc2VydmljZVwiO1xuY29uc3QgbW9tZW50ID0gbW9tZW50XztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImxpLWlvbmljNC1kYXRlcGlja2VyLW1vZGFsXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vaW9uaWM0LWRhdGVwaWNrZXItbW9kYWwuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL2lvbmljNC1kYXRlcGlja2VyLW1vZGFsLmNvbXBvbmVudC5zY3NzXCJdXG59KVxuZXhwb3J0IGNsYXNzIElvbmljNERhdGVwaWNrZXJNb2RhbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZChJb25Db250ZW50KSBjb250ZW50OiBJb25Db250ZW50O1xuXG4gIGN1cnJlbnREYXRlO1xuICB0b2RheTtcblxuICAvLyBpbnB1dHNcbiAgbWFpbk9iajogYW55ID0ge307XG4gIHNlbGVjdGVkRGF0ZTogYW55ID0ge307XG5cbiAgLy8gY29tcG9uZW50IHZhcmlhYmxlc1xuICBzZWxjdGVkRGF0ZUVwb2NoID0gMDtcbiAgZmlyc3REYXlFcG9jaDtcbiAgbGFzdERheUVwb2NoO1xuXG4gIGRpc2FibGVkRGF0ZXMgPSBbXTtcbiAgaGlnaGxpZ2h0ZWREYXRlczogYW55ID0ge307XG5cbiAgZnJvbURhdGU7XG4gIHRvRGF0ZTtcbiAgZGlzYWJsZVdlZWtkYXlzID0gW107XG4gIGRhdGE6IGFueSA9IHtcbiAgICBjdXJyZW50TW9udGg6IFwiXCIsXG4gICAgY3VycmVudFllYXI6IFwiXCIsXG4gICAgY3VycmVudE1vbnRoU2VsZWN0ZWQ6IFwiXCJcbiAgfTtcbiAgY3VycmVudFllYXJTZWxlY3RlZDtcbiAgbnVtQ29sdW1ucztcblxuICByb3dzID0gWzAsIDcsIDE0LCAyMSwgMjgsIDM1XTtcbiAgY29scyA9IFswLCAxLCAyLCAzLCA0LCA1LCA2XTtcbiAgbW9udGhzTGlzdCA9IFtcIkphblwiLCBcIkZlYlwiLCBcIk1hcmNoXCIsIFwiQXByaWxcIiwgXCJNYXlcIiwgXCJKdW5lXCIsIFwiSnVseVwiLCBcIkF1Z1wiLCBcIlNlcHRcIiwgXCJPY3RcIiwgXCJOb3ZcIiwgXCJEZWNcIl07XG4gIHdlZWtzTGlzdCA9IFtcIlNcIiwgXCJNXCIsIFwiVFwiLCBcIldcIiwgXCJUXCIsIFwiRlwiLCBcIlNcIl07XG4gIHllYXJzTGlzdCA9IFtdO1xuICBkYXlzTGlzdCA9IFtdO1xuICB5ZWFySW5Bc2NlbmRpbmcgPSBmYWxzZTtcbiAgbW9tZW50TG9jYWxlID0gXCJlbi1VU1wiO1xuICBzZWxlY3RlZERhdGVTdHJpbmc7XG5cbiAgLy8gbW9udGggeWVhciBzY3JvbGwgdmFyaWFibGVzXG4gIGlzTW9udGhZZWFyU2VsZWN0b3JPcGVuID0gZmFsc2U7XG4gIHNlbGVjdGVkWWVhck9yTW9udGg7XG4gIGlzTW9udGhTZWxlY3Q7XG4gIHNjcm9sbGluZ01vbnRoT3JZZWFyQXJyYXk6IGFueSA9IFtdO1xuXG4gIGlzU2VsZWN0ZWREYXRlRm91bmQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG5hdlBhcmFtczogTmF2UGFyYW1zLCBwcml2YXRlIG1vZGFsQ3RybDogTW9kYWxDb250cm9sbGVyLCBwdWJsaWMgZGF0ZVBpY2tlclNlcnZpY2U6IElvbmljNERhdGVwaWNrZXJTZXJ2aWNlKSB7XG4gICAgdGhpcy50b2RheSA9IHRoaXMucmVzZXRITVNNKG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcbiAgICBpZiAodGhpcy5uYXZQYXJhbXMuZ2V0KFwic2VsZWN0ZWREYXRlXCIpKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZygnU2VsZWN0ZWQgZGF0ZSA9PicsIHRoaXMubmF2UGFyYW1zLmdldCgnc2VsZWN0ZWREYXRlJykpO1xuICAgICAgdGhpcy5zZWxlY3RlZERhdGUuZGF0ZSA9IHRoaXMubmF2UGFyYW1zLmdldChcInNlbGVjdGVkRGF0ZVwiKTtcbiAgICAgIHRoaXMuaXNTZWxlY3RlZERhdGVGb3VuZCA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMubWFpbk9iaiA9IHRoaXMuaW5pdERhdGVQaWNrZXJPYmoodGhpcy5uYXZQYXJhbXMuZ2V0KFwib2JqQ29uZmlnXCIpKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuaXNNb2RhbE9wZW4gPSB0cnVlO1xuICAgIHRoaXMuaW5pdERhdGVQaWNrZXIoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuaXNNb2RhbE9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIC8vIFJlc2V0IHRoZSBob3VycywgbWludXRlcywgc2Vjb25kcyBhbmQgbWlsbGkgc2Vjb25kc1xuICByZXNldEhNU00oY3VycmVudERhdGUpIHtcbiAgICBjdXJyZW50RGF0ZS5zZXRIb3VycygwKTtcbiAgICBjdXJyZW50RGF0ZS5zZXRNaW51dGVzKDApO1xuICAgIGN1cnJlbnREYXRlLnNldFNlY29uZHMoMCk7XG4gICAgY3VycmVudERhdGUuc2V0TWlsbGlzZWNvbmRzKDApO1xuICAgIHJldHVybiBjdXJyZW50RGF0ZTtcbiAgfVxuXG4gIC8vIHRoaXMgbWV0aG9kIGNoYW5nZSBtb250aCBvciB5ZWFyIGxpc3QgdG8gZGF0ZUxpc3RcbiAgY2hhbmdlVG9EYXRlTGlzdCgpIHtcbiAgICAvLyBjb25zb2xlLmxvZygnY2hhbmdlVG9EYXRlTGlzdCcpO1xuICAgIHRoaXMuaXNNb250aFllYXJTZWxlY3Rvck9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIC8vIFZpcnR1YWwgc2Nyb2xsIGNyZWF0ZSBmb3Igc2VsZWN0IHllYXIgYW5kIG1vbnRoXG4gIHNlbGVjdE1vbnRoWWVhcihpc01vbnRoU2VsZWN0KSB7XG4gICAgLy8gY29uc29sZS5sb2coJ3NlbGVjdE1vbnRoWWVhcicsIGkpO1xuICAgIHRoaXMuaXNNb250aFllYXJTZWxlY3Rvck9wZW4gPSB0cnVlO1xuXG4gICAgdGhpcy5pc01vbnRoU2VsZWN0ID0gaXNNb250aFNlbGVjdDtcbiAgICB0aGlzLnNjcm9sbGluZ01vbnRoT3JZZWFyQXJyYXkgPSBpc01vbnRoU2VsZWN0ID8gdGhpcy5tYWluT2JqLm1vbnRoc0xpc3QgOiB0aGlzLnllYXJzTGlzdDtcbiAgICB0aGlzLnNlbGVjdGVkWWVhck9yTW9udGggPSBpc01vbnRoU2VsZWN0ID8gdGhpcy5kYXRhLmN1cnJlbnRNb250aCA6IHRoaXMuZGF0YS5jdXJyZW50WWVhcjtcblxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zY3JvbGxpbmdNb250aE9yWWVhckFycmF5LmluZGV4T2YodGhpcy5zZWxlY3RlZFllYXJPck1vbnRoKTtcbiAgICBjb25zdCBpZGl0ZW0gPSBpbmRleCArIFwibGlzdFwiO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZGl0ZW0pLnNjcm9sbEludG9WaWV3KCk7XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIC8vIHNlbGVjdCBtb250aCBvciB5ZWFyXG4gIG9uQ2hhbmdlTW9udGhZZWFyKG1vbnRoWWVhcikge1xuICAgIC8vIGNvbnNvbGUubG9nKCdvbkNoYW5nZU1vbnRoWWVhcicsIG1vbnRoWWVhcik7XG4gICAgaWYgKG1vbnRoWWVhcikge1xuICAgICAgaWYgKHRoaXMuaXNNb250aFNlbGVjdCkge1xuICAgICAgICB0aGlzLmRhdGEuY3VycmVudE1vbnRoID0gbW9udGhZZWFyO1xuICAgICAgICB0aGlzLnNlbGVjdGVkWWVhck9yTW9udGggPSB0aGlzLmRhdGEuY3VycmVudE1vbnRoO1xuICAgICAgICBjb25zdCBtb250aE51bWJlciA9IHRoaXMubW9udGhzTGlzdC5pbmRleE9mKHRoaXMuZGF0YS5jdXJyZW50TW9udGgpO1xuICAgICAgICB0aGlzLmN1cnJlbnREYXRlLnNldERhdGUoMSk7XG4gICAgICAgIHRoaXMuY3VycmVudERhdGUuc2V0TW9udGgobW9udGhOdW1iZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kYXRhLmN1cnJlbnRZZWFyID0gbW9udGhZZWFyO1xuICAgICAgICB0aGlzLnNlbGVjdGVkWWVhck9yTW9udGggPSB0aGlzLmRhdGEuY3VycmVudFllYXI7XG4gICAgICAgIHRoaXMuY3VycmVudERhdGUuc2V0RnVsbFllYXIodGhpcy5kYXRhLmN1cnJlbnRZZWFyKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoRGF0ZUxpc3QodGhpcy5jdXJyZW50RGF0ZSk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlZnJlc2hEYXRlTGlzdCh0aGlzLmN1cnJlbnREYXRlKTtcbiAgICB9XG4gICAgdGhpcy5pc01vbnRoWWVhclNlbGVjdG9yT3BlbiA9IGZhbHNlO1xuICB9XG5cbiAgLy8gUHJldmlvdXMgbW9udGhcbiAgcHJldk1vbnRoKCkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdwcmV2TmV4dCcsIHRoaXMuY3VycmVudERhdGUpO1xuICAgIGNvbnN0IGN1cnJlbnRNb250aCA9IHRoaXMuY3VycmVudERhdGUuZ2V0TW9udGgoKTtcbiAgICBjb25zdCBjdXJyZW50WWVhciA9IHRoaXMuY3VycmVudERhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICB2YXIgcHJldlllYXIgPSBjdXJyZW50WWVhciAtIDE7XG4gICAgaWYgKCF0aGlzLnllYXJzTGlzdC5pbmNsdWRlcyhwcmV2WWVhcikgJiYgY3VycmVudE1vbnRoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjdXJyZW50TW9udGggPT09IDEpIHtcbiAgICAgIHRoaXMuY3VycmVudERhdGUuc2V0RnVsbFllYXIoY3VycmVudFllYXIpO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnREYXRlLnNldE1vbnRoKGN1cnJlbnRNb250aCAtIDEpO1xuICAgIHRoaXMuZGF0YS5jdXJyZW50TW9udGggPSB0aGlzLm1haW5PYmoubW9udGhzTGlzdFtjdXJyZW50TW9udGhdO1xuICAgIHRoaXMuZGF0YS5jdXJyZW50WWVhciA9IGN1cnJlbnRZZWFyO1xuICAgIHRoaXMucmVmcmVzaERhdGVMaXN0KHRoaXMuY3VycmVudERhdGUpO1xuICAgIC8vIHRoaXMuY2hhbmdlRGF5U2VsZWN0ZWQoKTtcbiAgfVxuXG4gIC8vIE5leHQgbW9udGhcbiAgbmV4dE1vbnRoKCkge1xuICAgIC8vIGNvbnNvbGUubG9nKCduZXh0TmV4dCcsIHRoaXMuY3VycmVudERhdGUpO1xuICAgIGNvbnN0IGN1cnJlbnRNb250aCA9IHRoaXMuY3VycmVudERhdGUuZ2V0TW9udGgoKTtcbiAgICBjb25zdCBjdXJyZW50WWVhciA9IHRoaXMuY3VycmVudERhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICB2YXIgbmV4dFllYXIgPSBjdXJyZW50WWVhciArIDE7XG4gICAgaWYgKCF0aGlzLnllYXJzTGlzdC5pbmNsdWRlcyhuZXh0WWVhcikgJiYgY3VycmVudE1vbnRoID09PSAxMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY3VycmVudE1vbnRoID09PSAxMSkge1xuICAgICAgdGhpcy5jdXJyZW50RGF0ZS5zZXRGdWxsWWVhcihjdXJyZW50WWVhcik7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudERhdGUuc2V0RGF0ZSgxKTtcbiAgICB0aGlzLmN1cnJlbnREYXRlLnNldE1vbnRoKGN1cnJlbnRNb250aCArIDEpO1xuICAgIHRoaXMuZGF0YS5jdXJyZW50TW9udGggPSB0aGlzLm1haW5PYmoubW9udGhzTGlzdFtjdXJyZW50TW9udGhdO1xuICAgIHRoaXMuZGF0YS5jdXJyZW50WWVhciA9IGN1cnJlbnRZZWFyO1xuICAgIHRoaXMucmVmcmVzaERhdGVMaXN0KHRoaXMuY3VycmVudERhdGUpO1xuICAgIC8vIHRoaXMuY2hhbmdlRGF5U2VsZWN0ZWQoKTtcbiAgfVxuXG4gIC8vIGNoYW5nZURheVNlbGVjdGVkICggZGF5IHNlbGVjdGlvbiBjaGFuZ2VzIClcbiAgY2hhbmdlRGF5U2VsZWN0ZWQoKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ2NoYW5nZURheVNlbGVjdGVkJyk7XG4gICAgY29uc3QgbmV3U2VsZWN0ZWREYXRlOiBhbnkgPSBuZXcgRGF0ZSh0aGlzLnNlbGN0ZWREYXRlRXBvY2gpO1xuICAgIG5ld1NlbGVjdGVkRGF0ZS5zZXRNb250aCh0aGlzLmN1cnJlbnREYXRlLmdldE1vbnRoKCkpO1xuICAgIG5ld1NlbGVjdGVkRGF0ZS5zZXRZZWFyKHRoaXMuY3VycmVudERhdGUuZ2V0RnVsbFllYXIoKSk7XG4gICAgdGhpcy5zZWxjdGVkRGF0ZUVwb2NoID0gbmV3U2VsZWN0ZWREYXRlLmdldFRpbWUoKTtcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0cmluZyA9IHRoaXMuZm9ybWF0RGF0ZSgpO1xuICAgIC8vIHRoaXMuY2xvc2VNb2RhbCh0aGlzLnNlbGN0ZWREYXRlRXBvY2gpO1xuICB9XG5cbiAgLy8gRGF0ZSBzZWxlY3RlZFxuICBkYXRlU2VsZWN0ZWQoc2VsZWN0ZWREYXRlKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ2RhdGVTZWxlY3RlZCA9PicsIHNlbGVjdGVkRGF0ZSk7XG4gICAgaWYgKHNlbGVjdGVkRGF0ZSAmJiAhc2VsZWN0ZWREYXRlLmRpc2FibGVkKSB7XG4gICAgICBpZiAoIXNlbGVjdGVkRGF0ZSB8fCBPYmplY3Qua2V5cyhzZWxlY3RlZERhdGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmlzU2VsZWN0ZWREYXRlRm91bmQgPSB0cnVlO1xuICAgICAgdGhpcy5zZWxjdGVkRGF0ZUVwb2NoID0gc2VsZWN0ZWREYXRlLmVwb2NoO1xuICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdHJpbmcgPSB0aGlzLmZvcm1hdERhdGUoKTtcbiAgICAgIGlmICh0aGlzLm1haW5PYmouY2xvc2VPblNlbGVjdCkge1xuICAgICAgICB0aGlzLmNsb3NlTW9kYWwodGhpcy5zZWxjdGVkRGF0ZUVwb2NoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBTZXQgdG9kYXkgYXMgZGF0ZSBmb3IgdGhlIG1vZGFsXG4gIHNldElvbmljRGF0ZVBpY2tlclRvZGF5RGF0ZSgpIHtcbiAgICAvLyBjb25zb2xlLmxvZygnc2V0SW9uaWNEYXRlUGlja2VyVG9kYXlEYXRlJyk7XG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSh0aGlzLnRvZGF5KTtcbiAgICBjb25zdCB0b2RheV9vYmogPSB7XG4gICAgICBkYXRlOiB0b2RheS5nZXREYXRlKCksXG4gICAgICBtb250aDogdG9kYXkuZ2V0TW9udGgoKSxcbiAgICAgIHllYXI6IHRvZGF5LmdldEZ1bGxZZWFyKCksXG4gICAgICBkYXk6IHRvZGF5LmdldERheSgpLFxuICAgICAgZXBvY2g6IHRvZGF5LmdldFRpbWUoKSxcbiAgICAgIGRpc2FibGVkOiBmYWxzZVxuICAgIH07XG4gICAgdGhpcy5kYXRlU2VsZWN0ZWQodG9kYXlfb2JqKTtcbiAgICB0aGlzLnJlZnJlc2hEYXRlTGlzdChuZXcgRGF0ZSgpKTtcbiAgICB0aGlzLnNlbGN0ZWREYXRlRXBvY2ggPSB0aGlzLnJlc2V0SE1TTSh0b2RheSkuZ2V0VGltZSgpO1xuICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RyaW5nID0gdGhpcy5mb3JtYXREYXRlKCk7XG4gICAgLy8gdGhpcy5jbG9zZU1vZGFsKHRoaXMuc2VsY3RlZERhdGVFcG9jaCk7XG4gIH1cblxuICAvLyBTZXQgZGF0ZSBmb3IgdGhlIG1vZGFsXG4gIHNldElvbmljRGF0ZVBpY2tlckRhdGUoKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ3NldElvbmljRGF0ZVBpY2tlckRhdGUnKTtcbiAgICB0aGlzLmNsb3NlTW9kYWwodGhpcy5zZWxjdGVkRGF0ZUVwb2NoKTtcbiAgfVxuXG4gIC8vIFNldHRpbmcgdGhlIGRpc2FibGVkIGRhdGVzIGxpc3QuXG4gIHNldERpc2FibGVkRGF0ZXMob2JqKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ3NldERpc2FibGVkRGF0ZXMgPT4nLCBvYmopO1xuICAgIGlmICghb2JqLmRpc2FibGVkRGF0ZXMgfHwgb2JqLmRpc2FibGVkRGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmRpc2FibGVkRGF0ZXMgPSBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNhYmxlZERhdGVzID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iai5kaXNhYmxlZERhdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIHZhbCA9IHJlc2V0SE1TTShuZXcgRGF0ZSh2YWwpKTtcbiAgICAgICAgdGhpcy5kaXNhYmxlZERhdGVzLnB1c2godGhpcy5yZXNldEhNU00obmV3IERhdGUob2JqLmRpc2FibGVkRGF0ZXNbaV0pKS5nZXRUaW1lKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFNldCBoaWdodGxpZ2h0ZWQgZGF0ZXNcbiAgc2V0SGlnaHRsaWdodGVkRGF0ZXMob2JqKSB7XG4gICAgaWYgKCFvYmouaGlnaGxpZ2h0ZWREYXRlcyB8fCBvYmouaGlnaGxpZ2h0ZWREYXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuaGlnaGxpZ2h0ZWREYXRlcyA9IHt9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhpZ2hsaWdodGVkRGF0ZXMgPSB7fTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqLmhpZ2hsaWdodGVkRGF0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaERhdGUgPSBvYmouaGlnaGxpZ2h0ZWREYXRlc1tpXS5kYXRlO1xuICAgICAgICBjb25zdCBoQ29sb3IgPSBvYmouaGlnaGxpZ2h0ZWREYXRlc1tpXS5jb2xvcjtcbiAgICAgICAgY29uc3QgaEZvbnRDb2xvciA9IG9iai5oaWdobGlnaHRlZERhdGVzW2ldLmZvbnRDb2xvcjtcbiAgICAgICAgY29uc3QgaERhdGVUaW1lID0gdGhpcy5yZXNldEhNU00obmV3IERhdGUoaERhdGUpKS5nZXRUaW1lKCk7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWREYXRlc1toRGF0ZVRpbWVdID0geyBjb2xvcjogaENvbG9yLCBmb250Q29sb3I6IGhGb250Q29sb3IgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSZWZyZXNoIHRoZSBsaXN0IG9mIHRoZSBkYXRlcyBvZiBhIG1vbnRoXG4gIHJlZnJlc2hEYXRlTGlzdChjdXJyZW50RGF0ZSkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdyZWZyZXNoRGF0ZUxpc3QgPT4nLCBjdXJyZW50RGF0ZSk7XG4gICAgY3VycmVudERhdGUgPSB0aGlzLnJlc2V0SE1TTShjdXJyZW50RGF0ZSk7XG4gICAgdGhpcy5jdXJyZW50RGF0ZSA9IGN1cnJlbnREYXRlO1xuXG4gICAgY29uc3QgZmlyc3REYXkgPSBuZXcgRGF0ZShjdXJyZW50RGF0ZS5nZXRGdWxsWWVhcigpLCBjdXJyZW50RGF0ZS5nZXRNb250aCgpLCAxKS5nZXREYXRlKCk7XG4gICAgY29uc3QgbGFzdERheSA9IG5ldyBEYXRlKGN1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCksIGN1cnJlbnREYXRlLmdldE1vbnRoKCkgKyAxLCAwKS5nZXREYXRlKCk7XG5cbiAgICB0aGlzLm1vbnRoc0xpc3QgPSBbXTtcbiAgICBpZiAodGhpcy5tYWluT2JqLm1vbnRoc0xpc3QgJiYgdGhpcy5tYWluT2JqLm1vbnRoc0xpc3QubGVuZ3RoID09PSAxMikge1xuICAgICAgdGhpcy5tb250aHNMaXN0ID0gdGhpcy5tYWluT2JqLm1vbnRoc0xpc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubW9udGhzTGlzdCA9IHRoaXMubW9udGhzTGlzdDtcbiAgICB9XG5cbiAgICB0aGlzLnllYXJzTGlzdCA9IHRoaXMuZ2V0WWVhcnNMaXN0KHRoaXMubWFpbk9iai5mcm9tLCB0aGlzLm1haW5PYmoudG8pO1xuXG4gICAgdGhpcy5kYXlzTGlzdCA9IFtdO1xuICAgIGxldCB0ZW1wRGF0ZSwgZGlzYWJsZWQ7XG4gICAgdGhpcy5maXJzdERheUVwb2NoID0gdGhpcy5yZXNldEhNU00obmV3IERhdGUoY3VycmVudERhdGUuZ2V0RnVsbFllYXIoKSwgY3VycmVudERhdGUuZ2V0TW9udGgoKSwgZmlyc3REYXkpKS5nZXRUaW1lKCk7XG4gICAgdGhpcy5sYXN0RGF5RXBvY2ggPSB0aGlzLnJlc2V0SE1TTShuZXcgRGF0ZShjdXJyZW50RGF0ZS5nZXRGdWxsWWVhcigpLCBjdXJyZW50RGF0ZS5nZXRNb250aCgpLCBsYXN0RGF5KSkuZ2V0VGltZSgpO1xuXG4gICAgZm9yIChsZXQgaSA9IGZpcnN0RGF5OyBpIDw9IGxhc3REYXk7IGkrKykge1xuICAgICAgdGVtcERhdGUgPSBuZXcgRGF0ZShjdXJyZW50RGF0ZS5nZXRGdWxsWWVhcigpLCBjdXJyZW50RGF0ZS5nZXRNb250aCgpLCBpKTtcbiAgICAgIGRpc2FibGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBkYXkgPSB0ZW1wRGF0ZS5nZXREYXkoKTtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVXZWVrZGF5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVXZWVrZGF5cy5pbmRleE9mKGRheSkgPj0gMCkge1xuICAgICAgICAgIGRpc2FibGVkID0gdGhpcy5kaXNhYmxlV2Vla2RheXMuaW5kZXhPZihkYXkpID49IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5kaXNhYmxlZERhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWREYXRlcy5pbmRleE9mKHRlbXBEYXRlLmdldFRpbWUoKSkgPj0gMCkge1xuICAgICAgICAgIGRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5mcm9tRGF0ZSAmJiAhZGlzYWJsZWQpIHtcbiAgICAgICAgZGlzYWJsZWQgPSB0ZW1wRGF0ZS5nZXRUaW1lKCkgPCB0aGlzLmZyb21EYXRlIHx8IHRoaXMubWFpbk9iai5kaXNhYmxlV2Vla0RheXMuaW5kZXhPZih0ZW1wRGF0ZS5nZXREYXkoKSkgPj0gMDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnRvRGF0ZSAmJiAhZGlzYWJsZWQpIHtcbiAgICAgICAgZGlzYWJsZWQgPSB0ZW1wRGF0ZS5nZXRUaW1lKCkgPiB0aGlzLnRvRGF0ZSB8fCB0aGlzLm1haW5PYmouZGlzYWJsZVdlZWtEYXlzLmluZGV4T2YodGVtcERhdGUuZ2V0RGF5KCkpID49IDA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhpZ2h0TGlnaHREYXRlID0gdGhpcy5oaWdobGlnaHRlZERhdGVzW3RlbXBEYXRlLmdldFRpbWUoKV07XG5cbiAgICAgIGxldCBmb250Q29sb3IgPSBudWxsO1xuXG4gICAgICBpZiAodGVtcERhdGUuZ2V0RGF5KCkgPT09IDAgJiYgdGhpcy5tYWluT2JqLmlzU3VuZGF5SGlnaGxpZ2h0ZWQgJiYgdGhpcy5tYWluT2JqLmlzU3VuZGF5SGlnaGxpZ2h0ZWQuZm9udENvbG9yKSB7XG4gICAgICAgIGZvbnRDb2xvciA9IHRoaXMubWFpbk9iai5pc1N1bmRheUhpZ2hsaWdodGVkLmZvbnRDb2xvcjtcbiAgICAgIH0gZWxzZSBpZiAoaGlnaHRMaWdodERhdGUgJiYgaGlnaHRMaWdodERhdGUuZm9udENvbG9yKSB7XG4gICAgICAgIGZvbnRDb2xvciA9IGhpZ2h0TGlnaHREYXRlLmZvbnRDb2xvcjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kYXlzTGlzdC5wdXNoKHtcbiAgICAgICAgZGF0ZTogdGVtcERhdGUuZ2V0RGF0ZSgpLFxuICAgICAgICBtb250aDogdGVtcERhdGUuZ2V0TW9udGgoKSxcbiAgICAgICAgeWVhcjogdGVtcERhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgZGF5OiB0ZW1wRGF0ZS5nZXREYXkoKSxcbiAgICAgICAgZXBvY2g6IHRlbXBEYXRlLmdldFRpbWUoKSxcbiAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAgICBjb2xvcjogaGlnaHRMaWdodERhdGUgJiYgaGlnaHRMaWdodERhdGUuY29sb3IgPyBoaWdodExpZ2h0RGF0ZS5jb2xvciA6IG51bGwsXG4gICAgICAgIGZvbnRDb2xvcjogZm9udENvbG9yXG4gICAgICAgIC8vIGZvbnRDb2xvcjogaGlnaHRMaWdodERhdGUgJiYgaGlnaHRMaWdodERhdGUuZm9udENvbG9yID8gaGlnaHRMaWdodERhdGUuZm9udENvbG9yIDogbnVsbFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gVG8gc2V0IE1vbmRheSBhcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgIGxldCBmaXJzdERheU1vbmRheSA9IHRoaXMuZGF5c0xpc3RbMF0uZGF5IC0gdGhpcy5tYWluT2JqLm1vbmRheUZpcnN0O1xuICAgIGZpcnN0RGF5TW9uZGF5ID0gZmlyc3REYXlNb25kYXkgPCAwID8gNiA6IGZpcnN0RGF5TW9uZGF5O1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgZmlyc3REYXlNb25kYXk7IGorKykge1xuICAgICAgdGhpcy5kYXlzTGlzdC51bnNoaWZ0KHt9KTtcbiAgICB9XG4gICAgdGhpcy5yb3dzID0gWzAsIDcsIDE0LCAyMSwgMjgsIDM1XTtcbiAgICB0aGlzLmNvbHMgPSBbMCwgMSwgMiwgMywgNCwgNSwgNl07XG4gICAgdGhpcy5kYXRhLmN1cnJlbnRNb250aCA9IHRoaXMubWFpbk9iai5tb250aHNMaXN0W2N1cnJlbnREYXRlLmdldE1vbnRoKCldO1xuICAgIHRoaXMuZGF0YS5jdXJyZW50WWVhciA9IGN1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgdGhpcy5kYXRhLmN1cnJlbnRNb250aFNlbGVjdGVkID0gdGhpcy5kYXRhLmN1cnJlbnRNb250aDtcbiAgICB0aGlzLmN1cnJlbnRZZWFyU2VsZWN0ZWQgPSB0aGlzLmRhdGEuY3VycmVudFllYXI7XG4gICAgdGhpcy5udW1Db2x1bW5zID0gNztcbiAgfVxuXG4gIC8vIFNldHRpbmcgdXAgdGhlIGluaXRpYWwgb2JqZWN0XG4gIHNldEluaXRpYWxPYmooaXBPYmopIHtcbiAgICAvLyBjb25zb2xlLmxvZygnc2V0SW5pdGlhbE9iaiA9PicsIGlwT2JqKTtcbiAgICB0aGlzLm1haW5PYmogPSBpcE9iajtcbiAgICBpZiAodGhpcy5pc1NlbGVjdGVkRGF0ZUZvdW5kKSB7XG4gICAgICB0aGlzLmlzU2VsZWN0ZWREYXRlRm91bmQgPSB0cnVlO1xuICAgICAgdGhpcy5zZWxjdGVkRGF0ZUVwb2NoID0gdGhpcy5yZXNldEhNU00odGhpcy5tYWluT2JqLmlucHV0RGF0ZSkuZ2V0VGltZSgpO1xuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RyaW5nID0gdGhpcy5mb3JtYXREYXRlKCk7XG5cbiAgICBpZiAodGhpcy5tYWluT2JqLndlZWtzTGlzdCAmJiB0aGlzLm1haW5PYmoud2Vla3NMaXN0Lmxlbmd0aCA9PT0gNykge1xuICAgICAgdGhpcy53ZWVrc0xpc3QgPSB0aGlzLm1haW5PYmoud2Vla3NMaXN0O1xuICAgIH1cbiAgICBpZiAodGhpcy5tYWluT2JqLm1vbmRheUZpcnN0KSB7XG4gICAgICB0aGlzLndlZWtzTGlzdC5wdXNoKHRoaXMubWFpbk9iai53ZWVrc0xpc3Quc2hpZnQoKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLm1haW5PYmoueWVhckluQXNjZW5kaW5nKSB7XG4gICAgICB0aGlzLnllYXJJbkFzY2VuZGluZyA9IHRoaXMubWFpbk9iai55ZWFySW5Bc2NlbmRpbmc7XG4gICAgfVxuICAgIGlmICh0aGlzLm1haW5PYmoubW9tZW50TG9jYWxlKSB7XG4gICAgICB0aGlzLm1vbWVudExvY2FsZSA9IHRoaXMubWFpbk9iai5tb21lbnRMb2NhbGU7XG4gICAgfVxuICAgIHRoaXMuZGlzYWJsZVdlZWtkYXlzID0gdGhpcy5tYWluT2JqLmRpc2FibGVXZWVrRGF5cztcbiAgICB0aGlzLnNldERpc2FibGVkRGF0ZXModGhpcy5tYWluT2JqKTtcbiAgICB0aGlzLnJlZnJlc2hEYXRlTGlzdCh0aGlzLm1haW5PYmouaW5wdXREYXRlKTtcbiAgfVxuXG4gIC8vIGZvciBkaXNtaXNzIG1vZGFsXG4gIGNsb3NlTW9kYWwoc2VsZWN0ZWREYXRlKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ2Nsb3NlTW9kYWwgPT4gJywgc2VsZWN0ZWREYXRlKTtcbiAgICB0aGlzLm1vZGFsQ3RybC5nZXRUb3AoKTtcbiAgICBjb25zdCBmb3JtYXR0ZWREYXRlID0gbW9tZW50KHNlbGVjdGVkRGF0ZSkuZm9ybWF0KHRoaXMubWFpbk9iai5kYXRlRm9ybWF0KTtcbiAgICB0aGlzLm1vZGFsQ3RybC5kaXNtaXNzKHsgZGF0ZTogZm9ybWF0dGVkRGF0ZSB9KTtcbiAgfVxuXG4gIC8vIGNsb3NlIG1vZGFsIGJ1dHRvblxuICBjbG9zZUlvbmljRGF0ZVBpY2tlck1vZGFsKCkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdjbG9zZUlvbmljRGF0ZVBpY2tlck1vZGFsJyk7XG4gICAgdGhpcy5jbG9zZU1vZGFsKG51bGwpO1xuICB9XG5cbiAgLy8gZ2V0IHllYXJzIGxpc3QgICggR0lWRSBIRVJFIE1JTiBPUiBNQVggWUVBUiBJTiBEQVRFX1BJQ0tFUiApXG4gIGdldFllYXJzTGlzdChmcm9tLCB0bykge1xuICAgIC8vIGNvbnNvbGUubG9nKCdnZXRZZWFyc0xpc3QgPT4nLCBmcm9tLCB0byk7XG4gICAgY29uc3QgeWVhcnNMaXN0ID0gW107XG4gICAgbGV0IG1pblllYXIgPSAxOTUwO1xuICAgIGxldCBtYXhZZWFyID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpICsgMTtcbiAgICBtaW5ZZWFyID0gZnJvbSA/IG5ldyBEYXRlKGZyb20pLmdldEZ1bGxZZWFyKCkgOiBtaW5ZZWFyO1xuICAgIG1heFllYXIgPSB0byA/IG5ldyBEYXRlKHRvKS5nZXRGdWxsWWVhcigpIDogbWF4WWVhcjtcbiAgICAvLyBjb25zb2xlLmxvZygnZ2V0WWVhcnNMaXN0OiAnLCB0aGlzLnllYXJJbkFzY2VuZGluZyk7XG4gICAgaWYgKHRoaXMueWVhckluQXNjZW5kaW5nKSB7XG4gICAgICBmb3IgKGxldCBpID0gbWluWWVhcjsgaSA8PSBtYXhZZWFyOyBpKyspIHtcbiAgICAgICAgeWVhcnNMaXN0LnB1c2goaSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSBtYXhZZWFyOyBpID49IG1pblllYXI7IGktLSkge1xuICAgICAgICB5ZWFyc0xpc3QucHVzaChpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHllYXJzTGlzdDtcbiAgfVxuXG4gIC8vIEluaXQgRGF0ZS1QaWNrZXJcbiAgaW5pdERhdGVQaWNrZXIoKSB7XG4gICAgdGhpcy5mcm9tRGF0ZSA9IFwiXCI7XG4gICAgdGhpcy50b0RhdGUgPSBcIlwiO1xuICAgIC8vICRzY29wZS5tYWluT2JqID0gYW5ndWxhci5leHRlbmQoe30sIGNvbmZpZywgaXBPYmopO1xuICAgIGlmICh0aGlzLm1haW5PYmouZnJvbSkge1xuICAgICAgdGhpcy5mcm9tRGF0ZSA9IHRoaXMucmVzZXRITVNNKG5ldyBEYXRlKHRoaXMubWFpbk9iai5mcm9tKSkuZ2V0VGltZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYWluT2JqLnRvKSB7XG4gICAgICB0aGlzLnRvRGF0ZSA9IHRoaXMucmVzZXRITVNNKG5ldyBEYXRlKHRoaXMubWFpbk9iai50bykpLmdldFRpbWUoKTtcbiAgICB9XG4gICAgLy8gaWYgKGlwT2JqLmRpc2FibGVXZWVrZGF5cyAmJiB0aGlzLmNvbmZpZy5kaXNhYmxlV2Vla2RheXMpIHtcbiAgICAvLyAgIHRoaXMubWFpbk9iai5kaXNhYmxlV2Vla0RheXMgPSBpcE9iai5kaXNhYmxlV2Vla2RheXMuY29uY2F0KHRoaXMuY29uZmlnLmRpc2FibGVXZWVrZGF5cyk7XG4gICAgLy8gfVxuICAgIHRoaXMuc2V0SW5pdGlhbE9iaih0aGlzLm1haW5PYmopO1xuICB9XG5cbiAgLy8gSW5pdCBEYXRlUGlja2VyIE9iamVjdFxuICBpbml0RGF0ZVBpY2tlck9iaihjb25maWcpIHtcbiAgICAvLyBjb25zdCBjb25maWcgPSB0aGlzLm1haW5PYmo7XG5cbiAgICBpZiAoY29uZmlnLmlucHV0RGF0ZSAmJiAhdGhpcy5zZWxlY3RlZERhdGUuZGF0ZSkge1xuICAgICAgdGhpcy5pc1NlbGVjdGVkRGF0ZUZvdW5kID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlLmRhdGUgPSBjb25maWcuaW5wdXREYXRlO1xuICAgIH1cblxuICAgIGNvbnN0IG9iakNvbmZpZzogYW55ID0ge307XG4gICAgb2JqQ29uZmlnLmZyb20gPSBjb25maWcuZnJvbURhdGUgPyBjb25maWcuZnJvbURhdGUgOiBcIlwiO1xuICAgIG9iakNvbmZpZy50byA9IGNvbmZpZy50b0RhdGUgPyBjb25maWcudG9EYXRlIDogXCJcIjtcbiAgICBvYmpDb25maWcuc2hvd1RvZGF5QnV0dG9uID0gY29uZmlnLnNob3dUb2RheUJ1dHRvbiA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IGNvbmZpZy5zaG93VG9kYXlCdXR0b247XG4gICAgb2JqQ29uZmlnLmNsb3NlT25TZWxlY3QgPSBjb25maWcuY2xvc2VPblNlbGVjdCA/IGNvbmZpZy5jbG9zZU9uU2VsZWN0IDogZmFsc2U7XG4gICAgb2JqQ29uZmlnLmRpc2FibGVXZWVrRGF5cyA9IGNvbmZpZy5kaXNhYmxlV2Vla0RheXMgPyBjb25maWcuZGlzYWJsZVdlZWtEYXlzIDogW107XG4gICAgb2JqQ29uZmlnLm1vbmRheUZpcnN0ID0gY29uZmlnLm1vbmRheUZpcnN0ID8gY29uZmlnLm1vbmRheUZpcnN0IDogZmFsc2U7XG4gICAgb2JqQ29uZmlnLnNldExhYmVsID0gY29uZmlnLnNldExhYmVsID8gY29uZmlnLnNldExhYmVsIDogXCJTZXRcIjtcbiAgICBvYmpDb25maWcudG9kYXlMYWJlbCA9IGNvbmZpZy50b2RheUxhYmVsID8gY29uZmlnLnRvZGF5TGFiZWwgOiBcIlRvZGF5XCI7XG4gICAgb2JqQ29uZmlnLmNsb3NlTGFiZWwgPSBjb25maWcuY2xvc2VMYWJlbCA/IGNvbmZpZy5jbG9zZUxhYmVsIDogXCJDbG9zZVwiO1xuICAgIG9iakNvbmZpZy5kaXNhYmxlZERhdGVzID0gY29uZmlnLmRpc2FibGVkRGF0ZXMgPyBjb25maWcuZGlzYWJsZWREYXRlcyA6IFtdO1xuICAgIG9iakNvbmZpZy50aXRsZUxhYmVsID0gY29uZmlnLnRpdGxlTGFiZWwgPyBjb25maWcudGl0bGVMYWJlbCA6IG51bGw7XG5cbiAgICBvYmpDb25maWcubW9udGhzTGlzdCA9IGNvbmZpZy5tb250aHNMaXN0ID8gY29uZmlnLm1vbnRoc0xpc3QgOiB0aGlzLm1vbnRoc0xpc3Q7XG4gICAgb2JqQ29uZmlnLm1vbnRoc0xpc3QgPSBbLi4ub2JqQ29uZmlnLm1vbnRoc0xpc3RdO1xuXG4gICAgb2JqQ29uZmlnLndlZWtzTGlzdCA9IGNvbmZpZy53ZWVrc0xpc3QgPyBjb25maWcud2Vla3NMaXN0IDogdGhpcy53ZWVrc0xpc3Q7XG4gICAgb2JqQ29uZmlnLndlZWtzTGlzdCA9IFsuLi5vYmpDb25maWcud2Vla3NMaXN0XTtcblxuICAgIG9iakNvbmZpZy5kYXRlRm9ybWF0ID0gY29uZmlnLmRhdGVGb3JtYXQgPyBjb25maWcuZGF0ZUZvcm1hdCA6IFwiREQgTU1NIFlZWVlcIjtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnNlbGVjdGVkRGF0ZS5kYXRlLCBvYmpDb25maWcuZGF0ZUZvcm1hdCwgbW9tZW50LmxvY2FsZSgpKTtcblxuICAgIG9iakNvbmZpZy5jbGVhckJ1dHRvbiA9IGNvbmZpZy5jbGVhckJ1dHRvbiA/IGNvbmZpZy5jbGVhckJ1dHRvbiA6IGZhbHNlO1xuXG4gICAgb2JqQ29uZmlnLnllYXJJbkFzY2VuZGluZyA9IGNvbmZpZy55ZWFySW5Bc2NlbmRpbmcgPyBjb25maWcueWVhckluQXNjZW5kaW5nIDogZmFsc2U7XG4gICAgb2JqQ29uZmlnLm1vbWVudExvY2FsZSA9IGNvbmZpZy5tb21lbnRMb2NhbGUgPyBjb25maWcubW9tZW50TG9jYWxlIDogXCJlbi1VU1wiO1xuXG4gICAgbW9tZW50LmxvY2FsZShvYmpDb25maWcubW9tZW50TG9jYWxlKTtcbiAgICBvYmpDb25maWcuaW5wdXREYXRlID0gdGhpcy5zZWxlY3RlZERhdGUuZGF0ZSA/IG1vbWVudCh0aGlzLnNlbGVjdGVkRGF0ZS5kYXRlLCBvYmpDb25maWcuZGF0ZUZvcm1hdCkudG9EYXRlKCkgOiBuZXcgRGF0ZSgpO1xuXG4gICAgb2JqQ29uZmlnLmJ0bkNsb3NlU2V0SW5SZXZlcnNlID0gY29uZmlnLmJ0bkNsb3NlU2V0SW5SZXZlcnNlID8gY29uZmlnLmJ0bkNsb3NlU2V0SW5SZXZlcnNlIDogZmFsc2U7XG5cbiAgICBvYmpDb25maWcuYnRuUHJvcGVydGllcyA9IHt9O1xuICAgIGlmIChjb25maWcuYnRuUHJvcGVydGllcykge1xuICAgICAgY29uc3QgYnRuUHJvcGVydGllcyA9IGNvbmZpZy5idG5Qcm9wZXJ0aWVzO1xuICAgICAgb2JqQ29uZmlnLmJ0blByb3BlcnRpZXMuZXhwYW5kID0gYnRuUHJvcGVydGllcy5leHBhbmQgPyBidG5Qcm9wZXJ0aWVzLmV4cGFuZCA6IFwiYmxvY2tcIjtcbiAgICAgIG9iakNvbmZpZy5idG5Qcm9wZXJ0aWVzLmZpbGwgPSBidG5Qcm9wZXJ0aWVzLmZpbGwgPyBidG5Qcm9wZXJ0aWVzLmZpbGwgOiBcInNvbGlkXCI7XG4gICAgICBvYmpDb25maWcuYnRuUHJvcGVydGllcy5zaXplID0gYnRuUHJvcGVydGllcy5zaXplID8gYnRuUHJvcGVydGllcy5zaXplIDogXCJkZWZhdWx0XCI7XG4gICAgICBvYmpDb25maWcuYnRuUHJvcGVydGllcy5jb2xvciA9IGJ0blByb3BlcnRpZXMuY29sb3IgPyBidG5Qcm9wZXJ0aWVzLmNvbG9yIDogXCJcIjtcbiAgICAgIG9iakNvbmZpZy5idG5Qcm9wZXJ0aWVzLmRpc2FibGVkID0gYnRuUHJvcGVydGllcy5kaXNhYmxlZCA/IGJ0blByb3BlcnRpZXMuZGlzYWJsZWQgOiBmYWxzZTtcbiAgICAgIG9iakNvbmZpZy5idG5Qcm9wZXJ0aWVzLnN0cm9uZyA9IGJ0blByb3BlcnRpZXMuc3Ryb25nID8gYnRuUHJvcGVydGllcy5zdHJvbmcgOiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2JqQ29uZmlnLmJ0blByb3BlcnRpZXMuZXhwYW5kID0gXCJibG9ja1wiO1xuICAgICAgb2JqQ29uZmlnLmJ0blByb3BlcnRpZXMuZmlsbCA9IFwic29saWRcIjtcbiAgICAgIG9iakNvbmZpZy5idG5Qcm9wZXJ0aWVzLnNpemUgPSBcImRlZmF1bHRcIjtcbiAgICAgIG9iakNvbmZpZy5idG5Qcm9wZXJ0aWVzLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICBvYmpDb25maWcuYnRuUHJvcGVydGllcy5zdHJvbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBvYmpDb25maWcuYXJyb3dOZXh0UHJldiA9IHt9O1xuICAgIGlmIChjb25maWcuYXJyb3dOZXh0UHJldikge1xuICAgICAgY29uc3QgYXJyb3dOZXh0UHJldiA9IGNvbmZpZy5hcnJvd05leHRQcmV2O1xuICAgICAgb2JqQ29uZmlnLmFycm93TmV4dFByZXYubmV4dEFycm93U3JjID0gYXJyb3dOZXh0UHJldi5uZXh0QXJyb3dTcmMgPyBhcnJvd05leHRQcmV2Lm5leHRBcnJvd1NyYyA6IGZhbHNlO1xuICAgICAgb2JqQ29uZmlnLmFycm93TmV4dFByZXYucHJldkFycm93U3JjID0gYXJyb3dOZXh0UHJldi5wcmV2QXJyb3dTcmMgPyBhcnJvd05leHRQcmV2LnByZXZBcnJvd1NyYyA6IGZhbHNlO1xuICAgIH1cblxuICAgIG9iakNvbmZpZy5oaWdobGlnaHRlZERhdGVzID0gW107XG4gICAgaWYgKGNvbmZpZy5oaWdobGlnaHRlZERhdGVzICYmIGNvbmZpZy5oaWdobGlnaHRlZERhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIG9iakNvbmZpZy5oaWdobGlnaHRlZERhdGVzID0gY29uZmlnLmhpZ2hsaWdodGVkRGF0ZXM7XG5cbiAgICAgIHRoaXMuc2V0SGlnaHRsaWdodGVkRGF0ZXMob2JqQ29uZmlnKTtcbiAgICB9XG5cbiAgICBvYmpDb25maWcuaXNTdW5kYXlIaWdobGlnaHRlZCA9IHt9O1xuICAgIGlmIChjb25maWcuaXNTdW5kYXlIaWdobGlnaHRlZCkge1xuICAgICAgY29uc3QgaXNTdW5kYXlIaWdobGlnaHRlZCA9IGNvbmZpZy5pc1N1bmRheUhpZ2hsaWdodGVkO1xuICAgICAgb2JqQ29uZmlnLmlzU3VuZGF5SGlnaGxpZ2h0ZWQuZm9udENvbG9yID0gaXNTdW5kYXlIaWdobGlnaHRlZC5mb250Q29sb3IgPyBpc1N1bmRheUhpZ2hsaWdodGVkLmZvbnRDb2xvciA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gY29uc29sZS5sb2coJ2NvbmZpZyA9PicsIG9iakNvbmZpZyk7XG4gICAgcmV0dXJuIG9iakNvbmZpZztcbiAgfVxuXG4gIC8vIEZvcm1hdCBkYXRlXG4gIGZvcm1hdERhdGUoKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ2Zvcm1hdERhdGU6ICcsIHRoaXMuc2VsY3RlZERhdGVFcG9jaCwgbmV3IERhdGUodGhpcy5zZWxjdGVkRGF0ZUVwb2NoKSk7XG4gICAgcmV0dXJuIG1vbWVudCh0aGlzLnNlbGN0ZWREYXRlRXBvY2gpLmZvcm1hdCh0aGlzLm1haW5PYmouZGF0ZUZvcm1hdCk7XG4gIH1cbn1cbiJdfQ==