UNPKG

ngx-auth-firebaseui-updated

Version:

From ngx-auth-firbaseui but updated to fix dependency issues with Angular 16. Open Source Library for Angular Web Apps to integrate a material user interface for firebase authentication

94 lines 20.4 kB
import { Component, EventEmitter, Input, Output } from "@angular/core"; import { take } from 'rxjs/operators'; import { UserComponent } from ".."; import * as i0 from "@angular/core"; import * as i1 from "@angular/fire/compat/auth"; import * as i2 from "@angular/material/dialog"; import * as i3 from "../../services/auth-process.service"; import * as i4 from "@angular/common"; import * as i5 from "@angular/material/card"; import * as i6 from "@angular/material/button"; import * as i7 from "@angular/material/icon"; import * as i8 from "@angular/material/tooltip"; import * as i9 from "@angular/material/menu"; export class NgxAuthFirebaseuiAvatarComponent { constructor(afa, dialog, authProcess) { this.afa = afa; this.dialog = dialog; this.authProcess = authProcess; this.layout = "default"; this.canLogout = true; this.canViewAccount = true; this.canDeleteAccount = true; this.canEditAccount = true; this.textProfile = "Profile"; this.textSignOut = "Sign Out"; // eslint-disable-next-line @angular-eslint/no-output-on-prefix this.onSignOut = new EventEmitter(); } ngOnInit() { this.user$ = this.afa.user; this.user$.subscribe((user) => { this.user = user; this.displayNameInitials = user ? this.getDisplayNameInitials(user.displayName) : null; }); } getDisplayNameInitials(displayName) { if (!displayName) { return null; } const initialsRegExp = displayName.match(/\b\w/g) || []; const initials = ((initialsRegExp.shift() || "") + (initialsRegExp.pop() || "")).toUpperCase(); return initials; } openProfile() { const dialogRef = this.dialog.open(UserComponent); const instance = dialogRef.componentInstance; instance.canDeleteAccount = this.canDeleteAccount; instance.canEditAccount = this.canEditAccount; instance .onSignOut .pipe(take(1)).subscribe(_ => this.onSignOut.emit()); // propagate the onSignout event instance .onAccountEdited .pipe(take(1)).subscribe(_ => this.displayNameInitials = this.getDisplayNameInitials(this.authProcess.user.displayName)); // update display name initials? } async signOut() { try { await this.afa.signOut(); // Sign-out successful. this.onSignOut.emit(); } catch (e) { // An error happened. console.error("An error happened while signing out!", e); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgxAuthFirebaseuiAvatarComponent, deps: [{ token: i1.AngularFireAuth }, { token: i2.MatDialog }, { token: i3.AuthProcessService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NgxAuthFirebaseuiAvatarComponent, selector: "ngx-auth-firebaseui-avatar", inputs: { layout: "layout", canLogout: "canLogout", links: "links", canViewAccount: "canViewAccount", canDeleteAccount: "canDeleteAccount", canEditAccount: "canEditAccount", textProfile: "textProfile", textSignOut: "textSignOut" }, outputs: { onSignOut: "onSignOut" }, ngImport: i0, template: "<button *ngIf=\"user\"\n class=\"ngx-auth-firebaseui-avatar-button\"\n [matMenuTriggerFor]=\"posXMenu\"\n [matTooltip]=\"user?.displayName\"\n [style.background-image]=\"'url(' + user?.photoURL + ')'\"\n aria-label=\"Open x-positioned menu\"\n mat-mini-fab\n style=\"background-size: cover\">\n <span *ngIf=\"!user?.photoURL\">{{displayNameInitials || ''}}</span>\n</button>\n\n<mat-menu #posXMenu=\"matMenu\" class=\"before ngx-auth-firebaseui-avatar-menu\" xPosition=\"before\" >\n <div style=\"flex-direction: row\" fxLayout.xs=\"column\" style=\"padding-left: 10px; padding-right: 10px\" [ngStyle]=\"{ 'padding-top.px': layout === 'default' ? 0 : 10 }\">\n <button [style.background-image]=\"user?.photoURL ? 'url(' + user?.photoURL + ')' : ''\"\n mat-fab\n style=\"background-size: cover\"\n *ngIf=\"layout === 'default'\">\n <span *ngIf=\"!user?.photoURL\">{{displayNameInitials || ''}}</span>\n </button>\n <div style=\"flex-direction: column\" style=\"padding-left: 10px; padding-right: 10px\">\n <strong mat-card-title>{{user?.displayName}}</strong>\n <em mat-card-subtitle style=\"font-style: italic\">{{user?.email}}</em>\n </div>\n </div>\n\n <div fxFlex=\"100\" style=\"flex-direction: column\" [ngStyle]=\"{ 'padding-bottom.px': layout === 'default' ? 0 : 10 } \">\n <div *ngFor=\"let menuItem of links\" class=\"links-menu\">\n <button (click)=\"menuItem?.callback()\" mat-menu-item>\n <mat-icon>{{menuItem?.icon}}</mat-icon>\n {{menuItem?.text}}</button>\n </div>\n <button *ngIf=\"canViewAccount\" (click)=\"openProfile()\" color=\"primary\" fxLayoutAlign=\"center\" mat-raised-button>{{ textProfile }}\n </button>\n <button (click)=\"signOut()\" *ngIf=\"canLogout\" color=\"warn\" fxLayoutAlign=\"center\" mat-raised-button>{{ textSignOut }}\n </button>\n </div>\n</mat-menu>\n", styles: [".mat-raised-button{margin:.2rem 1rem}.links-menu{text-align:center}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i5.MatCardSubtitle, selector: "mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]" }, { kind: "directive", type: i5.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatMiniFabButton, selector: "button[mat-mini-fab]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatFabButton, selector: "button[mat-fab]", inputs: ["disabled", "disableRipple", "color", "tabIndex", "extended"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i9.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i9.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i9.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgxAuthFirebaseuiAvatarComponent, decorators: [{ type: Component, args: [{ selector: "ngx-auth-firebaseui-avatar", template: "<button *ngIf=\"user\"\n class=\"ngx-auth-firebaseui-avatar-button\"\n [matMenuTriggerFor]=\"posXMenu\"\n [matTooltip]=\"user?.displayName\"\n [style.background-image]=\"'url(' + user?.photoURL + ')'\"\n aria-label=\"Open x-positioned menu\"\n mat-mini-fab\n style=\"background-size: cover\">\n <span *ngIf=\"!user?.photoURL\">{{displayNameInitials || ''}}</span>\n</button>\n\n<mat-menu #posXMenu=\"matMenu\" class=\"before ngx-auth-firebaseui-avatar-menu\" xPosition=\"before\" >\n <div style=\"flex-direction: row\" fxLayout.xs=\"column\" style=\"padding-left: 10px; padding-right: 10px\" [ngStyle]=\"{ 'padding-top.px': layout === 'default' ? 0 : 10 }\">\n <button [style.background-image]=\"user?.photoURL ? 'url(' + user?.photoURL + ')' : ''\"\n mat-fab\n style=\"background-size: cover\"\n *ngIf=\"layout === 'default'\">\n <span *ngIf=\"!user?.photoURL\">{{displayNameInitials || ''}}</span>\n </button>\n <div style=\"flex-direction: column\" style=\"padding-left: 10px; padding-right: 10px\">\n <strong mat-card-title>{{user?.displayName}}</strong>\n <em mat-card-subtitle style=\"font-style: italic\">{{user?.email}}</em>\n </div>\n </div>\n\n <div fxFlex=\"100\" style=\"flex-direction: column\" [ngStyle]=\"{ 'padding-bottom.px': layout === 'default' ? 0 : 10 } \">\n <div *ngFor=\"let menuItem of links\" class=\"links-menu\">\n <button (click)=\"menuItem?.callback()\" mat-menu-item>\n <mat-icon>{{menuItem?.icon}}</mat-icon>\n {{menuItem?.text}}</button>\n </div>\n <button *ngIf=\"canViewAccount\" (click)=\"openProfile()\" color=\"primary\" fxLayoutAlign=\"center\" mat-raised-button>{{ textProfile }}\n </button>\n <button (click)=\"signOut()\" *ngIf=\"canLogout\" color=\"warn\" fxLayoutAlign=\"center\" mat-raised-button>{{ textSignOut }}\n </button>\n </div>\n</mat-menu>\n", styles: [".mat-raised-button{margin:.2rem 1rem}.links-menu{text-align:center}\n"] }] }], ctorParameters: function () { return [{ type: i1.AngularFireAuth }, { type: i2.MatDialog }, { type: i3.AuthProcessService }]; }, propDecorators: { layout: [{ type: Input }], canLogout: [{ type: Input }], links: [{ type: Input }], canViewAccount: [{ type: Input }], canDeleteAccount: [{ type: Input }], canEditAccount: [{ type: Input }], textProfile: [{ type: Input }], textSignOut: [{ type: Input }], onSignOut: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWF1dGgtZmlyZWJhc2V1aS1hdmF0YXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWF1dGgtZmlyZWJhc2V1aS9zcmMvbGliL2NvbXBvbmVudHMvbmd4LWF1dGgtZmlyZWJhc2V1aS1hdmF0YXIvbmd4LWF1dGgtZmlyZWJhc2V1aS1hdmF0YXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWF1dGgtZmlyZWJhc2V1aS9zcmMvbGliL2NvbXBvbmVudHMvbmd4LWF1dGgtZmlyZWJhc2V1aS1hdmF0YXIvbmd4LWF1dGgtZmlyZWJhc2V1aS1hdmF0YXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUkvRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLElBQUksQ0FBQzs7Ozs7Ozs7Ozs7QUFlbkMsTUFBTSxPQUFPLGdDQUFnQztJQWlDM0MsWUFBbUIsR0FBb0IsRUFBUyxNQUFpQixFQUFVLFdBQStCO1FBQXZGLFFBQUcsR0FBSCxHQUFHLENBQWlCO1FBQVMsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFvQjtRQS9CMUcsV0FBTSxHQUF5QixTQUFTLENBQUM7UUFHekMsY0FBUyxHQUFHLElBQUksQ0FBQztRQU1qQixtQkFBYyxHQUFHLElBQUksQ0FBQztRQUd0QixxQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFHeEIsbUJBQWMsR0FBRyxJQUFJLENBQUM7UUFHdEIsZ0JBQVcsR0FBRyxTQUFTLENBQUM7UUFHeEIsZ0JBQVcsR0FBRyxVQUFVLENBQUM7UUFFekIsK0RBQStEO1FBRS9E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bnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQW5ndWxhckZpcmVBdXRoIH0gZnJvbSBcIkBhbmd1bGFyL2ZpcmUvY29tcGF0L2F1dGhcIjtcbmltcG9ydCBmaXJlYmFzZSBmcm9tIFwiZmlyZWJhc2UvY29tcGF0L2FwcFwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2RpYWxvZ1wiO1xuaW1wb3J0IHsgVXNlckNvbXBvbmVudCB9IGZyb20gXCIuLlwiO1xuaW1wb3J0IHsgQXV0aFByb2Nlc3NTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2F1dGgtcHJvY2Vzcy5zZXJ2aWNlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlua01lbnVJdGVtIHtcbiAgdGV4dDogc3RyaW5nO1xuICBpY29uPzogc3RyaW5nO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICBjYWxsYmFjaz86IEZ1bmN0aW9uO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwibmd4LWF1dGgtZmlyZWJhc2V1aS1hdmF0YXJcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9uZ3gtYXV0aC1maXJlYmFzZXVpLWF2YXRhci5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vbmd4LWF1dGgtZmlyZWJhc2V1aS1hdmF0YXIuY29tcG9uZW50LnNjc3NcIl0sXG59KVxuZXhwb3J0IGNsYXNzIE5neEF1dGhGaXJlYmFzZXVpQXZhdGFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KClcbiAgbGF5b3V0OiBcImRlZmF1bHRcIiB8IFwic2ltcGxlXCIgPSBcImRlZmF1bHRcIjtcblxuICBASW5wdXQoKVxuICBjYW5Mb2dvdXQgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIGxpbmtzOiBMaW5rTWVudUl0ZW1bXTtcblxuICBASW5wdXQoKVxuICBjYW5WaWV3QWNjb3VudCA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgY2FuRGVsZXRlQWNjb3VudCA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgY2FuRWRpdEFjY291bnQgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHRleHRQcm9maWxlID0gXCJQcm9maWxlXCI7XG5cbiAgQElucHV0KClcbiAgdGV4dFNpZ25PdXQgPSBcIlNpZ24gT3V0XCI7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtb24tcHJlZml4XG4gIEBPdXRwdXQoKVxuICBvblNpZ25PdXQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICB1c2VyOiBmaXJlYmFzZS5Vc2VyO1xuICB1c2VyJDogT2JzZXJ2YWJsZTxmaXJlYmFzZS5Vc2VyIHwgbnVsbD47XG4gIGRpc3BsYXlOYW1lSW5pdGlhbHM6IHN0cmluZyB8IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGFmYTogQW5ndWxhckZpcmVBdXRoLCBwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2csIHByaXZhdGUgYXV0aFByb2Nlc3M6IEF1dGhQcm9jZXNzU2VydmljZSkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnVzZXIkID0gdGhpcy5hZmEudXNlcjtcbiAgICB0aGlzLnVzZXIkLnN1YnNjcmliZSgodXNlcjogZmlyZWJhc2UuVXNlcikgPT4ge1xuICAgICAgdGhpcy51c2VyID0gdXNlcjtcbiAgICAgIHRoaXMuZGlzcGxheU5hbWVJbml0aWFscyA9IHVzZXJcbiAgICAgICAgPyB0aGlzLmdldERpc3BsYXlOYW1lSW5pdGlhbHModXNlci5kaXNwbGF5TmFtZSlcbiAgICAgICAgOiBudWxsO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0RGlzcGxheU5hbWVJbml0aWFscyhkaXNwbGF5TmFtZTogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghZGlzcGxheU5hbWUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBpbml0aWFsc1JlZ0V4cDogUmVnRXhwTWF0Y2hBcnJheSB8IFtdID0gZGlzcGxheU5hbWUubWF0Y2goL1xcYlxcdy9nKSB8fCBbXTtcbiAgICBjb25zdCBpbml0aWFscyA9IChcbiAgICAgIChpbml0aWFsc1JlZ0V4cC5zaGlmdCgpIHx8IFwiXCIpICsgKGluaXRpYWxzUmVnRXhwLnBvcCgpIHx8IFwiXCIpXG4gICAgKS50b1VwcGVyQ2FzZSgpO1xuICAgIHJldHVybiBpbml0aWFscztcbiAgfVxuXG4gIG9wZW5Qcm9maWxlKCkge1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oVXNlckNvbXBvbmVudCk7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBkaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2U7XG4gICAgaW5zdGFuY2UuY2FuRGVsZXRlQWNjb3VudCA9IHRoaXMuY2FuRGVsZXRlQWNjb3VudDtcbiAgICBpbnN0YW5jZS5jYW5FZGl0QWNjb3VudCA9IHRoaXMuY2FuRWRpdEFjY291bnQ7XG4gICAgaW5zdGFuY2VcbiAgICAub25TaWduT3V0XG4gICAgLnBpcGUoXG4gICAgICB0YWtlKDEpXG4gICAgICApLnN1YnNjcmliZShfID0+IHRoaXMub25TaWduT3V0LmVtaXQoKSk7IC8vIHByb3BhZ2F0ZSB0aGUgb25TaWdub3V0IGV2ZW50XG4gICAgaW5zdGFuY2VcbiAgICAub25BY2NvdW50RWRpdGVkXG4gICAgLnBpcGUoXG4gICAgICB0YWtlKDEpXG4gICAgKS5zdWJzY3JpYmUoXyA9PiB0aGlzLmRpc3BsYXlOYW1lSW5pdGlhbHMgPSB0aGlzLmdldERpc3BsYXlOYW1lSW5pdGlhbHModGhpcy5hdXRoUHJvY2Vzcy51c2VyLmRpc3BsYXlOYW1lKSkgLy8gdXBkYXRlIGRpc3BsYXkgbmFtZSBpbml0aWFscz9cbiAgfVxuXG4gIGFzeW5jIHNpZ25PdXQoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYWZhLnNpZ25PdXQoKTtcbiAgICAgIC8vIFNpZ24tb3V0IHN1Y2Nlc3NmdWwuXG4gICAgICB0aGlzLm9uU2lnbk91dC5lbWl0KCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gQW4gZXJyb3IgaGFwcGVuZWQuXG4gICAgICBjb25zb2xlLmVycm9yKFwiQW4gZXJyb3IgaGFwcGVuZWQgd2hpbGUgc2lnbmluZyBvdXQhXCIsIGUpO1xuICAgIH1cbiAgfVxufVxuIiwiPGJ1dHRvbiAqbmdJZj1cInVzZXJcIlxuICAgICAgICBjbGFzcz1cIm5neC1hdXRoLWZpcmViYXNldWktYXZhdGFyLWJ1dHRvblwiXG4gICAgICAgIFttYXRNZW51VHJpZ2dlckZvcl09XCJwb3NYTWVudVwiXG4gICAgICAgIFttYXRUb29sdGlwXT1cInVzZXI/LmRpc3BsYXlOYW1lXCJcbiAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtaW1hZ2VdPVwiJ3VybCgnICsgdXNlcj8ucGhvdG9VUkwgKyAnKSdcIlxuICAgICAgICBhcmlhLWxhYmVsPVwiT3BlbiB4LXBvc2l0aW9uZWQgbWVudVwiXG4gICAgICAgIG1hdC1taW5pLWZhYlxuICAgICAgICBzdHlsZT1cImJhY2tncm91bmQtc2l6ZTogY292ZXJcIj5cbiAgPHNwYW4gKm5nSWY9XCIhdXNlcj8ucGhvdG9VUkxcIj57e2Rpc3BsYXlOYW1lSW5pdGlhbHMgfHwgJyd9fTwvc3Bhbj5cbjwvYnV0dG9uPlxuXG48bWF0LW1lbnUgI3Bvc1hNZW51PVwibWF0TWVudVwiIGNsYXNzPVwiYmVmb3JlIG5neC1hdXRoLWZpcmViYXNldWktYXZhdGFyLW1lbnVcIiB4UG9zaXRpb249XCJiZWZvcmVcIiA+XG4gIDxkaXYgc3R5bGU9XCJmbGV4LWRpcmVjdGlvbjogcm93XCIgZnhMYXlvdXQueHM9XCJjb2x1bW5cIiBzdHlsZT1cInBhZGRpbmctbGVmdDogMTBweDsgcGFkZGluZy1yaWdodDogMTBweFwiIFtuZ1N0eWxlXT1cInsgJ3BhZGRpbmctdG9wLnB4JzogbGF5b3V0ID09PSAnZGVmYXVsdCcgPyAwIDogMTAgfVwiPlxuICAgIDxidXR0b24gW3N0eWxlLmJhY2tncm91bmQtaW1hZ2VdPVwidXNlcj8ucGhvdG9VUkwgPyAndXJsKCcgKyB1c2VyPy5waG90b1VSTCArICcpJyA6ICcnXCJcbiAgICAgICAgICAgIG1hdC1mYWJcbiAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1zaXplOiBjb3ZlclwiXG4gICAgICAgICAgICAqbmdJZj1cImxheW91dCA9PT0gJ2RlZmF1bHQnXCI+XG4gICAgICA8c3BhbiAqbmdJZj1cIiF1c2VyPy5waG90b1VSTFwiPnt7ZGlzcGxheU5hbWVJbml0aWFscyB8fCAnJ319PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICAgIDxkaXYgc3R5bGU9XCJmbGV4LWRpcmVjdGlvbjogY29sdW1uXCIgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDEwcHg7IHBhZGRpbmctcmlnaHQ6IDEwcHhcIj5cbiAgICAgIDxzdHJvbmcgbWF0LWNhcmQtdGl0bGU+e3t1c2VyPy5kaXNwbGF5TmFtZX19PC9zdHJvbmc+XG4gICAgICA8ZW0gbWF0LWNhcmQtc3VidGl0bGUgc3R5bGU9XCJmb250LXN0eWxlOiBpdGFsaWNcIj57e3VzZXI/LmVtYWlsfX08L2VtPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGZ4RmxleD1cIjEwMFwiIHN0eWxlPVwiZmxleC1kaXJlY3Rpb246IGNvbHVtblwiIFtuZ1N0eWxlXT1cInsgJ3BhZGRpbmctYm90dG9tLnB4JzogbGF5b3V0ID09PSAnZGVmYXVsdCcgPyAwIDogMTAgfSBcIj5cbiAgICA8ZGl2ICpuZ0Zvcj1cImxldCBtZW51SXRlbSBvZiBsaW5rc1wiIGNsYXNzPVwibGlua3MtbWVudVwiPlxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwibWVudUl0ZW0/LmNhbGxiYWNrKClcIiBtYXQtbWVudS1pdGVtPlxuICAgICAgICA8bWF0LWljb24+e3ttZW51SXRlbT8uaWNvbn19PC9tYXQtaWNvbj5cbiAgICAgICAge3ttZW51SXRlbT8udGV4dH19PC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGJ1dHRvbiAqbmdJZj1cImNhblZpZXdBY2NvdW50XCIgKGNsaWNrKT1cIm9wZW5Qcm9maWxlKClcIiBjb2xvcj1cInByaW1hcnlcIiBmeExheW91dEFsaWduPVwiY2VudGVyXCIgbWF0LXJhaXNlZC1idXR0b24+e3sgdGV4dFByb2ZpbGUgfX1cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uIChjbGljayk9XCJzaWduT3V0KClcIiAqbmdJZj1cImNhbkxvZ291dFwiIGNvbG9yPVwid2FyblwiIGZ4TGF5b3V0QWxpZ249XCJjZW50ZXJcIiBtYXQtcmFpc2VkLWJ1dHRvbj57eyB0ZXh0U2lnbk91dCB9fVxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbWF0LW1lbnU+XG4iXX0=