@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).
86 lines • 32.1 kB
JavaScript
import { CommonModule } from '@angular/common';
import { ChangeDetectionStrategy, Component, ContentChild, EventEmitter, inject, Input, Output, Renderer2, ViewChild, ViewEncapsulation, } from '@angular/core';
import { newUniqueId } from '../../../shared';
import { DsfrButtonComponent } from '../../button';
import { DsfrLinkComponent } from '../../link';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class DsfrToolLinkMenuComponent {
constructor() {
/** Liste des liens. Prioritaire sur le slot linksTemplate */
this.links = [];
/** Suppression de la bordure si false */
this.outline = true;
/** Evènement émis au clic sur un lien */
this.linkSelect = new EventEmitter();
/** Signale l'ouverture du menu. */
this.disclose = new EventEmitter();
/** Signale la fermeture du menu. */
this.conceal = new EventEmitter();
this.renderer2 = inject(Renderer2);
this._unlisten = [];
}
ngOnInit() {
this.menuId ??= newUniqueId();
}
/**
* Ecouter les events scripts dsfr conceal/disclose sur le menu
* conceal: uniquement apres une premiere ouverture (présence de fr-collapse--expanded)
*/
ngAfterViewInit() {
this._unlisten.push(this.renderer2.listen(this.collapseMenu.nativeElement, 'dsfr.conceal', () => {
if (this.collapseMenu.nativeElement.className.includes('fr-collapse--expanded')) {
this.conceal.emit();
}
}), this.renderer2.listen(this.collapseMenu.nativeElement, 'dsfr.disclose', () => {
this.disclose.emit();
}));
}
ngOnDestroy() {
this._unlisten.forEach((unlistenFunc) => unlistenFunc());
}
onLinkSelect(link) {
this.linkSelect.emit(link);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrToolLinkMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DsfrToolLinkMenuComponent, isStandalone: true, selector: "dsfr-tool-link-menu, dsfr-ext-toolsmenu, dsfrx-toolsmenu", inputs: { menuId: "menuId", labelMenu: "labelMenu", ariaLabelMenu: "ariaLabelMenu", disabled: "disabled", iconMenu: "iconMenu", links: "links", customClass: "customClass", outline: "outline" }, outputs: { linkSelect: "linkSelect", disclose: "disclose", conceal: "conceal" }, queries: [{ propertyName: "headerTemplate", first: true, predicate: ["headerTemplate"], descendants: true, static: true }, { propertyName: "footerTemplate", first: true, predicate: ["footerTemplate"], descendants: true, static: true }, { propertyName: "linksTemplate", first: true, predicate: ["linksTemplate"], descendants: true, static: true }], viewQueries: [{ propertyName: "collapseMenu", first: true, predicate: ["collapseMenu"], descendants: true }], ngImport: i0, template: "<div class=\"fr-nav fr-nav__item edu-tool-link-menu\">\n <!-- ajouter ariaLabel ?-->\n <button\n #btnMenu\n [id]=\"menuId\"\n type=\"button\"\n class=\"edu-menu-dropdown__btn fr-btn--sm fr-btn--icon-left fr-btn {{ iconMenu ?? '' }}\"\n [ngClass]=\"{ 'fr-btn--tertiary': outline, 'fr-btn--tertiary-no-outline': !outline }\"\n [disabled]=\"disabled || null\"\n [attr.aria-controls]=\"menuId + '-menu'\"\n [attr.aria-label]=\"ariaLabelMenu ?? null\"\n [attr.aria-expanded]=\"false\">\n {{ labelMenu }}\n </button>\n\n <div\n #collapseMenu\n class=\"fr-collapse fr-menu\"\n [ngClass]=\"customClass\"\n [id]=\"menuId + '-menu'\"\n [attr.aria-labelledby]=\"menuId\">\n <div class=\"fr-menu__list\">\n <!-- Header ------------------------------------------------------------------------>\n @if (headerTemplate) {\n <div class=\"edu-tool-link-menu__header\">\n <!-- Affichage du slot header -->\n <ng-container *ngTemplateOutlet=\"headerTemplate\"></ng-container>\n </div>\n }\n\n <!-- Liens ------------------------------------------------------------------------->\n @if (links && links.length > 0) {\n <ul>\n @for (link of links; track link) {\n <li>\n <ng-container [ngTemplateOutlet]=\"linkTemplate\" [ngTemplateOutletContext]=\"{ link: link }\"></ng-container>\n </li>\n }\n </ul>\n } @else if (linksTemplate) {\n <!-- Affichage du slot links -->\n <ng-container *ngTemplateOutlet=\"linksTemplate\"></ng-container>\n }\n\n <!-- Footer ----------------------------------------------------------------------->\n @if (footerTemplate) {\n <div class=\"edu-tool-link-menu__footer\">\n <!-- Affichage du slot footer -->\n <ng-container *ngTemplateOutlet=\"footerTemplate\"></ng-container>\n </div>\n }\n </div>\n </div>\n</div>\n\n<ng-template #linkTemplate let-link=\"link\">\n <dsfr-link\n [tooltipMessage]=\"link.tooltipMessage\"\n [ariaLabel]=\"link.label ? link.ariaLabel : link.label\"\n [ariaControls]=\"link.ariaControls\"\n [link]=\"link.link\"\n [label]=\"link.icon ? undefined : link.label\"\n [linkTarget]=\"link.linkTarget\"\n [route]=\"link.route\"\n [customClass]=\"'fr-nav__link'\"\n [routePath]=\"link.routerLink\"\n [routerLinkActive]=\"link.routerLinkActive ?? ''\"\n [routerLinkExtras]=\"link.routerLinkExtras\"\n [mode]=\"link.mode\"\n [ariaCurrent]=\"link.active\"\n (linkSelect)=\"onLinkSelect(link)\"\n [disabled]=\"disabled\">\n <!-- Pour avoir a la fois un item actif et une icone, surcharger ici avec le slot -->\n @if (link.icon) {\n <i class=\"{{ link.icon }} edu-item-icon\"></i>\n <span label>{{ link.label }}</span>\n }\n </dsfr-link>\n</ng-template>\n", styles: [".edu-menu-dropdown__btn,.fr-header__tools-links .fr-btns-group .edu-menu-dropdown__btn{margin:0}.edu-menu-dropdown__btn:after,.fr-header__tools-links .fr-btns-group .edu-menu-dropdown__btn:after{--data-uri-svg: url(\"data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' x='0px' y='0px' viewBox='0 0 24 24' ><path fill='%23929292' d='M12,13.1l5-4.9l1.4,1.4L12,15.9L5.6,9.5l1.4-1.4L12,13.1z'/></svg>\");flex:0 0 auto;display:inline-block;background-color:currentColor;width:var(--icon-size);height:var(--icon-size);mask-size:100% 100%;mask-image:var(--data-uri-svg);content:\"\";margin-left:.5rem;margin-right:-.125rem;transition:transform .3s}.edu-menu-dropdown__btn.fr-btn--sm,.fr-header__tools-links .fr-btns-group .edu-menu-dropdown__btn.fr-btn--sm{--icon-size: 1rem}.edu-menu-dropdown__btn.fr-btn--sm:after,.fr-header__tools-links .fr-btns-group .edu-menu-dropdown__btn.fr-btn--sm:after{--icon-size: 1rem;font-size:.875rem}.edu-menu-dropdown__btn.fr-btn--lg,.fr-header__tools-links .fr-btns-group .edu-menu-dropdown__btn.fr-btn--lg{--icon-size: 1.25rem;font-size:1.125rem}.edu-menu-dropdown__btn[aria-expanded=true],.fr-header__tools-links .fr-btns-group .edu-menu-dropdown__btn[aria-expanded=true]{background-color:var(--background-action-low-blue-france)}.edu-menu-dropdown__btn[aria-expanded=true]:after,.fr-header__tools-links .fr-btns-group .edu-menu-dropdown__btn[aria-expanded=true]:after{transform:rotate(-180deg)}\n", ".edu-tool-link-menu{--rows: 8;position:relative;margin-left:.25rem;margin-right:.25rem}.edu-tool-link-menu .edu-menu-dropdown__btn{font-weight:500;padding:.25rem .75rem}.edu-tool-link-menu .fr-menu__list{width:auto}.edu-tool-link-menu .fr-menu__list ul{width:max-content}.edu-tool-link-menu .fr-menu__list a.fr-nav__link,.edu-tool-link-menu .fr-menu__list button.fr-nav__link{border-bottom:1px solid var(--border-default-grey);justify-content:flex-start}.edu-tool-link-menu .fr-menu__list a.fr-nav__link[href]:hover,.edu-tool-link-menu .fr-menu__list button.fr-nav__link[href]:hover{--underline-hover-width: var(--underline-max-width);background-color:var(--hover-tint)}.edu-tool-link-menu .fr-menu__list li:last-child a.fr-link,.edu-tool-link-menu .fr-menu__list li:last-child button.fr-link{border-bottom:none}.edu-tool-link-menu .fr-menu__list .edu-item-icon:before{--icon-size: 1rem;margin-right:.5rem}.edu-tool-link-menu__header{border-bottom:1px solid var(--border-default-grey);text-align:left}.edu-tool-link-menu__header,.edu-tool-link-menu__footer{padding:.75rem 1rem}.fr-btns-group .edu-tool-link-menu__footer .fr-btn{width:100%;justify-content:center!important;display:inline-flex;align-items:center;margin:0}@media screen and (max-width: 62em){.fr-header .fr-container .fr-header__menu-links .fr-btns-group .edu-tool-link-menu{margin:0;overflow:hidden}.fr-header .fr-container .fr-header__menu-links .fr-btns-group .edu-tool-link-menu .edu-menu-dropdown__btn.fr-btn{padding-left:.5rem!important;padding-right:.5rem!important;margin:0}.fr-header .fr-container .fr-header__menu-links .fr-btns-group .edu-tool-link-menu .edu-tool-link-menu__footer .fr-btn{width:100%;justify-content:center;font-size:.875rem;min-height:auto;padding:.25rem .75rem!important;min-height:auto!important;box-shadow:inset 0 0 0 1px var(--border-default-grey)}.fr-header .fr-container .fr-header__menu-links .fr-btns-group.fr-nav.fr-nav__item:before{box-shadow:none}.fr-header .fr-container .fr-header__menu-links .fr-btns-group .fr-menu__list{padding-right:0}.fr-header .fr-container .fr-header__menu-links .fr-btns-group .fr-menu__list ul{width:100%}.fr-header .fr-container .fr-header__menu-links .fr-btns-group .fr-menu__list a.fr-link,.fr-header .fr-container .fr-header__menu-links .fr-btns-group .fr-menu__list button.fr-link{border-bottom:none}.edu-usermenu.fr-menu{width:100%;padding-right:0;padding-left:0}.edu-menu-dropdown__btn.fr-btn--tertiary.fr-btn--sm{box-shadow:none;display:inline-flex;align-items:center;min-height:3rem;font-size:1rem;width:100%}.edu-menu-dropdown__btn.fr-btn--tertiary.fr-btn--sm:after{--icon-size: 1rem;margin-left:auto}}.fr-header__body-row:has(.edu-header__tools--custom) .fr-header__tools{flex:initial}.fr-header__body-row:has(.edu-header__tools--custom) .fr-header__tools.edu-header__tools--custom{flex:1 0 auto}.fr-header__body-row:has(.edu-header__tools--custom) .fr-header__tools:not(:last-child){padding-right:0;margin-right:.5rem}.fr-header__body-row:has(.edu-header__tools--custom) .fr-header__tools:not(:first-child){padding-left:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: DsfrLinkComponent, selector: "dsfr-link", inputs: ["ariaCurrent", "ariaLabel", "ariaControls", "customClass", "disabled", "icon", "iconPosition", "linkId", "label", "link", "linkTarget", "route", "routePath", "routerLinkActive", "routerLinkActiveOptions", "routerLinkExtras", "linkSize", "tooltipMessage", "mode", "ariaCurrentWhenActive", "size", "targetLink", "routerLink"], outputs: ["linkSelect"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrToolLinkMenuComponent, decorators: [{
type: Component,
args: [{ selector: 'dsfr-tool-link-menu, dsfr-ext-toolsmenu, dsfrx-toolsmenu', standalone: true, imports: [CommonModule, DsfrLinkComponent, DsfrButtonComponent], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div class=\"fr-nav fr-nav__item edu-tool-link-menu\">\n <!-- ajouter ariaLabel ?-->\n <button\n #btnMenu\n [id]=\"menuId\"\n type=\"button\"\n class=\"edu-menu-dropdown__btn fr-btn--sm fr-btn--icon-left fr-btn {{ iconMenu ?? '' }}\"\n [ngClass]=\"{ 'fr-btn--tertiary': outline, 'fr-btn--tertiary-no-outline': !outline }\"\n [disabled]=\"disabled || null\"\n [attr.aria-controls]=\"menuId + '-menu'\"\n [attr.aria-label]=\"ariaLabelMenu ?? null\"\n [attr.aria-expanded]=\"false\">\n {{ labelMenu }}\n </button>\n\n <div\n #collapseMenu\n class=\"fr-collapse fr-menu\"\n [ngClass]=\"customClass\"\n [id]=\"menuId + '-menu'\"\n [attr.aria-labelledby]=\"menuId\">\n <div class=\"fr-menu__list\">\n <!-- Header ------------------------------------------------------------------------>\n @if (headerTemplate) {\n <div class=\"edu-tool-link-menu__header\">\n <!-- Affichage du slot header -->\n <ng-container *ngTemplateOutlet=\"headerTemplate\"></ng-container>\n </div>\n }\n\n <!-- Liens ------------------------------------------------------------------------->\n @if (links && links.length > 0) {\n <ul>\n @for (link of links; track link) {\n <li>\n <ng-container [ngTemplateOutlet]=\"linkTemplate\" [ngTemplateOutletContext]=\"{ link: link }\"></ng-container>\n </li>\n }\n </ul>\n } @else if (linksTemplate) {\n <!-- Affichage du slot links -->\n <ng-container *ngTemplateOutlet=\"linksTemplate\"></ng-container>\n }\n\n <!-- Footer ----------------------------------------------------------------------->\n @if (footerTemplate) {\n <div class=\"edu-tool-link-menu__footer\">\n <!-- Affichage du slot footer -->\n <ng-container *ngTemplateOutlet=\"footerTemplate\"></ng-container>\n </div>\n }\n </div>\n </div>\n</div>\n\n<ng-template #linkTemplate let-link=\"link\">\n <dsfr-link\n [tooltipMessage]=\"link.tooltipMessage\"\n [ariaLabel]=\"link.label ? link.ariaLabel : link.label\"\n [ariaControls]=\"link.ariaControls\"\n [link]=\"link.link\"\n [label]=\"link.icon ? undefined : link.label\"\n [linkTarget]=\"link.linkTarget\"\n [route]=\"link.route\"\n [customClass]=\"'fr-nav__link'\"\n [routePath]=\"link.routerLink\"\n [routerLinkActive]=\"link.routerLinkActive ?? ''\"\n [routerLinkExtras]=\"link.routerLinkExtras\"\n [mode]=\"link.mode\"\n [ariaCurrent]=\"link.active\"\n (linkSelect)=\"onLinkSelect(link)\"\n [disabled]=\"disabled\">\n <!-- Pour avoir a la fois un item actif et une icone, surcharger ici avec le slot -->\n @if (link.icon) {\n <i class=\"{{ link.icon }} edu-item-icon\"></i>\n <span label>{{ link.label }}</span>\n }\n </dsfr-link>\n</ng-template>\n", styles: [".edu-menu-dropdown__btn,.fr-header__tools-links .fr-btns-group .edu-menu-dropdown__btn{margin:0}.edu-menu-dropdown__btn:after,.fr-header__tools-links .fr-btns-group .edu-menu-dropdown__btn:after{--data-uri-svg: url(\"data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' x='0px' y='0px' viewBox='0 0 24 24' ><path fill='%23929292' d='M12,13.1l5-4.9l1.4,1.4L12,15.9L5.6,9.5l1.4-1.4L12,13.1z'/></svg>\");flex:0 0 auto;display:inline-block;background-color:currentColor;width:var(--icon-size);height:var(--icon-size);mask-size:100% 100%;mask-image:var(--data-uri-svg);content:\"\";margin-left:.5rem;margin-right:-.125rem;transition:transform .3s}.edu-menu-dropdown__btn.fr-btn--sm,.fr-header__tools-links .fr-btns-group .edu-menu-dropdown__btn.fr-btn--sm{--icon-size: 1rem}.edu-menu-dropdown__btn.fr-btn--sm:after,.fr-header__tools-links .fr-btns-group .edu-menu-dropdown__btn.fr-btn--sm:after{--icon-size: 1rem;font-size:.875rem}.edu-menu-dropdown__btn.fr-btn--lg,.fr-header__tools-links .fr-btns-group .edu-menu-dropdown__btn.fr-btn--lg{--icon-size: 1.25rem;font-size:1.125rem}.edu-menu-dropdown__btn[aria-expanded=true],.fr-header__tools-links .fr-btns-group .edu-menu-dropdown__btn[aria-expanded=true]{background-color:var(--background-action-low-blue-france)}.edu-menu-dropdown__btn[aria-expanded=true]:after,.fr-header__tools-links .fr-btns-group .edu-menu-dropdown__btn[aria-expanded=true]:after{transform:rotate(-180deg)}\n", ".edu-tool-link-menu{--rows: 8;position:relative;margin-left:.25rem;margin-right:.25rem}.edu-tool-link-menu .edu-menu-dropdown__btn{font-weight:500;padding:.25rem .75rem}.edu-tool-link-menu .fr-menu__list{width:auto}.edu-tool-link-menu .fr-menu__list ul{width:max-content}.edu-tool-link-menu .fr-menu__list a.fr-nav__link,.edu-tool-link-menu .fr-menu__list button.fr-nav__link{border-bottom:1px solid var(--border-default-grey);justify-content:flex-start}.edu-tool-link-menu .fr-menu__list a.fr-nav__link[href]:hover,.edu-tool-link-menu .fr-menu__list button.fr-nav__link[href]:hover{--underline-hover-width: var(--underline-max-width);background-color:var(--hover-tint)}.edu-tool-link-menu .fr-menu__list li:last-child a.fr-link,.edu-tool-link-menu .fr-menu__list li:last-child button.fr-link{border-bottom:none}.edu-tool-link-menu .fr-menu__list .edu-item-icon:before{--icon-size: 1rem;margin-right:.5rem}.edu-tool-link-menu__header{border-bottom:1px solid var(--border-default-grey);text-align:left}.edu-tool-link-menu__header,.edu-tool-link-menu__footer{padding:.75rem 1rem}.fr-btns-group .edu-tool-link-menu__footer .fr-btn{width:100%;justify-content:center!important;display:inline-flex;align-items:center;margin:0}@media screen and (max-width: 62em){.fr-header .fr-container .fr-header__menu-links .fr-btns-group .edu-tool-link-menu{margin:0;overflow:hidden}.fr-header .fr-container .fr-header__menu-links .fr-btns-group .edu-tool-link-menu .edu-menu-dropdown__btn.fr-btn{padding-left:.5rem!important;padding-right:.5rem!important;margin:0}.fr-header .fr-container .fr-header__menu-links .fr-btns-group .edu-tool-link-menu .edu-tool-link-menu__footer .fr-btn{width:100%;justify-content:center;font-size:.875rem;min-height:auto;padding:.25rem .75rem!important;min-height:auto!important;box-shadow:inset 0 0 0 1px var(--border-default-grey)}.fr-header .fr-container .fr-header__menu-links .fr-btns-group.fr-nav.fr-nav__item:before{box-shadow:none}.fr-header .fr-container .fr-header__menu-links .fr-btns-group .fr-menu__list{padding-right:0}.fr-header .fr-container .fr-header__menu-links .fr-btns-group .fr-menu__list ul{width:100%}.fr-header .fr-container .fr-header__menu-links .fr-btns-group .fr-menu__list a.fr-link,.fr-header .fr-container .fr-header__menu-links .fr-btns-group .fr-menu__list button.fr-link{border-bottom:none}.edu-usermenu.fr-menu{width:100%;padding-right:0;padding-left:0}.edu-menu-dropdown__btn.fr-btn--tertiary.fr-btn--sm{box-shadow:none;display:inline-flex;align-items:center;min-height:3rem;font-size:1rem;width:100%}.edu-menu-dropdown__btn.fr-btn--tertiary.fr-btn--sm:after{--icon-size: 1rem;margin-left:auto}}.fr-header__body-row:has(.edu-header__tools--custom) .fr-header__tools{flex:initial}.fr-header__body-row:has(.edu-header__tools--custom) .fr-header__tools.edu-header__tools--custom{flex:1 0 auto}.fr-header__body-row:has(.edu-header__tools--custom) .fr-header__tools:not(:last-child){padding-right:0;margin-right:.5rem}.fr-header__body-row:has(.edu-header__tools--custom) .fr-header__tools:not(:first-child){padding-left:0}\n"] }]
}], propDecorators: { menuId: [{
type: Input
}], labelMenu: [{
type: Input
}], ariaLabelMenu: [{
type: Input
}], disabled: [{
type: Input
}], iconMenu: [{
type: Input
}], links: [{
type: Input
}], customClass: [{
type: Input
}], outline: [{
type: Input
}], headerTemplate: [{
type: ContentChild,
args: ['headerTemplate', { static: true }]
}], footerTemplate: [{
type: ContentChild,
args: ['footerTemplate', { static: true }]
}], linksTemplate: [{
type: ContentChild,
args: ['linksTemplate', { static: true }]
}], linkSelect: [{
type: Output
}], disclose: [{
type: Output
}], conceal: [{
type: Output
}], collapseMenu: [{
type: ViewChild,
args: ['collapseMenu']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC1saW5rLW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvdXNlcm1lbnUvY29tcG9uZW50L3Rvb2wtbGluay1tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL3VzZXJtZW51L2NvbXBvbmVudC90b29sLWxpbmstbWVudS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUVaLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBRVQsU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQVksV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFlBQVksQ0FBQzs7O0FBVy9DLE1BQU0sT0FBTyx5QkFBeUI7SUFUdEM7UUF5QkUsNkRBQTZEO1FBQ3BELFVBQUssR0FBZSxFQUFFLENBQUM7UUFLaEMseUNBQXlDO1FBQ2hDLFlBQU8sR0FBRyxJQUFJLENBQUM7UUFXeEIseUNBQXlDO1FBQ3RCLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBWSxDQUFDO1FBRTdELG1DQUFtQztRQUN6QixhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUU5QyxvQ0FBb0M7UUFDMUIsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFLckMsY0FBUyxHQUFjLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6QyxjQUFTLEdBQW1CLEVBQUUsQ0FBQztLQThCeEM7SUE1QlEsUUFBUTtRQUNiLElBQUksQ0FBQyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGVBQWU7UUFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLGNBQWMsRUFBRSxHQUFHLEVBQUU7WUFDMUUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQztnQkFDaEYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0QixDQUFDO1FBQ0gsQ0FBQyxDQUFDLEVBQ0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsZUFBZSxFQUFFLEdBQUcsRUFBRTtZQUMzRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRVMsWUFBWSxDQUFDLElBQWM7UUFDbkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQzsrR0E1RVUseUJBQXlCO21HQUF6Qix5QkFBeUIsaTFCQy9CdEMsbTFGQStFQSxnK0lEdERZLFlBQVksb1NBQUUsaUJBQWlCOzs0RkFNOUIseUJBQXlCO2tCQVRyQyxTQUFTOytCQUNFLDBEQUEwRCxjQUN4RCxJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLENBQUMsbUJBRzlDLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUk7OEJBSTVCLE1BQU07c0JBQWQsS0FBSztnQkFHRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQUdHLEtBQUs7c0JBQWIsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLO2dCQUdHLE9BQU87c0JBQWYsS0FBSztnQkFHNEMsY0FBYztzQkFBL0QsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBR0UsY0FBYztzQkFBL0QsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBR0MsYUFBYTtzQkFBN0QsWUFBWTt1QkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUc1QixVQUFVO3NCQUE1QixNQUFNO2dCQUdHLFFBQVE7c0JBQWpCLE1BQU07Z0JBR0csT0FBTztzQkFBaEIsTUFBTTtnQkFHOEIsWUFBWTtzQkFBaEQsU0FBUzt1QkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBpbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjIsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERzZnJMaW5rLCBuZXdVbmlxdWVJZCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBEc2ZyQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYnV0dG9uJztcbmltcG9ydCB7IERzZnJMaW5rQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbGluayc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RzZnItdG9vbC1saW5rLW1lbnUsIGRzZnItZXh0LXRvb2xzbWVudSwgZHNmcngtdG9vbHNtZW51JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRHNmckxpbmtDb21wb25lbnQsIERzZnJCdXR0b25Db21wb25lbnRdLFxuICB0ZW1wbGF0ZVVybDogJy4vdG9vbC1saW5rLW1lbnUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi4vZHJvcGRvd24tYnV0dG9uLmNvbXBvbmVudC5zY3NzJywgJy4vdG9vbC1saW5rLW1lbnUuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIERzZnJUb29sTGlua01lbnVDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qKiBJZGVudGlmaWFudCBkdSBib3V0b24gZHUgbWVudSAoZ8OpbsOpcsOpIHNpIG5vbiByZW5zZWlnbsOpKSAqL1xuICBASW5wdXQoKSBtZW51SWQ6IHN0cmluZztcblxuICAvKiogTGliZWxsw6kgZHUgYm91dG9uIGR1IG1lbnUgZMOpcm91bGFudCAqL1xuICBASW5wdXQoKSBsYWJlbE1lbnU6IHN0cmluZztcblxuICAvKiogQXR0cmlidXQgYXJpYS1sYWJlbCBkdSBib3V0b24gZHUgbWVudSBkw6lyb3VsYW50ICovXG4gIEBJbnB1dCgpIGFyaWFMYWJlbE1lbnU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKiogRMOpc2FjdGl2ZXIgbGUgbWVudSAqL1xuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbjtcblxuICAvKiBJY8O0bmUgc3VyIGxlIGJvdXRvbiBkdSBtZW51ICovXG4gIEBJbnB1dCgpIGljb25NZW51OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIExpc3RlIGRlcyBsaWVucy4gUHJpb3JpdGFpcmUgc3VyIGxlIHNsb3QgbGlua3NUZW1wbGF0ZSAqL1xuICBASW5wdXQoKSBsaW5rczogRHNmckxpbmtbXSA9IFtdO1xuXG4gIC8qKiBBam91dGVyIHVuZSBjbGFzc2UgcGVyc29ubmFsaXPDqWUgcG91ciBsZSBtZW51ICAqL1xuICBASW5wdXQoKSBjdXN0b21DbGFzczogc3RyaW5nO1xuXG4gIC8qKiBTdXBwcmVzc2lvbiBkZSBsYSBib3JkdXJlIHNpIGZhbHNlICovXG4gIEBJbnB1dCgpIG91dGxpbmUgPSB0cnVlO1xuXG4gIC8qKiBDb250ZW51IHBlcnNvbm5hbGlzw6kgZHUgaGVhZGVyIGR1IG1lbnUgKi9cbiAgQENvbnRlbnRDaGlsZCgnaGVhZGVyVGVtcGxhdGUnLCB7IHN0YXRpYzogdHJ1ZSB9KSBoZWFkZXJUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAvKiogQ29udGVudSBwZXJzb25uYWxpc8OpIGR1IGZvb3RlciBkdSBtZW51ICovXG4gIEBDb250ZW50Q2hpbGQoJ2Zvb3RlclRlbXBsYXRlJywgeyBzdGF0aWM6IHRydWUgfSkgZm9vdGVyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgLyoqIENvbnRlbnUgcGVyc29ubmFsaXPDqSBkZXMgbGllbnMgZHUgbWVudSAqL1xuICBAQ29udGVudENoaWxkKCdsaW5rc1RlbXBsYXRlJywgeyBzdGF0aWM6IHRydWUgfSkgbGlua3NUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAvKiogRXbDqG5lbWVudCDDqW1pcyBhdSBjbGljIHN1ciB1biBsaWVuICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBsaW5rU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxEc2ZyTGluaz4oKTtcblxuICAvKiogU2lnbmFsZSBsJ291dmVydHVyZSBkdSBtZW51LiAqL1xuICBAT3V0cHV0KCkgZGlzY2xvc2UgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqIFNpZ25hbGUgbGEgZmVybWV0dXJlIGR1IG1lbnUuICovXG4gIEBPdXRwdXQoKSBjb25jZWFsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKkBpbnRlcm5hbCAqL1xuICBAVmlld0NoaWxkKCdjb2xsYXBzZU1lbnUnKSBwcm90ZWN0ZWQgY29sbGFwc2VNZW51OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICBwcml2YXRlIHJlbmRlcmVyMjogUmVuZGVyZXIyID0gaW5qZWN0KFJlbmRlcmVyMik7XG4gIHByaXZhdGUgX3VubGlzdGVuOiB7ICgpOiB2b2lkIH1bXSA9IFtdO1xuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm1lbnVJZCA/Pz0gbmV3VW5pcXVlSWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFY291dGVyIGxlcyBldmVudHMgc2NyaXB0cyBkc2ZyIGNvbmNlYWwvZGlzY2xvc2Ugc3VyIGxlIG1lbnVcbiAgICogY29uY2VhbDogdW5pcXVlbWVudCBhcHJlcyB1bmUgcHJlbWllcmUgb3V2ZXJ0dXJlIChwcsOpc2VuY2UgZGUgZnItY29sbGFwc2UtLWV4cGFuZGVkKVxuICAgKi9cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl91bmxpc3Rlbi5wdXNoKFxuICAgICAgdGhpcy5yZW5kZXJlcjIubGlzdGVuKHRoaXMuY29sbGFwc2VNZW51Lm5hdGl2ZUVsZW1lbnQsICdkc2ZyLmNvbmNlYWwnLCAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNvbGxhcHNlTWVudS5uYXRpdmVFbGVtZW50LmNsYXNzTmFtZS5pbmNsdWRlcygnZnItY29sbGFwc2UtLWV4cGFuZGVkJykpIHtcbiAgICAgICAgICB0aGlzLmNvbmNlYWwuZW1pdCgpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIHRoaXMucmVuZGVyZXIyLmxpc3Rlbih0aGlzLmNvbGxhcHNlTWVudS5uYXRpdmVFbGVtZW50LCAnZHNmci5kaXNjbG9zZScsICgpID0+IHtcbiAgICAgICAgdGhpcy5kaXNjbG9zZS5lbWl0KCk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX3VubGlzdGVuLmZvckVhY2goKHVubGlzdGVuRnVuYykgPT4gdW5saXN0ZW5GdW5jKCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uTGlua1NlbGVjdChsaW5rOiBEc2ZyTGluaykge1xuICAgIHRoaXMubGlua1NlbGVjdC5lbWl0KGxpbmspO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZnItbmF2IGZyLW5hdl9faXRlbSBlZHUtdG9vbC1saW5rLW1lbnVcIj5cbiAgPCEtLSBham91dGVyIGFyaWFMYWJlbCA/LS0+XG4gIDxidXR0b25cbiAgICAjYnRuTWVudVxuICAgIFtpZF09XCJtZW51SWRcIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIGNsYXNzPVwiZWR1LW1lbnUtZHJvcGRvd25fX2J0biBmci1idG4tLXNtIGZyLWJ0bi0taWNvbi1sZWZ0IGZyLWJ0biB7eyBpY29uTWVudSA/PyAnJyB9fVwiXG4gICAgW25nQ2xhc3NdPVwieyAnZnItYnRuLS10ZXJ0aWFyeSc6IG91dGxpbmUsICdmci1idG4tLXRlcnRpYXJ5LW5vLW91dGxpbmUnOiAhb3V0bGluZSB9XCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgbnVsbFwiXG4gICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJtZW51SWQgKyAnLW1lbnUnXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbE1lbnUgPz8gbnVsbFwiXG4gICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJmYWxzZVwiPlxuICAgIHt7IGxhYmVsTWVudSB9fVxuICA8L2J1dHRvbj5cblxuICA8ZGl2XG4gICAgI2NvbGxhcHNlTWVudVxuICAgIGNsYXNzPVwiZnItY29sbGFwc2UgZnItbWVudVwiXG4gICAgW25nQ2xhc3NdPVwiY3VzdG9tQ2xhc3NcIlxuICAgIFtpZF09XCJtZW51SWQgKyAnLW1lbnUnXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwibWVudUlkXCI+XG4gICAgPGRpdiBjbGFzcz1cImZyLW1lbnVfX2xpc3RcIj5cbiAgICAgIDwhLS0gSGVhZGVyICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICBAaWYgKGhlYWRlclRlbXBsYXRlKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJlZHUtdG9vbC1saW5rLW1lbnVfX2hlYWRlclwiPlxuICAgICAgICAgIDwhLS0gQWZmaWNoYWdlIGR1IHNsb3QgaGVhZGVyICAtLT5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIDwhLS0gTGllbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICBAaWYgKGxpbmtzICYmIGxpbmtzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgPHVsPlxuICAgICAgICAgIEBmb3IgKGxpbmsgb2YgbGlua3M7IHRyYWNrIGxpbmspIHtcbiAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJsaW5rVGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBsaW5rOiBsaW5rIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgfVxuICAgICAgICA8L3VsPlxuICAgICAgfSBAZWxzZSBpZiAobGlua3NUZW1wbGF0ZSkge1xuICAgICAgICA8IS0tIEFmZmljaGFnZSBkdSBzbG90IGxpbmtzIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibGlua3NUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgfVxuXG4gICAgICA8IS0tIEZvb3RlciAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgICBAaWYgKGZvb3RlclRlbXBsYXRlKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJlZHUtdG9vbC1saW5rLW1lbnVfX2Zvb3RlclwiPlxuICAgICAgICAgIDwhLS0gQWZmaWNoYWdlIGR1IHNsb3QgZm9vdGVyIC0tPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmb290ZXJUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNsaW5rVGVtcGxhdGUgbGV0LWxpbms9XCJsaW5rXCI+XG4gIDxkc2ZyLWxpbmtcbiAgICBbdG9vbHRpcE1lc3NhZ2VdPVwibGluay50b29sdGlwTWVzc2FnZVwiXG4gICAgW2FyaWFMYWJlbF09XCJsaW5rLmxhYmVsID8gbGluay5hcmlhTGFiZWwgOiBsaW5rLmxhYmVsXCJcbiAgICBbYXJpYUNvbnRyb2xzXT1cImxpbmsuYXJpYUNvbnRyb2xzXCJcbiAgICBbbGlua109XCJsaW5rLmxpbmtcIlxuICAgIFtsYWJlbF09XCJsaW5rLmljb24gPyB1bmRlZmluZWQgOiBsaW5rLmxhYmVsXCJcbiAgICBbbGlua1RhcmdldF09XCJsaW5rLmxpbmtUYXJnZXRcIlxuICAgIFtyb3V0ZV09XCJsaW5rLnJvdXRlXCJcbiAgICBbY3VzdG9tQ2xhc3NdPVwiJ2ZyLW5hdl9fbGluaydcIlxuICAgIFtyb3V0ZVBhdGhdPVwibGluay5yb3V0ZXJMaW5rXCJcbiAgICBbcm91dGVyTGlua0FjdGl2ZV09XCJsaW5rLnJvdXRlckxpbmtBY3RpdmUgPz8gJydcIlxuICAgIFtyb3V0ZXJMaW5rRXh0cmFzXT1cImxpbmsucm91dGVyTGlua0V4dHJhc1wiXG4gICAgW21vZGVdPVwibGluay5tb2RlXCJcbiAgICBbYXJpYUN1cnJlbnRdPVwibGluay5hY3RpdmVcIlxuICAgIChsaW5rU2VsZWN0KT1cIm9uTGlua1NlbGVjdChsaW5rKVwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XG4gICAgPCEtLSBQb3VyIGF2b2lyIGEgbGEgZm9pcyB1biBpdGVtIGFjdGlmIGV0IHVuZSBpY29uZSwgc3VyY2hhcmdlciBpY2kgYXZlYyBsZSBzbG90IC0tPlxuICAgIEBpZiAobGluay5pY29uKSB7XG4gICAgICA8aSBjbGFzcz1cInt7IGxpbmsuaWNvbiB9fSBlZHUtaXRlbS1pY29uXCI+PC9pPlxuICAgICAgPHNwYW4gbGFiZWw+e3sgbGluay5sYWJlbCB9fTwvc3Bhbj5cbiAgICB9XG4gIDwvZHNmci1saW5rPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==