UNPKG

@junte/ui

Version:

Quality Angular UI components kit

206 lines 28.3 kB
import { __decorate, __metadata, __read, __spread } from "tslib"; import { Component, ContentChild, ContentChildren, EventEmitter, forwardRef, HostBinding, HostListener, Input, Output, QueryList, TemplateRef } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { addDays, addMonths, addWeeks, addYears, getMonth, getYear, isSameMonth, startOfWeek, subMonths, subYears } from 'date-fns'; import { NGXLogger } from 'ngx-logger'; import { JunteUIConfig } from '../../config'; import { PropertyApi } from '../../core/decorators/api'; import { Feature } from '../../core/enums/feature'; import { UI } from '../../core/enums/ui'; import { I18N_PROVIDERS } from '../../core/i18n/providers'; import { today } from './utils'; import { WeekMetricComponent } from './week/week-metric.component'; var WEEKS_DISPLAYED = 6; var DAYS_IN_WEEK = 7; var DATE_ROWS = 3; var DATE_COLS = 4; var ViewType; (function (ViewType) { ViewType["date"] = "date"; ViewType["year"] = "year"; ViewType["month"] = "month"; })(ViewType || (ViewType = {})); var CalendarComponent = /** @class */ (function () { function CalendarComponent(logger, config) { var _this = this; this.logger = logger; this.config = config; this.host = 'jnt-calendar-host'; this.ui = UI; this._period = today(); this.weeks = []; this.months = []; this.years = []; this.viewType = ViewType; this.view = ViewType.date; this.features = []; this.updated = new EventEmitter(); this.selected = new EventEmitter(); this.disabled = false; this.onChange = function () { return _this.logger.debug('value accessor is not registered'); }; this.onTouched = function () { return _this.logger.debug('value accessor is not registered'); }; this.registerOnChange = function (fn) { return _this.onChange = fn; }; this.registerOnTouched = function (fn) { return _this.onTouched = fn; }; this.onBlur = function () { return _this.onTouched(); }; } CalendarComponent_1 = CalendarComponent; Object.defineProperty(CalendarComponent.prototype, "period", { get: function () { return this._period; }, set: function (period) { if (!isSameMonth(this._period, period)) { this._period = period; this.update(); } }, enumerable: true, configurable: true }); CalendarComponent.prototype.ngOnInit = function () { this.update(); }; CalendarComponent.prototype.writeValue = function (date) { this.current = date; this.period = date || today(); }; CalendarComponent.prototype.setDisabledState = function (isDisabled) { this.disabled = isDisabled; }; CalendarComponent.prototype.select = function (date) { this.current = date; this.onChange(date); this.selected.emit(date); }; CalendarComponent.prototype.today = function () { var now = new Date(); this.period = now; this.select(now); }; CalendarComponent.prototype.add = function () { if (this.view === ViewType.date) { this.period = addMonths(this.period, 1); } else if (this.view === ViewType.month) { this.period = addYears(this.period, 1); } else { this.period = addYears(this.period, 12); } }; CalendarComponent.prototype.sub = function () { if (this.view === ViewType.date) { this.period = subMonths(this.period, 1); } else if (this.view === ViewType.month) { this.period = subYears(this.period, 1); } else { this.period = subYears(this.period, 12); } }; CalendarComponent.prototype.update = function () { var start = startOfWeek(new Date(getYear(this.period), getMonth(this.period), 1), { locale: this.config.locale.dfns }); var date = start; this.weeks = []; for (var i = 0; i < WEEKS_DISPLAYED; i++) { this.weeks[i] = { days: [], date: date }; for (var j = 0; j < DAYS_IN_WEEK; j++) { this.weeks[i].days[j] = addDays(date, j); } date = addWeeks(date, 1); } this.updated.emit({ start: start, end: date }); for (var i = 0; i < DATE_ROWS; i++) { this.months[i] = []; for (var j = 0; j < DATE_COLS; j++) { this.months[i].push(new Date(getYear(this.period), i * DATE_COLS + j, 1)); } } for (var i = 0; i < DATE_ROWS; i++) { this.years[i] = []; for (var j = 0; j < DATE_COLS; j++) { this.years[i].push(new Date(getYear(this.period) - 4 + i * DATE_COLS + j, i * DATE_COLS + j, 1)); } } }; var CalendarComponent_1; CalendarComponent.ctorParameters = function () { return [ { type: NGXLogger }, { type: JunteUIConfig } ]; }; __decorate([ HostBinding('attr.host'), __metadata("design:type", Object) ], CalendarComponent.prototype, "host", void 0); __decorate([ PropertyApi({ description: 'Calendar features', path: 'ui.feature', options: [Feature.today] }), Input(), __metadata("design:type", Array) ], CalendarComponent.prototype, "features", void 0); __decorate([ ContentChildren(WeekMetricComponent), __metadata("design:type", QueryList) ], CalendarComponent.prototype, "metrics", void 0); __decorate([ ContentChild('calendarDayTemplate'), __metadata("design:type", TemplateRef) ], CalendarComponent.prototype, "dayTemplate", void 0); __decorate([ ContentChild('calendarMetricTemplate'), __metadata("design:type", TemplateRef) ], CalendarComponent.prototype, "metricTemplate", void 0); __decorate([ Output(), __metadata("design:type", Object) ], CalendarComponent.prototype, "updated", void 0); __decorate([ Output(), __metadata("design:type", Object) ], CalendarComponent.prototype, "selected", void 0); __decorate([ PropertyApi({ description: 'Set disabled state', type: 'boolean', default: 'false', }), HostBinding('attr.data-disabled'), Input(), __metadata("design:type", Object) ], CalendarComponent.prototype, "disabled", void 0); __decorate([ PropertyApi({ description: 'Set current month for displaying', type: 'Date' }), Input('month'), __metadata("design:type", Date), __metadata("design:paramtypes", [Date]) ], CalendarComponent.prototype, "period", null); __decorate([ HostListener('blur'), __metadata("design:type", Object) ], CalendarComponent.prototype, "onBlur", void 0); CalendarComponent = CalendarComponent_1 = __decorate([ Component({ selector: 'jnt-calendar', template: "<jnt-stack child-of=\"jnt-calendar-host\" [align]=\"ui.align.stretch\">\n <table child-of=\"jnt-calendar-host\" >\n <thead child-of=\"jnt-calendar-host\" >\n <tr child-of=\"jnt-calendar-host\" >\n <td child-of=\"jnt-calendar-host\" >\n <jnt-button child-of=\"jnt-calendar-host\" data-arrow [icon]=\"ui.icons.chevronLeft\"\n [outline]=\"ui.outline.transparent\"\n [scheme]=\"ui.scheme.secondary\"\n [size]=\"ui.size.small\"\n (click)=\"sub()\">\n </jnt-button>\n </td>\n <td child-of=\"jnt-calendar-host\" *ngIf=\"view === viewType.date\" (click)=\"view = viewType.month\" colspan=\"5\">\n <jnt-button child-of=\"jnt-calendar-host\" data-date [outline]=\"ui.outline.transparent\"\n [scheme]=\"ui.scheme.secondary\"\n [size]=\"ui.size.small\"\n text=\"{{period | jntFormat: 'LLLL'}}, {{period | jntFormat: 'yyyy'}}\"></jnt-button>\n </td>\n <td child-of=\"jnt-calendar-host\" *ngIf=\"view === viewType.month\" (click)=\"view = viewType.year\" colspan=\"2\">\n <jnt-button child-of=\"jnt-calendar-host\" data-date [outline]=\"ui.outline.transparent\"\n [scheme]=\"ui.scheme.secondary\"\n [size]=\"ui.size.small\"\n [width]=\"ui.width.fluid\"\n text=\"{{period | jntFormat: 'yyyy'}}\">\n </jnt-button>\n </td>\n <td child-of=\"jnt-calendar-host\" *ngIf=\"view === viewType.year\" colspan=\"2\" data-year>\n {{(period | jntGetYear) - 4}} - {{(period | jntGetYear) + 7}}\n </td>\n <td child-of=\"jnt-calendar-host\" >\n <jnt-button child-of=\"jnt-calendar-host\" data-arrow [icon]=\"ui.icons.chevronRight\"\n [outline]=\"ui.outline.transparent\"\n [scheme]=\"ui.scheme.secondary\"\n [size]=\"ui.size.small\"\n (click)=\"add()\">\n </jnt-button>\n </td>\n <td child-of=\"jnt-calendar-host\" data-divider *ngIf=\"metrics.length\"></td>\n <td child-of=\"jnt-calendar-host\" data-metrics *ngIf=\"metrics.length\"\n [translate]=\"'label.metrics'\"\n [attr.colspan]=\"metrics.length\">\n Metrics\n </td>\n </tr>\n <tr child-of=\"jnt-calendar-host\" data-days *ngIf=\"view === viewType.date; else empty\">\n <th child-of=\"jnt-calendar-host\" *ngFor=\"let weekDay of [0,1,2,3,4,5,6]\">{{weekDay | jntWeekdayName:'x2'}}</th>\n\n <th child-of=\"jnt-calendar-host\" data-divider *ngIf=\"!!metrics.length\"></th>\n\n <th child-of=\"jnt-calendar-host\" data-metric *ngFor=\"let m of metrics\">\n {{m.title}}\n </th>\n </tr>\n\n <ng-template #empty>\n <tr child-of=\"jnt-calendar-host\" data-days>\n <th child-of=\"jnt-calendar-host\" *ngFor=\"let col of [1,2,3,4]\"></th>\n </tr>\n </ng-template>\n </thead>\n\n <tbody child-of=\"jnt-calendar-host\" >\n <ng-container *ngIf=\"view === viewType.date\">\n <tr child-of=\"jnt-calendar-host\" *ngFor=\"let w of weeks\"\n [attr.data-current-week]=\"(current | jntStartOfWeek) | jntIsEqual: (w.date | jntStartOfWeek)\">\n <td child-of=\"jnt-calendar-host\" data-day *ngFor=\"let d of w.days\"\n [attr.data-today]=\"d | jntIsToday\"\n [attr.data-current-month]=\"(d | jntStartOfMonth) | jntIsEqual: (period | jntStartOfMonth)\"\n [attr.data-selected-day]=\"(d | jntStartOfDay) | jntIsEqual: (current | jntStartOfDay)\"\n (click)=\"select(d)\" tabindex=\"0\">\n <ng-container *ngTemplateOutlet=\"!!dayTemplate ? dayTemplate: defaultDayTemplate;context:{date: d}\">\n </ng-container>\n </td>\n\n <td child-of=\"jnt-calendar-host\" data-divider *ngIf=\"!!metrics.length\"></td>\n\n <td child-of=\"jnt-calendar-host\" data-metric *ngFor=\"let m of metrics;let i = index;\">\n <ng-container *ngTemplateOutlet=\"metricTemplate;context:{metric: i, date: w.date}\">\n </ng-container>\n </td>\n </tr>\n </ng-container>\n\n <ng-container *ngIf=\"view === viewType.month\">\n <tr child-of=\"jnt-calendar-host\" *ngFor=\"let row of months\">\n <td child-of=\"jnt-calendar-host\" data-day data-day-extend *ngFor=\"let month of row\"\n [attr.data-current-month]=\"month | jntIsThisMonth\"\n [attr.data-selected-month]=\"(month | jntStartOfMonth) | jntIsEqual: (current | jntStartOfMonth)\"\n (click)=\"period = month; view = viewType.date\">\n {{month | jntFormat: 'LLL'}}\n </td>\n </tr>\n </ng-container>\n\n <ng-container *ngIf=\"view === viewType.year\">\n <tr child-of=\"jnt-calendar-host\" *ngFor=\"let row of years\">\n <td child-of=\"jnt-calendar-host\" data-day data-day-extend data-year *ngFor=\"let year of row\"\n [attr.data-current-year]=\"year | jntIsThisYear\"\n [attr.data-selected-year]=\"(year | jntStartOfYear) | jntIsEqual: (current | jntStartOfYear)\"\n (click)=\"period = year; view = viewType.month\">\n {{year | jntFormat: 'yyyy'}}\n </td>\n </tr>\n </ng-container>\n\n </tbody>\n </table>\n <jnt-stack child-of=\"jnt-calendar-host\" *ngIf=\"features | includes : ui.feature.today\" [align]=\"ui.align.center\">\n <jnt-button child-of=\"jnt-calendar-host\" [scheme]=\"ui.scheme.secondary\"\n [size]=\"ui.size.small\"\n [icon]=\"ui.icons.today\"\n text=\"Today\"\n (click)=\"today()\">\n </jnt-button>\n </jnt-stack>\n</jnt-stack>\n\n<ng-template #defaultDayTemplate let-date=\"date\">\n <div child-of=\"jnt-calendar-host\" data-default>{{date | jntGetDate}}</div>\n</ng-template>", providers: __spread([ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(function () { return CalendarComponent_1; }), multi: true } ], I18N_PROVIDERS) }), __metadata("design:paramtypes", [NGXLogger, JunteUIConfig]) ], CalendarComponent); return CalendarComponent; }()); export { CalendarComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGp1bnRlL3VpLyIsInNvdXJjZXMiOlsibGliL2Zvcm1zL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsRUFDVCxXQUFXLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFDTCxPQUFPLEVBQUUsU0FBUyxFQUNsQixRQUFRLEVBQ1IsUUFBUSxFQUNSLFFBQVEsRUFDUixPQUFPLEVBQ1AsV0FBVyxFQUNYLFdBQVcsRUFDWCxTQUFTLEVBQ1QsUUFBUSxFQUNULE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFM0QsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNoQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUVuRSxJQUFNLGVBQWUsR0FBRyxDQUFDLENBQUM7QUFDMUIsSUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZCLElBQU0sU0FBUyxHQUFHLENBQUMs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QUFDO1lBQ1gsV0FBVyxFQUFFLG9CQUFvQjtZQUNqQyxJQUFJLEVBQUUsU0FBUztZQUNmLE9BQU8sRUFBRSxPQUFPO1NBQ2pCLENBQUM7UUFDRCxXQUFXLENBQUMsb0JBQW9CLENBQUM7UUFDakMsS0FBSyxFQUFFOzt1REFDUztJQU9qQjtRQUxDLFdBQVcsQ0FBQztZQUNYLFdBQVcsRUFBRSxrQ0FBa0M7WUFDL0MsSUFBSSxFQUFFLE1BQU07U0FDYixDQUFDO1FBQ0QsS0FBSyxDQUFDLE9BQU8sQ0FBQztrQ0FDSSxJQUFJO3lDQUFKLElBQUk7bURBS3RCO0lBVXFCO1FBQXJCLFlBQVksQ0FBQyxNQUFNLENBQUM7O3FEQUFpQztJQXJFM0MsaUJBQWlCO1FBWjdCLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSxjQUFjO1lBQ3hCLDh2TEFBMkM7WUFDM0MsU0FBUztnQkFDUDtvQkFDRSxPQUFPLEVBQUUsaUJBQWlCO29CQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLGNBQU0sT0FBQSxtQkFBaUIsRUFBakIsQ0FBaUIsQ0FBQztvQkFDaEQsS0FBSyxFQUFFLElBQUk7aUJBQ1o7ZUFDRSxjQUFjLENBQ2xCO1NBQ0YsQ0FBQzt5Q0F3RTRCLFNBQVM7WUFDVixhQUFhO09BeEU3QixpQkFBaUIsQ0FvSjdCO0lBQUQsd0JBQUM7Q0FBQSxBQXBKRCxJQW9KQztTQXBKWSxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBUZW1wbGF0ZVJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIGFkZERheXMsIGFkZE1vbnRocyxcbiAgYWRkV2Vla3MsXG4gIGFkZFllYXJzLFxuICBnZXRNb250aCxcbiAgZ2V0WWVhcixcbiAgaXNTYW1lTW9udGgsXG4gIHN0YXJ0T2ZXZWVrLFxuICBzdWJNb250aHMsXG4gIHN1YlllYXJzXG59IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7IE5HWExvZ2dlciB9IGZyb20gJ25neC1sb2dnZXInO1xuaW1wb3J0IHsgSnVudGVVSUNvbmZpZyB9IGZyb20gJy4uLy4uL2NvbmZpZyc7XG5pbXBvcnQgeyBQcm9wZXJ0eUFwaSB9IGZyb20gJy4uLy4uL2NvcmUvZGVjb3JhdG9ycy9hcGknO1xuaW1wb3J0IHsgRmVhdHVyZSB9IGZyb20gJy4uLy4uL2NvcmUvZW51bXMvZmVhdHVyZSc7XG5pbXBvcnQgeyBVSSB9IGZyb20gJy4uLy4uL2NvcmUvZW51bXMvdWknO1xuaW1wb3J0IHsgSTE4Tl9QUk9WSURFUlMgfSBmcm9tICcuLi8uLi9jb3JlL2kxOG4vcHJvdmlkZXJzJztcbmltcG9ydCB7IFBlcmlvZCB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgdG9kYXkgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IFdlZWtNZXRyaWNDb21wb25lbnQgfSBmcm9tICcuL3dlZWsvd2Vlay1tZXRyaWMuY29tcG9uZW50JztcblxuY29uc3QgV0VFS1NfRElTUExBWUVEID0gNjtcbmNvbnN0IERBWVNfSU5fV0VFSyA9IDc7XG5jb25zdCBEQVRFX1JPV1MgPSAzO1xuY29uc3QgREFURV9DT0xTID0gNDtcblxuZW51bSBWaWV3VHlwZSB7XG4gIGRhdGUgPSAnZGF0ZScsXG4gIHllYXIgPSAneWVhcicsXG4gIG1vbnRoID0gJ21vbnRoJ1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdqbnQtY2FsZW5kYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXIuZW5jYXBzdWxhdGVkLmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENhbGVuZGFyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfSxcbiAgICAuLi5JMThOX1BST1ZJREVSU1xuICBdXG59KVxuZXhwb3J0IGNsYXNzIENhbGVuZGFyQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCB7XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmhvc3QnKVxuICByZWFkb25seSBob3N0ID0gJ2pudC1jYWxlbmRhci1ob3N0JztcblxuICB1aSA9IFVJO1xuXG4gIHByaXZhdGUgX3BlcmlvZDogRGF0ZSA9IHRvZGF5KCk7XG5cbiAgY3VycmVudDogRGF0ZTtcblxuICB3ZWVrcyA9IFtdO1xuICBtb250aHMgPSBbXTtcbiAgeWVhcnMgPSBbXTtcbiAgdmlld1R5cGUgPSBWaWV3VHlwZTtcbiAgdmlldzogVmlld1R5cGUgPSBWaWV3VHlwZS5kYXRlO1xuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdDYWxlbmRhciBmZWF0dXJlcycsXG4gICAgcGF0aDogJ3VpLmZlYXR1cmUnLFxuICAgIG9wdGlvbnM6IFtGZWF0dXJlLnRvZGF5XVxuICB9KVxuICBASW5wdXQoKVxuICBmZWF0dXJlczogRmVhdHVyZVtdID0gW107XG5cbiAgQENvbnRlbnRDaGlsZHJlbihXZWVrTWV0cmljQ29tcG9uZW50KVxuICBtZXRyaWNzOiBRdWVyeUxpc3Q8V2Vla01ldHJpY0NvbXBvbmVudD47XG5cbiAgQENvbnRlbnRDaGlsZCgnY2FsZW5kYXJEYXlUZW1wbGF0ZScpXG4gIGRheVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2NhbGVuZGFyTWV0cmljVGVtcGxhdGUnKVxuICBtZXRyaWNUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICBAT3V0cHV0KClcbiAgdXBkYXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8UGVyaW9kPigpO1xuXG4gIEBPdXRwdXQoKVxuICBzZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4oKTtcblxuICBAUHJvcGVydHlBcGkoe1xuICAgIGRlc2NyaXB0aW9uOiAnU2V0IGRpc2FibGVkIHN0YXRlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogJ2ZhbHNlJyxcbiAgfSlcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmRhdGEtZGlzYWJsZWQnKVxuICBASW5wdXQoKVxuICBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdTZXQgY3VycmVudCBtb250aCBmb3IgZGlzcGxheWluZycsXG4gICAgdHlwZTogJ0RhdGUnXG4gIH0pXG4gIEBJbnB1dCgnbW9udGgnKVxuICBzZXQgcGVyaW9kKHBlcmlvZDogRGF0ZSkge1xuICAgIGlmICghaXNTYW1lTW9udGgodGhpcy5fcGVyaW9kLCBwZXJpb2QpKSB7XG4gICAgICB0aGlzLl9wZXJpb2QgPSBwZXJpb2Q7XG4gICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBwZXJpb2QoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BlcmlvZDtcbiAgfVxuXG4gIG9uQ2hhbmdlOiAoZGF0ZTogRGF0ZSkgPT4gdm9pZCA9ICgpID0+IHRoaXMubG9nZ2VyLmRlYnVnKCd2YWx1ZSBhY2Nlc3NvciBpcyBub3QgcmVnaXN0ZXJlZCcpO1xuICBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB0aGlzLmxvZ2dlci5kZWJ1ZygndmFsdWUgYWNjZXNzb3IgaXMgbm90IHJlZ2lzdGVyZWQnKTtcbiAgcmVnaXN0ZXJPbkNoYW5nZSA9IGZuID0+IHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgcmVnaXN0ZXJPblRvdWNoZWQgPSBmbiA9PiB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICBASG9zdExpc3RlbmVyKCdibHVyJykgb25CbHVyID0gKCkgPT4gdGhpcy5vblRvdWNoZWQoKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGxvZ2dlcjogTkdYTG9nZ2VyLFxuICAgICAgICAgICAgICBwdWJsaWMgY29uZmlnOiBKdW50ZVVJQ29uZmlnKSB7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZShkYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50ID0gZGF0ZTtcbiAgICB0aGlzLnBlcmlvZCA9IGRhdGUgfHwgdG9kYXkoKTtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG5cbiAgc2VsZWN0KGRhdGU6IERhdGUpIHtcbiAgICB0aGlzLmN1cnJlbnQgPSBkYXRlO1xuICAgIHRoaXMub25DaGFuZ2UoZGF0ZSk7XG4gICAgdGhpcy5zZWxlY3RlZC5lbWl0KGRhdGUpO1xuICB9XG5cbiAgdG9kYXkoKSB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICB0aGlzLnBlcmlvZCA9IG5vdztcbiAgICB0aGlzLnNlbGVjdChub3cpO1xuICB9XG5cbiAgYWRkKCkge1xuICAgIGlmKHRoaXMudmlldyA9PT0gVmlld1R5cGUuZGF0ZSkge1xuICAgICAgdGhpcy5wZXJpb2QgPSBhZGRNb250aHModGhpcy5wZXJpb2QsIDEpO1xuICAgIH0gZWxzZSBpZiAodGhpcy52aWV3ID09PSBWaWV3VHlwZS5tb250aCkge1xuICAgICAgdGhpcy5wZXJpb2QgPSBhZGRZZWFycyh0aGlzLnBlcmlvZCwgMSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wZXJpb2QgPSBhZGRZZWFycyh0aGlzLnBlcmlvZCwgMTIpXG4gICAgfVxuICB9XG5cbiAgc3ViKCkge1xuICAgIGlmKHRoaXMudmlldyA9PT0gVmlld1R5cGUuZGF0ZSkge1xuICAgICAgdGhpcy5wZXJpb2QgPSBzdWJNb250aHModGhpcy5wZXJpb2QsIDEpO1xuICAgIH0gZWxzZSBpZiAodGhpcy52aWV3ID09PSBWaWV3VHlwZS5tb250aCkge1xuICAgICAgdGhpcy5wZXJpb2QgPSBzdWJZZWFycyh0aGlzLnBlcmlvZCwgMSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wZXJpb2QgPSBzdWJZZWFycyh0aGlzLnBlcmlvZCwgMTIpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGUoKSB7XG4gICAgY29uc3Qgc3RhcnQgPSBzdGFydE9mV2VlayhuZXcgRGF0ZShnZXRZZWFyKHRoaXMucGVyaW9kKSwgZ2V0TW9udGgodGhpcy5wZXJpb2QpLCAxKSxcbiAgICAgIHtsb2NhbGU6IHRoaXMuY29uZmlnLmxvY2FsZS5kZm5zfSk7XG4gICAgbGV0IGRhdGUgPSBzdGFydDtcbiAgICB0aGlzLndlZWtzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBXRUVLU19ESVNQTEFZRUQ7IGkrKykge1xuICAgICAgdGhpcy53ZWVrc1tpXSA9IHtkYXlzOiBbXSwgZGF0ZTogZGF0ZX07XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IERBWVNfSU5fV0VFSzsgaisrKSB7XG4gICAgICAgIHRoaXMud2Vla3NbaV0uZGF5c1tqXSA9IGFkZERheXMoZGF0ZSwgaik7XG4gICAgICB9XG4gICAgICBkYXRlID0gYWRkV2Vla3MoZGF0ZSwgMSk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlZC5lbWl0KHtzdGFydDogc3RhcnQsIGVuZDogZGF0ZX0pO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBEQVRFX1JPV1M7IGkrKykge1xuICAgICAgdGhpcy5tb250aHNbaV0gPSBbXTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgREFURV9DT0xTOyBqKyspIHtcbiAgICAgICAgdGhpcy5tb250aHNbaV0ucHVzaChuZXcgRGF0ZShnZXRZZWFyKHRoaXMucGVyaW9kKSwgaSAqIERBVEVfQ09MUyArIGosIDEpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IERBVEVfUk9XUzsgaSsrKSB7XG4gICAgICB0aGlzLnllYXJzW2ldID0gW107XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IERBVEVfQ09MUzsgaisrKSB7XG4gICAgICAgIHRoaXMueWVhcnNbaV0ucHVzaChuZXcgRGF0ZShnZXRZZWFyKHRoaXMucGVyaW9kKSAtIDQgKyBpICogREFURV9DT0xTICsgaiwgaSAqIERBVEVfQ09MUyArIGosIDEpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==