@true-directive/grid
Version:
Angular Data Grid from Yopsilon.
306 lines • 41.1 kB
JavaScript
import * as tslib_1 from "tslib";
var CalendarComponent_1;
/**
* Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company.
* @link https://truedirective.com/
* @license MIT
*/
import { Component, Output, EventEmitter, ChangeDetectorRef, ElementRef, ViewChild, forwardRef } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { Keys } from '@true-directive/base';
import { Dates } from '@true-directive/base';
import { InternationalizationService } from '../internationalization/internationalization.service';
/**
* Calendar component.
*/
let CalendarComponent = CalendarComponent_1 = class CalendarComponent {
constructor(intl, cd, el) {
this.intl = intl;
this.cd = cd;
this.el = el;
this.onChange = (_) => { };
this.onTouched = () => { };
this._value = null;
this.mode = 'days';
this.dateClick = new EventEmitter();
this.escape = new EventEmitter();
// Day names
this.dayNames = [];
// Month weeks
this.weeks = [];
// Year months
this.monthRows = [];
// Matrix of displayed years
this.yearRows = [];
this._minYear = 0;
this._maxYear = 0;
}
get value() {
return this._value;
}
set value(v) {
if (v !== this._value) {
this._value = v;
this.createWeeks(this._value);
this.onChange(v);
}
}
get valueTime() {
let vTime = 0;
if (this.value !== null && !isNaN(this.value.getTime())) {
vTime = this.value.getTime();
}
return vTime;
}
get monthYear() {
const m = this.calendarDateStart.getMonth();
const y = this.calendarDateStart.getFullYear();
if (this.mode === 'days') {
return this.intl.locale.longMonthNames[m] + ' ' + y;
}
if (this.mode === 'months') {
return y;
}
if (this.mode === 'years') {
return this._minYear + ' - ' + this._maxYear;
}
}
get today() {
return Dates.today();
}
registerOnChange(fn) { this.onChange = fn; }
registerOnTouched(fn) { this.onTouched = fn; }
blur() {
this.onTouched();
}
// Отображаем значение в компоненте. Formatter: Ctrl --> View
writeValue(value) {
if (this.value !== value) {
this.value = value;
}
}
setFocus() {
this.days.nativeElement.focus();
}
isCurrentMonth(d) {
return Dates.dateBetween(d, this.calendarDateStart, this.calendarDateEnd);
}
go(qty) {
if (this.mode === 'days') {
let newDate;
if (qty > 0) {
newDate = Dates.firstDateOfNextMonth(this.calendarDateStart);
}
else {
newDate = Dates.firstDateOfPrevMonth(this.calendarDateStart);
}
this.createWeeks(newDate);
}
if (this.mode === 'months') {
this.calendarDateStart = new Date(this.calendarDateStart.getFullYear() + qty, 0, 1);
this.createMonths();
}
if (this.mode === 'years') {
this.calendarDateStart = new Date(this.calendarDateStart.getFullYear() + 24 * qty, 0, 1);
this.createYears();
}
}
toggleMode() {
if (this.mode === 'years') {
this.mode = 'days';
this.createWeeks(this.calendarDateStart);
}
else {
if (this.mode === 'months') {
this.mode = 'years';
this.createYears();
}
else {
if (this.mode === 'days') {
this.mode = 'months';
this.createMonths();
}
}
}
this.setMode();
}
setMode() {
this.el.nativeElement.classList.remove('true-mode-days');
this.el.nativeElement.classList.remove('true-mode-months');
this.el.nativeElement.classList.remove('true-mode-years');
this.el.nativeElement.classList.add('true-mode-' + this.mode);
}
mousedown(e) {
e.stopPropagation();
}
calendarDateClick(e, d) {
if (this.mode === 'days') {
this.value = new Date(d);
this.dateClick.emit(d);
}
if (this.mode === 'months') {
this.mode = 'days';
this.createWeeks(new Date(d));
}
if (this.mode === 'years') {
this.calendarDateStart = new Date(d);
this.mode = 'months';
this.createMonths();
}
this.setMode();
e.preventDefault();
e.stopPropagation();
}
// List of dates in selected month
createDayNames() {
this.dayNames = [];
const weekStart = Dates.firstDateOfWeek(Dates.today(), this.intl.locale.firstDayOfWeek);
const weekEnd = Dates.lastDateOfWeek(weekStart, this.intl.locale.firstDayOfWeek);
for (let d = new Date(weekStart); d.getTime() <= weekEnd.getTime(); d = Dates.nextDate(d)) {
const wd = d.getDay();
const dayName = this.intl.locale.shortDayNames[wd];
this.dayNames.push(dayName);
}
}
// List of months to show in months-mode
createMonths() {
const yy = this.calendarDateStart.getFullYear();
const currentMonthStart = Dates.firstDateOfMonth(Dates.today());
let k = -3;
this.monthRows = [];
for (let i = 0; i < 6; i++) {
let monthRow = [];
for (let j = 0; j < 3; j++) {
// Month start
const dd = new Date(yy, k, 1);
monthRow.push({ name: this.intl.locale.shortMonthNames[dd.getMonth()] + ' ' + Dates.yearTwoDigits(dd),
date: dd,
selected: Dates.isSameMonth(dd, this.value),
today: dd.getTime() === currentMonthStart.getTime(),
current: Dates.isSameYear(dd, this.calendarDateStart) });
k++;
}
this.monthRows.push(monthRow);
}
}
// List of dates in selected month
createYears() {
const yy = this.calendarDateStart.getFullYear();
const currentYearStart = new Date(Dates.today().getFullYear(), 0, 1);
const calendarYearStart = new Date(this.calendarDateStart.getFullYear(), 0, 1);
this._minYear = yy - 11;
let k = this._minYear;
this.yearRows = [];
for (let i = 0; i < 6; i++) {
let yearRow = [];
for (let j = 0; j < 4; j++) {
const dd = new Date(k, 0, 1);
yearRow.push({ name: k + '',
date: dd,
selected: Dates.isSameYear(dd, this.value),
today: dd.getTime() === currentYearStart.getTime(),
current: true });
k++;
}
this.yearRows.push(yearRow);
}
this._maxYear = k - 1;
}
createWeeks(date) {
if (date === null || isNaN(date.getTime())) {
date = Dates.today();
}
const firstDayOfWeek = this.intl.locale.firstDayOfWeek;
const monthStart = Dates.firstDateOfMonth(date);
const monthEnd = Dates.lastDateOfMonth(date);
if (this.weeks.length > 0
&& this.calendarDateStart !== undefined && this.calendarDateStart.getTime() === monthStart.getTime()
&& this.calendarDateEnd !== undefined && this.calendarDateEnd.getTime() === monthEnd.getTime()) {
return;
}
this.weeks = [];
this.calendarDateStart = monthStart;
this.calendarDateEnd = monthEnd;
const calendarStart = Dates.firstDateOfWeek(monthStart, firstDayOfWeek);
// Iterating weeks of month
let weekStart = new Date(calendarStart);
let wCounter = 0;
while (wCounter < 6) {
let week = [];
let weekEnd = Dates.lastDateOfWeek(weekStart, firstDayOfWeek);
// Iterating days of week
for (let d = new Date(weekStart); d.getTime() <= weekEnd.getTime(); d = Dates.nextDate(d)) {
week.push(d);
}
this.weeks.push(week);
// Next week
weekStart = Dates.nextDate(weekEnd);
wCounter++;
}
}
daysKeyDown(e) {
let dd = 0;
if (e.keyCode === Keys.LEFT) {
dd = -1;
}
if (e.keyCode === Keys.UP) {
dd = -7;
}
if (e.keyCode === Keys.RIGHT) {
dd = 1;
}
if (e.keyCode === Keys.DOWN) {
dd = 7;
}
if (e.keyCode === Keys.ENTER) {
this.dateClick.emit(this.value);
e.stopPropagation();
}
if (e.keyCode === Keys.ESCAPE) {
this.escape.emit(this.value);
e.stopPropagation();
}
if (dd !== 0) {
this.value = Dates.addDays(this.value === null ? Dates.today() : this.value, dd);
e.stopPropagation();
}
}
ngOnInit() {
this.createDayNames();
this.createWeeks(Dates.today());
}
};
tslib_1.__decorate([
ViewChild('days', { static: true }),
tslib_1.__metadata("design:type", Object)
], CalendarComponent.prototype, "days", void 0);
tslib_1.__decorate([
Output('dateClick'),
tslib_1.__metadata("design:type", EventEmitter)
], CalendarComponent.prototype, "dateClick", void 0);
tslib_1.__decorate([
Output('escape'),
tslib_1.__metadata("design:type", EventEmitter)
], CalendarComponent.prototype, "escape", void 0);
CalendarComponent = CalendarComponent_1 = tslib_1.__decorate([
Component({
selector: 'true-calendar',
template: "<!-- Buttons -->\r\n<div class=\"true-calendar__controls\">\r\n <div>\r\n <button class=\"true-button\" (click)=\"toggleMode()\" ><b>{{monthYear}}</b></button>\r\n </div>\r\n <div>\r\n <button class=\"true-button prev\" (click)=\"go(-1)\"><span class=\"true-icon-left-open\"></span></button>\r\n <button class=\"true-button next\" (click)=\"go(1)\"><span class=\"true-icon-right-open\"></span></button>\r\n </div>\r\n</div>\r\n\r\n<!-- Day names in header -->\r\n<table class=\"true-day-names\">\r\n <colGroup>\r\n <col *ngFor=\"let d of dayNames\" />\r\n </colGroup>\r\n <thead>\r\n <tr>\r\n <td *ngFor=\"let d of dayNames\" [class.true-transparent]=\"mode!='days'\">{{d}}</td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr><td colspan=\"7\"></td></tr>\r\n </tbody>\r\n</table>\r\n\r\n<!-- Month days -->\r\n<table #days class=\"true-days\" tabindex=\"1\" (keydown)=\"daysKeyDown($event)\">\r\n <colGroup>\r\n <col *ngFor=\"let d of dayNames\" />\r\n </colGroup>\r\n <tbody>\r\n <tr *ngFor=\"let w of weeks\">\r\n <td *ngFor=\"let d of w\"\r\n (click)=\"calendarDateClick($event, d)\"\r\n [class.true-selected]=\"d.getTime() === valueTime\"\r\n [class.true-today]=\"d.getTime() === today.getTime()\"\r\n [class.true-current]=\"isCurrentMonth(d)\">{{d.getDate()}}</td>\r\n </tr>\r\n </tbody>\r\n</table>\r\n<!-- Months -->\r\n<table class=\"true-months\">\r\n <colGroup>\r\n <col *ngFor=\"let r of monthRows[0]\" />\r\n </colGroup>\r\n <tbody>\r\n <tr *ngFor=\"let r of monthRows\">\r\n <td *ngFor=\"let m of r\"\r\n (click)=\"calendarDateClick($event, m.date)\"\r\n [class.true-transparent]=\"m.hide\"\r\n [class.true-selected]=\"m.selected\"\r\n [class.true-today]=\"m.today\"\r\n [class.true-current]=\"m.current\">{{m.name}}</td>\r\n </tr>\r\n </tbody>\r\n</table>\r\n<!-- Years -->\r\n<table class=\"true-years\">\r\n <colGroup>\r\n <col *ngFor=\"let r of yearRows[0]\" />\r\n </colGroup>\r\n <tbody>\r\n <tr *ngFor=\"let r of yearRows\">\r\n <td *ngFor=\"let y of r\"\r\n (click)=\"calendarDateClick($event, y.date)\"\r\n [class.true-selected]=\"y.selected\"\r\n [class.true-today]=\"y.today\"\r\n [class.true-current]=\"1==1\">{{y.name}}</td>\r\n </tr>\r\n </tbody>\r\n</table>\r\n",
host: {
'class': 'true-calendar true-mode-days',
'(mousedown)': 'mousedown($event)',
'(touchend)': '$event.stopPropagation()'
},
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CalendarComponent_1),
multi: true
}],
styles: [":host>table{table-layout:fixed;border-collapse:separate}:host>table:focus{outline:0}:host table.true-days,:host table.true-months,:host table.true-years{display:none}:host.true-mode-days table.true-days,:host.true-mode-months table.true-months,:host.true-mode-years table.true-years{display:table}.true-calendar__controls{display:-webkit-box;display:flex;flex-wrap:nowrap;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row;-webkit-box-pack:justify;justify-content:space-between}.true-calendar__controls div:last-child{display:-webkit-box;display:flex;flex-wrap:nowrap;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row}"]
}),
tslib_1.__metadata("design:paramtypes", [InternationalizationService,
ChangeDetectorRef,
ElementRef])
], CalendarComponent);
export { CalendarComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHRydWUtZGlyZWN0aXZlL2dyaWQvIiwic291cmNlcyI6WyJzcmMvY29udHJvbHMvY2FsZW5kYXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7RUFJRTtBQUNGLE9BQU8sRUFBRSxTQUFTLEVBQVMsTUFBTSxFQUFlLFlBQVksRUFBRSxpQkFBaUIsRUFDdEUsVUFBVSxFQUFnQixTQUFTLEVBQ1YsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BFLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDNUMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdDLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBRW5HOztHQUVHO0FBZ0JILElBQWEsaUJBQWlCLHlCQUE5QixNQUFhLGlCQUFpQjtJQWdWNUIsWUFDVSxJQUFpQyxFQUNqQyxFQUFxQixFQUNyQixFQUFjO1FBRmQsU0FBSSxHQUFKLElBQUksQ0FBNkI7UUFDakMsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUFDckIsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQWpWaEIsYUFBUSxHQUFHLENBQUMsQ0FBTSxFQUFFLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFDMUIsY0FBUyxHQUFHLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztRQUVyQixXQUFNLEdBQVEsSUFBSSxDQUFDO1FBRXBCLFNBQUksR0FBZ0MsTUFBTSxDQUFDO1FBTWxELGNBQVMsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUd2RCxXQUFNLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFtSnBELFlBQVk7UUFDWixhQUFRLEdBQWtCLEVBQUUsQ0FBQztRQUU3QixjQUFjO1FBQ2QsVUFB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QUFFO1lBQ0osT0FBTyxFQUFFLDhCQUE4QjtZQUN2QyxhQUFhLEVBQUUsbUJBQW1CO1lBQ2xDLFlBQVksRUFBRSwwQkFBMEI7U0FDekM7UUFDRCxTQUFTLEVBQUUsQ0FBQztnQkFDUixPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLG1CQUFpQixDQUFDO2dCQUNoRCxLQUFLLEVBQUUsSUFBSTthQUNaLENBQUM7O0tBQ0gsQ0FBQzs2Q0FrVmMsMkJBQTJCO1FBQzdCLGlCQUFpQjtRQUNqQixVQUFVO0dBblZiLGlCQUFpQixDQXFWN0I7U0FyVlksaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDE5IEFsZWtzZXkgTWVsbmlrb3YsIFRydWUgRGlyZWN0aXZlIENvbXBhbnkuXHJcbiAqIEBsaW5rIGh0dHBzOi8vdHJ1ZWRpcmVjdGl2ZS5jb20vXHJcbiAqIEBsaWNlbnNlIE1JVFxyXG4qL1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEhvc3RCaW5kaW5nLCBFdmVudEVtaXR0ZXIsIENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgICBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIFZpZXdDaGlsZCxcclxuICAgICAgICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIGZvcndhcmRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuaW1wb3J0IHsgS2V5cyB9IGZyb20gJ0B0cnVlLWRpcmVjdGl2ZS9iYXNlJztcclxuaW1wb3J0IHsgRGF0ZXMgfSBmcm9tICdAdHJ1ZS1kaXJlY3RpdmUvYmFzZSc7XHJcbmltcG9ydCB7IEludGVybmF0aW9uYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uL2ludGVybmF0aW9uYWxpemF0aW9uL2ludGVybmF0aW9uYWxpemF0aW9uLnNlcnZpY2UnO1xyXG5cclxuLyoqXHJcbiAqIENhbGVuZGFyIGNvbXBvbmVudC5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndHJ1ZS1jYWxlbmRhcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci5jb21wb25lbnQuc2NzcyddLFxyXG4gIGhvc3Q6IHtcclxuICAgICdjbGFzcyc6ICd0cnVlLWNhbGVuZGFyIHRydWUtbW9kZS1kYXlzJyxcclxuICAgICcobW91c2Vkb3duKSc6ICdtb3VzZWRvd24oJGV2ZW50KScsXHJcbiAgICAnKHRvdWNoZW5kKSc6ICckZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCknXHJcbiAgfSxcclxuICBwcm92aWRlcnM6IFt7XHJcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDYWxlbmRhckNvbXBvbmVudCksXHJcbiAgICAgIG11bHRpOiB0cnVlXHJcbiAgICB9XVxyXG4gIH0pXHJcbmV4cG9ydCBjbGFzcyBDYWxlbmRhckNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuXHJcbiAgcHJpdmF0ZSBvbkNoYW5nZSA9IChfOiBhbnkpID0+IHt9O1xyXG4gIHByaXZhdGUgb25Ub3VjaGVkID0gKCkgPT4ge307XHJcblxyXG4gIHByaXZhdGUgX3ZhbHVlOiBhbnkgPSBudWxsO1xyXG5cclxuICBwdWJsaWMgbW9kZTogJ2RheXMnIHwgJ21vbnRocycgfCAneWVhcnMnID0gJ2RheXMnO1xyXG5cclxuICBAVmlld0NoaWxkKCdkYXlzJywge3N0YXRpYzogdHJ1ZX0pXHJcbiAgZGF5czogYW55O1xyXG5cclxuICBAT3V0cHV0KCdkYXRlQ2xpY2snKVxyXG4gIGRhdGVDbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQE91dHB1dCgnZXNjYXBlJylcclxuICBlc2NhcGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIHByaXZhdGUgY2FsZW5kYXJEYXRlU3RhcnQ6IGFueTtcclxuICBwcml2YXRlIGNhbGVuZGFyRGF0ZUVuZDogYW55O1xyXG5cclxuXHJcbiAgZ2V0IHZhbHVlKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XHJcbiAgfVxyXG5cclxuICBzZXQgdmFsdWUodjogYW55KSB7XHJcbiAgICBpZiAodiAhPT0gdGhpcy5fdmFsdWUpIHtcclxuICAgICAgdGhpcy5fdmFsdWUgPSB2O1xyXG4gICAgICB0aGlzLmNyZWF0ZVdlZWtzKHRoaXMuX3ZhbHVlKTtcclxuICAgICAgdGhpcy5vbkNoYW5nZSh2KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCB2YWx1ZVRpbWUoKTogbnVtYmVyIHtcclxuICAgIGxldCB2VGltZSA9IDA7XHJcbiAgICBpZiAodGhpcy52YWx1ZSAhPT0gbnVsbCAmJiAhaXNOYU4odGhpcy52YWx1ZS5nZXRUaW1lKCkpKSB7XHJcbiAgICAgIHZUaW1lID0gdGhpcy52YWx1ZS5nZXRUaW1lKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdlRpbWU7XHJcbiAgfVxyXG5cclxuICBnZXQgbW9udGhZZWFyKCkge1xyXG5cclxuICAgIGNvbnN0IG0gPSB0aGlzLmNhbGVuZGFyRGF0ZVN0YXJ0LmdldE1vbnRoKCk7XHJcbiAgICBjb25zdCB5ID0gdGhpcy5jYWxlbmRhckRhdGVTdGFydC5nZXRGdWxsWWVhcigpO1xyXG5cclxuICAgIGlmICh0aGlzLm1vZGUgPT09ICdkYXlzJykge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbnRsLmxvY2FsZS5sb25nTW9udGhOYW1lc1ttXSArICcgJyArIHk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ21vbnRocycpIHtcclxuICAgICAgcmV0dXJuIHk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuIG1vZGUgPT09ICd5ZWFycycpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX21pblllYXIgKyAnIC0gJyArIHRoaXMuX21heFllYXI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgdG9kYXkoKSB7XHJcbiAgICByZXR1cm4gRGF0ZXMudG9kYXkoKTtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IChfOiBhbnkpID0+IHZvaWQpOiB2b2lkIHsgdGhpcy5vbkNoYW5nZSA9IGZuOyB9XHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHsgdGhpcy5vblRvdWNoZWQgPSBmbjsgfVxyXG5cclxuICBibHVyKCkge1xyXG4gICAgdGhpcy5vblRvdWNoZWQoKTtcclxuICB9XHJcblxyXG4gIC8vINCe0YLQvtCx0YDQsNC20LDQtdC8INC30L3QsNGH0LXQvdC40LUg0LIg0LrQvtC80L/QvtC90LXQvdGC0LUuIEZvcm1hdHRlcjogQ3RybCAtLT4gVmlld1xyXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMudmFsdWUgIT09IHZhbHVlKSB7XHJcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldEZvY3VzKCkge1xyXG4gICAgdGhpcy5kYXlzLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICB9XHJcblxyXG4gIGlzQ3VycmVudE1vbnRoKGQ6IGFueSkge1xyXG4gICAgcmV0dXJuIERhdGVzLmRhdGVCZXR3ZWVuKGQsIHRoaXMuY2FsZW5kYXJEYXRlU3RhcnQsIHRoaXMuY2FsZW5kYXJEYXRlRW5kKTtcclxuICB9XHJcblxyXG4gIGdvKHF0eTogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5tb2RlID09PSAnZGF5cycpIHtcclxuICAgICAgbGV0IG5ld0RhdGU7XHJcbiAgICAgIGlmIChxdHkgPiAwICkge1xyXG4gICAgICAgIG5ld0RhdGUgPSBEYXRlcy5maXJzdERhdGVPZk5leHRNb250aCh0aGlzLmNhbGVuZGFyRGF0ZVN0YXJ0KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBuZXdEYXRlID0gRGF0ZXMuZmlyc3REYXRlT2ZQcmV2TW9udGgodGhpcy5jYWxlbmRhckRhdGVTdGFydCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY3JlYXRlV2Vla3MobmV3RGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ21vbnRocycpIHtcclxuICAgICAgdGhpcy5jYWxlbmRhckRhdGVTdGFydCA9IG5ldyBEYXRlKHRoaXMuY2FsZW5kYXJEYXRlU3RhcnQuZ2V0RnVsbFllYXIoKSArIHF0eSwgMCwgMSk7XHJcbiAgICAgIHRoaXMuY3JlYXRlTW9udGhzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ3llYXJzJykge1xyXG4gICAgICB0aGlzLmNhbGVuZGFyRGF0ZVN0YXJ0ID0gbmV3IERhdGUodGhpcy5jYWxlbmRhckRhdGVTdGFydC5nZXRGdWxsWWVhcigpICsgMjQgKiBxdHksIDAsIDEpO1xyXG4gICAgICB0aGlzLmNyZWF0ZVllYXJzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b2dnbGVNb2RlKCkge1xyXG5cclxuICAgIGlmICh0aGlzLm1vZGUgPT09ICd5ZWFycycpIHtcclxuICAgICAgdGhpcy5tb2RlID0gJ2RheXMnO1xyXG4gICAgICB0aGlzLmNyZWF0ZVdlZWtzKHRoaXMuY2FsZW5kYXJEYXRlU3RhcnQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ21vbnRocycpIHtcclxuICAgICAgICB0aGlzLm1vZGUgPSAneWVhcnMnO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlWWVhcnMoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAodGhpcy5tb2RlID09PSAnZGF5cycpIHtcclxuICAgICAgICAgIHRoaXMubW9kZSA9ICdtb250aHMnO1xyXG4gICAgICAgICAgdGhpcy5jcmVhdGVNb250aHMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNldE1vZGUoKTtcclxuICB9XHJcblxyXG4gIHNldE1vZGUoKSB7XHJcbiAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgndHJ1ZS1tb2RlLWRheXMnKTtcclxuICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd0cnVlLW1vZGUtbW9udGhzJyk7XHJcbiAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgndHJ1ZS1tb2RlLXllYXJzJyk7XHJcbiAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndHJ1ZS1tb2RlLScgKyB0aGlzLm1vZGUpO1xyXG4gIH1cclxuXHJcbiAgbW91c2Vkb3duKGU6IGFueSkge1xyXG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICB9XHJcblxyXG4gIGNhbGVuZGFyRGF0ZUNsaWNrKGU6IGFueSwgZDogYW55KSB7XHJcbiAgICBpZiAodGhpcy5tb2RlID09PSAnZGF5cycpIHtcclxuICAgICAgdGhpcy52YWx1ZSA9IG5ldyBEYXRlKGQpO1xyXG4gICAgICB0aGlzLmRhdGVDbGljay5lbWl0KGQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm1vZGUgPT09ICdtb250aHMnKSB7XHJcbiAgICAgIHRoaXMubW9kZSA9ICdkYXlzJztcclxuICAgICAgdGhpcy5jcmVhdGVXZWVrcyhuZXcgRGF0ZShkKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ3llYXJzJykge1xyXG4gICAgICB0aGlzLmNhbGVuZGFyRGF0ZVN0YXJ0ID0gbmV3IERhdGUoZCk7XHJcbiAgICAgIHRoaXMubW9kZSA9ICdtb250aHMnO1xyXG4gICAgICB0aGlzLmNyZWF0ZU1vbnRocygpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0TW9kZSgpO1xyXG5cclxuICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgfVxyXG5cclxuICAvLyBEYXkgbmFtZXNcclxuICBkYXlOYW1lczogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG5cclxuICAvLyBNb250aCB3ZWVrc1xyXG4gIHdlZWtzOiBBcnJheTxhbnk+ID0gW107XHJcblxyXG4gIC8vIFllYXIgbW9udGhzXHJcbiAgbW9udGhSb3dzOiBBcnJheTxhbnk+ID0gW107XHJcblxyXG4gIC8vIE1hdHJpeCBvZiBkaXNwbGF5ZWQgeWVhcnNcclxuICB5ZWFyUm93czogQXJyYXk8YW55PiA9IFtdO1xyXG5cclxuICAvLyBMaXN0IG9mIGRhdGVzIGluIHNlbGVjdGVkIG1vbnRoXHJcbiAgcHJpdmF0ZSBjcmVhdGVEYXlOYW1lcygpIHtcclxuICAgIHRoaXMuZGF5TmFtZXMgPSBbXTtcclxuICAgIGNvbnN0IHdlZWtTdGFydCA9IERhdGVzLmZpcnN0RGF0ZU9mV2VlayhEYXRlcy50b2RheSgpLCB0aGlzLmludGwubG9jYWxlLmZpcnN0RGF5T2ZXZWVrKTtcclxuICAgIGNvbnN0IHdlZWtFbmQgPSBEYXRlcy5sYXN0RGF0ZU9mV2Vlayh3ZWVrU3RhcnQsIHRoaXMuaW50bC5sb2NhbGUuZmlyc3REYXlPZldlZWspO1xyXG5cclxuICAgIGZvciAobGV0IGQgPSBuZXcgRGF0ZSh3ZWVrU3RhcnQpOyBkLmdldFRpbWUoKSA8PSB3ZWVrRW5kLmdldFRpbWUoKTsgZCA9IERhdGVzLm5leHREYXRlKGQpKSB7XHJcbiAgICAgIGNvbnN0IHdkID0gZC5nZXREYXkoKTtcclxuICAgICAgY29uc3QgZGF5TmFtZSA9IHRoaXMuaW50bC5sb2NhbGUuc2hvcnREYXlOYW1lc1t3ZF07XHJcbiAgICAgIHRoaXMuZGF5TmFtZXMucHVzaChkYXlOYW1lKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIExpc3Qgb2YgbW9udGhzIHRvIHNob3cgaW4gbW9udGhzLW1vZGVcclxuICBwcml2YXRlIGNyZWF0ZU1vbnRocygpIHtcclxuXHJcbiAgICBjb25zdCB5eSA9IHRoaXMuY2FsZW5kYXJEYXRlU3RhcnQuZ2V0RnVsbFllYXIoKTtcclxuICAgIGNvbnN0IGN1cnJlbnRNb250aFN0YXJ0ID0gRGF0ZXMuZmlyc3REYXRlT2ZNb250aChEYXRlcy50b2RheSgpKTtcclxuXHJcbiAgICBsZXQgayA9IC0zO1xyXG4gICAgdGhpcy5tb250aFJvd3MgPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjsgaSsrKSB7XHJcbiAgICAgIGxldCBtb250aFJvdyA9IFtdO1xyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDM7IGorKykge1xyXG5cclxuICAgICAgICAvLyBNb250aCBzdGFydFxyXG4gICAgICAgIGNvbnN0IGRkID0gbmV3IERhdGUoeXksIGssIDEpO1xyXG5cclxuICAgICAgICBtb250aFJvdy5wdXNoKFxyXG4gICAgICAgICAgeyBuYW1lOiB0aGlzLmludGwubG9jYWxlLnNob3J0TW9udGhOYW1lc1tkZC5nZXRNb250aCgpXSArICcgJyArIERhdGVzLnllYXJUd29EaWdpdHMoZGQpLFxyXG4gICAgICAgICAgICBkYXRlOiBkZCxcclxuICAgICAgICAgICAgc2VsZWN0ZWQ6IERhdGVzLmlzU2FtZU1vbnRoKGRkLCB0aGlzLnZhbHVlKSxcclxuICAgICAgICAgICAgdG9kYXk6IGRkLmdldFRpbWUoKSA9PT0gY3VycmVudE1vbnRoU3RhcnQuZ2V0VGltZSgpLFxyXG4gICAgICAgICAgICBjdXJyZW50OiBEYXRlcy5pc1NhbWVZZWFyKGRkLCB0aGlzLmNhbGVuZGFyRGF0ZVN0YXJ0KSB9XHJcbiAgICAgICAgKTtcclxuICAgICAgICBrKys7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5tb250aFJvd3MucHVzaChtb250aFJvdyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9taW5ZZWFyID0gMDtcclxuICBwcml2YXRlIF9tYXhZZWFyID0gMDtcclxuXHJcbiAgLy8gTGlzdCBvZiBkYXRlcyBpbiBzZWxlY3RlZCBtb250aFxyXG4gIHByaXZhdGUgY3JlYXRlWWVhcnMoKSB7XHJcblxyXG4gICAgY29uc3QgeXkgPSB0aGlzLmNhbGVuZGFyRGF0ZVN0YXJ0LmdldEZ1bGxZZWFyKCk7XHJcbiAgICBjb25zdCBjdXJyZW50WWVhclN0YXJ0ID0gbmV3IERhdGUoRGF0ZXMudG9kYXkoKS5nZXRGdWxsWWVhcigpLCAwLCAxKTtcclxuICAgIGNvbnN0IGNhbGVuZGFyWWVhclN0YXJ0ID0gbmV3IERhdGUodGhpcy5jYWxlbmRhckRhdGVTdGFydC5nZXRGdWxsWWVhcigpLCAwLCAxKTtcclxuXHJcbiAgICB0aGlzLl9taW5ZZWFyID0geXkgLSAxMTtcclxuICAgIGxldCBrID0gdGhpcy5fbWluWWVhcjtcclxuXHJcbiAgICB0aGlzLnllYXJSb3dzID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykge1xyXG4gICAgICBsZXQgeWVhclJvdyA9IFtdO1xyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDQ7IGorKykge1xyXG5cclxuICAgICAgICBjb25zdCBkZCA9IG5ldyBEYXRlKGssIDAsIDEpO1xyXG4gICAgICAgIHllYXJSb3cucHVzaChcclxuICAgICAgICAgIHsgbmFtZTogayArICcnLFxyXG4gICAgICAgICAgICBkYXRlOiBkZCxcclxuICAgICAgICAgICAgc2VsZWN0ZWQ6IERhdGVzLmlzU2FtZVllYXIoZGQsIHRoaXMudmFsdWUpLFxyXG4gICAgICAgICAgICB0b2RheTogZGQuZ2V0VGltZSgpID09PSBjdXJyZW50WWVhclN0YXJ0LmdldFRpbWUoKSxcclxuICAgICAgICAgICAgY3VycmVudDogdHJ1ZSB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaysrO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMueWVhclJvd3MucHVzaCh5ZWFyUm93KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9tYXhZZWFyID0gayAtIDE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVdlZWtzKGRhdGU6IGFueSkge1xyXG5cclxuICAgIGlmIChkYXRlID09PSBudWxsIHx8IGlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xyXG4gICAgICBkYXRlID0gRGF0ZXMudG9kYXkoKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmaXJzdERheU9mV2VlayA9IHRoaXMuaW50bC5sb2NhbGUuZmlyc3REYXlPZldlZWs7XHJcblxyXG4gICAgY29uc3QgbW9udGhTdGFydCA9IERhdGVzLmZpcnN0RGF0ZU9mTW9udGgoZGF0ZSk7XHJcbiAgICBjb25zdCBtb250aEVuZCA9IERhdGVzLmxhc3REYXRlT2ZNb250aChkYXRlKTtcclxuXHJcbiAgICBpZiAodGhpcy53ZWVrcy5sZW5ndGggPiAwXHJcbiAgICAgICYmIHRoaXMuY2FsZW5kYXJEYXRlU3RhcnQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmNhbGVuZGFyRGF0ZVN0YXJ0LmdldFRpbWUoKSA9PT0gbW9udGhTdGFydC5nZXRUaW1lKClcclxuICAgICAgJiYgdGhpcy5jYWxlbmRhckRhdGVFbmQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmNhbGVuZGFyRGF0ZUVuZC5nZXRUaW1lKCkgPT09IG1vbnRoRW5kLmdldFRpbWUoKVxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLndlZWtzID0gW107XHJcbiAgICB0aGlzLmNhbGVuZGFyRGF0ZVN0YXJ0ID0gbW9udGhTdGFydDtcclxuICAgIHRoaXMuY2FsZW5kYXJEYXRlRW5kID0gbW9udGhFbmQ7XHJcblxyXG4gICAgY29uc3QgY2FsZW5kYXJTdGFydCA9IERhdGVzLmZpcnN0RGF0ZU9mV2Vlayhtb250aFN0YXJ0LCBmaXJzdERheU9mV2Vlayk7XHJcblxyXG4gICAgLy8gSXRlcmF0aW5nIHdlZWtzIG9mIG1vbnRoXHJcbiAgICBsZXQgd2Vla1N0YXJ0ID0gbmV3IERhdGUoY2FsZW5kYXJTdGFydCk7XHJcbiAgICBsZXQgd0NvdW50ZXIgPSAwO1xyXG4gICAgd2hpbGUgKHdDb3VudGVyIDwgNikge1xyXG5cclxuICAgICAgbGV0IHdlZWs6IEFycmF5PGFueT4gPSBbXTtcclxuICAgICAgbGV0IHdlZWtFbmQgPSBEYXRlcy5sYXN0RGF0ZU9mV2Vlayh3ZWVrU3RhcnQsIGZpcnN0RGF5T2ZXZWVrKTtcclxuXHJcbiAgICAgIC8vIEl0ZXJhdGluZyBkYXlzIG9mIHdlZWtcclxuICAgICAgZm9yIChsZXQgZCA9IG5ldyBEYXRlKHdlZWtTdGFydCk7IGQuZ2V0VGltZSgpIDw9IHdlZWtFbmQuZ2V0VGltZSgpOyBkID0gRGF0ZXMubmV4dERhdGUoZCkpIHtcclxuICAgICAgICB3ZWVrLnB1c2goZCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMud2Vla3MucHVzaCh3ZWVrKTtcclxuICAgICAgLy8gTmV4dCB3ZWVrXHJcbiAgICAgIHdlZWtTdGFydCA9IERhdGVzLm5leHREYXRlKHdlZWtFbmQpO1xyXG4gICAgICB3Q291bnRlcisrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGF5c0tleURvd24oZTogYW55KSB7XHJcblxyXG4gICAgbGV0IGRkID0gMDtcclxuXHJcbiAgICBpZiAoZS5rZXlDb2RlID09PSBLZXlzLkxFRlQpIHtcclxuICAgICAgZGQgPSAtMTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZS5rZXlDb2RlID09PSBLZXlzLlVQKSB7XHJcbiAgICAgIGRkID0gLTc7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gS2V5cy5SSUdIVCkge1xyXG4gICAgICBkZCA9IDE7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gS2V5cy5ET1dOKSB7XHJcbiAgICAgIGRkID0gNztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZS5rZXlDb2RlID09PSBLZXlzLkVOVEVSKSB7XHJcbiAgICAgIHRoaXMuZGF0ZUNsaWNrLmVtaXQodGhpcy52YWx1ZSk7XHJcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUua2V5Q29kZSA9PT0gS2V5cy5FU0NBUEUpIHtcclxuICAgICAgdGhpcy5lc2NhcGUuZW1pdCh0aGlzLnZhbHVlKTtcclxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGQgIT09IDApIHtcclxuICAgICAgdGhpcy52YWx1ZSA9IERhdGVzLmFkZERheXModGhpcy52YWx1ZSA9PT0gbnVsbCA/IERhdGVzLnRvZGF5KCkgOiB0aGlzLnZhbHVlLCBkZCk7XHJcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuY3JlYXRlRGF5TmFtZXMoKTtcclxuICAgIHRoaXMuY3JlYXRlV2Vla3MoRGF0ZXMudG9kYXkoKSk7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgaW50bDogSW50ZXJuYXRpb25hbGl6YXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmXHJcbiAgKSB7IH1cclxufVxyXG4iXX0=