@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).
115 lines • 16.9 kB
JavaScript
import { CommonModule } from '@angular/common';
import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';
import { RouterModule } from '@angular/router';
import { DsfrPositionConst } from '../../models';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
/** Ce composant correspond au lien de téléchargement utilisé par card, tile et download */
export class LinkDownloadComponent {
constructor() {
/**
* Active la version download avec l'attribut download.
* Permet l'utilisation de `downloadAssessFile` et `langCode`
*/
this.downloadDirect = false;
/** Option de détail de téléchargement renseigné automatiquement.
* Si la valeur est 'bytes', l'unité sera en Bytes
*/
this.downloadAssessFile = false;
/**
* Langue courante. hreflang ne sera indiquée que différent de la langue courante.
*/
this.langCode = 'fr';
/** Remplacer le lien par un markup de bouton */
this.isButton = false;
/**
* Propage la valeur de 'route' ou de 'link' (selon le cas) lors du click sur le lien.
*/
this.linkSelect = new EventEmitter();
}
get disabled() {
return !(this.item.route || this.item.routerLink || this.item.link);
}
get item() {
return this._item;
}
/** Item représentant un lien `<a>` avec ou sans `routerLink`. */
set item(item) {
if (item.label) {
this._item = { ...item, label: item.label };
}
else {
this._item = item;
}
if (this.item)
this.item.customClass = this.getLinkClasses();
}
/**
* Si === 'true', télécharge directement le fichier sans l'ouvrir, 'false' par défaut.
* @internal
*/
isDirectDownload() {
return this.downloadDirect !== false;
}
/** @internal */
getHref() {
if (this.item.route)
return this.item.route;
if (this.item.link)
return this.item.link;
return undefined;
}
/** @internal */
getNewFileName() {
return typeof this.downloadDirect === 'string' ? this.downloadDirect : '';
}
onLinkSelect(event) {
if (this.item.route && !this.item.routerLink) {
event.preventDefault();
this.linkSelect.emit(this.item.route);
}
else if (this.item.link) {
this.linkSelect.emit(this.item.link);
}
}
/** @internal */
getLinkTarget(item) {
return item.target ?? item.linkTarget;
}
/** @internal */
getLinkClasses() {
const classes = [];
classes.push(!this.customClass ? 'fr-link' : this.customClass);
if (this._item.icon) {
classes.push(this._item.icon);
// Dans le header, les liens utilisent la classe fr-btn, pour être cohérent, on va utiliser fr-btn--icon-left et right
const likeButton = this.customClass?.search('fr-btn') >= 0;
const prefixPos = likeButton ? 'fr-btn--icon-' : 'fr-link--icon-';
classes.push(this._item.iconPosition === DsfrPositionConst.RIGHT ? prefixPos + 'right' : prefixPos + 'left');
}
return classes.join(' ');
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LinkDownloadComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LinkDownloadComponent, isStandalone: true, selector: "edu-link-download", inputs: { customClass: "customClass", downloadDirect: "downloadDirect", downloadAssessFile: "downloadAssessFile", langCode: "langCode", linkTarget: "linkTarget", isButton: "isButton", item: "item" }, outputs: { linkSelect: "linkSelect" }, ngImport: i0, template: "<!-- Lien de t\u00E9l\u00E9chargement-->\n@if (!isButton) {\n <a\n [ngClass]=\"customClass\"\n [attr.aria-controls]=\"item.ariaControls || null\"\n [attr.aria-disabled]=\"disabled || null\"\n [attr.aria-label]=\"item.ariaLabel || null\"\n [attr.href]=\"getHref() || null\"\n [attr.download]=\"!isDirectDownload() ? null : getNewFileName()\"\n [attr.data-fr-assess-file]=\"downloadAssessFile || null\"\n [attr.hreflang]=\"langCode || null\"\n [attr.target]=\"linkTarget || null\"\n (click)=\"onLinkSelect($event)\"\n [innerHTML]=\"item.label\">\n </a>\n} @else {\n <button\n type=\"button\"\n (click)=\"onLinkSelect($event)\"\n [disabled]=\"disabled\"\n [ngClass]=\"customClass\"\n [innerHTML]=\"item.label\"></button>\n}\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: RouterModule }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LinkDownloadComponent, decorators: [{
type: Component,
args: [{ selector: 'edu-link-download', encapsulation: ViewEncapsulation.None, standalone: true, imports: [CommonModule, RouterModule], template: "<!-- Lien de t\u00E9l\u00E9chargement-->\n@if (!isButton) {\n <a\n [ngClass]=\"customClass\"\n [attr.aria-controls]=\"item.ariaControls || null\"\n [attr.aria-disabled]=\"disabled || null\"\n [attr.aria-label]=\"item.ariaLabel || null\"\n [attr.href]=\"getHref() || null\"\n [attr.download]=\"!isDirectDownload() ? null : getNewFileName()\"\n [attr.data-fr-assess-file]=\"downloadAssessFile || null\"\n [attr.hreflang]=\"langCode || null\"\n [attr.target]=\"linkTarget || null\"\n (click)=\"onLinkSelect($event)\"\n [innerHTML]=\"item.label\">\n </a>\n} @else {\n <button\n type=\"button\"\n (click)=\"onLinkSelect($event)\"\n [disabled]=\"disabled\"\n [ngClass]=\"customClass\"\n [innerHTML]=\"item.label\"></button>\n}\n" }]
}], propDecorators: { customClass: [{
type: Input
}], downloadDirect: [{
type: Input
}], downloadAssessFile: [{
type: Input
}], langCode: [{
type: Input
}], linkTarget: [{
type: Input
}], isButton: [{
type: Input
}], linkSelect: [{
type: Output
}], item: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluay1kb3dubG9hZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZHNmci1jb21wb25lbnRzL3NyYy9saWIvc2hhcmVkL2NvbXBvbmVudHMvbGluay1kb3dubG9hZC9saW5rLWRvd25sb2FkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWNvbXBvbmVudHMvc3JjL2xpYi9zaGFyZWQvY29tcG9uZW50cy9saW5rLWRvd25sb2FkL2xpbmstZG93bmxvYWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBNEIsaUJBQWlCLEVBQUUsTUFBTSxjQUFjLENBQUM7OztBQVMzRSwyRkFBMkY7QUFDM0YsTUFBTSxPQUFPLHFCQUFxQjtJQVJsQztRQVlFOzs7V0FHRztRQUNNLG1CQUFjLEdBQXFCLEtBQUssQ0FBQztRQUVsRDs7V0FFRztRQUNNLHVCQUFrQixHQUFzQixLQUFLLENBQUM7UUFFdkQ7O1dBRUc7UUFDTSxhQUFRLEdBQUcsSUFBSSxDQUFDO1FBU3pCLGdEQUFnRDtRQUN2QyxhQUFRLEdBQVksS0FBSyxDQUFDO1FBRW5DOztXQUVHO1FBQ08sZUFBVSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7S0F1RW5EO0lBbkVDLElBQUksUUFBUTtRQUNWLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsaUVBQWlFO0lBQ2pFLElBQWEsSUFBSSxDQUFDLElBQWM7UUFDOUIsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM5QyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxJQUFJO1lBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQy9ELENBQUM7SUFFRDs7O09BR0c7SUFDSCxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxjQUFjLEtBQUssS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsT0FBTztRQUNMLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUM1QyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDMUMsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixjQUFjO1FBQ1osT0FBTyxPQUFPLElBQUksQ0FBQyxjQUFjLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDNUUsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFZO1FBQ3ZCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzdDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QyxDQUFDO0lBQ0gsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixhQUFhLENBQUMsSUFBYztRQUMxQixPQUFPLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN4QyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IsY0FBYztRQUNwQixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbkIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRS9ELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNwQixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUIsc0hBQXNIO1lBQ3RILE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzRCxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUM7WUFDbEUsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksS0FBSyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsQ0FBQztRQUMvRyxDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLENBQUM7K0dBdkdVLHFCQUFxQjttR0FBckIscUJBQXFCLDRUQ2JsQyx1d0JBdUJBLDJDRGJZLFlBQVksNEhBQUUsWUFBWTs7NEZBR3pCLHFCQUFxQjtrQkFSakMsU0FBUzsrQkFDRSxtQkFBbUIsaUJBRWQsaUJBQWlCLENBQUMsSUFBSSxjQUN6QixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDOzhCQUs1QixXQUFXO3NCQUFuQixLQUFLO2dCQU1HLGNBQWM7c0JBQXRCLEtBQUs7Z0JBS0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUtHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBT0csVUFBVTtzQkFBbEIsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQUtJLFVBQVU7c0JBQW5CLE1BQU07Z0JBYU0sSUFBSTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBEc2ZyTGluaywgRHNmckxpbmtUYXJnZXQsIERzZnJQb3NpdGlvbkNvbnN0IH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZWR1LWxpbmstZG93bmxvYWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vbGluay1kb3dubG9hZC5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFJvdXRlck1vZHVsZV0sXG59KVxuLyoqIENlIGNvbXBvc2FudCBjb3JyZXNwb25kIGF1IGxpZW4gZGUgdMOpbMOpY2hhcmdlbWVudCB1dGlsaXPDqSBwYXIgY2FyZCwgdGlsZSBldCBkb3dubG9hZCAqL1xuZXhwb3J0IGNsYXNzIExpbmtEb3dubG9hZENvbXBvbmVudCB7XG4gIC8qKiBDbGFzc2UgcGVyc29ubmFsaXPDqWUgZHUgY29tcG9zYW50LCBwYXIgZXhlbXBsZSwgYGZyLWJ0bmAsIGBmci1uYXZfX2xpbmtgLCAuLi4gKi9cbiAgQElucHV0KCkgY3VzdG9tQ2xhc3M6IHN0cmluZztcblxuICAvKipcbiAgICogQWN0aXZlIGxhIHZlcnNpb24gZG93bmxvYWQgYXZlYyBsJ2F0dHJpYnV0IGRvd25sb2FkLlxuICAgKiBQZXJtZXQgbCd1dGlsaXNhdGlvbiBkZSBgZG93bmxvYWRBc3Nlc3NGaWxlYCBldCAgYGxhbmdDb2RlYFxuICAgKi9cbiAgQElucHV0KCkgZG93bmxvYWREaXJlY3Q6IGJvb2xlYW4gfCBzdHJpbmcgPSBmYWxzZTtcblxuICAvKiogT3B0aW9uIGRlIGTDqXRhaWwgZGUgdMOpbMOpY2hhcmdlbWVudCByZW5zZWlnbsOpIGF1dG9tYXRpcXVlbWVudC5cbiAgICogU2kgbGEgdmFsZXVyIGVzdCAnYnl0ZXMnLCBsJ3VuaXTDqSBzZXJhIGVuIEJ5dGVzXG4gICAqL1xuICBASW5wdXQoKSBkb3dubG9hZEFzc2Vzc0ZpbGU6IGJvb2xlYW4gfCAnYnl0ZXMnID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIExhbmd1ZSBjb3VyYW50ZS4gaHJlZmxhbmcgbmUgc2VyYSBpbmRpcXXDqWUgcXVlIGRpZmbDqXJlbnQgZGUgbGEgbGFuZ3VlIGNvdXJhbnRlLlxuICAgKi9cbiAgQElucHV0KCkgbGFuZ0NvZGUgPSAnZnInO1xuXG4gIC8qKlxuICAgKiBBdHRyaWJ1dCB0YXJnZXQgZHUgbGllbi5cbiAgICpcbiAgICogQHNpbmNlIDEuMTJcbiAgICovXG4gIEBJbnB1dCgpIGxpbmtUYXJnZXQ6IERzZnJMaW5rVGFyZ2V0IHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBSZW1wbGFjZXIgbGUgbGllbiBwYXIgdW4gbWFya3VwIGRlIGJvdXRvbiAqL1xuICBASW5wdXQoKSBpc0J1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBQcm9wYWdlIGxhIHZhbGV1ciBkZSAncm91dGUnIG91IGRlICdsaW5rJyAoc2Vsb24gbGUgY2FzKSBsb3JzIGR1IGNsaWNrIHN1ciBsZSBsaWVuLlxuICAgKi9cbiAgQE91dHB1dCgpIGxpbmtTZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBwcml2YXRlIF9pdGVtOiBEc2ZyTGluaztcblxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEodGhpcy5pdGVtLnJvdXRlIHx8IHRoaXMuaXRlbS5yb3V0ZXJMaW5rIHx8IHRoaXMuaXRlbS5saW5rKTtcbiAgfVxuXG4gIGdldCBpdGVtKCk6IERzZnJMaW5rIHtcbiAgICByZXR1cm4gdGhpcy5faXRlbTtcbiAgfVxuXG4gIC8qKiBJdGVtIHJlcHLDqXNlbnRhbnQgdW4gbGllbiBgPGE+YCBhdmVjIG91IHNhbnMgYHJvdXRlckxpbmtgLiAqL1xuICBASW5wdXQoKSBzZXQgaXRlbShpdGVtOiBEc2ZyTGluaykge1xuICAgIGlmIChpdGVtLmxhYmVsKSB7XG4gICAgICB0aGlzLl9pdGVtID0geyAuLi5pdGVtLCBsYWJlbDogaXRlbS5sYWJlbCB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9pdGVtID0gaXRlbTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXRlbSkgdGhpcy5pdGVtLmN1c3RvbUNsYXNzID0gdGhpcy5nZXRMaW5rQ2xhc3NlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpID09PSAndHJ1ZScsIHTDqWzDqWNoYXJnZSBkaXJlY3RlbWVudCBsZSBmaWNoaWVyIHNhbnMgbCdvdXZyaXIsICdmYWxzZScgcGFyIGTDqWZhdXQuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgaXNEaXJlY3REb3dubG9hZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kb3dubG9hZERpcmVjdCAhPT0gZmFsc2U7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldEhyZWYoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5pdGVtLnJvdXRlKSByZXR1cm4gdGhpcy5pdGVtLnJvdXRlO1xuICAgIGlmICh0aGlzLml0ZW0ubGluaykgcmV0dXJuIHRoaXMuaXRlbS5saW5rO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldE5ld0ZpbGVOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLmRvd25sb2FkRGlyZWN0ID09PSAnc3RyaW5nJyA/IHRoaXMuZG93bmxvYWREaXJlY3QgOiAnJztcbiAgfVxuXG4gIG9uTGlua1NlbGVjdChldmVudDogRXZlbnQpIHtcbiAgICBpZiAodGhpcy5pdGVtLnJvdXRlICYmICF0aGlzLml0ZW0ucm91dGVyTGluaykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMubGlua1NlbGVjdC5lbWl0KHRoaXMuaXRlbS5yb3V0ZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLml0ZW0ubGluaykge1xuICAgICAgdGhpcy5saW5rU2VsZWN0LmVtaXQodGhpcy5pdGVtLmxpbmspO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0TGlua1RhcmdldChpdGVtOiBEc2ZyTGluayk6IERzZnJMaW5rVGFyZ2V0IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gaXRlbS50YXJnZXQgPz8gaXRlbS5saW5rVGFyZ2V0O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIGdldExpbmtDbGFzc2VzKCk6IHN0cmluZyB7XG4gICAgY29uc3QgY2xhc3NlcyA9IFtdO1xuICAgIGNsYXNzZXMucHVzaCghdGhpcy5jdXN0b21DbGFzcyA/ICdmci1saW5rJyA6IHRoaXMuY3VzdG9tQ2xhc3MpO1xuXG4gICAgaWYgKHRoaXMuX2l0ZW0uaWNvbikge1xuICAgICAgY2xhc3Nlcy5wdXNoKHRoaXMuX2l0ZW0uaWNvbik7XG4gICAgICAvLyBEYW5zIGxlIGhlYWRlciwgbGVzIGxpZW5zIHV0aWxpc2VudCBsYSBjbGFzc2UgZnItYnRuLCBwb3VyIMOqdHJlIGNvaMOpcmVudCwgb24gdmEgdXRpbGlzZXIgZnItYnRuLS1pY29uLWxlZnQgZXQgcmlnaHRcbiAgICAgIGNvbnN0IGxpa2VCdXR0b24gPSB0aGlzLmN1c3RvbUNsYXNzPy5zZWFyY2goJ2ZyLWJ0bicpID49IDA7XG4gICAgICBjb25zdCBwcmVmaXhQb3MgPSBsaWtlQnV0dG9uID8gJ2ZyLWJ0bi0taWNvbi0nIDogJ2ZyLWxpbmstLWljb24tJztcbiAgICAgIGNsYXNzZXMucHVzaCh0aGlzLl9pdGVtLmljb25Qb3NpdGlvbiA9PT0gRHNmclBvc2l0aW9uQ29uc3QuUklHSFQgPyBwcmVmaXhQb3MgKyAncmlnaHQnIDogcHJlZml4UG9zICsgJ2xlZnQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2xhc3Nlcy5qb2luKCcgJyk7XG4gIH1cbn1cbiIsIjwhLS0gTGllbiBkZSB0w6lsw6ljaGFyZ2VtZW50LS0+XG5AaWYgKCFpc0J1dHRvbikge1xuICA8YVxuICAgIFtuZ0NsYXNzXT1cImN1c3RvbUNsYXNzXCJcbiAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cIml0ZW0uYXJpYUNvbnRyb2xzIHx8IG51bGxcIlxuICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgbnVsbFwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbF09XCJpdGVtLmFyaWFMYWJlbCB8fCBudWxsXCJcbiAgICBbYXR0ci5ocmVmXT1cImdldEhyZWYoKSB8fCBudWxsXCJcbiAgICBbYXR0ci5kb3dubG9hZF09XCIhaXNEaXJlY3REb3dubG9hZCgpID8gbnVsbCA6IGdldE5ld0ZpbGVOYW1lKClcIlxuICAgIFthdHRyLmRhdGEtZnItYXNzZXNzLWZpbGVdPVwiZG93bmxvYWRBc3Nlc3NGaWxlIHx8IG51bGxcIlxuICAgIFthdHRyLmhyZWZsYW5nXT1cImxhbmdDb2RlIHx8IG51bGxcIlxuICAgIFthdHRyLnRhcmdldF09XCJsaW5rVGFyZ2V0IHx8IG51bGxcIlxuICAgIChjbGljayk9XCJvbkxpbmtTZWxlY3QoJGV2ZW50KVwiXG4gICAgW2lubmVySFRNTF09XCJpdGVtLmxhYmVsXCI+XG4gIDwvYT5cbn0gQGVsc2Uge1xuICA8YnV0dG9uXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgKGNsaWNrKT1cIm9uTGlua1NlbGVjdCgkZXZlbnQpXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgIFtuZ0NsYXNzXT1cImN1c3RvbUNsYXNzXCJcbiAgICBbaW5uZXJIVE1MXT1cIml0ZW0ubGFiZWxcIj48L2J1dHRvbj5cbn1cbiJdfQ==