@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).
261 lines • 68.9 kB
JavaScript
import { Component, ContentChild, ElementRef, EventEmitter, Inject, Input, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
import { newUniqueId } from '../../shared';
import { DSFR_CONFIG_TOKEN } from '../../shared/config/config-token';
import { DISPLAY_MODAL_ID } from '../display';
import * as i0 from "@angular/core";
import * as i1 from "../../shared";
import * as i2 from "@angular/common";
import * as i3 from "./mega-menu/mega-menu.component";
import * as i4 from "../search-bar/search-bar.component";
import * as i5 from "../link/item-link.component";
import * as i6 from "../translate/translate.component";
import * as i7 from "../display/display.component";
export class DsfrHeaderComponent {
/** @internal */
constructor(config, i18n, renderer) {
this.config = config;
this.i18n = i18n;
this.renderer = renderer;
/**
* Boolean pour afficher le tag Beta (pour un site en beta).
*/
this.beta = false;
/**
* Label associé au bloc marque (Marianne). Respectez la structure avec les <br>.
* (Ministère, gouvernement, république française)
*/
this.logoLabel = 'République<br/>Française';
/** Boolean pour passer le logo opérateur en mode vertical. */
this.operatorImageVertical = false;
/** Tableau d'items du menu. */
this.menu = [];
/**
* Permet d'afficher la barre de recherche.
*/
this.searchBar = false;
/** Renvoi la valeur de l'input de la barre de recherche au changement. */
this.searchChange = new EventEmitter();
/** Renvoi la valeur de l'input de la barre de recherche au clic sur rechercher. */
this.searchSelect = new EventEmitter();
/**Emet l'évènement Event du DOM à la sélection d'un lien */
this.linkSelect = new EventEmitter();
/** Evenement émis au changement de langue (si showTranslate). Il contient le code de la langue. */
this.langChange = new EventEmitter();
/** @internal */
this.searchInputId = newUniqueId();
/**
* Nombre maximum de liens d'accès rapides (3)
*
* @internal
*/
this.maxToolsLinks = 3;
/**
* @internal
*/
this._useDeprecatedPictoPath = false;
}
get display() {
return this.showDisplay;
}
get headerToolsLinks() {
return this._headerToolsLinks;
}
get displayModalId() {
return DISPLAY_MODAL_ID;
}
get pictoPath() {
return this.artworkDirPath;
}
/** Affichage du lien 'Paramètre d'affichage' pour gérer les modes clair/sombre. */
set display(value) {
this.showDisplay = value;
this.maxToolsLinks = this.showDisplay ? 2 : 3;
}
/**
* Tableau de lien d'accès rapide.
* Les icônes acceptés sont ceux du DSFR y compris ceux du tableau `DsfrBtnIcon`.
*/
set headerToolsLinks(links) {
if (links && links.length > this.maxToolsLinks) {
if (this.showDisplay) {
console.warn("Avec l'utilisation du paramètre d'affichage, le nombre d'accès rapides (tools links) est limité à " +
this.maxToolsLinks);
}
else {
console.warn("Le nombre d'accès rapides (tools links) est limité à " + this.maxToolsLinks);
}
}
this._headerToolsLinks = links;
this.duplicateToolsLinksMobile();
}
/**
* Chemin des pictogrammes (du composant display) renseigné par le développeur.
*
* Note: ce chemin doit permettre de récupérer directement les fichiers SVG suivants : moon.svg, sun.svg, system.svg
*
* @deprecated Use `artworkDirPath` instead.
*/
set pictoPath(path) {
this.artworkDirPath = path;
this._useDeprecatedPictoPath = true;
}
/** internal */
ngOnInit() {
if (this.artworkDirPath === undefined) {
this.artworkDirPath = this.config.artworkDirPath;
}
this.navigationId ??= newUniqueId();
}
/** internal */
ngAfterViewInit() {
this.duplicateToolsLinksMobile();
}
/**
* Fix: evenements non dupliqués par le script DSFR pour les liens (toolslinks) version mobile
* On prend la main sur le clic de la div parente en cas de lien 'route' pour envoyer l'event linkSelect
* @param event element cliqué
* @internal
*/
onSelectLinkMobile(event) {
if (!this._headerToolsLinks)
return;
const parent = event.target?.parentElement;
const item = this._headerToolsLinks.find((l) => l.label === parent?.getAttribute('data-item'));
if (item && item.route && !item.routerLink) {
event.preventDefault();
this.linkSelect.emit(item);
}
}
/** @internal */
hasToolsLinks() {
return this.headerToolsLinks?.length > 0 || this.translate?.languages?.length > 0 || this.display;
}
/** @internal */
onLink(item) {
this.linkSelect.emit(item);
}
/** @internal */
onSearchSubmit(text) {
this.searchSelect.emit(text);
}
/** @internal */
onSearchChange(text) {
this.searchChange.emit(text);
}
/** @internal */
onLanguageChange(codeLang) {
this.langChange.emit(codeLang);
}
/** @internal */
onMegaMenuClose(item) {
item.expanded = false;
}
/** @internal */
onMenuItemClick(item) {
this.menu.forEach((i) => (i.expanded = false));
item.expanded = true;
}
/** @internal */
getCustomClassHeaderToolsLink(item) {
const customClass = ['fr-btn'];
if (item.icon)
customClass.push(item.icon);
if (item.customClass)
customClass.push(item.customClass);
return customClass.join(' ');
}
/**
* Dupliquer les liens toolsLinks pour le menu mobile
* /!\ interaction script DSFR : le script copie les liens la premiere fois, mais n'écoute pas les changements
* Les liens à l'interieur de fr-header__tools-links sont dupliqués dans fr-header__menu-links
*/
duplicateToolsLinksMobile() {
if (this.toolLinksMobile?.nativeElement) {
// timeout pour laisser le temps du rendu des éléments dans toolsLinks
setTimeout(() => {
const childElements = this.toolLinksMobile.nativeElement.children;
// suppression des noeuds précédent
Array.from(childElements).forEach((e) => {
this.renderer.removeChild(this.toolLinksMobile.nativeElement, e);
});
// copie des liens de menu
if (this.toolLinks?.nativeElement) {
this.renderer.appendChild(this.toolLinksMobile.nativeElement, this.toolLinks.nativeElement.cloneNode(true));
}
// Dupliquer le composant translate
if (this.translate) {
if (this.translateComponent) {
this.renderer.appendChild(this.toolLinksMobile.nativeElement, this.translateComponent.nativeElement);
}
}
});
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DsfrHeaderComponent, deps: [{ token: DSFR_CONFIG_TOKEN }, { token: i1.I18nService }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DsfrHeaderComponent, selector: "dsfr-header", inputs: { beta: "beta", navigationId: "navigationId", artworkDirPath: "artworkDirPath", logoLabel: "logoLabel", logoLink: "logoLink", logoTooltipMessage: "logoTooltipMessage", operatorImagePath: "operatorImagePath", operatorImageAlt: "operatorImageAlt", operatorImageVertical: "operatorImageVertical", serviceTitle: "serviceTitle", serviceTagline: "serviceTagline", menu: "menu", searchBar: "searchBar", translate: "translate", display: "display", headerToolsLinks: "headerToolsLinks", pictoPath: "pictoPath" }, outputs: { searchChange: "searchChange", searchSelect: "searchSelect", linkSelect: "linkSelect", langChange: "langChange" }, queries: [{ propertyName: "headerTools", first: true, predicate: ["headerTools"], descendants: true, static: true }, { propertyName: "headerToolsMobile", first: true, predicate: ["headerToolsMobile"], descendants: true, static: true }], viewQueries: [{ propertyName: "toolLinksMobile", first: true, predicate: ["toolLinksMobile"], descendants: true }, { propertyName: "toolLinks", first: true, predicate: ["toolLinks"], descendants: true }, { propertyName: "translateComponent", first: true, predicate: ["translateComponent"], descendants: true, read: ElementRef }], ngImport: i0, template: "<header role=\"banner\" class=\"fr-header\">\n <!-- BUG: Classe 'fr-header__body' inconnue en DSFR 1.9.3 -->\n <div class=\"fr-header__body\">\n <div class=\"fr-container\">\n <div class=\"fr-header__body-row\">\n <div class=\"fr-header__brand fr-enlarge-link\">\n <div class=\"fr-header__brand-top\">\n <div class=\"fr-header__logo\">\n <!--Cas marianne sans titre ni image op\u00E9rateur-->\n <a\n *ngIf=\"!serviceTitle && !operatorImagePath\"\n [href]=\"logoLink\"\n [attr.title]=\"logoTooltipMessage ? logoTooltipMessage : null\">\n <p class=\"fr-logo\" [innerHTML]=\"logoLabel\"></p>\n </a>\n <!--Cas marianne avec titre et/ou image op\u00E9rateur-->\n <p *ngIf=\"serviceTitle || operatorImagePath\" class=\"fr-logo\" [innerHTML]=\"logoLabel\"></p>\n </div>\n <div *ngIf=\"operatorImagePath\" class=\"fr-header__operator\">\n <!--Cas o\u00F9 il n'y a pas de titre avec l'image-->\n <a *ngIf=\"!serviceTitle\" [href]=\"logoLink\" [attr.title]=\"logoTooltipMessage ? logoTooltipMessage : null\">\n <img\n class=\"fr-responsive-img\"\n [style.width]=\"operatorImageVertical ? '3.5rem' : null\"\n [style.max-width]=\"!operatorImageVertical ? '9.0625rem' : null\"\n [src]=\"operatorImagePath\"\n [attr.alt]=\"operatorImageAlt\" />\n </a>\n <!--Cas o\u00F9 il y a un titre avec l'image-->\n <img\n *ngIf=\"serviceTitle\"\n class=\"fr-responsive-img\"\n [style.width]=\"operatorImageVertical ? '3.5rem' : null\"\n [style.max-width]=\"!operatorImageVertical ? '9.0625rem' : null\"\n [src]=\"operatorImagePath\"\n [attr.alt]=\"operatorImageAlt\" />\n <!-- L\u2019alternative de l\u2019image (attribut alt) doit imp\u00E9rativement \u00EAtre renseign\u00E9e et reprendre le texte visible dans l\u2019image -->\n </div>\n <div class=\"fr-header__navbar\">\n <button\n *ngIf=\"searchBar\"\n type=\"button\"\n class=\"fr-btn--search fr-btn\"\n data-fr-opened=\"false\"\n [attr.aria-controls]=\"navigationId + '-search'\"\n id=\"{{ navigationId }}-button-search\"\n [title]=\"i18n.t('commons.search')\">\n {{ i18n.t('commons.search') }}\n </button>\n <button\n type=\"button\"\n class=\"fr-btn--menu fr-btn\"\n data-fr-opened=\"false\"\n [attr.aria-controls]=\"navigationId\"\n id=\"{{ navigationId }}-button-menu\"\n [title]=\"i18n.t('header.menu.label')\">\n {{ i18n.t('header.menu.label') }}\n </button>\n </div>\n </div>\n <div *ngIf=\"serviceTitle || beta\" class=\"fr-header__service\">\n <a *ngIf=\"logoLink\" [href]=\"logoLink\" [attr.title]=\"logoTooltipMessage ? logoTooltipMessage : null\">\n <p class=\"fr-header__service-title\">\n {{ serviceTitle }}<span *ngIf=\"beta\" class=\"fr-badge fr-badge--sm fr-badge--green-emeraude\">BETA</span>\n </p>\n </a>\n <p *ngIf=\"!logoLink\" class=\"fr-header__service-title\">\n {{ serviceTitle }}<span *ngIf=\"beta\" class=\"fr-badge fr-badge--sm fr-badge--green-emeraude\">BETA</span>\n </p>\n <!-- BUG Classe 'fr-header__service-tagline' inconnue en DSFR 1.9.3 -->\n <p *ngIf=\"serviceTagline\" class=\"fr-header__service-tagline\">\n {{ serviceTagline }}\n </p>\n </div>\n </div>\n\n <!-- Header tools --------------------------------------------------------------------------------------------->\n\n <!-- Slot -->\n <ng-container *ngIf=\"headerTools\">\n <div class=\"fr-header__tools\"><ng-container *ngTemplateOutlet=\"headerTools\"></ng-container></div>\n </ng-container>\n\n <div *ngIf=\"hasToolsLinks() || searchBar\" class=\"fr-header__tools\">\n <div *ngIf=\"hasToolsLinks()\" class=\"fr-header__tools-links\">\n <ul #toolLinks *ngIf=\"headerToolsLinks || showDisplay\" class=\"fr-btns-group\">\n <li *ngFor=\"let item of headerToolsLinks; let i = index\">\n <edu-item-link\n *ngIf=\"i < maxToolsLinks\"\n [attr.data-item]=\"item.label\"\n [customClass]=\"getCustomClassHeaderToolsLink(item)\"\n [defaultIconPosition]=\"undefined\"\n (linkSelect)=\"onLink(item)\"\n [item]=\"item\">\n </edu-item-link>\n </li>\n <li *ngIf=\"showDisplay\">\n <button\n type=\"button\"\n class=\"fr-btn fr-icon-theme-fill\"\n [attr.aria-controls]=\"displayModalId\"\n data-fr-opened=\"false\">\n {{ i18n.t('display.heading') }}\n </button>\n </li>\n </ul>\n\n <ng-container *ngIf=\"translate\">\n <dsfr-translate\n (langChange)=\"onLanguageChange($event)\"\n [languages]=\"translate.languages\"></dsfr-translate>\n </ng-container>\n </div>\n <div\n *ngIf=\"searchBar\"\n [attr.aria-labelledby]=\"'search-btn-' + searchInputId\"\n class=\"fr-header__search fr-modal\"\n [id]=\"navigationId + '-search'\">\n <div class=\"fr-container fr-container-lg--fluid\">\n <button\n type=\"button\"\n class=\"fr-btn--close fr-btn\"\n [attr.aria-controls]=\"navigationId + '-search'\"\n title=\"{{ i18n.t('commons.close') }}\">\n {{ i18n.t('commons.close') }}\n </button>\n <dsfr-search-bar\n id=\"search-header\"\n [inputId]=\"searchInputId\"\n (searchChange)=\"onSearchChange($event)\"\n (searchSelect)=\"onSearchSubmit($event)\"></dsfr-search-bar>\n </div>\n </div>\n </div>\n <!-- fin header tools ----------------------------------------------------------------------------------------->\n </div>\n </div>\n </div>\n <!-- Menu de navigation principale --------------------------------------------------------------------------------->\n <div\n *ngIf=\"menu\"\n class=\"fr-header__menu fr-modal\"\n [id]=\"navigationId\"\n [attr.aria-labelledby]=\"navigationId + '-button-menu'\">\n <div class=\"fr-container\">\n <button\n type=\"button\"\n class=\"fr-btn--close fr-btn\"\n [attr.aria-controls]=\"navigationId\"\n title=\" {{ i18n.t('commons.close') }}\">\n {{ i18n.t('commons.close') }}\n </button>\n <div #toolLinksMobile (click)=\"onSelectLinkMobile($event)\" class=\"fr-header__menu-links\">\n <ng-container *ngIf=\"headerToolsMobile\">\n <ng-container *ngTemplateOutlet=\"headerToolsMobile\"></ng-container>\n </ng-container>\n </div>\n\n <!-- Composant translate d\u00E9plac\u00E9 dans toolsLinksMobile -->\n <dsfr-translate\n *ngIf=\"translate\"\n #translateComponent\n (langChange)=\"onLanguageChange($event)\"\n [languages]=\"translate.languages\"></dsfr-translate>\n\n <nav class=\"fr-nav\" id=\"{{ navigationId }}-nav\" role=\"navigation\" [attr.aria-label]=\"i18n.t('header.mainMenu')\">\n <ul class=\"fr-nav__list\">\n <ng-container *ngFor=\"let item of menu; let i = index\">\n <!-- Entr\u00E9e de menu simple (lien direct) ------------------------------------------------------------------>\n <li *ngIf=\"!item.subItems && !item.megaMenu\" class=\"fr-nav__item\">\n <edu-item-link [item]=\"item\" customClass=\"fr-nav__link\" (linkSelect)=\"onLink(item)\"></edu-item-link>\n </li>\n <!-- Entr\u00E9e de menu d\u00E9roulant ----------------------------------------------------------------------------->\n <li *ngIf=\"item.subItems\" class=\"fr-nav__item\">\n <button\n type=\"button\"\n class=\"fr-nav__btn\"\n (click)=\"onMenuItemClick(item)\"\n [attr.aria-current]=\"item.active ? true : null\"\n [attr.aria-expanded]=\"item.expanded ?? false\"\n [attr.aria-controls]=\"'menu-' + i\">\n {{ item.label }}\n </button>\n <div class=\"fr-collapse fr-menu\" id=\"menu-{{ i }}\">\n <ul class=\"fr-menu__list\">\n <edu-item-link\n *ngFor=\"let subItem of item.subItems\"\n [item]=\"subItem\"\n customClass=\"fr-nav__link\"\n (linkSelect)=\"onLink(subItem)\"></edu-item-link>\n </ul>\n </div>\n </li>\n <!-- Entr\u00E9e de m\u00E9ga menu ---------------------------------------------------------------------------------->\n <li *ngIf=\"item.megaMenu\" class=\"fr-nav__item\">\n <button\n type=\"button\"\n (click)=\"onMenuItemClick(item)\"\n class=\"fr-nav__btn\"\n [attr.aria-expanded]=\"item.expanded ?? false\"\n [attr.aria-controls]=\"'mega-menu-' + i\"\n [attr.aria-current]=\"item.active ? true : null\">\n {{ item.label }}\n </button>\n <div\n [ngClass]=\"{ 'fr-collapse--expanded': item.expanded }\"\n class=\"fr-collapse fr-mega-menu\"\n id=\"mega-menu-{{ i }}\"\n tabindex=\"-1\">\n <dsfr-mega-menu\n [megaMenu]=\"item.megaMenu\"\n [idMenu]=\"i\"\n (closeSelect)=\"onMegaMenuClose(item)\"\n (linkSelect)=\"onLink($event)\"></dsfr-mega-menu>\n </div>\n </li>\n </ng-container>\n </ul>\n </nav>\n </div>\n </div>\n</header>\n\n<dsfr-display *ngIf=\"showDisplay && _useDeprecatedPictoPath\" [pictoPath]=\"artworkDirPath\"></dsfr-display>\n<dsfr-display *ngIf=\"showDisplay && !_useDeprecatedPictoPath\" [artworkDirPath]=\"artworkDirPath\"></dsfr-display>\n", styles: [".fr-nav__list>*>*>.fr-nav__link{padding:1rem;margin:0;width:auto;height:100%;min-height:3.5rem;font-weight:400}.fr-nav__list>*>*>.fr-nav__link[aria-current]:before{position:absolute;top:auto;bottom:0;left:0;width:100%;height:2px;margin-top:0}.fr-collapse:before{content:\"\"}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3.DsfrMegaMenuComponent, selector: "dsfr-mega-menu", inputs: ["megaMenu", "idMenu"], outputs: ["linkSelect", "closeSelect"] }, { kind: "component", type: i4.DsfrSearchBarComponent, selector: "dsfr-search-bar", inputs: ["inputId", "buttonText", "label", "large", "id"], outputs: ["searchChange", "searchSelect"] }, { kind: "component", type: i5.ItemLinkComponent, selector: "edu-item-link", inputs: ["defaultIconPosition", "item"] }, { kind: "component", type: i6.DsfrTranslateComponent, selector: "dsfr-translate", inputs: ["languages", "outline", "currentLangCode"], outputs: ["langChange"] }, { kind: "component", type: i7.DsfrDisplayComponent, selector: "dsfr-display", inputs: ["displayId", "artworkDirPath", "pictoPath"], outputs: ["displayChange"] }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DsfrHeaderComponent, decorators: [{
type: Component,
args: [{ selector: 'dsfr-header', encapsulation: ViewEncapsulation.None, template: "<header role=\"banner\" class=\"fr-header\">\n <!-- BUG: Classe 'fr-header__body' inconnue en DSFR 1.9.3 -->\n <div class=\"fr-header__body\">\n <div class=\"fr-container\">\n <div class=\"fr-header__body-row\">\n <div class=\"fr-header__brand fr-enlarge-link\">\n <div class=\"fr-header__brand-top\">\n <div class=\"fr-header__logo\">\n <!--Cas marianne sans titre ni image op\u00E9rateur-->\n <a\n *ngIf=\"!serviceTitle && !operatorImagePath\"\n [href]=\"logoLink\"\n [attr.title]=\"logoTooltipMessage ? logoTooltipMessage : null\">\n <p class=\"fr-logo\" [innerHTML]=\"logoLabel\"></p>\n </a>\n <!--Cas marianne avec titre et/ou image op\u00E9rateur-->\n <p *ngIf=\"serviceTitle || operatorImagePath\" class=\"fr-logo\" [innerHTML]=\"logoLabel\"></p>\n </div>\n <div *ngIf=\"operatorImagePath\" class=\"fr-header__operator\">\n <!--Cas o\u00F9 il n'y a pas de titre avec l'image-->\n <a *ngIf=\"!serviceTitle\" [href]=\"logoLink\" [attr.title]=\"logoTooltipMessage ? logoTooltipMessage : null\">\n <img\n class=\"fr-responsive-img\"\n [style.width]=\"operatorImageVertical ? '3.5rem' : null\"\n [style.max-width]=\"!operatorImageVertical ? '9.0625rem' : null\"\n [src]=\"operatorImagePath\"\n [attr.alt]=\"operatorImageAlt\" />\n </a>\n <!--Cas o\u00F9 il y a un titre avec l'image-->\n <img\n *ngIf=\"serviceTitle\"\n class=\"fr-responsive-img\"\n [style.width]=\"operatorImageVertical ? '3.5rem' : null\"\n [style.max-width]=\"!operatorImageVertical ? '9.0625rem' : null\"\n [src]=\"operatorImagePath\"\n [attr.alt]=\"operatorImageAlt\" />\n <!-- L\u2019alternative de l\u2019image (attribut alt) doit imp\u00E9rativement \u00EAtre renseign\u00E9e et reprendre le texte visible dans l\u2019image -->\n </div>\n <div class=\"fr-header__navbar\">\n <button\n *ngIf=\"searchBar\"\n type=\"button\"\n class=\"fr-btn--search fr-btn\"\n data-fr-opened=\"false\"\n [attr.aria-controls]=\"navigationId + '-search'\"\n id=\"{{ navigationId }}-button-search\"\n [title]=\"i18n.t('commons.search')\">\n {{ i18n.t('commons.search') }}\n </button>\n <button\n type=\"button\"\n class=\"fr-btn--menu fr-btn\"\n data-fr-opened=\"false\"\n [attr.aria-controls]=\"navigationId\"\n id=\"{{ navigationId }}-button-menu\"\n [title]=\"i18n.t('header.menu.label')\">\n {{ i18n.t('header.menu.label') }}\n </button>\n </div>\n </div>\n <div *ngIf=\"serviceTitle || beta\" class=\"fr-header__service\">\n <a *ngIf=\"logoLink\" [href]=\"logoLink\" [attr.title]=\"logoTooltipMessage ? logoTooltipMessage : null\">\n <p class=\"fr-header__service-title\">\n {{ serviceTitle }}<span *ngIf=\"beta\" class=\"fr-badge fr-badge--sm fr-badge--green-emeraude\">BETA</span>\n </p>\n </a>\n <p *ngIf=\"!logoLink\" class=\"fr-header__service-title\">\n {{ serviceTitle }}<span *ngIf=\"beta\" class=\"fr-badge fr-badge--sm fr-badge--green-emeraude\">BETA</span>\n </p>\n <!-- BUG Classe 'fr-header__service-tagline' inconnue en DSFR 1.9.3 -->\n <p *ngIf=\"serviceTagline\" class=\"fr-header__service-tagline\">\n {{ serviceTagline }}\n </p>\n </div>\n </div>\n\n <!-- Header tools --------------------------------------------------------------------------------------------->\n\n <!-- Slot -->\n <ng-container *ngIf=\"headerTools\">\n <div class=\"fr-header__tools\"><ng-container *ngTemplateOutlet=\"headerTools\"></ng-container></div>\n </ng-container>\n\n <div *ngIf=\"hasToolsLinks() || searchBar\" class=\"fr-header__tools\">\n <div *ngIf=\"hasToolsLinks()\" class=\"fr-header__tools-links\">\n <ul #toolLinks *ngIf=\"headerToolsLinks || showDisplay\" class=\"fr-btns-group\">\n <li *ngFor=\"let item of headerToolsLinks; let i = index\">\n <edu-item-link\n *ngIf=\"i < maxToolsLinks\"\n [attr.data-item]=\"item.label\"\n [customClass]=\"getCustomClassHeaderToolsLink(item)\"\n [defaultIconPosition]=\"undefined\"\n (linkSelect)=\"onLink(item)\"\n [item]=\"item\">\n </edu-item-link>\n </li>\n <li *ngIf=\"showDisplay\">\n <button\n type=\"button\"\n class=\"fr-btn fr-icon-theme-fill\"\n [attr.aria-controls]=\"displayModalId\"\n data-fr-opened=\"false\">\n {{ i18n.t('display.heading') }}\n </button>\n </li>\n </ul>\n\n <ng-container *ngIf=\"translate\">\n <dsfr-translate\n (langChange)=\"onLanguageChange($event)\"\n [languages]=\"translate.languages\"></dsfr-translate>\n </ng-container>\n </div>\n <div\n *ngIf=\"searchBar\"\n [attr.aria-labelledby]=\"'search-btn-' + searchInputId\"\n class=\"fr-header__search fr-modal\"\n [id]=\"navigationId + '-search'\">\n <div class=\"fr-container fr-container-lg--fluid\">\n <button\n type=\"button\"\n class=\"fr-btn--close fr-btn\"\n [attr.aria-controls]=\"navigationId + '-search'\"\n title=\"{{ i18n.t('commons.close') }}\">\n {{ i18n.t('commons.close') }}\n </button>\n <dsfr-search-bar\n id=\"search-header\"\n [inputId]=\"searchInputId\"\n (searchChange)=\"onSearchChange($event)\"\n (searchSelect)=\"onSearchSubmit($event)\"></dsfr-search-bar>\n </div>\n </div>\n </div>\n <!-- fin header tools ----------------------------------------------------------------------------------------->\n </div>\n </div>\n </div>\n <!-- Menu de navigation principale --------------------------------------------------------------------------------->\n <div\n *ngIf=\"menu\"\n class=\"fr-header__menu fr-modal\"\n [id]=\"navigationId\"\n [attr.aria-labelledby]=\"navigationId + '-button-menu'\">\n <div class=\"fr-container\">\n <button\n type=\"button\"\n class=\"fr-btn--close fr-btn\"\n [attr.aria-controls]=\"navigationId\"\n title=\" {{ i18n.t('commons.close') }}\">\n {{ i18n.t('commons.close') }}\n </button>\n <div #toolLinksMobile (click)=\"onSelectLinkMobile($event)\" class=\"fr-header__menu-links\">\n <ng-container *ngIf=\"headerToolsMobile\">\n <ng-container *ngTemplateOutlet=\"headerToolsMobile\"></ng-container>\n </ng-container>\n </div>\n\n <!-- Composant translate d\u00E9plac\u00E9 dans toolsLinksMobile -->\n <dsfr-translate\n *ngIf=\"translate\"\n #translateComponent\n (langChange)=\"onLanguageChange($event)\"\n [languages]=\"translate.languages\"></dsfr-translate>\n\n <nav class=\"fr-nav\" id=\"{{ navigationId }}-nav\" role=\"navigation\" [attr.aria-label]=\"i18n.t('header.mainMenu')\">\n <ul class=\"fr-nav__list\">\n <ng-container *ngFor=\"let item of menu; let i = index\">\n <!-- Entr\u00E9e de menu simple (lien direct) ------------------------------------------------------------------>\n <li *ngIf=\"!item.subItems && !item.megaMenu\" class=\"fr-nav__item\">\n <edu-item-link [item]=\"item\" customClass=\"fr-nav__link\" (linkSelect)=\"onLink(item)\"></edu-item-link>\n </li>\n <!-- Entr\u00E9e de menu d\u00E9roulant ----------------------------------------------------------------------------->\n <li *ngIf=\"item.subItems\" class=\"fr-nav__item\">\n <button\n type=\"button\"\n class=\"fr-nav__btn\"\n (click)=\"onMenuItemClick(item)\"\n [attr.aria-current]=\"item.active ? true : null\"\n [attr.aria-expanded]=\"item.expanded ?? false\"\n [attr.aria-controls]=\"'menu-' + i\">\n {{ item.label }}\n </button>\n <div class=\"fr-collapse fr-menu\" id=\"menu-{{ i }}\">\n <ul class=\"fr-menu__list\">\n <edu-item-link\n *ngFor=\"let subItem of item.subItems\"\n [item]=\"subItem\"\n customClass=\"fr-nav__link\"\n (linkSelect)=\"onLink(subItem)\"></edu-item-link>\n </ul>\n </div>\n </li>\n <!-- Entr\u00E9e de m\u00E9ga menu ---------------------------------------------------------------------------------->\n <li *ngIf=\"item.megaMenu\" class=\"fr-nav__item\">\n <button\n type=\"button\"\n (click)=\"onMenuItemClick(item)\"\n class=\"fr-nav__btn\"\n [attr.aria-expanded]=\"item.expanded ?? false\"\n [attr.aria-controls]=\"'mega-menu-' + i\"\n [attr.aria-current]=\"item.active ? true : null\">\n {{ item.label }}\n </button>\n <div\n [ngClass]=\"{ 'fr-collapse--expanded': item.expanded }\"\n class=\"fr-collapse fr-mega-menu\"\n id=\"mega-menu-{{ i }}\"\n tabindex=\"-1\">\n <dsfr-mega-menu\n [megaMenu]=\"item.megaMenu\"\n [idMenu]=\"i\"\n (closeSelect)=\"onMegaMenuClose(item)\"\n (linkSelect)=\"onLink($event)\"></dsfr-mega-menu>\n </div>\n </li>\n </ng-container>\n </ul>\n </nav>\n </div>\n </div>\n</header>\n\n<dsfr-display *ngIf=\"showDisplay && _useDeprecatedPictoPath\" [pictoPath]=\"artworkDirPath\"></dsfr-display>\n<dsfr-display *ngIf=\"showDisplay && !_useDeprecatedPictoPath\" [artworkDirPath]=\"artworkDirPath\"></dsfr-display>\n", styles: [".fr-nav__list>*>*>.fr-nav__link{padding:1rem;margin:0;width:auto;height:100%;min-height:3.5rem;font-weight:400}.fr-nav__list>*>*>.fr-nav__link[aria-current]:before{position:absolute;top:auto;bottom:0;left:0;width:100%;height:2px;margin-top:0}.fr-collapse:before{content:\"\"}\n"] }]
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
type: Inject,
args: [DSFR_CONFIG_TOKEN]
}] }, { type: i1.I18nService }, { type: i0.Renderer2 }]; }, propDecorators: { toolLinksMobile: [{
type: ViewChild,
args: ['toolLinksMobile']
}], toolLinks: [{
type: ViewChild,
args: ['toolLinks']
}], headerTools: [{
type: ContentChild,
args: ['headerTools', { static: true }]
}], headerToolsMobile: [{
type: ContentChild,
args: ['headerToolsMobile', { static: true }]
}], translateComponent: [{
type: ViewChild,
args: ['translateComponent', { read: ElementRef }]
}], beta: [{
type: Input
}], navigationId: [{
type: Input
}], artworkDirPath: [{
type: Input
}], logoLabel: [{
type: Input
}], logoLink: [{
type: Input
}], logoTooltipMessage: [{
type: Input
}], operatorImagePath: [{
type: Input
}], operatorImageAlt: [{
type: Input
}], operatorImageVertical: [{
type: Input
}], serviceTitle: [{
type: Input
}], serviceTagline: [{
type: Input
}], menu: [{
type: Input
}], searchBar: [{
type: Input
}], translate: [{
type: Input
}], searchChange: [{
type: Output
}], searchSelect: [{
type: Output
}], linkSelect: [{
type: Output
}], langChange: [{
type: Output
}], display: [{
type: Input
}], headerToolsLinks: [{
type: Input
}], pictoPath: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvaGVhZGVyL2hlYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBRUwsTUFBTSxFQUdOLFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF5QixXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDbEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFckUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sWUFBWSxDQUFDOzs7Ozs7Ozs7QUFTOUMsTUFBTSxPQUFPLG1CQUFtQjtJQTJHOUIsZ0JBQWdCO0lBQ2hCLFlBQ3FDLE1BQWtCLEVBQzlDLElBQWlCLEVBQ2hCLFFBQW1CO1FBRlEsV0FBTSxHQUFOLE1BQU0sQ0FBWTtRQUM5QyxTQUFJLEdBQUosSUFBSSxDQUFhO1FBQ2hCLGFBQVEsR0FBUixRQUFRLENBQVc7UUFuRzdCOztXQUVHO1FBQ00sU0FBSSxHQUFHLEtBQUssQ0FBQztRQVl0Qjs7O1dBR0c7UUFDTSxjQUFTLEdBQUcsMEJBQTBCLENBQUM7UUFrQmhELCtEQUErRDtRQUN0RCwwQkFBcUIsR0FBRyxLQUFLLENBQUM7UUFRdkMsK0JBQStCO1FBQ3RCLFNBQUksR0FBeUIsRUFBRSxDQUFDO1FBRXpDOztXQUVHO1FBQ00sY0FBUyxHQUFHLEtBQUssQ0FBQztR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QVM7c0JBQWpCLEtBQUs7Z0JBR2EsWUFBWTtzQkFBOUIsTUFBTTtnQkFHWSxZQUFZO3NCQUE5QixNQUFNO2dCQUdZLFVBQVU7c0JBQTVCLE1BQU07Z0JBR1ksVUFBVTtzQkFBNUIsTUFBTTtnQkFnRE0sT0FBTztzQkFBbkIsS0FBSztnQkFTTyxnQkFBZ0I7c0JBQTVCLEtBQUs7Z0JBc0JPLFNBQVM7c0JBQXJCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUmVuZGVyZXIyLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEc2ZyTGluaywgSTE4blNlcnZpY2UsIG5ld1VuaXF1ZUlkIH0gZnJvbSAnLi4vLi4vc2hhcmVkJztcbmltcG9ydCB7IERTRlJfQ09ORklHX1RPS0VOIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2NvbmZpZy9jb25maWctdG9rZW4nO1xuaW1wb3J0IHsgRHNmckNvbmZpZyB9IGZyb20gJy4uLy4uL3NoYXJlZC9jb25maWcvY29uZmlnLm1vZGVsJztcbmltcG9ydCB7IERJU1BMQVlfTU9EQUxfSUQgfSBmcm9tICcuLi9kaXNwbGF5JztcbmltcG9ydCB7IERzZnJIZWFkZXJNZW51SXRlbSwgRHNmckhlYWRlclRyYW5zbGF0ZSB9IGZyb20gJy4vaGVhZGVyLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZHNmci1oZWFkZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vaGVhZGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaGVhZGVyLmNvbXBvbmVudC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIERzZnJIZWFkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuICAvKipAaW50ZXJuYWwgKi9cbiAgQFZpZXdDaGlsZCgndG9vbExpbmtzTW9iaWxlJykgdG9vbExpbmtzTW9iaWxlOiBFbGVtZW50UmVmO1xuICAvKipAaW50ZXJuYWwgKi9cbiAgQFZpZXdDaGlsZCgndG9vbExpbmtzJykgdG9vbExpbmtzOiBFbGVtZW50UmVmO1xuICAvKipAaW50ZXJuYWwgKi9cbiAgQENvbnRlbnRDaGlsZCgnaGVhZGVyVG9vbHMnLCB7IHN0YXRpYzogdHJ1ZSB9KSBoZWFkZXJUb29sczogVGVtcGxhdGVSZWY8YW55PjtcbiAgLyoqQGludGVybmFsICovXG4gIEBDb250ZW50Q2hpbGQoJ2hlYWRlclRvb2xzTW9iaWxlJywgeyBzdGF0aWM6IHRydWUgfSkgaGVhZGVyVG9vbHNNb2JpbGU6IFRlbXBsYXRlUmVmPGFueT47XG4gIC8qKkBpbnRlcm5hbCAqL1xuICBAVmlld0NoaWxkKCd0cmFuc2xhdGVDb21wb25lbnQnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgdHJhbnNsYXRlQ29tcG9uZW50OiBFbGVtZW50UmVmO1xuXG4gIC8qKlxuICAgKiBCb29sZWFuIHBvdXIgYWZmaWNoZXIgbGUgdGFnIEJldGEgKHBvdXIgdW4gc2l0ZSBlbiBiZXRhKS5cbiAgICovXG4gIEBJbnB1dCgpIGJldGEgPSBmYWxzZTtcblxuICAvKipcbiAgICogSWRlbnRpZmlhbnQgZGUgbGEgbmF2aWdhdGlvbiBwcmluY2lwYWxlLCBnw6luw6lyw6kgcGFyIGTDqWZhdXRcbiAgICovXG4gIEBJbnB1dCgpIG5hdmlnYXRpb25JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDaGVtaW4gdmVycyBsZSByw6lwZXJ0b2lyZSBleHBvc2FudCBsZXMgcGljdG9ncmFtbWVzIGlsbHVzdHJhdGlmcyBEU0ZSLlxuICAgKi9cbiAgQElucHV0KCkgYXJ0d29ya0RpclBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogTGFiZWwgYXNzb2Npw6kgYXUgYmxvYyBtYXJxdWUgKE1hcmlhbm5lKS4gUmVzcGVjdGV6IGxhIHN0cnVjdHVyZSBhdmVjIGxlcyA8YnI+LlxuICAgKiAoTWluaXN0w6hyZSwgZ291dmVybmVtZW50LCByw6lwdWJsaXF1ZSBmcmFuw6dhaXNlKVxuICAgKi9cbiAgQElucHV0KCkgbG9nb0xhYmVsID0gJ1LDqXB1YmxpcXVlPGJyLz5GcmFuw6dhaXNlJztcbiAgLyoqXG4gICAqIFVybCBkdSBsaWVuICdyZXRvdXIgYWNjdWVpbCcgZHUgbG9nbyBkZSBsYSBNYXJpYW5uZS5cbiAgICovXG4gIC8vVE9ETzogaW1wbMOpbWVudGVyIGxhIHRvdGFsaXTDqSBkZSBsJ2ludGVyZmFjZSBEc2ZyTmF2aWdhdGlvblxuICBASW5wdXQoKSBsb2dvTGluazogc3RyaW5nO1xuICAvKipcbiAgICogVXJsIGR1IGxpZW4gJ3JldG91ciBhY2N1ZWlsJyBkdSBsb2dvIGRlIGxhIE1hcmlhbm5lLlxuICAgKi9cbiAgQElucHV0KCkgbG9nb1Rvb2x0aXBNZXNzYWdlOiBzdHJpbmc7XG5cbiAgLyoqIFBhdGggcG91ciBzcmMgZCdpbWFnZSBkJ2lsbHVzdHJhdGlvbi4gKi9cbiAgQElucHV0KCkgb3BlcmF0b3JJbWFnZVBhdGg6IHN0cmluZztcbiAgLyoqXG4gICAqIFRleHQgYWx0ZXJuYXRpZiDDoCB1dGlsaXNlciB1bmlxdWVtZW50IHNpIGwnaW1hZ2Ugw6AgdW5lIGluZm9ybWF0aW9uIMOgIHBhc3Nlci5cbiAgICovXG4gIEBJbnB1dCgpIG9wZXJhdG9ySW1hZ2VBbHQ6IHN0cmluZztcblxuICAvKiogQm9vbGVhbiBwb3VyIHBhc3NlciBsZSBsb2dvIG9ww6lyYXRldXIgZW4gbW9kZSB2ZXJ0aWNhbC4gICovXG4gIEBJbnB1dCgpIG9wZXJhdG9ySW1hZ2VWZXJ0aWNhbCA9IGZhbHNlO1xuXG4gIC8qKiBOb20gZHUgc2VydmljZS4gKi9cbiAgQElucHV0KCkgc2VydmljZVRpdGxlOiBzdHJpbmc7XG5cbiAgLyoqIFRhZ2xpbmUgZHUgc2VydmljZS4gKi9cbiAgQElucHV0KCkgc2VydmljZVRhZ2xpbmU6IHN0cmluZztcblxuICAvKiogVGFibGVhdSBkJ2l0ZW1zIGR1IG1lbnUuICovXG4gIEBJbnB1dCgpIG1lbnU6IERzZnJIZWFkZXJNZW51SXRlbVtdID0gW107XG5cbiAgLyoqXG4gICAqIFBlcm1ldCBkJ2FmZmljaGVyIGxhIGJhcnJlIGRlIHJlY2hlcmNoZS5cbiAgICovXG4gIEBJbnB1dCgpIHNlYXJjaEJhciA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBQZXJtZXQgZCdhZmZpY2hlciBsZSBzZWxlY3RldXIgZGUgbGFuZ3VlIHBvdXIgbCdpbnRlcm5hdGlvbmFsaXNhdGlvbi5cbiAgICpcbiAgICogQHNlZSBEc2ZySGVhZGVyVHJhbnNsYXRlXG4gICAqL1xuICBASW5wdXQoKSB0cmFuc2xhdGU6IERzZnJIZWFkZXJUcmFuc2xhdGU7XG5cbiAgLyoqIFJlbnZvaSBsYSB2YWxldXIgZGUgbCdpbnB1dCBkZSBsYSBiYXJyZSBkZSByZWNoZXJjaGUgYXUgY2hhbmdlbWVudC4gICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBzZWFyY2hDaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8qKiBSZW52b2kgbGEgdmFsZXVyIGRlIGwnaW5wdXQgZGUgbGEgYmFycmUgZGUgcmVjaGVyY2hlIGF1IGNsaWMgc3VyIHJlY2hlcmNoZXIuICAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgc2VhcmNoU2VsZWN0OiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipFbWV0IGwnw6l2w6huZW1lbnQgRXZlbnQgZHUgRE9NIMOgIGxhIHPDqWxlY3Rpb24gZCd1biBsaWVuICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBsaW5rU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxEc2ZyTGluaz4oKTtcblxuICAvKiogRXZlbmVtZW50IMOpbWlzIGF1IGNoYW5nZW1lbnQgZGUgbGFuZ3VlIChzaSBzaG93VHJhbnNsYXRlKS4gSWwgY29udGllbnQgbGUgY29kZSBkZSBsYSBsYW5ndWUuICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBsYW5nQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgc2VhcmNoSW5wdXRJZCA9IG5ld1VuaXF1ZUlkKCk7XG5cbiAgLyoqXG4gICAqIE5vbWJyZSBtYXhpbXVtIGRlIGxpZW5zIGQnYWNjw6hzIHJhcGlkZXMgKDMpXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgbWF4VG9vbHNMaW5rcyA9IDM7XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX3VzZURlcHJlY2F0ZWRQaWN0b1BhdGggPSBmYWxzZTtcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBzaG93RGlzcGxheTogYm9vbGVhbjtcblxuICBwcml2YXRlIF9oZWFkZXJUb29sc0xpbmtzOiBEc2ZyTGlua1tdOyAvLyBuZSBwYXMgaW5pdGlhbGlzZXIgw6AgW10gcG91ciBTdG9yeUJvb2tcblxuICAvKiogQGludGVybmFsICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoRFNGUl9DT05GSUdfVE9LRU4pIHByaXZhdGUgY29uZmlnOiBEc2ZyQ29uZmlnLFxuICAgIHB1YmxpYyBpMThuOiBJMThuU2VydmljZSxcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICkge31cblxuICBnZXQgZGlzcGxheSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zaG93RGlzcGxheTtcbiAgfVxuXG4gIGdldCBoZWFkZXJUb29sc0xpbmtzKCk6IERzZnJMaW5rW10ge1xuICAgIHJldHVybiB0aGlzLl9oZWFkZXJUb29sc0xpbmtzO1xuICB9XG5cbiAgZ2V0IGRpc3BsYXlNb2RhbElkKCkge1xuICAgIHJldHVybiBESVNQTEFZX01PREFMX0lEO1xuICB9XG5cbiAgZ2V0IHBpY3RvUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFydHdvcmtEaXJQYXRoO1xuICB9XG5cbiAgLyoqIEFmZmljaGFnZSBkdSBsaWVuICdQYXJhbcOodHJlIGQnYWZmaWNoYWdlJyBwb3VyIGfDqXJlciBsZXMgbW9kZXMgY2xhaXIvc29tYnJlLiAqL1xuICBASW5wdXQoKSBzZXQgZGlzcGxheSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2hvd0Rpc3BsYXkgPSB2YWx1ZTtcbiAgICB0aGlzLm1heFRvb2xzTGlua3MgPSB0aGlzLnNob3dEaXNwbGF5ID8gMiA6IDM7XG4gIH1cblxuICAvKipcbiAgICogVGFibGVhdSBkZSBsaWVuIGQnYWNjw6hzIHJhcGlkZS5cbiAgICogTGVzIGljw7RuZXMgYWNjZXB0w6lzIHNvbnQgY2V1eCBkdSBEU0ZSIHkgY29tcHJpcyBjZXV4IGR1IHRhYmxlYXUgYERzZnJCdG5JY29uYC5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBoZWFkZXJUb29sc0xpbmtzKGxpbmtzOiBEc2ZyTGlua1tdKSB7XG4gICAgaWYgKGxpbmtzICYmIGxpbmtzLmxlbmd0aCA+IHRoaXMubWF4VG9vbHNMaW5rcykge1xuICAgICAgaWYgKHRoaXMuc2hvd0Rpc3BsYXkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIFwiQXZlYyBsJ3V0aWxpc2F0aW9uIGR1IHBhcmFtw6h0cmUgZCdhZmZpY2hhZ2UsIGxlIG5vbWJyZSBkJ2FjY8OocyByYXBpZGVzICh0b29scyBsaW5rcykgZXN0IGxpbWl0w6kgw6AgXCIgK1xuICAgICAgICAgICAgdGhpcy5tYXhUb29sc0xpbmtzLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiTGUgbm9tYnJlIGQnYWNjw6hzIHJhcGlkZXMgKHRvb2xzIGxpbmtzKSBlc3QgbGltaXTDqSDDoCBcIiArIHRoaXMubWF4VG9vbHNMaW5rcyk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2hlYWRlclRvb2xzTGlua3MgPSBsaW5rcztcbiAgICB0aGlzLmR1cGxpY2F0ZVRvb2xzTGlua3NNb2JpbGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVtaW4gZGVzIHBpY3RvZ3JhbW1lcyAoZHUgY29tcG9zYW50IGRpc3BsYXkpIHJlbnNlaWduw6kgcGFyIGxlIGTDqXZlbG9wcGV1ci5cbiAgICpcbiAgICogTm90ZTogY2UgY2hlbWluIGRvaXQgcGVybWV0dHJlIGRlIHLDqWN1cMOpcmVyIGRpcmVjdGVtZW50IGxlcyBmaWNoaWVycyBTVkcgc3VpdmFudHMgOiBtb29uLnN2Zywgc3VuLnN2Zywgc3lzdGVtLnN2Z1xuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYGFydHdvcmtEaXJQYXRoYCBpbnN0ZWFkLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IHBpY3RvUGF0aChwYXRoOiBzdHJpbmcpIHtcbiAgICB0aGlzLmFydHdvcmtEaX