@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).
168 lines • 24.5 kB
JavaScript
import { CommonModule } from '@angular/common';
import { afterNextRender, Component, contentChildren, effect, ElementRef, Input, ViewEncapsulation, } from '@angular/core';
import { DomUtils, DsfrPositionConst, DsfrSizeConst } from '../../shared';
import { DsfrButtonComponent } from '../button';
import { DsfrAlignConst, DsfrButtonsGroupMarkupConst, DsfrInlineConst, } from './buttons-group.model';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class DsfrButtonsGroupComponent {
constructor(_elementRef) {
/* fixme : angular17 + angular 18 sera appelé a la fois dans effect et dans afterNextRender a l'init
mais seulement dans le afterNextRender() en angular 19. Voir pour remplacer par afterRenderEffect en 19 */
this._elementRef = _elementRef;
/**
* Permet de basculer la disposition des boutons en mode horizontal.
* En mode vertical, mode par défaut, les boutons prennent 100% de la largeur du conteneur.
*/
this.inline = DsfrInlineConst.NEVER;
/**
* Permet de mettre automatiquement tous les boutons d’un groupe à la même largeur.
* Cela permet une uniformité des boutons en mode horizontal.
* (en mode vertical, les boutons prennent 100% de la largeur du conteneur)
* Cette option peut être combinée avec la propriété d'alignement.
*/
this.equisized = false;
/**
* Taille des boutons du groupe.
*/
this.buttonGroupSize = DsfrSizeConst.MD;
/**
* Type de balise HTML pour la liste du groupe de boutons.
*
* 📌 Cette propriété ne doit pas être modifiée post-initialisation (i.e. dynamiquement).
*/
/*
* Note technique : Le fait de modifier le DOM pour encapsuler les boutons dans des balises <li> nous empêche
* aujourd'hui de supporter la modification dynamique du type de balisage. Passer d'un conteneur <ul> à <div> ne
* pose pas de problème mais l'inverse produit une structure HTML non valide - les <li> positionnés par un appel à
* la méthode `surroundButtonsWithLi` effectué au niveau du setter de `groupMarkup` se verrait effacés par la passe
* de rendu Angular qui remplace la <div> par un <ul>. Il serait possible d'invoquer la méthode `surroundButtonsWithLi`
* en utilisant un `requestAnimationFrame` mais cette approche nous semble être trop hasardeuse au regard du cas
* d'usage (changer dynamiquement la strucure HTML d'un groupe de boutons) qui ne semble pas pertinent.
*/
this.groupMarkup = DsfrButtonsGroupMarkupConst.UL;
this.DsfrButtonsGroupMarkup = DsfrButtonsGroupMarkupConst;
this.buttonsElements = contentChildren(DsfrButtonComponent, { read: ElementRef });
this.buttons = contentChildren(DsfrButtonComponent);
effect(() => {
this.surroundButtonsWithLi();
});
afterNextRender(() => {
this.surroundButtonsWithLi();
});
}
/**
* Taille des boutons du groupe.
*
* @deprecated since(1.15.0) utiliser 'buttonGroupSize' à la place
*/
get size() {
return this.buttonGroupSize;
}
get iconPosition() {
return this._iconPosition;
}
/**
* Taille des boutons du groupe.
*
* @deprecated since(1.15.0) utiliser 'buttonGroupSize' à la place
*/
set size(value) {
this.buttonGroupSize = value;
}
/**
* Positionnement (gauche ou droite) au niveau du groupe des icônes dans les boutons qui
* contiennent à la fois une icône et un label.
*/
set iconPosition(value) {
this._iconPosition = value;
this.updateButtonsIconPosition();
}
/**
* Cette méthode calcule les styles du composant en évitant les magic strings.
*/
getClasses() {
let classes = [];
// Inline class
switch (this.inline) {
case 'always':
classes.push('fr-btns-group--inline');
break;
case 'LG':
classes.push('fr-btns-group--inline-lg');
break;
case 'MD':
classes.push('fr-btns-group--inline-md');
break;
case 'SM':
classes.push('fr-btns-group--inline-sm');
break;
default:
break;
}
// Alignment class
switch (this.alignment) {
case DsfrAlignConst.CENTER:
classes.push('fr-btns-group--center');
break;
case DsfrAlignConst.BETWEEN:
classes.push('fr-btns-group--between');
break;
case DsfrAlignConst.RIGHT:
classes.push('fr-btns-group--right');
break;
case DsfrAlignConst.REVERSE:
classes.push('fr-btns-group--inline-reverse', 'fr-btns-group--right');
break;
default:
break;
}
// Size class
if (this.buttonGroupSize === DsfrSizeConst.SM) {
classes.push('fr-btns-group--sm');
}
else if (this.buttonGroupSize === DsfrSizeConst.LG) {
classes.push('fr-btns-group--lg');
}
// Equisized class
if (this.equisized) {
classes.push('fr-btns-group--equisized');
}
// IconPosition class
if (this._iconPosition) {
classes.push(this._iconPosition === DsfrPositionConst.LEFT ? 'fr-btns-group--icon-left' : 'fr-btns-group--icon-right');
}
return classes;
}
/* Entoure chaque composant bouton par une balise <li> si nécessaire */
surroundButtonsWithLi() {
if (this.groupMarkup === DsfrButtonsGroupMarkupConst.UL) {
DomUtils.surroundElementsWithLi(this._elementRef, this.buttonsElements());
}
}
/** On force la position des icônes des boutons. */
updateButtonsIconPosition() {
this.buttons().forEach((b) => (b.iconPosition = this._iconPosition));
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrButtonsGroupComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DsfrButtonsGroupComponent, isStandalone: true, selector: "dsfr-buttons-group", inputs: { inline: "inline", alignment: "alignment", equisized: "equisized", buttonGroupSize: "buttonGroupSize", groupMarkup: "groupMarkup", size: "size", iconPosition: "iconPosition" }, queries: [{ propertyName: "buttonsElements", predicate: DsfrButtonComponent, read: ElementRef, isSignal: true }, { propertyName: "buttons", predicate: DsfrButtonComponent, isSignal: true }], ngImport: i0, template: "@if (groupMarkup === DsfrButtonsGroupMarkup.DIV) {\n <div class=\"fr-btns-group\" [ngClass]=\"getClasses()\">\n <ng-container *ngTemplateOutlet=\"buttonsTemplate\"></ng-container>\n </div>\n} @else {\n <ul class=\"fr-btns-group\" [ngClass]=\"getClasses()\">\n <ng-container *ngTemplateOutlet=\"buttonsTemplate\"></ng-container>\n </ul>\n}\n\n<ng-template #buttonsTemplate>\n <ng-content></ng-content>\n</ng-template>\n", styles: ["@charset \"UTF-8\";dsfr-buttons-group div.fr-btns-group:not([class*=fr-btns-group--inline]) dsfr-button{width:calc(100% - 1rem)}dsfr-buttons-group .fr-btns-group li{margin:0 .5rem 1rem}dsfr-buttons-group .fr-btns-group li .fr-btn{margin:0}dsfr-buttons-group .fr-btns-group--inline li{margin-left:.5rem;margin-right:.5rem}dsfr-buttons-group .fr-btns-group--inline li .fr-btn{margin:0}dsfr-buttons-group dsfr-button{pointer-events:none}dsfr-buttons-group dsfr-button .fr-btn{pointer-events:auto}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrButtonsGroupComponent, decorators: [{
type: Component,
args: [{ selector: 'dsfr-buttons-group', encapsulation: ViewEncapsulation.None, standalone: true, imports: [CommonModule], template: "@if (groupMarkup === DsfrButtonsGroupMarkup.DIV) {\n <div class=\"fr-btns-group\" [ngClass]=\"getClasses()\">\n <ng-container *ngTemplateOutlet=\"buttonsTemplate\"></ng-container>\n </div>\n} @else {\n <ul class=\"fr-btns-group\" [ngClass]=\"getClasses()\">\n <ng-container *ngTemplateOutlet=\"buttonsTemplate\"></ng-container>\n </ul>\n}\n\n<ng-template #buttonsTemplate>\n <ng-content></ng-content>\n</ng-template>\n", styles: ["@charset \"UTF-8\";dsfr-buttons-group div.fr-btns-group:not([class*=fr-btns-group--inline]) dsfr-button{width:calc(100% - 1rem)}dsfr-buttons-group .fr-btns-group li{margin:0 .5rem 1rem}dsfr-buttons-group .fr-btns-group li .fr-btn{margin:0}dsfr-buttons-group .fr-btns-group--inline li{margin-left:.5rem;margin-right:.5rem}dsfr-buttons-group .fr-btns-group--inline li .fr-btn{margin:0}dsfr-buttons-group dsfr-button{pointer-events:none}dsfr-buttons-group dsfr-button .fr-btn{pointer-events:auto}\n"] }]
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { inline: [{
type: Input
}], alignment: [{
type: Input
}], equisized: [{
type: Input
}], buttonGroupSize: [{
type: Input
}], groupMarkup: [{
type: Input
}], size: [{
type: Input
}], iconPosition: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV0dG9ucy1ncm91cC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZHNmci1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9idXR0b25zLWdyb3VwL2J1dHRvbnMtZ3JvdXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvYnV0dG9ucy1ncm91cC9idXR0b25zLWdyb3VwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsZUFBZSxFQUNmLFNBQVMsRUFDVCxlQUFlLEVBQ2YsTUFBTSxFQUNOLFVBQVUsRUFDVixLQUFLLEVBQ0wsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQWdCLGlCQUFpQixFQUFZLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNsRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDaEQsT0FBTyxFQUVMLGNBQWMsRUFFZCwyQkFBMkIsRUFFM0IsZUFBZSxHQUNoQixNQUFNLHVCQUF1QixDQUFDOzs7QUFVL0IsTUFBTSxPQUFPLHlCQUF5QjtJQXVEcEMsWUFBb0IsV0FBdUI7UUFDekM7bUhBQzJHO1FBRnpGLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBdEQzQzs7O1dBR0c7UUFDTSxXQUFNLEdBQWUsZUFBZSxDQUFDLEtBQUssQ0FBQztRQWNwRDs7Ozs7V0FLRztRQUNNLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFM0I7O1dBRUc7UUFDTSxvQkFBZSxHQUFhLGFBQWEsQ0FBQyxFQUFFLENBQUM7UUFFdEQ7Ozs7V0FJRztRQUNIOzs7Ozs7OztXQVFHO1FBQ00sZ0JB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O3NCQUF4QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIGFmdGVyTmV4dFJlbmRlcixcbiAgQ29tcG9uZW50LFxuICBjb250ZW50Q2hpbGRyZW4sXG4gIGVmZmVjdCxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVV0aWxzLCBEc2ZyUG9zaXRpb24sIERzZnJQb3NpdGlvbkNvbnN0LCBEc2ZyU2l6ZSwgRHNmclNpemVDb25zdCB9IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBEc2ZyQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi4vYnV0dG9uJztcbmltcG9ydCB7XG4gIERzZnJBbGlnbixcbiAgRHNmckFsaWduQ29uc3QsXG4gIERzZnJCdXR0b25zR3JvdXBNYXJrdXAsXG4gIERzZnJCdXR0b25zR3JvdXBNYXJrdXBDb25zdCxcbiAgRHNmcklubGluZSxcbiAgRHNmcklubGluZUNvbnN0LFxufSBmcm9tICcuL2J1dHRvbnMtZ3JvdXAubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkc2ZyLWJ1dHRvbnMtZ3JvdXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vYnV0dG9ucy1ncm91cC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2J1dHRvbnMtZ3JvdXAuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG59KVxuZXhwb3J0IGNsYXNzIERzZnJCdXR0b25zR3JvdXBDb21wb25lbnQge1xuICAvKipcbiAgICogUGVybWV0IGRlIGJhc2N1bGVyIGxhIGRpc3Bvc2l0aW9uIGRlcyBib3V0b25zIGVuIG1vZGUgaG9yaXpvbnRhbC5cbiAgICogRW4gbW9kZSB2ZXJ0aWNhbCwgbW9kZSBwYXIgZMOpZmF1dCwgbGVzIGJvdXRvbnMgcHJlbm5lbnQgMTAwJSBkZSBsYSBsYXJnZXVyIGR1IGNvbnRlbmV1ci5cbiAgICovXG4gIEBJbnB1dCgpIGlubGluZTogRHNmcklubGluZSA9IERzZnJJbmxpbmVDb25zdC5ORVZFUjtcblxuICAvKipcbiAgICogUGxhY2VtZW50IGRlcyBib3V0b25zIGVuIG1vZGUgYGlubGluZWAgOlxuICAgKiAtIGBkZWZhdWx0YCA6IGFsaWduZSBsZXMgYm91dG9ucyBzdXIgbGEgZ2F1Y2hlLlxuICAgKiAtIGByaWdodGAgOiBhbGlnbmUgbGVzIGJvdXRvbnMgc3VyIGxhIGRyb2l0ZVxuICAgKiAtIGBiZXR3ZWVuYCA6IGxlcyBib3V0b25zIG9udCBsZXMgbcOqbWVzIGVzcGFjZW1lbnRzIGVudGUgZXV4LlxuICAgKiAtIGBjZW50ZXJgIDogYWxpZ25lIGxlcyBib3V0b25zIGF1IGNlbnRyZSBkdSBjb250ZW5ldXIuXG4gICAqIC0gYHJldmVyc2VgIDogbGVzIGJvdXRvbnMgc2UgbGlzZW50IGRlIGRyb2l0ZSDDoCBnYXVjaGUgKGltcGxpcXVlIG7DqWNlc3NhaXJlbWVudCB1biBwbGFjZW1lbnQgw6AgZHJvaXRlKS5cbiAgICpcbiAgICog8J+TjCBOJ2EgYXVjdW4gZWZmZXQgZW4gbW9kZSB2ZXJ0aWNhbC5cbiAgICovXG4gIEBJbnB1dCgpIGFsaWdubWVudDogRHNmckFsaWduO1xuXG4gIC8qKlxuICAgKiBQZXJtZXQgZGUgbWV0dHJlIGF1dG9tYXRpcXVlbWVudCB0b3VzIGxlcyBib3V0b25zIGTigJl1biBncm91cGUgYcyAIGxhIG1lzIJtZSBsYXJnZXVyLlxuICAgKiBDZWxhIHBlcm1ldCB1bmUgdW5pZm9ybWl0w6kgZGVzIGJvdXRvbnMgZW4gbW9kZSBob3Jpem9udGFsLlxuICAgKiAoZW4gbW9kZSB2ZXJ0aWNhbCwgbGVzIGJvdXRvbnMgcHJlbm5lbnQgMTAwJSBkZSBsYSBsYXJnZXVyIGR1IGNvbnRlbmV1cilcbiAgICogQ2V0dGUgb3B0aW9uIHBldXQgw6p0cmUgY29tYmluw6llIGF2ZWMgbGEgcHJvcHJpw6l0w6kgZCdhbGlnbmVtZW50LlxuICAgKi9cbiAgQElucHV0KCkgZXF1aXNpemVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRhaWxsZSBkZXMgYm91dG9ucyBkdSBncm91cGUuXG4gICAqL1xuICBASW5wdXQoKSBidXR0b25Hcm91cFNpemU6IERzZnJTaXplID0gRHNmclNpemVDb25zdC5NRDtcblxuICAvKipcbiAgICogVHlwZSBkZSBiYWxpc2UgSFRNTCBwb3VyIGxhIGxpc3RlIGR1IGdyb3VwZSBkZSBib3V0b25zLlxuICAgKlxuICAgKiDwn5OMIENldHRlIHByb3ByacOpdMOpIG5lIGRvaXQgcGFzIMOqdHJlIG1vZGlmacOpZSBwb3N0LWluaXRpYWxpc2F0aW9uIChpLmUuIGR5bmFtaXF1ZW1lbnQpLlxuICAgKi9cbiAgLypcbiAgICogTm90ZSB0ZWNobmlxdWUgOiBMZSBmYWl0IGRlIG1vZGlmaWVyIGxlIERPTSBwb3VyIGVuY2Fwc3VsZXIgbGVzIGJvdXRvbnMgZGFucyBkZXMgYmFsaXNlcyA8bGk+IG5vdXMgZW1ww6pjaGVcbiAgICogYXVqb3VyZCdodWkgZGUgc3VwcG9ydGVyIGxhIG1vZGlmaWNhdGlvbiBkeW5hbWlxdWUgZHUgdHlwZSBkZSBiYWxpc2FnZS4gUGFzc2VyIGQndW4gY29udGVuZXVyIDx1bD4gw6AgPGRpdj4gbmVcbiAgICogcG9zZSBwYXMgZGUgcHJvYmzDqG1lIG1haXMgbCdpbnZlcnNlIHByb2R1aXQgdW5lIHN0cnVjdHVyZSBIVE1MIG5vbiB2YWxpZGUgLSBsZXMgPGxpPiBwb3NpdGlvbm7DqXMgcGFyIHVuIGFwcGVsIMOgXG4gICAqIGxhIG3DqXRob2RlIGBzdXJyb3VuZEJ1dHRvbnNXaXRoTGlgIGVmZmVjdHXDqSBhdSBuaXZlYXUgZHUgc2V0dGVyIGRlIGBncm91cE1hcmt1cGAgc2UgdmVycmFpdCBlZmZhY8OpcyBwYXIgbGEgcGFzc2VcbiAgICogZGUgcmVuZHUgQW5ndWxhciBxdWkgcmVtcGxhY2UgbGEgPGRpdj4gcGFyIHVuIDx1bD4uIElsIHNlcmFpdCBwb3NzaWJsZSBkJ2ludm9xdWVyIGxhIG3DqXRob2RlIGBzdXJyb3VuZEJ1dHRvbnNXaXRoTGlgXG4gICAqIGVuIHV0aWxpc2FudCB1biBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYCBtYWlzIGNldHRlIGFwcHJvY2hlIG5vdXMgc2VtYmxlIMOqdHJlIHRyb3AgaGFzYXJkZXVzZSBhdSByZWdhcmQgZHUgY2FzXG4gICAqIGQndXNhZ2UgKGNoYW5nZXIgZHluYW1pcXVlbWVudCBsYSBzdHJ1Y3VyZSBIVE1MIGQndW4gZ3JvdXBlIGRlIGJvdXRvbnMpIHF1aSBuZSBzZW1ibGUgcGFzIHBlcnRpbmVudC5cbiAgICovXG4gIEBJbnB1dCgpIGdyb3VwTWFya3VwOiBEc2ZyQnV0dG9uc0dyb3VwTWFya3VwID0gRHNmckJ1dHRvbnNHcm91cE1hcmt1cENvbnN0LlVMO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBEc2ZyQnV0dG9uc0dyb3VwTWFya3VwID0gRHNmckJ1dHRvbnNHcm91cE1hcmt1cENvbnN0O1xuXG4gIHByaXZhdGUgYnV0dG9uc0VsZW1lbnRzID0gY29udGVudENoaWxkcmVuKERzZnJCdXR0b25Db21wb25lbnQsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcbiAgcHJpdmF0ZSBidXR0b25zID0gY29udGVudENoaWxkcmVuKERzZnJCdXR0b25Db21wb25lbnQpO1xuXG4gIHByaXZhdGUgX2ljb25Qb3NpdGlvbjogRHNmclBvc2l0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHtcbiAgICAvKiBmaXhtZSA6IGFuZ3VsYXIxNyArIGFuZ3VsYXIgMTggc2VyYSBhcHBlbMOpIGEgbGEgZm9pcyBkYW5zIGVmZmVjdCBldCBkYW5zIGFmdGVyTmV4dFJlbmRlciBhIGwnaW5pdFxuICAgICBtYWlzIHNldWxlbWVudCBkYW5zIGxlIGFmdGVyTmV4dFJlbmRlcigpIGVuIGFuZ3VsYXIgMTkuIFZvaXIgcG91ciByZW1wbGFjZXIgcGFyIGFmdGVyUmVuZGVyRWZmZWN0IGVuIDE5ICovXG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdGhpcy5zdXJyb3VuZEJ1dHRvbnNXaXRoTGkoKTtcbiAgICB9KTtcbiAgICBhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuICAgICAgdGhpcy5zdXJyb3VuZEJ1dHRvbnNXaXRoTGkoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWlsbGUgZGVzIGJvdXRvbnMgZHUgZ3JvdXBlLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBzaW5jZSgxLjE1LjApIHV0aWxpc2VyICdidXR0b25Hcm91cFNpemUnIMOgIGxhIHBsYWNlXG4gICAqL1xuICBnZXQgc2l6ZSgpOiBEc2ZyU2l6ZSB7XG4gICAgcmV0dXJuIHRoaXMuYnV0dG9uR3JvdXBTaXplO1xuICB9XG5cbiAgZ2V0IGljb25Qb3NpdGlvbigpOiBEc2ZyUG9zaXRpb24ge1xuICAgIHJldHVybiB0aGlzLl9pY29uUG9zaXRpb247XG4gIH1cblxuICAvKipcbiAgICogVGFpbGxlIGRlcyBib3V0b25zIGR1IGdyb3VwZS5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgc2luY2UoMS4xNS4wKSB1dGlsaXNlciAnYnV0dG9uR3JvdXBTaXplJyDDoCBsYSBwbGFjZVxuICAgKi9cbiAgQElucHV0KCkgc2V0IHNpemUodmFsdWU6IERzZnJTaXplKSB7XG4gICAgdGhpcy5idXR0b25Hcm91cFNpemUgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb3NpdGlvbm5lbWVudCAoZ2F1Y2hlIG91IGRyb2l0ZSkgYXUgbml2ZWF1IGR1IGdyb3VwZSBkZXMgaWPDtG5lcyBkYW5zIGxlcyBib3V0b25zIHF1aVxuICAgKiBjb250aWVubmVudCDDoCBsYSBmb2lzIHVuZSBpY8O0bmUgZXQgdW4gbGFiZWwuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgaWNvblBvc2l0aW9uKHZhbHVlOiBEc2ZyUG9zaXRpb24pIHtcbiAgICB0aGlzLl9pY29uUG9zaXRpb24gPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZUJ1dHRvbnNJY29uUG9zaXRpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDZXR0ZSBtw6l0aG9kZSBjYWxjdWxlIGxlcyBzdHlsZXMgZHUgY29tcG9zYW50IGVuIMOpdml0YW50IGxlcyBtYWdpYyBzdHJpbmdzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldENsYXNzZXMoKTogc3RyaW5nW10ge1xuICAgIGxldCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gSW5saW5lIGNsYXNzXG4gICAgc3dpdGNoICh0aGlzLmlubGluZSkge1xuICAgICAgY2FzZSAnYWx3YXlzJzpcbiAgICAgICAgY2xhc3Nlcy5wdXNoKCdmci1idG5zLWdyb3VwLS1pbmxpbmUnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdMRyc6XG4gICAgICAgIGNsYXNzZXMucHVzaCgnZnItYnRucy1ncm91cC0taW5saW5lLWxnJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnTUQnOlxuICAgICAgICBjbGFzc2VzLnB1c2goJ2ZyLWJ0bnMtZ3JvdXAtLWlubGluZS1tZCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1NNJzpcbiAgICAgICAgY2xhc3Nlcy5wdXNoKCdmci1idG5zLWdyb3VwLS1pbmxpbmUtc20nKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIEFsaWdubWVudCBjbGFzc1xuICAgIHN3aXRjaCAodGhpcy5hbGlnbm1lbnQpIHtcbiAgICAgIGNhc2UgRHNmckFsaWduQ29uc3QuQ0VOVEVSOlxuICAgICAgICBjbGFzc2VzLnB1c2goJ2ZyLWJ0bnMtZ3JvdXAtLWNlbnRlcicpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRHNmckFsaWduQ29uc3QuQkVUV0VFTjpcbiAgICAgICAgY2xhc3Nlcy5wdXNoKCdmci1idG5zLWdyb3VwLS1iZXR3ZWVuJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBEc2ZyQWxpZ25Db25zdC5SSUdIVDpcbiAgICAgICAgY2xhc3Nlcy5wdXNoKCdmci1idG5zLWdyb3VwLS1yaWdodCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRHNmckFsaWduQ29uc3QuUkVWRVJTRTpcbiAgICAgICAgY2xhc3Nlcy5wdXNoKCdmci1idG5zLWdyb3VwLS1pbmxpbmUtcmV2ZXJzZScsICdmci1idG5zLWdyb3VwLS1yaWdodCcpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gU2l6ZSBjbGFzc1xuICAgIGlmICh0aGlzLmJ1dHRvbkdyb3VwU2l6ZSA9PT0gRHNmclNpemVDb25zdC5TTSkge1xuICAgICAgY2xhc3Nlcy5wdXNoKCdmci1idG5zLWdyb3VwLS1zbScpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5idXR0b25Hcm91cFNpemUgPT09IERzZnJTaXplQ29uc3QuTEcpIHtcbiAgICAgIGNsYXNzZXMucHVzaCgnZnItYnRucy1ncm91cC0tbGcnKTtcbiAgICB9XG5cbiAgICAvLyBFcXVpc2l6ZWQgY2xhc3NcbiAgICBpZiAodGhpcy5lcXVpc2l6ZWQpIHtcbiAgICAgIGNsYXNzZXMucHVzaCgnZnItYnRucy1ncm91cC0tZXF1aXNpemVkJyk7XG4gICAgfVxuXG4gICAgLy8gSWNvblBvc2l0aW9uIGNsYXNzXG4gICAgaWYgKHRoaXMuX2ljb25Qb3NpdGlvbikge1xuICAgICAgY2xhc3Nlcy5wdXNoKFxuICAgICAgICB0aGlzLl9pY29uUG9zaXRpb24gPT09IERzZnJQb3NpdGlvbkNvbnN0LkxFRlQgPyAnZnItYnRucy1ncm91cC0taWNvbi1sZWZ0JyA6ICdmci1idG5zLWdyb3VwLS1pY29uLXJpZ2h0JyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsYXNzZXM7XG4gIH1cblxuICAvKiBFbnRvdXJlIGNoYXF1ZSBjb21wb3NhbnQgYm91dG9uIHBhciB1bmUgYmFsaXNlIDxsaT4gc2kgbsOpY2Vzc2FpcmUgKi9cbiAgcHJpdmF0ZSBzdXJyb3VuZEJ1dHRvbnNXaXRoTGkoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZ3JvdXBNYXJrdXAgPT09IERzZnJCdXR0b25zR3JvdXBNYXJrdXBDb25zdC5VTCkge1xuICAgICAgRG9tVXRpbHMuc3Vycm91bmRFbGVtZW50c1dpdGhMaSh0aGlzLl9lbGVtZW50UmVmLCB0aGlzLmJ1dHRvbnNFbGVtZW50cygpKTtcbiAgICB9XG4gIH1cblxuICAvKiogT24gZm9yY2UgbGEgcG9zaXRpb24gZGVzIGljw7RuZXMgZGVzIGJvdXRvbnMuICovXG4gIHByaXZhdGUgdXBkYXRlQnV0dG9uc0ljb25Qb3NpdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLmJ1dHRvbnMoKS5mb3JFYWNoKChiKSA9PiAoYi5pY29uUG9zaXRpb24gPSB0aGlzLl9pY29uUG9zaXRpb24pKTtcbiAgfVxufVxuIiwiQGlmIChncm91cE1hcmt1cCA9PT0gRHNmckJ1dHRvbnNHcm91cE1hcmt1cC5ESVYpIHtcbiAgPGRpdiBjbGFzcz1cImZyLWJ0bnMtZ3JvdXBcIiBbbmdDbGFzc109XCJnZXRDbGFzc2VzKClcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnV0dG9uc1RlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxufSBAZWxzZSB7XG4gIDx1bCBjbGFzcz1cImZyLWJ0bnMtZ3JvdXBcIiBbbmdDbGFzc109XCJnZXRDbGFzc2VzKClcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnV0dG9uc1RlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gIDwvdWw+XG59XG5cbjxuZy10ZW1wbGF0ZSAjYnV0dG9uc1RlbXBsYXRlPlxuICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48L25nLXRlbXBsYXRlPlxuIl19