UNPKG

@edugouvfr/ngx-dsfr

Version:

NgxDsfr est un portage Angular des éléments d'interface du Système de Design de l'État Français (DSFR).

61 lines 21.7 kB
import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "../../../shared"; import * as i2 from "@angular/common"; import * as i3 from "@angular/forms"; import * as i4 from "../../link/link.component"; import * as i5 from "./consent-service/consent-service.component"; export const CONSENT_MODAL_ID = 'consent-modal-id'; export class ConsentManagerComponent { constructor(i18n) { this.i18n = i18n; /** Confirmation de la personnalisation des finalités. */ this.confirmSelect = new EventEmitter(); /** Changement selection accept/refuse d'une finalité ou sous-finalité. */ this.finalityChange = new EventEmitter(); /** @since 1.7 Signale quand la route rgdp est sélectionnée. */ this.rgpdRouteSelect = new EventEmitter(); } ngOnInit() { this.acceptAll = undefined; this.modalId = CONSENT_MODAL_ID; this.titleId = this.modalId + '-title'; } /** * Changemennt selection accept/refuse d'une finalité ou sous-finalité * @param finality */ onFinalityChange(finality) { this.finalityChange.emit(finality); } /** * Confirmation de la sélection */ onConfirm() { this.confirmSelect.emit(this.finalities); } /** @since 1.7 */ onRgpdSelect() { // Signale quand la route rgdp est sélectionnée const route = this.rgpdNavigation.route; if (route) this.rgpdRouteSelect.emit(route); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ConsentManagerComponent, deps: [{ token: i1.I18nService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ConsentManagerComponent, selector: "edu-consent-manager", inputs: { rgpdNavigation: "rgpdNavigation", finalities: "finalities" }, outputs: { confirmSelect: "confirmSelect", finalityChange: "finalityChange", rgpdRouteSelect: "rgpdRouteSelect" }, ngImport: i0, template: "<dialog [id]=\"modalId\" class=\"fr-modal\" role=\"dialog\" [attr.aria-labelledby]=\"titleId\">\n <div class=\"fr-container fr-container--fluid fr-container-md\">\n <div class=\"fr-grid-row fr-grid-row--center\">\n <div class=\"fr-col-12 fr-col-md-10 fr-col-lg-8\">\n <div class=\"fr-modal__body\">\n <div class=\"fr-modal__header\">\n <button\n type=\"button\"\n class=\"fr-btn--close fr-btn\"\n [attr.aria-controls]=\"modalId\"\n [attr.aria-label]=\"i18n.t('modal.ariaLabel')\">\n {{ i18n.t('commons.close') }}\n </button>\n </div>\n <div class=\"fr-modal__content\">\n <h1 [id]=\"titleId\" class=\"fr-modal__title\">{{ i18n.t('consent.manager.title') }}</h1>\n <!-- BUG: Classe 'fr-consent-manager' inconnue en DSFR 1.9.3 -->\n <div class=\"fr-consent-manager\">\n <!-- Finalit\u00E9s -->\n <div class=\"fr-consent-service fr-consent-manager__header\">\n <fieldset class=\"fr-fieldset\">\n <legend id=\"finality-legend\" class=\"fr-consent-service__title\">\n {{ i18n.t('consent.manager.preferences') }}\n <dsfr-link\n [link]=\"rgpdNavigation.link ?? ''\"\n [linkTarget]=\"rgpdNavigation.linkTarget\"\n [route]=\"rgpdNavigation.route ?? ''\"\n [routePath]=\"rgpdNavigation.routerLink ?? ''\"\n [routerLinkActive]=\"rgpdNavigation.routerLinkActive ?? ''\"\n [routerLinkExtras]=\"rgpdNavigation.routerLinkExtras\"\n [label]=\"i18n.t('consent.manager.personalData')\"\n (linkSelect)=\"onRgpdSelect()\"></dsfr-link>\n </legend>\n <div class=\"fr-consent-service__radios\">\n <div class=\"fr-radio-group\">\n <input\n [(ngModel)]=\"acceptAll\"\n [value]=\"true\"\n type=\"radio\"\n id=\"consent-all-accept\"\n name=\"consent-all\" />\n <label class=\"fr-label\" for=\"consent-all-accept\"> {{ i18n.t('consent.acceptAll') }} </label>\n </div>\n <div class=\"fr-radio-group\">\n <input\n [(ngModel)]=\"acceptAll\"\n [value]=\"false\"\n type=\"radio\"\n id=\"consent-all-refuse\"\n name=\"refuse-all\" />\n <label class=\"fr-label\" for=\"consent-all-refuse\"> {{ i18n.t('consent.refuseAll') }} </label>\n </div>\n </div>\n </fieldset>\n </div>\n\n <edu-consent-service\n *ngFor=\"let finality of finalities; let i = index\"\n [finality]=\"finality\"\n [idxFinality]=\"i\"\n [acceptAll]=\"acceptAll\"\n (finalityChange)=\"onFinalityChange(finality)\"></edu-consent-service>\n\n <!-- Bouton de confirmation/fermeture -->\n <ul class=\"fr-consent-manager__buttons fr-btns-group fr-btns-group--right fr-btns-group--inline-sm\">\n <li>\n <button type=\"button\" (click)=\"onConfirm()\" [attr.aria-controls]=\"modalId\" class=\"fr-btn\">\n {{ i18n.t('consent.manager.confirmChoices') }}\n </button>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</dialog>\n", dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { 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.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { 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"] }, { kind: "component", type: i4.DsfrLinkComponent, selector: "dsfr-link", inputs: ["ariaCurrent", "ariaLabel", "ariaControls", "customClass", "disabled", "icon", "iconPosition", "linkId", "label", "link", "linkTarget", "route", "routePath", "routerLinkActive", "routerLinkActiveOptions", "routerLinkExtras", "size", "tooltipMessage", "mode", "targetLink", "routerLink"], outputs: ["linkSelect"] }, { kind: "component", type: i5.ConsentServiceComponent, selector: "edu-consent-service", inputs: ["finality", "idxFinality", "acceptAll"], outputs: ["finalityChange"] }], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ConsentManagerComponent, decorators: [{ type: Component, args: [{ selector: 'edu-consent-manager', encapsulation: ViewEncapsulation.None, template: "<dialog [id]=\"modalId\" class=\"fr-modal\" role=\"dialog\" [attr.aria-labelledby]=\"titleId\">\n <div class=\"fr-container fr-container--fluid fr-container-md\">\n <div class=\"fr-grid-row fr-grid-row--center\">\n <div class=\"fr-col-12 fr-col-md-10 fr-col-lg-8\">\n <div class=\"fr-modal__body\">\n <div class=\"fr-modal__header\">\n <button\n type=\"button\"\n class=\"fr-btn--close fr-btn\"\n [attr.aria-controls]=\"modalId\"\n [attr.aria-label]=\"i18n.t('modal.ariaLabel')\">\n {{ i18n.t('commons.close') }}\n </button>\n </div>\n <div class=\"fr-modal__content\">\n <h1 [id]=\"titleId\" class=\"fr-modal__title\">{{ i18n.t('consent.manager.title') }}</h1>\n <!-- BUG: Classe 'fr-consent-manager' inconnue en DSFR 1.9.3 -->\n <div class=\"fr-consent-manager\">\n <!-- Finalit\u00E9s -->\n <div class=\"fr-consent-service fr-consent-manager__header\">\n <fieldset class=\"fr-fieldset\">\n <legend id=\"finality-legend\" class=\"fr-consent-service__title\">\n {{ i18n.t('consent.manager.preferences') }}\n <dsfr-link\n [link]=\"rgpdNavigation.link ?? ''\"\n [linkTarget]=\"rgpdNavigation.linkTarget\"\n [route]=\"rgpdNavigation.route ?? ''\"\n [routePath]=\"rgpdNavigation.routerLink ?? ''\"\n [routerLinkActive]=\"rgpdNavigation.routerLinkActive ?? ''\"\n [routerLinkExtras]=\"rgpdNavigation.routerLinkExtras\"\n [label]=\"i18n.t('consent.manager.personalData')\"\n (linkSelect)=\"onRgpdSelect()\"></dsfr-link>\n </legend>\n <div class=\"fr-consent-service__radios\">\n <div class=\"fr-radio-group\">\n <input\n [(ngModel)]=\"acceptAll\"\n [value]=\"true\"\n type=\"radio\"\n id=\"consent-all-accept\"\n name=\"consent-all\" />\n <label class=\"fr-label\" for=\"consent-all-accept\"> {{ i18n.t('consent.acceptAll') }} </label>\n </div>\n <div class=\"fr-radio-group\">\n <input\n [(ngModel)]=\"acceptAll\"\n [value]=\"false\"\n type=\"radio\"\n id=\"consent-all-refuse\"\n name=\"refuse-all\" />\n <label class=\"fr-label\" for=\"consent-all-refuse\"> {{ i18n.t('consent.refuseAll') }} </label>\n </div>\n </div>\n </fieldset>\n </div>\n\n <edu-consent-service\n *ngFor=\"let finality of finalities; let i = index\"\n [finality]=\"finality\"\n [idxFinality]=\"i\"\n [acceptAll]=\"acceptAll\"\n (finalityChange)=\"onFinalityChange(finality)\"></edu-consent-service>\n\n <!-- Bouton de confirmation/fermeture -->\n <ul class=\"fr-consent-manager__buttons fr-btns-group fr-btns-group--right fr-btns-group--inline-sm\">\n <li>\n <button type=\"button\" (click)=\"onConfirm()\" [attr.aria-controls]=\"modalId\" class=\"fr-btn\">\n {{ i18n.t('consent.manager.confirmChoices') }}\n </button>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</dialog>\n" }] }], ctorParameters: function () { return [{ type: i1.I18nService }]; }, propDecorators: { rgpdNavigation: [{ type: Input }], finalities: [{ type: Input }], confirmSelect: [{ type: Output }], finalityChange: [{ type: Output }], rgpdRouteSelect: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc2VudC1tYW5hZ2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2NvbnNlbnQtYmFubmVyL2NvbnNlbnQtbWFuYWdlci9jb25zZW50LW1hbmFnZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvY29uc2VudC1iYW5uZXIvY29uc2VudC1tYW5hZ2VyL2NvbnNlbnQtbWFuYWdlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7O0FBSWxHLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDO0FBT25ELE1BQU0sT0FBTyx1QkFBdUI7SUFxQmxDLFlBQW1CLElBQWlCO1FBQWpCLFNBQUksR0FBSixJQUFJLENBQWE7UUFkcEMseURBQXlEO1FBQy9DLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQWtCLENBQUM7UUFFN0QsMEVBQTBFO1FBQ2hFLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQWdCLENBQUM7UUFFNUQsK0RBQStEO1FBQ3JELG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztJQU9oQixDQUFDO0lBRXhDLFFBQVE7UUFDTixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsT0FBTyxHQUFHLGdCQUFnQixDQUFDO1FBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7T0FHRztJQUNILGdCQUFnQixDQUFDLFFBQXNCO1FBQ3JDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVM7UUFDUCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELGlCQUFpQjtJQUNqQixZQUFZO1FBQ1YsK0NBQStDO1FBQy9DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO1FBQ3hDLElBQUksS0FBSztZQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlDLENBQUM7K0dBakRVLHVCQUF1QjttR0FBdkIsdUJBQXVCLHNQQ1hwQyx1dUhBOEVBOzs0RkRuRWEsdUJBQXVCO2tCQUxuQyxTQUFTOytCQUNFLHFCQUFxQixpQkFFaEIsaUJBQWlCLENBQUMsSUFBSTtrR0FJNUIsY0FBYztzQkFBdEIsS0FBSztnQkFHRyxVQUFVO3NCQUFsQixLQUFLO2dCQUdJLGFBQWE7c0JBQXRCLE1BQU07Z0JBR0csY0FBYztzQkFBdkIsTUFBTTtnQkFHRyxlQUFlO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERzZnJOYXZpZ2F0aW9uLCBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBEc2ZyRmluYWxpdHkgfSBmcm9tICcuLi9jb25zZW50LWJhbm5lci5tb2RlbCc7XG5cbmV4cG9ydCBjb25zdCBDT05TRU5UX01PREFMX0lEID0gJ2NvbnNlbnQtbW9kYWwtaWQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdlZHUtY29uc2VudC1tYW5hZ2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbnNlbnQtbWFuYWdlci5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIENvbnNlbnRNYW5hZ2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgLyoqIFVSTCBkZSBwcsOpc2VudGF0aW9uIGRlcyBkb25uw6llcyBwZXJzb25uZWxsZXMuICovXG4gIEBJbnB1dCgpIHJncGROYXZpZ2F0aW9uOiBEc2ZyTmF2aWdhdGlvbjtcblxuICAvKiogTW9kw6hsZSBkZSBwcsOpc2VudGF0aW9uIDogbGlzdGUgZGUgZmluYWxpdMOpcy4gKi9cbiAgQElucHV0KCkgZmluYWxpdGllczogRHNmckZpbmFsaXR5W107XG5cbiAgLyoqIENvbmZpcm1hdGlvbiBkZSBsYSBwZXJzb25uYWxpc2F0aW9uIGRlcyBmaW5hbGl0w6lzLiAqL1xuICBAT3V0cHV0KCkgY29uZmlybVNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8RHNmckZpbmFsaXR5W10+KCk7XG5cbiAgLyoqIENoYW5nZW1lbnQgc2VsZWN0aW9uIGFjY2VwdC9yZWZ1c2UgZCd1bmUgZmluYWxpdMOpIG91IHNvdXMtZmluYWxpdMOpLiAqL1xuICBAT3V0cHV0KCkgZmluYWxpdHlDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERzZnJGaW5hbGl0eT4oKTtcblxuICAvKiogQHNpbmNlIDEuNyBTaWduYWxlIHF1YW5kIGxhIHJvdXRlIHJnZHAgZXN0IHPDqWxlY3Rpb25uw6llLiAqL1xuICBAT3V0cHV0KCkgcmdwZFJvdXRlU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLyoqIGludGVybmFsICovIG1vZGFsSWQ6IHN0cmluZztcbiAgLyoqIGludGVybmFsICovIHRpdGxlSWQ6IHN0cmluZztcblxuICBhY2NlcHRBbGw6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGkxOG46IEkxOG5TZXJ2aWNlKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYWNjZXB0QWxsID0gdW5kZWZpbmVkO1xuICAgIHRoaXMubW9kYWxJZCA9IENPTlNFTlRfTU9EQUxfSUQ7XG4gICAgdGhpcy50aXRsZUlkID0gdGhpcy5tb2RhbElkICsgJy10aXRsZSc7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlbWVubnQgc2VsZWN0aW9uIGFjY2VwdC9yZWZ1c2UgZCd1bmUgZmluYWxpdMOpIG91IHNvdXMtZmluYWxpdMOpXG4gICAqIEBwYXJhbSBmaW5hbGl0eVxuICAgKi9cbiAgb25GaW5hbGl0eUNoYW5nZShmaW5hbGl0eTogRHNmckZpbmFsaXR5KTogdm9pZCB7XG4gICAgdGhpcy5maW5hbGl0eUNoYW5nZS5lbWl0KGZpbmFsaXR5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maXJtYXRpb24gZGUgbGEgc8OpbGVjdGlvblxuICAgKi9cbiAgb25Db25maXJtKCk6IHZvaWQge1xuICAgIHRoaXMuY29uZmlybVNlbGVjdC5lbWl0KHRoaXMuZmluYWxpdGllcyk7XG4gIH1cblxuICAvKiogQHNpbmNlIDEuNyAqL1xuICBvblJncGRTZWxlY3QoKTogdm9pZCB7XG4gICAgLy8gU2lnbmFsZSBxdWFuZCBsYSByb3V0ZSByZ2RwIGVzdCBzw6lsZWN0aW9ubsOpZVxuICAgIGNvbnN0IHJvdXRlID0gdGhpcy5yZ3BkTmF2aWdhdGlvbi5yb3V0ZTtcbiAgICBpZiAocm91dGUpIHRoaXMucmdwZFJvdXRlU2VsZWN0LmVtaXQocm91dGUpO1xuICB9XG59XG4iLCI8ZGlhbG9nIFtpZF09XCJtb2RhbElkXCIgY2xhc3M9XCJmci1tb2RhbFwiIHJvbGU9XCJkaWFsb2dcIiBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwidGl0bGVJZFwiPlxuICA8ZGl2IGNsYXNzPVwiZnItY29udGFpbmVyIGZyLWNvbnRhaW5lci0tZmx1aWQgZnItY29udGFpbmVyLW1kXCI+XG4gICAgPGRpdiBjbGFzcz1cImZyLWdyaWQtcm93IGZyLWdyaWQtcm93LS1jZW50ZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmci1jb2wtMTIgZnItY29sLW1kLTEwIGZyLWNvbC1sZy04XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmci1tb2RhbF9fYm9keVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmci1tb2RhbF9faGVhZGVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImZyLWJ0bi0tY2xvc2UgZnItYnRuXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJtb2RhbElkXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJpMThuLnQoJ21vZGFsLmFyaWFMYWJlbCcpXCI+XG4gICAgICAgICAgICAgIHt7IGkxOG4udCgnY29tbW9ucy5jbG9zZScpIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnItbW9kYWxfX2NvbnRlbnRcIj5cbiAgICAgICAgICAgIDxoMSBbaWRdPVwidGl0bGVJZFwiIGNsYXNzPVwiZnItbW9kYWxfX3RpdGxlXCI+e3sgaTE4bi50KCdjb25zZW50Lm1hbmFnZXIudGl0bGUnKSB9fTwvaDE+XG4gICAgICAgICAgICA8IS0tIEJVRzogQ2xhc3NlICdmci1jb25zZW50LW1hbmFnZXInIGluY29ubnVlIGVuIERTRlIgMS45LjMgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnItY29uc2VudC1tYW5hZ2VyXCI+XG4gICAgICAgICAgICAgIDwhLS0gRmluYWxpdMOpcyAtLT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZyLWNvbnNlbnQtc2VydmljZSBmci1jb25zZW50LW1hbmFnZXJfX2hlYWRlclwiPlxuICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz1cImZyLWZpZWxkc2V0XCI+XG4gICAgICAgICAgICAgICAgICA8bGVnZW5kIGlkPVwiZmluYWxpdHktbGVnZW5kXCIgY2xhc3M9XCJmci1jb25zZW50LXNlcnZpY2VfX3RpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGkxOG4udCgnY29uc2VudC5tYW5hZ2VyLnByZWZlcmVuY2VzJykgfX1cbiAgICAgICAgICAgICAgICAgICAgPGRzZnItbGlua1xuICAgICAgICAgICAgICAgICAgICAgIFtsaW5rXT1cInJncGROYXZpZ2F0aW9uLmxpbmsgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgICAgIFtsaW5rVGFyZ2V0XT1cInJncGROYXZpZ2F0aW9uLmxpbmtUYXJnZXRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtyb3V0ZV09XCJyZ3BkTmF2aWdhdGlvbi5yb3V0ZSA/PyAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW3JvdXRlUGF0aF09XCJyZ3BkTmF2aWdhdGlvbi5yb3V0ZXJMaW5rID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua0FjdGl2ZV09XCJyZ3BkTmF2aWdhdGlvbi5yb3V0ZXJMaW5rQWN0aXZlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua0V4dHJhc109XCJyZ3BkTmF2aWdhdGlvbi5yb3V0ZXJMaW5rRXh0cmFzXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiaTE4bi50KCdjb25zZW50Lm1hbmFnZXIucGVyc29uYWxEYXRhJylcIlxuICAgICAgICAgICAgICAgICAgICAgIChsaW5rU2VsZWN0KT1cIm9uUmdwZFNlbGVjdCgpXCI+PC9kc2ZyLWxpbms+XG4gICAgICAgICAgICAgICAgICA8L2xlZ2VuZD5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmci1jb25zZW50LXNlcnZpY2VfX3JhZGlvc1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnItcmFkaW8tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYWNjZXB0QWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJyYWRpb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cImNvbnNlbnQtYWxsLWFjY2VwdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiY29uc2VudC1hbGxcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZyLWxhYmVsXCIgZm9yPVwiY29uc2VudC1hbGwtYWNjZXB0XCI+IHt7IGkxOG4udCgnY29uc2VudC5hY2NlcHRBbGwnKSB9fSA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZyLXJhZGlvLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImFjY2VwdEFsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiY29uc2VudC1hbGwtcmVmdXNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJyZWZ1c2UtYWxsXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmci1sYWJlbFwiIGZvcj1cImNvbnNlbnQtYWxsLXJlZnVzZVwiPiB7eyBpMThuLnQoJ2NvbnNlbnQucmVmdXNlQWxsJykgfX0gPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZWR1LWNvbnNlbnQtc2VydmljZVxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBmaW5hbGl0eSBvZiBmaW5hbGl0aWVzOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICBbZmluYWxpdHldPVwiZmluYWxpdHlcIlxuICAgICAgICAgICAgICAgIFtpZHhGaW5hbGl0eV09XCJpXCJcbiAgICAgICAgICAgICAgICBbYWNjZXB0QWxsXT1cImFjY2VwdEFsbFwiXG4gICAgICAgICAgICAgICAgKGZpbmFsaXR5Q2hhbmdlKT1cIm9uRmluYWxpdHlDaGFuZ2UoZmluYWxpdHkpXCI+PC9lZHUtY29uc2VudC1zZXJ2aWNlPlxuXG4gICAgICAgICAgICAgIDwhLS0gQm91dG9uIGRlIGNvbmZpcm1hdGlvbi9mZXJtZXR1cmUgLS0+XG4gICAgICAgICAgICAgIDx1bCBjbGFzcz1cImZyLWNvbnNlbnQtbWFuYWdlcl9fYnV0dG9ucyBmci1idG5zLWdyb3VwIGZyLWJ0bnMtZ3JvdXAtLXJpZ2h0IGZyLWJ0bnMtZ3JvdXAtLWlubGluZS1zbVwiPlxuICAgICAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkNvbmZpcm0oKVwiIFthdHRyLmFyaWEtY29udHJvbHNdPVwibW9kYWxJZFwiIGNsYXNzPVwiZnItYnRuXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGkxOG4udCgnY29uc2VudC5tYW5hZ2VyLmNvbmZpcm1DaG9pY2VzJykgfX1cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2RpYWxvZz5cbiJdfQ==