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

134 lines 25.5 kB
import { CommonModule } from '@angular/common'; import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core'; import { DsfrI18nPipe, LinkDownloadComponent, downloadDetail, } from '../../shared'; import { DsfrDownloadVariantConst } from './download.model'; import * as i0 from "@angular/core"; import * as i1 from "../../shared"; import * as i2 from "@angular/common"; export class DsfrDownloadComponent { constructor(langService, /** @internal */ i18n) { this.langService = langService; this.i18n = i18n; /** * Permet de basculer la présentation en Card. * * @deprecated Le mode 'block' est déprécié, utiliser `Card#download` à la place */ this.variant = DsfrDownloadVariantConst.LINK; /** * Indique que les métadonnées du fichier seront positionnées automatiquement par le script DSFR. Les propriétés * `mimeType`, `sizeBytes`, `langCode` sont alors ignorées. Si la propriété est positionnée à false alors ce sont * les valeurs des propriétés `mimeType`, `sizeBytes`, `langCode` qui seront utlisées. */ this.assessFile = true; /** * Equivalent à l'attribut html natif 'download'. * Si == 'true', télécharge directement le fichier sans l'ouvrir, 'false' par défaut. * Peut prendre le nom du fichier à télécharger si on souhaite renommer ce fichier. */ this.directDownload = false; /** * Propage la valeur de 'route' lors du clic sur le lien. */ this.downloadSelect = new EventEmitter(); } get currentLang() { return this.langService.lang; } get itemLink() { let label = this.label ? this.label : `${this.i18n.t('commons.download')} ${this.fileName}`; label += `<span class="fr-link__detail">${this.detail}</span>`; const itemLink = { label: label, ariaLabel: this.ariaLabel ?? '' }; if (this.link) { itemLink.link = this.link; } else if (this.route) { itemLink.route = this.route; } return itemLink; } /** * Retourne l'affichage des détails si assetFile est positionné et que l'utilisateur n'est pas en mode action * (activation via l'input route), sinon retourne '' ce qui aura pour effet de laisser calculer l'affichage par * le script DSFR. */ get detail() { return this.assessFile && !this.route ? '' : downloadDetail(this.mimeType, this.sizeBytes, this.sizeUnit); } get sizeUnit() { return this._sizeUnit ? this._sizeUnit : this.langService.lang === 'fr' ? 'octets' : 'bytes'; } /** * Permet d'afficher la taille soit en bytes (KB, MB, ...) soit en octets (Ko, Mo, ...). Par défaut, l'unité est * en octets lorsque la langue courante est 'fr', 'bytes' dans les autres cas. */ set sizeUnit(value) { this._sizeUnit = value; } /** @internal */ onLinkSelect() { if (this.route) { this.downloadSelect.emit(this.route); } } /** * Retourne vrai si on affiche un bouton à la place d'une ancre. * @internal */ hasButtonMarkup() { return !!this.route || !this.link; } /** * Si 'true' ou avec un nom de fichier, télécharge directement le fichier sans l'ouvrir. False par défaut. * @internal */ isDirectDownload() { return !!this.directDownload; } /** @internal */ getNewFileName() { return typeof this.directDownload === 'string' ? this.directDownload : ''; } /** @internal */ isBlockMode() { return this.variant === DsfrDownloadVariantConst.BLOCK; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrDownloadComponent, deps: [{ token: i1.LangService }, { token: i1.DsfrI18nService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DsfrDownloadComponent, isStandalone: true, selector: "dsfr-download", inputs: { label: "label", ariaLabel: "ariaLabel", link: "link", mimeType: "mimeType", fileName: "fileName", sizeBytes: "sizeBytes", langCode: "langCode", variant: "variant", description: "description", assessFile: "assessFile", directDownload: "directDownload", route: "route", linkTarget: "linkTarget", sizeUnit: "sizeUnit" }, outputs: { downloadSelect: "downloadSelect" }, ngImport: i0, template: "@if (!isBlockMode()) {\n <edu-link-download\n [isButton]=\"hasButtonMarkup()\"\n [item]=\"itemLink\"\n [downloadDirect]=\"directDownload ?? false\"\n [downloadAssessFile]=\"assessFile\"\n [linkTarget]=\"linkTarget\"\n customClass=\"fr-link fr-link--download\"\n [langCode]=\"langCode ?? ''\"\n (linkSelect)=\"onLinkSelect()\">\n </edu-link-download>\n} @else {\n <!-- Pour r\u00E9trocompatibilit\u00E9 avec mode \"block\" (d\u00E9pr\u00E9ci\u00E9) -->\n <div\n class=\"fr-download\"\n [ngClass]=\"{\n 'fr-enlarge-link fr-download--card': isBlockMode(),\n 'edu-cardWithButton': hasButtonMarkup()\n }\"\n [attr.lang]=\"currentLang || null\">\n <p>\n <!-- T\u00E9l\u00E9chargement avec une ancre -->\n @if (!hasButtonMarkup()) {\n <a\n [href]=\"link\"\n [attr.download]=\"!isDirectDownload() ? null : getNewFileName()\"\n [attr.hreflang]=\"langCode ? langCode : null\"\n class=\"fr-download__link\"\n [attr.data-fr-assess-file]=\"assessFile && sizeBytes ? sizeUnit : null\">\n {{ 'commons.download' | dsfrI18n }} {{ fileName }}\n <span class=\"fr-download__detail\">{{ detail }}</span>\n </a>\n } @else {\n <!-- T\u00E9l\u00E9chargement avec un bouton (sans m\u00E9tadata) -->\n <button (linkSelect)=\"onLinkSelect()\" type=\"button\" class=\"fr-download__link\">\n {{ 'commons.download' | dsfrI18n }} {{ fileName }}\n <span class=\"fr-download__detail\">{{ detail }}</span>\n </button>\n }\n </p>\n @if (description) {\n <p class=\"fr-download__desc\">{{ description }}</p>\n }\n </div>\n}\n", styles: ["@charset \"UTF-8\";button.fr-download__link{background-position:0% 100%,0% calc(100% - .0625em);background-position:var(--underline-x) 100%,var(--underline-x) calc(100% - .0625em);background-repeat:no-repeat,no-repeat;transition:background-size 0s;background-size:0 .125em,100% .0625em;background-size:var(--underline-hover-width) .125em,var(--underline-idle-width) .0625em}button.fr-download__link:before{content:\"\";display:block;position:absolute;inset:0;width:100%;height:100%;outline-offset:2px;outline-style:inherit;outline-color:inherit;outline-width:2px;z-index:1}button.fr-download__link:focus-visible:before{outline-style:solid;outline-color:#0a76f6}.edu-cardWithButton{cursor:pointer}.edu-cardWithButton button{background-image:none}.edu-cardWithButton button:focus-visible{outline-style:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: LinkDownloadComponent, selector: "edu-link-download", inputs: ["customClass", "downloadDirect", "downloadAssessFile", "langCode", "linkTarget", "isButton", "item"], outputs: ["linkSelect"] }, { kind: "pipe", type: DsfrI18nPipe, name: "dsfrI18n" }], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrDownloadComponent, decorators: [{ type: Component, args: [{ selector: 'dsfr-download', encapsulation: ViewEncapsulation.None, standalone: true, imports: [CommonModule, LinkDownloadComponent, DsfrI18nPipe], template: "@if (!isBlockMode()) {\n <edu-link-download\n [isButton]=\"hasButtonMarkup()\"\n [item]=\"itemLink\"\n [downloadDirect]=\"directDownload ?? false\"\n [downloadAssessFile]=\"assessFile\"\n [linkTarget]=\"linkTarget\"\n customClass=\"fr-link fr-link--download\"\n [langCode]=\"langCode ?? ''\"\n (linkSelect)=\"onLinkSelect()\">\n </edu-link-download>\n} @else {\n <!-- Pour r\u00E9trocompatibilit\u00E9 avec mode \"block\" (d\u00E9pr\u00E9ci\u00E9) -->\n <div\n class=\"fr-download\"\n [ngClass]=\"{\n 'fr-enlarge-link fr-download--card': isBlockMode(),\n 'edu-cardWithButton': hasButtonMarkup()\n }\"\n [attr.lang]=\"currentLang || null\">\n <p>\n <!-- T\u00E9l\u00E9chargement avec une ancre -->\n @if (!hasButtonMarkup()) {\n <a\n [href]=\"link\"\n [attr.download]=\"!isDirectDownload() ? null : getNewFileName()\"\n [attr.hreflang]=\"langCode ? langCode : null\"\n class=\"fr-download__link\"\n [attr.data-fr-assess-file]=\"assessFile && sizeBytes ? sizeUnit : null\">\n {{ 'commons.download' | dsfrI18n }} {{ fileName }}\n <span class=\"fr-download__detail\">{{ detail }}</span>\n </a>\n } @else {\n <!-- T\u00E9l\u00E9chargement avec un bouton (sans m\u00E9tadata) -->\n <button (linkSelect)=\"onLinkSelect()\" type=\"button\" class=\"fr-download__link\">\n {{ 'commons.download' | dsfrI18n }} {{ fileName }}\n <span class=\"fr-download__detail\">{{ detail }}</span>\n </button>\n }\n </p>\n @if (description) {\n <p class=\"fr-download__desc\">{{ description }}</p>\n }\n </div>\n}\n", styles: ["@charset \"UTF-8\";button.fr-download__link{background-position:0% 100%,0% calc(100% - .0625em);background-position:var(--underline-x) 100%,var(--underline-x) calc(100% - .0625em);background-repeat:no-repeat,no-repeat;transition:background-size 0s;background-size:0 .125em,100% .0625em;background-size:var(--underline-hover-width) .125em,var(--underline-idle-width) .0625em}button.fr-download__link:before{content:\"\";display:block;position:absolute;inset:0;width:100%;height:100%;outline-offset:2px;outline-style:inherit;outline-color:inherit;outline-width:2px;z-index:1}button.fr-download__link:focus-visible:before{outline-style:solid;outline-color:#0a76f6}.edu-cardWithButton{cursor:pointer}.edu-cardWithButton button{background-image:none}.edu-cardWithButton button:focus-visible{outline-style:none}\n"] }] }], ctorParameters: () => [{ type: i1.LangService }, { type: i1.DsfrI18nService }], propDecorators: { label: [{ type: Input }], ariaLabel: [{ type: Input }], link: [{ type: Input }], mimeType: [{ type: Input }], fileName: [{ type: Input }], sizeBytes: [{ type: Input }], langCode: [{ type: Input }], variant: [{ type: Input }], description: [{ type: Input }], assessFile: [{ type: Input }], directDownload: [{ type: Input }], route: [{ type: Input }], linkTarget: [{ type: Input }], downloadSelect: [{ type: Output }], sizeUnit: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG93bmxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvZG93bmxvYWQvZG93bmxvYWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvZG93bmxvYWQvZG93bmxvYWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUYsT0FBTyxFQUVMLFlBQVksRUFLWixxQkFBcUIsRUFDckIsY0FBYyxHQUNmLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBcUMsd0JBQXdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7OztBQVUvRixNQUFNLE9BQU8scUJBQXFCO0lBK0VoQyxZQUNVLFdBQXdCO0lBQ2hDLGdCQUFnQixDQUFRLElBQXFCO1FBRHJDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ1IsU0FBSSxHQUFKLElBQUksQ0FBaUI7UUFwRC9DOzs7O1dBSUc7UUFDTSxZQUFPLEdBQXdCLHdCQUF3QixDQUFDLElBQUksQ0FBQztRQVN0RTs7OztXQUlHO1FBQ00sZUFBVSxHQUFHLElBQUksQ0FBQztRQUUzQjs7OztXQUlHO1FBQ00sbUJBQWMsR0FBaUMsS0FBSyxDQUFDO1FBZ0I5RDs7V0FFRztRQUNPLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztJQVFuRCxDQUFDO0lBRUosSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztJ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QWhCLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFHRyxTQUFTO3NCQUFqQixLQUFLO2dCQU9HLFFBQVE7c0JBQWhCLEtBQUs7Z0JBT0csT0FBTztzQkFBZixLQUFLO2dCQU9HLFdBQVc7c0JBQW5CLEtBQUs7Z0JBT0csVUFBVTtzQkFBbEIsS0FBSztnQkFPRyxjQUFjO3NCQUF0QixLQUFLO2dCQVNHLEtBQUs7c0JBQWIsS0FBSztnQkFLRyxVQUFVO3NCQUFsQixLQUFLO2dCQUtJLGNBQWM7c0JBQXZCLE1BQU07Z0JBNkNNLFFBQVE7c0JBQXBCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBEc2ZyRmlsZVNpemVVbml0LFxuICBEc2ZySTE4blBpcGUsXG4gIERzZnJJMThuU2VydmljZSxcbiAgRHNmckxpbmssXG4gIERzZnJMaW5rVGFyZ2V0LFxuICBMYW5nU2VydmljZSxcbiAgTGlua0Rvd25sb2FkQ29tcG9uZW50LFxuICBkb3dubG9hZERldGFpbCxcbn0gZnJvbSAnLi4vLi4vc2hhcmVkJztcbmltcG9ydCB7IERzZnJEb3dubG9hZCwgRHNmckRvd25sb2FkVmFyaWFudCwgRHNmckRvd25sb2FkVmFyaWFudENvbnN0IH0gZnJvbSAnLi9kb3dubG9hZC5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RzZnItZG93bmxvYWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZG93bmxvYWQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kb3dubG9hZC5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBMaW5rRG93bmxvYWRDb21wb25lbnQsIERzZnJJMThuUGlwZV0sXG59KVxuZXhwb3J0IGNsYXNzIERzZnJEb3dubG9hZENvbXBvbmVudCBpbXBsZW1lbnRzIERzZnJEb3dubG9hZCB7XG4gIC8qKiBMYWJlbCBkdSBsaWVuLiBQYXIgZMOpZmF1dCBpbmRpcXVlICdUw6lsw6ljaGFyZ2VyIFtub20gZHUgZmljaGllcl0nICovXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIExhIHByb3ByacOpdMOpIGFyaWFMYWJlbCBkw6lmaW5pdCB1bmUgdmFsZXVyIGRlIGNoYcOubmUgcXVpIMOpdGlxdWV0dGUgdW4gw6lsw6ltZW50IGludGVyYWN0aWYuICovXG4gIEBJbnB1dCgpIGFyaWFMYWJlbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBMaWVuIGRlIHTDqWzDqWNoYXJnZW1lbnQgKGhyZWYpIGR1IGZpY2hpZXIuXG4gICAqIFNpIGNldHRlIHByb3ByacOpdMOpIG4nZXN0IHBhcyByZW5zZWlnbsOpZSwgdW4gYm91dG9uIHJlbXBsYWNlIGwnYW5jcmUgKHZvaXIgcm91dGUpXG4gICAqL1xuICBASW5wdXQoKSBsaW5rOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIEZvcm1hdCBkdSBmaWNoaWVyIC0gb2JsaWdhdG9pcmUuIENmLiBEc2ZyTWltZVR5cGUgKi9cbiAgQElucHV0KCkgbWltZVR5cGU6IHN0cmluZztcblxuICAvKiogTm9tIGR1IGZpY2hlciAtIG9ibGlnYXRvaXJlLiAqL1xuICBASW5wdXQoKSBmaWxlTmFtZTogc3RyaW5nO1xuXG4gIC8qKiBQb2lkcyBkdSBmaWNoaWVyIGVuIG9jdGV0cy4gT2JsaWdhdG9pcmUgZGFucyBsZSBEU0RGUiBtYWlzIHBldXQgw6p0cmUgcmVuc2VpZ27DqSB1bHTDqXJpZXVyZW1lbnQuICovXG4gIEBJbnB1dCgpIHNpemVCeXRlczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBPYmxpZ2F0b2lyZSBzaSBsZSBkb2N1bWVudCBuJ2VzdCBwYXMgZHUgbcOqbWUgbGFuZ2FnZSBxdWUgbGEgcGFnZSBjb3VyYW50ZS5cbiAgICpcbiAgICogRXggOiBsYW5nQ29kZT1cImVuXCIuXG4gICAqL1xuICBASW5wdXQoKSBsYW5nQ29kZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBQZXJtZXQgZGUgYmFzY3VsZXIgbGEgcHLDqXNlbnRhdGlvbiBlbiBDYXJkLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBMZSBtb2RlICdibG9jaycgZXN0IGTDqXByw6ljacOpLCB1dGlsaXNlciBgQ2FyZCNkb3dubG9hZGAgw6AgbGEgcGxhY2VcbiAgICovXG4gIEBJbnB1dCgpIHZhcmlhbnQ6IERzZnJEb3dubG9hZFZhcmlhbnQgPSBEc2ZyRG93bmxvYWRWYXJpYW50Q29uc3QuTElOSztcblxuICAvKipcbiAgICogRGVzY3JpcHRpb24gZHUgZmljaGllciAodW5pcXVlbWVudCBlbiBtb2RlIGJsb2NrKS5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgTGUgbW9kZSBibG9jayBlc3QgZMOpcHLDqWNpw6lcbiAgICovXG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGlxdWUgcXVlIGxlcyBtw6l0YWRvbm7DqWVzIGR1IGZpY2hpZXIgc2Vyb250IHBvc2l0aW9ubsOpZXMgYXV0b21hdGlxdWVtZW50IHBhciBsZSBzY3JpcHQgRFNGUi4gTGVzIHByb3ByacOpdMOpc1xuICAgKiBgbWltZVR5cGVgLCBgc2l6ZUJ5dGVzYCwgYGxhbmdDb2RlYCBzb250IGFsb3JzIGlnbm9yw6llcy4gU2kgbGEgcHJvcHJpw6l0w6kgZXN0IHBvc2l0aW9ubsOpZSDDoCBmYWxzZSBhbG9ycyBjZSBzb250XG4gICAqIGxlcyB2YWxldXJzIGRlcyBwcm9wcmnDqXTDqXMgYG1pbWVUeXBlYCwgYHNpemVCeXRlc2AsIGBsYW5nQ29kZWAgcXVpIHNlcm9udCB1dGxpc8OpZXMuXG4gICAqL1xuICBASW5wdXQoKSBhc3Nlc3NGaWxlID0gdHJ1ZTtcblxuICAvKipcbiAgICogRXF1aXZhbGVudCDDoCBsJ2F0dHJpYnV0IGh0bWwgbmF0aWYgJ2Rvd25sb2FkJy5cbiAgICogU2kgPT0gJ3RydWUnLCB0w6lsw6ljaGFyZ2UgZGlyZWN0ZW1lbnQgbGUgZmljaGllciBzYW5zIGwnb3V2cmlyLCAnZmFsc2UnIHBhciBkw6lmYXV0LlxuICAgKiBQZXV0IHByZW5kcmUgbGUgbm9tIGR1IGZpY2hpZXIgw6AgdMOpbMOpY2hhcmdlciBzaSBvbiBzb3VoYWl0ZSByZW5vbW1lciBjZSBmaWNoaWVyLlxuICAgKi9cbiAgQElucHV0KCkgZGlyZWN0RG93bmxvYWQ6IGJvb2xlYW4gfCBzdHJpbmcgfCB1bmRlZmluZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogU2kgY2V0dGUgcHJvcHJpw6l0w6kgZXN0IHJlbnNlaWduw6llLCB1biBib3V0b24gcmVtcGxhY2UgbCdhbmNyZSBldCBsJ8OpdsOobmVtZW50IGxpbmtTZWxlY3QgZG9pdCDDqnRyZSBpbnRlcmNlcHTDqS5cbiAgICogU29uIGFjdGl2YXRpb24gZXN0IGV4Y2x1c2l2ZSBhdmVjIGxpbmsgZXQgcHJpbWUgc3VyIGNlIGRlcm5pZXIuXG4gICAqIEF0dGVudGlvbiwgZW4gbW9kZSAncm91dGUnIGxlcyBtw6l0YWRvbm7DqWVzIGR1IGZpY2hpZXIgw6AgdMOpbMOpY2hhcmdlciBuZSBwZXV2ZW50IMOqdHJlIGNvbm51ZXMgYSBwcmlvcmksIHZvdXNcbiAgICogZGV2ZXogZG9uYyBvYmxpZ2F0b2lyZW1lbnQgcmVuc2VpZ25lciBsZXMgcHJvcHJpw6l0w6lzIGBtaW1lVHlwZWAsIGBzaXplQnl0ZXNgIGV0IGxhbmdDb2RlYCBjYXIgbGEgcHJvcHJpw6l0w6lcbiAgICogYGFzc2Vzc0ZpbGVgIHNlcmEgaWdub3LDqWUuXG4gICAqL1xuICBASW5wdXQoKSByb3V0ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBBdHRyaWJ1dCB0YXJnZXQgZHUgbGllbi5cbiAgICovXG4gIEBJbnB1dCgpIGxpbmtUYXJnZXQ6IERzZnJMaW5rVGFyZ2V0IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBQcm9wYWdlIGxhIHZhbGV1ciBkZSAncm91dGUnIGxvcnMgZHUgY2xpYyBzdXIgbGUgbGllbi5cbiAgICovXG4gIEBPdXRwdXQoKSBkb3dubG9hZFNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8qKiBjZi4gYWNjZXNzZXVycy4gKi9cbiAgcHJpdmF0ZSBfc2l6ZVVuaXQ6IERzZnJGaWxlU2l6ZVVuaXQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBsYW5nU2VydmljZTogTGFuZ1NlcnZpY2UsXG4gICAgLyoqIEBpbnRlcm5hbCAqLyBwdWJsaWMgaTE4bjogRHNmckkxOG5TZXJ2aWNlLFxuICApIHt9XG5cbiAgZ2V0IGN1cnJlbnRMYW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubGFuZ1NlcnZpY2UubGFuZztcbiAgfVxuXG4gIGdldCBpdGVtTGluaygpOiBEc2ZyTGluayB7XG4gICAgbGV0IGxhYmVsID0gdGhpcy5sYWJlbCA/IHRoaXMubGFiZWwgOiBgJHt0aGlzLmkxOG4udCgnY29tbW9ucy5kb3dubG9hZCcpfSAke3RoaXMuZmlsZU5hbWV9YDtcbiAgICBsYWJlbCArPSBgPHNwYW4gY2xhc3M9XCJmci1saW5rX19kZXRhaWxcIj4ke3RoaXMuZGV0YWlsfTwvc3Bhbj5gO1xuXG4gICAgY29uc3QgaXRlbUxpbms6IERzZnJMaW5rID0geyBsYWJlbDogbGFiZWwsIGFyaWFMYWJlbDogdGhpcy5hcmlhTGFiZWwgPz8gJycgfTtcbiAgICBpZiAodGhpcy5saW5rKSB7XG4gICAgICBpdGVtTGluay5saW5rID0gdGhpcy5saW5rO1xuICAgIH0gZWxzZSBpZiAodGhpcy5yb3V0ZSkge1xuICAgICAgaXRlbUxpbmsucm91dGUgPSB0aGlzLnJvdXRlO1xuICAgIH1cblxuICAgIHJldHVybiBpdGVtTGluaztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRvdXJuZSBsJ2FmZmljaGFnZSBkZXMgZMOpdGFpbHMgc2kgYXNzZXRGaWxlIGVzdCBwb3NpdGlvbm7DqSBldCBxdWUgbCd1dGlsaXNhdGV1ciBuJ2VzdCBwYXMgZW4gbW9kZSBhY3Rpb25cbiAgICogKGFjdGl2YXRpb24gdmlhIGwnaW5wdXQgcm91dGUpLCBzaW5vbiByZXRvdXJuZSAnJyBjZSBxdWkgYXVyYSBwb3VyIGVmZmV0IGRlIGxhaXNzZXIgY2FsY3VsZXIgbCdhZmZpY2hhZ2UgcGFyXG4gICAqIGxlIHNjcmlwdCBEU0ZSLlxuICAgKi9cbiAgZ2V0IGRldGFpbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFzc2Vzc0ZpbGUgJiYgIXRoaXMucm91dGUgPyAnJyA6IGRvd25sb2FkRGV0YWlsKHRoaXMubWltZVR5cGUsIHRoaXMuc2l6ZUJ5dGVzLCB0aGlzLnNpemVVbml0KTtcbiAgfVxuXG4gIGdldCBzaXplVW5pdCgpOiBEc2ZyRmlsZVNpemVVbml0IHtcbiAgICByZXR1cm4gdGhpcy5fc2l6ZVVuaXQgPyB0aGlzLl9zaXplVW5pdCA6IHRoaXMubGFuZ1NlcnZpY2UubGFuZyA9PT0gJ2ZyJyA/ICdvY3RldHMnIDogJ2J5dGVzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJtZXQgZCdhZmZpY2hlciBsYSB0YWlsbGUgc29pdCBlbiBieXRlcyAoS0IsIE1CLCAuLi4pIHNvaXQgZW4gb2N0ZXRzIChLbywgTW8sIC4uLikuIFBhciBkw6lmYXV0LCBsJ3VuaXTDqSBlc3RcbiAgICogZW4gb2N0ZXRzIGxvcnNxdWUgbGEgbGFuZ3VlIGNvdXJhbnRlIGVzdCAnZnInLCAnYnl0ZXMnIGRhbnMgbGVzIGF1dHJlcyBjYXMuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgc2l6ZVVuaXQodmFsdWU6IERzZnJGaWxlU2l6ZVVuaXQpIHtcbiAgICB0aGlzLl9zaXplVW5pdCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBvbkxpbmtTZWxlY3QoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucm91dGUpIHtcbiAgICAgIHRoaXMuZG93bmxvYWRTZWxlY3QuZW1pdCh0aGlzLnJvdXRlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0b3VybmUgdnJhaSBzaSBvbiBhZmZpY2hlIHVuIGJvdXRvbiDDoCBsYSBwbGFjZSBkJ3VuZSBhbmNyZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBoYXNCdXR0b25NYXJrdXAoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5yb3V0ZSB8fCAhdGhpcy5saW5rO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpICd0cnVlJyBvdSBhdmVjIHVuIG5vbSBkZSBmaWNoaWVyLCB0w6lsw6ljaGFyZ2UgZGlyZWN0ZW1lbnQgbGUgZmljaGllciBzYW5zIGwnb3V2cmlyLiBGYWxzZSBwYXIgZMOpZmF1dC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBpc0RpcmVjdERvd25sb2FkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZGlyZWN0RG93bmxvYWQ7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldE5ld0ZpbGVOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLmRpcmVjdERvd25sb2FkID09PSAnc3RyaW5nJyA/IHRoaXMuZGlyZWN0RG93bmxvYWQgOiAnJztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgaXNCbG9ja01vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFyaWFudCA9PT0gRHNmckRvd25sb2FkVmFyaWFudENvbnN0LkJMT0NLO1xuICB9XG59XG4iLCJAaWYgKCFpc0Jsb2NrTW9kZSgpKSB7XG4gIDxlZHUtbGluay1kb3dubG9hZFxuICAgIFtpc0J1dHRvbl09XCJoYXNCdXR0b25NYXJrdXAoKVwiXG4gICAgW2l0ZW1dPVwiaXRlbUxpbmtcIlxuICAgIFtkb3dubG9hZERpcmVjdF09XCJkaXJlY3REb3dubG9hZCA/PyBmYWxzZVwiXG4gICAgW2Rvd25sb2FkQXNzZXNzRmlsZV09XCJhc3Nlc3NGaWxlXCJcbiAgICBbbGlua1RhcmdldF09XCJsaW5rVGFyZ2V0XCJcbiAgICBjdXN0b21DbGFzcz1cImZyLWxpbmsgZnItbGluay0tZG93bmxvYWRcIlxuICAgIFtsYW5nQ29kZV09XCJsYW5nQ29kZSA/PyAnJ1wiXG4gICAgKGxpbmtTZWxlY3QpPVwib25MaW5rU2VsZWN0KClcIj5cbiAgPC9lZHUtbGluay1kb3dubG9hZD5cbn0gQGVsc2Uge1xuICA8IS0tIFBvdXIgcsOpdHJvY29tcGF0aWJpbGl0w6kgYXZlYyBtb2RlIFwiYmxvY2tcIiAoZMOpcHLDqWNpw6kpIC0tPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJmci1kb3dubG9hZFwiXG4gICAgW25nQ2xhc3NdPVwie1xuICAgICAgJ2ZyLWVubGFyZ2UtbGluayBmci1kb3dubG9hZC0tY2FyZCc6IGlzQmxvY2tNb2RlKCksXG4gICAgICAnZWR1LWNhcmRXaXRoQnV0dG9uJzogaGFzQnV0dG9uTWFya3VwKClcbiAgICB9XCJcbiAgICBbYXR0ci5sYW5nXT1cImN1cnJlbnRMYW5nIHx8IG51bGxcIj5cbiAgICA8cD5cbiAgICAgIDwhLS0gVMOpbMOpY2hhcmdlbWVudCBhdmVjIHVuZSBhbmNyZSAtLT5cbiAgICAgIEBpZiAoIWhhc0J1dHRvbk1hcmt1cCgpKSB7XG4gICAgICAgIDxhXG4gICAgICAgICAgW2hyZWZdPVwibGlua1wiXG4gICAgICAgICAgW2F0dHIuZG93bmxvYWRdPVwiIWlzRGlyZWN0RG93bmxvYWQoKSA/IG51bGwgOiBnZXROZXdGaWxlTmFtZSgpXCJcbiAgICAgICAgICBbYXR0ci5ocmVmbGFuZ109XCJsYW5nQ29kZSA/IGxhbmdDb2RlIDogbnVsbFwiXG4gICAgICAgICAgY2xhc3M9XCJmci1kb3dubG9hZF9fbGlua1wiXG4gICAgICAgICAgW2F0dHIuZGF0YS1mci1hc3Nlc3MtZmlsZV09XCJhc3Nlc3NGaWxlICYmIHNpemVCeXRlcyA/IHNpemVVbml0IDogbnVsbFwiPlxuICAgICAgICAgIHt7ICdjb21tb25zLmRvd25sb2FkJyB8IGRzZnJJMThuIH19IHt7IGZpbGVOYW1lIH19XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmci1kb3dubG9hZF9fZGV0YWlsXCI+e3sgZGV0YWlsIH19PC9zcGFuPlxuICAgICAgICA8L2E+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPCEtLSBUw6lsw6ljaGFyZ2VtZW50IGF2ZWMgdW4gYm91dG9uIChzYW5zIG3DqXRhZGF0YSkgLS0+XG4gICAgICAgIDxidXR0b24gKGxpbmtTZWxlY3QpPVwib25MaW5rU2VsZWN0KClcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJmci1kb3dubG9hZF9fbGlua1wiPlxuICAgICAgICAgIHt7ICdjb21tb25zLmRvd25sb2FkJyB8IGRzZnJJMThuIH19IHt7IGZpbGVOYW1lIH19XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmci1kb3dubG9hZF9fZGV0YWlsXCI+e3sgZGV0YWlsIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cbiAgICA8L3A+XG4gICAgQGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgPHAgY2xhc3M9XCJmci1kb3dubG9hZF9fZGVzY1wiPnt7IGRlc2NyaXB0aW9uIH19PC9wPlxuICAgIH1cbiAgPC9kaXY+XG59XG4iXX0=