@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
53 lines • 14.6 kB
JavaScript
import { NgIf } from '@angular/common';
import { Component, ElementRef, Optional, ViewChild } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { CellRendererContext, Permissions, C8yTranslatePipe, IconDirective } from '@c8y/ngx-components';
import { TranslationEditorComponent } from '../translation-editor/translation-editor.component';
import * as i0 from "@angular/core";
import * as i1 from "@c8y/ngx-components";
import * as i2 from "../translation-editor/translation-editor.component";
import * as i3 from "@angular/forms";
export class ManageTranslationCellRendererComponent {
constructor(context, permissions, grid) {
this.context = context;
this.permissions = permissions;
this.grid = grid;
this.FOCUS_RENDER_WAIT_TIME_IN_MS = 100;
this.isCellEditable = false;
this.cellValue = '';
this.isCreateDisabled = false;
}
ngOnInit() {
this.isCreateDisabled = !this.permissions.hasRole('ROLE_APPLICATION_MANAGEMENT_ADMIN');
}
async save() {
this.isCellEditable = false;
const cellValueTrimed = this.cellValue.trim();
this.context.value = cellValueTrimed;
this.context.item[this.context.property.path] = cellValueTrimed;
this.grid?.valueChanged();
}
cancel() {
this.isCellEditable = false;
}
editCell() {
this.cellValue = this.context.value;
this.isCellEditable = true;
// Focuses the input box after the input text box is visible
setTimeout(() => {
this.cellInput.nativeElement.focus();
}, this.FOCUS_RENDER_WAIT_TIME_IN_MS);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ManageTranslationCellRendererComponent, deps: [{ token: i1.CellRendererContext }, { token: i1.Permissions }, { token: i2.TranslationEditorComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ManageTranslationCellRendererComponent, isStandalone: true, selector: "c8y-manage-translation-cell-renderer", viewQueries: [{ propertyName: "cellInput", first: true, predicate: ["cellInput"], descendants: true }], ngImport: i0, template: "<div\n class=\"text-truncate pointer d-flex\"\n title=\"{{ context.value }}\"\n data-cy=\"c8y-manage-translation-cell-renderer--edit\"\n (click)=\"!isCreateDisabled ? editCell() : ''\"\n *ngIf=\"!isCellEditable\"\n>\n <span\n class=\"text-truncate\"\n *ngIf=\"!isCellEditable && context.value !== ''\"\n >\n {{ context.value }}\n </span>\n <span\n class=\"text-truncate\"\n title=\"{{ 'Add translation' | translate }}\"\n *ngIf=\"!isCellEditable && context.value === ''\"\n >\n <em class=\"text-muted\">{{ 'Add translation' | translate }}</em>\n </span>\n <i\n class=\"showOnHover text-primary m-l-4\"\n c8yIcon=\"pencil\"\n title=\"{{ 'Edit translation' | translate }}\"\n *ngIf=\"!isCreateDisabled\"\n ></i>\n</div>\n\n<div\n class=\"input-group input-group-sm\"\n *ngIf=\"isCellEditable && !isCreateDisabled\"\n>\n <input\n class=\"form-control\"\n placeholder=\"{{ 'Add translation' | translate }}\"\n type=\"text\"\n #cellInput\n data-cy=\"c8y-manage-translation-cell-renderer--input\"\n [(ngModel)]=\"cellValue\"\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-clean\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n data-cy=\"c8y-manage-translation-cell-renderer--cancel\"\n >\n <i\n class=\"text-danger\"\n c8yIcon=\"times\"\n ></i>\n </button>\n <button\n class=\"btn btn-clean\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n (click)=\"save()\"\n data-cy=\"c8y-manage-translation-cell-renderer--save\"\n >\n <i\n class=\"text-primary\"\n c8yIcon=\"check\"\n ></i>\n </button>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "ngmodule", type: FormsModule }, { 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"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ManageTranslationCellRendererComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-manage-translation-cell-renderer', standalone: true, imports: [NgIf, C8yTranslatePipe, IconDirective, FormsModule], template: "<div\n class=\"text-truncate pointer d-flex\"\n title=\"{{ context.value }}\"\n data-cy=\"c8y-manage-translation-cell-renderer--edit\"\n (click)=\"!isCreateDisabled ? editCell() : ''\"\n *ngIf=\"!isCellEditable\"\n>\n <span\n class=\"text-truncate\"\n *ngIf=\"!isCellEditable && context.value !== ''\"\n >\n {{ context.value }}\n </span>\n <span\n class=\"text-truncate\"\n title=\"{{ 'Add translation' | translate }}\"\n *ngIf=\"!isCellEditable && context.value === ''\"\n >\n <em class=\"text-muted\">{{ 'Add translation' | translate }}</em>\n </span>\n <i\n class=\"showOnHover text-primary m-l-4\"\n c8yIcon=\"pencil\"\n title=\"{{ 'Edit translation' | translate }}\"\n *ngIf=\"!isCreateDisabled\"\n ></i>\n</div>\n\n<div\n class=\"input-group input-group-sm\"\n *ngIf=\"isCellEditable && !isCreateDisabled\"\n>\n <input\n class=\"form-control\"\n placeholder=\"{{ 'Add translation' | translate }}\"\n type=\"text\"\n #cellInput\n data-cy=\"c8y-manage-translation-cell-renderer--input\"\n [(ngModel)]=\"cellValue\"\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-clean\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n data-cy=\"c8y-manage-translation-cell-renderer--cancel\"\n >\n <i\n class=\"text-danger\"\n c8yIcon=\"times\"\n ></i>\n </button>\n <button\n class=\"btn btn-clean\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n (click)=\"save()\"\n data-cy=\"c8y-manage-translation-cell-renderer--save\"\n >\n <i\n class=\"text-primary\"\n c8yIcon=\"check\"\n ></i>\n </button>\n </div>\n</div>\n" }]
}], ctorParameters: () => [{ type: i1.CellRendererContext }, { type: i1.Permissions }, { type: i2.TranslationEditorComponent, decorators: [{
type: Optional
}] }], propDecorators: { cellInput: [{
type: ViewChild,
args: ['cellInput']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlLXRyYW5zbGF0aW9uLWNlbGwtcmVuZGVyZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdHJhbnNsYXRpb24tZWRpdG9yL2xhenkvbWFuYWdlLXRyYW5zbGF0aW9uLWNlbGwtcmVuZGVyZXIvbWFuYWdlLXRyYW5zbGF0aW9uLWNlbGwtcmVuZGVyZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vdHJhbnNsYXRpb24tZWRpdG9yL2xhenkvbWFuYWdlLXRyYW5zbGF0aW9uLWNlbGwtcmVuZGVyZXIvbWFuYWdlLXRyYW5zbGF0aW9uLWNlbGwtcmVuZGVyZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0UsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixhQUFhLEVBQ2QsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQzs7Ozs7QUFRaEcsTUFBTSxPQUFPLHNDQUFzQztJQU9qRCxZQUNTLE9BQTRCLEVBQzNCLFdBQXdCLEVBQ1osSUFBZ0M7UUFGN0MsWUFBTyxHQUFQLE9BQU8sQ0FBcUI7UUFDM0IsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDWixTQUFJLEdBQUosSUFBSSxDQUE0QjtRQVRyQyxpQ0FBNEIsR0FBRyxHQUFHLENBQUM7UUFDcEQsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFDdkIsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUVmLHFCQUFnQixHQUFHLEtBQUssQ0FBQztJQU10QixDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJO1FBQ1IsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDNUIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM5QyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxlQUFlLENBQUM7UUFDckMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsZUFBZSxDQUFDO1FBQ2hFLElBQUksQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUM5QixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDcEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFFM0IsNERBQTREO1FBQzVELFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN2QyxDQUFDLEVBQUUsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDeEMsQ0FBQzsrR0FyQ1Usc0NBQXNDO21HQUF0QyxzQ0FBc0Msd01DakJuRCwydERBbUVBLDRDRHBEWSxJQUFJLHdGQUFFLGdCQUFnQixrREFBRSxhQUFhLDBFQUFFLFdBQVc7OzRGQUVqRCxzQ0FBc0M7a0JBTmxELFNBQVM7K0JBQ0Usc0NBQXNDLGNBRXBDLElBQUksV0FDUCxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDOzswQkFZMUQsUUFBUTt5Q0FOYSxTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgT3B0aW9uYWwsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBDZWxsUmVuZGVyZXJDb250ZXh0LFxuICBQZXJtaXNzaW9ucyxcbiAgQzh5VHJhbnNsYXRlUGlwZSxcbiAgSWNvbkRpcmVjdGl2ZVxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IFRyYW5zbGF0aW9uRWRpdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vdHJhbnNsYXRpb24tZWRpdG9yL3RyYW5zbGF0aW9uLWVkaXRvci5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktbWFuYWdlLXRyYW5zbGF0aW9uLWNlbGwtcmVuZGVyZXInLFxuICB0ZW1wbGF0ZVVybDogJ21hbmFnZS10cmFuc2xhdGlvbi1jZWxsLXJlbmRlcmVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW05nSWYsIEM4eVRyYW5zbGF0ZVBpcGUsIEljb25EaXJlY3RpdmUsIEZvcm1zTW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBNYW5hZ2VUcmFuc2xhdGlvbkNlbGxSZW5kZXJlckNvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgRk9DVVNfUkVOREVSX1dBSVRfVElNRV9JTl9NUyA9IDEwMDtcbiAgaXNDZWxsRWRpdGFibGUgPSBmYWxzZTtcbiAgY2VsbFZhbHVlID0gJyc7XG4gIEBWaWV3Q2hpbGQoJ2NlbGxJbnB1dCcpIGNlbGxJbnB1dDogRWxlbWVudFJlZjtcbiAgaXNDcmVhdGVEaXNhYmxlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBjb250ZXh0OiBDZWxsUmVuZGVyZXJDb250ZXh0LFxuICAgIHByaXZhdGUgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25zLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZ3JpZDogVHJhbnNsYXRpb25FZGl0b3JDb21wb25lbnRcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaXNDcmVhdGVEaXNhYmxlZCA9ICF0aGlzLnBlcm1pc3Npb25zLmhhc1JvbGUoJ1JPTEVfQVBQTElDQVRJT05fTUFOQUdFTUVOVF9BRE1JTicpO1xuICB9XG5cbiAgYXN5bmMgc2F2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmlzQ2VsbEVkaXRhYmxlID0gZmFsc2U7XG4gICAgY29uc3QgY2VsbFZhbHVlVHJpbWVkID0gdGhpcy5jZWxsVmFsdWUudHJpbSgpO1xuICAgIHRoaXMuY29udGV4dC52YWx1ZSA9IGNlbGxWYWx1ZVRyaW1lZDtcbiAgICB0aGlzLmNvbnRleHQuaXRlbVt0aGlzLmNvbnRleHQucHJvcGVydHkucGF0aF0gPSBjZWxsVmFsdWVUcmltZWQ7XG4gICAgdGhpcy5ncmlkPy52YWx1ZUNoYW5nZWQoKTtcbiAgfVxuXG4gIGNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzQ2VsbEVkaXRhYmxlID0gZmFsc2U7XG4gIH1cblxuICBlZGl0Q2VsbCgpOiB2b2lkIHtcbiAgICB0aGlzLmNlbGxWYWx1ZSA9IHRoaXMuY29udGV4dC52YWx1ZTtcbiAgICB0aGlzLmlzQ2VsbEVkaXRhYmxlID0gdHJ1ZTtcblxuICAgIC8vIEZvY3VzZXMgdGhlIGlucHV0IGJveCBhZnRlciB0aGUgaW5wdXQgdGV4dCBib3ggaXMgdmlzaWJsZVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jZWxsSW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH0sIHRoaXMuRk9DVVNfUkVOREVSX1dBSVRfVElNRV9JTl9NUyk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlIHBvaW50ZXIgZC1mbGV4XCJcbiAgdGl0bGU9XCJ7eyBjb250ZXh0LnZhbHVlIH19XCJcbiAgZGF0YS1jeT1cImM4eS1tYW5hZ2UtdHJhbnNsYXRpb24tY2VsbC1yZW5kZXJlci0tZWRpdFwiXG4gIChjbGljayk9XCIhaXNDcmVhdGVEaXNhYmxlZCA/IGVkaXRDZWxsKCkgOiAnJ1wiXG4gICpuZ0lmPVwiIWlzQ2VsbEVkaXRhYmxlXCJcbj5cbiAgPHNwYW5cbiAgICBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIlxuICAgICpuZ0lmPVwiIWlzQ2VsbEVkaXRhYmxlICYmIGNvbnRleHQudmFsdWUgIT09ICcnXCJcbiAgPlxuICAgIHt7IGNvbnRleHQudmFsdWUgfX1cbiAgPC9zcGFuPlxuICA8c3BhblxuICAgIGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiXG4gICAgdGl0bGU9XCJ7eyAnQWRkIHRyYW5zbGF0aW9uJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgKm5nSWY9XCIhaXNDZWxsRWRpdGFibGUgJiYgY29udGV4dC52YWx1ZSA9PT0gJydcIlxuICA+XG4gICAgPGVtIGNsYXNzPVwidGV4dC1tdXRlZFwiPnt7ICdBZGQgdHJhbnNsYXRpb24nIHwgdHJhbnNsYXRlIH19PC9lbT5cbiAgPC9zcGFuPlxuICA8aVxuICAgIGNsYXNzPVwic2hvd09uSG92ZXIgdGV4dC1wcmltYXJ5IG0tbC00XCJcbiAgICBjOHlJY29uPVwicGVuY2lsXCJcbiAgICB0aXRsZT1cInt7ICdFZGl0IHRyYW5zbGF0aW9uJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgKm5nSWY9XCIhaXNDcmVhdGVEaXNhYmxlZFwiXG4gID48L2k+XG48L2Rpdj5cblxuPGRpdlxuICBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLXNtXCJcbiAgKm5nSWY9XCJpc0NlbGxFZGl0YWJsZSAmJiAhaXNDcmVhdGVEaXNhYmxlZFwiXG4+XG4gIDxpbnB1dFxuICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICBwbGFjZWhvbGRlcj1cInt7ICdBZGQgdHJhbnNsYXRpb24nIHwgdHJhbnNsYXRlIH19XCJcbiAgICB0eXBlPVwidGV4dFwiXG4gICAgI2NlbGxJbnB1dFxuICAgIGRhdGEtY3k9XCJjOHktbWFuYWdlLXRyYW5zbGF0aW9uLWNlbGwtcmVuZGVyZXItLWlucHV0XCJcbiAgICBbKG5nTW9kZWwpXT1cImNlbGxWYWx1ZVwiXG4gIC8+XG4gIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1idG5cIj5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cImJ0biBidG4tY2xlYW5cIlxuICAgICAgdGl0bGU9XCJ7eyAnQ2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIChjbGljayk9XCJjYW5jZWwoKVwiXG4gICAgICBkYXRhLWN5PVwiYzh5LW1hbmFnZS10cmFuc2xhdGlvbi1jZWxsLXJlbmRlcmVyLS1jYW5jZWxcIlxuICAgID5cbiAgICAgIDxpXG4gICAgICAgIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxuICAgICAgICBjOHlJY29uPVwidGltZXNcIlxuICAgICAgPjwvaT5cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cImJ0biBidG4tY2xlYW5cIlxuICAgICAgdGl0bGU9XCJ7eyAnU2F2ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAoY2xpY2spPVwic2F2ZSgpXCJcbiAgICAgIGRhdGEtY3k9XCJjOHktbWFuYWdlLXRyYW5zbGF0aW9uLWNlbGwtcmVuZGVyZXItLXNhdmVcIlxuICAgID5cbiAgICAgIDxpXG4gICAgICAgIGNsYXNzPVwidGV4dC1wcmltYXJ5XCJcbiAgICAgICAgYzh5SWNvbj1cImNoZWNrXCJcbiAgICAgID48L2k+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=