@edugouvfr/ngx-dsfr-ext
Version:
NgxDsfrExt est une extension au package @edugouvfr/ngx-dsfr (portage Angular des éléments DSFR)
127 lines • 21.5 kB
JavaScript
import { Component, CUSTOM_ELEMENTS_SCHEMA, EventEmitter, forwardRef, inject, Input, Output, ViewEncapsulation, } from '@angular/core';
import { FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';
import { DefaultValueAccessorComponent, DsfrButtonModule, DsfrFormSelectModule, DsfrI18nService, DsfrSkiplinksModule, Language, } from '@edugouvfr/ngx-dsfr';
import { MESSAGES_EN } from './i18n/messages.en';
import { MESSAGES_FR } from './i18n/messages.fr';
import { EduEditorContentComponent } from './components/content/editor-content.component';
import { DEFAULT_TOOLBAR_OPTIONS } from './components/toolbar/editor-toolbar-default-options';
import { EduEditorToolbarComponent } from './components/toolbar/editor-toolbar.component';
import { DsfrEditorService } from './editor.service';
import * as i0 from "@angular/core";
// Basé sur https://github.com/KillerCodeMonkey/ngx-quill
// Demo sur https://killercodemonkey.github.io/ngx-quill-example/
export class DsfrEditorComponent extends DefaultValueAccessorComponent {
constructor() {
super();
/**
* Options de la toolbar.
*/
this.toolbarOptions = DEFAULT_TOOLBAR_OPTIONS;
/**
* Permet de spécifier l'identifiant à utiliser pour le composant d'édition.
* C'est utile si vous souhaitez disposer de plusieurs éditeurs sur un même écran.
*
* Attention : cet input est statique et doit être connu à l'initialisation du composant.
*/
this.editorId = 'editor';
/**
* Permet de masquer visuellement le libellé en le réservant aux dispositifs de restitution.
*/
this.labelSrOnly = false;
/**
* Dev/debug : permet d'afficher le code HTML interne de l'éditeur (i.e. celui qui sert pour l'affichage WYSIWYG).
*/
this.showEditorHtmlDebugPanel = false;
/**
* Dev/debug : permet d'afficher le code HTML qui sera récupéré en sortie.
*/
this.showSemanticHtmlDebugPanel = false;
/**
* Signale les changements sur le contenu HTML.
*/
this.valueChange = new EventEmitter();
this.i18n = inject(DsfrI18nService);
this.editorService = inject(DsfrEditorService);
this.labelId = 'label-' + this.editorId;
if (!this.ariaLabelledBy) {
this.ariaLabelledBy = this.labelId;
}
this.i18n.extendsLabelsBundle(Language.EN, MESSAGES_EN);
this.i18n.extendsLabelsBundle(Language.FR, MESSAGES_FR);
}
ngOnInit() {
this._sub = this.editorService.editorChange$.subscribe((value) => {
if (this.value !== value) {
this.value = value && value.length ? value : '';
this.valueChange.emit(this.value);
}
});
// Si la valeur est non-nulle, on émet un changement de modèle pour forcer la mise à jour le contenu de l'éditeur
// car si l'utilisateur passe par une syntaxe [value]="<s>foo</s>" et non par la directive [ngModel]
// le writeValue ne sera pas appelé, donc l'éditeur ne sera pas notifié et ne se mettra pas à jour
if (this.value) {
this.editorService.emitModelChange(this.value);
}
}
ngOnDestroy() {
this._sub?.unsubscribe();
}
/** @internal */
writeValue(value) {
super.writeValue(value);
if (value) {
this.editorService.emitModelChange(value);
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DsfrEditorComponent, isStandalone: true, selector: "dsfr-ext-editor, dsfrx-editor", inputs: { toolbarOptions: "toolbarOptions", editorId: "editorId", label: "label", labelSrOnly: "labelSrOnly", ariaLabelledBy: "ariaLabelledBy", message: "message", messageSeverity: "messageSeverity", messagesGroupId: "messagesGroupId", showEditorHtmlDebugPanel: "showEditorHtmlDebugPanel", showSemanticHtmlDebugPanel: "showSemanticHtmlDebugPanel" }, outputs: { valueChange: "valueChange" }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => DsfrEditorComponent),
multi: true,
},
DsfrEditorService,
], usesInheritance: true, ngImport: i0, template: "@if (label && label.length) {\n <div [id]=\"labelId\" class=\"fr-label\" [class.fr-sr-only]=\"labelSrOnly\">{{ label }}</div>\n}\n\n<edu-editor-toolbar [toolbarOptions]=\"toolbarOptions\" [editorId]=\"editorId\"></edu-editor-toolbar>\n\n<edu-editor-content\n [editorId]=\"editorId\"\n [ariaLabelledBy]=\"ariaLabelledBy\"\n [message]=\"message\"\n [messageSeverity]=\"messageSeverity\"\n [messagesGroupId]=\"messagesGroupId\"\n [showEditorHtmlDebugPanel]=\"showEditorHtmlDebugPanel\"\n [showSemanticHtmlDebugPanel]=\"showSemanticHtmlDebugPanel\"></edu-editor-content>\n", styles: ["dsfrx-editor .fr-label,dsfr-ext-editor .fr-label{margin-bottom:.25rem}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: DsfrSkiplinksModule }, { kind: "ngmodule", type: DsfrFormSelectModule }, { kind: "ngmodule", type: DsfrButtonModule }, { kind: "component", type: EduEditorToolbarComponent, selector: "edu-editor-toolbar", inputs: ["editorId", "toolbarOptions"] }, { kind: "component", type: EduEditorContentComponent, selector: "edu-editor-content", inputs: ["editorId", "ariaLabelledBy", "readOnly", "message", "messageSeverity", "messagesGroupId", "showEditorHtmlDebugPanel", "showSemanticHtmlDebugPanel"] }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrEditorComponent, decorators: [{
type: Component,
args: [{ selector: 'dsfr-ext-editor, dsfrx-editor', encapsulation: ViewEncapsulation.None, standalone: true, imports: [
FormsModule,
ReactiveFormsModule,
DsfrSkiplinksModule,
DsfrFormSelectModule,
DsfrButtonModule,
EduEditorToolbarComponent,
EduEditorContentComponent,
], providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => DsfrEditorComponent),
multi: true,
},
DsfrEditorService,
], schemas: [CUSTOM_ELEMENTS_SCHEMA], template: "@if (label && label.length) {\n <div [id]=\"labelId\" class=\"fr-label\" [class.fr-sr-only]=\"labelSrOnly\">{{ label }}</div>\n}\n\n<edu-editor-toolbar [toolbarOptions]=\"toolbarOptions\" [editorId]=\"editorId\"></edu-editor-toolbar>\n\n<edu-editor-content\n [editorId]=\"editorId\"\n [ariaLabelledBy]=\"ariaLabelledBy\"\n [message]=\"message\"\n [messageSeverity]=\"messageSeverity\"\n [messagesGroupId]=\"messagesGroupId\"\n [showEditorHtmlDebugPanel]=\"showEditorHtmlDebugPanel\"\n [showSemanticHtmlDebugPanel]=\"showSemanticHtmlDebugPanel\"></edu-editor-content>\n", styles: ["dsfrx-editor .fr-label,dsfr-ext-editor .fr-label{margin-bottom:.25rem}\n"] }]
}], ctorParameters: () => [], propDecorators: { toolbarOptions: [{
type: Input
}], editorId: [{
type: Input
}], label: [{
type: Input
}], labelSrOnly: [{
type: Input
}], ariaLabelledBy: [{
type: Input
}], message: [{
type: Input
}], messageSeverity: [{
type: Input
}], messagesGroupId: [{
type: Input
}], showEditorHtmlDebugPanel: [{
type: Input
}], showSemanticHtmlDebugPanel: [{
type: Input
}], valueChange: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWV4dC9lZGl0b3Ivc3JjL2xpYi9lZGl0b3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItZXh0L2VkaXRvci9zcmMvbGliL2VkaXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULHNCQUFzQixFQUN0QixZQUFZLEVBQ1osVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBR0wsTUFBTSxFQUNOLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckYsT0FBTyxFQUNMLDZCQUE2QixFQUM3QixnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBQ3BCLGVBQWUsRUFFZixtQkFBbUIsRUFDbkIsUUFBUSxHQUNULE1BQU0scUJBQXFCLENBQUM7QUFFN0IsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUdqRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUMxRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUM5RixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUUxRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7QUFFckQseURBQXlEO0FBQ3pELGlFQUFpRTtBQTJCakUsTUFBTSxPQUFPLG1CQUFvQixTQUFRLDZCQUFxQztJQThGNUU7UUFDRSxLQUFLLEVBQUUsQ0FBQztRQTlGVjs7V0FFRztR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YUFDVTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxvQkFBb0IsQ0FBQzs0QkFDbEQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7d0JBQ0QsaUJBQWlCO3FCQUNsQixXQUNRLENBQUMsc0JBQXNCLENBQUM7d0RBTXhCLGNBQWM7c0JBQXRCLEtBQUs7Z0JBUUcsUUFBUTtzQkFBaEIsS0FBSztnQkFTRyxLQUFLO3NCQUFiLEtBQUs7Z0JBS0csV0FBVztzQkFBbkIsS0FBSztnQkFNRyxjQUFjO3NCQUF0QixLQUFLO2dCQXNCRyxPQUFPO3NCQUFmLEtBQUs7Z0JBS0csZUFBZTtzQkFBdkIsS0FBSztnQkFRRyxlQUFlO3NCQUF2QixLQUFLO2dCQUtHLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFLRywwQkFBMEI7c0JBQWxDLEtBQUs7Z0JBS0ksV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSxcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBpbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgTkdfVkFMVUVfQUNDRVNTT1IsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBEZWZhdWx0VmFsdWVBY2Nlc3NvckNvbXBvbmVudCxcbiAgRHNmckJ1dHRvbk1vZHVsZSxcbiAgRHNmckZvcm1TZWxlY3RNb2R1bGUsXG4gIERzZnJJMThuU2VydmljZSxcbiAgRHNmclNldmVyaXR5LFxuICBEc2ZyU2tpcGxpbmtzTW9kdWxlLFxuICBMYW5ndWFnZSxcbn0gZnJvbSAnQGVkdWdvdXZmci9uZ3gtZHNmcic7XG5cbmltcG9ydCB7IE1FU1NBR0VTX0VOIH0gZnJvbSAnLi9pMThuL21lc3NhZ2VzLmVuJztcbmltcG9ydCB7IE1FU1NBR0VTX0ZSIH0gZnJvbSAnLi9pMThuL21lc3NhZ2VzLmZyJztcblxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBFZHVFZGl0b3JDb250ZW50Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2NvbnRlbnQvZWRpdG9yLWNvbnRlbnQuY29tcG9uZW50JztcbmltcG9ydCB7IERFRkFVTFRfVE9PTEJBUl9PUFRJT05TIH0gZnJvbSAnLi9jb21wb25lbnRzL3Rvb2xiYXIvZWRpdG9yLXRvb2xiYXItZGVmYXVsdC1vcHRpb25zJztcbmltcG9ydCB7IEVkdUVkaXRvclRvb2xiYXJDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdG9vbGJhci9lZGl0b3ItdG9vbGJhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgVG9vbGJhckNvbnRyb2wgfSBmcm9tICcuL2NvbXBvbmVudHMvdG9vbGJhci9lZGl0b3ItdG9vbGJhci5tb2RlbCc7XG5pbXBvcnQgeyBEc2ZyRWRpdG9yU2VydmljZSB9IGZyb20gJy4vZWRpdG9yLnNlcnZpY2UnO1xuXG4vLyBCYXPDqSBzdXIgaHR0cHM6Ly9naXRodWIuY29tL0tpbGxlckNvZGVNb25rZXkvbmd4LXF1aWxsXG4vLyBEZW1vIHN1ciBodHRwczovL2tpbGxlcmNvZGVtb25rZXkuZ2l0aHViLmlvL25neC1xdWlsbC1leGFtcGxlL1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkc2ZyLWV4dC1lZGl0b3IsIGRzZnJ4LWVkaXRvcicsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlVXJsOiAnLi9lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9lZGl0b3IuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIEZvcm1zTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgRHNmclNraXBsaW5rc01vZHVsZSxcbiAgICBEc2ZyRm9ybVNlbGVjdE1vZHVsZSxcbiAgICBEc2ZyQnV0dG9uTW9kdWxlLFxuICAgIEVkdUVkaXRvclRvb2xiYXJDb21wb25lbnQsXG4gICAgRWR1RWRpdG9yQ29udGVudENvbXBvbmVudCxcbiAgXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEc2ZyRWRpdG9yQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gICAgRHNmckVkaXRvclNlcnZpY2UsXG4gIF0sXG4gIHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcbn0pXG5leHBvcnQgY2xhc3MgRHNmckVkaXRvckNvbXBvbmVudCBleHRlbmRzIERlZmF1bHRWYWx1ZUFjY2Vzc29yQ29tcG9uZW50PHN0cmluZz4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBPcHRpb25zIGRlIGxhIHRvb2xiYXIuXG4gICAqL1xuICBASW5wdXQoKSB0b29sYmFyT3B0aW9uczogVG9vbGJhckNvbnRyb2xbXSA9IERFRkFVTFRfVE9PTEJBUl9PUFRJT05TO1xuXG4gIC8qKlxuICAgKiBQZXJtZXQgZGUgc3DDqWNpZmllciBsJ2lkZW50aWZpYW50IMOgIHV0aWxpc2VyIHBvdXIgbGUgY29tcG9zYW50IGQnw6lkaXRpb24uXG4gICAqIEMnZXN0IHV0aWxlIHNpIHZvdXMgc291aGFpdGV6IGRpc3Bvc2VyIGRlIHBsdXNpZXVycyDDqWRpdGV1cnMgc3VyIHVuIG3Dqm1lIMOpY3Jhbi5cbiAgICpcbiAgICogQXR0ZW50aW9uIDogY2V0IGlucHV0IGVzdCBzdGF0aXF1ZSBldCBkb2l0IMOqdHJlIGNvbm51IMOgIGwnaW5pdGlhbGlzYXRpb24gZHUgY29tcG9zYW50LlxuICAgKi9cbiAgQElucHV0KCkgZWRpdG9ySWQgPSAnZWRpdG9yJztcblxuICAvKipcbiAgICogTGliZWxsw6kgZHUgY2hhbXAgZGUgc2Fpc2llIHJpY2hlLlxuICAgKlxuICAgKiBPYmxpZ2F0b2lyZSBzaSB2b3VzIG5lIGfDqXJleiBwYXMgdW4gbGliZWxsw6kgYWNjZXNzaWJsZSB2aWEgYXJpYS1MYWJlbGxlZGJ5LlxuICAgKlxuICAgKiBJbCBlc3QgcG9zc2libGUgZGUgbWFzcXVlciB2aXN1ZWxsZW1lbnQgY2UgbGliZWxsw6kgdmlhIGxhIHByb3ByacOpdMOpIGBsYWJlbFNyT25seWAuXG4gICAqL1xuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQZXJtZXQgZGUgbWFzcXVlciB2aXN1ZWxsZW1lbnQgbGUgbGliZWxsw6kgZW4gbGUgcsOpc2VydmFudCBhdXggZGlzcG9zaXRpZnMgZGUgcmVzdGl0dXRpb24uXG4gICAqL1xuICBASW5wdXQoKSBsYWJlbFNyT25seSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBSZW5zZWlnbmVyIGNldHRlIHByb3ByacOpdMOpIHNpIHZvdXMgc291aGFpdGV6IHLDqWbDqXJlbmNlciB1biDDqWzDqW1lbnQgZMOpbm90YW50IGxlIGNoYW1wIGQnw6lkaXRpb24gYXUgbml2ZWF1IGRlXG4gICAqIGwnYXR0cmlidXQgYXJpYS1sYWJlbGxlZGJ5IHBvc2l0aW9ubsOpIGF1IG5pdmVhdSBkZSBsJ8OpbMOpbWVudCBow7R0ZSBkZSBsJ8OpZGl0ZXVyIEhUTUwuXG4gICAqL1xuICBASW5wdXQoKSBhcmlhTGFiZWxsZWRCeTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBY3RpdmUgbGEgbGVjdHVyZSBzZXVsZS5cbiAgICovXG4gIC8vVE9ETzogQElucHV0KCkgcmVhZE9ubHkgPSBmYWxzZTtcblxuICAvKiogQWpvdXRlIHVuZSB2YWxpZGF0aW9uIGNvbW1lIMOpdGFudCB1biBjaGFtcHMgcmVxdWlyZWQgKi9cbiAgLy9UT0RPOiBASW5wdXQoKSByZXF1aXJlZCA9IGZhbHNlO1xuXG4gIC8qKiBVdGlsaXNlIERvbVNhbml0aXplci4gVW5pcXVlbWVudCBwb3VyIGxlIGZvcm1hdCBgaHRtbGAuICovXG4gIC8vVE9ETzogQElucHV0KCkgc2FuaXRpemUgPSBmYWxzZTtcblxuICAvKiogQWpvdXRlIHVuZSB2YWxldXIgbWF4aW1hbGUgZGUgY2FyYWN0w6hyZSBwb3VyIHZhbGlkYXRpb24uICovXG4gIC8vVE9ETzogQElucHV0KCkgbWF4TGVuZ3RoOiBudW1iZXI7XG5cbiAgLyoqIEFqb3V0ZSB1bmUgdmFsZXVyIG1pbmltYWwgZGUgY2FyYWN0w6hyZSBwb3VyIHZhbGlkYXRpb24uICovXG4gIC8vVE9ETzogQElucHV0KCkgbWluTGVuZ3RoOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgZCdpbmZvcm1hdGlvbiBhc3NvY2nDqSBhdSBjb21wb3NhbnQuXG4gICAqL1xuICBASW5wdXQoKSBtZXNzYWdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlcHLDqXNlbnRlIGxhIHPDqXbDqXJpdMOpIGR1IG1lc3NhZ2UuIPCflKUgYFdBUk5JTkdgIG4nZXN0IHBhcyBnw6lyw6kgZGFucyBjZXR0ZSB2ZXJzaW9uLlxuICAgKi9cbiAgQElucHV0KCkgbWVzc2FnZVNldmVyaXR5OiBEc2ZyU2V2ZXJpdHk7XG5cbiAgLyoqXG4gICAqIElkIGRlIGwnw6lsw6ltZW50IGFmZmljaGFudCBsZXMgbWVzc2FnZXMgYXNzb2Npw6kgw6AgbCfDqWRpdGV1ci4gQSByZW5zZWlnbmVyIHNpIHZvdXMgc291aGFpdGV6IHBvc2l0aW9ubmVyIHVuIGF0dHJpYnV0XG4gICAqIGBhcmlhLWRlc2NyaWJlZGJ5YCByw6lmw6lyZW7Dp2FudCB2b3RyZSBtZXNzYWdlIGF1IG5pdmVhdSBkZSBsJ8OpbMOpbWVudCBow7R0ZSBkZSBsJ8OpZGl0ZXVyLlxuICAgKlxuICAgKiBBdHRlbnRpb24gOiBjZXQgaW5wdXQgZXN0IHN0YXRpcXVlIGV0IGRvaXQgw6p0cmUgY29ubnUgw6AgbCdpbml0aWFsaXNhdGlvbiBkdSBjb21wb3NhbnQuXG4gICAqL1xuICBASW5wdXQoKSBtZXNzYWdlc0dyb3VwSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogRGV2L2RlYnVnIDogcGVybWV0IGQnYWZmaWNoZXIgbGUgY29kZSBIVE1MIGludGVybmUgZGUgbCfDqWRpdGV1ciAoaS5lLiBjZWx1aSBxdWkgc2VydCBwb3VyIGwnYWZmaWNoYWdlIFdZU0lXWUcpLlxuICAgKi9cbiAgQElucHV0KCkgc2hvd0VkaXRvckh0bWxEZWJ1Z1BhbmVsID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIERldi9kZWJ1ZyA6IHBlcm1ldCBkJ2FmZmljaGVyIGxlIGNvZGUgSFRNTCBxdWkgc2VyYSByw6ljdXDDqXLDqSBlbiBzb3J0aWUuXG4gICAqL1xuICBASW5wdXQoKSBzaG93U2VtYW50aWNIdG1sRGVidWdQYW5lbCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBTaWduYWxlIGxlcyBjaGFuZ2VtZW50cyBzdXIgbGUgY29udGVudSBIVE1MLlxuICAgKi9cbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBHZXN0aW9uIGRlIGwnaWRlbnRpZmlhbnQgZHUgbGliZWxsw6kgYWNjZXNzaWJsZS5cbiAgICovXG4gIHByb3RlY3RlZCBsYWJlbElkOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBfc3ViOiBTdWJzY3JpcHRpb247XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpMThuID0gaW5qZWN0KERzZnJJMThuU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZWRpdG9yU2VydmljZSA9IGluamVjdChEc2ZyRWRpdG9yU2VydmljZSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmxhYmVsSWQgPSAnbGFiZWwtJyArIHRoaXMuZWRpdG9ySWQ7XG4gICAgaWYgKCF0aGlzLmFyaWFMYWJlbGxlZEJ5KSB7XG4gICAgICB0aGlzLmFyaWFMYWJlbGxlZEJ5ID0gdGhpcy5sYWJlbElkO1xuICAgIH1cbiAgICB0aGlzLmkxOG4uZXh0ZW5kc0xhYmVsc0J1bmRsZShMYW5ndWFnZS5FTiwgTUVTU0FHRVNfRU4pO1xuICAgIHRoaXMuaTE4bi5leHRlbmRzTGFiZWxzQnVuZGxlKExhbmd1YWdlLkZSLCBNRVNTQUdFU19GUik7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLl9zdWIgPSB0aGlzLmVkaXRvclNlcnZpY2UuZWRpdG9yQ2hhbmdlJC5zdWJzY3JpYmUoKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICh0aGlzLnZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWUgJiYgdmFsdWUubGVuZ3RoID8gdmFsdWUgOiAnJztcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMudmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIFNpIGxhIHZhbGV1ciBlc3Qgbm9uLW51bGxlLCBvbiDDqW1ldCB1biBjaGFuZ2VtZW50IGRlIG1vZMOobGUgcG91ciBmb3JjZXIgbGEgbWlzZSDDoCBqb3VyIGxlIGNvbnRlbnUgZGUgbCfDqWRpdGV1clxuICAgIC8vIGNhciBzaSBsJ3V0aWxpc2F0ZXVyIHBhc3NlIHBhciB1bmUgc3ludGF4ZSBbdmFsdWVdPVwiPHM+Zm9vPC9zPlwiIGV0IG5vbiBwYXIgbGEgZGlyZWN0aXZlIFtuZ01vZGVsXVxuICAgIC8vIGxlIHdyaXRlVmFsdWUgbmUgc2VyYSBwYXMgYXBwZWzDqSwgZG9uYyBsJ8OpZGl0ZXVyIG5lIHNlcmEgcGFzIG5vdGlmacOpIGV0IG5lIHNlIG1ldHRyYSBwYXMgw6Agam91clxuICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICB0aGlzLmVkaXRvclNlcnZpY2UuZW1pdE1vZGVsQ2hhbmdlKHRoaXMudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX3N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgb3ZlcnJpZGUgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgc3VwZXIud3JpdGVWYWx1ZSh2YWx1ZSk7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLmVkaXRvclNlcnZpY2UuZW1pdE1vZGVsQ2hhbmdlKHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cbiIsIkBpZiAobGFiZWwgJiYgbGFiZWwubGVuZ3RoKSB7XG4gIDxkaXYgW2lkXT1cImxhYmVsSWRcIiBjbGFzcz1cImZyLWxhYmVsXCIgW2NsYXNzLmZyLXNyLW9ubHldPVwibGFiZWxTck9ubHlcIj57eyBsYWJlbCB9fTwvZGl2PlxufVxuXG48ZWR1LWVkaXRvci10b29sYmFyIFt0b29sYmFyT3B0aW9uc109XCJ0b29sYmFyT3B0aW9uc1wiIFtlZGl0b3JJZF09XCJlZGl0b3JJZFwiPjwvZWR1LWVkaXRvci10b29sYmFyPlxuXG48ZWR1LWVkaXRvci1jb250ZW50XG4gIFtlZGl0b3JJZF09XCJlZGl0b3JJZFwiXG4gIFthcmlhTGFiZWxsZWRCeV09XCJhcmlhTGFiZWxsZWRCeVwiXG4gIFttZXNzYWdlXT1cIm1lc3NhZ2VcIlxuICBbbWVzc2FnZVNldmVyaXR5XT1cIm1lc3NhZ2VTZXZlcml0eVwiXG4gIFttZXNzYWdlc0dyb3VwSWRdPVwibWVzc2FnZXNHcm91cElkXCJcbiAgW3Nob3dFZGl0b3JIdG1sRGVidWdQYW5lbF09XCJzaG93RWRpdG9ySHRtbERlYnVnUGFuZWxcIlxuICBbc2hvd1NlbWFudGljSHRtbERlYnVnUGFuZWxdPVwic2hvd1NlbWFudGljSHRtbERlYnVnUGFuZWxcIj48L2VkdS1lZGl0b3ItY29udGVudD5cbiJdfQ==