@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
38 lines • 15.4 kB
JavaScript
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input } from '@angular/core';
import { DismissAlertStrategy } from './dynamic-component-alert.model';
import { DynamicComponentAlertAggregator } from './dynamic-component-alert-aggregator';
import { AlertOutletBase, AlertService } from '../alert';
import { takeUntil } from 'rxjs/operators';
import { Subject } from 'rxjs';
import * as i0 from "@angular/core";
import * as i1 from "../alert";
import * as i2 from "../common/icon.directive";
import * as i3 from "@angular/common";
import * as i4 from "../i18n/c8y-translate.pipe";
export class DynamicComponentAlertsComponent extends AlertOutletBase {
constructor(alertService, ref) {
super(alertService);
this.alertService = alertService;
this.ref = ref;
this.dismissAlertStrategy = DismissAlertStrategy;
this.destroy$ = new Subject();
}
ngOnInit() {
this.alerts.anyAlertExists$.pipe(takeUntil(this.destroy$)).subscribe(() => {
this.ref.markForCheck();
});
}
ngOnDestroy() {
this.destroy$.next();
this.destroy$.complete();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DynamicComponentAlertsComponent, deps: [{ token: i1.AlertService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DynamicComponentAlertsComponent, selector: "c8y-dynamic-component-alerts", inputs: { alerts: "alerts" }, usesInheritance: true, ngImport: i0, template: "<ng-container *ngFor=\"let alertGroup of alerts.alertGroups\">\n <div\n *ngIf=\"alertGroup?.value?.alerts?.length\"\n class=\"alert\"\n role=\"alert\"\n [ngClass]=\"'alert-' + alertGroup.type\"\n >\n <button\n class=\"close\"\n type=\"button\"\n *ngIf=\"\n alertGroup.value.alertDismissal.dismissStrategy === dismissAlertStrategy.TEMPORARY ||\n alertGroup.value.alertDismissal.dismissStrategy ===\n dismissAlertStrategy.TEMPORARY_OR_PERMANENT\n \"\n (click)=\"alerts.dismissAlertGroup(alertGroup.type, dismissPermanently.checked)\"\n >\n <span aria-hidden=\"true\">\u00D7</span>\n <span class=\"sr-only\">Close</span>\n </button>\n <div *ngFor=\"let alertItem of alertGroup.value.alerts; let i = index\" class=\"m-t-8\">\n <ng-container *ngIf=\"!isTemplateRef(alertItem.text); else template(alertItem.text)\">\n <p\n *ngIf=\"!alertItem.allowHtml\"\n [textContent]=\"alertItem.text | translate\"\n class=\"message\"\n ></p>\n <p *ngIf=\"alertItem.allowHtml\" [innerHTML]=\"alertItem.text | translate\" class=\"message\"></p>\n </ng-container>\n\n <p *ngIf=\"hasDetails(alertItem) && !isDetailsShow(alertItem)\" class=\"text-muted m-t-8\">\n <button\n title=\"{{ 'Show details' | translate }}\"\n class=\"btn btn-clean\"\n (click)=\"showDetails(alertItem)\"\n >\n <i c8yIcon=\"chevron-down\"></i>\n {{ 'Show details' | translate }}\n </button>\n </p>\n <p *ngIf=\"hasDetails(alertItem) && isDetailsShow(alertItem)\" class=\"text-muted m-t-8\">\n <button\n title=\"{{ 'Hide details' | translate }}\"\n class=\"btn btn-clean\"\n (click)=\"closeDetails()\"\n >\n <i c8yIcon=\"chevron-up\"></i>\n {{ 'Hide details' | translate }}\n </button>\n </p>\n <div *ngIf=\"isDetailsShow(alertItem)\">\n <div\n *ngIf=\"\n !isTemplateRef(detailDisplayedAlert.contents);\n else template(alertItem.detailedData)\n \"\n >\n <pre><code [textContent]=\"detailDisplayedAlert.contents | translate\"></code></pre>\n </div>\n </div>\n <hr *ngIf=\"i !== alertGroup.value.alerts.length - 1\" />\n </div>\n\n <label\n title=\"{{ 'Don\\'t show again' | translate }}\"\n class=\"c8y-checkbox m-t-16\"\n [class.hidden]=\"\n alertGroup.value.alertDismissal.dismissStrategy !==\n dismissAlertStrategy.TEMPORARY_OR_PERMANENT\n \"\n >\n <input type=\"checkbox\" #dismissPermanently />\n <span></span>\n <span>{{ \"Don't show again\" | translate }}</span>\n </label>\n </div>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i4.C8yTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DynamicComponentAlertsComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-dynamic-component-alerts', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngFor=\"let alertGroup of alerts.alertGroups\">\n <div\n *ngIf=\"alertGroup?.value?.alerts?.length\"\n class=\"alert\"\n role=\"alert\"\n [ngClass]=\"'alert-' + alertGroup.type\"\n >\n <button\n class=\"close\"\n type=\"button\"\n *ngIf=\"\n alertGroup.value.alertDismissal.dismissStrategy === dismissAlertStrategy.TEMPORARY ||\n alertGroup.value.alertDismissal.dismissStrategy ===\n dismissAlertStrategy.TEMPORARY_OR_PERMANENT\n \"\n (click)=\"alerts.dismissAlertGroup(alertGroup.type, dismissPermanently.checked)\"\n >\n <span aria-hidden=\"true\">\u00D7</span>\n <span class=\"sr-only\">Close</span>\n </button>\n <div *ngFor=\"let alertItem of alertGroup.value.alerts; let i = index\" class=\"m-t-8\">\n <ng-container *ngIf=\"!isTemplateRef(alertItem.text); else template(alertItem.text)\">\n <p\n *ngIf=\"!alertItem.allowHtml\"\n [textContent]=\"alertItem.text | translate\"\n class=\"message\"\n ></p>\n <p *ngIf=\"alertItem.allowHtml\" [innerHTML]=\"alertItem.text | translate\" class=\"message\"></p>\n </ng-container>\n\n <p *ngIf=\"hasDetails(alertItem) && !isDetailsShow(alertItem)\" class=\"text-muted m-t-8\">\n <button\n title=\"{{ 'Show details' | translate }}\"\n class=\"btn btn-clean\"\n (click)=\"showDetails(alertItem)\"\n >\n <i c8yIcon=\"chevron-down\"></i>\n {{ 'Show details' | translate }}\n </button>\n </p>\n <p *ngIf=\"hasDetails(alertItem) && isDetailsShow(alertItem)\" class=\"text-muted m-t-8\">\n <button\n title=\"{{ 'Hide details' | translate }}\"\n class=\"btn btn-clean\"\n (click)=\"closeDetails()\"\n >\n <i c8yIcon=\"chevron-up\"></i>\n {{ 'Hide details' | translate }}\n </button>\n </p>\n <div *ngIf=\"isDetailsShow(alertItem)\">\n <div\n *ngIf=\"\n !isTemplateRef(detailDisplayedAlert.contents);\n else template(alertItem.detailedData)\n \"\n >\n <pre><code [textContent]=\"detailDisplayedAlert.contents | translate\"></code></pre>\n </div>\n </div>\n <hr *ngIf=\"i !== alertGroup.value.alerts.length - 1\" />\n </div>\n\n <label\n title=\"{{ 'Don\\'t show again' | translate }}\"\n class=\"c8y-checkbox m-t-16\"\n [class.hidden]=\"\n alertGroup.value.alertDismissal.dismissStrategy !==\n dismissAlertStrategy.TEMPORARY_OR_PERMANENT\n \"\n >\n <input type=\"checkbox\" #dismissPermanently />\n <span></span>\n <span>{{ \"Don't show again\" | translate }}</span>\n </label>\n </div>\n</ng-container>\n" }]
}], ctorParameters: () => [{ type: i1.AlertService }, { type: i0.ChangeDetectorRef }], propDecorators: { alerts: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1jb21wb25lbnQtYWxlcnRzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvZHluYW1pYy1jb21wb25lbnQvZHluYW1pYy1jb21wb25lbnQtYWxlcnRzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL2NvcmUvZHluYW1pYy1jb21wb25lbnQvZHluYW1pYy1jb21wb25lbnQtYWxlcnRzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxLQUFLLEVBR04sTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDdkUsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDdkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7OztBQU8vQixNQUFNLE9BQU8sK0JBQWdDLFNBQVEsZUFBZTtJQU1sRSxZQUFtQixZQUEwQixFQUFVLEdBQXNCO1FBQzNFLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQURILGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFMN0UseUJBQW9CLEdBQWdDLG9CQUFvQixDQUFDO1FBQ2pFLGFBQVEsR0FBa0IsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQU10RCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUN4RSxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0IsQ0FBQzsrR0FuQlUsK0JBQStCO21HQUEvQiwrQkFBK0IseUhDbkI1QyxndkZBNkVBOzs0RkQxRGEsK0JBQStCO2tCQUwzQyxTQUFTOytCQUNFLDhCQUE4QixtQkFFdkIsdUJBQXVCLENBQUMsTUFBTTtpSEFNdEMsTUFBTTtzQkFBZCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERpc21pc3NBbGVydFN0cmF0ZWd5IH0gZnJvbSAnLi9keW5hbWljLWNvbXBvbmVudC1hbGVydC5tb2RlbCc7XG5pbXBvcnQgeyBEeW5hbWljQ29tcG9uZW50QWxlcnRBZ2dyZWdhdG9yIH0gZnJvbSAnLi9keW5hbWljLWNvbXBvbmVudC1hbGVydC1hZ2dyZWdhdG9yJztcbmltcG9ydCB7IEFsZXJ0T3V0bGV0QmFzZSwgQWxlcnRTZXJ2aWNlIH0gZnJvbSAnLi4vYWxlcnQnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktZHluYW1pYy1jb21wb25lbnQtYWxlcnRzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2R5bmFtaWMtY29tcG9uZW50LWFsZXJ0cy5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIER5bmFtaWNDb21wb25lbnRBbGVydHNDb21wb25lbnQgZXh0ZW5kcyBBbGVydE91dGxldEJhc2UgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIGRpc21pc3NBbGVydFN0cmF0ZWd5OiB0eXBlb2YgRGlzbWlzc0FsZXJ0U3RyYXRlZ3kgPSBEaXNtaXNzQWxlcnRTdHJhdGVneTtcbiAgcHJpdmF0ZSBkZXN0cm95JDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgQElucHV0KCkgYWxlcnRzOiBEeW5hbWljQ29tcG9uZW50QWxlcnRBZ2dyZWdhdG9yO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSwgcHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgc3VwZXIoYWxlcnRTZXJ2aWNlKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuYWxlcnRzLmFueUFsZXJ0RXhpc3RzJC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhbGVydEdyb3VwIG9mIGFsZXJ0cy5hbGVydEdyb3Vwc1wiPlxuICA8ZGl2XG4gICAgKm5nSWY9XCJhbGVydEdyb3VwPy52YWx1ZT8uYWxlcnRzPy5sZW5ndGhcIlxuICAgIGNsYXNzPVwiYWxlcnRcIlxuICAgIHJvbGU9XCJhbGVydFwiXG4gICAgW25nQ2xhc3NdPVwiJ2FsZXJ0LScgKyBhbGVydEdyb3VwLnR5cGVcIlxuICA+XG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJjbG9zZVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICpuZ0lmPVwiXG4gICAgICAgIGFsZXJ0R3JvdXAudmFsdWUuYWxlcnREaXNtaXNzYWwuZGlzbWlzc1N0cmF0ZWd5ID09PSBkaXNtaXNzQWxlcnRTdHJhdGVneS5URU1QT1JBUlkgfHxcbiAgICAgICAgYWxlcnRHcm91cC52YWx1ZS5hbGVydERpc21pc3NhbC5kaXNtaXNzU3RyYXRlZ3kgPT09XG4gICAgICAgICAgZGlzbWlzc0FsZXJ0U3RyYXRlZ3kuVEVNUE9SQVJZX09SX1BFUk1BTkVOVFxuICAgICAgXCJcbiAgICAgIChjbGljayk9XCJhbGVydHMuZGlzbWlzc0FsZXJ0R3JvdXAoYWxlcnRHcm91cC50eXBlLCBkaXNtaXNzUGVybWFuZW50bHkuY2hlY2tlZClcIlxuICAgID5cbiAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPsOXPC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+Q2xvc2U8L3NwYW4+XG4gICAgPC9idXR0b24+XG4gICAgPGRpdiAqbmdGb3I9XCJsZXQgYWxlcnRJdGVtIG9mIGFsZXJ0R3JvdXAudmFsdWUuYWxlcnRzOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJtLXQtOFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1RlbXBsYXRlUmVmKGFsZXJ0SXRlbS50ZXh0KTsgZWxzZSB0ZW1wbGF0ZShhbGVydEl0ZW0udGV4dClcIj5cbiAgICAgICAgPHBcbiAgICAgICAgICAqbmdJZj1cIiFhbGVydEl0ZW0uYWxsb3dIdG1sXCJcbiAgICAgICAgICBbdGV4dENvbnRlbnRdPVwiYWxlcnRJdGVtLnRleHQgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIGNsYXNzPVwibWVzc2FnZVwiXG4gICAgICAgID48L3A+XG4gICAgICAgIDxwICpuZ0lmPVwiYWxlcnRJdGVtLmFsbG93SHRtbFwiIFtpbm5lckhUTUxdPVwiYWxlcnRJdGVtLnRleHQgfCB0cmFuc2xhdGVcIiBjbGFzcz1cIm1lc3NhZ2VcIj48L3A+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPHAgKm5nSWY9XCJoYXNEZXRhaWxzKGFsZXJ0SXRlbSkgJiYgIWlzRGV0YWlsc1Nob3coYWxlcnRJdGVtKVwiIGNsYXNzPVwidGV4dC1tdXRlZCBtLXQtOFwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdGl0bGU9XCJ7eyAnU2hvdyBkZXRhaWxzJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWNsZWFuXCJcbiAgICAgICAgICAoY2xpY2spPVwic2hvd0RldGFpbHMoYWxlcnRJdGVtKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8aSBjOHlJY29uPVwiY2hldnJvbi1kb3duXCI+PC9pPlxuICAgICAgICAgIHt7ICdTaG93IGRldGFpbHMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9wPlxuICAgICAgPHAgKm5nSWY9XCJoYXNEZXRhaWxzKGFsZXJ0SXRlbSkgJiYgaXNEZXRhaWxzU2hvdyhhbGVydEl0ZW0pXCIgY2xhc3M9XCJ0ZXh0LW11dGVkIG0tdC04XCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0aXRsZT1cInt7ICdIaWRlIGRldGFpbHMnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICBjbGFzcz1cImJ0biBidG4tY2xlYW5cIlxuICAgICAgICAgIChjbGljayk9XCJjbG9zZURldGFpbHMoKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8aSBjOHlJY29uPVwiY2hldnJvbi11cFwiPjwvaT5cbiAgICAgICAgICB7eyAnSGlkZSBkZXRhaWxzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvcD5cbiAgICAgIDxkaXYgKm5nSWY9XCJpc0RldGFpbHNTaG93KGFsZXJ0SXRlbSlcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAhaXNUZW1wbGF0ZVJlZihkZXRhaWxEaXNwbGF5ZWRBbGVydC5jb250ZW50cyk7XG4gICAgICAgICAgICBlbHNlIHRlbXBsYXRlKGFsZXJ0SXRlbS5kZXRhaWxlZERhdGEpXG4gICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxwcmU+PGNvZGUgW3RleHRDb250ZW50XT1cImRldGFpbERpc3BsYXllZEFsZXJ0LmNvbnRlbnRzIHwgdHJhbnNsYXRlXCI+PC9jb2RlPjwvcHJlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGhyICpuZ0lmPVwiaSAhPT0gYWxlcnRHcm91cC52YWx1ZS5hbGVydHMubGVuZ3RoIC0gMVwiIC8+XG4gICAgPC9kaXY+XG5cbiAgICA8bGFiZWxcbiAgICAgIHRpdGxlPVwie3sgJ0RvblxcJ3Qgc2hvdyBhZ2FpbicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgY2xhc3M9XCJjOHktY2hlY2tib3ggbS10LTE2XCJcbiAgICAgIFtjbGFzcy5oaWRkZW5dPVwiXG4gICAgICAgIGFsZXJ0R3JvdXAudmFsdWUuYWxlcnREaXNtaXNzYWwuZGlzbWlzc1N0cmF0ZWd5ICE9PVxuICAgICAgICBkaXNtaXNzQWxlcnRTdHJhdGVneS5URU1QT1JBUllfT1JfUEVSTUFORU5UXG4gICAgICBcIlxuICAgID5cbiAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiAjZGlzbWlzc1Blcm1hbmVudGx5IC8+XG4gICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICA8c3Bhbj57eyBcIkRvbid0IHNob3cgYWdhaW5cIiB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICA8L2xhYmVsPlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuIl19