@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).
145 lines • 34.3 kB
JavaScript
import { Component, EventEmitter, Inject, Input, Output, ViewEncapsulation } from '@angular/core';
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 "../link/item-link.component";
import * as i4 from "../display/display.component";
export class DsfrFooterComponent {
/** Liens institutionnels */
/** @internal */
static { this.DEF_INSTITUTIONAL_LINKS = [
{ label: 'legifrance.gouv.fr', link: 'https://legifrance.gouv.fr' },
{ label: 'info.gouv.fr', link: 'https://info.gouv.fr' },
{ label: 'service-public.fr', link: 'https://service-public.fr' },
{ label: 'data.gouv.fr', link: 'https://data.gouv.fr' },
]; }
/** Liens réglementaires obligatoires */
/** @internal */
static { this.DEF_MANDATORY_LINKS = [
{
label: 'Accessibilité : ',
link: 'https://www.info.gouv.fr/accessibilite',
linkTarget: '_blank',
},
{ label: 'Mentions légales', link: '#' },
{
label: 'Données personnelles',
link: 'https://www.info.gouv.fr/donnees-personnelles-et-cookies',
linkTarget: '_blank',
},
{
label: 'Gestion des cookies',
link: 'https://www.info.gouv.fr/donnees-personnelles-et-cookies',
linkTarget: '_blank',
},
]; }
/** @internal */
constructor(config, i18n) {
this.config = config;
this.i18n = i18n;
/** Bloc marque de la marianne */
this.logo = {
label: 'République<br/>Française',
link: '',
tooltipMessage: "Accueil - [À MODIFIER - texte alternatif de l’image : nom de l'opérateur ou du site serviciel] - République Française",
imagePath: '',
imageAlt: '',
};
/** Tableau des liens institutionnels - obligatoires. Initialisé par défaut. */
this.institutionalLinks = DsfrFooterComponent.DEF_INSTITUTIONAL_LINKS;
/**
* Liens d'obligations légales. Cette liste doit être définie en fonction du site, toutefois les liens & contenus suivants
* sont obligatoires : “accessibilité : non/partiellement/totalement conforme”, mentions légales, données personnelles et gestion des cookies. - obligatoire.
*/
this.mandatoryLinks = DsfrFooterComponent.DEF_MANDATORY_LINKS;
/** Mention de licence. */
this.license = 'Emplacement de la mention de licence - OBLIGATOIRE.';
/**Indique le lien mandatory séléctionné. */
this.mandatoryLinkSelect = new EventEmitter();
/**
* @internal
*/
this._useDeprecatedPictoPath = false;
}
get pictoPath() {
return this.artworkDirPath;
}
get displayModalId() {
return DISPLAY_MODAL_ID;
}
/**
* 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;
}
/** Mention légale de la conformité d'accessibilité (none / partially / fully-compliant) */
set accessibility(accessibility) {
let labelAccessibility = 'Accessibilité : non conforme';
switch (accessibility) {
case 'fully-compliant':
labelAccessibility = 'Accessibilité : totalement conforme';
break;
case 'partially':
labelAccessibility = 'Accessibilité : partiellement conforme';
break;
}
DsfrFooterComponent.DEF_MANDATORY_LINKS[0].label = labelAccessibility;
}
ngOnInit() {
if (this.artworkDirPath === undefined) {
this.artworkDirPath = this.config.artworkDirPath;
}
}
/** @internal */
getLinkTarget(item) {
return item.target ?? item.linkTarget;
}
/** @internal */
onMandatoryLinkSelect(link) {
this.mandatoryLinkSelect.emit(link);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DsfrFooterComponent, deps: [{ token: DSFR_CONFIG_TOKEN }, { token: i1.I18nService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DsfrFooterComponent, selector: "dsfr-footer", inputs: { display: "display", artworkDirPath: "artworkDirPath", logo: "logo", presentation: "presentation", institutionalLinks: "institutionalLinks", mandatoryLinks: "mandatoryLinks", partnerMain: "partnerMain", partnersSub: "partnersSub", reboundLinks: "reboundLinks", license: "license", pictoPath: "pictoPath", accessibility: "accessibility" }, outputs: { mandatoryLinkSelect: "mandatoryLinkSelect" }, ngImport: i0, template: "<footer class=\"fr-footer\" role=\"contentinfo\" id=\"footer\">\n <!-- ReboundLinks -->\n <div *ngIf=\"reboundLinks && reboundLinks.length >= 1\" class=\"fr-footer__top\">\n <div class=\"fr-container\">\n <!-- BUG: Classe 'fr-grid-row--start' inconnue en DSFR 1.9.3 -->\n <div class=\"fr-grid-row fr-grid-row--start fr-grid-row--gutters\">\n <div *ngFor=\"let item of reboundLinks\" class=\"fr-col-12 fr-col-sm-3 fr-col-md-2\">\n <h3 class=\"fr-footer__top-cat\">{{ item.title }}</h3>\n <ul class=\"fr-footer__top-list\">\n <li *ngFor=\"let link of item.links\">\n <edu-item-link [item]=\"link\" customClass=\"fr-footer__top-link\"></edu-item-link>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"fr-container\">\n <div class=\"fr-footer__body\">\n <div class=\"fr-footer__brand fr-enlarge-link\">\n <!--Bloc avec logo op\u00E9rateur-->\n <ng-container *ngIf=\"logo.imagePath\"\n ><p class=\"fr-logo\" [innerHTML]=\"logo.label\"></p>\n <a\n class=\"fr-footer__brand-link\"\n [href]=\"logo.link\"\n [attr.title]=\"logo?.tooltipMessage ? logo.tooltipMessage : null\"\n ><img class=\"fr-footer__logo\" style=\"width: 3.5rem\" [src]=\"logo.imagePath\" [attr.alt]=\"logo.imageAlt\" /> </a\n ></ng-container>\n <!--Bloc sans logo op\u00E9rateur-->\n <ng-container *ngIf=\"!logo.imagePath\">\n <a [href]=\"logo.link\" [attr.title]=\"logo?.tooltipMessage ? logo.tooltipMessage : null\">\n <p class=\"fr-logo\" [innerHTML]=\"logo.label\"></p>\n </a>\n </ng-container>\n </div>\n <div class=\"fr-footer__content\">\n <p *ngIf=\"presentation\" class=\"fr-footer__content-desc\" [innerHtml]=\"presentation\"></p>\n <ul class=\"fr-footer__content-list\">\n <!-- BUG: Classe 'fr-footer__content-item' inconnue en DSFR 1.9.3 -->\n <li *ngFor=\"let item of institutionalLinks\" class=\"fr-footer__content-item\">\n <a\n class=\"fr-footer__content-link\"\n [attr.target]=\"getLinkTarget(item) ?? null\"\n [href]=\"item.route ? item.route : item.link\">\n {{ item.label }}</a\n >\n </li>\n </ul>\n </div>\n </div>\n <!--Bloc avec partenaires-->\n <div *ngIf=\"partnerMain\" class=\"fr-footer__partners\">\n <h2 class=\"fr-footer__partners-title\">{{ i18n.t('footer.partners.title') }}</h2>\n <div class=\"fr-footer__partners-logos\">\n <div class=\"fr-footer__partners-main\">\n <a class=\"fr-footer__partners-link\" [href]=\"partnerMain.link\">\n <img\n class=\"fr-footer__logo\"\n [ngStyle]=\"{\n height: partnerMain.customHeight ? partnerMain.customHeight : '5.625rem'\n }\"\n [src]=\"partnerMain.imagePath\"\n [attr.alt]=\"partnerMain.imageAlt\" />\n </a>\n </div>\n <div *ngIf=\"partnersSub\" class=\"fr-footer__partners-sub\">\n <ul>\n <li *ngFor=\"let item of partnersSub\">\n <a class=\"fr-footer__partners-link\" [href]=\"item.link\">\n <img\n class=\"fr-footer__logo\"\n [ngStyle]=\"{ height: item.customHeight ? item.customHeight : '5.625rem' }\"\n [src]=\"item.imagePath\"\n [attr.alt]=\"item.imageAlt\" />\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n <!-- Bottom ------------------------------------------------------------------------------------------------------->\n <div class=\"fr-footer__bottom\">\n <ul class=\"fr-footer__bottom-list\">\n <li *ngFor=\"let item of mandatoryLinks\" class=\"fr-footer__bottom-item\">\n <edu-item-link\n [item]=\"item\"\n customClass=\"fr-footer__bottom-link\"\n (linkSelect)=\"onMandatoryLinkSelect($event)\"></edu-item-link>\n </li>\n <li *ngIf=\"display\" class=\"fr-footer__bottom-item\">\n <button\n type=\"button\"\n class=\"fr-footer__bottom-link fr-fi-theme-fill fr-link--icon-left\"\n [attr.aria-controls]=\"displayModalId\"\n data-fr-opened=\"false\">\n Param\u00E8tres d'affichage\n </button>\n </li>\n </ul>\n <div class=\"fr-footer__bottom-copy\">\n <p [innerHTML]=\"license\"></p>\n </div>\n </div>\n </div>\n</footer>\n\n<dsfr-display *ngIf=\"display && _useDeprecatedPictoPath\" [pictoPath]=\"artworkDirPath\"></dsfr-display>\n<dsfr-display *ngIf=\"display && !_useDeprecatedPictoPath\" [artworkDirPath]=\"artworkDirPath\"></dsfr-display>\n", dependencies: [{ 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.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.ItemLinkComponent, selector: "edu-item-link", inputs: ["defaultIconPosition", "item"] }, { kind: "component", type: i4.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: DsfrFooterComponent, decorators: [{
type: Component,
args: [{ selector: 'dsfr-footer', encapsulation: ViewEncapsulation.None, template: "<footer class=\"fr-footer\" role=\"contentinfo\" id=\"footer\">\n <!-- ReboundLinks -->\n <div *ngIf=\"reboundLinks && reboundLinks.length >= 1\" class=\"fr-footer__top\">\n <div class=\"fr-container\">\n <!-- BUG: Classe 'fr-grid-row--start' inconnue en DSFR 1.9.3 -->\n <div class=\"fr-grid-row fr-grid-row--start fr-grid-row--gutters\">\n <div *ngFor=\"let item of reboundLinks\" class=\"fr-col-12 fr-col-sm-3 fr-col-md-2\">\n <h3 class=\"fr-footer__top-cat\">{{ item.title }}</h3>\n <ul class=\"fr-footer__top-list\">\n <li *ngFor=\"let link of item.links\">\n <edu-item-link [item]=\"link\" customClass=\"fr-footer__top-link\"></edu-item-link>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"fr-container\">\n <div class=\"fr-footer__body\">\n <div class=\"fr-footer__brand fr-enlarge-link\">\n <!--Bloc avec logo op\u00E9rateur-->\n <ng-container *ngIf=\"logo.imagePath\"\n ><p class=\"fr-logo\" [innerHTML]=\"logo.label\"></p>\n <a\n class=\"fr-footer__brand-link\"\n [href]=\"logo.link\"\n [attr.title]=\"logo?.tooltipMessage ? logo.tooltipMessage : null\"\n ><img class=\"fr-footer__logo\" style=\"width: 3.5rem\" [src]=\"logo.imagePath\" [attr.alt]=\"logo.imageAlt\" /> </a\n ></ng-container>\n <!--Bloc sans logo op\u00E9rateur-->\n <ng-container *ngIf=\"!logo.imagePath\">\n <a [href]=\"logo.link\" [attr.title]=\"logo?.tooltipMessage ? logo.tooltipMessage : null\">\n <p class=\"fr-logo\" [innerHTML]=\"logo.label\"></p>\n </a>\n </ng-container>\n </div>\n <div class=\"fr-footer__content\">\n <p *ngIf=\"presentation\" class=\"fr-footer__content-desc\" [innerHtml]=\"presentation\"></p>\n <ul class=\"fr-footer__content-list\">\n <!-- BUG: Classe 'fr-footer__content-item' inconnue en DSFR 1.9.3 -->\n <li *ngFor=\"let item of institutionalLinks\" class=\"fr-footer__content-item\">\n <a\n class=\"fr-footer__content-link\"\n [attr.target]=\"getLinkTarget(item) ?? null\"\n [href]=\"item.route ? item.route : item.link\">\n {{ item.label }}</a\n >\n </li>\n </ul>\n </div>\n </div>\n <!--Bloc avec partenaires-->\n <div *ngIf=\"partnerMain\" class=\"fr-footer__partners\">\n <h2 class=\"fr-footer__partners-title\">{{ i18n.t('footer.partners.title') }}</h2>\n <div class=\"fr-footer__partners-logos\">\n <div class=\"fr-footer__partners-main\">\n <a class=\"fr-footer__partners-link\" [href]=\"partnerMain.link\">\n <img\n class=\"fr-footer__logo\"\n [ngStyle]=\"{\n height: partnerMain.customHeight ? partnerMain.customHeight : '5.625rem'\n }\"\n [src]=\"partnerMain.imagePath\"\n [attr.alt]=\"partnerMain.imageAlt\" />\n </a>\n </div>\n <div *ngIf=\"partnersSub\" class=\"fr-footer__partners-sub\">\n <ul>\n <li *ngFor=\"let item of partnersSub\">\n <a class=\"fr-footer__partners-link\" [href]=\"item.link\">\n <img\n class=\"fr-footer__logo\"\n [ngStyle]=\"{ height: item.customHeight ? item.customHeight : '5.625rem' }\"\n [src]=\"item.imagePath\"\n [attr.alt]=\"item.imageAlt\" />\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n <!-- Bottom ------------------------------------------------------------------------------------------------------->\n <div class=\"fr-footer__bottom\">\n <ul class=\"fr-footer__bottom-list\">\n <li *ngFor=\"let item of mandatoryLinks\" class=\"fr-footer__bottom-item\">\n <edu-item-link\n [item]=\"item\"\n customClass=\"fr-footer__bottom-link\"\n (linkSelect)=\"onMandatoryLinkSelect($event)\"></edu-item-link>\n </li>\n <li *ngIf=\"display\" class=\"fr-footer__bottom-item\">\n <button\n type=\"button\"\n class=\"fr-footer__bottom-link fr-fi-theme-fill fr-link--icon-left\"\n [attr.aria-controls]=\"displayModalId\"\n data-fr-opened=\"false\">\n Param\u00E8tres d'affichage\n </button>\n </li>\n </ul>\n <div class=\"fr-footer__bottom-copy\">\n <p [innerHTML]=\"license\"></p>\n </div>\n </div>\n </div>\n</footer>\n\n<dsfr-display *ngIf=\"display && _useDeprecatedPictoPath\" [pictoPath]=\"artworkDirPath\"></dsfr-display>\n<dsfr-display *ngIf=\"display && !_useDeprecatedPictoPath\" [artworkDirPath]=\"artworkDirPath\"></dsfr-display>\n" }]
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
type: Inject,
args: [DSFR_CONFIG_TOKEN]
}] }, { type: i1.I18nService }]; }, propDecorators: { display: [{
type: Input
}], artworkDirPath: [{
type: Input
}], logo: [{
type: Input
}], presentation: [{
type: Input
}], institutionalLinks: [{
type: Input
}], mandatoryLinks: [{
type: Input
}], partnerMain: [{
type: Input
}], partnersSub: [{
type: Input
}], reboundLinks: [{
type: Input
}], license: [{
type: Input
}], mandatoryLinkSelect: [{
type: Output
}], pictoPath: [{
type: Input
}], accessibility: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9vdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2Zvb3Rlci9mb290ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvZm9vdGVyL2Zvb3Rlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUxRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVyRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7Ozs7OztBQVc5QyxNQUFNLE9BQU8sbUJBQW1CO0lBQzlCLDRCQUE0QjtJQUM1QixnQkFBZ0I7YUFDQSw0QkFBdUIsR0FBZTtRQUNwRCxFQUFFLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsNEJBQTRCLEVBQUU7UUFDbkUsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxzQkFBc0IsRUFBRTtRQUN2RCxFQUFFLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsMkJBQTJCLEVBQUU7UUFDakUsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxzQkFBc0IsRUFBRTtLQUN4RCxBQUxzQyxDQUtyQztJQUVGLHdDQUF3QztJQUN4QyxnQkFBZ0I7YUFDQSx3QkFBbUIsR0FBZTtRQUNoRDtZQUNFLEtBQUssRUFBRSxrQkFBa0I7WUFDekIsSUFBSSxFQUFFLHdDQUF3QztZQUM5QyxVQUFVLEVBQUUsUUFBUTtTQUNyQjtRQUNELEVBQUUs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QkFBMUIsS0FBSztnQkFNRyxjQUFjO3NCQUF0QixLQUFLO2dCQUdHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSztnQkFHRyxZQUFZO3NCQUFwQixLQUFLO2dCQUdHLE9BQU87c0JBQWYsS0FBSztnQkFHSSxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBNEJNLFNBQVM7c0JBQXJCLEtBQUs7Z0JBTU8sYUFBYTtzQkFBekIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbmplY3QsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERzZnJMaW5rLCBEc2ZyTGlua1RhcmdldCwgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQnO1xuaW1wb3J0IHsgRFNGUl9DT05GSUdfVE9LRU4gfSBmcm9tICcuLi8uLi9zaGFyZWQvY29uZmlnL2NvbmZpZy10b2tlbic7XG5pbXBvcnQgeyBEc2ZyQ29uZmlnIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2NvbmZpZy9jb25maWcubW9kZWwnO1xuaW1wb3J0IHsgRElTUExBWV9NT0RBTF9JRCB9IGZyb20gJy4uL2Rpc3BsYXknO1xuaW1wb3J0IHsgRHNmckFjY2Vzc2liaWxpdHkgfSBmcm9tICcuL2FjY2Vzc2liaWxpdHkudHlwZSc7XG5pbXBvcnQgeyBEc2ZyRm9vdGVyUmVib3VuZExpbmtzIH0gZnJvbSAnLi9mb290ZXItcmVib3VuZC1saW5rcy5tb2RlbCc7XG5pbXBvcnQgeyBEc2ZyTG9nbyB9IGZyb20gJy4vbG9nby5tb2RlbCc7XG5pbXBvcnQgeyBEc2ZyUGFydG5lciB9IGZyb20gJy4vcGFydG5lci5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RzZnItZm9vdGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvb3Rlci5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIERzZnJGb290ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAvKiogTGllbnMgaW5zdGl0dXRpb25uZWxzICovXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc3RhdGljIHJlYWRvbmx5IERFRl9JTlNUSVRVVElPTkFMX0xJTktTOiBEc2ZyTGlua1tdID0gW1xuICAgIHsgbGFiZWw6ICdsZWdpZnJhbmNlLmdvdXYuZnInLCBsaW5rOiAnaHR0cHM6Ly9sZWdpZnJhbmNlLmdvdXYuZnInIH0sXG4gICAgeyBsYWJlbDogJ2luZm8uZ291di5mcicsIGxpbms6ICdodHRwczovL2luZm8uZ291di5mcicgfSxcbiAgICB7IGxhYmVsOiAnc2VydmljZS1wdWJsaWMuZnInLCBsaW5rOiAnaHR0cHM6Ly9zZXJ2aWNlLXB1YmxpYy5mcicgfSxcbiAgICB7IGxhYmVsOiAnZGF0YS5nb3V2LmZyJywgbGluazogJ2h0dHBzOi8vZGF0YS5nb3V2LmZyJyB9LFxuICBdO1xuXG4gIC8qKiBMaWVucyByw6lnbGVtZW50YWlyZXMgb2JsaWdhdG9pcmVzICovXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc3RhdGljIHJlYWRvbmx5IERFRl9NQU5EQVRPUllfTElOS1M6IERzZnJMaW5rW10gPSBbXG4gICAge1xuICAgICAgbGFiZWw6ICdBY2Nlc3NpYmlsaXTDqSA6ICcsXG4gICAgICBsaW5rOiAnaHR0cHM6Ly93d3cuaW5mby5nb3V2LmZyL2FjY2Vzc2liaWxpdGUnLFxuICAgICAgbGlua1RhcmdldDogJ19ibGFuaycsXG4gICAgfSxcbiAgICB7IGxhYmVsOiAnTWVudGlvbnMgbMOpZ2FsZXMnLCBsaW5rOiAnIycgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ0Rvbm7DqWVzIHBlcnNvbm5lbGxlcycsXG4gICAgICBsaW5rOiAnaHR0cHM6Ly93d3cuaW5mby5nb3V2LmZyL2Rvbm5lZXMtcGVyc29ubmVsbGVzLWV0LWNvb2tpZXMnLFxuICAgICAgbGlua1RhcmdldDogJ19ibGFuaycsXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ0dlc3Rpb24gZGVzIGNvb2tpZXMnLFxuICAgICAgbGluazogJ2h0dHBzOi8vd3d3LmluZm8uZ291di5mci9kb25uZWVzLXBlcnNvbm5lbGxlcy1ldC1jb29raWVzJyxcbiAgICAgIGxpbmtUYXJnZXQ6ICdfYmxhbmsnLFxuICAgIH0sXG4gIF07XG5cbiAgLyoqXG4gICAqIEFmZmljaGFnZSBkdSBsaWVuICdQYXJhbcOodHJlIGQnYWZmaWNoYWdlJyBwb3VyIGfDqXJlciBsZXMgbW9kZXMgY2xhaXIvc29tYnJlLlxuICAgKi9cbiAgQElucHV0KCkgZGlzcGxheTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ2hlbWluIHZlcnMgbGUgcsOpcGVydG9pcmUgZXhwb3NhbnQgbGVzIHBpY3RvZ3JhbW1lcyBpbGx1c3RyYXRpZnMgRFNGUi5cbiAgICovXG4gIEBJbnB1dCgpIGFydHdvcmtEaXJQYXRoOiBzdHJpbmc7XG5cbiAgLyoqIEJsb2MgbWFycXVlIGRlIGxhIG1hcmlhbm5lICovXG4gIEBJbnB1dCgpIGxvZ286IERzZnJMb2dvID0ge1xuICAgIGxhYmVsOiAnUsOpcHVibGlxdWU8YnIvPkZyYW7Dp2Fpc2UnLFxuICAgIGxpbms6ICcnLFxuICAgIHRvb2x0aXBNZXNzYWdlOlxuICAgICAgXCJBY2N1ZWlsIC0gW8OAIE1PRElGSUVSIC0gdGV4dGUgYWx0ZXJuYXRpZiBkZSBs4oCZaW1hZ2UgOiBub20gZGUgbCdvcMOpcmF0ZXVyIG91IGR1IHNpdGUgc2VydmljaWVsXSAtIFLDqXB1YmxpcXVlIEZyYW7Dp2Fpc2VcIixcbiAgICBpbWFnZVBhdGg6ICcnLFxuICAgIGltYWdlQWx0OiAnJyxcbiAgfTtcblxuICAvKiogVGV4dGUgZGUgcHLDqXNlbnRhdGlvbiAoaHRtbCBwb3NzaWJsZSkuICovXG4gIEBJbnB1dCgpIHByZXNlbnRhdGlvbjogc3RyaW5nO1xuXG4gIC8qKiBUYWJsZWF1IGRlcyBsaWVucyBpbnN0aXR1dGlvbm5lbHMgLSBvYmxpZ2F0b2lyZXMuIEluaXRpYWxpc8OpIHBhciBkw6lmYXV0LiAqL1xuICBASW5wdXQoKSBpbnN0aXR1dGlvbmFsTGlua3MgPSBEc2ZyRm9vdGVyQ29tcG9uZW50LkRFRl9JTlNUSVRVVElPTkFMX0xJTktTO1xuXG4gIC8qKlxuICAgKiBMaWVucyBkJ29ibGlnYXRpb25zIGzDqWdhbGVzLiBDZXR0ZSBsaXN0ZSBkb2l0IMOqdHJlIGTDqWZpbmllIGVuIGZvbmN0aW9uIGR1IHNpdGUsIHRvdXRlZm9pcyBsZXMgbGllbnMgJiBjb250ZW51cyBzdWl2YW50c1xuICAgKiBzb250IG9ibGlnYXRvaXJlcyA6IOKAnGFjY2Vzc2liaWxpdMOpIDogbm9uL3BhcnRpZWxsZW1lbnQvdG90YWxlbWVudCBjb25mb3JtZeKAnSwgbWVudGlvbnMgbMOpZ2FsZXMsIGRvbm7DqWVzIHBlcnNvbm5lbGxlcyBldCBnZXN0aW9uIGRlcyBjb29raWVzLiAtIG9ibGlnYXRvaXJlLlxuICAgKi9cbiAgQElucHV0KCkgbWFuZGF0b3J5TGlua3MgPSBEc2ZyRm9vdGVyQ29tcG9uZW50LkRFRl9NQU5EQVRPUllfTElOS1M7XG5cbiAgLyoqIExvZ28gcGFydGVuYWlyZSBwcmluY2lwYWwuICovXG4gIEBJbnB1dCgpIHBhcnRuZXJNYWluOiBEc2ZyUGFydG5lcjtcblxuICAvKiogTGlzdGVzIGRlcyBsb2dvcyBwYXJ0ZW5haXJlcy4gKi9cbiAgQElucHV0KCkgcGFydG5lcnNTdWI6IERzZnJQYXJ0bmVyW107XG5cbiAgLyoqIExpc3RlIGRlIGxpZW5zIGRlIHJlYm9uZCBjYXTDqWdvcmlzw6kuICovXG4gIEBJbnB1dCgpIHJlYm91bmRMaW5rczogRHNmckZvb3RlclJlYm91bmRMaW5rc1tdO1xuXG4gIC8qKiBNZW50aW9uIGRlIGxpY2VuY2UuICovXG4gIEBJbnB1dCgpIGxpY2Vuc2UgPSAnRW1wbGFjZW1lbnQgZGUgbGEgbWVudGlvbiBkZSBsaWNlbmNlIC0gT0JMSUdBVE9JUkUuJztcblxuICAvKipJbmRpcXVlIGxlIGxpZW4gbWFuZGF0b3J5IHPDqWzDqWN0aW9ubsOpLiAqL1xuICBAT3V0cHV0KCkgbWFuZGF0b3J5TGlua1NlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF91c2VEZXByZWNhdGVkUGljdG9QYXRoID0gZmFsc2U7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KERTRlJfQ09ORklHX1RPS0VOKSBwcml2YXRlIGNvbmZpZzogRHNmckNvbmZpZyxcbiAgICBwdWJsaWMgaTE4bjogSTE4blNlcnZpY2UsXG4gICkge31cblxuICBnZXQgcGljdG9QYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYXJ0d29ya0RpclBhdGg7XG4gIH1cblxuICBnZXQgZGlzcGxheU1vZGFsSWQoKSB7XG4gICAgcmV0dXJuIERJU1BMQVlfTU9EQUxfSUQ7XG4gIH1cblxuICAvKipcbiAgICogQ2hlbWluIGRlcyBwaWN0b2dyYW1tZXMgKGR1IGNvbXBvc2FudCBkaXNwbGF5KSByZW5zZWlnbsOpIHBhciBsZSBkw6l2ZWxvcHBldXIuXG4gICAqXG4gICAqIE5vdGU6IGNlIGNoZW1pbiBkb2l0IHBlcm1ldHRyZSBkZSByw6ljdXDDqXJlciBkaXJlY3RlbWVudCBsZXMgZmljaGllcnMgU1ZHIHN1aXZhbnRzIDogbW9vbi5zdmcsIHN1bi5zdmcsIHN5c3RlbS5zdmdcbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBhcnR3b3JrRGlyUGF0aGAgaW5zdGVhZC5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBwaWN0b1BhdGgocGF0aDogc3RyaW5nKSB7XG4gICAgdGhpcy5hcnR3b3JrRGlyUGF0aCA9IHBhdGg7XG4gICAgdGhpcy5fdXNlRGVwcmVjYXRlZFBpY3RvUGF0aCA9IHRydWU7XG4gIH1cblxuICAvKiogTWVudGlvbiBsw6lnYWxlIGRlIGxhIGNvbmZvcm1pdMOpIGQnYWNjZXNzaWJpbGl0w6kgKG5vbmUgLyBwYXJ0aWFsbHkgLyBmdWxseS1jb21wbGlhbnQpICovXG4gIEBJbnB1dCgpIHNldCBhY2Nlc3NpYmlsaXR5KGFjY2Vzc2liaWxpdHk6IERzZnJBY2Nlc3NpYmlsaXR5KSB7XG4gICAgbGV0IGxhYmVsQWNjZXNzaWJpbGl0eTogc3RyaW5nID0gJ0FjY2Vzc2liaWxpdMOpIDogbm9uIGNvbmZvcm1lJztcbiAgICBzd2l0Y2ggKGFjY2Vzc2liaWxpdHkpIHtcbiAgICAgIGNhc2UgJ2Z1bGx5LWNvbXBsaWFudCc6XG4gICAgICAgIGxhYmVsQWNjZXNzaWJpbGl0eSA9ICdBY2Nlc3NpYmlsaXTDqSA6IHRvdGFsZW1lbnQgY29uZm9ybWUnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3BhcnRpYWxseSc6XG4gICAgICAgIGxhYmVsQWNjZXNzaWJpbGl0eSA9ICdBY2Nlc3NpYmlsaXTDqSA6IHBhcnRpZWxsZW1lbnQgY29uZm9ybWUnO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBEc2ZyRm9vdGVyQ29tcG9uZW50LkRFRl9NQU5EQVRPUllfTElOS1NbMF0ubGFiZWwgPSBsYWJlbEFjY2Vzc2liaWxpdHk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hcnR3b3JrRGlyUGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmFydHdvcmtEaXJQYXRoID0gdGhpcy5jb25maWcuYXJ0d29ya0RpclBhdGg7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRMaW5rVGFyZ2V0KGl0ZW06IERzZnJMaW5rKTogRHNmckxpbmtUYXJnZXQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBpdGVtLnRhcmdldCA/PyBpdGVtLmxpbmtUYXJnZXQ7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG9uTWFuZGF0b3J5TGlua1NlbGVjdChsaW5rOiBzdHJpbmcpIHtcbiAgICB0aGlzLm1hbmRhdG9yeUxpbmtTZWxlY3QuZW1pdChsaW5rKTtcbiAgfVxufVxuIiwiPGZvb3RlciBjbGFzcz1cImZyLWZvb3RlclwiIHJvbGU9XCJjb250ZW50aW5mb1wiIGlkPVwiZm9vdGVyXCI+XG4gIDwhLS0gUmVib3VuZExpbmtzIC0tPlxuICA8ZGl2ICpuZ0lmPVwicmVib3VuZExpbmtzICYmIHJlYm91bmRMaW5rcy5sZW5ndGggPj0gMVwiIGNsYXNzPVwiZnItZm9vdGVyX190b3BcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZnItY29udGFpbmVyXCI+XG4gICAgICA8IS0tIEJVRzogQ2xhc3NlICdmci1ncmlkLXJvdy0tc3RhcnQnIGluY29ubnVlIGVuIERTRlIgMS45LjMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZnItZ3JpZC1yb3cgZnItZ3JpZC1yb3ctLXN0YXJ0IGZyLWdyaWQtcm93LS1ndXR0ZXJzXCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2YgcmVib3VuZExpbmtzXCIgY2xhc3M9XCJmci1jb2wtMTIgZnItY29sLXNtLTMgZnItY29sLW1kLTJcIj5cbiAgICAgICAgICA8aDMgY2xhc3M9XCJmci1mb290ZXJfX3RvcC1jYXRcIj57eyBpdGVtLnRpdGxlIH19PC9oMz5cbiAgICAgICAgICA8dWwgY2xhc3M9XCJmci1mb290ZXJfX3RvcC1saXN0XCI+XG4gICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGxpbmsgb2YgaXRlbS5saW5rc1wiPlxuICAgICAgICAgICAgICA8ZWR1LWl0ZW0tbGluayBbaXRlbV09XCJsaW5rXCIgY3VzdG9tQ2xhc3M9XCJmci1mb290ZXJfX3RvcC1saW5rXCI+PC9lZHUtaXRlbS1saW5rPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiZnItY29udGFpbmVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImZyLWZvb3Rlcl9fYm9keVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZyLWZvb3Rlcl9fYnJhbmQgZnItZW5sYXJnZS1saW5rXCI+XG4gICAgICAgIDwhLS1CbG9jIGF2ZWMgbG9nbyBvcMOpcmF0ZXVyLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb2dvLmltYWdlUGF0aFwiXG4gICAgICAgICAgPjxwIGNsYXNzPVwiZnItbG9nb1wiIFtpbm5lckhUTUxdPVwibG9nby5sYWJlbFwiPjwvcD5cbiAgICAgICAgICA8YVxuICAgICAgICAgICAgY2xhc3M9XCJmci1mb290ZXJfX2JyYW5kLWxpbmtcIlxuICAgICAgICAgICAgW2hyZWZdPVwibG9nby5saW5rXCJcbiAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cImxvZ28/LnRvb2x0aXBNZXNzYWdlID8gbG9nby50b29sdGlwTWVzc2FnZSA6IG51bGxcIlxuICAgICAgICAgICAgPjxpbWcgY2xhc3M9XCJmci1mb290ZXJfX2xvZ29cIiBzdHlsZT1cIndpZHRoOiAzLjVyZW1cIiBbc3JjXT1cImxvZ28uaW1hZ2VQYXRoXCIgW2F0dHIuYWx0XT1cImxvZ28uaW1hZ2VBbHRcIiAvPiA8L2FcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8IS0tQmxvYyBzYW5zIGxvZ28gb3DDqXJhdGV1ci0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxvZ28uaW1hZ2VQYXRoXCI+XG4gICAgICAgICAgPGEgW2hyZWZdPVwibG9nby5saW5rXCIgW2F0dHIudGl0bGVdPVwibG9nbz8udG9vbHRpcE1lc3NhZ2UgPyBsb2dvLnRvb2x0aXBNZXNzYWdlIDogbnVsbFwiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJmci1sb2dvXCIgW2lubmVySFRNTF09XCJsb2dvLmxhYmVsXCI+PC9wPlxuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmci1mb290ZXJfX2NvbnRlbnRcIj5cbiAgICAgICAgPHAgKm5nSWY9XCJwcmVzZW50YXRpb25cIiBjbGFzcz1cImZyLWZvb3Rlcl9fY29udGVudC1kZXNjXCIgW2lubmVySHRtbF09XCJwcmVzZW50YXRpb25cIj48L3A+XG4gICAgICAgIDx1bCBjbGFzcz1cImZyLWZvb3Rlcl9fY29udGVudC1saXN0XCI+XG4gICAgICAgICAgPCEtLSBCVUc6IENsYXNzZSAnZnItZm9vdGVyX19jb250ZW50LWl0ZW0nIGluY29ubnVlIGVuIERTRlIgMS45LjMgLS0+XG4gICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBpdGVtIG9mIGluc3RpdHV0aW9uYWxMaW5rc1wiIGNsYXNzPVwiZnItZm9vdGVyX19jb250ZW50LWl0ZW1cIj5cbiAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgIGNsYXNzPVwiZnItZm9vdGVyX19jb250ZW50LWxpbmtcIlxuICAgICAgICAgICAgICBbYXR0ci50YXJnZXRdPVwiZ2V0TGlua1RhcmdldChpdGVtKSA/PyBudWxsXCJcbiAgICAgICAgICAgICAgW2hyZWZdPVwiaXRlbS5yb3V0ZSA/IGl0ZW0ucm91dGUgOiBpdGVtLmxpbmtcIj5cbiAgICAgICAgICAgICAge3sgaXRlbS5sYWJlbCB9fTwvYVxuICAgICAgICAgICAgPlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgIDwvdWw+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tQmxvYyBhdmVjIHBhcnRlbmFpcmVzLS0+XG4gICAgPGRpdiAqbmdJZj1cInBhcnRuZXJNYWluXCIgY2xhc3M9XCJmci1mb290ZXJfX3BhcnRuZXJzXCI+XG4gICAgICA8aDIgY2xhc3M9XCJmci1mb290ZXJfX3BhcnRuZXJzLXRpdGxlXCI+e3sgaTE4bi50KCdmb290ZXIucGFydG5lcnMudGl0bGUnKSB9fTwvaDI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZnItZm9vdGVyX19wYXJ0bmVycy1sb2dvc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnItZm9vdGVyX19wYXJ0bmVycy1tYWluXCI+XG4gICAgICAgICAgPGEgY2xhc3M9XCJmci1mb290ZXJfX3BhcnRuZXJzLWxpbmtcIiBbaHJlZl09XCJwYXJ0bmVyTWFpbi5saW5rXCI+XG4gICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgIGNsYXNzPVwiZnItZm9vdGVyX19sb2dvXCJcbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICAgICAgICAgIGhlaWdodDogcGFydG5lck1haW4uY3VzdG9tSGVpZ2h0ID8gcGFydG5lck1haW4uY3VzdG9tSGVpZ2h0IDogJzUuNjI1cmVtJ1xuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgW3NyY109XCJwYXJ0bmVyTWFpbi5pbWFnZVBhdGhcIlxuICAgICAgICAgICAgICBbYXR0ci5hbHRdPVwicGFydG5lck1haW4uaW1hZ2VBbHRcIiAvPlxuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJwYXJ0bmVyc1N1YlwiIGNsYXNzPVwiZnItZm9vdGVyX19wYXJ0bmVycy1zdWJcIj5cbiAgICAgICAgICA8dWw+XG4gICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGl0ZW0gb2YgcGFydG5lcnNTdWJcIj5cbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJmci1mb290ZXJfX3BhcnRuZXJzLWxpbmtcIiBbaHJlZl09XCJpdGVtLmxpbmtcIj5cbiAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZyLWZvb3Rlcl9fbG9nb1wiXG4gICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IGhlaWdodDogaXRlbS5jdXN0b21IZWlnaHQgPyBpdGVtLmN1c3RvbUhlaWdodCA6ICc1LjYyNXJlbScgfVwiXG4gICAgICAgICAgICAgICAgICBbc3JjXT1cIml0ZW0uaW1hZ2VQYXRoXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFsdF09XCJpdGVtLmltYWdlQWx0XCIgLz5cbiAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDwhLS0gQm90dG9tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPGRpdiBjbGFzcz1cImZyLWZvb3Rlcl9fYm90dG9tXCI+XG4gICAgICA8dWwgY2xhc3M9XCJmci1mb290ZXJfX2JvdHRvbS1saXN0XCI+XG4gICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBtYW5kYXRvcnlMaW5rc1wiIGNsYXNzPVwiZnItZm9vdGVyX19ib3R0b20taXRlbVwiPlxuICAgICAgICAgIDxlZHUtaXRlbS1saW5rXG4gICAgICAgICAgICBbaXRlbV09XCJpdGVtXCJcbiAgICAgICAgICAgIGN1c3RvbUNsYXNzPVwiZnItZm9vdGVyX19ib3R0b20tbGlua1wiXG4gICAgICAgICAgICAobGlua1NlbGVjdCk9XCJvbk1hbmRhdG9yeUxpbmtTZWxlY3QoJGV2ZW50KVwiPjwvZWR1LWl0ZW0tbGluaz5cbiAgICAgICAgPC9saT5cbiAgICAgICAgPGxpICpuZ0lmPVwiZGlzcGxheVwiIGNsYXNzPVwiZnItZm9vdGVyX19ib3R0b20taXRlbVwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJmci1mb290ZXJfX2JvdHRvbS1saW5rIGZyLWZpLXRoZW1lLWZpbGwgZnItbGluay0taWNvbi1sZWZ0XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiZGlzcGxheU1vZGFsSWRcIlxuICAgICAgICAgICAgZGF0YS1mci1vcGVuZWQ9XCJmYWxzZVwiPlxuICAgICAgICAgICAgUGFyYW3DqHRyZXMgZCdhZmZpY2hhZ2VcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9saT5cbiAgICAgIDwvdWw+XG4gICAgICA8ZGl2IGNsYXNzPVwiZnItZm9vdGVyX19ib3R0b20tY29weVwiPlxuICAgICAgICA8cCBbaW5uZXJIVE1MXT1cImxpY2Vuc2VcIj48L3A+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Zvb3Rlcj5cblxuPGRzZnItZGlzcGxheSAqbmdJZj1cImRpc3BsYXkgJiYgX3VzZURlcHJlY2F0ZWRQaWN0b1BhdGhcIiBbcGljdG9QYXRoXT1cImFydHdvcmtEaXJQYXRoXCI+PC9kc2ZyLWRpc3BsYXk+XG48ZHNmci1kaXNwbGF5ICpuZ0lmPVwiZGlzcGxheSAmJiAhX3VzZURlcHJlY2F0ZWRQaWN0b1BhdGhcIiBbYXJ0d29ya0RpclBhdGhdPVwiYXJ0d29ya0RpclBhdGhcIj48L2RzZnItZGlzcGxheT5cbiJdfQ==