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 19.9 kB
import { CommonModule } from '@angular/common'; import { Component, EventEmitter, forwardRef, Input, Output, ViewChild, ViewEncapsulation, } from '@angular/core'; import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms'; import { DefaultControlComponent, newUniqueId } from '../../shared'; import * as i0 from "@angular/core"; import * as i1 from "../../shared"; import * as i2 from "@angular/common"; export class DsfrUploadComponent extends DefaultControlComponent { constructor(_renderer, _elementRef, i18n) { super(); this._renderer = _renderer; this._elementRef = _elementRef; this.i18n = i18n; /** * Cache le label visuellement en le laissant disponible aux lecteurs d'écran. */ this.labelSrOnly = false; /** Permet l'ajout de plusieurs fichiers à la fois. */ this.multiple = false; /** Evénement émis à la sélection d'un ou plusieurs fichiers. */ this.fileSelect = new EventEmitter(); /** Evénement émis lorsque l'utilisateur annule la sélection. */ this.fileCancel = new EventEmitter(); } /** @deprecated (since 1.4.0) utiliser hint à la place. */ get description() { return this.hint; } /** * Description pour l'upload (précise les contraintes au niveau du ou des fichiers attendus : format, poids attendus, nombre de fichiers possible…). * * @deprecated (since 1.4.0) utiliser hint à la place. * * @internal */ set description(value) { this.hint = value; } /** * Surcharge permettant de gérer la mise à jour du DOM. * * @internal */ writeValue(value) { // afin de se prémunir des initialisations avec une chaîne de caractères (vide ou pas) il faut s'assurer du type // d'argument transmis en entrée et forcer la chaîne vide le cas échéant const isTypeFileList = Object.prototype.toString.call(value).includes(FileList.name); if (!isTypeFileList) { value = ''; } super.writeValue(value); if (this.inputFile) { if (isTypeFileList && value?.length) { this._renderer.setProperty(this.inputFile.nativeElement, 'files', value); } else { this._renderer.setProperty(this.inputFile.nativeElement, 'value', ''); this._renderer.setProperty(this.inputFile.nativeElement, 'files', null); } } } /** @internal */ ngOnInit() { super.ngOnInit(); this.name ??= 'file-upload'; // 'file-upload' est la valeur statique jusqu'en 1.3 this.messagesGroupId = newUniqueId(); } /** @internal */ ngOnChanges({ label, hint }) { if (label) this.label ||= this.i18n.t('upload.label'); // default if (hint) this.hint ||= this.i18n.t('upload.hint'); // default } /** * Permet de programmatiquement réinitialiser le champ après une sélection de fichier(s). */ reset() { this.inputFile.nativeElement.value = ''; } /** @internal */ onCancel() { this.fileCancel.emit(); } /** @internal */ onFileChange(event) { const target = event.target; this.value = target.files ?? undefined; if (this.value) this.fileSelect.emit(this.value); } /** @internal */ hasMessages() { return !!this.error; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrUploadComponent, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i1.DsfrI18nService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DsfrUploadComponent, isStandalone: true, selector: "dsfr-form-upload, dsfr-upload", inputs: { labelSrOnly: "labelSrOnly", ariaInvalid: "ariaInvalid", error: "error", multiple: "multiple", accept: "accept", description: "description" }, outputs: { fileSelect: "fileSelect", fileCancel: "fileCancel" }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DsfrUploadComponent), multi: true, }, ], viewQueries: [{ propertyName: "inputFile", first: true, predicate: ["inputFile"], descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"fr-upload-group\" [ngClass]=\"{ 'fr-input-group--error': error, 'fr-input-group--disabled': disabled }\">\n <label class=\"fr-label\" [ngClass]=\"{ 'fr-sr-only': labelSrOnly }\" [for]=\"inputId\"\n >{{ label }}\n <span class=\"fr-hint-text\">{{ hint }}</span>\n </label>\n <!--\n On bind \u00E0 la fois la propri\u00E9t\u00E9 et l'attribut 'name' pour contourner le bug suivant: https://github.com/angular/angular/issues/11757\n cf. issue#360\n -->\n <input\n #inputFile\n class=\"fr-upload\"\n type=\"file\"\n [id]=\"inputId || null\"\n [name]=\"name || null\"\n [attr.name]=\"name || null\"\n [multiple]=\"multiple\"\n [attr.accept]=\"accept || null\"\n [disabled]=\"disabled\"\n [attr.aria-describedby]=\"hasMessages() ? messagesGroupId : null\"\n [attr.aria-invalid]=\"ariaInvalid || null\"\n (change)=\"onFileChange($event)\"\n (cancel)=\"onCancel()\" />\n @if (hasMessages()) {\n <p [id]=\"messagesGroupId\" class=\"fr-error-text\">\n {{ error }}\n </p>\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrUploadComponent, decorators: [{ type: Component, args: [{ selector: 'dsfr-form-upload, dsfr-upload', encapsulation: ViewEncapsulation.None, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DsfrUploadComponent), multi: true, }, ], standalone: true, imports: [CommonModule, FormsModule], template: "<div class=\"fr-upload-group\" [ngClass]=\"{ 'fr-input-group--error': error, 'fr-input-group--disabled': disabled }\">\n <label class=\"fr-label\" [ngClass]=\"{ 'fr-sr-only': labelSrOnly }\" [for]=\"inputId\"\n >{{ label }}\n <span class=\"fr-hint-text\">{{ hint }}</span>\n </label>\n <!--\n On bind \u00E0 la fois la propri\u00E9t\u00E9 et l'attribut 'name' pour contourner le bug suivant: https://github.com/angular/angular/issues/11757\n cf. issue#360\n -->\n <input\n #inputFile\n class=\"fr-upload\"\n type=\"file\"\n [id]=\"inputId || null\"\n [name]=\"name || null\"\n [attr.name]=\"name || null\"\n [multiple]=\"multiple\"\n [attr.accept]=\"accept || null\"\n [disabled]=\"disabled\"\n [attr.aria-describedby]=\"hasMessages() ? messagesGroupId : null\"\n [attr.aria-invalid]=\"ariaInvalid || null\"\n (change)=\"onFileChange($event)\"\n (cancel)=\"onCancel()\" />\n @if (hasMessages()) {\n <p [id]=\"messagesGroupId\" class=\"fr-error-text\">\n {{ error }}\n </p>\n }\n</div>\n" }] }], ctorParameters: () => [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i1.DsfrI18nService }], propDecorators: { inputFile: [{ type: ViewChild, args: ['inputFile', { static: true }] }], labelSrOnly: [{ type: Input }], ariaInvalid: [{ type: Input }], error: [{ type: Input }], multiple: [{ type: Input }], accept: [{ type: Input }], fileSelect: [{ type: Output }], fileCancel: [{ type: Output }], description: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWNvbXBvbmVudHMvc3JjL2xpYi9mb3Jtcy9mb3JtLXVwbG9hZC91cGxvYWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2Zvcm1zL2Zvcm0tdXBsb2FkL3VwbG9hZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUNMLFNBQVMsRUFFVCxZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFHTCxNQUFNLEVBR04sU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLHVCQUF1QixFQUFtQixXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7Ozs7QUFnQnJGLE1BQU0sT0FBTyxtQkFBb0IsU0FBUSx1QkFBNEI7SUF1Q25FLFlBQ21CLFNBQW9CLEVBQ3BCLFdBQXVCLEVBQ3ZCLElBQXFCO1FBRXRDLEtBQUssRUFBRSxDQUFDO1FBSlMsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUNwQixnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUN2QixTQUFJLEdBQUosSUFBSSxDQUFpQjtRQXJDeEM7O1dBRUc7UUFDTSxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQVU3QixzREFBc0Q7UUFDN0MsYUFBUSxHQUFHLEtBQUssQ0FBQztRQVMxQixnRUFBZ0U7UUFFaEUsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFZLENBQUM7UUFFMUMsZ0VBQWdFO1FBRWhFLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBWSxDQUFDO0lB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VyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztnQkFDbEQsS0FBSyxFQUFFLElBQUk7YUFDWjtTQUNGLDRMQzVCSCx5aUNBNkJBLDJDRENZLFlBQVksNEhBQUUsV0FBVzs7NEZBRXhCLG1CQUFtQjtrQkFkL0IsU0FBUzsrQkFDRSwrQkFBK0IsaUJBRTFCLGlCQUFpQixDQUFDLElBQUksYUFDMUI7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsb0JBQW9CLENBQUM7NEJBQ2xELEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGLGNBQ1csSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQztxSUFLcEMsU0FBUztzQkFEUixTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBTS9CLFdBQVc7c0JBQW5CLEtBQUs7Z0JBS0csV0FBVztzQkFBbkIsS0FBSztnQkFHRyxLQUFLO3NCQUFiLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFPRyxNQUFNO3NCQUFkLEtBQUs7Z0JBSU4sVUFBVTtzQkFEVCxNQUFNO2dCQUtQLFVBQVU7c0JBRFQsTUFBTTtnQkEwQk0sV0FBVztzQkFBdkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFJlbmRlcmVyMixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEZWZhdWx0Q29udHJvbENvbXBvbmVudCwgRHNmckkxOG5TZXJ2aWNlLCBuZXdVbmlxdWVJZCB9IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RzZnItZm9ybS11cGxvYWQsIGRzZnItdXBsb2FkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3VwbG9hZC5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRHNmclVwbG9hZENvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZV0sXG59KVxuZXhwb3J0IGNsYXNzIERzZnJVcGxvYWRDb21wb25lbnQgZXh0ZW5kcyBEZWZhdWx0Q29udHJvbENvbXBvbmVudDxhbnk+IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAvKiogQGludGVybmFsICovXG4gIEBWaWV3Q2hpbGQoJ2lucHV0RmlsZScsIHsgc3RhdGljOiB0cnVlIH0pXG4gIGlucHV0RmlsZTogRWxlbWVudFJlZjtcblxuICAvKipcbiAgICogQ2FjaGUgbGUgbGFiZWwgdmlzdWVsbGVtZW50IGVuIGxlIGxhaXNzYW50IGRpc3BvbmlibGUgYXV4IGxlY3RldXJzIGQnw6ljcmFuLlxuICAgKi9cbiAgQElucHV0KCkgbGFiZWxTck9ubHkgPSBmYWxzZTtcblxuICAvKipcbiAgICogQWpvdXRlciBsJ2F0dHJpYnV0ICdhcmlhLWludmFsaWQnIHN1ciBsZSBjaGFtcCBkZSBmb3JtdWxhaXJlLlxuICAgKi9cbiAgQElucHV0KCkgYXJpYUludmFsaWQ6IHN0cmluZztcblxuICAvKiogVGV4dGUgZCdlcnJldXIuICovXG4gIEBJbnB1dCgpIGVycm9yOiBzdHJpbmc7XG5cbiAgLyoqIFBlcm1ldCBsJ2Fqb3V0IGRlIHBsdXNpZXVycyBmaWNoaWVycyDDoCBsYSBmb2lzLiAqL1xuICBASW5wdXQoKSBtdWx0aXBsZSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBTcMOpY2lmaWUgdW4gZmlsdHJlIHBvdXIgbGVzIHR5cGVzIGRlIGZpY2hpZXJzIHF1ZSBsJ3V0aWxpc2F0ZXVyIHBldXQgc8OpbGVjdGlvbm5lci5cbiAgICpcbiAgICogQHNpbmNlIDEuOS4wXG4gICAqL1xuICBASW5wdXQoKSBhY2NlcHQ6IHN0cmluZztcblxuICAvKiogRXbDqW5lbWVudCDDqW1pcyDDoCBsYSBzw6lsZWN0aW9uIGQndW4gb3UgcGx1c2lldXJzIGZpY2hpZXJzLiAqL1xuICBAT3V0cHV0KClcbiAgZmlsZVNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZUxpc3Q+KCk7XG5cbiAgLyoqIEV2w6luZW1lbnQgw6ltaXMgbG9yc3F1ZSBsJ3V0aWxpc2F0ZXVyIGFubnVsZSBsYSBzw6lsZWN0aW9uLiAqL1xuICBAT3V0cHV0KClcbiAgZmlsZUNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZUxpc3Q+KCk7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBtZXNzYWdlc0dyb3VwSWQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9yZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSByZWFkb25seSBpMThuOiBEc2ZySTE4blNlcnZpY2UsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgKHNpbmNlIDEuNC4wKSB1dGlsaXNlciBoaW50IMOgIGxhIHBsYWNlLiAqL1xuICBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5oaW50O1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2NyaXB0aW9uIHBvdXIgbCd1cGxvYWQgKHByw6ljaXNlIGxlcyBjb250cmFpbnRlcyBhdSBuaXZlYXUgZHUgb3UgZGVzIGZpY2hpZXJzIGF0dGVuZHVzIDogZm9ybWF0LCBwb2lkcyBhdHRlbmR1cywgbm9tYnJlIGRlIGZpY2hpZXJzIHBvc3NpYmxl4oCmKS5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgKHNpbmNlIDEuNC4wKSB1dGlsaXNlciBoaW50IMOgIGxhIHBsYWNlLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIEBJbnB1dCgpIHNldCBkZXNjcmlwdGlvbih2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5oaW50ID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU3VyY2hhcmdlIHBlcm1ldHRhbnQgZGUgZ8OpcmVyIGxhIG1pc2Ugw6Agam91ciBkdSBET00uXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgb3ZlcnJpZGUgd3JpdGVWYWx1ZSh2YWx1ZTogYW55IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgLy8gYWZpbiBkZSBzZSBwcsOpbXVuaXIgZGVzIGluaXRpYWxpc2F0aW9ucyBhdmVjIHVuZSBjaGHDrm5lIGRlIGNhcmFjdMOocmVzICh2aWRlIG91IHBhcykgaWwgZmF1dCBzJ2Fzc3VyZXIgZHUgdHlwZVxuICAgIC8vIGQnYXJndW1lbnQgdHJhbnNtaXMgZW4gZW50csOpZSBldCBmb3JjZXIgbGEgY2hhw65uZSB2aWRlIGxlIGNhcyDDqWNow6lhbnRcbiAgICBjb25zdCBpc1R5cGVGaWxlTGlzdCA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkuaW5jbHVkZXMoRmlsZUxpc3QubmFtZSk7XG4gICAgaWYgKCFpc1R5cGVGaWxlTGlzdCkge1xuICAgICAgdmFsdWUgPSAnJztcbiAgICB9XG4gICAgc3VwZXIud3JpdGVWYWx1ZSh2YWx1ZSk7XG4gICAgaWYgKHRoaXMuaW5wdXRGaWxlKSB7XG4gICAgICBpZiAoaXNUeXBlRmlsZUxpc3QgJiYgdmFsdWU/Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmlucHV0RmlsZS5uYXRpdmVFbGVtZW50LCAnZmlsZXMnLCB2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmlucHV0RmlsZS5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCAnJyk7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuaW5wdXRGaWxlLm5hdGl2ZUVsZW1lbnQsICdmaWxlcycsIG51bGwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICB0aGlzLm5hbWUgPz89ICdmaWxlLXVwbG9hZCc7IC8vICdmaWxlLXVwbG9hZCcgZXN0IGxhIHZhbGV1ciBzdGF0aXF1ZSBqdXNxdSdlbiAxLjNcbiAgICB0aGlzLm1lc3NhZ2VzR3JvdXBJZCA9IG5ld1VuaXF1ZUlkKCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG5nT25DaGFuZ2VzKHsgbGFiZWwsIGhpbnQgfTogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChsYWJlbCkgdGhpcy5sYWJlbCB8fD0gdGhpcy5pMThuLnQoJ3VwbG9hZC5sYWJlbCcpOyAvLyBkZWZhdWx0XG4gICAgaWYgKGhpbnQpIHRoaXMuaGludCB8fD0gdGhpcy5pMThuLnQoJ3VwbG9hZC5oaW50Jyk7IC8vIGRlZmF1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJtZXQgZGUgcHJvZ3JhbW1hdGlxdWVtZW50IHLDqWluaXRpYWxpc2VyIGxlIGNoYW1wIGFwcsOocyB1bmUgc8OpbGVjdGlvbiBkZSBmaWNoaWVyKHMpLlxuICAgKi9cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5pbnB1dEZpbGUubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBvbkNhbmNlbCgpIHtcbiAgICB0aGlzLmZpbGVDYW5jZWwuZW1pdCgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBvbkZpbGVDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gPEhUTUxJbnB1dEVsZW1lbnQ+ZXZlbnQudGFyZ2V0O1xuICAgIHRoaXMudmFsdWUgPSB0YXJnZXQuZmlsZXMgPz8gdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLnZhbHVlKSB0aGlzLmZpbGVTZWxlY3QuZW1pdCh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgaGFzTWVzc2FnZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5lcnJvcjtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZyLXVwbG9hZC1ncm91cFwiIFtuZ0NsYXNzXT1cInsgJ2ZyLWlucHV0LWdyb3VwLS1lcnJvcic6IGVycm9yLCAnZnItaW5wdXQtZ3JvdXAtLWRpc2FibGVkJzogZGlzYWJsZWQgfVwiPlxuICA8bGFiZWwgY2xhc3M9XCJmci1sYWJlbFwiIFtuZ0NsYXNzXT1cInsgJ2ZyLXNyLW9ubHknOiBsYWJlbFNyT25seSB9XCIgW2Zvcl09XCJpbnB1dElkXCJcbiAgICA+e3sgbGFiZWwgfX1cbiAgICA8c3BhbiBjbGFzcz1cImZyLWhpbnQtdGV4dFwiPnt7IGhpbnQgfX08L3NwYW4+XG4gIDwvbGFiZWw+XG4gIDwhLS1cbiAgICAgIE9uIGJpbmQgw6AgbGEgZm9pcyBsYSBwcm9wcmnDqXTDqSBldCBsJ2F0dHJpYnV0ICduYW1lJyBwb3VyIGNvbnRvdXJuZXIgbGUgYnVnIHN1aXZhbnQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzExNzU3XG4gICAgICBjZi4gaXNzdWUjMzYwXG4gICAgICAtLT5cbiAgPGlucHV0XG4gICAgI2lucHV0RmlsZVxuICAgIGNsYXNzPVwiZnItdXBsb2FkXCJcbiAgICB0eXBlPVwiZmlsZVwiXG4gICAgW2lkXT1cImlucHV0SWQgfHwgbnVsbFwiXG4gICAgW25hbWVdPVwibmFtZSB8fCBudWxsXCJcbiAgICBbYXR0ci5uYW1lXT1cIm5hbWUgfHwgbnVsbFwiXG4gICAgW211bHRpcGxlXT1cIm11bHRpcGxlXCJcbiAgICBbYXR0ci5hY2NlcHRdPVwiYWNjZXB0IHx8IG51bGxcIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJoYXNNZXNzYWdlcygpID8gbWVzc2FnZXNHcm91cElkIDogbnVsbFwiXG4gICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cImFyaWFJbnZhbGlkIHx8IG51bGxcIlxuICAgIChjaGFuZ2UpPVwib25GaWxlQ2hhbmdlKCRldmVudClcIlxuICAgIChjYW5jZWwpPVwib25DYW5jZWwoKVwiIC8+XG4gIEBpZiAoaGFzTWVzc2FnZXMoKSkge1xuICAgIDxwIFtpZF09XCJtZXNzYWdlc0dyb3VwSWRcIiBjbGFzcz1cImZyLWVycm9yLXRleHRcIj5cbiAgICAgIHt7IGVycm9yIH19XG4gICAgPC9wPlxuICB9XG48L2Rpdj5cbiJdfQ==