@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).
134 lines • 27.7 kB
JavaScript
import { CommonModule } from '@angular/common';
import { Component, ElementRef, EventEmitter, Input, Output, signal, viewChild, ViewEncapsulation, } from '@angular/core';
import { DsfrI18nPipe, DsfrSeverityConst, DsfrSizeConst } from '../../shared';
import { DsfrAlertSizeConst } from './alert.model';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class DsfrAlertComponent {
constructor(el, renderer) {
this.el = el;
this.renderer = renderer;
/** La valeur à utiliser pour le rôle ARIA. 'alert' par défaut. */
this.ariaRoleValue = 'alert';
/** Doit être vrai si l'alerte apparait dynamiquement en cours de navigation. (ajout de role=alert pour l'accessibilité),
* false par défaut */
// https://www.systeme-de-design.gouv.fr/version-courante/fr/composants/alerte
// Pour les développeurs.
// Nous avons retiré l’attribut role="alert" des exemples de code pour les alertes présentes au chargement de la page.
// En effet, l'élément avec un role="alert" sont les premières choses lues par les technologies d'assistance.
// De ce fait, le role="alert" doit être réservé aux alertes ajoutées (/injectées) dynamiquement au cours de la navigation.
// Ex : alertes de notification suite à une action utilisateur ou mise à jour d’un statut.
this.hasAriaRole = false;
/** L'alerte peut être masquée */
this.closeable = false;
/** Signale la fermeture de l'alerte. */
this.conceal = new EventEmitter();
this.containerSlotHeading = viewChild('containerSlotHeading', { read: ElementRef });
this.isNgContentEmpty = signal(false);
this.severity = DsfrSeverityConst.INFO;
this.alertSize = DsfrAlertSizeConst.MD;
}
/**
* La taille de l'alerte. 'MD' par défaut.
*
* @deprecated since(1.15.0) utiliser 'alertSize' à la place
*/
get size() {
return this.alertSize;
}
/** @deprecated (since 1.7.0) use 'closeable' instead (avec un 'e') */
get closable() {
return this.closeable;
}
/**
* La taille de l'alerte. 'MD' par défaut.
*
* @deprecated since(1.15.0) utiliser 'alertSize' à la place
*/
set size(value) {
this.alertSize = value;
}
/** @deprecated (since 1.7.0) utiliser `closeable` à la place (avec un 'e') */
set closable(value) {
this.closeable = value;
}
/**
* Supprimer le container <p> du titre si le contenu projeté heading est vide
* ok a l'initialisation la balise sera bien supprimé.
* mais si du contenu est ajouté dynamiquement dans le slot du heading alors qu'il est vide a l'init, le heading ne
* sera pas projeté. Solution temporaire pour ce cas précis : initialiser avec une valeur vide type <span></span>
* */
ngAfterViewInit() {
if (this.isSmall() && !this.heading) {
const hasContent = this.hasContent(this.containerSlotHeading()?.nativeElement);
this.isNgContentEmpty.set(!hasContent);
}
}
/** @internal */
getClasses() {
const classes = ['fr-alert'];
if (this.severity === DsfrSeverityConst.ERROR)
classes.push('fr-alert--error');
if (this.severity === DsfrSeverityConst.VALID)
classes.push('fr-alert--success');
if (this.severity === DsfrSeverityConst.SUCCESS)
classes.push('fr-alert--success');
if (this.severity === DsfrSeverityConst.INFO)
classes.push('fr-alert--info');
if (this.severity === DsfrSeverityConst.WARNING)
classes.push('fr-alert--warning');
if (this.alertSize === DsfrSizeConst.SM)
classes.push('fr-alert--sm');
return classes;
}
/** @internal */
isSmall() {
return this.alertSize == DsfrSizeConst.SM;
}
/** @internal */
onClose(event) {
const parentNode = this.el.nativeElement?.parentNode;
if (parentNode) {
this.renderer.removeChild(parentNode, this.el.nativeElement, true);
}
this.conceal.emit();
}
/**
* Test si le container doit être affiché (contenu visible)
* @returns true si le container possède au moins un noeuf enfant ou du contenu de texte (exclure les commentaires et chaine vide)
*/
hasContent(container) {
return !!(container?.children?.length > 0 || (container?.textContent && container.textContent !== ' '));
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrAlertComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DsfrAlertComponent, isStandalone: true, selector: "dsfr-alert", inputs: { heading: "heading", headingLevel: "headingLevel", message: "message", severity: "severity", ariaRoleValue: "ariaRoleValue", alertSize: "alertSize", closeControlLabel: "closeControlLabel", hasAriaRole: "hasAriaRole", closeable: "closeable", size: "size", closable: "closable" }, outputs: { conceal: "conceal" }, viewQueries: [{ propertyName: "containerSlotHeading", first: true, predicate: ["containerSlotHeading"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "<div [attr.role]=\"hasAriaRole ? ariaRoleValue : null\" [ngClass]=\"getClasses()\">\n <ng-container *ngTemplateOutlet=\"headingTemplate\"></ng-container>\n <!-- La propri\u00E9t\u00E9 message est prioritaire sur le slot -->\n @if (message) {\n <p>{{ message }}</p>\n } @else {\n <ng-content select=\"[message]\"></ng-content>\n }\n @if (closable) {\n <button type=\"button\" class=\"fr-btn--close fr-btn\" [title]=\"closeControlLabel\" (click)=\"onClose($event)\">\n {{ closeControlLabel ?? ('alert.close' | dsfrI18n) }}\n </button>\n }\n</div>\n\n<!-- Templates ----------------------------------------------------------------------------------------------------- -->\n<ng-template #headingTemplate>\n <!--FIXME v2 : supprimer les innerHTML -->\n @switch (headingLevel) {\n @case ('H2') {\n @if (heading) {\n <h2 class=\"fr-alert__title\" [innerHTML]=\"heading\"></h2>\n } @else {\n <h2 class=\"fr-alert__title\">\n <ng-container *ngTemplateOutlet=\"headingPropTemplate\"></ng-container>\n </h2>\n }\n }\n @case ('H3') {\n @if (heading) {\n <h3 class=\"fr-alert__title\" [innerHTML]=\"heading\"></h3>\n } @else {\n <h3 class=\"fr-alert__title\">\n <ng-container *ngTemplateOutlet=\"headingPropTemplate\"></ng-container>\n </h3>\n }\n }\n @case ('H4') {\n @if (heading) {\n <h4 class=\"fr-alert__title\" [innerHTML]=\"heading\"></h4>\n } @else {\n <h4 class=\"fr-alert__title\">\n <ng-container *ngTemplateOutlet=\"headingPropTemplate\"></ng-container>\n </h4>\n }\n }\n @case ('H5') {\n @if (heading) {\n <h5 class=\"fr-alert__title\" [innerHTML]=\"heading\"></h5>\n } @else {\n <h5 class=\"fr-alert__title\">\n <ng-container *ngTemplateOutlet=\"headingPropTemplate\"></ng-container>\n </h5>\n }\n }\n @case ('H6') {\n @if (heading) {\n <h6 class=\"fr-alert__title\" [innerHTML]=\"heading\"></h6>\n } @else {\n <h6 class=\"fr-alert__title\">\n <ng-container *ngTemplateOutlet=\"headingPropTemplate\"></ng-container>\n </h6>\n }\n }\n @default {\n @if (heading) {\n <p class=\"fr-alert__title\" [innerHTML]=\"heading\"></p>\n } @else {\n <p #containerSlotHeading *ngIf=\"!isNgContentEmpty()\" class=\"fr-alert__title\">\n <ng-container *ngTemplateOutlet=\"headingPropTemplate\"></ng-container>\n </p>\n }\n }\n }\n</ng-template>\n<ng-template #headingPropTemplate>\n <ng-content></ng-content>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: DsfrI18nPipe, name: "dsfrI18n" }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrAlertComponent, decorators: [{
type: Component,
args: [{ selector: 'dsfr-alert', encapsulation: ViewEncapsulation.None, standalone: true, imports: [CommonModule, DsfrI18nPipe], template: "<div [attr.role]=\"hasAriaRole ? ariaRoleValue : null\" [ngClass]=\"getClasses()\">\n <ng-container *ngTemplateOutlet=\"headingTemplate\"></ng-container>\n <!-- La propri\u00E9t\u00E9 message est prioritaire sur le slot -->\n @if (message) {\n <p>{{ message }}</p>\n } @else {\n <ng-content select=\"[message]\"></ng-content>\n }\n @if (closable) {\n <button type=\"button\" class=\"fr-btn--close fr-btn\" [title]=\"closeControlLabel\" (click)=\"onClose($event)\">\n {{ closeControlLabel ?? ('alert.close' | dsfrI18n) }}\n </button>\n }\n</div>\n\n<!-- Templates ----------------------------------------------------------------------------------------------------- -->\n<ng-template #headingTemplate>\n <!--FIXME v2 : supprimer les innerHTML -->\n @switch (headingLevel) {\n @case ('H2') {\n @if (heading) {\n <h2 class=\"fr-alert__title\" [innerHTML]=\"heading\"></h2>\n } @else {\n <h2 class=\"fr-alert__title\">\n <ng-container *ngTemplateOutlet=\"headingPropTemplate\"></ng-container>\n </h2>\n }\n }\n @case ('H3') {\n @if (heading) {\n <h3 class=\"fr-alert__title\" [innerHTML]=\"heading\"></h3>\n } @else {\n <h3 class=\"fr-alert__title\">\n <ng-container *ngTemplateOutlet=\"headingPropTemplate\"></ng-container>\n </h3>\n }\n }\n @case ('H4') {\n @if (heading) {\n <h4 class=\"fr-alert__title\" [innerHTML]=\"heading\"></h4>\n } @else {\n <h4 class=\"fr-alert__title\">\n <ng-container *ngTemplateOutlet=\"headingPropTemplate\"></ng-container>\n </h4>\n }\n }\n @case ('H5') {\n @if (heading) {\n <h5 class=\"fr-alert__title\" [innerHTML]=\"heading\"></h5>\n } @else {\n <h5 class=\"fr-alert__title\">\n <ng-container *ngTemplateOutlet=\"headingPropTemplate\"></ng-container>\n </h5>\n }\n }\n @case ('H6') {\n @if (heading) {\n <h6 class=\"fr-alert__title\" [innerHTML]=\"heading\"></h6>\n } @else {\n <h6 class=\"fr-alert__title\">\n <ng-container *ngTemplateOutlet=\"headingPropTemplate\"></ng-container>\n </h6>\n }\n }\n @default {\n @if (heading) {\n <p class=\"fr-alert__title\" [innerHTML]=\"heading\"></p>\n } @else {\n <p #containerSlotHeading *ngIf=\"!isNgContentEmpty()\" class=\"fr-alert__title\">\n <ng-container *ngTemplateOutlet=\"headingPropTemplate\"></ng-container>\n </p>\n }\n }\n }\n</ng-template>\n<ng-template #headingPropTemplate>\n <ng-content></ng-content>\n</ng-template>\n" }]
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { heading: [{
type: Input
}], headingLevel: [{
type: Input
}], message: [{
type: Input
}], severity: [{
type: Input
}], ariaRoleValue: [{
type: Input
}], alertSize: [{
type: Input
}], closeControlLabel: [{
type: Input
}], hasAriaRole: [{
type: Input
}], closeable: [{
type: Input
}], conceal: [{
type: Output
}], size: [{
type: Input
}], closable: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvYWxlcnQvYWxlcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvYWxlcnQvYWxlcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFFTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUVOLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBb0IsWUFBWSxFQUFnQixpQkFBaUIsRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDOUcsT0FBTyxFQUFpQixrQkFBa0IsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBU2xFLE1BQU0sT0FBTyxrQkFBa0I7SUEyQzdCLFlBQ1UsRUFBYyxFQUNkLFFBQW1CO1FBRG5CLE9BQUUsR0FBRixFQUFFLENBQVk7UUFDZCxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBaEM3QixrRUFBa0U7UUFDekQsa0JBQWEsR0FBdUIsT0FBTyxDQUFDO1FBVXJEOytCQUN1QjtRQUN2Qiw4RUFBOEU7UUFDOUUseUJBQXlCO1FBQ3pCLHNIQUFzSDtRQUN0SCw2R0FBNkc7UUFDN0csMkhBQTJIO1FBQzNILDBGQUEwRjtRQUNqRixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUU3QixpQ0FBaUM7UUFDeEIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUUzQix3Q0FBd0M7UUFDOUIsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFF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QjtRQUN2QyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxXQUFXLElBQUksU0FBUyxDQUFDLFdBQVcsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFHLENBQUM7K0dBNUhVLGtCQUFrQjttR0FBbEIsa0JBQWtCLGdmQXdDOEMsVUFBVSw2Q0MvRHZGLHNsRkE4RUEsMkNEekRZLFlBQVksbVlBQUUsWUFBWTs7NEZBRXpCLGtCQUFrQjtrQkFQOUIsU0FBUzsrQkFDRSxZQUFZLGlCQUVQLGlCQUFpQixDQUFDLElBQUksY0FDekIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQzt1R0FJNUIsT0FBTztzQkFBZixLQUFLO2dCQUdHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBR0csT0FBTztzQkFBZixLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0csYUFBYTtzQkFBckIsS0FBSztnQkFLRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFVRyxXQUFXO3NCQUFuQixLQUFLO2dCQUdHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0ksT0FBTztzQkFBaEIsTUFBTTtnQkFnQ00sSUFBSTtzQkFBaEIsS0FBSztnQkFLTyxRQUFRO3NCQUFwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjIsXG4gIHNpZ25hbCxcbiAgdmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEc2ZySGVhZGluZ0xldmVsLCBEc2ZySTE4blBpcGUsIERzZnJTZXZlcml0eSwgRHNmclNldmVyaXR5Q29uc3QsIERzZnJTaXplQ29uc3QgfSBmcm9tICcuLi8uLi9zaGFyZWQnO1xuaW1wb3J0IHsgRHNmckFsZXJ0U2l6ZSwgRHNmckFsZXJ0U2l6ZUNvbnN0IH0gZnJvbSAnLi9hbGVydC5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RzZnItYWxlcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vYWxlcnQuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBEc2ZySTE4blBpcGVdLFxufSlcbmV4cG9ydCBjbGFzcyBEc2ZyQWxlcnRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgLyoqIExlIHRpdHJlIGRlIGwnYWxlcnRlLiBQZXV0IMOqdHJlIHJlbXBsYWPDqSBwYXIgbGUgc2xvdCBwYXIgZMOpZmF1dC4gKi9cbiAgQElucHV0KCkgaGVhZGluZzogc3RyaW5nO1xuXG4gIC8qKiBMZSBuaXZlYXUgZGUgdGl0cmUgZGV2YW50IMOqdHJlIHV0aWxpc8OpLCB1bmUgYmFsaXNlIDxwPiBzZXJhIHV0aWxpc8OpZSBzaSBsYSBwcm9wcmnDqXTDqSBuJ2VzdCBwYXMgcmVuc2VpZ27DqWUuICovXG4gIEBJbnB1dCgpIGhlYWRpbmdMZXZlbDogRHNmckhlYWRpbmdMZXZlbDtcblxuICAvKiogTGUgY29ycHMgZHUgbWVzc2FnZSBkZSBsJ2FsZXJ0ZSAodGV4dGUgc2ltcGxlKS4gUG91ciB1dGlsaXNlciBkdSBIVE1MIHV0aWxpc2V6IGxlIHNsb3QgYG1lc3NhZ2VgIMOgIGxhIHBsYWNlLiAqL1xuICBASW5wdXQoKSBtZXNzYWdlOiBzdHJpbmc7XG5cbiAgLyoqIExlIG5pdmVhdSBkJ2FsZXJ0ZS4gJ2luZm8nIHBhciBkw6lmYXV0LiAqL1xuICBASW5wdXQoKSBzZXZlcml0eTogRHNmclNldmVyaXR5O1xuXG4gIC8qKiBMYSB2YWxldXIgw6AgdXRpbGlzZXIgcG91ciBsZSByw7RsZSBBUklBLiAnYWxlcnQnIHBhciBkw6lmYXV0LiAqL1xuICBASW5wdXQoKSBhcmlhUm9sZVZhbHVlOiAnYWxlcnQnIHwgJ3N0YXR1cycgPSAnYWxlcnQnO1xuXG4gIC8qKlxuICAgKiBMYSB0YWlsbGUgZGUgbCdhbGVydGUuICdNRCcgcGFyIGTDqWZhdXQuXG4gICAqL1xuICBASW5wdXQoKSBhbGVydFNpemU6IERzZnJBbGVydFNpemU7XG5cbiAgLyoqIExlIGxpYmVsbMOpIGFzc29jacOpIGF1IGJvdXRvbiBkZSBmZXJtZXR1cmUgZGUgbCdhbGVydGUuICovXG4gIEBJbnB1dCgpIGNsb3NlQ29udHJvbExhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIERvaXQgw6p0cmUgdnJhaSBzaSBsJ2FsZXJ0ZSBhcHBhcmFpdCBkeW5hbWlxdWVtZW50IGVuIGNvdXJzIGRlIG5hdmlnYXRpb24uIChham91dCBkZSByb2xlPWFsZXJ0IHBvdXIgbCdhY2Nlc3NpYmlsaXTDqSksXG4gICAqICBmYWxzZSBwYXIgZMOpZmF1dCAqL1xuICAvLyBodHRwczovL3d3dy5zeXN0ZW1lLWRlLWRlc2lnbi5nb3V2LmZyL3ZlcnNpb24tY291cmFudGUvZnIvY29tcG9zYW50cy9hbGVydGVcbiAgLy8gUG91ciBsZXMgZMOpdmVsb3BwZXVycy5cbiAgLy8gTm91cyBhdm9ucyByZXRpcsOpIGzigJlhdHRyaWJ1dCByb2xlPVwiYWxlcnRcIiBkZXMgZXhlbXBsZXMgZGUgY29kZSBwb3VyIGxlcyBhbGVydGVzIHByw6lzZW50ZXMgYXUgY2hhcmdlbWVudCBkZSBsYSBwYWdlLlxuICAvLyBFbiBlZmZldCwgbCfDqWzDqW1lbnQgYXZlYyB1biByb2xlPVwiYWxlcnRcIiBzb250IGxlcyBwcmVtacOocmVzIGNob3NlcyBsdWVzIHBhciBsZXMgdGVjaG5vbG9naWVzIGQnYXNzaXN0YW5jZS5cbiAgLy8gRGUgY2UgZmFpdCwgbGUgcm9sZT1cImFsZXJ0XCIgZG9pdCDDqnRyZSByw6lzZXJ2w6kgYXV4IGFsZXJ0ZXMgYWpvdXTDqWVzICgvaW5qZWN0w6llcykgZHluYW1pcXVlbWVudCBhdSBjb3VycyBkZSBsYSBuYXZpZ2F0aW9uLlxuICAvLyBFeCA6IGFsZXJ0ZXMgZGUgbm90aWZpY2F0aW9uIHN1aXRlIMOgIHVuZSBhY3Rpb24gdXRpbGlzYXRldXIgb3UgbWlzZSDDoCBqb3VyIGTigJl1biBzdGF0dXQuXG4gIEBJbnB1dCgpIGhhc0FyaWFSb2xlID0gZmFsc2U7XG5cbiAgLyoqIEwnYWxlcnRlIHBldXQgw6p0cmUgbWFzcXXDqWUgKi9cbiAgQElucHV0KCkgY2xvc2VhYmxlID0gZmFsc2U7XG5cbiAgLyoqIFNpZ25hbGUgbGEgZmVybWV0dXJlIGRlIGwnYWxlcnRlLiAqL1xuICBAT3V0cHV0KCkgY29uY2VhbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBwcm90ZWN0ZWQgY29udGFpbmVyU2xvdEhlYWRpbmcgPSB2aWV3Q2hpbGQoJ2NvbnRhaW5lclNsb3RIZWFkaW5nJywgeyByZWFkOiBFbGVtZW50UmVmIH0pO1xuICBwcm90ZWN0ZWQgaXNOZ0NvbnRlbnRFbXB0eSA9IHNpZ25hbChmYWxzZSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICkge1xuICAgIHRoaXMuc2V2ZXJpdHkgPSBEc2ZyU2V2ZXJpdHlDb25zdC5JTkZPO1xuICAgIHRoaXMuYWxlcnRTaXplID0gRHNmckFsZXJ0U2l6ZUNvbnN0Lk1EO1xuICB9XG5cbiAgLyoqXG4gICAqIExhIHRhaWxsZSBkZSBsJ2FsZXJ0ZS4gJ01EJyBwYXIgZMOpZmF1dC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgc2luY2UoMS4xNS4wKSB1dGlsaXNlciAnYWxlcnRTaXplJyDDoCBsYSBwbGFjZVxuICAgKi9cbiAgZ2V0IHNpemUoKTogRHNmckFsZXJ0U2l6ZSB7XG4gICAgcmV0dXJuIHRoaXMuYWxlcnRTaXplO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIChzaW5jZSAxLjcuMCkgdXNlICdjbG9zZWFibGUnIGluc3RlYWQgKGF2ZWMgdW4gJ2UnKSAqL1xuICBnZXQgY2xvc2FibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2xvc2VhYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIExhIHRhaWxsZSBkZSBsJ2FsZXJ0ZS4gJ01EJyBwYXIgZMOpZmF1dC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgc2luY2UoMS4xNS4wKSB1dGlsaXNlciAnYWxlcnRTaXplJyDDoCBsYSBwbGFjZVxuICAgKi9cbiAgQElucHV0KCkgc2V0IHNpemUodmFsdWU6IERzZnJBbGVydFNpemUpIHtcbiAgICB0aGlzLmFsZXJ0U2l6ZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIChzaW5jZSAxLjcuMCkgdXRpbGlzZXIgYGNsb3NlYWJsZWAgw6AgbGEgcGxhY2UgKGF2ZWMgdW4gJ2UnKSAqL1xuICBASW5wdXQoKSBzZXQgY2xvc2FibGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmNsb3NlYWJsZSA9IHZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBTdXBwcmltZXIgbGUgY29udGFpbmVyIDxwPiBkdSB0aXRyZSBzaSBsZSBjb250ZW51IHByb2pldMOpIGhlYWRpbmcgZXN0IHZpZGVcbiAgICogb2sgYSBsJ2luaXRpYWxpc2F0aW9uIGxhIGJhbGlzZSBzZXJhIGJpZW4gc3VwcHJpbcOpLlxuICAgKiBtYWlzIHNpIGR1IGNvbnRlbnUgZXN0IGFqb3V0w6kgZHluYW1pcXVlbWVudCBkYW5zIGxlIHNsb3QgZHUgaGVhZGluZyBhbG9ycyBxdSdpbCBlc3QgdmlkZSBhIGwnaW5pdCwgbGUgaGVhZGluZyBuZVxuICAgKiBzZXJhIHBhcyBwcm9qZXTDqS4gU29sdXRpb24gdGVtcG9yYWlyZSBwb3VyIGNlIGNhcyBwcsOpY2lzIDogaW5pdGlhbGlzZXIgYXZlYyB1bmUgdmFsZXVyIHZpZGUgdHlwZSA8c3Bhbj48L3NwYW4+XG4gICAqICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNTbWFsbCgpICYmICF0aGlzLmhlYWRpbmcpIHtcbiAgICAgIGNvbnN0IGhhc0NvbnRlbnQgPSB0aGlzLmhhc0NvbnRlbnQodGhpcy5jb250YWluZXJTbG90SGVhZGluZygpPy5uYXRpdmVFbGVtZW50KTtcbiAgICAgIHRoaXMuaXNOZ0NvbnRlbnRFbXB0eS5zZXQoIWhhc0NvbnRlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0Q2xhc3NlcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgY2xhc3NlcyA9IFsnZnItYWxlcnQnXTtcbiAgICBpZiAodGhpcy5zZXZlcml0eSA9PT0gRHNmclNldmVyaXR5Q29uc3QuRVJST1IpIGNsYXNzZXMucHVzaCgnZnItYWxlcnQtLWVycm9yJyk7XG4gICAgaWYgKHRoaXMuc2V2ZXJpdHkgPT09IERzZnJTZXZlcml0eUNvbnN0LlZBTElEKSBjbGFzc2VzLnB1c2goJ2ZyLWFsZXJ0LS1zdWNjZXNzJyk7XG4gICAgaWYgKHRoaXMuc2V2ZXJpdHkgPT09IERzZnJTZXZlcml0eUNvbnN0LlNVQ0NFU1MpIGNsYXNzZXMucHVzaCgnZnItYWxlcnQtLXN1Y2Nlc3MnKTtcbiAgICBpZiAodGhpcy5zZXZlcml0eSA9PT0gRHNmclNldmVyaXR5Q29uc3QuSU5GTykgY2xhc3Nlcy5wdXNoKCdmci1hbGVydC0taW5mbycpO1xuICAgIGlmICh0aGlzLnNldmVyaXR5ID09PSBEc2ZyU2V2ZXJpdHlDb25zdC5XQVJOSU5HKSBjbGFzc2VzLnB1c2goJ2ZyLWFsZXJ0LS13YXJuaW5nJyk7XG4gICAgaWYgKHRoaXMuYWxlcnRTaXplID09PSBEc2ZyU2l6ZUNvbnN0LlNNKSBjbGFzc2VzLnB1c2goJ2ZyLWFsZXJ0LS1zbScpO1xuICAgIHJldHVybiBjbGFzc2VzO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBpc1NtYWxsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFsZXJ0U2l6ZSA9PSBEc2ZyU2l6ZUNvbnN0LlNNO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBvbkNsb3NlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQ/LnBhcmVudE5vZGU7XG4gICAgaWYgKHBhcmVudE5vZGUpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2hpbGQocGFyZW50Tm9kZSwgdGhpcy5lbC5uYXRpdmVFbGVtZW50LCB0cnVlKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbmNlYWwuZW1pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRlc3Qgc2kgbGUgY29udGFpbmVyIGRvaXQgw6p0cmUgYWZmaWNow6kgKGNvbnRlbnUgdmlzaWJsZSlcbiAgICogQHJldHVybnMgdHJ1ZSBzaSBsZSBjb250YWluZXIgcG9zc8OoZGUgYXUgbW9pbnMgdW4gbm9ldWYgZW5mYW50IG91IGR1IGNvbnRlbnUgZGUgdGV4dGUgKGV4Y2x1cmUgbGVzIGNvbW1lbnRhaXJlcyBldCBjaGFpbmUgdmlkZSlcbiAgICovXG4gIHByaXZhdGUgaGFzQ29udGVudChjb250YWluZXI6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKGNvbnRhaW5lcj8uY2hpbGRyZW4/Lmxlbmd0aCA+IDAgfHwgKGNvbnRhaW5lcj8udGV4dENvbnRlbnQgJiYgY29udGFpbmVyLnRleHRDb250ZW50ICE9PSAnICcpKTtcbiAgfVxufVxuIiwiPGRpdiBbYXR0ci5yb2xlXT1cImhhc0FyaWFSb2xlID8gYXJpYVJvbGVWYWx1ZSA6IG51bGxcIiBbbmdDbGFzc109XCJnZXRDbGFzc2VzKClcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRpbmdUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICA8IS0tIExhIHByb3ByacOpdMOpIG1lc3NhZ2UgZXN0IHByaW9yaXRhaXJlIHN1ciBsZSBzbG90IC0tPlxuICBAaWYgKG1lc3NhZ2UpIHtcbiAgICA8cD57eyBtZXNzYWdlIH19PC9wPlxuICB9IEBlbHNlIHtcbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbbWVzc2FnZV1cIj48L25nLWNvbnRlbnQ+XG4gIH1cbiAgQGlmIChjbG9zYWJsZSkge1xuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZnItYnRuLS1jbG9zZSBmci1idG5cIiBbdGl0bGVdPVwiY2xvc2VDb250cm9sTGFiZWxcIiAoY2xpY2spPVwib25DbG9zZSgkZXZlbnQpXCI+XG4gICAgICB7eyBjbG9zZUNvbnRyb2xMYWJlbCA/PyAoJ2FsZXJ0LmNsb3NlJyB8IGRzZnJJMThuKSB9fVxuICAgIDwvYnV0dG9uPlxuICB9XG48L2Rpdj5cblxuPCEtLSBUZW1wbGF0ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0+XG48bmctdGVtcGxhdGUgI2hlYWRpbmdUZW1wbGF0ZT5cbiAgPCEtLUZJWE1FIHYyIDogc3VwcHJpbWVyIGxlcyBpbm5lckhUTUwgLS0+XG4gIEBzd2l0Y2ggKGhlYWRpbmdMZXZlbCkge1xuICAgIEBjYXNlICgnSDInKSB7XG4gICAgICBAaWYgKGhlYWRpbmcpIHtcbiAgICAgICAgPGgyIGNsYXNzPVwiZnItYWxlcnRfX3RpdGxlXCIgW2lubmVySFRNTF09XCJoZWFkaW5nXCI+PC9oMj5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8aDIgY2xhc3M9XCJmci1hbGVydF9fdGl0bGVcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGluZ1Byb3BUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2gyPlxuICAgICAgfVxuICAgIH1cbiAgICBAY2FzZSAoJ0gzJykge1xuICAgICAgQGlmIChoZWFkaW5nKSB7XG4gICAgICAgIDxoMyBjbGFzcz1cImZyLWFsZXJ0X190aXRsZVwiIFtpbm5lckhUTUxdPVwiaGVhZGluZ1wiPjwvaDM+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGgzIGNsYXNzPVwiZnItYWxlcnRfX3RpdGxlXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRpbmdQcm9wVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9oMz5cbiAgICAgIH1cbiAgICB9XG4gICAgQGNhc2UgKCdINCcpIHtcbiAgICAgIEBpZiAoaGVhZGluZykge1xuICAgICAgICA8aDQgY2xhc3M9XCJmci1hbGVydF9fdGl0bGVcIiBbaW5uZXJIVE1MXT1cImhlYWRpbmdcIj48L2g0PlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxoNCBjbGFzcz1cImZyLWFsZXJ0X190aXRsZVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkaW5nUHJvcFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvaDQ+XG4gICAgICB9XG4gICAgfVxuICAgIEBjYXNlICgnSDUnKSB7XG4gICAgICBAaWYgKGhlYWRpbmcpIHtcbiAgICAgICAgPGg1IGNsYXNzPVwiZnItYWxlcnRfX3RpdGxlXCIgW2lubmVySFRNTF09XCJoZWFkaW5nXCI+PC9oNT5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8aDUgY2xhc3M9XCJmci1hbGVydF9fdGl0bGVcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGluZ1Byb3BUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2g1PlxuICAgICAgfVxuICAgIH1cbiAgICBAY2FzZSAoJ0g2Jykge1xuICAgICAgQGlmIChoZWFkaW5nKSB7XG4gICAgICAgIDxoNiBjbGFzcz1cImZyLWFsZXJ0X190aXRsZVwiIFtpbm5lckhUTUxdPVwiaGVhZGluZ1wiPjwvaDY+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGg2IGNsYXNzPVwiZnItYWxlcnRfX3RpdGxlXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRpbmdQcm9wVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9oNj5cbiAgICAgIH1cbiAgICB9XG4gICAgQGRlZmF1bHQge1xuICAgICAgQGlmIChoZWFkaW5nKSB7XG4gICAgICAgIDxwIGNsYXNzPVwiZnItYWxlcnRfX3RpdGxlXCIgW2lubmVySFRNTF09XCJoZWFkaW5nXCI+PC9wPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxwICNjb250YWluZXJTbG90SGVhZGluZyAqbmdJZj1cIiFpc05nQ29udGVudEVtcHR5KClcIiBjbGFzcz1cImZyLWFsZXJ0X190aXRsZVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkaW5nUHJvcFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvcD5cbiAgICAgIH1cbiAgICB9XG4gIH1cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2hlYWRpbmdQcm9wVGVtcGxhdGU+XG4gIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG4iXX0=