UNPKG

design-angular-kit

Version:

Un toolkit Angular conforme alle linee guida di design per i servizi web della PA

111 lines 18.9 kB
import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; import { NotificationType } from '../../../interfaces/core'; import { Notification as BSNotification } from 'bootstrap-italia'; import { ItIconComponent } from '../../utils/icon/icon.component'; import { TranslateModule } from '@ngx-translate/core'; import { inputToBoolean } from '../../../utils/coercion'; import * as i0 from "@angular/core"; import * as i1 from "../../../services/notification/notification.service"; import * as i2 from "@ngx-translate/core"; export class ItNotificationsComponent { constructor(_changeDetectorRef, _notificationService) { this._changeDetectorRef = _changeDetectorRef; this._notificationService = _notificationService; /** * Default notifications duration (milliseconds) * @default 8000 */ this.duration = 8000; /** * Default notifications is dismissible * @default true */ this.dismissible = true; this.notificationCount = 0; this.notifications = []; this.subscription = this._notificationService.onNotification().subscribe(notification => { if (!notification.duration) { notification.duration = this.duration; // Add duration if not is set } if (!notification.position && this.position) { notification.position = this.position; // Add position if not is set } if (notification.dismissible === undefined && this.dismissible) { notification.dismissible = true; // Add dismissible if not is set } if (!notification.icon) { notification.icon = this.getNotificationIcon(notification); } const newNotification = { ...notification, id: `${notification.type}-${this.notificationCount++}-notification`, }; this.notifications.push(newNotification); this._changeDetectorRef.detectChanges(); setTimeout(() => { // Show the notification new BSNotification(document.getElementById(newNotification.id), { timeout: notification.duration, }).show(); // Clear notification after the duration setTimeout(() => { const index = this.notifications.findIndex(n => n.id === newNotification.id); if (index > -1) { this.notifications.splice(index, 1); if (!this.notifications.length) { this.notificationCount = 0; } this._changeDetectorRef.detectChanges(); } }, notification.duration); }, 200); }); } ngOnDestroy() { this.subscription.unsubscribe(); } get NotificationType() { return NotificationType; } /** * Hide the notification * @param id */ hideNotification(id) { BSNotification.getInstance(document.getElementById(id))?.hide(); } /** * Retrieve the icon name by notification type * @param notification the notification * @protected */ getNotificationIcon(notification) { switch (notification.type) { case NotificationType.Success: return 'check-circle'; case NotificationType.Error: return 'close-circle'; case NotificationType.Warning: return 'error'; case NotificationType.Info: return 'info-circle'; case NotificationType.Standard: default: return undefined; } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItNotificationsComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.ItNotificationService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.6", type: ItNotificationsComponent, isStandalone: true, selector: "it-notifications", inputs: { duration: "duration", position: "position", dismissible: ["dismissible", "dismissible", inputToBoolean] }, ngImport: i0, template: "@for (notification of notifications; track notification.id) {\n <div\n [id]=\"notification.id\"\n class=\"notification {{ notification.position }} {{ notification.type }}\"\n [class.with-icon]=\"!!notification.icon\"\n [class.dismissable]=\"notification.dismissible\"\n role=\"alert\"\n [attr.aria-labelledby]=\"notification.id + '-title'\">\n <h2 [id]=\"notification.id + '-title'\" class=\"h5\">\n @if (notification.icon) {\n <it-icon [name]=\"notification.icon\"></it-icon>\n }\n <ng-container>{{ notification.title }}</ng-container>\n </h2>\n @if (notification.message) {\n <p>{{ notification.message }}</p>\n }\n @if (notification.dismissible) {\n <button type=\"button\" class=\"btn notification-close\" (click)=\"hideNotification(notification.id)\">\n <it-icon name=\"close\"></it-icon>\n <span class=\"visually-hidden\">{{ 'it.core.close-notification' | translate: { title: notification.title } }}</span>\n </button>\n }\n </div>\n}\n", styles: [".notification{z-index:10000}\n"], dependencies: [{ kind: "component", type: ItIconComponent, selector: "it-icon", inputs: ["name", "size", "color", "padded", "svgClass", "title", "labelWaria"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItNotificationsComponent, decorators: [{ type: Component, args: [{ standalone: true, selector: 'it-notifications', changeDetection: ChangeDetectionStrategy.OnPush, imports: [ItIconComponent, TranslateModule], template: "@for (notification of notifications; track notification.id) {\n <div\n [id]=\"notification.id\"\n class=\"notification {{ notification.position }} {{ notification.type }}\"\n [class.with-icon]=\"!!notification.icon\"\n [class.dismissable]=\"notification.dismissible\"\n role=\"alert\"\n [attr.aria-labelledby]=\"notification.id + '-title'\">\n <h2 [id]=\"notification.id + '-title'\" class=\"h5\">\n @if (notification.icon) {\n <it-icon [name]=\"notification.icon\"></it-icon>\n }\n <ng-container>{{ notification.title }}</ng-container>\n </h2>\n @if (notification.message) {\n <p>{{ notification.message }}</p>\n }\n @if (notification.dismissible) {\n <button type=\"button\" class=\"btn notification-close\" (click)=\"hideNotification(notification.id)\">\n <it-icon name=\"close\"></it-icon>\n <span class=\"visually-hidden\">{{ 'it.core.close-notification' | translate: { title: notification.title } }}</span>\n </button>\n }\n </div>\n}\n", styles: [".notification{z-index:10000}\n"] }] }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.ItNotificationService }], propDecorators: { duration: [{ type: Input }], position: [{ type: Input }], dismissible: [{ type: Input, args: [{ transform: inputToBoolean }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9ucy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ24tYW5ndWxhci1raXQvc3JjL2xpYi9jb21wb25lbnRzL2NvcmUvbm90aWZpY2F0aW9ucy9ub3RpZmljYXRpb25zLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvY29yZS9ub3RpZmljYXRpb25zL25vdGlmaWNhdGlvbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFxQixTQUFTLEVBQUUsS0FBSyxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBR3hHLE9BQU8sRUFBc0MsZ0JBQWdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRyxPQUFPLEVBQUUsWUFBWSxJQUFJLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWxFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDOzs7O0FBVXpELE1BQU0sT0FBTyx3QkFBd0I7SUFzQm5DLFlBQ21CLGtCQUFxQyxFQUNyQyxvQkFBMkM7UUFEM0MsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFtQjtRQUNyQyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXVCO1FBdkI5RDs7O1dBR0c7UUFDTSxhQUFRLEdBQVcsSUFBSSxDQUFDO1FBT2pDOzs7V0FHRztRQUNtQyxnQkFBVyxHQUFZLElBQUksQ0FBQztRQUcxRCxzQkFBaUIsR0FBVyxDQUFDLENBQUM7UUFDNUIsa0JBQWEsR0FBeUMsRUFBRSxDQUFDO1FBTWpFLElBQUksQ0FBQyxZ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Y0FBYyxDQUFDO1lBQ3hCLEtBQUssZ0JBQWdCLENBQUMsS0FBSztnQkFDekIsT0FBTyxjQUFjLENBQUM7WUFDeEIsS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPO2dCQUMzQixPQUFPLE9BQU8sQ0FBQztZQUNqQixLQUFLLGdCQUFnQixDQUFDLElBQUk7Z0JBQ3hCLE9BQU8sYUFBYSxDQUFDO1lBQ3ZCLEtBQUssZ0JBQWdCLENBQUMsUUFBUSxDQUFDO1lBQy9CO2dCQUNFLE9BQU8sU0FBUyxDQUFDO1FBQ3JCLENBQUM7SUFDSCxDQUFDOzhHQXZHVSx3QkFBd0I7a0dBQXhCLHdCQUF3QixzSkFnQmYsY0FBYyw2QkNsQ3BDLHlnQ0F5QkEsd0ZEVFksZUFBZSxtSUFBRSxlQUFlOzsyRkFFL0Isd0JBQXdCO2tCQVJwQyxTQUFTO2lDQUNJLElBQUksWUFDTixrQkFBa0IsbUJBR1gsdUJBQXVCLENBQUMsTUFBTSxXQUN0QyxDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUM7MEhBT2xDLFFBQVE7c0JBQWhCLEtBQUs7Z0JBS0csUUFBUTtzQkFBaEIsS0FBSztnQkFNZ0MsV0FBVztzQkFBaEQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSW5wdXQsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJdE5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uLCBOb3RpZmljYXRpb25Qb3NpdGlvbiwgTm90aWZpY2F0aW9uVHlwZSB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvY29yZSc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb24gYXMgQlNOb3RpZmljYXRpb24gfSBmcm9tICdib290c3RyYXAtaXRhbGlhJztcbmltcG9ydCB7IEljb25OYW1lIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcy9pY29uJztcbmltcG9ydCB7IEl0SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3V0aWxzL2ljb24vaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBpbnB1dFRvQm9vbGVhbiB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2NvZXJjaW9uJztcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnaXQtbm90aWZpY2F0aW9ucycsXG4gIHRlbXBsYXRlVXJsOiAnLi9ub3RpZmljYXRpb25zLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbm90aWZpY2F0aW9ucy5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW0l0SWNvbkNvbXBvbmVudCwgVHJhbnNsYXRlTW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgSXROb3RpZmljYXRpb25zQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgLyoqXG4gICAqIERlZmF1bHQgbm90aWZpY2F0aW9ucyBkdXJhdGlvbiAobWlsbGlzZWNvbmRzKVxuICAgKiBAZGVmYXVsdCA4MDAwXG4gICAqL1xuICBASW5wdXQoKSBkdXJhdGlvbjogbnVtYmVyID0gODAwMDtcblxuICAvKipcbiAgICogRGVmYXVsdCBub3RpZmljYXRpb25zIHBvc2l0aW9uXG4gICAqL1xuICBASW5wdXQoKSBwb3NpdGlvbjogTm90aWZpY2F0aW9uUG9zaXRpb24gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgbm90aWZpY2F0aW9ucyBpcyBkaXNtaXNzaWJsZVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGlucHV0VG9Cb29sZWFuIH0pIGRpc21pc3NpYmxlOiBib29sZWFuID0gdHJ1ZTtcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIG5vdGlmaWNhdGlvbkNvdW50OiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgbm90aWZpY2F0aW9uczogQXJyYXk8Tm90aWZpY2F0aW9uICYgeyBpZDogc3RyaW5nIH0+ID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX25vdGlmaWNhdGlvblNlcnZpY2U6IEl0Tm90aWZpY2F0aW9uU2VydmljZVxuICApIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMuX25vdGlmaWNhdGlvblNlcnZpY2Uub25Ob3RpZmljYXRpb24oKS5zdWJzY3JpYmUobm90aWZpY2F0aW9uID0+IHtcbiAgICAgIGlmICghbm90aWZpY2F0aW9uLmR1cmF0aW9uKSB7XG4gICAgICAgIG5vdGlmaWNhdGlvbi5kdXJhdGlvbiA9IHRoaXMuZHVyYXRpb247IC8vIEFkZCBkdXJhdGlvbiBpZiBub3QgaXMgc2V0XG4gICAgICB9XG4gICAgICBpZiAoIW5vdGlmaWNhdGlvbi5wb3NpdGlvbiAmJiB0aGlzLnBvc2l0aW9uKSB7XG4gICAgICAgIG5vdGlmaWNhdGlvbi5wb3NpdGlvbiA9IHRoaXMucG9zaXRpb247IC8vIEFkZCBwb3NpdGlvbiBpZiBub3QgaXMgc2V0XG4gICAgICB9XG4gICAgICBpZiAobm90aWZpY2F0aW9uLmRpc21pc3NpYmxlID09PSB1bmRlZmluZWQgJiYgdGhpcy5kaXNtaXNzaWJsZSkge1xuICAgICAgICBub3RpZmljYXRpb24uZGlzbWlzc2libGUgPSB0cnVlOyAvLyBBZGQgZGlzbWlzc2libGUgaWYgbm90IGlzIHNldFxuICAgICAgfVxuICAgICAgaWYgKCFub3RpZmljYXRpb24uaWNvbikge1xuICAgICAgICBub3RpZmljYXRpb24uaWNvbiA9IHRoaXMuZ2V0Tm90aWZpY2F0aW9uSWNvbihub3RpZmljYXRpb24pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXdOb3RpZmljYXRpb24gPSB7XG4gICAgICAgIC4uLm5vdGlmaWNhdGlvbixcbiAgICAgICAgaWQ6IGAke25vdGlmaWNhdGlvbi50eXBlfS0ke3RoaXMubm90aWZpY2F0aW9uQ291bnQrK30tbm90aWZpY2F0aW9uYCxcbiAgICAgIH07XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvbnMucHVzaChuZXdOb3RpZmljYXRpb24pO1xuICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgLy8gU2hvdyB0aGUgbm90aWZpY2F0aW9uXG4gICAgICAgIG5ldyBCU05vdGlmaWNhdGlvbihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChuZXdOb3RpZmljYXRpb24uaWQpISwge1xuICAgICAgICAgIHRpbWVvdXQ6IG5vdGlmaWNhdGlvbi5kdXJhdGlvbixcbiAgICAgICAgfSkuc2hvdygpO1xuXG4gICAgICAgIC8vIENsZWFyIG5vdGlmaWNhdGlvbiBhZnRlciB0aGUgZHVyYXRpb25cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLm5vdGlmaWNhdGlvbnMuZmluZEluZGV4KG4gPT4gbi5pZCA9PT0gbmV3Tm90aWZpY2F0aW9uLmlkKTtcbiAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMubm90aWZpY2F0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25Db3VudCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBub3RpZmljYXRpb24uZHVyYXRpb24pO1xuICAgICAgfSwgMjAwKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IE5vdGlmaWNhdGlvblR5cGUoKTogdHlwZW9mIE5vdGlmaWNhdGlvblR5cGUge1xuICAgIHJldHVybiBOb3RpZmljYXRpb25UeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZGUgdGhlIG5vdGlmaWNhdGlvblxuICAgKiBAcGFyYW0gaWRcbiAgICovXG4gIHByb3RlY3RlZCBoaWRlTm90aWZpY2F0aW9uKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBCU05vdGlmaWNhdGlvbi5nZXRJbnN0YW5jZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkhKT8uaGlkZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBpY29uIG5hbWUgYnkgbm90aWZpY2F0aW9uIHR5cGVcbiAgICogQHBhcmFtIG5vdGlmaWNhdGlvbiB0aGUgbm90aWZpY2F0aW9uXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByaXZhdGUgZ2V0Tm90aWZpY2F0aW9uSWNvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IEljb25OYW1lIHwgdW5kZWZpbmVkIHtcbiAgICBzd2l0Y2ggKG5vdGlmaWNhdGlvbi50eXBlKSB7XG4gICAgICBjYXNlIE5vdGlmaWNhdGlvblR5cGUuU3VjY2VzczpcbiAgICAgICAgcmV0dXJuICdjaGVjay1jaXJjbGUnO1xuICAgICAgY2FzZSBOb3RpZmljYXRpb25UeXBlLkVycm9yOlxuICAgICAgICByZXR1cm4gJ2Nsb3NlLWNpcmNsZSc7XG4gICAgICBjYXNlIE5vdGlmaWNhdGlvblR5cGUuV2FybmluZzpcbiAgICAgICAgcmV0dXJuICdlcnJvcic7XG4gICAgICBjYXNlIE5vdGlmaWNhdGlvblR5cGUuSW5mbzpcbiAgICAgICAgcmV0dXJuICdpbmZvLWNpcmNsZSc7XG4gICAgICBjYXNlIE5vdGlmaWNhdGlvblR5cGUuU3RhbmRhcmQ6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuIiwiQGZvciAobm90aWZpY2F0aW9uIG9mIG5vdGlmaWNhdGlvbnM7IHRyYWNrIG5vdGlmaWNhdGlvbi5pZCkge1xuICA8ZGl2XG4gICAgW2lkXT1cIm5vdGlmaWNhdGlvbi5pZFwiXG4gICAgY2xhc3M9XCJub3RpZmljYXRpb24ge3sgbm90aWZpY2F0aW9uLnBvc2l0aW9uIH19IHt7IG5vdGlmaWNhdGlvbi50eXBlIH19XCJcbiAgICBbY2xhc3Mud2l0aC1pY29uXT1cIiEhbm90aWZpY2F0aW9uLmljb25cIlxuICAgIFtjbGFzcy5kaXNtaXNzYWJsZV09XCJub3RpZmljYXRpb24uZGlzbWlzc2libGVcIlxuICAgIHJvbGU9XCJhbGVydFwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIm5vdGlmaWNhdGlvbi5pZCArICctdGl0bGUnXCI+XG4gICAgPGgyIFtpZF09XCJub3RpZmljYXRpb24uaWQgKyAnLXRpdGxlJ1wiIGNsYXNzPVwiaDVcIj5cbiAgICAgIEBpZiAobm90aWZpY2F0aW9uLmljb24pIHtcbiAgICAgICAgPGl0LWljb24gW25hbWVdPVwibm90aWZpY2F0aW9uLmljb25cIj48L2l0LWljb24+XG4gICAgICB9XG4gICAgICA8bmctY29udGFpbmVyPnt7IG5vdGlmaWNhdGlvbi50aXRsZSB9fTwvbmctY29udGFpbmVyPlxuICAgIDwvaDI+XG4gICAgQGlmIChub3RpZmljYXRpb24ubWVzc2FnZSkge1xuICAgICAgPHA+e3sgbm90aWZpY2F0aW9uLm1lc3NhZ2UgfX08L3A+XG4gICAgfVxuICAgIEBpZiAobm90aWZpY2F0aW9uLmRpc21pc3NpYmxlKSB7XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBub3RpZmljYXRpb24tY2xvc2VcIiAoY2xpY2spPVwiaGlkZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb24uaWQpXCI+XG4gICAgICAgIDxpdC1pY29uIG5hbWU9XCJjbG9zZVwiPjwvaXQtaWNvbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIj57eyAnaXQuY29yZS5jbG9zZS1ub3RpZmljYXRpb24nIHwgdHJhbnNsYXRlOiB7IHRpdGxlOiBub3RpZmljYXRpb24udGl0bGUgfSB9fTwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIH1cbiAgPC9kaXY+XG59XG4iXX0=