UNPKG

@bimeister/pupakit.calendar

Version:
110 lines 20.4 kB
import { animate, style, transition, trigger } from '@angular/animations'; import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewEncapsulation, } from '@angular/core'; import '@bimeister/pupakit.common'; import { isNil } from '@bimeister/utilities'; import { Subscription } from 'rxjs'; import { CalendarQuickSelectMode } from '../../declarations/enums/calendar-quick-select-mode.enum'; import { isDate } from '../../declarations/functions/is-date.function'; import '../../declarations/interfaces/calendar-month.interface'; import { CalendarConfigService } from '../../services/calendar-config.service'; import { CalendarManipulatorService } from '../../services/calendar-manipulator.service'; import { CalendarStateService } from '../../services/calendar-state.service'; import { CalendarTranslationService } from '../../services/calendar-translation.service'; import * as i0 from "@angular/core"; import * as i1 from "../../services/calendar-state.service"; import * as i2 from "../../services/calendar-manipulator.service"; import * as i3 from "@angular/common"; import * as i4 from "../calendar-scroller/calendar-scroller.component"; import * as i5 from "../calendar-week-panel/calendar-week-panel.component"; import * as i6 from "../calendar-header/calendar-header.component"; import * as i7 from "../calendar-control-panel/calendar-control-panel.component"; import * as i8 from "../calendar-year-selector/calendar-year-selector.component"; import * as i9 from "../calendar-month-selector/calendar-month-selector.component"; const ANIMATION_DURATION_MS = 200; export class CalendarComponent { constructor(calendarStateService, calendarManipulatorService) { this.calendarStateService = calendarStateService; this.calendarManipulatorService = calendarManipulatorService; this.isRange = false; this.selected = []; this.select = new EventEmitter(); this.quickSelectMode = CalendarQuickSelectMode; this.quickSelectMode$ = this.calendarStateService.quickSelectMode$; this.subscription = new Subscription(); this.subscription.add(this.emitSelectDatesWhenSelectionChanged()); } ngOnChanges(changes) { if (changes.hasOwnProperty('isRange')) { this.processIsRangeChange(changes.isRange); } if (changes.hasOwnProperty('selected')) { this.processSelectedChange(changes.selected); } } ngOnDestroy() { this.subscription.unsubscribe(); } handleYearSelect(year) { this.calendarStateService.resetQuickSelectMode(); this.calendarManipulatorService.scrollToYear(year, 'auto'); } handleMonthSelect(month) { this.calendarStateService.resetQuickSelectMode(); this.calendarManipulatorService.scrollToMonth(month, 'auto'); } processIsRangeChange(change) { if (isNil(change.currentValue)) { return; } this.calendarStateService.setIsRange(change.currentValue); } processSelectedChange(change) { const value = change.currentValue; if (isNil(value)) { return; } const dates = Array.isArray(value) ? value : [value]; if (!dates.every(isDate)) { return; } this.calendarStateService.setSelectedDates(dates); } emitSelectDatesWhenSelectionChanged() { return this.calendarStateService.selectedDates$.subscribe((selectedDates) => this.select.emit(selectedDates)); } } CalendarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: CalendarComponent, deps: [{ token: i1.CalendarStateService }, { token: i2.CalendarManipulatorService }], target: i0.ɵɵFactoryTarget.Component }); CalendarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: CalendarComponent, selector: "pupa-calendar", inputs: { isRange: "isRange", selected: "selected" }, outputs: { select: "select" }, providers: [CalendarConfigService, CalendarTranslationService, CalendarManipulatorService, CalendarStateService], usesOnChanges: true, ngImport: i0, template: "<pupa-calendar-header>\n <pupa-calendar-control-panel></pupa-calendar-control-panel>\n <pupa-calendar-week-panel></pupa-calendar-week-panel>\n</pupa-calendar-header>\n\n<pupa-calendar-scroller></pupa-calendar-scroller>\n\n<ng-container [ngSwitch]=\"quickSelectMode$ | async\">\n <pupa-calendar-month-selector\n (select)=\"handleMonthSelect($event)\"\n *ngSwitchCase=\"quickSelectMode.Month\"\n [@quickSelectorAnimation]\n ></pupa-calendar-month-selector>\n\n <pupa-calendar-year-selector\n (select)=\"handleYearSelect($event)\"\n *ngSwitchCase=\"quickSelectMode.Year\"\n [@quickSelectorAnimation]\n ></pupa-calendar-year-selector>\n</ng-container>\n", styles: [":host{display:flex;flex-direction:column;position:relative;box-sizing:border-box;overflow:hidden;height:100%;width:100%;background:rgba(var(--semantic-color_surface-primary),var(--semantic-color-alpha_surface-primary))}\n"], dependencies: [{ kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i4.CalendarScrollerComponent, selector: "pupa-calendar-scroller" }, { kind: "component", type: i5.CalendarWeekPanelComponent, selector: "pupa-calendar-week-panel" }, { kind: "component", type: i6.CalendarHeaderComponent, selector: "pupa-calendar-header" }, { kind: "component", type: i7.CalendarControlPanelComponent, selector: "pupa-calendar-control-panel" }, { kind: "component", type: i8.CalendarYearSelectorComponent, selector: "pupa-calendar-year-selector", outputs: ["select"] }, { kind: "component", type: i9.CalendarMonthSelectorComponent, selector: "pupa-calendar-month-selector", outputs: ["select"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }], animations: [ trigger('quickSelectorAnimation', [ transition(':enter', [ style({ opacity: 0, top: '-100%' }), animate(`${ANIMATION_DURATION_MS}ms ease-out`, style({ opacity: 1, top: 0 })), ]), transition(':leave', [ style({ opacity: 1, top: 0 }), animate(`${ANIMATION_DURATION_MS}ms ease-in`, style({ opacity: 0, top: '-100%' })), ]), ]), ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: CalendarComponent, decorators: [{ type: Component, args: [{ selector: 'pupa-calendar', encapsulation: ViewEncapsulation.Emulated, changeDetection: ChangeDetectionStrategy.OnPush, providers: [CalendarConfigService, CalendarTranslationService, CalendarManipulatorService, CalendarStateService], animations: [ trigger('quickSelectorAnimation', [ transition(':enter', [ style({ opacity: 0, top: '-100%' }), animate(`${ANIMATION_DURATION_MS}ms ease-out`, style({ opacity: 1, top: 0 })), ]), transition(':leave', [ style({ opacity: 1, top: 0 }), animate(`${ANIMATION_DURATION_MS}ms ease-in`, style({ opacity: 0, top: '-100%' })), ]), ]), ], template: "<pupa-calendar-header>\n <pupa-calendar-control-panel></pupa-calendar-control-panel>\n <pupa-calendar-week-panel></pupa-calendar-week-panel>\n</pupa-calendar-header>\n\n<pupa-calendar-scroller></pupa-calendar-scroller>\n\n<ng-container [ngSwitch]=\"quickSelectMode$ | async\">\n <pupa-calendar-month-selector\n (select)=\"handleMonthSelect($event)\"\n *ngSwitchCase=\"quickSelectMode.Month\"\n [@quickSelectorAnimation]\n ></pupa-calendar-month-selector>\n\n <pupa-calendar-year-selector\n (select)=\"handleYearSelect($event)\"\n *ngSwitchCase=\"quickSelectMode.Year\"\n [@quickSelectorAnimation]\n ></pupa-calendar-year-selector>\n</ng-container>\n", styles: [":host{display:flex;flex-direction:column;position:relative;box-sizing:border-box;overflow:hidden;height:100%;width:100%;background:rgba(var(--semantic-color_surface-primary),var(--semantic-color-alpha_surface-primary))}\n"] }] }], ctorParameters: function () { return [{ type: i1.CalendarStateService }, { type: i2.CalendarManipulatorService }]; }, propDecorators: { isRange: [{ type: Input }], selected: [{ type: Input }], select: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvY2FsZW5kYXIvY2FsZW5kYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvY2FsZW5kYXIvY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFFLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFrRCwyQkFBMkIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDN0MsT0FBTyxFQUFjLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUNuRyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDdkUsT0FBOEIsd0RBQXdELENBQUM7QUFDdkYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDL0UsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDekYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDN0UsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7Ozs7Ozs7Ozs7O0FBRXpGLE1BQU0scUJBQXFCLEdBQVcsR0FBRyxDQUFDO0FBc0IxQyxNQUFNLE9BQU8saUJBQWlCO0lBZ0I1QixZQUNtQixvQkFBMEMsRUFDMUMsMEJBQXNEO1FBRHRELHlCQUFvQixH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QUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQzs2QkFDbkYsQ0FBQzt5QkFDSCxDQUFDO3FCQUNIO29KQUlNLE9BQU87c0JBRGIsS0FBSztnQkFJQyxRQUFRO3NCQURkLEtBQUs7Z0JBSVUsTUFBTTtzQkFEckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFuaW1hdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21wb25lbnRDaGFuZ2UsIENvbXBvbmVudENoYW5nZXMgfSBmcm9tICdAYmltZWlzdGVyL3B1cGFraXQuY29tbW9uJztcbmltcG9ydCB7IGlzTmlsIH0gZnJvbSAnQGJpbWVpc3Rlci91dGlsaXRpZXMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDYWxlbmRhclF1aWNrU2VsZWN0TW9kZSB9IGZyb20gJy4uLy4uL2RlY2xhcmF0aW9ucy9lbnVtcy9jYWxlbmRhci1xdWljay1zZWxlY3QtbW9kZS5lbnVtJztcbmltcG9ydCB7IGlzRGF0ZSB9IGZyb20gJy4uLy4uL2RlY2xhcmF0aW9ucy9mdW5jdGlvbnMvaXMtZGF0ZS5mdW5jdGlvbic7XG5pbXBvcnQgeyBDYWxlbmRhck1vbnRoIH0gZnJvbSAnLi4vLi4vZGVjbGFyYXRpb25zL2ludGVyZmFjZXMvY2FsZW5kYXItbW9udGguaW50ZXJmYWNlJztcbmltcG9ydCB7IENhbGVuZGFyQ29uZmlnU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NhbGVuZGFyLWNvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IENhbGVuZGFyTWFuaXB1bGF0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY2FsZW5kYXItbWFuaXB1bGF0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBDYWxlbmRhclN0YXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NhbGVuZGFyLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FsZW5kYXJUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jYWxlbmRhci10cmFuc2xhdGlvbi5zZXJ2aWNlJztcblxuY29uc3QgQU5JTUFUSU9OX0RVUkFUSU9OX01TOiBudW1iZXIgPSAyMDA7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3B1cGEtY2FsZW5kYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZCxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW0NhbGVuZGFyQ29uZmlnU2VydmljZSwgQ2FsZW5kYXJUcmFuc2xhdGlvblNlcnZpY2UsIENhbGVuZGFyTWFuaXB1bGF0b3JTZXJ2aWNlLCBDYWxlbmRhclN0YXRlU2VydmljZV0sXG4gIGFuaW1hdGlvbnM6IFtcbiAgICB0cmlnZ2VyKCdxdWlja1NlbGVjdG9yQW5pbWF0aW9uJywgW1xuICAgICAgdHJhbnNpdGlvbignOmVudGVyJywgW1xuICAgICAgICBzdHlsZSh7IG9wYWNpdHk6IDAsIHRvcDogJy0xMDAlJyB9KSxcbiAgICAgICAgYW5pbWF0ZShgJHtBTklNQVRJT05fRFVSQVRJT05fTVN9bXMgZWFzZS1vdXRgLCBzdHlsZSh7IG9wYWNpdHk6IDEsIHRvcDogMCB9KSksXG4gICAgICBdKSxcbiAgICAgIHRyYW5zaXRpb24oJzpsZWF2ZScsIFtcbiAgICAgICAgc3R5bGUoeyBvcGFjaXR5OiAxLCB0b3A6IDAgfSksXG4gICAgICAgIGFuaW1hdGUoYCR7QU5JTUFUSU9OX0RVUkFUSU9OX01TfW1zIGVhc2UtaW5gLCBzdHlsZSh7IG9wYWNpdHk6IDAsIHRvcDogJy0xMDAlJyB9KSksXG4gICAgICBdKSxcbiAgICBdKSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2FsZW5kYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBpc1JhbmdlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNlbGVjdGVkOiBEYXRlW10gfCBEYXRlID0gW107XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyByZWFkb25seSBzZWxlY3Q6IEV2ZW50RW1pdHRlcjxEYXRlW10+ID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlW10+KCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IHF1aWNrU2VsZWN0TW9kZTogdHlwZW9mIENhbGVuZGFyUXVpY2tTZWxlY3RNb2RlID0gQ2FsZW5kYXJRdWlja1NlbGVjdE1vZGU7XG5cbiAgcHVibGljIHJlYWRvbmx5IHF1aWNrU2VsZWN0TW9kZSQ6IE9ic2VydmFibGU8Q2FsZW5kYXJRdWlja1NlbGVjdE1vZGU+ID0gdGhpcy5jYWxlbmRhclN0YXRlU2VydmljZS5xdWlja1NlbGVjdE1vZGUkO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjYWxlbmRhclN0YXRlU2VydmljZTogQ2FsZW5kYXJTdGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjYWxlbmRhck1hbmlwdWxhdG9yU2VydmljZTogQ2FsZW5kYXJNYW5pcHVsYXRvclNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKHRoaXMuZW1pdFNlbGVjdERhdGVzV2hlblNlbGVjdGlvbkNoYW5nZWQoKSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogQ29tcG9uZW50Q2hhbmdlczx0aGlzPik6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdpc1JhbmdlJykpIHtcbiAgICAgIHRoaXMucHJvY2Vzc0lzUmFuZ2VDaGFuZ2UoY2hhbmdlcy5pc1JhbmdlKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ3NlbGVjdGVkJykpIHtcbiAgICAgIHRoaXMucHJvY2Vzc1NlbGVjdGVkQ2hhbmdlKGNoYW5nZXMuc2VsZWN0ZWQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZVllYXJTZWxlY3QoeWVhcjogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5jYWxlbmRhclN0YXRlU2VydmljZS5yZXNldFF1aWNrU2VsZWN0TW9kZSgpO1xuICAgIHRoaXMuY2FsZW5kYXJNYW5pcHVsYXRvclNlcnZpY2Uuc2Nyb2xsVG9ZZWFyKHllYXIsICdhdXRvJyk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlTW9udGhTZWxlY3QobW9udGg6IENhbGVuZGFyTW9udGgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbGVuZGFyU3RhdGVTZXJ2aWNlLnJlc2V0UXVpY2tTZWxlY3RNb2RlKCk7XG4gICAgdGhpcy5jYWxlbmRhck1hbmlwdWxhdG9yU2VydmljZS5zY3JvbGxUb01vbnRoKG1vbnRoLCAnYXV0bycpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzSXNSYW5nZUNoYW5nZShjaGFuZ2U6IENvbXBvbmVudENoYW5nZTx0aGlzLCBib29sZWFuPik6IHZvaWQge1xuICAgIGlmIChpc05pbChjaGFuZ2UuY3VycmVudFZhbHVlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY2FsZW5kYXJTdGF0ZVNlcnZpY2Uuc2V0SXNSYW5nZShjaGFuZ2UuY3VycmVudFZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc1NlbGVjdGVkQ2hhbmdlKGNoYW5nZTogQ29tcG9uZW50Q2hhbmdlPHRoaXMsIERhdGVbXSB8IERhdGU+KTogdm9pZCB7XG4gICAgY29uc3QgdmFsdWU6IERhdGVbXSB8IERhdGUgfCB1bmRlZmluZWQgPSBjaGFuZ2UuY3VycmVudFZhbHVlO1xuXG4gICAgaWYgKGlzTmlsKHZhbHVlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGVzOiBEYXRlW10gPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcblxuICAgIGlmICghZGF0ZXMuZXZlcnkoaXNEYXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY2FsZW5kYXJTdGF0ZVNlcnZpY2Uuc2V0U2VsZWN0ZWREYXRlcyhkYXRlcyk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRTZWxlY3REYXRlc1doZW5TZWxlY3Rpb25DaGFuZ2VkKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuY2FsZW5kYXJTdGF0ZVNlcnZpY2Uuc2VsZWN0ZWREYXRlcyQuc3Vic2NyaWJlKChzZWxlY3RlZERhdGVzOiBEYXRlW10pID0+XG4gICAgICB0aGlzLnNlbGVjdC5lbWl0KHNlbGVjdGVkRGF0ZXMpXG4gICAgKTtcbiAgfVxufVxuIiwiPHB1cGEtY2FsZW5kYXItaGVhZGVyPlxuICA8cHVwYS1jYWxlbmRhci1jb250cm9sLXBhbmVsPjwvcHVwYS1jYWxlbmRhci1jb250cm9sLXBhbmVsPlxuICA8cHVwYS1jYWxlbmRhci13ZWVrLXBhbmVsPjwvcHVwYS1jYWxlbmRhci13ZWVrLXBhbmVsPlxuPC9wdXBhLWNhbGVuZGFyLWhlYWRlcj5cblxuPHB1cGEtY2FsZW5kYXItc2Nyb2xsZXI+PC9wdXBhLWNhbGVuZGFyLXNjcm9sbGVyPlxuXG48bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJxdWlja1NlbGVjdE1vZGUkIHwgYXN5bmNcIj5cbiAgPHB1cGEtY2FsZW5kYXItbW9udGgtc2VsZWN0b3JcbiAgICAoc2VsZWN0KT1cImhhbmRsZU1vbnRoU2VsZWN0KCRldmVudClcIlxuICAgICpuZ1N3aXRjaENhc2U9XCJxdWlja1NlbGVjdE1vZGUuTW9udGhcIlxuICAgIFtAcXVpY2tTZWxlY3RvckFuaW1hdGlvbl1cbiAgPjwvcHVwYS1jYWxlbmRhci1tb250aC1zZWxlY3Rvcj5cblxuICA8cHVwYS1jYWxlbmRhci15ZWFyLXNlbGVjdG9yXG4gICAgKHNlbGVjdCk9XCJoYW5kbGVZZWFyU2VsZWN0KCRldmVudClcIlxuICAgICpuZ1N3aXRjaENhc2U9XCJxdWlja1NlbGVjdE1vZGUuWWVhclwiXG4gICAgW0BxdWlja1NlbGVjdG9yQW5pbWF0aW9uXVxuICA+PC9wdXBhLWNhbGVuZGFyLXllYXItc2VsZWN0b3I+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==