@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).
79 lines • 27.3 kB
JavaScript
import { CommonModule } from '@angular/common';
import { afterNextRender, Component, contentChildren, effect, ElementRef, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { DsfrFormEmailComponent } from '../../forms/form-email';
import { DomUtils, DsfrHeadingLevelConst, DsfrI18nPipe } from '../../shared';
import { DsfrFollowLinkComponent } from './follow-link/follow-link.component';
import { DsfrFollowTypeConst } from './follow.model';
import * as i0 from "@angular/core";
import * as i1 from "../../shared";
import * as i2 from "@angular/common";
export class DsfrFollowComponent {
/** @internal */
constructor(i18n, _elementRef) {
this.i18n = i18n;
this._elementRef = _elementRef;
/**
* Niveau du titre, h2 par défaut
*/
this.headingLevel = DsfrHeadingLevelConst.H2;
/** Description (pour certains types seulement) optionnelle. */
this.description = '';
/** Email par défaut. */
this.email = '';
/** Message d'erreur concernant l'email. */
this.emailError = '';
/** Indique que l'inscription a bien été prise en compte. */
this.registered = false;
/** Type du composant, réseaux sociaux seuls par défaut */
this.type = DsfrFollowTypeConst.NETWORKS;
/** Abonnement si l'adresse est valide. */
this.subscribe = new EventEmitter();
/* Tous les types possibles du composant. */
/** @internal */ this.followType = DsfrFollowTypeConst;
this.followLinksElements = contentChildren(DsfrFollowLinkComponent, { read: ElementRef });
this.type = DsfrFollowTypeConst.NETWORKS;
/* fixme : angular17 + angular 18 sera appelé a la fois dans effect et dans afterNextRender a l'init
mais seulement dans le afterNextRender() en angular 19. Voir pour remplacer par afterRenderEffect en 19 */
effect(() => {
this.surroundLinksWithLi();
});
afterNextRender(() => {
this.surroundLinksWithLi();
});
}
/** @internal */
onSubscribe(email) {
if (this.emailComponent?.isValid()) {
this.subscribe.emit(email);
}
}
/* Entoure chaque composant follow par une balise <li> si nécessaire */
surroundLinksWithLi() {
DomUtils.surroundElementsWithLi(this._elementRef, this.followLinksElements());
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrFollowComponent, deps: [{ token: i1.DsfrI18nService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DsfrFollowComponent, isStandalone: true, selector: "dsfr-follow", inputs: { headingLevel: "headingLevel", description: "description", email: "email", emailError: "emailError", registered: "registered", type: "type" }, outputs: { subscribe: "subscribe" }, queries: [{ propertyName: "followLinksElements", predicate: DsfrFollowLinkComponent, read: ElementRef, isSignal: true }], viewQueries: [{ propertyName: "emailComponent", first: true, predicate: DsfrFormEmailComponent, descendants: true }], ngImport: i0, template: "<div class=\"fr-follow\">\n <div class=\"fr-container\">\n <div class=\"fr-grid-row\">\n @switch (type) {\n @case (followType.NETWORKS) {\n <div class=\"fr-col-12\">\n <ng-container [ngTemplateOutlet]=\"networksTemplate\"></ng-container>\n </div>\n }\n @case (followType.NEWSLETTER) {\n <div class=\"fr-col-12\">\n <ng-container [ngTemplateOutlet]=\"newsletterTemplate\"></ng-container>\n </div>\n }\n @case (followType.NEWSLETTER_MAIL) {\n <div class=\"fr-col-12\">\n <ng-container [ngTemplateOutlet]=\"newsletterWithMailTemplate\"></ng-container>\n </div>\n }\n @case (followType.NEWSLETTER_NETWORKS) {\n <ng-container [ngTemplateOutlet]=\"newsletterAndNetworksTemplate\"></ng-container>\n }\n @case (followType.NEWSLETTER_NETWORKS_MAIL) {\n <ng-container [ngTemplateOutlet]=\"networksAndNewsletterWithMailTemplate\"></ng-container>\n }\n }\n </div>\n </div>\n</div>\n\n<!-- R\u00E9seaux sociaux seuls -->\n<ng-template #networksTemplate>\n <div class=\"fr-follow__social\">\n <ng-container\n [ngTemplateOutlet]=\"heading\"\n [ngTemplateOutletContext]=\"{ heading: 'follow.networks.heading' | dsfrI18n }\"></ng-container>\n <ul class=\"fr-btns-group\">\n <ng-content></ng-content>\n </ul>\n </div>\n</ng-template>\n\n<!-- Lettre d'info seule -->\n<ng-template #newsletterTemplate>\n <div class=\"fr-follow__newsletter\">\n <div>\n <ng-container\n [ngTemplateOutlet]=\"heading\"\n [ngTemplateOutletContext]=\"{ heading: 'follow.newsletter.heading' | dsfrI18n }\"></ng-container>\n @if (description) {\n <p class=\"fr-text--sm\" [innerHTML]=\"description\"></p>\n }\n </div>\n <div>\n <ul class=\"fr-btns-group fr-btns-group--inline-md\">\n <li>\n <button type=\"button\" class=\"fr-btn\" [title]=\"'follow.newsletter.button.title' | dsfrI18n\">\n {{ 'follow.newsletter.button.label' | dsfrI18n }}\n </button>\n </li>\n </ul>\n </div>\n </div>\n</ng-template>\n\n<!-- Lettre d'info seule avec formulaire -->\n<ng-template #newsletterWithMailTemplate>\n <div class=\"fr-follow__newsletter\">\n <div>\n <ng-container\n [ngTemplateOutlet]=\"heading\"\n [ngTemplateOutletContext]=\"{ heading: 'follow.newsletter.heading' }\"></ng-container>\n @if (description) {\n <p class=\"fr-text--sm\" [innerHTML]=\"description\"></p>\n }\n </div>\n <div>\n @if (registered) {\n <div class=\"fr-alert fr-alert--success\">\n <p>{{ 'follow.newsletter.registration.success' | dsfrI18n }}</p>\n </div>\n } @else {\n <dsfr-form-email\n [value]=\"email\"\n [buttonLabel]=\"'follow.newsletter.button.label' | dsfrI18n\"\n [buttonTooltipMessage]=\"'follow.newsletter.button.title' | dsfrI18n\"\n buttonType=\"button\"\n [placeholder]=\"'follow.newsletter.input.placeholder' | dsfrI18n\"\n [title]=\"'follow.newsletter.input.placeholder' | dsfrI18n\"\n [error]=\"emailError\"\n (buttonSelect)=\"onSubscribe(email)\"></dsfr-form-email>\n <p class=\"fr-hint-text\" [innerHTML]=\"'follow.newsletter.input.hint' | dsfrI18n\"></p>\n }\n </div>\n </div>\n</ng-template>\n\n<!-- R\u00E9seaux sociaux et Lettre d'info mise en avant -->\n<ng-template #newsletterAndNetworksTemplate>\n <div class=\"fr-col-12 fr-col-md-8\">\n <ng-container *ngTemplateOutlet=\"newsletterTemplate\"></ng-container>\n </div>\n <div class=\"fr-col-12 fr-col-md-4\">\n <ng-container *ngTemplateOutlet=\"networksTemplate\"></ng-container>\n </div>\n</ng-template>\n\n<!-- R\u00E9seaux sociaux et Lettre d'info avec formulaire -->\n<ng-template #networksAndNewsletterWithMailTemplate>\n <div class=\"fr-col-12 fr-col-md-8\">\n <ng-container *ngTemplateOutlet=\"newsletterWithMailTemplate\"></ng-container>\n </div>\n <div class=\"fr-col-12 fr-col-md-4\">\n <ng-container *ngTemplateOutlet=\"networksTemplate\"></ng-container>\n </div>\n</ng-template>\n\n<!-- Heading -->\n<ng-template #heading let-heading=\"heading\">\n @switch (headingLevel) {\n @case ('H3') {\n <h3 class=\"fr-h5\" [innerHtml]=\"heading\"></h3>\n }\n @case ('H4') {\n <h4 class=\"fr-h5\" [innerHtml]=\"heading\"></h4>\n }\n @case ('H5') {\n <h5 class=\"fr-h5\" [innerHtml]=\"heading\"></h5>\n }\n @case ('H6') {\n <h6 class=\"fr-h5\" [innerHtml]=\"heading\"></h6>\n }\n @default {\n <h2 class=\"fr-h5\" [innerHtml]=\"heading\"></h2>\n }\n }\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: DsfrFormEmailComponent, selector: "dsfr-form-email" }, { kind: "pipe", type: DsfrI18nPipe, name: "dsfrI18n" }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrFollowComponent, decorators: [{
type: Component,
args: [{ selector: 'dsfr-follow', encapsulation: ViewEncapsulation.None, standalone: true, imports: [CommonModule, FormsModule, DsfrFormEmailComponent, DsfrI18nPipe], template: "<div class=\"fr-follow\">\n <div class=\"fr-container\">\n <div class=\"fr-grid-row\">\n @switch (type) {\n @case (followType.NETWORKS) {\n <div class=\"fr-col-12\">\n <ng-container [ngTemplateOutlet]=\"networksTemplate\"></ng-container>\n </div>\n }\n @case (followType.NEWSLETTER) {\n <div class=\"fr-col-12\">\n <ng-container [ngTemplateOutlet]=\"newsletterTemplate\"></ng-container>\n </div>\n }\n @case (followType.NEWSLETTER_MAIL) {\n <div class=\"fr-col-12\">\n <ng-container [ngTemplateOutlet]=\"newsletterWithMailTemplate\"></ng-container>\n </div>\n }\n @case (followType.NEWSLETTER_NETWORKS) {\n <ng-container [ngTemplateOutlet]=\"newsletterAndNetworksTemplate\"></ng-container>\n }\n @case (followType.NEWSLETTER_NETWORKS_MAIL) {\n <ng-container [ngTemplateOutlet]=\"networksAndNewsletterWithMailTemplate\"></ng-container>\n }\n }\n </div>\n </div>\n</div>\n\n<!-- R\u00E9seaux sociaux seuls -->\n<ng-template #networksTemplate>\n <div class=\"fr-follow__social\">\n <ng-container\n [ngTemplateOutlet]=\"heading\"\n [ngTemplateOutletContext]=\"{ heading: 'follow.networks.heading' | dsfrI18n }\"></ng-container>\n <ul class=\"fr-btns-group\">\n <ng-content></ng-content>\n </ul>\n </div>\n</ng-template>\n\n<!-- Lettre d'info seule -->\n<ng-template #newsletterTemplate>\n <div class=\"fr-follow__newsletter\">\n <div>\n <ng-container\n [ngTemplateOutlet]=\"heading\"\n [ngTemplateOutletContext]=\"{ heading: 'follow.newsletter.heading' | dsfrI18n }\"></ng-container>\n @if (description) {\n <p class=\"fr-text--sm\" [innerHTML]=\"description\"></p>\n }\n </div>\n <div>\n <ul class=\"fr-btns-group fr-btns-group--inline-md\">\n <li>\n <button type=\"button\" class=\"fr-btn\" [title]=\"'follow.newsletter.button.title' | dsfrI18n\">\n {{ 'follow.newsletter.button.label' | dsfrI18n }}\n </button>\n </li>\n </ul>\n </div>\n </div>\n</ng-template>\n\n<!-- Lettre d'info seule avec formulaire -->\n<ng-template #newsletterWithMailTemplate>\n <div class=\"fr-follow__newsletter\">\n <div>\n <ng-container\n [ngTemplateOutlet]=\"heading\"\n [ngTemplateOutletContext]=\"{ heading: 'follow.newsletter.heading' }\"></ng-container>\n @if (description) {\n <p class=\"fr-text--sm\" [innerHTML]=\"description\"></p>\n }\n </div>\n <div>\n @if (registered) {\n <div class=\"fr-alert fr-alert--success\">\n <p>{{ 'follow.newsletter.registration.success' | dsfrI18n }}</p>\n </div>\n } @else {\n <dsfr-form-email\n [value]=\"email\"\n [buttonLabel]=\"'follow.newsletter.button.label' | dsfrI18n\"\n [buttonTooltipMessage]=\"'follow.newsletter.button.title' | dsfrI18n\"\n buttonType=\"button\"\n [placeholder]=\"'follow.newsletter.input.placeholder' | dsfrI18n\"\n [title]=\"'follow.newsletter.input.placeholder' | dsfrI18n\"\n [error]=\"emailError\"\n (buttonSelect)=\"onSubscribe(email)\"></dsfr-form-email>\n <p class=\"fr-hint-text\" [innerHTML]=\"'follow.newsletter.input.hint' | dsfrI18n\"></p>\n }\n </div>\n </div>\n</ng-template>\n\n<!-- R\u00E9seaux sociaux et Lettre d'info mise en avant -->\n<ng-template #newsletterAndNetworksTemplate>\n <div class=\"fr-col-12 fr-col-md-8\">\n <ng-container *ngTemplateOutlet=\"newsletterTemplate\"></ng-container>\n </div>\n <div class=\"fr-col-12 fr-col-md-4\">\n <ng-container *ngTemplateOutlet=\"networksTemplate\"></ng-container>\n </div>\n</ng-template>\n\n<!-- R\u00E9seaux sociaux et Lettre d'info avec formulaire -->\n<ng-template #networksAndNewsletterWithMailTemplate>\n <div class=\"fr-col-12 fr-col-md-8\">\n <ng-container *ngTemplateOutlet=\"newsletterWithMailTemplate\"></ng-container>\n </div>\n <div class=\"fr-col-12 fr-col-md-4\">\n <ng-container *ngTemplateOutlet=\"networksTemplate\"></ng-container>\n </div>\n</ng-template>\n\n<!-- Heading -->\n<ng-template #heading let-heading=\"heading\">\n @switch (headingLevel) {\n @case ('H3') {\n <h3 class=\"fr-h5\" [innerHtml]=\"heading\"></h3>\n }\n @case ('H4') {\n <h4 class=\"fr-h5\" [innerHtml]=\"heading\"></h4>\n }\n @case ('H5') {\n <h5 class=\"fr-h5\" [innerHtml]=\"heading\"></h5>\n }\n @case ('H6') {\n <h6 class=\"fr-h5\" [innerHtml]=\"heading\"></h6>\n }\n @default {\n <h2 class=\"fr-h5\" [innerHtml]=\"heading\"></h2>\n }\n }\n</ng-template>\n" }]
}], ctorParameters: () => [{ type: i1.DsfrI18nService }, { type: i0.ElementRef }], propDecorators: { emailComponent: [{
type: ViewChild,
args: [DsfrFormEmailComponent]
}], headingLevel: [{
type: Input
}], description: [{
type: Input
}], email: [{
type: Input
}], emailError: [{
type: Input
}], registered: [{
type: Input
}], type: [{
type: Input
}], subscribe: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9sbG93LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2ZvbGxvdy9mb2xsb3cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvZm9sbG93L2ZvbGxvdy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUNMLGVBQWUsRUFDZixTQUFTLEVBQ1QsZUFBZSxFQUNmLE1BQU0sRUFDTixVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFFBQVEsRUFBb0IscUJBQXFCLEVBQUUsWUFBWSxFQUFtQixNQUFNLGNBQWMsQ0FBQztBQUNoSCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM5RSxPQUFPLEVBQWtCLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFTckUsTUFBTSxPQUFPLG1CQUFtQjtJQWdDOUIsZ0JBQWdCO0lBQ2hCLFlBQ1MsSUFBcUIsRUFDcEIsV0FBdUI7UUFEeEIsU0FBSSxHQUFKLElBQUksQ0FBaUI7UUFDcEIsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUEvQmpDOztXQUVHO1FBQ00saUJBQVksR0FBcUIscUJBQXFCLENBQUMsRUFBRSxDQUFDO1FBRW5FLCtEQUErRDtRQUN0RCxnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUUxQix3QkFBd0I7UUFDZixVQUFLLEdBQUcsRUFBRSxDQUFDO1FBRXBCLDJDQUEyQztRQUNsQyxlQUFVLEdBQUcsRUFBRSxDQUFDO1FBRXpCLDREQUE0RDtRQUNuRCxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBRTVCLDJEQUEyRDtRQUNsRCxTQUFJLEdBQW1CLG1CQUFtQixDQUFDLFFBQVEsQ0FBQztRQUU3RCwwQ0FBMEM7UUFDaEMsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFFakQsNENBQTRDO1FBQzVDLGdCQUFnQixDQUFDLGVBQVUsR0FBRyxtQkFBbUIsQ0FBQztRQUUxQyx3QkFBbUIsR0FBRyxlQUFlLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztRQU8zRixJQUFJLENBQUMsSUFBSSxHQUFHLG1CQUFtQixDQUFDLFFBQVEsQ0FBQztRQUV6QzttSEFDMkc7UUFDM0csTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNWLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsZUFBZSxDQUFDLEdBQUcsRUFBRTtZQUNuQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsV0FBVyxDQUFDLEtBQWE7UUFDdkIsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFFRCx1RUFBdUU7SUFDL0QsbUJBQW1CO1FBQ3pCLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUM7SUFDaEYsQ0FBQzsrR0EzRFUsbUJBQW1CO21HQUFuQixtQkFBbUIsd1NBOEJnQix1QkFBdUIsUUFBVSxVQUFVLDZGQTVCOUUsc0JBQXNCLGdEQzVCbkMseW9KQXlJQSwyQ0RqSFksWUFBWSxxTUFBRSxXQUFXLCtCQUFFLHNCQUFzQix1REFBRSxZQUFZOzs0RkFFOUQsbUJBQW1CO2tCQVAvQixTQUFTOytCQUNFLGFBQWEsaUJBRVIsaUJBQWlCLENBQUMsSUFBSSxjQUN6QixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixFQUFFLFlBQVksQ0FBQzs2R0FJdkMsY0FBYztzQkFBaEQsU0FBUzt1QkFBQyxzQkFBc0I7Z0JBS3hCLFlBQVk7c0JBQXBCLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSztnQkFHRyxLQUFLO3NCQUFiLEtBQUs7Z0JBR0csVUFBVTtzQkFBbEIsS0FBSztnQkFHRyxVQUFVO3NCQUFsQixLQUFLO2dCQUdHLElBQUk7c0JBQVosS0FBSztnQkFHSSxTQUFTO3NCQUFsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIGFmdGVyTmV4dFJlbmRlcixcbiAgQ29tcG9uZW50LFxuICBjb250ZW50Q2hpbGRyZW4sXG4gIGVmZmVjdCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRHNmckZvcm1FbWFpbENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2Zvcm1zL2Zvcm0tZW1haWwnO1xuaW1wb3J0IHsgRG9tVXRpbHMsIERzZnJIZWFkaW5nTGV2ZWwsIERzZnJIZWFkaW5nTGV2ZWxDb25zdCwgRHNmckkxOG5QaXBlLCBEc2ZySTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQnO1xuaW1wb3J0IHsgRHNmckZvbGxvd0xpbmtDb21wb25lbnQgfSBmcm9tICcuL2ZvbGxvdy1saW5rL2ZvbGxvdy1saW5rLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEc2ZyRm9sbG93VHlwZSwgRHNmckZvbGxvd1R5cGVDb25zdCB9IGZyb20gJy4vZm9sbG93Lm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZHNmci1mb2xsb3cnLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9sbG93LmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIERzZnJGb3JtRW1haWxDb21wb25lbnQsIERzZnJJMThuUGlwZV0sXG59KVxuZXhwb3J0IGNsYXNzIERzZnJGb2xsb3dDb21wb25lbnQge1xuICAvKiogQGludGVybmFsICovXG4gIEBWaWV3Q2hpbGQoRHNmckZvcm1FbWFpbENvbXBvbmVudCkgZW1haWxDb21wb25lbnQ6IERzZnJGb3JtRW1haWxDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIE5pdmVhdSBkdSB0aXRyZSwgaDIgcGFyIGTDqWZhdXRcbiAgICovXG4gIEBJbnB1dCgpIGhlYWRpbmdMZXZlbDogRHNmckhlYWRpbmdMZXZlbCA9IERzZnJIZWFkaW5nTGV2ZWxDb25zdC5IMjtcblxuICAvKiogRGVzY3JpcHRpb24gKHBvdXIgY2VydGFpbnMgdHlwZXMgc2V1bGVtZW50KSBvcHRpb25uZWxsZS4gKi9cbiAgQElucHV0KCkgZGVzY3JpcHRpb24gPSAnJztcblxuICAvKiogRW1haWwgcGFyIGTDqWZhdXQuICovXG4gIEBJbnB1dCgpIGVtYWlsID0gJyc7XG5cbiAgLyoqIE1lc3NhZ2UgZCdlcnJldXIgY29uY2VybmFudCBsJ2VtYWlsLiAqL1xuICBASW5wdXQoKSBlbWFpbEVycm9yID0gJyc7XG5cbiAgLyoqIEluZGlxdWUgcXVlIGwnaW5zY3JpcHRpb24gYSBiaWVuIMOpdMOpIHByaXNlIGVuIGNvbXB0ZS4gKi9cbiAgQElucHV0KCkgcmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4gIC8qKiBUeXBlIGR1IGNvbXBvc2FudCwgcsOpc2VhdXggc29jaWF1eCBzZXVscyBwYXIgZMOpZmF1dCAgKi9cbiAgQElucHV0KCkgdHlwZTogRHNmckZvbGxvd1R5cGUgPSBEc2ZyRm9sbG93VHlwZUNvbnN0Lk5FVFdPUktTO1xuXG4gIC8qKiBBYm9ubmVtZW50IHNpIGwnYWRyZXNzZSBlc3QgdmFsaWRlLiAqL1xuICBAT3V0cHV0KCkgc3Vic2NyaWJlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLyogVG91cyBsZXMgdHlwZXMgcG9zc2libGVzIGR1IGNvbXBvc2FudC4gKi9cbiAgLyoqIEBpbnRlcm5hbCAqLyBmb2xsb3dUeXBlID0gRHNmckZvbGxvd1R5cGVDb25zdDtcblxuICBwcml2YXRlIGZvbGxvd0xpbmtzRWxlbWVudHMgPSBjb250ZW50Q2hpbGRyZW4oRHNmckZvbGxvd0xpbmtDb21wb25lbnQsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcblxuICAvKiogQGludGVybmFsICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBpMThuOiBEc2ZySTE4blNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgKSB7XG4gICAgdGhpcy50eXBlID0gRHNmckZvbGxvd1R5cGVDb25zdC5ORVRXT1JLUztcblxuICAgIC8qIGZpeG1lIDogYW5ndWxhcjE3ICsgYW5ndWxhciAxOCBzZXJhIGFwcGVsw6kgYSBsYSBmb2lzIGRhbnMgZWZmZWN0IGV0IGRhbnMgYWZ0ZXJOZXh0UmVuZGVyIGEgbCdpbml0XG4gICAgIG1haXMgc2V1bGVtZW50IGRhbnMgbGUgYWZ0ZXJOZXh0UmVuZGVyKCkgZW4gYW5ndWxhciAxOS4gVm9pciBwb3VyIHJlbXBsYWNlciBwYXIgYWZ0ZXJSZW5kZXJFZmZlY3QgZW4gMTkgKi9cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdGhpcy5zdXJyb3VuZExpbmtzV2l0aExpKCk7XG4gICAgfSk7XG4gICAgYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHtcbiAgICAgIHRoaXMuc3Vycm91bmRMaW5rc1dpdGhMaSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBvblN1YnNjcmliZShlbWFpbDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuZW1haWxDb21wb25lbnQ/LmlzVmFsaWQoKSkge1xuICAgICAgdGhpcy5zdWJzY3JpYmUuZW1pdChlbWFpbCk7XG4gICAgfVxuICB9XG5cbiAgLyogRW50b3VyZSBjaGFxdWUgY29tcG9zYW50IGZvbGxvdyBwYXIgdW5lIGJhbGlzZSA8bGk+IHNpIG7DqWNlc3NhaXJlICovXG4gIHByaXZhdGUgc3Vycm91bmRMaW5rc1dpdGhMaSgpOiB2b2lkIHtcbiAgICBEb21VdGlscy5zdXJyb3VuZEVsZW1lbnRzV2l0aExpKHRoaXMuX2VsZW1lbnRSZWYsIHRoaXMuZm9sbG93TGlua3NFbGVtZW50cygpKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZyLWZvbGxvd1wiPlxuICA8ZGl2IGNsYXNzPVwiZnItY29udGFpbmVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImZyLWdyaWQtcm93XCI+XG4gICAgICBAc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIEBjYXNlIChmb2xsb3dUeXBlLk5FVFdPUktTKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZyLWNvbC0xMlwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJuZXR3b3Jrc1RlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKGZvbGxvd1R5cGUuTkVXU0xFVFRFUikge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmci1jb2wtMTJcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibmV3c2xldHRlclRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKGZvbGxvd1R5cGUuTkVXU0xFVFRFUl9NQUlMKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZyLWNvbC0xMlwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJuZXdzbGV0dGVyV2l0aE1haWxUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlIChmb2xsb3dUeXBlLk5FV1NMRVRURVJfTkVUV09SS1MpIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm5ld3NsZXR0ZXJBbmROZXR3b3Jrc1RlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKGZvbGxvd1R5cGUuTkVXU0xFVFRFUl9ORVRXT1JLU19NQUlMKSB7XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJuZXR3b3Jrc0FuZE5ld3NsZXR0ZXJXaXRoTWFpbFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPCEtLSBSw6lzZWF1eCBzb2NpYXV4IHNldWxzIC0tPlxuPG5nLXRlbXBsYXRlICNuZXR3b3Jrc1RlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwiZnItZm9sbG93X19zb2NpYWxcIj5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJoZWFkaW5nXCJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGhlYWRpbmc6ICdmb2xsb3cubmV0d29ya3MuaGVhZGluZycgfCBkc2ZySTE4biB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPHVsIGNsYXNzPVwiZnItYnRucy1ncm91cFwiPlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwvdWw+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBMZXR0cmUgZCdpbmZvIHNldWxlIC0tPlxuPG5nLXRlbXBsYXRlICNuZXdzbGV0dGVyVGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJmci1mb2xsb3dfX25ld3NsZXR0ZXJcIj5cbiAgICA8ZGl2PlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJoZWFkaW5nXCJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgaGVhZGluZzogJ2ZvbGxvdy5uZXdzbGV0dGVyLmhlYWRpbmcnIHwgZHNmckkxOG4gfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgQGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgICA8cCBjbGFzcz1cImZyLXRleHQtLXNtXCIgW2lubmVySFRNTF09XCJkZXNjcmlwdGlvblwiPjwvcD5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2PlxuICAgICAgPHVsIGNsYXNzPVwiZnItYnRucy1ncm91cCBmci1idG5zLWdyb3VwLS1pbmxpbmUtbWRcIj5cbiAgICAgICAgPGxpPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZnItYnRuXCIgW3RpdGxlXT1cIidmb2xsb3cubmV3c2xldHRlci5idXR0b24udGl0bGUnIHwgZHNmckkxOG5cIj5cbiAgICAgICAgICAgIHt7ICdmb2xsb3cubmV3c2xldHRlci5idXR0b24ubGFiZWwnIHwgZHNmckkxOG4gfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9saT5cbiAgICAgIDwvdWw+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBMZXR0cmUgZCdpbmZvIHNldWxlIGF2ZWMgZm9ybXVsYWlyZSAtLT5cbjxuZy10ZW1wbGF0ZSAjbmV3c2xldHRlcldpdGhNYWlsVGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJmci1mb2xsb3dfX25ld3NsZXR0ZXJcIj5cbiAgICA8ZGl2PlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJoZWFkaW5nXCJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgaGVhZGluZzogJ2ZvbGxvdy5uZXdzbGV0dGVyLmhlYWRpbmcnIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIEBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgICAgPHAgY2xhc3M9XCJmci10ZXh0LS1zbVwiIFtpbm5lckhUTUxdPVwiZGVzY3JpcHRpb25cIj48L3A+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gICAgPGRpdj5cbiAgICAgIEBpZiAocmVnaXN0ZXJlZCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiZnItYWxlcnQgZnItYWxlcnQtLXN1Y2Nlc3NcIj5cbiAgICAgICAgICA8cD57eyAnZm9sbG93Lm5ld3NsZXR0ZXIucmVnaXN0cmF0aW9uLnN1Y2Nlc3MnIHwgZHNmckkxOG4gfX08L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxkc2ZyLWZvcm0tZW1haWxcbiAgICAgICAgICBbdmFsdWVdPVwiZW1haWxcIlxuICAgICAgICAgIFtidXR0b25MYWJlbF09XCInZm9sbG93Lm5ld3NsZXR0ZXIuYnV0dG9uLmxhYmVsJyB8IGRzZnJJMThuXCJcbiAgICAgICAgICBbYnV0dG9uVG9vbHRpcE1lc3NhZ2VdPVwiJ2ZvbGxvdy5uZXdzbGV0dGVyLmJ1dHRvbi50aXRsZScgfCBkc2ZySTE4blwiXG4gICAgICAgICAgYnV0dG9uVHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidmb2xsb3cubmV3c2xldHRlci5pbnB1dC5wbGFjZWhvbGRlcicgfCBkc2ZySTE4blwiXG4gICAgICAgICAgW3RpdGxlXT1cIidmb2xsb3cubmV3c2xldHRlci5pbnB1dC5wbGFjZWhvbGRlcicgfCBkc2ZySTE4blwiXG4gICAgICAgICAgW2Vycm9yXT1cImVtYWlsRXJyb3JcIlxuICAgICAgICAgIChidXR0b25TZWxlY3QpPVwib25TdWJzY3JpYmUoZW1haWwpXCI+PC9kc2ZyLWZvcm0tZW1haWw+XG4gICAgICAgIDxwIGNsYXNzPVwiZnItaGludC10ZXh0XCIgW2lubmVySFRNTF09XCInZm9sbG93Lm5ld3NsZXR0ZXIuaW5wdXQuaGludCcgfCBkc2ZySTE4blwiPjwvcD5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tIFLDqXNlYXV4IHNvY2lhdXggZXQgTGV0dHJlIGQnaW5mbyBtaXNlIGVuIGF2YW50IC0tPlxuPG5nLXRlbXBsYXRlICNuZXdzbGV0dGVyQW5kTmV0d29ya3NUZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZyLWNvbC0xMiBmci1jb2wtbWQtOFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJuZXdzbGV0dGVyVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJmci1jb2wtMTIgZnItY29sLW1kLTRcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibmV0d29ya3NUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gUsOpc2VhdXggc29jaWF1eCBldCBMZXR0cmUgZCdpbmZvIGF2ZWMgZm9ybXVsYWlyZSAtLT5cbjxuZy10ZW1wbGF0ZSAjbmV0d29ya3NBbmROZXdzbGV0dGVyV2l0aE1haWxUZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImZyLWNvbC0xMiBmci1jb2wtbWQtOFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJuZXdzbGV0dGVyV2l0aE1haWxUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImZyLWNvbC0xMiBmci1jb2wtbWQtNFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJuZXR3b3Jrc1RlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBIZWFkaW5nIC0tPlxuPG5nLXRlbXBsYXRlICNoZWFkaW5nIGxldC1oZWFkaW5nPVwiaGVhZGluZ1wiPlxuICBAc3dpdGNoIChoZWFkaW5nTGV2ZWwpIHtcbiAgICBAY2FzZSAoJ0gzJykge1xuICAgICAgPGgzIGNsYXNzPVwiZnItaDVcIiBbaW5uZXJIdG1sXT1cImhlYWRpbmdcIj48L2gzPlxuICAgIH1cbiAgICBAY2FzZSAoJ0g0Jykge1xuICAgICAgPGg0IGNsYXNzPVwiZnItaDVcIiBbaW5uZXJIdG1sXT1cImhlYWRpbmdcIj48L2g0PlxuICAgIH1cbiAgICBAY2FzZSAoJ0g1Jykge1xuICAgICAgPGg1IGNsYXNzPVwiZnItaDVcIiBbaW5uZXJIdG1sXT1cImhlYWRpbmdcIj48L2g1PlxuICAgIH1cbiAgICBAY2FzZSAoJ0g2Jykge1xuICAgICAgPGg2IGNsYXNzPVwiZnItaDVcIiBbaW5uZXJIdG1sXT1cImhlYWRpbmdcIj48L2g2PlxuICAgIH1cbiAgICBAZGVmYXVsdCB7XG4gICAgICA8aDIgY2xhc3M9XCJmci1oNVwiIFtpbm5lckh0bWxdPVwiaGVhZGluZ1wiPjwvaDI+XG4gICAgfVxuICB9XG48L25nLXRlbXBsYXRlPlxuIl19