@cisstech/nge
Version:
NG Essentials is a collection of libraries for Angular developers.
131 lines • 18.7 kB
JavaScript
import { InjectionToken, Injectable, Inject, Optional } from '@angular/core';
import { NGE_MARKDOWN_CONTRIBUTION } from '../nge-markdown-contribution';
import * as i0 from "@angular/core";
const DATA_LINES = 'data-nge-md-hl-lines';
const DATA_LANGUAGE = 'data-nge-md-hl-language';
const DATA_HIGHLIGHTS = 'data-nge-md-hl-highlights';
const DATA_FILENAME = 'data-nge-md-hl-filename';
/**
* Injection token to register a highlighter service.
*/
export const NGE_MARKDOWN_HIGHLIGHTER_SERVICE = new InjectionToken('NGE_MARKDOWN_HIGHLIGHTER_SERVICE');
/**
* Contribution to add an abstract syntax highlighter.
*/
export class NgeMarkdownHighlighter {
constructor(injector, options) {
this.injector = injector;
this.options = options;
}
contribute(transformer) {
this.createAttributes(transformer);
this.colorizeCodes(transformer);
}
createAttributes(transformer) {
transformer.addRendererTransformer((renderer) => {
renderer.code = (code, args) => {
args = args || '';
const attributes = new Map();
// LANGUAGE
const language = args.split(' ').slice(0, 1).pop() || 'plaintext';
attributes.set(DATA_LANGUAGE, language);
// LINE NUMBERING
let match = args.match(/lines="(.+?)"/);
if (match) {
attributes.set(DATA_LINES, match[1]);
}
// LINE HIGHLIGHTING
match = args.match(/highlights="(.+?)"/);
if (match) {
attributes.set(DATA_HIGHLIGHTS, match[1]);
}
// FILENAME
match = args.match(/filename="(.+?)"/);
if (match) {
attributes.set(DATA_FILENAME, match[1]);
}
const attribs = Array.from(attributes.entries())
.map(([attributeName, attributeValue]) => {
return `${attributeName}="${attributeValue}"`;
})
.join(' ');
console.log(attribs);
return `<pre ${attribs}><code>${this.escapeHtml(code)}</code></pre>`;
};
return renderer;
});
}
colorizeCodes(transformer) {
if (!this.options?.highligtht) {
return;
}
const highlight = this.options.highligtht;
transformer.addHtmlTransformer(async (element) => {
const preElements = Array.from(element.querySelectorAll(`pre[${DATA_LANGUAGE}]`));
for (const pre of preElements) {
highlight(this.injector, {
lines: pre.getAttribute(DATA_LINES) || '',
element: pre.querySelector('code'),
language: pre.getAttribute(DATA_LANGUAGE) || 'plaintext',
highlights: pre.getAttribute(DATA_HIGHLIGHTS) || '',
filename: pre.getAttribute(DATA_FILENAME) || '',
});
}
});
}
escapeHtml(input) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const map = {
'<': '<',
'>': '>',
};
return input.replace(/[<>]/g, (tag) => map[tag] || tag);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: NgeMarkdownHighlighter, deps: [{ token: i0.Injector }, { token: NGE_MARKDOWN_HIGHLIGHTER_SERVICE, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: NgeMarkdownHighlighter }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: NgeMarkdownHighlighter, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: i0.Injector }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [NGE_MARKDOWN_HIGHLIGHTER_SERVICE]
}] }] });
/**
* Injection token to register `NgeMarkdownHighlighter` contribution.
*/
export const NgeMarkdownHighlighterProvider = {
provide: NGE_MARKDOWN_CONTRIBUTION,
multi: true,
useClass: NgeMarkdownHighlighter,
};
/**
* Provider to register `NgeMonacoColorizerService` as the syntax highlighter.
* @param type A reference to NgeMonacoColorizerService type.
*/
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export function NgeMarkdownHighlighterMonacoProvider(type) {
return {
provide: NGE_MARKDOWN_HIGHLIGHTER_SERVICE,
useValue: {
highligtht: (injector, options) => {
const colorizer = injector.get(type, null);
const code = options.element;
const pre = code.parentElement;
pre.style.margin = '0.5em 0';
pre.style.overflow = 'auto';
pre.style.border = '1px solid #F2F2F2';
colorizer?.colorizeElement({
element: code,
language: options.language,
code: code.textContent,
lines: options.lines,
filename: options.filename,
highlights: options.highlights,
});
},
},
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdlLW1hcmtkb3duLWhpZ2hsaWdodGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmdlL21hcmtkb3duL3NyYy9jb250cmlidXRpb25zL25nZS1tYXJrZG93bi1oaWdobGlnaHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVksY0FBYyxFQUFFLFVBQVUsRUFBWSxNQUFNLEVBQUUsUUFBUSxFQUFRLE1BQU0sZUFBZSxDQUFBO0FBRXRHLE9BQU8sRUFBMkIseUJBQXlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTs7QUFFakcsTUFBTSxVQUFVLEdBQUcsc0JBQXNCLENBQUE7QUFDekMsTUFBTSxhQUFhLEdBQUcseUJBQXlCLENBQUE7QUFDL0MsTUFBTSxlQUFlLEdBQUcsMkJBQTJCLENBQUE7QUFDbkQsTUFBTSxhQUFhLEdBQUcseUJBQXlCLENBQUE7QUFtRS9DOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsSUFBSSxjQUFjLENBQ2hFLGtDQUFrQyxDQUNuQyxDQUFBO0FBRUQ7O0dBRUc7QUFFSCxNQUFNLE9BQU8sc0JBQXNCO0lBQ2pDLFlBQ21CLFFBQWtCLEVBR2xCLE9BQXNDO1FBSHRDLGFBQVEsR0FBUixRQUFRLENBQVU7UUFHbEIsWUFBTyxHQUFQLE9BQU8sQ0FBK0I7SUFDdEQsQ0FBQztJQUVKLFVBQVUsQ0FBQyxXQUFtQztRQUM1QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDbEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUNqQyxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsV0FBbUM7UUFDMUQsV0FBVyxDQUFDLHNCQUFzQixDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDOUMsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRTtnQkFDN0IsSUFBSSxH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QUMzQixHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQTtnQkFDdEMsU0FBUyxFQUFFLGVBQWUsQ0FBQztvQkFDekIsT0FBTyxFQUFFLElBQUk7b0JBQ2IsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO29CQUMxQixJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVc7b0JBQ3RCLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztvQkFDcEIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO29CQUMxQixVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7aUJBQy9CLENBQUMsQ0FBQTtZQUNKLENBQUM7U0FDK0I7S0FDbkMsQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RvciwgSW5qZWN0aW9uVG9rZW4sIEluamVjdGFibGUsIFByb3ZpZGVyLCBJbmplY3QsIE9wdGlvbmFsLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IE5nZU1hcmtkb3duVHJhbnNmb3JtZXIgfSBmcm9tICcuLi9uZ2UtbWFya2Rvd24tdHJhbnNmb3JtZXInXG5pbXBvcnQgeyBOZ2VNYXJrZG93bkNvbnRyaWJ1dGlvbiwgTkdFX01BUktET1dOX0NPTlRSSUJVVElPTiB9IGZyb20gJy4uL25nZS1tYXJrZG93bi1jb250cmlidXRpb24nXG5cbmNvbnN0IERBVEFfTElORVMgPSAnZGF0YS1uZ2UtbWQtaGwtbGluZXMnXG5jb25zdCBEQVRBX0xBTkdVQUdFID0gJ2RhdGEtbmdlLW1kLWhsLWxhbmd1YWdlJ1xuY29uc3QgREFUQV9ISUdITElHSFRTID0gJ2RhdGEtbmdlLW1kLWhsLWhpZ2hsaWdodHMnXG5jb25zdCBEQVRBX0ZJTEVOQU1FID0gJ2RhdGEtbmdlLW1kLWhsLWZpbGVuYW1lJ1xuXG4vKipcbiAqIEhpZ2hsaWdodCBvcHRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5nZU1hcmtkb3duSGlnaGxpZ2h0T3B0aW9ucyB7XG4gIC8qKiAmbHQ7Y29kZSZndDsmbHQ7L2NvZGUmZ3Q7IGVsZW1lbnQgdG8gY29sb3JpemUuICovXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50XG5cbiAgLyoqIFRhcmdldCBsYW5ndWFnZSAoZGVmYXVsdCBwbGFpbnRleHQpICovXG4gIGxhbmd1YWdlPzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIFN0YXJ0IGxpbmUgbnVtYmVyIG9yIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgbGluZSBudW1iZXJzIHRvIHNob3cuXG4gICAqXG4gICAqIEV4YW1wbGU6XG4gICAqXG4gICAqICpTaG93IGFsbCBsaW5lIG51bWJlcnMgc3RhcnRpbmcgMSpcbiAgICpcbiAgICogYFwiMVwiYFxuICAgKlxuICAgKiAqU2hvdyBhbGwgbGluZSBudW1iZXJzIGZyb20gMSB0byA0KlxuICAgKlxuICAgKiBgXCIxLTRcImBcbiAgICpcbiAgICogKlNob3cgbGluZXMgMiA0IDUgNiA3IDkqXG4gICAqXG4gICAqIGBcIjIgNC03IDlcImBcbiAgICpcbiAgICovXG4gIGxpbmVzPzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIEEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgbGluZSBudW1iZXJzIHRvIGhpZ2hsaWdodC5cbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICpcbiAgICogKkhpZ2hsaWdodCBsaW5lIDEqXG4gICAqXG4gICAqIGBcIjFcImBcbiAgICpcbiAgICogKkhpZ2hsaWdodCBhbGwgbGluZXMgZnJvbSAxIHRvIDQqXG4gICAqXG4gICAqIGBcIjEtNFwiYFxuICAgKlxuICAgKiAqSGlnaGxpZ2h0dyBsaW5lcyAyIDQgNSA2IDcgOSpcbiAgICpcbiAgICogYFwiMiA0LTcgOVwiYFxuICAgKi9cbiAgaGlnaGxpZ2h0cz86IHN0cmluZ1xuXG4gIC8qKiBGaWxlbmFtZSB0byBkaXNwbGF5ICovXG4gIGZpbGVuYW1lPzogc3RyaW5nXG59XG5cbi8qKlxuICogSGlnaGxpZ2h0ZXIgc2VydmljZSByZXByZXNlbnRhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZ2VNYXJrZG93bkhpZ2hsaWdodGVyU2VydmljZSB7XG4gIC8qKlxuICAgKiBGdW5jdGlvbiBjYWxsZWQgdG8gaGlnaHRsaWdodCBhbiBIVE1MRWxlbWVudCBjb2RlLlxuICAgKiBAcGFyYW0gaW5qZWN0b3IgSW5qZWN0b3IgcmVmZXJlbmNlIHRvIHVzZSBBbmd1bGFyIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBIaWdobGlnaHQgb3B0aW9ucy5cbiAgICovXG4gIGhpZ2hsaWd0aHQ/KGluamVjdG9yOiBJbmplY3Rvciwgb3B0aW9uczogTmdlTWFya2Rvd25IaWdobGlnaHRPcHRpb25zKTogdm9pZCB8IFByb21pc2U8dm9pZD5cbn1cblxuLyoqXG4gKiBJbmplY3Rpb24gdG9rZW4gdG8gcmVnaXN0ZXIgYSBoaWdobGlnaHRlciBzZXJ2aWNlLlxuICovXG5leHBvcnQgY29uc3QgTkdFX01BUktET1dOX0hJR0hMSUdIVEVSX1NFUlZJQ0UgPSBuZXcgSW5qZWN0aW9uVG9rZW48TmdlTWFya2Rvd25IaWdobGlnaHRlclNlcnZpY2U+KFxuICAnTkdFX01BUktET1dOX0hJR0hMSUdIVEVSX1NFUlZJQ0UnXG4pXG5cbi8qKlxuICogQ29udHJpYnV0aW9uIHRvIGFkZCBhbiBhYnN0cmFjdCBzeW50YXggaGlnaGxpZ2h0ZXIuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBOZ2VNYXJrZG93bkhpZ2hsaWdodGVyIGltcGxlbWVudHMgTmdlTWFya2Rvd25Db250cmlidXRpb24ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluamVjdG9yOiBJbmplY3RvcixcbiAgICBAT3B0aW9uYWwoKVxuICAgIEBJbmplY3QoTkdFX01BUktET1dOX0hJR0hMSUdIVEVSX1NFUlZJQ0UpXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBOZ2VNYXJrZG93bkhpZ2hsaWdodGVyU2VydmljZVxuICApIHt9XG5cbiAgY29udHJpYnV0ZSh0cmFuc2Zvcm1lcjogTmdlTWFya2Rvd25UcmFuc2Zvcm1lcikge1xuICAgIHRoaXMuY3JlYXRlQXR0cmlidXRlcyh0cmFuc2Zvcm1lcilcbiAgICB0aGlzLmNvbG9yaXplQ29kZXModHJhbnNmb3JtZXIpXG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUF0dHJpYnV0ZXModHJhbnNmb3JtZXI6IE5nZU1hcmtkb3duVHJhbnNmb3JtZXIpIHtcbiAgICB0cmFuc2Zvcm1lci5hZGRSZW5kZXJlclRyYW5zZm9ybWVyKChyZW5kZXJlcikgPT4ge1xuICAgICAgcmVuZGVyZXIuY29kZSA9IChjb2RlLCBhcmdzKSA9PiB7XG4gICAgICAgIGFyZ3MgPSBhcmdzIHx8ICcnXG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG5cbiAgICAgICAgLy8gTEFOR1VBR0VcbiAgICAgICAgY29uc3QgbGFuZ3VhZ2UgPSBhcmdzLnNwbGl0KCcgJykuc2xpY2UoMCwgMSkucG9wKCkgfHwgJ3BsYWludGV4dCdcbiAgICAgICAgYXR0cmlidXRlcy5zZXQoREFUQV9MQU5HVUFHRSwgbGFuZ3VhZ2UpXG5cbiAgICAgICAgLy8gTElORSBOVU1CRVJJTkdcbiAgICAgICAgbGV0IG1hdGNoID0gYXJncy5tYXRjaCgvbGluZXM9XCIoLis/KVwiLylcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgYXR0cmlidXRlcy5zZXQoREFUQV9MSU5FUywgbWF0Y2hbMV0pXG4gICAgICAgIH1cblxuICAgICAgICAvLyBMSU5FIEhJR0hMSUdIVElOR1xuICAgICAgICBtYXRjaCA9IGFyZ3MubWF0Y2goL2hpZ2hsaWdodHM9XCIoLis/KVwiLylcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgYXR0cmlidXRlcy5zZXQoREFUQV9ISUdITElHSFRTLCBtYXRjaFsxXSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZJTEVOQU1FXG4gICAgICAgIG1hdGNoID0gYXJncy5tYXRjaCgvZmlsZW5hbWU9XCIoLis/KVwiLylcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgYXR0cmlidXRlcy5zZXQoREFUQV9GSUxFTkFNRSwgbWF0Y2hbMV0pXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhdHRyaWJzID0gQXJyYXkuZnJvbShhdHRyaWJ1dGVzLmVudHJpZXMoKSlcbiAgICAgICAgICAubWFwKChbYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWVdKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYCR7YXR0cmlidXRlTmFtZX09XCIke2F0dHJpYnV0ZVZhbHVlfVwiYFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmpvaW4oJyAnKVxuICAgICAgICAgIGNvbnNvbGUubG9nKGF0dHJpYnMpXG4gICAgICAgIHJldHVybiBgPHByZSAke2F0dHJpYnN9Pjxjb2RlPiR7dGhpcy5lc2NhcGVIdG1sKGNvZGUpfTwvY29kZT48L3ByZT5gXG4gICAgICB9XG4gICAgICByZXR1cm4gcmVuZGVyZXJcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBjb2xvcml6ZUNvZGVzKHRyYW5zZm9ybWVyOiBOZ2VNYXJrZG93blRyYW5zZm9ybWVyKSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnM/LmhpZ2hsaWd0aHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBoaWdobGlnaHQgPSB0aGlzLm9wdGlvbnMuaGlnaGxpZ3RodFxuICAgIHRyYW5zZm9ybWVyLmFkZEh0bWxUcmFuc2Zvcm1lcihhc3luYyAoZWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgcHJlRWxlbWVudHMgPSBBcnJheS5mcm9tKGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChgcHJlWyR7REFUQV9MQU5HVUFHRX1dYCkpXG4gICAgICBmb3IgKGNvbnN0IHByZSBvZiBwcmVFbGVtZW50cykge1xuICAgICAgICBoaWdobGlnaHQodGhpcy5pbmplY3Rvciwge1xuICAgICAgICAgIGxpbmVzOiBwcmUuZ2V0QXR0cmlidXRlKERBVEFfTElORVMpIHx8ICcnLFxuICAgICAgICAgIGVsZW1lbnQ6IHByZS5xdWVyeVNlbGVjdG9yKCdjb2RlJykgYXMgSFRNTEVsZW1lbnQsXG4gICAgICAgICAgbGFuZ3VhZ2U6IHByZS5nZXRBdHRyaWJ1dGUoREFUQV9MQU5HVUFHRSkgfHwgJ3BsYWludGV4dCcsXG4gICAgICAgICAgaGlnaGxpZ2h0czogcHJlLmdldEF0dHJpYnV0ZShEQVRBX0hJR0hMSUdIVFMpIHx8ICcnLFxuICAgICAgICAgIGZpbGVuYW1lOiBwcmUuZ2V0QXR0cmlidXRlKERBVEFfRklMRU5BTUUpIHx8ICcnLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGVzY2FwZUh0bWwoaW5wdXQ6IHN0cmluZykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgbWFwOiBhbnkgPSB7XG4gICAgICAnPCc6ICcmbHQ7JyxcbiAgICAgICc+JzogJyZndDsnLFxuICAgIH1cbiAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvWzw+XS9nLCAodGFnKSA9PiBtYXBbdGFnXSB8fCB0YWcpXG4gIH1cbn1cblxuLyoqXG4gKiBJbmplY3Rpb24gdG9rZW4gdG8gcmVnaXN0ZXIgYE5nZU1hcmtkb3duSGlnaGxpZ2h0ZXJgIGNvbnRyaWJ1dGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IE5nZU1hcmtkb3duSGlnaGxpZ2h0ZXJQcm92aWRlcjogUHJvdmlkZXIgPSB7XG4gIHByb3ZpZGU6IE5HRV9NQVJLRE9XTl9DT05UUklCVVRJT04sXG4gIG11bHRpOiB0cnVlLFxuICB1c2VDbGFzczogTmdlTWFya2Rvd25IaWdobGlnaHRlcixcbn1cblxuLyoqXG4gKiBQcm92aWRlciB0byByZWdpc3RlciBgTmdlTW9uYWNvQ29sb3JpemVyU2VydmljZWAgYXMgdGhlIHN5bnRheCBoaWdobGlnaHRlci5cbiAqIEBwYXJhbSB0eXBlIEEgcmVmZXJlbmNlIHRvIE5nZU1vbmFjb0NvbG9yaXplclNlcnZpY2UgdHlwZS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBmdW5jdGlvbiBOZ2VNYXJrZG93bkhpZ2hsaWdodGVyTW9uYWNvUHJvdmlkZXIodHlwZTogVHlwZTxhbnk+KSB7XG4gIHJldHVybiB7XG4gICAgcHJvdmlkZTogTkdFX01BUktET1dOX0hJR0hMSUdIVEVSX1NFUlZJQ0UsXG4gICAgdXNlVmFsdWU6IHtcbiAgICAgIGhpZ2hsaWd0aHQ6IChpbmplY3Rvciwgb3B0aW9ucykgPT4ge1xuICAgICAgICBjb25zdCBjb2xvcml6ZXIgPSBpbmplY3Rvci5nZXQodHlwZSwgbnVsbClcbiAgICAgICAgY29uc3QgY29kZSA9IG9wdGlvbnMuZWxlbWVudFxuICAgICAgICBjb25zdCBwcmUgPSBjb2RlLnBhcmVudEVsZW1lbnQgYXMgSFRNTEVsZW1lbnRcbiAgICAgICAgcHJlLnN0eWxlLm1hcmdpbiA9ICcwLjVlbSAwJ1xuICAgICAgICBwcmUuc3R5bGUub3ZlcmZsb3cgPSAnYXV0bydcbiAgICAgICAgcHJlLnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgI0YyRjJGMidcbiAgICAgICAgY29sb3JpemVyPy5jb2xvcml6ZUVsZW1lbnQoe1xuICAgICAgICAgIGVsZW1lbnQ6IGNvZGUsXG4gICAgICAgICAgbGFuZ3VhZ2U6IG9wdGlvbnMubGFuZ3VhZ2UsXG4gICAgICAgICAgY29kZTogY29kZS50ZXh0Q29udGVudCxcbiAgICAgICAgICBsaW5lczogb3B0aW9ucy5saW5lcyxcbiAgICAgICAgICBmaWxlbmFtZTogb3B0aW9ucy5maWxlbmFtZSxcbiAgICAgICAgICBoaWdobGlnaHRzOiBvcHRpb25zLmhpZ2hsaWdodHMsXG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgIH0gYXMgTmdlTWFya2Rvd25IaWdobGlnaHRlclNlcnZpY2UsXG4gIH1cbn1cbiJdfQ==