systelab-components
Version:
systelab-components is a set of components that use wide accepted and adopted standard technologies like Angular and Bootstrap, as well as other popular libraries. Please read the ATTRIBUTION.md file for a complete list of dependencies.
119 lines • 19.3 kB
JavaScript
import { Component, EventEmitter, Input, Output } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "systelab-translate";
import * as i2 from "@angular/common";
import * as i3 from "@angular/forms";
import * as i4 from "../calendar/calendar-header.component";
export class Month {
constructor(month, text, year, isActive) {
this.month = month;
this.text = text;
this.year = year;
this.isActive = isActive;
}
}
export class MonthSelectorComponent {
get selectedMonth() {
return this._selectedMonth;
}
set selectedMonth(value) {
this._selectedMonth = value;
this.selectedMonthChange.emit(this._selectedMonth);
}
constructor(i18nService) {
this.i18nService = i18nService;
this.selectedMonthChange = new EventEmitter();
this.months = [];
this.isOpened = false;
this.monthNames = [];
if (this.currentDate) {
this.setMonthsNames(this.currentDate.getFullYear());
}
else {
this.setMonthsNames(new Date().getFullYear());
}
this.selectedMonth = new Month(0, '', 0, false);
}
ngOnInit() {
if (!this.currentDate) {
this.currentDate = new Date();
}
this.getMonths();
}
setMonthsNames(year) {
this.monthNames = [];
for (let i = 0; i <= 11; i++) {
const month = this.i18nService.formatMonthAndYear(new Date(year, i, 1));
this.monthNames.push(month);
}
}
onClicked(e) {
this.isOpened = true;
}
hideSelector() {
this.isOpened = false;
}
getMonths() {
this.months = [];
const month = this.currentDate.getMonth();
const year = this.currentDate.getFullYear();
for (let i = 0; i <= 11; i++) {
const dateStart = new Date(year, i, 1, 0, 0, 0, 0);
const dateEnd = new Date(year, i + 1, 0);
if (this.checkDateIntoIntervals(dateStart) || this.checkDateIntoIntervals(dateEnd)) {
const isActive = (i === month);
const monthObj = new Month(i, this.monthNames[i], year, isActive);
this.months.push(monthObj);
if (isActive) {
this.selectedMonth = monthObj;
}
}
}
}
addYear(num) {
const date = new Date(this.currentDate.getFullYear() + (num), this.currentDate.getMonth(), this.currentDate.getDate());
if (this.checkDateIntoIntervals(date)) {
this.currentDate = date;
this.setMonthsNames(this.currentDate.getFullYear());
this.getMonths();
}
}
checkDateIntoIntervals(date) {
if (this.minDate && this.maxDate) {
return date >= this.minDate && date <= this.maxDate;
}
else if (this.minDate) {
return date >= this.minDate;
}
else if (this.maxDate) {
return date <= this.maxDate;
}
else {
return true;
}
}
onClickedMonth(month) {
this.currentDate = new Date(month.year, month.month, 1);
this.hideSelector();
this.getMonths();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: MonthSelectorComponent, deps: [{ token: i1.I18nService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.0.9", type: MonthSelectorComponent, selector: "systelab-month-selector", inputs: { maxDate: "maxDate", minDate: "minDate", currentDate: "currentDate", disabled: "disabled", selectedMonth: "selectedMonth" }, outputs: { selectedMonthChange: "selectedMonthChange" }, ngImport: i0, template: "<div class=\"dropdown slab-combobox slab-month-selector d-flex w-100\" [ngClass]=\"{'disabled': disabled}\">\n <div class=\"slab-flex-1 d-flex dropdown-toggle slab-dropdown-toogle\">\n <input #input type=\"text\" class=\"slab-flex-1 d-flex slab-combo-input\" [readOnly]=\"true\" [disabled]=\"disabled\" [(ngModel)]=\"selectedMonth.text\"\n (click)=\"onClicked($event)\"/>\n <button #combobutton type=\"button\" class=\"slab-combo-button slab-combo-button-icon\" [disabled]=\"disabled\" (click)=\"onClicked($event)\" [tabIndex]=\"-1\"></button>\n </div>\n <div *ngIf=\"isOpened\" class=\"slab-month-selector-dropdown\" [ngClass]=\"{'disabled': disabled}\" (mouseleave)=\"hideSelector()\">\n <div class=\"header-selector\">\n <systelab-calendar-header [currentDate]=\"currentDate\" (previousYear)=\"addYear(-1)\"\n (nextYear)=\"addYear(1)\">\n </systelab-calendar-header>\n </div>\n <div class=\"box\">\n <ul>\n @for (month of months; track month.month) {\n <li [class.active]=\"month.isActive\" (click)=\"onClickedMonth(month)\">\n {{month.text}}\n </li>\n }\n </ul>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.CalendarHeaderComponent, selector: "systelab-calendar-header", inputs: ["currentDate"], outputs: ["previousYear", "previousMonth", "nextMonth", "nextYear"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: MonthSelectorComponent, decorators: [{
type: Component,
args: [{ selector: 'systelab-month-selector', template: "<div class=\"dropdown slab-combobox slab-month-selector d-flex w-100\" [ngClass]=\"{'disabled': disabled}\">\n <div class=\"slab-flex-1 d-flex dropdown-toggle slab-dropdown-toogle\">\n <input #input type=\"text\" class=\"slab-flex-1 d-flex slab-combo-input\" [readOnly]=\"true\" [disabled]=\"disabled\" [(ngModel)]=\"selectedMonth.text\"\n (click)=\"onClicked($event)\"/>\n <button #combobutton type=\"button\" class=\"slab-combo-button slab-combo-button-icon\" [disabled]=\"disabled\" (click)=\"onClicked($event)\" [tabIndex]=\"-1\"></button>\n </div>\n <div *ngIf=\"isOpened\" class=\"slab-month-selector-dropdown\" [ngClass]=\"{'disabled': disabled}\" (mouseleave)=\"hideSelector()\">\n <div class=\"header-selector\">\n <systelab-calendar-header [currentDate]=\"currentDate\" (previousYear)=\"addYear(-1)\"\n (nextYear)=\"addYear(1)\">\n </systelab-calendar-header>\n </div>\n <div class=\"box\">\n <ul>\n @for (month of months; track month.month) {\n <li [class.active]=\"month.isActive\" (click)=\"onClickedMonth(month)\">\n {{month.text}}\n </li>\n }\n </ul>\n </div>\n </div>\n</div>\n" }]
}], ctorParameters: () => [{ type: i1.I18nService }], propDecorators: { maxDate: [{
type: Input
}], minDate: [{
type: Input
}], currentDate: [{
type: Input
}], disabled: [{
type: Input
}], selectedMonth: [{
type: Input
}], selectedMonthChange: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9udGgtc2VsZWN0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3lzdGVsYWItY29tcG9uZW50cy9zcmMvbGliL21vbnRoLXNlbGVjdG9yL21vbnRoLXNlbGVjdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N5c3RlbGFiLWNvbXBvbmVudHMvc3JjL2xpYi9tb250aC1zZWxlY3Rvci9tb250aC1zZWxlY3Rvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7QUFHL0UsTUFBTSxPQUFPLEtBQUs7SUFDakIsWUFBbUIsS0FBYSxFQUFTLElBQVksRUFBUyxJQUFZLEVBQVMsUUFBaUI7UUFBakYsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUFTLFNBQUksR0FBSixJQUFJLENBQVE7UUFBUyxTQUFJLEdBQUosSUFBSSxDQUFRO1FBQVMsYUFBUSxHQUFSLFFBQVEsQ0FBUztJQUNwRyxDQUFDO0NBQ0Q7QUFNRCxNQUFNLE9BQU8sc0JBQXNCO0lBUWxDLElBQ0ksYUFBYTtRQUNoQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDNUIsQ0FBQztJQUlELElBQUksYUFBYSxDQUFDLEtBQVk7UUFDN0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDNUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQU1ELFlBQW9CLFdBQXdCO1FBQXhCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBWDNCLHdCQUFtQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFPbkQsV0FBTSxHQUFpQixFQUFFLENBQUM7UUFDMUIsYUFBUSxHQUFHLEtB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VSxPQUFPO3NCQUF0QixLQUFLO2dCQUNVLFdBQVc7c0JBQTFCLEtBQUs7Z0JBQ1UsUUFBUTtzQkFBdkIsS0FBSztnQkFJRixhQUFhO3NCQURoQixLQUFLO2dCQUtXLG1CQUFtQjtzQkFBbkMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9uSW5pdCwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnc3lzdGVsYWItdHJhbnNsYXRlJztcblxuZXhwb3J0IGNsYXNzIE1vbnRoIHtcblx0Y29uc3RydWN0b3IocHVibGljIG1vbnRoOiBudW1iZXIsIHB1YmxpYyB0ZXh0OiBzdHJpbmcsIHB1YmxpYyB5ZWFyOiBudW1iZXIsIHB1YmxpYyBpc0FjdGl2ZTogYm9vbGVhbikge1xuXHR9XG59XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogICAgJ3N5c3RlbGFiLW1vbnRoLXNlbGVjdG9yJyxcblx0dGVtcGxhdGVVcmw6ICcuL21vbnRoLXNlbGVjdG9yLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBNb250aFNlbGVjdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuXHRASW5wdXQoKSBwdWJsaWMgbWF4RGF0ZTogRGF0ZTtcblx0QElucHV0KCkgcHVibGljIG1pbkRhdGU6IERhdGU7XG5cdEBJbnB1dCgpIHB1YmxpYyBjdXJyZW50RGF0ZTogRGF0ZTtcblx0QElucHV0KCkgcHVibGljIGRpc2FibGVkOiBib29sZWFuO1xuXG5cdHByaXZhdGUgX3NlbGVjdGVkTW9udGg6IE1vbnRoO1xuXHRASW5wdXQoKVxuXHRnZXQgc2VsZWN0ZWRNb250aCgpOiBNb250aCB7XG5cdFx0cmV0dXJuIHRoaXMuX3NlbGVjdGVkTW9udGg7XG5cdH1cblxuXHRAT3V0cHV0KCkgcHVibGljIHNlbGVjdGVkTW9udGhDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0c2V0IHNlbGVjdGVkTW9udGgodmFsdWU6IE1vbnRoKSB7XG5cdFx0dGhpcy5fc2VsZWN0ZWRNb250aCA9IHZhbHVlO1xuXHRcdHRoaXMuc2VsZWN0ZWRNb250aENoYW5nZS5lbWl0KHRoaXMuX3NlbGVjdGVkTW9udGgpO1xuXHR9XG5cblx0cHVibGljIG1vbnRoczogQXJyYXk8TW9udGg+ID0gW107XG5cdHB1YmxpYyBpc09wZW5lZCA9IGZhbHNlO1xuXHRwdWJsaWMgbW9udGhOYW1lcyA9IFtdO1xuXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlKSB7XG5cdFx0aWYgKHRoaXMuY3VycmVudERhdGUpIHtcblx0XHRcdHRoaXMuc2V0TW9udGhzTmFtZXModGhpcy5jdXJyZW50RGF0ZS5nZXRGdWxsWWVhcigpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXRNb250aHNOYW1lcyhuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkpO1xuXHRcdH1cblx0XHR0aGlzLnNlbGVjdGVkTW9udGggPSBuZXcgTW9udGgoMCwgJycsIDAsIGZhbHNlKTtcblx0fVxuXG5cdHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcblx0XHRpZiAoIXRoaXMuY3VycmVudERhdGUpIHtcblx0XHRcdHRoaXMuY3VycmVudERhdGUgPSBuZXcgRGF0ZSgpO1xuXHRcdH1cblx0XHR0aGlzLmdldE1vbnRocygpO1xuXHR9XG5cblx0cHVibGljIHNldE1vbnRoc05hbWVzKHllYXI6IG51bWJlcikge1xuXHRcdHRoaXMubW9udGhOYW1lcyA9IFtdO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPD0gMTE7IGkrKykge1xuXHRcdFx0Y29uc3QgbW9udGggPSB0aGlzLmkxOG5TZXJ2aWNlLmZvcm1hdE1vbnRoQW5kWWVhcihuZXcgRGF0ZSh5ZWFyLCBpLCAxKSk7XG5cdFx0XHR0aGlzLm1vbnRoTmFtZXMucHVzaChtb250aCk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIG9uQ2xpY2tlZChlKSB7XG5cdFx0dGhpcy5pc09wZW5lZCA9IHRydWU7XG5cdH1cblxuXHRwdWJsaWMgaGlkZVNlbGVjdG9yKCkge1xuXHRcdHRoaXMuaXNPcGVuZWQgPSBmYWxzZTtcblx0fVxuXG5cdHB1YmxpYyBnZXRNb250aHMoKSB7XG5cdFx0dGhpcy5tb250aHMgPSBbXTtcblx0XHRjb25zdCBtb250aCA9IHRoaXMuY3VycmVudERhdGUuZ2V0TW9udGgoKTtcblx0XHRjb25zdCB5ZWFyID0gdGhpcy5jdXJyZW50RGF0ZS5nZXRGdWxsWWVhcigpO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDw9IDExOyBpKyspIHtcblx0XHRcdGNvbnN0IGRhdGVTdGFydCA9IG5ldyBEYXRlKHllYXIsIGksIDEsIDAsIDAsIDAsIDApO1xuXHRcdFx0Y29uc3QgZGF0ZUVuZCA9IG5ldyBEYXRlKHllYXIsIGkgKyAxLCAwKTtcblx0XHRcdGlmICh0aGlzLmNoZWNrRGF0ZUludG9JbnRlcnZhbHMoZGF0ZVN0YXJ0KSB8fCB0aGlzLmNoZWNrRGF0ZUludG9JbnRlcnZhbHMoZGF0ZUVuZCkpIHtcblx0XHRcdFx0Y29uc3QgaXNBY3RpdmUgPSAoaSA9PT0gbW9udGgpO1xuXHRcdFx0XHRjb25zdCBtb250aE9iajogTW9udGggPSBuZXcgTW9udGgoaSwgdGhpcy5tb250aE5hbWVzW2ldLCB5ZWFyLCBpc0FjdGl2ZSk7XG5cdFx0XHRcdHRoaXMubW9udGhzLnB1c2gobW9udGhPYmopO1xuXHRcdFx0XHRpZiAoaXNBY3RpdmUpIHtcblx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkTW9udGggPSBtb250aE9iajtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBhZGRZZWFyKG51bTogbnVtYmVyKSB7XG5cdFx0Y29uc3QgZGF0ZSA9IG5ldyBEYXRlKHRoaXMuY3VycmVudERhdGUuZ2V0RnVsbFllYXIoKSArIChudW0pLCB0aGlzLmN1cnJlbnREYXRlLmdldE1vbnRoKCksIHRoaXMuY3VycmVudERhdGUuZ2V0RGF0ZSgpKTtcblx0XHRpZiAodGhpcy5jaGVja0RhdGVJbnRvSW50ZXJ2YWxzKGRhdGUpKSB7XG5cdFx0XHR0aGlzLmN1cnJlbnREYXRlID0gZGF0ZTtcblx0XHRcdHRoaXMuc2V0TW9udGhzTmFtZXModGhpcy5jdXJyZW50RGF0ZS5nZXRGdWxsWWVhcigpKTtcblx0XHRcdHRoaXMuZ2V0TW9udGhzKCk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGNoZWNrRGF0ZUludG9JbnRlcnZhbHMoZGF0ZTogRGF0ZSkge1xuXHRcdGlmICh0aGlzLm1pbkRhdGUgJiYgdGhpcy5tYXhEYXRlKSB7XG5cdFx0XHRyZXR1cm4gZGF0ZSA+PSB0aGlzLm1pbkRhdGUgJiYgZGF0ZSA8PSB0aGlzLm1heERhdGU7XG5cdFx0fSBlbHNlIGlmICh0aGlzLm1pbkRhdGUpIHtcblx0XHRcdHJldHVybiBkYXRlID49IHRoaXMubWluRGF0ZTtcblx0XHR9IGVsc2UgaWYgKHRoaXMubWF4RGF0ZSkge1xuXHRcdFx0cmV0dXJuIGRhdGUgPD0gdGhpcy5tYXhEYXRlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgb25DbGlja2VkTW9udGgobW9udGg6IE1vbnRoKSB7XG5cdFx0dGhpcy5jdXJyZW50RGF0ZSA9IG5ldyBEYXRlKG1vbnRoLnllYXIsIG1vbnRoLm1vbnRoLCAxKTtcblx0XHR0aGlzLmhpZGVTZWxlY3RvcigpO1xuXHRcdHRoaXMuZ2V0TW9udGhzKCk7XG5cdH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJkcm9wZG93biBzbGFiLWNvbWJvYm94IHNsYWItbW9udGgtc2VsZWN0b3IgZC1mbGV4IHctMTAwXCIgW25nQ2xhc3NdPVwieydkaXNhYmxlZCc6IGRpc2FibGVkfVwiPlxuICAgIDxkaXYgY2xhc3M9XCJzbGFiLWZsZXgtMSBkLWZsZXggZHJvcGRvd24tdG9nZ2xlIHNsYWItZHJvcGRvd24tdG9vZ2xlXCI+XG4gICAgICAgIDxpbnB1dCAjaW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cInNsYWItZmxleC0xIGQtZmxleCBzbGFiLWNvbWJvLWlucHV0XCIgW3JlYWRPbmx5XT1cInRydWVcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkTW9udGgudGV4dFwiXG4gICAgICAgICAgICAgICAoY2xpY2spPVwib25DbGlja2VkKCRldmVudClcIi8+XG4gICAgICAgIDxidXR0b24gI2NvbWJvYnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNsYWItY29tYm8tYnV0dG9uIHNsYWItY29tYm8tYnV0dG9uLWljb25cIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiAoY2xpY2spPVwib25DbGlja2VkKCRldmVudClcIiBbdGFiSW5kZXhdPVwiLTFcIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNPcGVuZWRcIiBjbGFzcz1cInNsYWItbW9udGgtc2VsZWN0b3ItZHJvcGRvd25cIiBbbmdDbGFzc109XCJ7J2Rpc2FibGVkJzogZGlzYWJsZWR9XCIgKG1vdXNlbGVhdmUpPVwiaGlkZVNlbGVjdG9yKClcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1zZWxlY3RvclwiPlxuICAgICAgICAgICAgPHN5c3RlbGFiLWNhbGVuZGFyLWhlYWRlciBbY3VycmVudERhdGVdPVwiY3VycmVudERhdGVcIiAocHJldmlvdXNZZWFyKT1cImFkZFllYXIoLTEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5leHRZZWFyKT1cImFkZFllYXIoMSlcIj5cbiAgICAgICAgICAgIDwvc3lzdGVsYWItY2FsZW5kYXItaGVhZGVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJveFwiPlxuICAgICAgICAgICAgPHVsPlxuICAgICAgICAgICAgICAgIEBmb3IgKG1vbnRoIG9mIG1vbnRoczsgdHJhY2sgbW9udGgubW9udGgpIHtcbiAgICAgICAgICAgICAgICAgICAgPGxpIFtjbGFzcy5hY3RpdmVdPVwibW9udGguaXNBY3RpdmVcIiAoY2xpY2spPVwib25DbGlja2VkTW9udGgobW9udGgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7e21vbnRoLnRleHR9fVxuICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=