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

120 lines 20.8 kB
import { CommonModule } from '@angular/common'; import { Component, EventEmitter, Inject, Input, Output, ViewEncapsulation } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { DsfrFormRadioRichComponent } from '../../forms/form-radio-rich'; import { DsfrI18nPipe, LocalStorage, StorageEnum, isOnBrowser } from '../../shared'; import { DSFR_CONFIG_TOKEN } from '../../shared/config/config-token'; import * as i0 from "@angular/core"; import * as i1 from "../../shared"; import * as i2 from "@angular/forms"; export const DISPLAY_MODAL_ID = 'theme-modal-id'; export class DsfrDisplayComponent { /** @internal */ constructor(config, i18n, elementRef) { this.config = config; this.i18n = i18n; this.elementRef = elementRef; /** * l'identifiant de la modale portant les paramètres d'affichage. */ this.displayId = DISPLAY_MODAL_ID; /** * Événement émis lorsque le thème change avec la valeur du nouveau thème : `light`, `dark` ou `system`. */ this.displayChange = new EventEmitter(); /** @internal */ this.themes = [ { value: 'light', label: this.i18n.t('display.light.label'), link: '/pictograms/environment/sun.svg', deprecatedLink: '/sun.svg', }, { value: 'dark', label: this.i18n.t('display.dark.label'), link: '/pictograms/environment/moon.svg', deprecatedLink: '/moon.svg', }, { value: 'system', label: this.i18n.t('display.system.label'), hint: this.i18n.t('display.system.hint'), link: '/pictograms/system/system.svg', deprecatedLink: '/system.svg', }, ]; this._useDeprecatedLink = false; } get pictoPath() { return this.artworkDirPath; } /** * Chemin des pictogrammes (du composant display) renseigné par le développeur. * * Note: ce chemin doit permettre de récupérer directement les fichiers SVG suivants : moon.svg, sun.svg, system.svg * * @deprecated Use `artworkDirPath` instead. */ set pictoPath(path) { this.artworkDirPath = path; this._useDeprecatedLink = true; } ngOnInit() { this.initDisplayTheme(); if (this.artworkDirPath === undefined) { this.artworkDirPath = this.config.artworkDirPath; } for (let theme of this.themes) { theme.artworkFilePath = this.buildSvgPath(theme); } } /** @internal */ onChange() { this.setHtmlSchemeAttribute(this.currentTheme); this.displayChange.emit(this.currentTheme); } /** @internal */ buildSvgPath(theme) { return this.artworkDirPath + (this._useDeprecatedLink ? theme.deprecatedLink : theme.link); } initDisplayTheme() { if (!isOnBrowser()) return; // Si l’utilisateur effectue une modification, son choix est conservé (dans le local storage) pour les visites ultérieures. let savedTheme = LocalStorage.get(StorageEnum.SCHEME); if (savedTheme) { this.setHtmlSchemeAttribute(savedTheme); } // Sinon on prend le theme de la balise HTML else { const nativeElt = this.elementRef?.nativeElement; const html = nativeElt?.ownerDocument?.documentElement; savedTheme = html?.getAttribute('data-fr-scheme'); } this.currentTheme = savedTheme || 'system'; } setHtmlSchemeAttribute(value) { const nativeElt = this.elementRef?.nativeElement; const html = nativeElt?.ownerDocument?.documentElement; html?.setAttribute('data-fr-scheme', value); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrDisplayComponent, deps: [{ token: DSFR_CONFIG_TOKEN }, { token: i1.DsfrI18nService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DsfrDisplayComponent, isStandalone: true, selector: "dsfr-display", inputs: { displayId: "displayId", artworkDirPath: "artworkDirPath", pictoPath: "pictoPath" }, outputs: { displayChange: "displayChange" }, ngImport: i0, template: "<dialog [id]=\"displayId\" class=\"fr-modal\" role=\"dialog\" [attr.aria-labelledby]=\"displayId + '-title'\">\n <div class=\"fr-container fr-container--fluid fr-container-md\">\n <div class=\"fr-grid-row fr-grid-row--center\">\n <div class=\"fr-col-12 fr-col-md-6 fr-col-lg-4\">\n <div class=\"fr-modal__body\">\n <div class=\"fr-modal__header\">\n <button\n type=\"button\"\n class=\"fr-btn--close fr-btn\"\n [attr.aria-controls]=\"displayId\"\n [title]=\"'commons.close' | dsfrI18n\">\n {{ 'commons.close' | dsfrI18n }}\n </button>\n </div>\n <div class=\"fr-modal__content\">\n <h1 [id]=\"displayId + '-title'\" class=\"fr-modal__title\">{{ 'display.heading' | dsfrI18n }}</h1>\n <dsfr-form-radio-rich\n [inputId]=\"displayId + '-fieldset'\"\n legend=\" {{ 'display.hint' | dsfrI18n }}\"\n [name]=\"displayId + '-options'\"\n [options]=\"themes\"\n [legendRegular]=\"true\"\n [required]=\"true\"\n (change)=\"onChange()\"\n [(ngModel)]=\"currentTheme\">\n </dsfr-form-radio-rich>\n </div>\n </div>\n </div>\n </div>\n </div>\n</dialog>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: DsfrI18nPipe, name: "dsfrI18n" }, { kind: "component", type: DsfrFormRadioRichComponent, selector: "dsfr-form-radio-rich", inputs: ["options", "message", "messageSeverity", "radioRich"] }], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrDisplayComponent, decorators: [{ type: Component, args: [{ selector: 'dsfr-display', encapsulation: ViewEncapsulation.None, standalone: true, imports: [CommonModule, FormsModule, DsfrI18nPipe, DsfrFormRadioRichComponent], template: "<dialog [id]=\"displayId\" class=\"fr-modal\" role=\"dialog\" [attr.aria-labelledby]=\"displayId + '-title'\">\n <div class=\"fr-container fr-container--fluid fr-container-md\">\n <div class=\"fr-grid-row fr-grid-row--center\">\n <div class=\"fr-col-12 fr-col-md-6 fr-col-lg-4\">\n <div class=\"fr-modal__body\">\n <div class=\"fr-modal__header\">\n <button\n type=\"button\"\n class=\"fr-btn--close fr-btn\"\n [attr.aria-controls]=\"displayId\"\n [title]=\"'commons.close' | dsfrI18n\">\n {{ 'commons.close' | dsfrI18n }}\n </button>\n </div>\n <div class=\"fr-modal__content\">\n <h1 [id]=\"displayId + '-title'\" class=\"fr-modal__title\">{{ 'display.heading' | dsfrI18n }}</h1>\n <dsfr-form-radio-rich\n [inputId]=\"displayId + '-fieldset'\"\n legend=\" {{ 'display.hint' | dsfrI18n }}\"\n [name]=\"displayId + '-options'\"\n [options]=\"themes\"\n [legendRegular]=\"true\"\n [required]=\"true\"\n (change)=\"onChange()\"\n [(ngModel)]=\"currentTheme\">\n </dsfr-form-radio-rich>\n </div>\n </div>\n </div>\n </div>\n </div>\n</dialog>\n" }] }], ctorParameters: () => [{ type: undefined, decorators: [{ type: Inject, args: [DSFR_CONFIG_TOKEN] }] }, { type: i1.DsfrI18nService }, { type: i0.ElementRef }], propDecorators: { displayId: [{ type: Input }], artworkDirPath: [{ type: Input }], displayChange: [{ type: Output }], pictoPath: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGxheS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZHNmci1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9kaXNwbGF5L2Rpc3BsYXkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvZGlzcGxheS9kaXNwbGF5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0SCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDekUsT0FBTyxFQUFFLFlBQVksRUFBbUIsWUFBWSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDckcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7Ozs7QUFHckUsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7QUFXakQsTUFBTSxPQUFPLG9CQUFvQjtJQWtEL0IsZ0JBQWdCO0lBQ2hCLFlBQ3FDLE1BQWtCLEVBQzlDLElBQXFCLEVBQ3BCLFVBQXNCO1FBRkssV0FBTSxHQUFOLE1BQU0sQ0FBWTtRQUM5QyxTQUFJLEdBQUosSUFBSSxDQUFpQjtRQUNwQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBckRoQzs7V0FFRztRQUNNLGNBQVMsR0FBRyxnQkFBZ0IsQ0FBQztRQU90Qzs7V0FFRztRQUNPLGtCQUFhLEdB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SUFFTyxzQkFBc0IsQ0FBQyxLQUFtQjtRQUNoRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQztRQUNqRCxNQUFNLElBQUksR0FBRyxTQUFTLEVBQUUsYUFBYSxFQUFFLGVBQWUsQ0FBQztRQUN2RCxJQUFJLEVBQUUsWUFBWSxDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzlDLENBQUM7K0dBdEhVLG9CQUFvQixrQkFvRHJCLGlCQUFpQjttR0FwRGhCLG9CQUFvQixtTkNuQmpDLHV6Q0FnQ0EsMkNEZlksWUFBWSw4QkFBRSxXQUFXLHVqQkFBRSxZQUFZLGlEQUFFLDBCQUEwQjs7NEZBRWxFLG9CQUFvQjtrQkFQaEMsU0FBUzsrQkFDRSxjQUFjLGlCQUVULGlCQUFpQixDQUFDLElBQUksY0FDekIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsMEJBQTBCLENBQUM7OzBCQXNEM0UsTUFBTTsyQkFBQyxpQkFBaUI7Z0dBaERsQixTQUFTO3NCQUFqQixLQUFLO2dCQUtHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBS0ksYUFBYTtzQkFBdEIsTUFBTTtnQkFzRE0sU0FBUztzQkFBckIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERzZnJGb3JtUmFkaW9SaWNoQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vZm9ybXMvZm9ybS1yYWRpby1yaWNoJztcbmltcG9ydCB7IERzZnJJMThuUGlwZSwgRHNmckkxOG5TZXJ2aWNlLCBMb2NhbFN0b3JhZ2UsIFN0b3JhZ2VFbnVtLCBpc09uQnJvd3NlciB9IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBEU0ZSX0NPTkZJR19UT0tFTiB9IGZyb20gJy4uLy4uL3NoYXJlZC9jb25maWcvY29uZmlnLXRva2VuJztcbmltcG9ydCB7IERzZnJDb25maWcgfSBmcm9tICcuLi8uLi9zaGFyZWQvY29uZmlnL2NvbmZpZy5tb2RlbCc7XG5cbmV4cG9ydCBjb25zdCBESVNQTEFZX01PREFMX0lEID0gJ3RoZW1lLW1vZGFsLWlkJztcblxudHlwZSBEaXNwbGF5VGhlbWUgPSAnbGlnaHQnIHwgJ2RhcmsnIHwgJ3N5c3RlbSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RzZnItZGlzcGxheScsXG4gIHRlbXBsYXRlVXJsOiAnLi9kaXNwbGF5LmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIERzZnJJMThuUGlwZSwgRHNmckZvcm1SYWRpb1JpY2hDb21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBEc2ZyRGlzcGxheUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8qKlxuICAgKiBsJ2lkZW50aWZpYW50IGRlIGxhIG1vZGFsZSBwb3J0YW50IGxlcyBwYXJhbcOodHJlcyBkJ2FmZmljaGFnZS5cbiAgICovXG4gIEBJbnB1dCgpIGRpc3BsYXlJZCA9IERJU1BMQVlfTU9EQUxfSUQ7XG5cbiAgLyoqXG4gICAqIENoZW1pbiB2ZXJzIGxlIHLDqXBlcnRvaXJlIGV4cG9zYW50IGxlcyBwaWN0b2dyYW1tZXMgaWxsdXN0cmF0aWZzIERTRlIuXG4gICAqL1xuICBASW5wdXQoKSBhcnR3b3JrRGlyUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiDDiXbDqW5lbWVudCDDqW1pcyBsb3JzcXVlIGxlIHRow6htZSBjaGFuZ2UgYXZlYyBsYSB2YWxldXIgZHUgbm91dmVhdSB0aMOobWUgOiBgbGlnaHRgLCBgZGFya2Agb3UgYHN5c3RlbWAuXG4gICAqL1xuICBAT3V0cHV0KCkgZGlzcGxheUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBUaMOobWUgY291cmFudCBkdSBjb21wb3NhbnQuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgY3VycmVudFRoZW1lOiBEaXNwbGF5VGhlbWU7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICB0aGVtZXM6IGFueVtdID0gW1xuICAgIHtcbiAgICAgIHZhbHVlOiAnbGlnaHQnLFxuICAgICAgbGFiZWw6IHRoaXMuaTE4bi50KCdkaXNwbGF5LmxpZ2h0LmxhYmVsJyksXG4gICAgICBsaW5rOiAnL3BpY3RvZ3JhbXMvZW52aXJvbm1lbnQvc3VuLnN2ZycsXG4gICAgICBkZXByZWNhdGVkTGluazogJy9zdW4uc3ZnJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHZhbHVlOiAnZGFyaycsXG4gICAgICBsYWJlbDogdGhpcy5pMThuLnQoJ2Rpc3BsYXkuZGFyay5sYWJlbCcpLFxuICAgICAgbGluazogJy9waWN0b2dyYW1zL2Vudmlyb25tZW50L21vb24uc3ZnJyxcbiAgICAgIGRlcHJlY2F0ZWRMaW5rOiAnL21vb24uc3ZnJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHZhbHVlOiAnc3lzdGVtJyxcbiAgICAgIGxhYmVsOiB0aGlzLmkxOG4udCgnZGlzcGxheS5zeXN0ZW0ubGFiZWwnKSxcbiAgICAgIGhpbnQ6IHRoaXMuaTE4bi50KCdkaXNwbGF5LnN5c3RlbS5oaW50JyksXG4gICAgICBsaW5rOiAnL3BpY3RvZ3JhbXMvc3lzdGVtL3N5c3RlbS5zdmcnLFxuICAgICAgZGVwcmVjYXRlZExpbms6ICcvc3lzdGVtLnN2ZycsXG4gICAgfSxcbiAgXTtcblxuICAvKiogQGludGVybmFsICovIF9zdmdSb290UGF0aDogc3RyaW5nO1xuXG4gIHByaXZhdGUgX3VzZURlcHJlY2F0ZWRMaW5rID0gZmFsc2U7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KERTRlJfQ09ORklHX1RPS0VOKSBwcml2YXRlIGNvbmZpZzogRHNmckNvbmZpZyxcbiAgICBwdWJsaWMgaTE4bjogRHNmckkxOG5TZXJ2aWNlLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgKSB7fVxuXG4gIGdldCBwaWN0b1BhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hcnR3b3JrRGlyUGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVtaW4gZGVzIHBpY3RvZ3JhbW1lcyAoZHUgY29tcG9zYW50IGRpc3BsYXkpIHJlbnNlaWduw6kgcGFyIGxlIGTDqXZlbG9wcGV1ci5cbiAgICpcbiAgICogTm90ZTogY2UgY2hlbWluIGRvaXQgcGVybWV0dHJlIGRlIHLDqWN1cMOpcmVyIGRpcmVjdGVtZW50IGxlcyBmaWNoaWVycyBTVkcgc3VpdmFudHMgOiBtb29uLnN2Zywgc3VuLnN2Zywgc3lzdGVtLnN2Z1xuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYGFydHdvcmtEaXJQYXRoYCBpbnN0ZWFkLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IHBpY3RvUGF0aChwYXRoOiBzdHJpbmcpIHtcbiAgICB0aGlzLmFydHdvcmtEaXJQYXRoID0gcGF0aDtcbiAgICB0aGlzLl91c2VEZXByZWNhdGVkTGluayA9IHRydWU7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXREaXNwbGF5VGhlbWUoKTtcbiAgICBpZiAodGhpcy5hcnR3b3JrRGlyUGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmFydHdvcmtEaXJQYXRoID0gdGhpcy5jb25maWcuYXJ0d29ya0RpclBhdGg7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgdGhlbWUgb2YgdGhpcy50aGVtZXMpIHtcbiAgICAgIHRoZW1lLmFydHdvcmtGaWxlUGF0aCA9IHRoaXMuYnVpbGRTdmdQYXRoKHRoZW1lKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG9uQ2hhbmdlKCkge1xuICAgIHRoaXMuc2V0SHRtbFNjaGVtZUF0dHJpYnV0ZSh0aGlzLmN1cnJlbnRUaGVtZSk7XG4gICAgdGhpcy5kaXNwbGF5Q2hhbmdlLmVtaXQodGhpcy5jdXJyZW50VGhlbWUpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZFN2Z1BhdGgodGhlbWU6IGFueSkge1xuICAgIHJldHVybiB0aGlzLmFydHdvcmtEaXJQYXRoICsgKHRoaXMuX3VzZURlcHJlY2F0ZWRMaW5rID8gdGhlbWUuZGVwcmVjYXRlZExpbmsgOiB0aGVtZS5saW5rKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdERpc3BsYXlUaGVtZSgpOiB2b2lkIHtcbiAgICBpZiAoIWlzT25Ccm93c2VyKCkpIHJldHVybjtcblxuICAgIC8vIFNpIGzigJl1dGlsaXNhdGV1ciBlZmZlY3R1ZSB1bmUgbW9kaWZpY2F0aW9uLCBzb24gY2hvaXggZXN0IGNvbnNlcnbDqSAoZGFucyBsZSBsb2NhbCBzdG9yYWdlKSBwb3VyIGxlcyB2aXNpdGVzIHVsdMOpcmlldXJlcy5cbiAgICBsZXQgc2F2ZWRUaGVtZSA9IDxEaXNwbGF5VGhlbWU+TG9jYWxTdG9yYWdlLmdldChTdG9yYWdlRW51bS5TQ0hFTUUpO1xuICAgIGlmIChzYXZlZFRoZW1lKSB7XG4gICAgICB0aGlzLnNldEh0bWxTY2hlbWVBdHRyaWJ1dGUoc2F2ZWRUaGVtZSk7XG4gICAgfVxuXG4gICAgLy8gU2lub24gb24gcHJlbmQgbGUgdGhlbWUgZGUgbGEgYmFsaXNlIEhUTUxcbiAgICBlbHNlIHtcbiAgICAgIGNvbnN0IG5hdGl2ZUVsdCA9IHRoaXMuZWxlbWVudFJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGNvbnN0IGh0bWwgPSBuYXRpdmVFbHQ/Lm93bmVyRG9jdW1lbnQ/LmRvY3VtZW50RWxlbWVudDtcbiAgICAgIHNhdmVkVGhlbWUgPSBodG1sPy5nZXRBdHRyaWJ1dGUoJ2RhdGEtZnItc2NoZW1lJyk7XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50VGhlbWUgPSBzYXZlZFRoZW1lIHx8ICdzeXN0ZW0nO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRIdG1sU2NoZW1lQXR0cmlidXRlKHZhbHVlOiBEaXNwbGF5VGhlbWUpIHtcbiAgICBjb25zdCBuYXRpdmVFbHQgPSB0aGlzLmVsZW1lbnRSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgaHRtbCA9IG5hdGl2ZUVsdD8ub3duZXJEb2N1bWVudD8uZG9jdW1lbnRFbGVtZW50O1xuICAgIGh0bWw/LnNldEF0dHJpYnV0ZSgnZGF0YS1mci1zY2hlbWUnLCB2YWx1ZSk7XG4gIH1cbn1cbiIsIjxkaWFsb2cgW2lkXT1cImRpc3BsYXlJZFwiIGNsYXNzPVwiZnItbW9kYWxcIiByb2xlPVwiZGlhbG9nXCIgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImRpc3BsYXlJZCArICctdGl0bGUnXCI+XG4gIDxkaXYgY2xhc3M9XCJmci1jb250YWluZXIgZnItY29udGFpbmVyLS1mbHVpZCBmci1jb250YWluZXItbWRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZnItZ3JpZC1yb3cgZnItZ3JpZC1yb3ctLWNlbnRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZyLWNvbC0xMiBmci1jb2wtbWQtNiBmci1jb2wtbGctNFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnItbW9kYWxfX2JvZHlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnItbW9kYWxfX2hlYWRlclwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmci1idG4tLWNsb3NlIGZyLWJ0blwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiZGlzcGxheUlkXCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidjb21tb25zLmNsb3NlJyB8IGRzZnJJMThuXCI+XG4gICAgICAgICAgICAgIHt7ICdjb21tb25zLmNsb3NlJyB8IGRzZnJJMThuIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnItbW9kYWxfX2NvbnRlbnRcIj5cbiAgICAgICAgICAgIDxoMSBbaWRdPVwiZGlzcGxheUlkICsgJy10aXRsZSdcIiBjbGFzcz1cImZyLW1vZGFsX190aXRsZVwiPnt7ICdkaXNwbGF5LmhlYWRpbmcnIHwgZHNmckkxOG4gfX08L2gxPlxuICAgICAgICAgICAgPGRzZnItZm9ybS1yYWRpby1yaWNoXG4gICAgICAgICAgICAgIFtpbnB1dElkXT1cImRpc3BsYXlJZCArICctZmllbGRzZXQnXCJcbiAgICAgICAgICAgICAgbGVnZW5kPVwiIHt7ICdkaXNwbGF5LmhpbnQnIHwgZHNmckkxOG4gfX1cIlxuICAgICAgICAgICAgICBbbmFtZV09XCJkaXNwbGF5SWQgKyAnLW9wdGlvbnMnXCJcbiAgICAgICAgICAgICAgW29wdGlvbnNdPVwidGhlbWVzXCJcbiAgICAgICAgICAgICAgW2xlZ2VuZFJlZ3VsYXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkNoYW5nZSgpXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjdXJyZW50VGhlbWVcIj5cbiAgICAgICAgICAgIDwvZHNmci1mb3JtLXJhZGlvLXJpY2g+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaWFsb2c+XG4iXX0=