UNPKG

@asi-ngtools/lib

Version:

This project is a little components library, simple to use, which will help you to simplify your project.

402 lines (401 loc) 37.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; 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'; var AsiCalendarComponent = /** @class */ (function (_super) { tslib_1.__extends(AsiCalendarComponent, _super); function AsiCalendarComponent(platformId) { var _this = _super.call(this) || this; _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; } return _this; } Object.defineProperty(AsiCalendarComponent.prototype, "disableDayOfWeek", { /** allow you to disable day of week exemple [disableDayOfWeek]="[1, 2]"" while disabled monday and tusday */ set: /** * allow you to disable day of week exemple [disableDayOfWeek]="[1, 2]"" while disabled monday and tusday * @param {?} daysOfWeek * @return {?} */ function (daysOfWeek) { if (!daysOfWeek) { this._disableDayOfWeek = []; } else if (nh.isArray(daysOfWeek)) { this._disableDayOfWeek = daysOfWeek; } else { this._disableDayOfWeek = [daysOfWeek]; } }, enumerable: true, configurable: true }); /** * @return {?} */ AsiCalendarComponent.prototype.ngOnInit = /** * @return {?} */ function () { this.initYears(); }; /** * @return {?} */ AsiCalendarComponent.prototype.isFr = /** * @return {?} */ function () { if (isPlatformBrowser(this.platformId)) { return navigator.language === 'fr' || navigator.language === 'fr-FR'; } else { return false; } }; /** * @return {?} */ AsiCalendarComponent.prototype.ngOnChanges = /** * @return {?} */ function () { if (this.minDate) { this.minDate.setHours(0, 0, 0, 0); } if (this.maxDate) { this.maxDate.setHours(23, 59, 59, 999); } this.calculDays(); }; /** * @return {?} */ AsiCalendarComponent.prototype.initYears = /** * @return {?} */ function () { /** @type {?} */ var results = new Array(); for (var year = this.maxYear; year >= this.minYear; year--) { results.push(year); } this.years = results; }; /** * @return {?} */ AsiCalendarComponent.prototype.onDropdownClose = /** * @return {?} */ function () { this.open = false; }; /** * @return {?} */ AsiCalendarComponent.prototype.openCalendar = /** * @return {?} */ function () { this.open = true; }; /** * @return {?} */ AsiCalendarComponent.prototype.closeCalendar = /** * @return {?} */ function () { this.open = false; }; /** * @param {?} dayItem * @return {?} */ AsiCalendarComponent.prototype.onDaySelected = /** * @param {?} dayItem * @return {?} */ function (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 {?} */ AsiCalendarComponent.prototype.onMonthSelected = /** * @return {?} */ function () { /** @type {?} */ var date = new Date(this.selectedYear, this.selectedMonth.num - 1, this.selectedDay.day); this.value = date; this.calculDays(); this.onDatePicked.emit(date); }; /** * @return {?} */ AsiCalendarComponent.prototype.onYearSelected = /** * @return {?} */ function () { /** @type {?} */ var date = new Date(this.selectedYear, this.selectedMonth.num - 1, this.selectedDay.day); this.value = date; this.calculDays(); this.onDatePicked.emit(date); }; /** * @return {?} */ AsiCalendarComponent.prototype.calculDays = /** * @return {?} */ function () { if (!this.selectedMonth || !this.selectedYear) { return; } /** @type {?} */ var month = this.selectedMonth.num - 1; /** @type {?} */ var year = this.selectedYear; /** @type {?} */ var result = []; /** @type {?} */ var date = new Date(year, month, 1); /** @type {?} */ var mondayDelta = 0; /** @type {?} */ var day = date.getDay(); if (day === 0) { mondayDelta = -6; } else { mondayDelta = -(day - 1); } date = moment(date).add(mondayDelta, 'days').toDate(); /** @type {?} */ var 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 {?} */ AsiCalendarComponent.prototype.manageDisabledDate = /** * @return {?} */ function () { var _this = this; /** @type {?} */ var dayOfWeekDisabled = !nh.isEmpty(this._disableDayOfWeek); if (this.dayOfMonths) { nh.forEach(this.dayOfMonths, function (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 {?} */ AsiCalendarComponent.prototype.writeValue = /** * @param {?} value * @return {?} */ function (value) { this._value = value; this.initToDate(value); }; /** * @param {?} value * @return {?} */ AsiCalendarComponent.prototype.initToDate = /** * @param {?} value * @return {?} */ function (value) { if (value == null || value['error']) { value = new Date(); } this.selectedYear = value.getFullYear(); /** @type {?} */ var dateMonth = value.getMonth() + 1; this.selectedMonth = nh.find(this.months, function (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 {?} */ AsiCalendarComponent.prototype.goNextMonth = /** * @return {?} */ function () { /** @type {?} */ var 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, function (month) { return month.num === nextMonthNum; }); this.calculDays(); }; /** * @return {?} */ AsiCalendarComponent.prototype.goPreviousMonth = /** * @return {?} */ function () { /** @type {?} */ var nextMonthNum = this.selectedMonth.num - 1; if (nextMonthNum === 0) { nextMonthNum = 12; this.selectedYear = this.selectedYear - 1; } this.selectedMonth = nh.find(this.months, function (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(function () { return AsiCalendarComponent; }), multi: true } ] }] } ]; /** @nocollapse */ AsiCalendarComponent.ctorParameters = function () { return [ { type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] } ]; }; AsiCalendarComponent.propDecorators = { relativeTo: [{ type: Input }], minDate: [{ type: Input }], maxDate: [{ type: Input }], minYear: [{ type: Input }], maxYear: [{ type: Input }], disableDayOfWeek: [{ type: Input }], onDatePicked: [{ type: Output }] }; return AsiCalendarComponent; }(DefaultControlValueAccessor)); export { AsiCalendarComponent }; if (false) { /** @type {?} */ AsiCalendarComponent.prototype.relativeTo; /** @type {?} */ AsiCalendarComponent.prototype.minDate; /** @type {?} */ AsiCalendarComponent.prototype.maxDate; /** @type {?} */ AsiCalendarComponent.prototype.minYear; /** @type {?} */ AsiCalendarComponent.prototype.maxYear; /** @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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpLWNhbGVuZGFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bhc2ktbmd0b29scy9saWIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9hc2ktY2FsZW5kYXIvYXNpLWNhbGVuZGFyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUN2SSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVwRCxPQUFPLEtBQUssYUFBYSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUMsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDOztJQWNjLGdEQUEyQjtJQXFDbkUsOEJBQXlDLFVBQWU7UUFBeEQsWUFDRSxpQkFBTyxTQVFSO1FBVHdDLGdCQUFVLEdBQVYsVUFBVSxDQUFLOzZCQWQvQixJQUFJLFlBQVksRUFBUTtxQkFZMUMsS0FBSztRQUlWLEVBQUUsQ0FBQyxDQUFDLEtBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDaEIsS0FBSSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDO1lBQ2xDLEtBQUksQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQztTQUN2QztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sS0FBSSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDO1lBQ2xDLEtBQUksQ0FBQyxNQUFNLEdBQUcsYUFBYSxD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Q0FBQztTQUMzQztRQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQUMsS0FBSztZQUM5QyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxZQUFZLENBQUM7U0FDbkMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0tBQ25COztnQkE3UEYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxjQUFjO29CQUN4QixzeURBQTBDO29CQUMxQyxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsNEJBQTRCLEVBQUU7b0JBQzdDLFNBQVMsRUFBRTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLGNBQU0sT0FBQSxvQkFBb0IsRUFBcEIsQ0FBb0IsQ0FBQzs0QkFDbkQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7aUJBQ0Y7Ozs7Z0RBc0NjLE1BQU0sU0FBQyxXQUFXOzs7NkJBcEM5QixLQUFLOzBCQUVMLEtBQUs7MEJBQ0wsS0FBSzswQkFFTCxLQUFLOzBCQUNMLEtBQUs7bUNBS0wsS0FBSzsrQkFXTCxNQUFNOzsrQkE1Q1Q7RUFxQjBDLDJCQUEyQjtTQUF4RCxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZWZhdWx0Q29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICcuLy4uL2NvbW1vbi9kZWZhdWx0LWNvbnRyb2wtdmFsdWUtYWNjZXNzb3InO1xyXG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBmb3J3YXJkUmVmLCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEVsZW1lbnRSZWYsIEluamVjdCwgUExBVEZPUk1fSUQsIE9uQ2hhbmdlcywgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuXHJcbmltcG9ydCAqIGFzIGNhbGVuZGFyQ29uc3QgZnJvbSAnLi9hc2ktY2FsZW5kYXItY29uc3RhbnRzJztcclxuaW1wb3J0ICogYXMgbmggZnJvbSAnLi4vLi4vbmF0aXZlLWhlbHBlcic7XHJcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXNpLWNhbGVuZGFyJyxcclxuICB0ZW1wbGF0ZVVybDogJ2FzaS1jYWxlbmRhci5jb21wb25lbnQuaHRtbCcsXHJcbiAgaG9zdDogeyBjbGFzczogJ2FzaS1jb21wb25lbnQgYXNpLWNhbGVuZGFyJyB9LFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQXNpQ2FsZW5kYXJDb21wb25lbnQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgfVxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIEFzaUNhbGVuZGFyQ29tcG9uZW50IGV4dGVuZHMgRGVmYXVsdENvbnRyb2xWYWx1ZUFjY2Vzc29yIGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQge1xyXG4gIEBJbnB1dCgpIHJlbGF0aXZlVG86IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBJbnB1dCgpIG1pbkRhdGU6IERhdGU7XHJcbiAgQElucHV0KCkgbWF4RGF0ZTogRGF0ZTtcclxuXHJcbiAgQElucHV0KCkgbWluWWVhcjogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIG1heFllYXI6IG51bWJlcjtcclxuXHJcbiAgcHJpdmF0ZSBfZGlzYWJsZURheU9mV2VlazogbnVtYmVyW107XHJcblxyXG4gIC8qKiBhbGxvdyB5b3UgdG8gZGlzYWJsZSBkYXkgb2Ygd2VlayBleGVtcGxlIFtkaXNhYmxlRGF5T2ZXZWVrXT1cIlsxLCAyXVwiXCIgd2hpbGUgZGlzYWJsZWQgbW9uZGF5IGFuZCB0dXNkYXkgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBkaXNhYmxlRGF5T2ZXZWVrKGRheXNPZldlZWspIHtcclxuICAgIGlmICghZGF5c09mV2Vlaykge1xyXG4gICAgICB0aGlzLl9kaXNhYmxlRGF5T2ZXZWVrID0gW107XHJcbiAgICB9IGVsc2UgaWYgKG5oLmlzQXJyYXkoZGF5c09mV2VlaykpIHtcclxuICAgICAgdGhpcy5fZGlzYWJsZURheU9mV2VlayA9IGRheXNPZldlZWs7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9kaXNhYmxlRGF5T2ZXZWVrID0gW2RheXNPZldlZWtdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQE91dHB1dCgpIG9uRGF0ZVBpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4oKTtcclxuXHJcbiAgZGF5czogQXJyYXk8Y2FsZW5kYXJDb25zdC5EYXk+O1xyXG4gIG1vbnRoczogQXJyYXk8Y2FsZW5kYXJDb25zdC5Nb250aD47XHJcbiAgeWVhcnM6IEFycmF5PG51bWJlcj47XHJcblxyXG4gIHNlbGVjdGVkTW9udGg6IGNhbGVuZGFyQ29uc3QuTW9udGg7XHJcbiAgc2VsZWN0ZWRZZWFyOiBudW1iZXI7XHJcbiAgc2VsZWN0ZWREYXk6IGNhbGVuZGFyQ29uc3QuRGF5SXRlbTtcclxuXHJcbiAgZGF5T2ZNb250aHM6IEFycmF5PGNhbGVuZGFyQ29uc3QuRGF5SXRlbT47XHJcblxyXG4gIG9wZW4gPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBhbnkpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICBpZiAodGhpcy5pc0ZyKCkpIHtcclxuICAgICAgdGhpcy5kYXlzID0gY2FsZW5kYXJDb25zdC5kYXlzX2ZyO1xyXG4gICAgICB0aGlzLm1vbnRocyA9IGNhbGVuZGFyQ29uc3QubW9udGhzX2ZyO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kYXlzID0gY2FsZW5kYXJDb25zdC5kYXlzX2VuO1xyXG4gICAgICB0aGlzLm1vbnRocyA9IGNhbGVuZGFyQ29uc3QubW9udGhzX2VuO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmluaXRZZWFycygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0ZyKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcclxuICAgICAgcmV0dXJuIG5hdmlnYXRvci5sYW5ndWFnZSA9PT0gJ2ZyJyB8fCBuYXZpZ2F0b3IubGFuZ3VhZ2UgPT09ICdmci1GUic7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcygpIHtcclxuICAgIGlmICh0aGlzLm1pbkRhdGUpIHtcclxuICAgICAgdGhpcy5taW5EYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubWF4RGF0ZSkge1xyXG4gICAgICB0aGlzLm1heERhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTtcclxuICAgIH1cclxuICAgIHRoaXMuY2FsY3VsRGF5cygpO1xyXG4gIH1cclxuXHJcbiAgaW5pdFllYXJzKCkge1xyXG4gICAgbGV0IHJlc3VsdHMgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xyXG4gICAgZm9yIChsZXQgeWVhciA9IHRoaXMubWF4WWVhcjsgeWVhciA+PSB0aGlzLm1pblllYXI7IHllYXItLSkge1xyXG4gICAgICByZXN1bHRzLnB1c2goeWVhcik7XHJcbiAgICB9XHJcbiAgICB0aGlzLnllYXJzID0gcmVzdWx0cztcclxuICB9XHJcblxyXG4gIG9uRHJvcGRvd25DbG9zZSgpIHtcclxuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9wZW5DYWxlbmRhcigpIHtcclxuICAgIHRoaXMub3BlbiA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2VDYWxlbmRhcigpIHtcclxuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgb25EYXlTZWxlY3RlZChkYXlJdGVtOiBjYWxlbmRhckNvbnN0LkRheUl0ZW0pIHtcclxuICAgIHRoaXMuc2VsZWN0ZWREYXkgPSBuZXcgY2FsZW5kYXJDb25zdC5EYXlJdGVtKGRheUl0ZW0uZGF5LCBkYXlJdGVtLm1vbnRoLCBkYXlJdGVtLnllYXIsIGRheUl0ZW0uZGF0ZSwgJ3NlbGVjdGVkIGVuYWJsZWQnKTtcclxuICAgIHRoaXMudmFsdWUgPSBkYXlJdGVtLmRhdGU7XHJcbiAgICB0aGlzLmNsb3NlQ2FsZW5kYXIoKTtcclxuICAgIHRoaXMuY2FsY3VsRGF5cygpO1xyXG5cclxuICAgIHRoaXMub25EYXRlUGlja2VkLmVtaXQodGhpcy52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBvbk1vbnRoU2VsZWN0ZWQoKSB7XHJcbiAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWRZZWFyLCB0aGlzLnNlbGVjdGVkTW9udGgubnVtIC0gMSwgdGhpcy5zZWxlY3RlZERheS5kYXkpO1xyXG4gICAgdGhpcy52YWx1ZSA9IGRhdGU7XHJcbiAgICB0aGlzLmNhbGN1bERheXMoKTtcclxuICAgIHRoaXMub25EYXRlUGlja2VkLmVtaXQoZGF0ZSk7XHJcbiAgfVxyXG5cclxuICBvblllYXJTZWxlY3RlZCgpIHtcclxuICAgIGxldCBkYXRlID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZFllYXIsIHRoaXMuc2VsZWN0ZWRNb250aC5udW0gLSAxLCB0aGlzLnNlbGVjdGVkRGF5LmRheSk7XHJcbiAgICB0aGlzLnZhbHVlID0gZGF0ZTtcclxuICAgIHRoaXMuY2FsY3VsRGF5cygpO1xyXG4gICAgdGhpcy5vbkRhdGVQaWNrZWQuZW1pdChkYXRlKTtcclxuICB9XHJcblxyXG4gIGNhbGN1bERheXMoKSB7XHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRNb250aCB8fCAhdGhpcy5zZWxlY3RlZFllYXIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbGV0IG1vbnRoID0gdGhpcy5zZWxlY3RlZE1vbnRoLm51bSAtIDE7XHJcbiAgICBsZXQgeWVhciA9IHRoaXMuc2VsZWN0ZWRZZWFyO1xyXG4gICAgY29uc3QgcmVzdWx0ID0gW107XHJcbiAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKTtcclxuXHJcbiAgICBsZXQgbW9uZGF5RGVsdGEgPSAwO1xyXG4gICAgbGV0IGRheSA9IGRhdGUuZ2V0RGF5KCk7XHJcbiAgICBpZiAoZGF5ID09PSAwKSB7XHJcbiAgICAgIG1vbmRheURlbHRhID0gLTY7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBtb25kYXlEZWx0YSA9IC0oZGF5IC0gMSk7XHJcbiAgICB9XHJcblxyXG4gICAgZGF0ZSA9IG1vbWVudChkYXRlKS5hZGQobW9uZGF5RGVsdGEsICdkYXlzJykudG9EYXRlKCk7XHJcblxyXG4gICAgbGV0IGRlbHRhTW9udGggPSBkYXRlLmdldE1vbnRoKCk7XHJcblxyXG4gICAgaWYgKGRlbHRhTW9udGggIT09IG1vbnRoKSB7XHJcbiAgICAgIC8vIEJlZm9yZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoXHJcbiAgICAgIHdoaWxlIChkYXRlLmdldE1vbnRoKCkgPT09IGRlbHRhTW9udGgpIHtcclxuICAgICAgICBpZiAoZGF0ZS5nZXREYXRlKCkgPT09IHRoaXMuc2VsZWN0ZWREYXkuZGF5ICYmIGRhdGUuZ2V0TW9udGgoKSArIDEgPT09IHRoaXMuc2VsZWN0ZWREYXkubW9udGggJiYgZGF0ZS5nZXRGdWxsWWVhcigpID09PSB0aGlzLnNlbGVjdGVkRGF5LnllYXIpIHtcclxuICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuc2VsZWN0ZWREYXkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXN1bHQucHVzaChuZXcgY2FsZW5kYXJDb25zdC5EYXlJdGVtKGRhdGUuZ2V0RGF0ZSgpLCBkYXRlLmdldE1vbnRoKCkgKyAxLCBkYXRlLmdldEZ1bGxZZWFyKCksIG5ldyBEYXRlKGRhdGUpLCAnZXh0cmEgZW5hYmxlZCcpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpICsgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBNb250aCBkYXRlc1xyXG4gICAgd2hpbGUgKGRhdGUuZ2V0TW9udGgoKSA9PT0gbW9udGgpIHtcclxuICAgICAgaWYgKGRhdGUuZ2V0RGF0ZSgpID09PSB0aGlzLnNlbGVjdGVkRGF5LmRheSAmJiBkYXRlLmdldE1vbnRoKCkgKyAxID09PSB0aGlzLnNlbGVjdGVkRGF5Lm1vbnRoICYmIGRhdGUuZ2V0RnVsbFllYXIoKSA9PT0gdGhpcy5zZWxlY3RlZERheS55ZWFyKSB7XHJcbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5zZWxlY3RlZERheSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzdWx0LnB1c2gobmV3IGNhbGVuZGFyQ29uc3QuRGF5SXRlbShkYXRlLmdldERhdGUoKSwgZGF0ZS5nZXRNb250aCgpICsgMSwgZGF0ZS5nZXRGdWxsWWVhcigpLCBuZXcgRGF0ZShkYXRlKSwgJ2VuYWJsZWQnKSk7XHJcbiAgICAgIH1cclxuICAgICAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpICsgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRGF5cyBvZiB0aGUgbGFzdCB3ZWVrXHJcbiAgICB3aGlsZSAoZGF0ZS5nZXREYXkoKSAhPT0gMSkge1xyXG4gICAgICBpZiAoZGF0ZS5nZXREYXRlKCkgPT09IHRoaXMuc2VsZWN0ZWREYXkuZGF5ICYmIGRhdGUuZ2V0TW9udGgoKSArIDEgPT09IHRoaXMuc2VsZWN0ZWREYXkubW9udGggJiYgZGF0ZS5nZXRGdWxsWWVhcigpID09PSB0aGlzLnNlbGVjdGVkRGF5LnllYXIpIHtcclxuICAgICAgICByZXN1bHQucHVzaCh0aGlzLnNlbGVjdGVkRGF5KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXN1bHQucHVzaChuZXcgY2FsZW5kYXJDb25zdC5EYXlJdGVtKGRhdGUuZ2V0RGF0ZSgpLCBkYXRlLmdldE1vbnRoKCkgKyAxLCBkYXRlLmdldEZ1bGxZZWFyKCksIG5ldyBEYXRlKGRhdGUpLCAnZXh0cmEgZW5hYmxlZCcpKTtcclxuICAgICAgfVxyXG4gICAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyAxKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRheU9mTW9udGhzID0gcmVzdWx0O1xyXG5cclxuICAgIHRoaXMubWFuYWdlRGlzYWJsZWREYXRlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hbmFnZURpc2FibGVkRGF0ZSgpIHtcclxuICAgIGNvbnN0IGRheU9mV2Vla0Rpc2FibGVkID0gIW5oLmlzRW1wdHkodGhpcy5fZGlzYWJsZURheU9mV2Vlayk7XHJcblxyXG4gICAgaWYgKHRoaXMuZGF5T2ZNb250aHMpIHtcclxuICAgICAgbmguZm9yRWFjaCh0aGlzLmRheU9mTW9udGhzLCAoZGF5SXRlbSkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLm1pbkRhdGUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgaWYgKGRheUl0ZW0uZGF0ZSA8IHRoaXMubWluRGF0ZSkge1xyXG4gICAgICAgICAgICBkYXlJdGVtLmNsYXNzID0gJ2Rpc2FibGVkJztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMubWF4RGF0ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICBpZiAoZGF5SXRlbS5kYXRlID4gdGhpcy5tYXhEYXRlKSB7XHJcbiAgICAgICAgICAgIGRheUl0ZW0uY2xhc3MgPSAnZGlzYWJsZWQnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGF5T2ZXZWVrRGlzYWJsZWQgJiYgdGhpcy5fZGlzYWJsZURheU9mV2Vlay5pbmNsdWRlcyg8bnVtYmVyPmRheUl0ZW0uZGF0ZS5nZXREYXkoKSkpIHtcclxuICAgICAgICAgIGRheUl0ZW0uY2xhc3MgPSAnZGlzYWJsZWQnO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB3cml0ZVZhbHVlKHZhbHVlOiBEYXRlKSB7XHJcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5pbml0VG9EYXRlKHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGluaXRUb0RhdGUodmFsdWU6IERhdGUpIHtcclxuICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlWydlcnJvciddKSB7XHJcbiAgICAgIHZhbHVlID0gbmV3IERhdGUoKTtcclxuICAgIH1cclxuICAgIHRoaXMuc2VsZWN0ZWRZZWFyID0gdmFsdWUuZ2V0RnVsbFllYXIoKTtcclxuXHJcbiAgICBsZXQgZGF0ZU1vbnRoID0gdmFsdWUuZ2V0TW9udGgoKSArIDE7XHJcbiAgICB0aGlzLnNlbGVjdGVkTW9udGggPSBuaC5maW5kKHRoaXMubW9udGhzLCAobW9udGgpID0+IHtcclxuICAgICAgcmV0dXJuIG1vbnRoLm51bSA9PT0gZGF0ZU1vbnRoO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZERheSA9IG5ldyBjYWxlbmRhckNvbnN0LkRheUl0ZW0odmFsdWUuZ2V0RGF0ZSgpLCB0aGlzLnNlbGVjdGVkTW9udGgubnVtLCB0aGlzLnNlbGVjdGVkWWVhciwgbmV3IERhdGUodmFsdWUpLCAnc2VsZWN0ZWQgZW5hYmxlZCcpO1xyXG5cclxuICAgIHRoaXMuY2FsY3VsRGF5cygpO1xyXG4gIH1cclxuXHJcbiAgZ29OZXh0TW9udGgoKSB7XHJcbiAgICBsZXQgbmV4dE1vbnRoTnVtID0gdGhpcy5zZWxlY3RlZE1vbnRoLm51bSArIDE7XHJcbiAgICBpZiAobmV4dE1vbnRoTnVtID09PSAxMykge1xyXG4gICAgICBuZXh0TW9udGhOdW0gPSAxO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkWWVhciA9IHRoaXMuc2VsZWN0ZWRZZWFyICsgMTtcclxuICAgICAgaWYgKHRoaXMueWVhcnMuaW5kZXhPZih0aGlzLnNlbGVjdGVkWWVhcikgPT09IC0xKSB7XHJcbiAgICAgICAgdGhpcy55ZWFycy5wdXNoKHRoaXMuc2VsZWN0ZWRZZWFyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5zZWxlY3RlZE1vbnRoID0gbmguZmluZCh0aGlzLm1vbnRocywgKG1vbnRoKSA9PiB7XHJcbiAgICAgIHJldHVybiBtb250aC5udW0gPT09IG5leHRNb250aE51bTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2FsY3VsRGF5cygpO1xyXG4gIH1cclxuXHJcbiAgZ29QcmV2aW91c01vbnRoKCkge1xyXG4gICAgbGV0IG5leHRNb250aE51bSA9IHRoaXMuc2VsZWN0ZWRNb250aC5udW0gLSAxO1xyXG4gICAgaWYgKG5leHRNb250aE51bSA9PT0gMCkge1xyXG4gICAgICBuZXh0TW9udGhOdW0gPSAxMjtcclxuICAgICAgdGhpcy5zZWxlY3RlZFllYXIgPSB0aGlzLnNlbGVjdGVkWWVhciAtIDE7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNlbGVjdGVkTW9udGggPSBuaC5maW5kKHRoaXMubW9udGhzLCAobW9udGgpID0+IHtcclxuICAgICAgcmV0dXJuIG1vbnRoLm51bSA9PT0gbmV4dE1vbnRoTnVtO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jYWxjdWxEYXlzKCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==