UNPKG

ng-prime-tools

Version:

An advanced PrimeNG table for Angular

153 lines 32.8 kB
import { Component, EventEmitter, Input, Output } from '@angular/core'; import { Validators, FormsModule, ReactiveFormsModule, } from '@angular/forms'; import { FormInputTypeEnum } from '../../enums'; import { CommonModule } from '@angular/common'; import { PTCardModule } from '../../pt-card'; import { PTButtonModule } from '../../pt-button'; import { PTTextInputModule } from '../../pt-text-input'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "@angular/common"; import * as i3 from "../../pt-card/pt-card.component"; import * as i4 from "../../pt-button/pt-button.component"; import * as i5 from "../../pt-text-input/pt-text-input.component"; export class PTLoginCardComponent { constructor(fb) { this.fb = fb; this.loginErrorMessage = null; this.loginSubmit = new EventEmitter(); this.formGroup = this.fb.group({}); } ngOnInit() { this.initializeDefaults(); this.setupFormFields(); this.formGroup.patchValue({ username: this.loginPageConfig?.login?.username || '', password: this.loginPageConfig?.login?.password || '', }); // Enable/Disable the button based on form validity this.formGroup.statusChanges.subscribe((status) => { this.loginPageConfig.buttonConfig = { ...this.loginPageConfig.buttonConfig, disabled: status !== 'VALID', }; }); } // Initialize default values for all fields in loginPageConfig if not set initializeDefaults() { // Initialize backgroundImage this.loginPageConfig.backgroundImage = { imageUrl: this.loginPageConfig.backgroundImage?.imageUrl || '', transparencyPercentage: this.loginPageConfig.backgroundImage?.transparencyPercentage || '100', ...this.loginPageConfig.backgroundImage, }; // Initialize title this.loginPageConfig.title = { text: this.loginPageConfig.title?.text || 'Login', position: this.loginPageConfig.title?.position || 'center', color: this.loginPageConfig.title?.color || '#333', fontSize: this.loginPageConfig.title?.fontSize || '24px', ...this.loginPageConfig.title, }; // Initialize logoUrl this.loginPageConfig.logoUrl = { altText: this.loginPageConfig.logoUrl?.altText || 'Logo', imageUrl: this.loginPageConfig.logoUrl?.imageUrl || '', width: this.loginPageConfig.logoUrl?.width || '100px', height: this.loginPageConfig.logoUrl?.height || 'auto', ...this.loginPageConfig.logoUrl, }; // Initialize footer this.loginPageConfig.footer = { version: this.loginPageConfig.footer?.version || 'V1.0', copyright: this.loginPageConfig.footer?.copyright || 'Your Company © 2024', ...this.loginPageConfig.footer, }; // Initialize login this.loginPageConfig.login = { username: this.loginPageConfig.login?.username || '', password: this.loginPageConfig.login?.password || '', errorMessage: this.loginPageConfig.login?.errorMessage || '', emptyFieldsErrorMessage: this.loginPageConfig.login?.emptyFieldsErrorMessage || "Veuillez saisir votre nom d'utilisateur et votre mot de passe !", ...this.loginPageConfig.login, }; // Initialize cardConfig this.loginPageConfig.loginCardConfig = { noBorder: this.loginPageConfig.loginCardConfig?.noBorder ?? true, width: this.loginPageConfig.loginCardConfig?.width ?? '400px', padding: this.loginPageConfig.loginCardConfig?.padding ?? '40px', ...this.loginPageConfig.loginCardConfig, }; // Initialize usernameField this.loginPageConfig.usernameField = { name: this.loginPageConfig.usernameField?.name || 'username', label: this.loginPageConfig.usernameField?.label || "Nom d'utilisateur", required: this.loginPageConfig.usernameField?.required ?? true, placeholder: this.loginPageConfig.usernameField?.placeholder || "Entrer votre nom d'utilisateur", ...this.loginPageConfig.usernameField, }; // Initialize passwordField this.loginPageConfig.passwordField = { name: this.loginPageConfig.passwordField?.name || 'password', label: this.loginPageConfig.passwordField?.label || 'Mot de passe', required: this.loginPageConfig.passwordField?.required ?? true, placeholder: this.loginPageConfig.passwordField?.placeholder || 'Entrer votre mot de passe', type: this.loginPageConfig.passwordField?.type || FormInputTypeEnum.PASSWORD, ...this.loginPageConfig.passwordField, }; // Initialize buttonConfig this.loginPageConfig.buttonConfig = { label: this.loginPageConfig.buttonConfig?.label || 'Login', type: this.loginPageConfig.buttonConfig?.type || 'submit', icon: this.loginPageConfig.buttonConfig?.icon || 'pi pi-sign-in', iconPos: this.loginPageConfig.buttonConfig?.iconPos || 'left', styleClass: this.loginPageConfig.buttonConfig?.styleClass || 'p-button-success', disabled: this.loginPageConfig.buttonConfig?.disabled ?? true, width: this.loginPageConfig.buttonConfig?.width ?? '100%', ...this.loginPageConfig.buttonConfig, }; } onSubmit() { if (this.formGroup.valid) { this.loginSubmit.emit(this.formGroup.value); } else { this.loginPageConfig.login.errorMessage = this.loginPageConfig.login?.emptyFieldsErrorMessage; } } // Setup form fields using the usernameField and passwordField from LoginPageConfig setupFormFields() { const usernameValidators = this.loginPageConfig.usernameField?.required ? [Validators.required] : []; const passwordValidators = this.loginPageConfig.passwordField?.required ? [Validators.required] : []; this.formGroup.addControl(this.loginPageConfig.usernameField.name, this.fb.control(this.loginPageConfig.login?.username, usernameValidators)); this.formGroup.addControl(this.loginPageConfig.passwordField.name, this.fb.control(this.loginPageConfig.login?.password, passwordValidators)); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PTLoginCardComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: PTLoginCardComponent, isStandalone: true, selector: "pt-login-card", inputs: { loginPageConfig: "loginPageConfig", loginErrorMessage: "loginErrorMessage" }, outputs: { loginSubmit: "loginSubmit" }, ngImport: i0, template: "<pt-card [config]=\"loginPageConfig.loginCardConfig!\">\n <!-- Logo -->\n <div class=\"logo-container\" *ngIf=\"loginPageConfig.logoUrl?.imageUrl\">\n <img\n [src]=\"loginPageConfig.logoUrl?.imageUrl\"\n [alt]=\"loginPageConfig.logoUrl?.altText || 'Logo'\"\n [style.width]=\"loginPageConfig.logoUrl?.width || '100px'\"\n [style.height]=\"loginPageConfig.logoUrl?.height || 'auto'\"\n />\n </div>\n\n <!-- Title -->\n <div class=\"title-container\">\n <h1\n [ngStyle]=\"{\n color: loginPageConfig.title?.color || '#333',\n 'font-size': loginPageConfig.title?.fontSize || '24px'\n }\"\n >\n {{ loginPageConfig.title?.text || \"Default Title\" }}\n </h1>\n </div>\n <!-- Error Message -->\n <div *ngIf=\"loginErrorMessage\" class=\"error-message\">\n {{ loginErrorMessage }}\n </div>\n <!-- Form -->\n <form class=\"form-container\" [formGroup]=\"formGroup\" (ngSubmit)=\"onSubmit()\">\n <div *ngIf=\"loginPageConfig.login?.errorMessage\" class=\"error-message\">\n {{ loginPageConfig.login?.errorMessage }}\n </div>\n\n <div class=\"field\">\n <pt-text-input\n [formGroup]=\"formGroup\"\n [formField]=\"loginPageConfig.usernameField!\"\n ></pt-text-input>\n </div>\n <div class=\"field\">\n <pt-text-input\n [formGroup]=\"formGroup\"\n [formField]=\"loginPageConfig.passwordField!\"\n ></pt-text-input>\n </div>\n\n <div class=\"submit-btn\">\n <pt-button [buttonConfig]=\"loginPageConfig.buttonConfig!\"></pt-button>\n </div>\n </form>\n <div class=\"login-footer\">\n {{ loginPageConfig.footer?.version }}\n <span>{{ loginPageConfig.footer?.copyright }}</span>\n </div>\n</pt-card>\n", styles: [".logo-container{display:flex;justify-content:center;align-items:center;margin-bottom:20px}.title-container{text-align:center;margin-bottom:20px}.form-container{width:100%}.field{display:flex;flex-direction:column;margin-bottom:20px;width:100%}.error-message{color:red;background-color:#ffe6e6;border:1px solid red;padding:10px;margin-bottom:10px;border-radius:5px;width:100%;text-align:center}.submit-btn{display:flex;justify-content:center;width:100%}::ng-deep pt-button{width:100%}::ng-deep .submit-btn p-button button{width:100%}.login-footer{margin-top:20px;text-align:center;font-size:.9em;color:#555}@media (max-width: 768px){pt-card{max-width:300px}.submit-btn{min-width:100%}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: PTCardModule }, { kind: "component", type: i3.PTCardComponent, selector: "pt-card", inputs: ["config"] }, { kind: "ngmodule", type: PTButtonModule }, { kind: "component", type: i4.PTButtonComponent, selector: "pt-button", inputs: ["buttonConfig"] }, { kind: "ngmodule", type: PTTextInputModule }, { kind: "component", type: i5.PTTextInputComponent, selector: "pt-text-input", inputs: ["formGroup", "formField"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PTLoginCardComponent, decorators: [{ type: Component, args: [{ selector: 'pt-login-card', standalone: true, imports: [ CommonModule, FormsModule, ReactiveFormsModule, PTCardModule, PTButtonModule, PTTextInputModule, ], template: "<pt-card [config]=\"loginPageConfig.loginCardConfig!\">\n <!-- Logo -->\n <div class=\"logo-container\" *ngIf=\"loginPageConfig.logoUrl?.imageUrl\">\n <img\n [src]=\"loginPageConfig.logoUrl?.imageUrl\"\n [alt]=\"loginPageConfig.logoUrl?.altText || 'Logo'\"\n [style.width]=\"loginPageConfig.logoUrl?.width || '100px'\"\n [style.height]=\"loginPageConfig.logoUrl?.height || 'auto'\"\n />\n </div>\n\n <!-- Title -->\n <div class=\"title-container\">\n <h1\n [ngStyle]=\"{\n color: loginPageConfig.title?.color || '#333',\n 'font-size': loginPageConfig.title?.fontSize || '24px'\n }\"\n >\n {{ loginPageConfig.title?.text || \"Default Title\" }}\n </h1>\n </div>\n <!-- Error Message -->\n <div *ngIf=\"loginErrorMessage\" class=\"error-message\">\n {{ loginErrorMessage }}\n </div>\n <!-- Form -->\n <form class=\"form-container\" [formGroup]=\"formGroup\" (ngSubmit)=\"onSubmit()\">\n <div *ngIf=\"loginPageConfig.login?.errorMessage\" class=\"error-message\">\n {{ loginPageConfig.login?.errorMessage }}\n </div>\n\n <div class=\"field\">\n <pt-text-input\n [formGroup]=\"formGroup\"\n [formField]=\"loginPageConfig.usernameField!\"\n ></pt-text-input>\n </div>\n <div class=\"field\">\n <pt-text-input\n [formGroup]=\"formGroup\"\n [formField]=\"loginPageConfig.passwordField!\"\n ></pt-text-input>\n </div>\n\n <div class=\"submit-btn\">\n <pt-button [buttonConfig]=\"loginPageConfig.buttonConfig!\"></pt-button>\n </div>\n </form>\n <div class=\"login-footer\">\n {{ loginPageConfig.footer?.version }}\n <span>{{ loginPageConfig.footer?.copyright }}</span>\n </div>\n</pt-card>\n", styles: [".logo-container{display:flex;justify-content:center;align-items:center;margin-bottom:20px}.title-container{text-align:center;margin-bottom:20px}.form-container{width:100%}.field{display:flex;flex-direction:column;margin-bottom:20px;width:100%}.error-message{color:red;background-color:#ffe6e6;border:1px solid red;padding:10px;margin-bottom:10px;border-radius:5px;width:100%;text-align:center}.submit-btn{display:flex;justify-content:center;width:100%}::ng-deep pt-button{width:100%}::ng-deep .submit-btn p-button button{width:100%}.login-footer{margin-top:20px;text-align:center;font-size:.9em;color:#555}@media (max-width: 768px){pt-card{max-width:300px}.submit-btn{min-width:100%}}\n"] }] }], ctorParameters: () => [{ type: i1.FormBuilder }], propDecorators: { loginPageConfig: [{ type: Input }], loginErrorMessage: [{ type: Input }], loginSubmit: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHQtbG9naW4tY2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wcmltZS10b29scy9zcmMvbGliL3B0LWxvZ2luLXBhZ2UvcHQtbG9naW4tY2FyZC9wdC1sb2dpbi1jYXJkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXByaW1lLXRvb2xzL3NyYy9saWIvcHQtbG9naW4tcGFnZS9wdC1sb2dpbi1jYXJkL3B0LWxvZ2luLWNhcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBR0wsVUFBVSxFQUNWLFdBQVcsRUFDWCxtQkFBbUIsR0FDcEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7O0FBZ0J4RCxNQUFNLE9BQU8sb0JBQW9CO0lBUS9CLFlBQW9CLEVBQWU7UUFBZixPQUFFLEdBQUYsRUFBRSxDQUFhO1FBTjFCLHNCQUFpQixHQUFrQixJQUFJLENBQUM7UUFDdkMsZ0JBQVcsR0FDbkIsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUsvQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxRQUFRO1FB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WixjQUFjLGtJQUNkLGlCQUFpQjs7NEZBS1Isb0JBQW9CO2tCQWRoQyxTQUFTOytCQUNFLGVBQWUsY0FDYixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixXQUFXO3dCQUNYLG1CQUFtQjt3QkFDbkIsWUFBWTt3QkFDWixjQUFjO3dCQUNkLGlCQUFpQjtxQkFDbEI7Z0ZBS1EsZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0ksV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEZvcm1CdWlsZGVyLFxuICBGb3JtR3JvdXAsXG4gIFZhbGlkYXRvcnMsXG4gIEZvcm1zTW9kdWxlLFxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBMb2dpbk1vZGVsLCBMb2dpblBhZ2VDb25maWcgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHsgRm9ybUlucHV0VHlwZUVudW0gfSBmcm9tICcuLi8uLi9lbnVtcyc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgUFRDYXJkTW9kdWxlIH0gZnJvbSAnLi4vLi4vcHQtY2FyZCc7XG5pbXBvcnQgeyBQVEJ1dHRvbk1vZHVsZSB9IGZyb20gJy4uLy4uL3B0LWJ1dHRvbic7XG5pbXBvcnQgeyBQVFRleHRJbnB1dE1vZHVsZSB9IGZyb20gJy4uLy4uL3B0LXRleHQtaW5wdXQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwdC1sb2dpbi1jYXJkJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIFBUQ2FyZE1vZHVsZSxcbiAgICBQVEJ1dHRvbk1vZHVsZSxcbiAgICBQVFRleHRJbnB1dE1vZHVsZSxcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3B0LWxvZ2luLWNhcmQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wdC1sb2dpbi1jYXJkLmNvbXBvbmVudC5jc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgUFRMb2dpbkNhcmRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBsb2dpblBhZ2VDb25maWchOiBMb2dpblBhZ2VDb25maWc7XG4gIEBJbnB1dCgpIGxvZ2luRXJyb3JNZXNzYWdlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQE91dHB1dCgpIGxvZ2luU3VibWl0OiBFdmVudEVtaXR0ZXI8TG9naW5Nb2RlbD4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXI8TG9naW5Nb2RlbD4oKTtcblxuICBmb3JtR3JvdXA6IEZvcm1Hcm91cDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZiOiBGb3JtQnVpbGRlcikge1xuICAgIHRoaXMuZm9ybUdyb3VwID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRpYWxpemVEZWZhdWx0cygpO1xuICAgIHRoaXMuc2V0dXBGb3JtRmllbGRzKCk7XG5cbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHtcbiAgICAgIHVzZXJuYW1lOiB0aGlzLmxvZ2luUGFnZUNvbmZpZz8ubG9naW4/LnVzZXJuYW1lIHx8ICcnLFxuICAgICAgcGFzc3dvcmQ6IHRoaXMubG9naW5QYWdlQ29uZmlnPy5sb2dpbj8ucGFzc3dvcmQgfHwgJycsXG4gICAgfSk7XG4gICAgLy8gRW5hYmxlL0Rpc2FibGUgdGhlIGJ1dHRvbiBiYXNlZCBvbiBmb3JtIHZhbGlkaXR5XG4gICAgdGhpcy5mb3JtR3JvdXAuc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUoKHN0YXR1cykgPT4ge1xuICAgICAgdGhpcy5sb2dpblBhZ2VDb25maWcuYnV0dG9uQ29uZmlnID0ge1xuICAgICAgICAuLi50aGlzLmxvZ2luUGFnZUNvbmZpZy5idXR0b25Db25maWchLFxuICAgICAgICBkaXNhYmxlZDogc3RhdHVzICE9PSAnVkFMSUQnLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCBmaWVsZHMgaW4gbG9naW5QYWdlQ29uZmlnIGlmIG5vdCBzZXRcbiAgaW5pdGlhbGl6ZURlZmF1bHRzKCkge1xuICAgIC8vIEluaXRpYWxpemUgYmFja2dyb3VuZEltYWdlXG4gICAgdGhpcy5sb2dpblBhZ2VDb25maWcuYmFja2dyb3VuZEltYWdlID0ge1xuICAgICAgaW1hZ2VVcmw6IHRoaXMubG9naW5QYWdlQ29uZmlnLmJhY2tncm91bmRJbWFnZT8uaW1hZ2VVcmwgfHwgJycsXG4gICAgICB0cmFuc3BhcmVuY3lQZXJjZW50YWdlOlxuICAgICAgICB0aGlzLmxvZ2luUGFnZUNvbmZpZy5iYWNrZ3JvdW5kSW1hZ2U/LnRyYW5zcGFyZW5jeVBlcmNlbnRhZ2UgfHwgJzEwMCcsXG4gICAgICAuLi50aGlzLmxvZ2luUGFnZUNvbmZpZy5iYWNrZ3JvdW5kSW1hZ2UsXG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemUgdGl0bGVcbiAgICB0aGlzLmxvZ2luUGFnZUNvbmZpZy50aXRsZSA9IHtcbiAgICAgIHRleHQ6IHRoaXMubG9naW5QYWdlQ29uZmlnLnRpdGxlPy50ZXh0IHx8ICdMb2dpbicsXG4gICAgICBwb3NpdGlvbjogdGhpcy5sb2dpblBhZ2VDb25maWcudGl0bGU/LnBvc2l0aW9uIHx8ICdjZW50ZXInLFxuICAgICAgY29sb3I6IHRoaXMubG9naW5QYWdlQ29uZmlnLnRpdGxlPy5jb2xvciB8fCAnIzMzMycsXG4gICAgICBmb250U2l6ZTogdGhpcy5sb2dpblBhZ2VDb25maWcudGl0bGU/LmZvbnRTaXplIHx8ICcyNHB4JyxcbiAgICAgIC4uLnRoaXMubG9naW5QYWdlQ29uZmlnLnRpdGxlLFxuICAgIH07XG5cbiAgICAvLyBJbml0aWFsaXplIGxvZ29VcmxcbiAgICB0aGlzLmxvZ2luUGFnZUNvbmZpZy5sb2dvVXJsID0ge1xuICAgICAgYWx0VGV4dDogdGhpcy5sb2dpblBhZ2VDb25maWcubG9nb1VybD8uYWx0VGV4dCB8fCAnTG9nbycsXG4gICAgICBpbWFnZVVybDogdGhpcy5sb2dpblBhZ2VDb25maWcubG9nb1VybD8uaW1hZ2VVcmwgfHwgJycsXG4gICAgICB3aWR0aDogdGhpcy5sb2dpblBhZ2VDb25maWcubG9nb1VybD8ud2lkdGggfHwgJzEwMHB4JyxcbiAgICAgIGhlaWdodDogdGhpcy5sb2dpblBhZ2VDb25maWcubG9nb1VybD8uaGVpZ2h0IHx8ICdhdXRvJyxcbiAgICAgIC4uLnRoaXMubG9naW5QYWdlQ29uZmlnLmxvZ29VcmwsXG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemUgZm9vdGVyXG4gICAgdGhpcy5sb2dpblBhZ2VDb25maWcuZm9vdGVyID0ge1xuICAgICAgdmVyc2lvbjogdGhpcy5sb2dpblBhZ2VDb25maWcuZm9vdGVyPy52ZXJzaW9uIHx8ICdWMS4wJyxcbiAgICAgIGNvcHlyaWdodDpcbiAgICAgICAgdGhpcy5sb2dpblBhZ2VDb25maWcuZm9vdGVyPy5jb3B5cmlnaHQgfHwgJ1lvdXIgQ29tcGFueSDCqSAyMDI0JyxcbiAgICAgIC4uLnRoaXMubG9naW5QYWdlQ29uZmlnLmZvb3RlcixcbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBsb2dpblxuICAgIHRoaXMubG9naW5QYWdlQ29uZmlnLmxvZ2luID0ge1xuICAgICAgdXNlcm5hbWU6IHRoaXMubG9naW5QYWdlQ29uZmlnLmxvZ2luPy51c2VybmFtZSB8fCAnJyxcbiAgICAgIHBhc3N3b3JkOiB0aGlzLmxvZ2luUGFnZUNvbmZpZy5sb2dpbj8ucGFzc3dvcmQgfHwgJycsXG4gICAgICBlcnJvck1lc3NhZ2U6IHRoaXMubG9naW5QYWdlQ29uZmlnLmxvZ2luPy5lcnJvck1lc3NhZ2UgfHwgJycsXG4gICAgICBlbXB0eUZpZWxkc0Vycm9yTWVzc2FnZTpcbiAgICAgICAgdGhpcy5sb2dpblBhZ2VDb25maWcubG9naW4/LmVtcHR5RmllbGRzRXJyb3JNZXNzYWdlIHx8XG4gICAgICAgIFwiVmV1aWxsZXogc2Fpc2lyIHZvdHJlIG5vbSBkJ3V0aWxpc2F0ZXVyIGV0IHZvdHJlIG1vdCBkZSBwYXNzZSAhXCIsXG4gICAgICAuLi50aGlzLmxvZ2luUGFnZUNvbmZpZy5sb2dpbixcbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBjYXJkQ29uZmlnXG4gICAgdGhpcy5sb2dpblBhZ2VDb25maWcubG9naW5DYXJkQ29uZmlnID0ge1xuICAgICAgbm9Cb3JkZXI6IHRoaXMubG9naW5QYWdlQ29uZmlnLmxvZ2luQ2FyZENvbmZpZz8ubm9Cb3JkZXIgPz8gdHJ1ZSxcbiAgICAgIHdpZHRoOiB0aGlzLmxvZ2luUGFnZUNvbmZpZy5sb2dpbkNhcmRDb25maWc/LndpZHRoID8/ICc0MDBweCcsXG4gICAgICBwYWRkaW5nOiB0aGlzLmxvZ2luUGFnZUNvbmZpZy5sb2dpbkNhcmRDb25maWc/LnBhZGRpbmcgPz8gJzQwcHgnLFxuICAgICAgLi4udGhpcy5sb2dpblBhZ2VDb25maWcubG9naW5DYXJkQ29uZmlnLFxuICAgIH07XG5cbiAgICAvLyBJbml0aWFsaXplIHVzZXJuYW1lRmllbGRcbiAgICB0aGlzLmxvZ2luUGFnZUNvbmZpZy51c2VybmFtZUZpZWxkID0ge1xuICAgICAgbmFtZTogdGhpcy5sb2dpblBhZ2VDb25maWcudXNlcm5hbWVGaWVsZD8ubmFtZSB8fCAndXNlcm5hbWUnLFxuICAgICAgbGFiZWw6IHRoaXMubG9naW5QYWdlQ29uZmlnLnVzZXJuYW1lRmllbGQ/LmxhYmVsIHx8IFwiTm9tIGQndXRpbGlzYXRldXJcIixcbiAgICAgIHJlcXVpcmVkOiB0aGlzLmxvZ2luUGFnZUNvbmZpZy51c2VybmFtZUZpZWxkPy5yZXF1aXJlZCA/PyB0cnVlLFxuICAgICAgcGxhY2Vob2xkZXI6XG4gICAgICAgIHRoaXMubG9naW5QYWdlQ29uZmlnLnVzZXJuYW1lRmllbGQ/LnBsYWNlaG9sZGVyIHx8XG4gICAgICAgIFwiRW50cmVyIHZvdHJlIG5vbSBkJ3V0aWxpc2F0ZXVyXCIsXG4gICAgICAuLi50aGlzLmxvZ2luUGFnZUNvbmZpZy51c2VybmFtZUZpZWxkLFxuICAgIH07XG5cbiAgICAvLyBJbml0aWFsaXplIHBhc3N3b3JkRmllbGRcbiAgICB0aGlzLmxvZ2luUGFnZUNvbmZpZy5wYXNzd29yZEZpZWxkID0ge1xuICAgICAgbmFtZTogdGhpcy5sb2dpblBhZ2VDb25maWcucGFzc3dvcmRGaWVsZD8ubmFtZSB8fCAncGFzc3dvcmQnLFxuICAgICAgbGFiZWw6IHRoaXMubG9naW5QYWdlQ29uZmlnLnBhc3N3b3JkRmllbGQ/LmxhYmVsIHx8ICdNb3QgZGUgcGFzc2UnLFxuICAgICAgcmVxdWlyZWQ6IHRoaXMubG9naW5QYWdlQ29uZmlnLnBhc3N3b3JkRmllbGQ/LnJlcXVpcmVkID8/IHRydWUsXG4gICAgICBwbGFjZWhvbGRlcjpcbiAgICAgICAgdGhpcy5sb2dpblBhZ2VDb25maWcucGFzc3dvcmRGaWVsZD8ucGxhY2Vob2xkZXIgfHxcbiAgICAgICAgJ0VudHJlciB2b3RyZSBtb3QgZGUgcGFzc2UnLFxuICAgICAgdHlwZTpcbiAgICAgICAgdGhpcy5sb2dpblBhZ2VDb25maWcucGFzc3dvcmRGaWVsZD8udHlwZSB8fCBGb3JtSW5wdXRUeXBlRW51bS5QQVNTV09SRCxcbiAgICAgIC4uLnRoaXMubG9naW5QYWdlQ29uZmlnLnBhc3N3b3JkRmllbGQsXG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemUgYnV0dG9uQ29uZmlnXG4gICAgdGhpcy5sb2dpblBhZ2VDb25maWcuYnV0dG9uQ29uZmlnID0ge1xuICAgICAgbGFiZWw6IHRoaXMubG9naW5QYWdlQ29uZmlnLmJ1dHRvbkNvbmZpZz8ubGFiZWwgfHwgJ0xvZ2luJyxcbiAgICAgIHR5cGU6IHRoaXMubG9naW5QYWdlQ29uZmlnLmJ1dHRvbkNvbmZpZz8udHlwZSB8fCAnc3VibWl0JyxcbiAgICAgIGljb246IHRoaXMubG9naW5QYWdlQ29uZmlnLmJ1dHRvbkNvbmZpZz8uaWNvbiB8fCAncGkgcGktc2lnbi1pbicsXG4gICAgICBpY29uUG9zOiB0aGlzLmxvZ2luUGFnZUNvbmZpZy5idXR0b25Db25maWc/Lmljb25Qb3MgfHwgJ2xlZnQnLFxuICAgICAgc3R5bGVDbGFzczpcbiAgICAgICAgdGhpcy5sb2dpblBhZ2VDb25maWcuYnV0dG9uQ29uZmlnPy5zdHlsZUNsYXNzIHx8ICdwLWJ1dHRvbi1zdWNjZXNzJyxcbiAgICAgIGRpc2FibGVkOiB0aGlzLmxvZ2luUGFnZUNvbmZpZy5idXR0b25Db25maWc/LmRpc2FibGVkID8/IHRydWUsXG4gICAgICB3aWR0aDogdGhpcy5sb2dpblBhZ2VDb25maWcuYnV0dG9uQ29uZmlnPy53aWR0aCA/PyAnMTAwJScsXG4gICAgICAuLi50aGlzLmxvZ2luUGFnZUNvbmZpZy5idXR0b25Db25maWcsXG4gICAgfTtcbiAgfVxuXG4gIG9uU3VibWl0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZvcm1Hcm91cC52YWxpZCkge1xuICAgICAgdGhpcy5sb2dpblN1Ym1pdC5lbWl0KHRoaXMuZm9ybUdyb3VwLnZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2dpblBhZ2VDb25maWcubG9naW4hLmVycm9yTWVzc2FnZSA9XG4gICAgICAgIHRoaXMubG9naW5QYWdlQ29uZmlnLmxvZ2luPy5lbXB0eUZpZWxkc0Vycm9yTWVzc2FnZTtcbiAgICB9XG4gIH1cblxuICAvLyBTZXR1cCBmb3JtIGZpZWxkcyB1c2luZyB0aGUgdXNlcm5hbWVGaWVsZCBhbmQgcGFzc3dvcmRGaWVsZCBmcm9tIExvZ2luUGFnZUNvbmZpZ1xuICBzZXR1cEZvcm1GaWVsZHMoKSB7XG4gICAgY29uc3QgdXNlcm5hbWVWYWxpZGF0b3JzID0gdGhpcy5sb2dpblBhZ2VDb25maWcudXNlcm5hbWVGaWVsZD8ucmVxdWlyZWRcbiAgICAgID8gW1ZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgICA6IFtdO1xuICAgIGNvbnN0IHBhc3N3b3JkVmFsaWRhdG9ycyA9IHRoaXMubG9naW5QYWdlQ29uZmlnLnBhc3N3b3JkRmllbGQ/LnJlcXVpcmVkXG4gICAgICA/IFtWYWxpZGF0b3JzLnJlcXVpcmVkXVxuICAgICAgOiBbXTtcblxuICAgIHRoaXMuZm9ybUdyb3VwLmFkZENvbnRyb2woXG4gICAgICB0aGlzLmxvZ2luUGFnZUNvbmZpZy51c2VybmFtZUZpZWxkIS5uYW1lLFxuICAgICAgdGhpcy5mYi5jb250cm9sKHRoaXMubG9naW5QYWdlQ29uZmlnLmxvZ2luPy51c2VybmFtZSwgdXNlcm5hbWVWYWxpZGF0b3JzKVxuICAgICk7XG4gICAgdGhpcy5mb3JtR3JvdXAuYWRkQ29udHJvbChcbiAgICAgIHRoaXMubG9naW5QYWdlQ29uZmlnLnBhc3N3b3JkRmllbGQhLm5hbWUsXG4gICAgICB0aGlzLmZiLmNvbnRyb2wodGhpcy5sb2dpblBhZ2VDb25maWcubG9naW4/LnBhc3N3b3JkLCBwYXNzd29yZFZhbGlkYXRvcnMpXG4gICAgKTtcbiAgfVxufVxuIiwiPHB0LWNhcmQgW2NvbmZpZ109XCJsb2dpblBhZ2VDb25maWcubG9naW5DYXJkQ29uZmlnIVwiPlxuICA8IS0tIExvZ28gLS0+XG4gIDxkaXYgY2xhc3M9XCJsb2dvLWNvbnRhaW5lclwiICpuZ0lmPVwibG9naW5QYWdlQ29uZmlnLmxvZ29Vcmw/LmltYWdlVXJsXCI+XG4gICAgPGltZ1xuICAgICAgW3NyY109XCJsb2dpblBhZ2VDb25maWcubG9nb1VybD8uaW1hZ2VVcmxcIlxuICAgICAgW2FsdF09XCJsb2dpblBhZ2VDb25maWcubG9nb1VybD8uYWx0VGV4dCB8fCAnTG9nbydcIlxuICAgICAgW3N0eWxlLndpZHRoXT1cImxvZ2luUGFnZUNvbmZpZy5sb2dvVXJsPy53aWR0aCB8fCAnMTAwcHgnXCJcbiAgICAgIFtzdHlsZS5oZWlnaHRdPVwibG9naW5QYWdlQ29uZmlnLmxvZ29Vcmw/LmhlaWdodCB8fCAnYXV0bydcIlxuICAgIC8+XG4gIDwvZGl2PlxuXG4gIDwhLS0gVGl0bGUgLS0+XG4gIDxkaXYgY2xhc3M9XCJ0aXRsZS1jb250YWluZXJcIj5cbiAgICA8aDFcbiAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgY29sb3I6IGxvZ2luUGFnZUNvbmZpZy50aXRsZT8uY29sb3IgfHwgJyMzMzMnLFxuICAgICAgICAnZm9udC1zaXplJzogbG9naW5QYWdlQ29uZmlnLnRpdGxlPy5mb250U2l6ZSB8fCAnMjRweCdcbiAgICAgIH1cIlxuICAgID5cbiAgICAgIHt7IGxvZ2luUGFnZUNvbmZpZy50aXRsZT8udGV4dCB8fCBcIkRlZmF1bHQgVGl0bGVcIiB9fVxuICAgIDwvaDE+XG4gIDwvZGl2PlxuICA8IS0tIEVycm9yIE1lc3NhZ2UgLS0+XG4gIDxkaXYgKm5nSWY9XCJsb2dpbkVycm9yTWVzc2FnZVwiIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPlxuICAgIHt7IGxvZ2luRXJyb3JNZXNzYWdlIH19XG4gIDwvZGl2PlxuICA8IS0tIEZvcm0gLS0+XG4gIDxmb3JtIGNsYXNzPVwiZm9ybS1jb250YWluZXJcIiBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdCgpXCI+XG4gICAgPGRpdiAqbmdJZj1cImxvZ2luUGFnZUNvbmZpZy5sb2dpbj8uZXJyb3JNZXNzYWdlXCIgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+XG4gICAgICB7eyBsb2dpblBhZ2VDb25maWcubG9naW4/LmVycm9yTWVzc2FnZSB9fVxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImZpZWxkXCI+XG4gICAgICA8cHQtdGV4dC1pbnB1dFxuICAgICAgICBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiXG4gICAgICAgIFtmb3JtRmllbGRdPVwibG9naW5QYWdlQ29uZmlnLnVzZXJuYW1lRmllbGQhXCJcbiAgICAgID48L3B0LXRleHQtaW5wdXQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZpZWxkXCI+XG4gICAgICA8cHQtdGV4dC1pbnB1dFxuICAgICAgICBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiXG4gICAgICAgIFtmb3JtRmllbGRdPVwibG9naW5QYWdlQ29uZmlnLnBhc3N3b3JkRmllbGQhXCJcbiAgICAgID48L3B0LXRleHQtaW5wdXQ+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwic3VibWl0LWJ0blwiPlxuICAgICAgPHB0LWJ1dHRvbiBbYnV0dG9uQ29uZmlnXT1cImxvZ2luUGFnZUNvbmZpZy5idXR0b25Db25maWchXCI+PC9wdC1idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZm9ybT5cbiAgPGRpdiBjbGFzcz1cImxvZ2luLWZvb3RlclwiPlxuICAgIHt7IGxvZ2luUGFnZUNvbmZpZy5mb290ZXI/LnZlcnNpb24gfX1cbiAgICA8c3Bhbj57eyBsb2dpblBhZ2VDb25maWcuZm9vdGVyPy5jb3B5cmlnaHQgfX08L3NwYW4+XG4gIDwvZGl2PlxuPC9wdC1jYXJkPlxuIl19