@asi-ngtools/lib
Version:
This project is a little components library, simple to use, which will help you to simplify your project.
340 lines (339 loc) • 34.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { DefaultControlValueAccessor } from './../common/default-control-value-accessor';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { Component, forwardRef, Input, Output, EventEmitter, ElementRef, Inject, PLATFORM_ID } from '@angular/core';
import { isPlatformBrowser } from '@angular/common';
import * as calendarConst from './asi-calendar-constants';
import * as nh from '../../native-helper';
import moment from 'moment';
export class AsiCalendarComponent extends DefaultControlValueAccessor {
/**
* @param {?} platformId
*/
constructor(platformId) {
super();
this.platformId = platformId;
this.onDatePicked = new EventEmitter();
this.open = false;
if (this.isFr()) {
this.days = calendarConst.days_fr;
this.months = calendarConst.months_fr;
}
else {
this.days = calendarConst.days_en;
this.months = calendarConst.months_en;
}
this.initYears();
}
/**
* allow you to disable day of week exemple [disableDayOfWeek]="[1, 2]"" while disabled monday and tusday
* @param {?} daysOfWeek
* @return {?}
*/
set disableDayOfWeek(daysOfWeek) {
if (!daysOfWeek) {
this._disableDayOfWeek = [];
}
else if (nh.isArray(daysOfWeek)) {
this._disableDayOfWeek = daysOfWeek;
}
else {
this._disableDayOfWeek = [daysOfWeek];
}
}
/**
* @return {?}
*/
isFr() {
if (isPlatformBrowser(this.platformId)) {
return navigator.language === 'fr' || navigator.language === 'fr-FR';
}
else {
return false;
}
}
/**
* @return {?}
*/
ngOnChanges() {
if (this.minDate) {
this.minDate.setHours(0, 0, 0, 0);
}
if (this.maxDate) {
this.maxDate.setHours(23, 59, 59, 999);
}
this.calculDays();
}
/**
* @return {?}
*/
initYears() {
/** @type {?} */
let results = new Array();
/** @type {?} */
let currentYear = new Date().getFullYear() + 1;
for (let year = currentYear; year >= 1900; year--) {
results.push(year);
}
this.years = results;
}
/**
* @return {?}
*/
onDropdownClose() {
this.open = false;
}
/**
* @return {?}
*/
openCalendar() {
this.open = true;
}
/**
* @return {?}
*/
closeCalendar() {
this.open = false;
}
/**
* @param {?} dayItem
* @return {?}
*/
onDaySelected(dayItem) {
this.selectedDay = new calendarConst.DayItem(dayItem.day, dayItem.month, dayItem.year, dayItem.date, 'selected enabled');
this.value = dayItem.date;
this.closeCalendar();
this.calculDays();
this.onDatePicked.emit(this.value);
}
/**
* @return {?}
*/
onMonthSelected() {
/** @type {?} */
let date = new Date(this.selectedYear, this.selectedMonth.num - 1, this.selectedDay.day);
this.value = date;
this.calculDays();
this.onDatePicked.emit(date);
}
/**
* @return {?}
*/
onYearSelected() {
/** @type {?} */
let date = new Date(this.selectedYear, this.selectedMonth.num - 1, this.selectedDay.day);
this.value = date;
this.calculDays();
this.onDatePicked.emit(date);
}
/**
* @return {?}
*/
calculDays() {
if (!this.selectedMonth || !this.selectedYear) {
return;
}
/** @type {?} */
let month = this.selectedMonth.num - 1;
/** @type {?} */
let year = this.selectedYear;
/** @type {?} */
const result = [];
/** @type {?} */
let date = new Date(year, month, 1);
/** @type {?} */
let mondayDelta = 0;
/** @type {?} */
let day = date.getDay();
if (day === 0) {
mondayDelta = -6;
}
else {
mondayDelta = -(day - 1);
}
date = moment(date).add(mondayDelta, 'days').toDate();
/** @type {?} */
let deltaMonth = date.getMonth();
if (deltaMonth !== month) {
// Before first day of the month
while (date.getMonth() === deltaMonth) {
if (date.getDate() === this.selectedDay.day
&& date.getMonth() + 1 === this.selectedDay.month
&& date.getFullYear() === this.selectedDay.year) {
result.push(this.selectedDay);
}
else {
result.push(new calendarConst.DayItem(date.getDate(), date.getMonth() + 1, date.getFullYear(), new Date(date), 'extra enabled'));
}
date.setDate(date.getDate() + 1);
}
}
// Month dates
while (date.getMonth() === month) {
if (date.getDate() === this.selectedDay.day
&& date.getMonth() + 1 === this.selectedDay.month
&& date.getFullYear() === this.selectedDay.year) {
result.push(this.selectedDay);
}
else {
result.push(new calendarConst.DayItem(date.getDate(), date.getMonth() + 1, date.getFullYear(), new Date(date), 'enabled'));
}
date.setDate(date.getDate() + 1);
}
// Days of the last week
while (date.getDay() !== 1) {
if (date.getDate() === this.selectedDay.day
&& date.getMonth() + 1 === this.selectedDay.month
&& date.getFullYear() === this.selectedDay.year) {
result.push(this.selectedDay);
}
else {
result.push(new calendarConst.DayItem(date.getDate(), date.getMonth() + 1, date.getFullYear(), new Date(date), 'extra enabled'));
}
date.setDate(date.getDate() + 1);
}
this.dayOfMonths = result;
this.manageDisabledDate();
}
/**
* @return {?}
*/
manageDisabledDate() {
/** @type {?} */
const dayOfWeekDisabled = !nh.isEmpty(this._disableDayOfWeek);
if (this.dayOfMonths) {
nh.forEach(this.dayOfMonths, (dayItem) => {
if (this.minDate != null) {
if (dayItem.date < this.minDate) {
dayItem.class = 'disabled';
}
}
if (this.maxDate != null) {
if (dayItem.date > this.maxDate) {
dayItem.class = 'disabled';
}
}
if (dayOfWeekDisabled && this._disableDayOfWeek.includes(/** @type {?} */ (dayItem.date.getDay()))) {
dayItem.class = 'disabled';
}
});
}
}
/**
* @param {?} value
* @return {?}
*/
writeValue(value) {
this._value = value;
this.initToDate(value);
}
/**
* @param {?} value
* @return {?}
*/
initToDate(value) {
if (value == null) {
value = new Date();
}
this.selectedYear = value.getFullYear();
/** @type {?} */
let dateMonth = value.getMonth() + 1;
this.selectedMonth = nh.find(this.months, (month) => {
return month.num === dateMonth;
});
this.selectedDay = new calendarConst.DayItem(value.getDate(), this.selectedMonth.num, this.selectedYear, new Date(value), 'selected enabled');
this.calculDays();
}
/**
* @return {?}
*/
goNextMonth() {
/** @type {?} */
let nextMonthNum = this.selectedMonth.num + 1;
if (nextMonthNum === 13) {
nextMonthNum = 1;
this.selectedYear = this.selectedYear + 1;
if (this.years.indexOf(this.selectedYear) === -1) {
this.years.push(this.selectedYear);
}
}
this.selectedMonth = nh.find(this.months, (month) => {
return month.num === nextMonthNum;
});
this.calculDays();
}
/**
* @return {?}
*/
goPreviousMonth() {
/** @type {?} */
let nextMonthNum = this.selectedMonth.num - 1;
if (nextMonthNum === 0) {
nextMonthNum = 12;
this.selectedYear = this.selectedYear - 1;
}
this.selectedMonth = nh.find(this.months, (month) => {
return month.num === nextMonthNum;
});
this.calculDays();
}
}
AsiCalendarComponent.decorators = [
{ type: Component, args: [{
selector: 'asi-calendar',
template: "<asi-fa-icon [disabled]=\"disabled\" icon=\"fa fa-calendar\" (onClick)=\"open = !open\"></asi-fa-icon>\n\n<asi-dropdown [open]=\"open\" [relativeTo]=\"relativeTo\" (onClose)=\"onDropdownClose()\" [calculWidth]=\"false\"\n dropDownClass=\"asi-calendar-dropdown\">\n\n <div class=\"asi-calendar-picker\">\n <div class=\"calendar-header\">\n <asi-fa-icon icon=\"fa fa-angle-left\" size=\"lg\" (onClick)=\"goPreviousMonth()\"></asi-fa-icon>\n <asi-select class=\"select-month\" [disabled]=\"disabled\" [(ngModel)]=\"selectedMonth\" [data]=\"months\"\n (onValueChange)=\"calculDays()\">\n <asi-selected *asiSelectedDef=\"let data\">{{data.num + \" - \" + data.libelle}}</asi-selected>\n <asi-option *asiOptionDef=\"let data\">{{data.num + \" - \" + data.libelle}}</asi-option>\n </asi-select>\n <asi-select class=\"select-year\" [disabled]=\"disabled\" [(ngModel)]=\"selectedYear\" [data]=\"years\"\n (onValueChange)=\"calculDays()\">\n <asi-selected *asiSelectedDef=\"let data\">{{data}}</asi-selected>\n <asi-option *asiOptionDef=\"let data\">{{data}}</asi-option>\n </asi-select>\n <asi-fa-icon icon=\"fa fa-angle-right\" size=\"lg\" (onClick)=\"goNextMonth()\"></asi-fa-icon>\n </div>\n <div class=\"day-list\">\n <div class=\"day-str\" *ngFor=\"let day of days\">\n <span>{{day.libelle}}</span>\n </div>\n </div>\n <div class=\"calendar-panel\" mouseWheel (mouseWheelUp)=\"goPreviousMonth()\" (mouseWheelDown)=\"goNextMonth()\">\n <button [attr.disabled]=\"day.class === 'disabled' ? true : null\" class=\"day-item\" *ngFor=\"let day of dayOfMonths\"\n [ngClass]=\"day.class\" (click)=\"onDaySelected(day)\">\n <span>{{day.day}}</span>\n </button>\n </div>\n </div>\n</asi-dropdown>\n",
host: { 'class': 'asi-component asi-calendar' },
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AsiCalendarComponent),
multi: true
}
]
}] }
];
/** @nocollapse */
AsiCalendarComponent.ctorParameters = () => [
{ type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }
];
AsiCalendarComponent.propDecorators = {
relativeTo: [{ type: Input }],
minDate: [{ type: Input }],
maxDate: [{ type: Input }],
disableDayOfWeek: [{ type: Input }],
onDatePicked: [{ type: Output }]
};
if (false) {
/** @type {?} */
AsiCalendarComponent.prototype.relativeTo;
/** @type {?} */
AsiCalendarComponent.prototype.minDate;
/** @type {?} */
AsiCalendarComponent.prototype.maxDate;
/** @type {?} */
AsiCalendarComponent.prototype._disableDayOfWeek;
/** @type {?} */
AsiCalendarComponent.prototype.onDatePicked;
/** @type {?} */
AsiCalendarComponent.prototype.days;
/** @type {?} */
AsiCalendarComponent.prototype.months;
/** @type {?} */
AsiCalendarComponent.prototype.years;
/** @type {?} */
AsiCalendarComponent.prototype.selectedMonth;
/** @type {?} */
AsiCalendarComponent.prototype.selectedYear;
/** @type {?} */
AsiCalendarComponent.prototype.selectedDay;
/** @type {?} */
AsiCalendarComponent.prototype.dayOfMonths;
/** @type {?} */
AsiCalendarComponent.prototype.open;
/** @type {?} */
AsiCalendarComponent.prototype.platformId;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpLWNhbGVuZGFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bhc2ktbmd0b29scy9saWIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9hc2ktY2FsZW5kYXIvYXNpLWNhbGVuZGFyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDekYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDL0gsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFcEQsT0FBTyxLQUFLLGFBQWEsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFDLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQWM1QixNQUFNLDJCQUE0QixTQUFRLDJCQUEyQjs7OztJQW9DbkUsWUFBeUMsVUFBZTtRQUN0RCxLQUFLLEVBQUUsQ0FBQztRQUQrQixlQUFVLEdBQVYsVUFBVSxDQUFLOzRCQWQvQixJQUFJLFlBQVksRUFBUTtvQkFZMUMsS0FBSztRQUlWLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDaEIsSUFBSSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQztTQUN2QztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sSUFBSSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxN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LEVBQUUsRUFBRTtZQUNsRCxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxZQUFZLENBQUM7U0FDbkMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0tBQ25COzs7WUFqUUYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxjQUFjO2dCQUN4QixzeURBQTBDO2dCQUMxQyxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsNEJBQTRCLEVBQUU7Z0JBQy9DLFNBQVMsRUFBRTtvQkFDVDt3QkFDRSxPQUFPLEVBQUUsaUJBQWlCO3dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLG9CQUFvQixDQUFDO3dCQUNuRCxLQUFLLEVBQUUsSUFBSTtxQkFDWjtpQkFDRjthQUNGOzs7OzRDQXFDYyxNQUFNLFNBQUMsV0FBVzs7O3lCQWxDOUIsS0FBSztzQkFFTCxLQUFLO3NCQUNMLEtBQUs7K0JBS0wsS0FBSzsyQkFZTCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVmYXVsdENvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnLi8uLi9jb21tb24vZGVmYXVsdC1jb250cm9sLXZhbHVlLWFjY2Vzc29yJztcclxuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgZm9yd2FyZFJlZiwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBFbGVtZW50UmVmLCBJbmplY3QsIFBMQVRGT1JNX0lELCBPbkNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuaW1wb3J0ICogYXMgY2FsZW5kYXJDb25zdCBmcm9tICcuL2FzaS1jYWxlbmRhci1jb25zdGFudHMnO1xyXG5pbXBvcnQgKiBhcyBuaCBmcm9tICcuLi8uLi9uYXRpdmUtaGVscGVyJztcclxuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhc2ktY2FsZW5kYXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnYXNpLWNhbGVuZGFyLmNvbXBvbmVudC5odG1sJyxcclxuICBob3N0OiB7ICdjbGFzcyc6ICdhc2ktY29tcG9uZW50IGFzaS1jYWxlbmRhcicgfSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEFzaUNhbGVuZGFyQ29tcG9uZW50KSxcclxuICAgICAgbXVsdGk6IHRydWVcclxuICAgIH1cclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBc2lDYWxlbmRhckNvbXBvbmVudCBleHRlbmRzIERlZmF1bHRDb250cm9sVmFsdWVBY2Nlc3NvciBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XHJcblxyXG4gIEBJbnB1dCgpIHJlbGF0aXZlVG86IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBJbnB1dCgpIG1pbkRhdGU6IERhdGU7XHJcbiAgQElucHV0KCkgbWF4RGF0ZTogRGF0ZTtcclxuXHJcbiAgcHJpdmF0ZSBfZGlzYWJsZURheU9mV2VlazogbnVtYmVyW107XHJcblxyXG4gIC8qKiBhbGxvdyB5b3UgdG8gZGlzYWJsZSBkYXkgb2Ygd2VlayBleGVtcGxlIFtkaXNhYmxlRGF5T2ZXZWVrXT1cIlsxLCAyXVwiXCIgd2hpbGUgZGlzYWJsZWQgbW9uZGF5IGFuZCB0dXNkYXkgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBkaXNhYmxlRGF5T2ZXZWVrKGRheXNPZldlZWspIHtcclxuICAgIGlmICghZGF5c09mV2Vlaykge1xyXG4gICAgICB0aGlzLl9kaXNhYmxlRGF5T2ZXZWVrID0gW107XHJcbiAgICB9IGVsc2UgaWYgKG5oLmlzQXJyYXkoZGF5c09mV2VlaykpIHtcclxuICAgICAgdGhpcy5fZGlzYWJsZURheU9mV2VlayA9IGRheXNPZldlZWs7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9kaXNhYmxlRGF5T2ZXZWVrID0gW2RheXNPZldlZWtdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIEBPdXRwdXQoKSBvbkRhdGVQaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KCk7XHJcblxyXG4gIGRheXM6IEFycmF5PGNhbGVuZGFyQ29uc3QuRGF5PjtcclxuICBtb250aHM6IEFycmF5PGNhbGVuZGFyQ29uc3QuTW9udGg+O1xyXG4gIHllYXJzOiBBcnJheTxudW1iZXI+O1xyXG5cclxuICBzZWxlY3RlZE1vbnRoOiBjYWxlbmRhckNvbnN0Lk1vbnRoO1xyXG4gIHNlbGVjdGVkWWVhcjogbnVtYmVyO1xyXG4gIHNlbGVjdGVkRGF5OiBjYWxlbmRhckNvbnN0LkRheUl0ZW07XHJcblxyXG4gIGRheU9mTW9udGhzOiBBcnJheTxjYWxlbmRhckNvbnN0LkRheUl0ZW0+O1xyXG5cclxuICBvcGVuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogYW55KSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgaWYgKHRoaXMuaXNGcigpKSB7XHJcbiAgICAgIHRoaXMuZGF5cyA9IGNhbGVuZGFyQ29uc3QuZGF5c19mcjtcclxuICAgICAgdGhpcy5tb250aHMgPSBjYWxlbmRhckNvbnN0Lm1vbnRoc19mcjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGF5cyA9IGNhbGVuZGFyQ29uc3QuZGF5c19lbjtcclxuICAgICAgdGhpcy5tb250aHMgPSBjYWxlbmRhckNvbnN0Lm1vbnRoc19lbjtcclxuICAgIH1cclxuICAgIHRoaXMuaW5pdFllYXJzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzRnIoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xyXG4gICAgICByZXR1cm4gbmF2aWdhdG9yLmxhbmd1YWdlID09PSAnZnInIHx8IG5hdmlnYXRvci5sYW5ndWFnZSA9PT0gJ2ZyLUZSJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKCkge1xyXG4gICAgaWYgKHRoaXMubWluRGF0ZSkge1xyXG4gICAgICB0aGlzLm1pbkRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5tYXhEYXRlKSB7XHJcbiAgICAgIHRoaXMubWF4RGF0ZS5zZXRIb3VycygyMywgNTksIDU5LCA5OTkpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jYWxjdWxEYXlzKCk7XHJcbiAgfVxyXG5cclxuICBpbml0WWVhcnMoKSB7XHJcbiAgICBsZXQgcmVzdWx0cyA9IG5ldyBBcnJheTxudW1iZXI+KCk7XHJcbiAgICBsZXQgY3VycmVudFllYXIgPSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkgKyAxO1xyXG4gICAgZm9yIChsZXQgeWVhciA9IGN1cnJlbnRZZWFyOyB5ZWFyID49IDE5MDA7IHllYXItLSkge1xyXG4gICAgICByZXN1bHRzLnB1c2goeWVhcik7XHJcbiAgICB9XHJcbiAgICB0aGlzLnllYXJzID0gcmVzdWx0cztcclxuICB9XHJcblxyXG4gIG9uRHJvcGRvd25DbG9zZSgpIHtcclxuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9wZW5DYWxlbmRhcigpIHtcclxuICAgIHRoaXMub3BlbiA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2VDYWxlbmRhcigpIHtcclxuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgb25EYXlTZWxlY3RlZChkYXlJdGVtOiBjYWxlbmRhckNvbnN0LkRheUl0ZW0pIHtcclxuICAgIHRoaXMuc2VsZWN0ZWREYXkgPSBuZXcgY2FsZW5kYXJDb25zdC5EYXlJdGVtKGRheUl0ZW0uZGF5LCBkYXlJdGVtLm1vbnRoLCBkYXlJdGVtLnllYXIsIGRheUl0ZW0uZGF0ZSwgJ3NlbGVjdGVkIGVuYWJsZWQnKTtcclxuICAgIHRoaXMudmFsdWUgPSBkYXlJdGVtLmRhdGU7XHJcbiAgICB0aGlzLmNsb3NlQ2FsZW5kYXIoKTtcclxuICAgIHRoaXMuY2FsY3VsRGF5cygpO1xyXG5cclxuICAgIHRoaXMub25EYXRlUGlja2VkLmVtaXQodGhpcy52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBvbk1vbnRoU2VsZWN0ZWQoKSB7XHJcbiAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWRZZWFyLCB0aGlzLnNlbGVjdGVkTW9udGgubnVtIC0gMSwgdGhpcy5zZWxlY3RlZERheS5kYXkpO1xyXG4gICAgdGhpcy52YWx1ZSA9IGRhdGU7XHJcbiAgICB0aGlzLmNhbGN1bERheXMoKTtcclxuICAgIHRoaXMub25EYXRlUGlja2VkLmVtaXQoZGF0ZSk7XHJcbiAgfVxyXG5cclxuICBvblllYXJTZWxlY3RlZCgpIHtcclxuICAgIGxldCBkYXRlID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZFllYXIsIHRoaXMuc2VsZWN0ZWRNb250aC5udW0gLSAxLCB0aGlzLnNlbGVjdGVkRGF5LmRheSk7XHJcbiAgICB0aGlzLnZhbHVlID0gZGF0ZTtcclxuICAgIHRoaXMuY2FsY3VsRGF5cygpO1xyXG4gICAgdGhpcy5vbkRhdGVQaWNrZWQuZW1pdChkYXRlKTtcclxuICB9XHJcblxyXG4gIGNhbGN1bERheXMoKSB7XHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRNb250aCB8fCAhdGhpcy5zZWxlY3RlZFllYXIpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBsZXQgbW9udGggPSB0aGlzLnNlbGVjdGVkTW9udGgubnVtIC0gMTtcclxuICAgIGxldCB5ZWFyID0gdGhpcy5zZWxlY3RlZFllYXI7XHJcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcclxuICAgIGxldCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpO1xyXG5cclxuICAgIGxldCBtb25kYXlEZWx0YSA9IDA7XHJcbiAgICBsZXQgZGF5ID0gZGF0ZS5nZXREYXkoKTtcclxuICAgIGlmIChkYXkgPT09IDApIHtcclxuICAgICAgbW9uZGF5RGVsdGEgPSAtNjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG1vbmRheURlbHRhID0gLShkYXkgLSAxKTtcclxuICAgIH1cclxuXHJcbiAgICBkYXRlID0gbW9tZW50KGRhdGUpLmFkZChtb25kYXlEZWx0YSwgJ2RheXMnKS50b0RhdGUoKTtcclxuXHJcbiAgICBsZXQgZGVsdGFNb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcclxuXHJcbiAgICBpZiAoZGVsdGFNb250aCAhPT0gbW9udGgpIHtcclxuICAgICAgLy8gQmVmb3JlIGZpcnN0IGRheSBvZiB0aGUgbW9udGhcclxuICAgICAgd2hpbGUgKGRhdGUuZ2V0TW9udGgoKSA9PT0gZGVsdGFNb250aCkge1xyXG4gICAgICAgIGlmIChkYXRlLmdldERhdGUoKSA9PT0gdGhpcy5zZWxlY3RlZERheS5kYXlcclxuICAgICAgICAgICYmIGRhdGUuZ2V0TW9udGgoKSArIDEgPT09IHRoaXMuc2VsZWN0ZWREYXkubW9udGhcclxuICAgICAgICAgICYmIGRhdGUuZ2V0RnVsbFllYXIoKSA9PT0gdGhpcy5zZWxlY3RlZERheS55ZWFyKSB7XHJcbiAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLnNlbGVjdGVkRGF5KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzdWx0LnB1c2gobmV3IGNhbGVuZGFyQ29uc3QuRGF5SXRlbShkYXRlLmdldERhdGUoKSwgZGF0ZS5nZXRNb250aCgpICsgMSwgZGF0ZS5nZXRGdWxsWWVhcigpLCBuZXcgRGF0ZShkYXRlKSwgJ2V4dHJhIGVuYWJsZWQnKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIDEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTW9udGggZGF0ZXNcclxuICAgIHdoaWxlIChkYXRlLmdldE1vbnRoKCkgPT09IG1vbnRoKSB7XHJcbiAgICAgIGlmIChkYXRlLmdldERhdGUoKSA9PT0gdGhpcy5zZWxlY3RlZERheS5kYXlcclxuICAgICAgICAmJiBkYXRlLmdldE1vbnRoKCkgKyAxID09PSB0aGlzLnNlbGVjdGVkRGF5Lm1vbnRoXHJcbiAgICAgICAgJiYgZGF0ZS5nZXRGdWxsWWVhcigpID09PSB0aGlzLnNlbGVjdGVkRGF5LnllYXIpIHtcclxuICAgICAgICByZXN1bHQucHVzaCh0aGlzLnNlbGVjdGVkRGF5KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXN1bHQucHVzaChuZXcgY2FsZW5kYXJDb25zdC5EYXlJdGVtKGRhdGUuZ2V0RGF0ZSgpLCBkYXRlLmdldE1vbnRoKCkgKyAxLCBkYXRlLmdldEZ1bGxZZWFyKCksIG5ldyBEYXRlKGRhdGUpLCAnZW5hYmxlZCcpKTtcclxuICAgICAgfVxyXG4gICAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyAxKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBEYXlzIG9mIHRoZSBsYXN0IHdlZWtcclxuICAgIHdoaWxlIChkYXRlLmdldERheSgpICE9PSAxKSB7XHJcbiAgICAgIGlmIChkYXRlLmdldERhdGUoKSA9PT0gdGhpcy5zZWxlY3RlZERheS5kYXlcclxuICAgICAgICAmJiBkYXRlLmdldE1vbnRoKCkgKyAxID09PSB0aGlzLnNlbGVjdGVkRGF5Lm1vbnRoXHJcbiAgICAgICAgJiYgZGF0ZS5nZXRGdWxsWWVhcigpID09PSB0aGlzLnNlbGVjdGVkRGF5LnllYXIpIHtcclxuICAgICAgICByZXN1bHQucHVzaCh0aGlzLnNlbGVjdGVkRGF5KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXN1bHQucHVzaChuZXcgY2FsZW5kYXJDb25zdC5EYXlJdGVtKGRhdGUuZ2V0RGF0ZSgpLCBkYXRlLmdldE1vbnRoKCkgKyAxLCBkYXRlLmdldEZ1bGxZZWFyKCksIG5ldyBEYXRlKGRhdGUpLCAnZXh0cmEgZW5hYmxlZCcpKTtcclxuICAgICAgfVxyXG4gICAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyAxKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRheU9mTW9udGhzID0gcmVzdWx0O1xyXG5cclxuICAgIHRoaXMubWFuYWdlRGlzYWJsZWREYXRlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hbmFnZURpc2FibGVkRGF0ZSgpIHtcclxuICAgIGNvbnN0IGRheU9mV2Vla0Rpc2FibGVkID0gIW5oLmlzRW1wdHkodGhpcy5fZGlzYWJsZURheU9mV2Vlayk7XHJcblxyXG4gICAgaWYgKHRoaXMuZGF5T2ZNb250aHMpIHtcclxuICAgICAgbmguZm9yRWFjaCh0aGlzLmRheU9mTW9udGhzLCAoZGF5SXRlbSkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLm1pbkRhdGUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgaWYgKGRheUl0ZW0uZGF0ZSA8IHRoaXMubWluRGF0ZSkge1xyXG4gICAgICAgICAgICBkYXlJdGVtLmNsYXNzID0gJ2Rpc2FibGVkJztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMubWF4RGF0ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICBpZiAoZGF5SXRlbS5kYXRlID4gdGhpcy5tYXhEYXRlKSB7XHJcbiAgICAgICAgICAgIGRheUl0ZW0uY2xhc3MgPSAnZGlzYWJsZWQnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGF5T2ZXZWVrRGlzYWJsZWQgJiYgdGhpcy5fZGlzYWJsZURheU9mV2Vlay5pbmNsdWRlcyg8bnVtYmVyPmRheUl0ZW0uZGF0ZS5nZXREYXkoKSkpIHtcclxuICAgICAgICAgIGRheUl0ZW0uY2xhc3MgPSAnZGlzYWJsZWQnO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB3cml0ZVZhbHVlKHZhbHVlOiBEYXRlKSB7XHJcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5pbml0VG9EYXRlKHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGluaXRUb0RhdGUodmFsdWU6IERhdGUpIHtcclxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgIHZhbHVlID0gbmV3IERhdGUoKTtcclxuICAgIH1cclxuICAgIHRoaXMuc2VsZWN0ZWRZZWFyID0gdmFsdWUuZ2V0RnVsbFllYXIoKTtcclxuXHJcbiAgICBsZXQgZGF0ZU1vbnRoID0gdmFsdWUuZ2V0TW9udGgoKSArIDE7XHJcbiAgICB0aGlzLnNlbGVjdGVkTW9udGggPSBuaC5maW5kKHRoaXMubW9udGhzLCAobW9udGgpID0+IHtcclxuICAgICAgcmV0dXJuIG1vbnRoLm51bSA9PT0gZGF0ZU1vbnRoO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZERheSA9IG5ldyBjYWxlbmRhckNvbnN0LkRheUl0ZW0odmFsdWUuZ2V0RGF0ZSgpLCB0aGlzLnNlbGVjdGVkTW9udGgubnVtLFxyXG4gICAgICB0aGlzLnNlbGVjdGVkWWVhciwgbmV3IERhdGUodmFsdWUpLCAnc2VsZWN0ZWQgZW5hYmxlZCcpO1xyXG5cclxuICAgIHRoaXMuY2FsY3VsRGF5cygpO1xyXG4gIH1cclxuXHJcbiAgZ29OZXh0TW9udGgoKSB7XHJcbiAgICBsZXQgbmV4dE1vbnRoTnVtID0gdGhpcy5zZWxlY3RlZE1vbnRoLm51bSArIDE7XHJcbiAgICBpZiAobmV4dE1vbnRoTnVtID09PSAxMykge1xyXG4gICAgICBuZXh0TW9udGhOdW0gPSAxO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkWWVhciA9IHRoaXMuc2VsZWN0ZWRZZWFyICsgMTtcclxuICAgICAgaWYgKHRoaXMueWVhcnMuaW5kZXhPZih0aGlzLnNlbGVjdGVkWWVhcikgPT09IC0xKSB7XHJcbiAgICAgICAgdGhpcy55ZWFycy5wdXNoKHRoaXMuc2VsZWN0ZWRZZWFyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5zZWxlY3RlZE1vbnRoID0gbmguZmluZCh0aGlzLm1vbnRocywgKG1vbnRoKSA9PiB7XHJcbiAgICAgIHJldHVybiBtb250aC5udW0gPT09IG5leHRNb250aE51bTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2FsY3VsRGF5cygpO1xyXG4gIH1cclxuXHJcbiAgZ29QcmV2aW91c01vbnRoKCkge1xyXG4gICAgbGV0IG5leHRNb250aE51bSA9IHRoaXMuc2VsZWN0ZWRNb250aC5udW0gLSAxO1xyXG4gICAgaWYgKG5leHRNb250aE51bSA9PT0gMCkge1xyXG4gICAgICBuZXh0TW9udGhOdW0gPSAxMjtcclxuICAgICAgdGhpcy5zZWxlY3RlZFllYXIgPSB0aGlzLnNlbGVjdGVkWWVhciAtIDE7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNlbGVjdGVkTW9udGggPSBuaC5maW5kKHRoaXMubW9udGhzLCAobW9udGgpID0+IHtcclxuICAgICAgcmV0dXJuIG1vbnRoLm51bSA9PT0gbmV4dE1vbnRoTnVtO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jYWxjdWxEYXlzKCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==