UNPKG

@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).

87 lines 27.4 kB
import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core'; import { DsfrSizeConst } from '../../shared'; import { BasePanelComponent } from './base-panel.component'; import { DsfrPanelBackgroundConst, DsfrPanelBorderConst } from './base-panel.model'; import * as i0 from "@angular/core"; import * as i1 from "../../shared"; import * as i2 from "@angular/common"; import * as i3 from "../badges-group/badges-group.component"; import * as i4 from "../tags-group/tags-group.component"; import * as i5 from "../../shared/components/svg-icon/svg-icon.component"; import * as i6 from "../link/link.component"; import * as i7 from "../../shared/components/link-download/link-download.component"; export class DsfrCardComponent extends BasePanelComponent { /**@internal */ constructor(langService, i18n) { super(langService); this.i18n = i18n; /** * Zone d'actions, composée de bouton ou de liens (jusqu'à 4 éléments), optionnelle (mais incompatible avec la * deuxième zone de détail). * Usage : cette propriété doit être activée pour afficher le contenu fourni par l'intermédiaire du slot 'actions' */ this.hasFooter = false; /** * Type d'illustration * - `img` : pour l'utilisation d'une balise '<img>'. * - `svg` : pour l'utilisation de '<edu-svg-icon>'. * Si c'est le cas, `@ImagePath` devient le path du fichier `sprite.svg` et la concaténation de l'id du svg à afficher. */ this.imageType = 'img'; /** Signale quand la carte est sélectionnée. */ this.cardSelect = new EventEmitter(); this.enlargeLink = false; } /** @internal */ getClasses() { return { 'fr-card': true, 'fr-card--horizontal': this.horizontal, 'fr-card--download': this.download, 'fr-enlarge-link': this.enlargeLink && !this.hasFooter, 'fr-card--no-arrow': this.hasFooter, 'fr-card--no-border': this.customBorder === DsfrPanelBorderConst.NO_BORDER, 'fr-card--shadow': this.customBorder === DsfrPanelBorderConst.SHADOW, 'fr-card--grey': this.customBackground === DsfrPanelBackgroundConst.GREY, 'fr-card--no-background': this.customBackground === DsfrPanelBackgroundConst.TRANSPARENT, 'fr-card--sm': this.size === DsfrSizeConst.SM, 'fr-card--lg': this.size === DsfrSizeConst.LG, }; } /** @internal */ onLinkSelect() { // on propage l'output, pas besoin de gérer ici le preventDefault, c'est géré en amont if (this.route) { this.cardSelect.emit(this.route); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DsfrCardComponent, deps: [{ token: i1.LangService }, { token: i1.I18nService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DsfrCardComponent, selector: "dsfr-card", inputs: { badgesOnMedia: "badgesOnMedia", detail: "detail", detailIcon: "detailIcon", detailBottomIcon: "detailBottomIcon", hasFooter: "hasFooter", imageAlt: "imageAlt", imageFit: "imageFit", imagePath: "imagePath", imageRatio: "imageRatio", imageType: "imageType" }, outputs: { cardSelect: "cardSelect" }, usesInheritance: true, ngImport: i0, template: "<div [ngClass]=\"getClasses()\">\n <!-- Card body -->\n <div class=\"fr-card__body\">\n <div class=\"fr-card__content\">\n <!-- Titre du contenu -->\n <ng-container>\n <ng-container *ngTemplateOutlet=\"dsfrCardHeading\"></ng-container>\n </ng-container>\n\n <!-- D\u00E9tail du haut -->\n <div *ngIf=\"detail || tags || (badges && !badgesOnMedia)\" class=\"fr-card__start\">\n <dsfr-tags-group *ngIf=\"tags\" [tags]=\"tags\"></dsfr-tags-group>\n <dsfr-badges-group *ngIf=\"badges && !badgesOnMedia\" [badges]=\"badges\"></dsfr-badges-group>\n <p *ngIf=\"detail || detailIcon\" class=\"fr-card__detail\" [ngClass]=\"detailIcon\">\n {{ detail }}\n </p>\n </div>\n\n <!-- Description -->\n <p *ngIf=\"description\" class=\"fr-card__desc\" [innerHTML]=\"description\"></p>\n\n <!-- D\u00E9tail du bas -->\n <div *ngIf=\"detailBottom || detailBottomIcon || downloadAssessFile\" class=\"fr-card__end\">\n <p class=\"fr-card__detail\" [ngClass]=\"detailBottomIcon\">\n {{ detailBottom }}\n </p>\n </div>\n </div>\n\n <!-- Card footer -->\n <div *ngIf=\"hasFooter\" class=\"fr-card__footer\">\n <ng-content select=\"[footer]\"></ng-content>\n </div>\n </div>\n <!-- Card header -->\n <div *ngIf=\"imagePath\" class=\"fr-card__header\">\n <div class=\"fr-card__img\">\n <img\n *ngIf=\"imageType === 'img'\"\n [src]=\"imagePath\"\n class=\"fr-responsive-img\"\n [ngClass]=\"{\n 'fr-ratio-32x9': imageRatio === '16:9/2',\n 'fr-ratio-16x9': imageRatio === '16:9',\n 'fr-ratio-3x2': imageRatio === '3:2',\n 'fr-ratio-4x3': imageRatio === '4:3',\n 'fr-ratio-1x1': imageRatio === '1:1',\n 'fr-ratio-3x4': imageRatio === '3:4',\n 'fr-ratio-2x3': imageRatio === '2:3'\n }\"\n [ngStyle]=\"{ 'object-fit': imageFit }\"\n [attr.alt]=\"imageAlt\" />\n <!-- L\u2019alternative de l\u2019image (attribut alt) doit toujours \u00EAtre pr\u00E9sente, sa valeur peut-\u00EAtre vide (image n\u2019apportant pas de sens suppl\u00E9mentaire au contexte) ou non (porteuse de texte ou apportant du sens) selon votre contexte -->\n <edu-svg-icon *ngIf=\"imageType === 'svg'\" [iconPath]=\"imagePath\"></edu-svg-icon>\n </div>\n <dsfr-badges-group *ngIf=\"badges && badgesOnMedia\" [badges]=\"badges\"></dsfr-badges-group>\n </div>\n</div>\n\n<ng-template #dsfrCardHeading>\n <ng-container [ngSwitch]=\"headingLevel\">\n <h2 *ngSwitchCase=\"'H2'\" class=\"fr-card__title\">\n <ng-container *ngTemplateOutlet=\"headingTemplate\"></ng-container>\n </h2>\n <h3 *ngSwitchDefault class=\"fr-card__title\">\n <ng-container *ngTemplateOutlet=\"headingTemplate\"></ng-container>\n </h3>\n <h4 *ngSwitchCase=\"'H4'\" class=\"fr-card__title\">\n <ng-container *ngTemplateOutlet=\"headingTemplate\"></ng-container>\n </h4>\n <h5 *ngSwitchCase=\"'H5'\" class=\"fr-card__title\">\n <ng-container *ngTemplateOutlet=\"headingTemplate\"></ng-container>\n </h5>\n <h6 *ngSwitchCase=\"'H6'\" class=\"fr-card__title\">\n <ng-container *ngTemplateOutlet=\"headingTemplate\"></ng-container>\n </h6>\n </ng-container>\n</ng-template>\n\n<ng-template #headingTemplate>\n <span *ngIf=\"!hasLink()\" [innerHTML]=\"heading\"></span>\n <dsfr-link\n *ngIf=\"hasLink() && !download\"\n [customClass]=\"disabled ? '' : 'fr-card__title'\"\n [ariaLabel]=\"ariaLabel ?? ''\"\n [disabled]=\"disabled\"\n [label]=\"heading\"\n [link]=\"link\"\n [linkTarget]=\"linkTarget\"\n [route]=\"route\"\n [routePath]=\"routePath\"\n [routerLinkActive]=\"routerLinkActive ?? ''\"\n [routerLinkExtras]=\"routerLinkExtras\"\n (linkSelect)=\"onLinkSelect()\"></dsfr-link>\n <!-- Lien de telechargement -->\n <edu-link-download\n *ngIf=\"download\"\n [item]=\"itemLink\"\n [downloadDirect]=\"downloadDirect\"\n [downloadAssessFile]=\"downloadAssessFile\"\n [langCode]=\"downloadLangCode\"\n (linkSelect)=\"onLinkSelect()\"></edu-link-download>\n</ng-template>\n", styles: [".fr-card{height:100%}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i3.DsfrBadgesGroupComponent, selector: "dsfr-badges-group", inputs: ["badges", "small"] }, { kind: "component", type: i4.DsfrTagsGroupComponent, selector: "dsfr-tags-group", inputs: ["tags", "mode"], outputs: ["tagSelect"] }, { kind: "component", type: i5.SvgIconComponent, selector: "edu-svg-icon", inputs: ["iconPath", "role", "ariaHidden", "alt"] }, { kind: "component", type: i6.DsfrLinkComponent, selector: "dsfr-link", inputs: ["ariaCurrent", "ariaLabel", "ariaControls", "customClass", "disabled", "icon", "iconPosition", "linkId", "label", "link", "linkTarget", "route", "routePath", "routerLinkActive", "routerLinkActiveOptions", "routerLinkExtras", "size", "tooltipMessage", "mode", "targetLink", "routerLink"], outputs: ["linkSelect"] }, { kind: "component", type: i7.LinkDownloadComponent, selector: "edu-link-download", inputs: ["customClass", "downloadDirect", "downloadAssessFile", "langCode", "item"], outputs: ["linkSelect"] }], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DsfrCardComponent, decorators: [{ type: Component, args: [{ selector: 'dsfr-card', encapsulation: ViewEncapsulation.None, template: "<div [ngClass]=\"getClasses()\">\n <!-- Card body -->\n <div class=\"fr-card__body\">\n <div class=\"fr-card__content\">\n <!-- Titre du contenu -->\n <ng-container>\n <ng-container *ngTemplateOutlet=\"dsfrCardHeading\"></ng-container>\n </ng-container>\n\n <!-- D\u00E9tail du haut -->\n <div *ngIf=\"detail || tags || (badges && !badgesOnMedia)\" class=\"fr-card__start\">\n <dsfr-tags-group *ngIf=\"tags\" [tags]=\"tags\"></dsfr-tags-group>\n <dsfr-badges-group *ngIf=\"badges && !badgesOnMedia\" [badges]=\"badges\"></dsfr-badges-group>\n <p *ngIf=\"detail || detailIcon\" class=\"fr-card__detail\" [ngClass]=\"detailIcon\">\n {{ detail }}\n </p>\n </div>\n\n <!-- Description -->\n <p *ngIf=\"description\" class=\"fr-card__desc\" [innerHTML]=\"description\"></p>\n\n <!-- D\u00E9tail du bas -->\n <div *ngIf=\"detailBottom || detailBottomIcon || downloadAssessFile\" class=\"fr-card__end\">\n <p class=\"fr-card__detail\" [ngClass]=\"detailBottomIcon\">\n {{ detailBottom }}\n </p>\n </div>\n </div>\n\n <!-- Card footer -->\n <div *ngIf=\"hasFooter\" class=\"fr-card__footer\">\n <ng-content select=\"[footer]\"></ng-content>\n </div>\n </div>\n <!-- Card header -->\n <div *ngIf=\"imagePath\" class=\"fr-card__header\">\n <div class=\"fr-card__img\">\n <img\n *ngIf=\"imageType === 'img'\"\n [src]=\"imagePath\"\n class=\"fr-responsive-img\"\n [ngClass]=\"{\n 'fr-ratio-32x9': imageRatio === '16:9/2',\n 'fr-ratio-16x9': imageRatio === '16:9',\n 'fr-ratio-3x2': imageRatio === '3:2',\n 'fr-ratio-4x3': imageRatio === '4:3',\n 'fr-ratio-1x1': imageRatio === '1:1',\n 'fr-ratio-3x4': imageRatio === '3:4',\n 'fr-ratio-2x3': imageRatio === '2:3'\n }\"\n [ngStyle]=\"{ 'object-fit': imageFit }\"\n [attr.alt]=\"imageAlt\" />\n <!-- L\u2019alternative de l\u2019image (attribut alt) doit toujours \u00EAtre pr\u00E9sente, sa valeur peut-\u00EAtre vide (image n\u2019apportant pas de sens suppl\u00E9mentaire au contexte) ou non (porteuse de texte ou apportant du sens) selon votre contexte -->\n <edu-svg-icon *ngIf=\"imageType === 'svg'\" [iconPath]=\"imagePath\"></edu-svg-icon>\n </div>\n <dsfr-badges-group *ngIf=\"badges && badgesOnMedia\" [badges]=\"badges\"></dsfr-badges-group>\n </div>\n</div>\n\n<ng-template #dsfrCardHeading>\n <ng-container [ngSwitch]=\"headingLevel\">\n <h2 *ngSwitchCase=\"'H2'\" class=\"fr-card__title\">\n <ng-container *ngTemplateOutlet=\"headingTemplate\"></ng-container>\n </h2>\n <h3 *ngSwitchDefault class=\"fr-card__title\">\n <ng-container *ngTemplateOutlet=\"headingTemplate\"></ng-container>\n </h3>\n <h4 *ngSwitchCase=\"'H4'\" class=\"fr-card__title\">\n <ng-container *ngTemplateOutlet=\"headingTemplate\"></ng-container>\n </h4>\n <h5 *ngSwitchCase=\"'H5'\" class=\"fr-card__title\">\n <ng-container *ngTemplateOutlet=\"headingTemplate\"></ng-container>\n </h5>\n <h6 *ngSwitchCase=\"'H6'\" class=\"fr-card__title\">\n <ng-container *ngTemplateOutlet=\"headingTemplate\"></ng-container>\n </h6>\n </ng-container>\n</ng-template>\n\n<ng-template #headingTemplate>\n <span *ngIf=\"!hasLink()\" [innerHTML]=\"heading\"></span>\n <dsfr-link\n *ngIf=\"hasLink() && !download\"\n [customClass]=\"disabled ? '' : 'fr-card__title'\"\n [ariaLabel]=\"ariaLabel ?? ''\"\n [disabled]=\"disabled\"\n [label]=\"heading\"\n [link]=\"link\"\n [linkTarget]=\"linkTarget\"\n [route]=\"route\"\n [routePath]=\"routePath\"\n [routerLinkActive]=\"routerLinkActive ?? ''\"\n [routerLinkExtras]=\"routerLinkExtras\"\n (linkSelect)=\"onLinkSelect()\"></dsfr-link>\n <!-- Lien de telechargement -->\n <edu-link-download\n *ngIf=\"download\"\n [item]=\"itemLink\"\n [downloadDirect]=\"downloadDirect\"\n [downloadAssessFile]=\"downloadAssessFile\"\n [langCode]=\"downloadLangCode\"\n (linkSelect)=\"onLinkSelect()\"></edu-link-download>\n</ng-template>\n", styles: [".fr-card{height:100%}\n"] }] }], ctorParameters: function () { return [{ type: i1.LangService }, { type: i1.I18nService }]; }, propDecorators: { badgesOnMedia: [{ type: Input }], detail: [{ type: Input }], detailIcon: [{ type: Input }], detailBottomIcon: [{ type: Input }], hasFooter: [{ type: Input }], imageAlt: [{ type: Input }], imageFit: [{ type: Input }], imagePath: [{ type: Input }], imageRatio: [{ type: Input }], imageType: [{ type: Input }], cardSelect: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZHNmci1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9jYXJkL2NhcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvY2FyZC9jYXJkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUYsT0FBTyxFQUFFLGFBQWEsRUFBNEIsTUFBTSxjQUFjLENBQUM7QUFDdkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7Ozs7OztBQVNwRixNQUFNLE9BQU8saUJBQWtCLFNBQVEsa0JBQWtCO0lBZ0R2RCxlQUFlO0lBQ2YsWUFDRSxXQUF3QixFQUNqQixJQUFpQjtRQUV4QixLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFGWixTQUFJLEdBQUosSUFBSSxDQUFhO1FBcEMxQjs7OztXQUlHO1FBQ00sY0FBUyxHQUFHLEtBQUssQ0FBQztRQWlCM0I7Ozs7O1dBS0c7UUFDTSxjQUFTLEdBQWtCLEtBQUssQ0FBQztRQUUxQywrQ0FBK0M7UUFDNUIsZUFBVSxHQUF5QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBUXZFLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsVUFBVTtRQUNSLE9BQU87WUFDTCxTQUFTLEVBQUUsSUFBSTtZQUNmLHFCQUFxQixFQUFFLElBQUksQ0FBQyxVQUFVO1lBQ3RDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ2xDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUztZQUN0RCxtQkFBbUIsRUFBRSxJQUFJLENBQUMsU0FBUztZQUNuQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsWUFBWSxLQUFLLG9CQUFvQixDQUFDLFNBQVM7WUFDMUUsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFlBQVksS0FBSyxvQkFBb0IsQ0FBQyxNQUFNO1lBQ3BFLGVBQWUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssd0JBQXdCLENBQUMsSUFBSTtZQUN4RSx3QkFBd0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssd0JBQXdCLENBQUMsV0FBVztZQUN4RixhQUFhLEVBQUUsSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsRUFBRTtZQUM3QyxhQUFhLEVBQUUsSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsRUFBRTtTQUM5QyxDQUFDO0lBQ0osQ0FBQztJQUVELGdCQUFnQjtJQUNoQixZQUFZO1FBQ1Ysc0ZBQXNGO1FBQ3RGLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNkLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNsQztJQUNILENBQUM7K0dBaEZVLGlCQUFpQjttR0FBakIsaUJBQWlCLDJYQ1o5QixrbElBdUdBOzs0RkQzRmEsaUJBQWlCO2tCQU43QixTQUFTOytCQUNFLFdBQVcsaUJBR04saUJBQWlCLENBQUMsSUFBSTs0SEFJNUIsYUFBYTtzQkFBckIsS0FBSztnQkFLRyxNQUFNO3NCQUFkLEtBQUs7Z0JBR0csVUFBVTtzQkFBbEIsS0FBSztnQkFHRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBT0csU0FBUztzQkFBakIsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQU1HLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0csU0FBUztzQkFBakIsS0FBSztnQkFHRyxVQUFVO3NCQUFsQixLQUFLO2dCQVFHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR2EsVUFBVTtzQkFBNUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRHNmclNpemVDb25zdCwgSTE4blNlcnZpY2UsIExhbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkJztcbmltcG9ydCB7IEJhc2VQYW5lbENvbXBvbmVudCB9IGZyb20gJy4vYmFzZS1wYW5lbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHNmclBhbmVsQmFja2dyb3VuZENvbnN0LCBEc2ZyUGFuZWxCb3JkZXJDb25zdCB9IGZyb20gJy4vYmFzZS1wYW5lbC5tb2RlbCc7XG5pbXBvcnQgeyBEc2ZySW1hZ2VGaXQsIERzZnJJbWFnZVJhdGlvLCBEc2ZySW1hZ2VUeXBlIH0gZnJvbSAnLi9jYXJkLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZHNmci1jYXJkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NhcmQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jYXJkLmNvbXBvbmVudC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIERzZnJDYXJkQ29tcG9uZW50IGV4dGVuZHMgQmFzZVBhbmVsQ29tcG9uZW50IHtcbiAgLyoqIFNpIHRydWUsIGxlcyBiYWRnZXMgc2Vyb250IGFmZmljaMOpcyBzdXIgbGEgem9uZSBtZWRpYS4gKi9cbiAgQElucHV0KCkgYmFkZ2VzT25NZWRpYTogYm9vbGVhbjtcblxuICAvKipcbiAgICogTGUgZMOpdGFpbCwgb3B0aW9ubmVsLiBTdXBwb3J0ZSBsZSBmb3JtYXQgSFRNTCAoc2xvdCBhdmVjIHPDqWxlY3RldXIgXCJkZXRhaWxcIilcbiAgICovXG4gIEBJbnB1dCgpIGRldGFpbDogc3RyaW5nO1xuXG4gIC8qKiBJY8O0bmUgZGUgbGEgem9uZSBkZSBkw6l0YWlsLCBvcHRpb25uZWwuICovXG4gIEBJbnB1dCgpIGRldGFpbEljb246IHN0cmluZztcblxuICAvKiogSWPDtG5lIGRldmFudCBsZSBkw6l0YWlsIHNpdHXDqSBhdSBiYXMgZGUgbGEgY2FydGUsIG9wdGlvbm5lbC4gKi9cbiAgQElucHV0KCkgZGV0YWlsQm90dG9tSWNvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBab25lIGQnYWN0aW9ucywgY29tcG9zw6llIGRlIGJvdXRvbiBvdSBkZSBsaWVucyAoanVzcXUnw6AgNCDDqWzDqW1lbnRzKSwgb3B0aW9ubmVsbGUgKG1haXMgaW5jb21wYXRpYmxlIGF2ZWMgbGFcbiAgICogZGV1eGnDqG1lIHpvbmUgZGUgZMOpdGFpbCkuXG4gICAqIFVzYWdlIDogY2V0dGUgcHJvcHJpw6l0w6kgZG9pdCDDqnRyZSBhY3RpdsOpZSBwb3VyIGFmZmljaGVyIGxlIGNvbnRlbnUgZm91cm5pIHBhciBsJ2ludGVybcOpZGlhaXJlIGR1IHNsb3QgJ2FjdGlvbnMnXG4gICAqL1xuICBASW5wdXQoKSBoYXNGb290ZXIgPSBmYWxzZTtcblxuICAvKiogVGV4dGUgYWx0ZXJuYXRpZiBkJ3VuZSBpbWFnZSDDoCB1dGlsaXNlciB1bmlxdWVtZW50IHNpIGwnaW1hZ2Ugw6AgdW5lIGluZm9ybWF0aW9uIMOgIHBhc3Nlci4gKi9cbiAgQElucHV0KCkgaW1hZ2VBbHQ6IHN0cmluZztcblxuICAvKipcbiAgICogU2Vsb24gbGEgdmFsZXVyIHV0aWxpc8OpZSBwb3VyICdpbWFnZUZpdCcsIGwnw6lsw6ltZW50IHBldXQgw6p0cmUgcm9nbsOpLCBtaXMgw6AgbCfDqWNoZWxsZSBvdSDDqXRpcsOpLCBhZmluIGRlIHJlbXBsaXJcbiAgICogbGEgYm/DrnRlIHF1aSBsZSBjb250aWVudC5cbiAgICovXG4gIEBJbnB1dCgpIGltYWdlRml0OiBEc2ZySW1hZ2VGaXQ7XG5cbiAgLyoqIFVybCBkZSBsJ2ltYWdlIGRlIGwnZW50w6p0ZSwgb3B0aW9ubmVsLiAqL1xuICBASW5wdXQoKSBpbWFnZVBhdGg6IHN0cmluZztcblxuICAvKiogUmF0aW8gZGUgbCdpbWFnZS4gKi9cbiAgQElucHV0KCkgaW1hZ2VSYXRpbzogRHNmckltYWdlUmF0aW87XG5cbiAgLyoqXG4gICAqIFR5cGUgZCdpbGx1c3RyYXRpb25cbiAgICogLSBgaW1nYCA6IHBvdXIgbCd1dGlsaXNhdGlvbiBkJ3VuZSBiYWxpc2UgJzxpbWc+Jy5cbiAgICogLSBgc3ZnYCA6IHBvdXIgbCd1dGlsaXNhdGlvbiBkZSAnPGVkdS1zdmctaWNvbj4nLlxuICAgKiBTaSBjJ2VzdCBsZSBjYXMsIGBASW1hZ2VQYXRoYCBkZXZpZW50IGxlIHBhdGggZHUgZmljaGllciBgc3ByaXRlLnN2Z2AgZXQgbGEgY29uY2F0w6luYXRpb24gZGUgbCdpZCBkdSBzdmcgw6AgYWZmaWNoZXIuXG4gICAqL1xuICBASW5wdXQoKSBpbWFnZVR5cGU6IERzZnJJbWFnZVR5cGUgPSAnaW1nJztcblxuICAvKiogU2lnbmFsZSBxdWFuZCBsYSBjYXJ0ZSBlc3Qgc8OpbGVjdGlvbm7DqWUuICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBjYXJkU2VsZWN0OiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipAaW50ZXJuYWwgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgbGFuZ1NlcnZpY2U6IExhbmdTZXJ2aWNlLFxuICAgIHB1YmxpYyBpMThuOiBJMThuU2VydmljZSxcbiAgKSB7XG4gICAgc3VwZXIobGFuZ1NlcnZpY2UpO1xuICAgIHRoaXMuZW5sYXJnZUxpbmsgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0Q2xhc3NlcygpOiB7fSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdmci1jYXJkJzogdHJ1ZSxcbiAgICAgICdmci1jYXJkLS1ob3Jpem9udGFsJzogdGhpcy5ob3Jpem9udGFsLFxuICAgICAgJ2ZyLWNhcmQtLWRvd25sb2FkJzogdGhpcy5kb3dubG9hZCxcbiAgICAgICdmci1lbmxhcmdlLWxpbmsnOiB0aGlzLmVubGFyZ2VMaW5rICYmICF0aGlzLmhhc0Zvb3RlcixcbiAgICAgICdmci1jYXJkLS1uby1hcnJvdyc6IHRoaXMuaGFzRm9vdGVyLFxuICAgICAgJ2ZyLWNhcmQtLW5vLWJvcmRlcic6IHRoaXMuY3VzdG9tQm9yZGVyID09PSBEc2ZyUGFuZWxCb3JkZXJDb25zdC5OT19CT1JERVIsXG4gICAgICAnZnItY2FyZC0tc2hhZG93JzogdGhpcy5jdXN0b21Cb3JkZXIgPT09IERzZnJQYW5lbEJvcmRlckNvbnN0LlNIQURPVyxcbiAgICAgICdmci1jYXJkLS1ncmV5JzogdGhpcy5jdXN0b21CYWNrZ3JvdW5kID09PSBEc2ZyUGFuZWxCYWNrZ3JvdW5kQ29uc3QuR1JFWSxcbiAgICAgICdmci1jYXJkLS1uby1iYWNrZ3JvdW5kJzogdGhpcy5jdXN0b21CYWNrZ3JvdW5kID09PSBEc2ZyUGFuZWxCYWNrZ3JvdW5kQ29uc3QuVFJBTlNQQVJFTlQsXG4gICAgICAnZnItY2FyZC0tc20nOiB0aGlzLnNpemUgPT09IERzZnJTaXplQ29uc3QuU00sXG4gICAgICAnZnItY2FyZC0tbGcnOiB0aGlzLnNpemUgPT09IERzZnJTaXplQ29uc3QuTEcsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgb25MaW5rU2VsZWN0KCk6IHZvaWQge1xuICAgIC8vIG9uIHByb3BhZ2UgbCdvdXRwdXQsIHBhcyBiZXNvaW4gZGUgZ8OpcmVyIGljaSBsZSBwcmV2ZW50RGVmYXVsdCwgYydlc3QgZ8OpcsOpIGVuIGFtb250XG4gICAgaWYgKHRoaXMucm91dGUpIHtcbiAgICAgIHRoaXMuY2FyZFNlbGVjdC5lbWl0KHRoaXMucm91dGUpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBbbmdDbGFzc109XCJnZXRDbGFzc2VzKClcIj5cbiAgPCEtLSBDYXJkIGJvZHkgLS0+XG4gIDxkaXYgY2xhc3M9XCJmci1jYXJkX19ib2R5XCI+XG4gICAgPGRpdiBjbGFzcz1cImZyLWNhcmRfX2NvbnRlbnRcIj5cbiAgICAgIDwhLS0gVGl0cmUgZHUgY29udGVudSAtLT5cbiAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkc2ZyQ2FyZEhlYWRpbmdcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIETDqXRhaWwgZHUgaGF1dCAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJkZXRhaWwgfHwgdGFncyB8fCAoYmFkZ2VzICYmICFiYWRnZXNPbk1lZGlhKVwiIGNsYXNzPVwiZnItY2FyZF9fc3RhcnRcIj5cbiAgICAgICAgPGRzZnItdGFncy1ncm91cCAqbmdJZj1cInRhZ3NcIiBbdGFnc109XCJ0YWdzXCI+PC9kc2ZyLXRhZ3MtZ3JvdXA+XG4gICAgICAgIDxkc2ZyLWJhZGdlcy1ncm91cCAqbmdJZj1cImJhZGdlcyAmJiAhYmFkZ2VzT25NZWRpYVwiIFtiYWRnZXNdPVwiYmFkZ2VzXCI+PC9kc2ZyLWJhZGdlcy1ncm91cD5cbiAgICAgICAgPHAgKm5nSWY9XCJkZXRhaWwgfHwgZGV0YWlsSWNvblwiIGNsYXNzPVwiZnItY2FyZF9fZGV0YWlsXCIgW25nQ2xhc3NdPVwiZGV0YWlsSWNvblwiPlxuICAgICAgICAgIHt7IGRldGFpbCB9fVxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBEZXNjcmlwdGlvbiAtLT5cbiAgICAgIDxwICpuZ0lmPVwiZGVzY3JpcHRpb25cIiBjbGFzcz1cImZyLWNhcmRfX2Rlc2NcIiBbaW5uZXJIVE1MXT1cImRlc2NyaXB0aW9uXCI+PC9wPlxuXG4gICAgICA8IS0tIETDqXRhaWwgZHUgYmFzIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cImRldGFpbEJvdHRvbSB8fCBkZXRhaWxCb3R0b21JY29uIHx8IGRvd25sb2FkQXNzZXNzRmlsZVwiIGNsYXNzPVwiZnItY2FyZF9fZW5kXCI+XG4gICAgICAgIDxwIGNsYXNzPVwiZnItY2FyZF9fZGV0YWlsXCIgW25nQ2xhc3NdPVwiZGV0YWlsQm90dG9tSWNvblwiPlxuICAgICAgICAgIHt7IGRldGFpbEJvdHRvbSB9fVxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQ2FyZCBmb290ZXIgLS0+XG4gICAgPGRpdiAqbmdJZj1cImhhc0Zvb3RlclwiIGNsYXNzPVwiZnItY2FyZF9fZm9vdGVyXCI+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbZm9vdGVyXVwiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDwhLS0gQ2FyZCBoZWFkZXIgLS0+XG4gIDxkaXYgKm5nSWY9XCJpbWFnZVBhdGhcIiBjbGFzcz1cImZyLWNhcmRfX2hlYWRlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJmci1jYXJkX19pbWdcIj5cbiAgICAgIDxpbWdcbiAgICAgICAgKm5nSWY9XCJpbWFnZVR5cGUgPT09ICdpbWcnXCJcbiAgICAgICAgW3NyY109XCJpbWFnZVBhdGhcIlxuICAgICAgICBjbGFzcz1cImZyLXJlc3BvbnNpdmUtaW1nXCJcbiAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICdmci1yYXRpby0zMng5JzogaW1hZ2VSYXRpbyA9PT0gJzE2OjkvMicsXG4gICAgICAgICAgJ2ZyLXJhdGlvLTE2eDknOiBpbWFnZVJhdGlvID09PSAnMTY6OScsXG4gICAgICAgICAgJ2ZyLXJhdGlvLTN4Mic6IGltYWdlUmF0aW8gPT09ICczOjInLFxuICAgICAgICAgICdmci1yYXRpby00eDMnOiBpbWFnZVJhdGlvID09PSAnNDozJyxcbiAgICAgICAgICAnZnItcmF0aW8tMXgxJzogaW1hZ2VSYXRpbyA9PT0gJzE6MScsXG4gICAgICAgICAgJ2ZyLXJhdGlvLTN4NCc6IGltYWdlUmF0aW8gPT09ICczOjQnLFxuICAgICAgICAgICdmci1yYXRpby0yeDMnOiBpbWFnZVJhdGlvID09PSAnMjozJ1xuICAgICAgICB9XCJcbiAgICAgICAgW25nU3R5bGVdPVwieyAnb2JqZWN0LWZpdCc6IGltYWdlRml0IH1cIlxuICAgICAgICBbYXR0ci5hbHRdPVwiaW1hZ2VBbHRcIiAvPlxuICAgICAgPCEtLSBM4oCZYWx0ZXJuYXRpdmUgZGUgbOKAmWltYWdlIChhdHRyaWJ1dCBhbHQpIGRvaXQgdG91am91cnMgw6p0cmUgcHLDqXNlbnRlLCBzYSB2YWxldXIgcGV1dC3DqnRyZSB2aWRlIChpbWFnZSBu4oCZYXBwb3J0YW50IHBhcyBkZSBzZW5zIHN1cHBsw6ltZW50YWlyZSBhdSBjb250ZXh0ZSkgb3Ugbm9uIChwb3J0ZXVzZSBkZSB0ZXh0ZSBvdSBhcHBvcnRhbnQgZHUgc2Vucykgc2Vsb24gdm90cmUgY29udGV4dGUgLS0+XG4gICAgICA8ZWR1LXN2Zy1pY29uICpuZ0lmPVwiaW1hZ2VUeXBlID09PSAnc3ZnJ1wiIFtpY29uUGF0aF09XCJpbWFnZVBhdGhcIj48L2VkdS1zdmctaWNvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZHNmci1iYWRnZXMtZ3JvdXAgKm5nSWY9XCJiYWRnZXMgJiYgYmFkZ2VzT25NZWRpYVwiIFtiYWRnZXNdPVwiYmFkZ2VzXCI+PC9kc2ZyLWJhZGdlcy1ncm91cD5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNkc2ZyQ2FyZEhlYWRpbmc+XG4gIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImhlYWRpbmdMZXZlbFwiPlxuICAgIDxoMiAqbmdTd2l0Y2hDYXNlPVwiJ0gyJ1wiIGNsYXNzPVwiZnItY2FyZF9fdGl0bGVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkaW5nVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2gyPlxuICAgIDxoMyAqbmdTd2l0Y2hEZWZhdWx0IGNsYXNzPVwiZnItY2FyZF9fdGl0bGVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkaW5nVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2gzPlxuICAgIDxoNCAqbmdTd2l0Y2hDYXNlPVwiJ0g0J1wiIGNsYXNzPVwiZnItY2FyZF9fdGl0bGVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkaW5nVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2g0PlxuICAgIDxoNSAqbmdTd2l0Y2hDYXNlPVwiJ0g1J1wiIGNsYXNzPVwiZnItY2FyZF9fdGl0bGVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkaW5nVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2g1PlxuICAgIDxoNiAqbmdTd2l0Y2hDYXNlPVwiJ0g2J1wiIGNsYXNzPVwiZnItY2FyZF9fdGl0bGVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkaW5nVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2g2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjaGVhZGluZ1RlbXBsYXRlPlxuICA8c3BhbiAqbmdJZj1cIiFoYXNMaW5rKClcIiBbaW5uZXJIVE1MXT1cImhlYWRpbmdcIj48L3NwYW4+XG4gIDxkc2ZyLWxpbmtcbiAgICAqbmdJZj1cImhhc0xpbmsoKSAmJiAhZG93bmxvYWRcIlxuICAgIFtjdXN0b21DbGFzc109XCJkaXNhYmxlZCA/ICcnIDogJ2ZyLWNhcmRfX3RpdGxlJ1wiXG4gICAgW2FyaWFMYWJlbF09XCJhcmlhTGFiZWwgPz8gJydcIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgW2xhYmVsXT1cImhlYWRpbmdcIlxuICAgIFtsaW5rXT1cImxpbmtcIlxuICAgIFtsaW5rVGFyZ2V0XT1cImxpbmtUYXJnZXRcIlxuICAgIFtyb3V0ZV09XCJyb3V0ZVwiXG4gICAgW3JvdXRlUGF0aF09XCJyb3V0ZVBhdGhcIlxuICAgIFtyb3V0ZXJMaW5rQWN0aXZlXT1cInJvdXRlckxpbmtBY3RpdmUgPz8gJydcIlxuICAgIFtyb3V0ZXJMaW5rRXh0cmFzXT1cInJvdXRlckxpbmtFeHRyYXNcIlxuICAgIChsaW5rU2VsZWN0KT1cIm9uTGlua1NlbGVjdCgpXCI+PC9kc2ZyLWxpbms+XG4gIDwhLS0gTGllbiBkZSB0ZWxlY2hhcmdlbWVudCAtLT5cbiAgPGVkdS1saW5rLWRvd25sb2FkXG4gICAgKm5nSWY9XCJkb3dubG9hZFwiXG4gICAgW2l0ZW1dPVwiaXRlbUxpbmtcIlxuICAgIFtkb3dubG9hZERpcmVjdF09XCJkb3dubG9hZERpcmVjdFwiXG4gICAgW2Rvd25sb2FkQXNzZXNzRmlsZV09XCJkb3dubG9hZEFzc2Vzc0ZpbGVcIlxuICAgIFtsYW5nQ29kZV09XCJkb3dubG9hZExhbmdDb2RlXCJcbiAgICAobGlua1NlbGVjdCk9XCJvbkxpbmtTZWxlY3QoKVwiPjwvZWR1LWxpbmstZG93bmxvYWQ+XG48L25nLXRlbXBsYXRlPlxuIl19