UNPKG

@cisstech/nge

Version:

NG Essentials is a collection of libraries for Angular developers.

167 lines 18.1 kB
/** * Nge markdown transformer used by the contributions. */ export class NgeMarkdownTransformer { constructor( /** Configuration option */ config) { this.config = config; this.astTransformers = []; this.htmlTransformers = []; this.markdownTransformers = []; this.rendererTransformers = []; this.tokenizerTransformers = []; } /** * Registers a function to call to update the ast generated by the markdown compiler. * @param transform the function to call. */ addAstTransformer(transform) { if (transform == null) { throw new ReferenceError('argument "transform" is required'); } this.astTransformers.push(transform); } /** * Registers a function to call to transform the html generated by the markdown compiler. * @param transformer the function to call. */ addHtmlTransformer(transformer) { if (transformer == null) { throw new ReferenceError('argument "transform" is required'); } this.htmlTransformers.push(transformer); } /** * Registers a function to call to transform the markdown before it's parsed by the markdown compiler. * @param transform the function to call. */ addMarkdownTransformer(transform) { if (transform == null) { throw new ReferenceError('argument "transform" is required'); } this.markdownTransformers.push(transform); } /** * Registers a function to call to update marked library renderer. * @param transform the function to call. */ addRendererTransformer(transform) { if (transform == null) { throw new ReferenceError('argument "transform" is required'); } this.rendererTransformers.push(transform); } /** * Registers a function to call to update marked library tokenizer. * @param transform the function to call. */ addTokenizerTransformer(transform) { if (transform == null) { throw new ReferenceError('argument "transform" is required'); } this.tokenizerTransformers.push(transform); } /** * Apply the registered ast transformer functions to the given ast. * @param ast the ast to transform. * @returns the transformed ast. */ transformAst(ast) { if (ast == null) { throw new ReferenceError('argument "ast" is required'); } for (const fn of this.astTransformers) { ast = fn(ast); } return ast; } /** * Apply the registered html transformer functions to the given html. * @param element the html element to transform. * @returns the transformed html. */ transformHTML(element) { if (element == null) { throw new ReferenceError('argument "html" is required'); } for (const fn of this.htmlTransformers) { fn(element); } return element; } /** * Apply the registered markdown transformer functions to the given markdown. * @param markdown the markdown to transform. * @returns the transformed markdown. */ transformMarkdown(markdown) { if (markdown == null) { throw new ReferenceError('argument "markdown" is required'); } for (const fn of this.markdownTransformers) { markdown = fn(markdown); } return markdown; } /** * Apply the registered renderer transformer functions to the given renderer. * @param renderer the renderer to transform. * @returns the transformed renderer. */ transformRenderer(renderer) { if (renderer == null) { throw new ReferenceError('argument "renderer" is required'); } for (const fn of this.rendererTransformers) { renderer = fn(renderer); } return renderer; } /** * Apply the registered tokenizer transformer functions to the given tokenizer. * @param tokenizer the tokenizer to transform. * @returns the transformed tokenizer. */ transformTokenizer(tokenizer) { if (tokenizer == null) { throw new ReferenceError('argument "tokenizer" is required'); } for (const fn of this.tokenizerTransformers) { tokenizer = fn(tokenizer); } return tokenizer; } /** * Add new stylesheet element to the document. * @param url url to the stylesheet. * @returns A promise that resolves once the element is loaded. */ addStyle(url) { const link = document.createElement('link'); link.rel = 'stylesheet'; link.href = url; document.body.appendChild(link); return new Promise((resolve, reject) => { link.onload = resolve; link.onerror = reject; }); } /** * Add new script element to the document. * @param url url to the script. * @returns A promise that resolves once the element is loaded. */ addScript(url) { const script = document.createElement('script'); script.type = 'text/javascript'; script.src = url; script.defer = true; document.body.appendChild(script); return new Promise((resolve, reject) => { script.onload = resolve; script.onerror = reject; }); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdlLW1hcmtkb3duLXRyYW5zZm9ybWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmdlL21hcmtkb3duL3NyYy9uZ2UtbWFya2Rvd24tdHJhbnNmb3JtZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBU0E7O0dBRUc7QUFDSCxNQUFNLE9BQU8sc0JBQXNCO0lBT2pDO0lBQ0UsMkJBQTJCO0lBQ2xCLE1BQXlCO1FBQXpCLFdBQU0sR0FBTixNQUFNLENBQW1CO1FBUm5CLG9CQUFlLEdBQXFCLEVBQUUsQ0FBQTtRQUN0QyxxQkFBZ0IsR0FBc0IsRUFBRSxDQUFBO1FBQ3hDLHlCQUFvQixHQUEwQixFQUFFLENBQUE7UUFDaEQseUJBQW9CLEdBQTBCLEVBQUUsQ0FBQTtRQUNoRCwwQkFBcUIsR0FBMkIsRUFBRSxDQUFBO0lBS2hFLENBQUM7SUFFSjs7O09BR0c7SUFDSCxpQkFBaUIsQ0FBQyxTQUF5QjtRQUN6QyxJQUFJLFNBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN0QixNQUFNLElBQUksY0FBYyxDQUFDLGtDQUFrQyxDQUFDLENBQUE7UUFDOUQsQ0FBQztRQUVELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ3RDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxrQkFBa0IsQ0FBQyxXQUE0QjtRQUM3QyxJQUFJLFdBQVcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksY0FBYyxDQUFDLGtDQUFrQyxDQUFDLENBQUE7UUFDOUQsQ0FBQztRQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDekMsQ0FBQztJQUVEOzs7T0FHRztJQUNILHNCQUFzQixDQUFDLFNBQThCO1FBQ25ELElBQUksU0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3RCLE1BQU0sSUFBSSxjQUFjLENBQUMsa0NBQWtDLENBQUMs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QUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUMzQyxJQUFJLENBQUMsR0FBRyxHQUFHLFlBQVksQ0FBQTtRQUN2QixJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQTtRQUNmLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQy9CLE9BQU8sSUFBSSxPQUFPLENBQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDMUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUE7WUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUE7UUFDdkIsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFNBQVMsQ0FBQyxHQUFXO1FBQ25CLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDL0MsTUFBTSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQTtRQUMvQixNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQTtRQUNoQixNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQTtRQUNuQixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUNqQyxPQUFPLElBQUksT0FBTyxDQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQzFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFBO1lBQ3ZCLE1BQU0sQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFBO1FBQ3pCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZW5kZXJlciwgVG9rZW5pemVyLCBUb2tlbnNMaXN0LCBtYXJrZWQgfSBmcm9tICdtYXJrZWQnXG5pbXBvcnQgeyBOZ2VNYXJrZG93bkNvbmZpZyB9IGZyb20gJy4vbmdlLW1hcmtkb3duLWNvbmZpZydcblxuZGVjbGFyZSB0eXBlIEFzdFRyYW5zZm9ybWVyID0gKHRva2VuczogVG9rZW5zTGlzdCkgPT4gVG9rZW5zTGlzdFxuZGVjbGFyZSB0eXBlIEh0bWxUcmFuc2Zvcm1lciA9IChlbGVtZW50OiBIVE1MRWxlbWVudCkgPT4gdm9pZFxuZGVjbGFyZSB0eXBlIE1hcmtkb3duVHJhbnNmb3JtZXIgPSAobWFya2Rvd246IHN0cmluZykgPT4gc3RyaW5nXG5kZWNsYXJlIHR5cGUgUmVuZGVyZXJUcmFuc2Zvcm1lciA9IChyZW5kZXJlcjogUmVuZGVyZXIpID0+IFJlbmRlcmVyXG5kZWNsYXJlIHR5cGUgVG9rZW5pemVyVHJhbnNmb3JtZXIgPSAodG9rZW5pemVyOiBUb2tlbml6ZXIpID0+IFRva2VuaXplclxuXG4vKipcbiAqIE5nZSBtYXJrZG93biB0cmFuc2Zvcm1lciB1c2VkIGJ5IHRoZSBjb250cmlidXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgTmdlTWFya2Rvd25UcmFuc2Zvcm1lciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXN0VHJhbnNmb3JtZXJzOiBBc3RUcmFuc2Zvcm1lcltdID0gW11cbiAgcHJpdmF0ZSByZWFkb25seSBodG1sVHJhbnNmb3JtZXJzOiBIdG1sVHJhbnNmb3JtZXJbXSA9IFtdXG4gIHByaXZhdGUgcmVhZG9ubHkgbWFya2Rvd25UcmFuc2Zvcm1lcnM6IE1hcmtkb3duVHJhbnNmb3JtZXJbXSA9IFtdXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXJUcmFuc2Zvcm1lcnM6IFJlbmRlcmVyVHJhbnNmb3JtZXJbXSA9IFtdXG4gIHByaXZhdGUgcmVhZG9ubHkgdG9rZW5pemVyVHJhbnNmb3JtZXJzOiBUb2tlbml6ZXJUcmFuc2Zvcm1lcltdID0gW11cblxuICBjb25zdHJ1Y3RvcihcbiAgICAvKiogQ29uZmlndXJhdGlvbiBvcHRpb24gKi9cbiAgICByZWFkb25seSBjb25maWc6IE5nZU1hcmtkb3duQ29uZmlnXG4gICkge31cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgZnVuY3Rpb24gdG8gY2FsbCB0byB1cGRhdGUgdGhlIGFzdCBnZW5lcmF0ZWQgYnkgdGhlIG1hcmtkb3duIGNvbXBpbGVyLlxuICAgKiBAcGFyYW0gdHJhbnNmb3JtIHRoZSBmdW5jdGlvbiB0byBjYWxsLlxuICAgKi9cbiAgYWRkQXN0VHJhbnNmb3JtZXIodHJhbnNmb3JtOiBBc3RUcmFuc2Zvcm1lcikge1xuICAgIGlmICh0cmFuc2Zvcm0gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCdhcmd1bWVudCBcInRyYW5zZm9ybVwiIGlzIHJlcXVpcmVkJylcbiAgICB9XG5cbiAgICB0aGlzLmFzdFRyYW5zZm9ybWVycy5wdXNoKHRyYW5zZm9ybSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBmdW5jdGlvbiB0byBjYWxsIHRvIHRyYW5zZm9ybSB0aGUgaHRtbCBnZW5lcmF0ZWQgYnkgdGhlIG1hcmtkb3duIGNvbXBpbGVyLlxuICAgKiBAcGFyYW0gdHJhbnNmb3JtZXIgdGhlIGZ1bmN0aW9uIHRvIGNhbGwuXG4gICAqL1xuICBhZGRIdG1sVHJhbnNmb3JtZXIodHJhbnNmb3JtZXI6IEh0bWxUcmFuc2Zvcm1lcikge1xuICAgIGlmICh0cmFuc2Zvcm1lciA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoJ2FyZ3VtZW50IFwidHJhbnNmb3JtXCIgaXMgcmVxdWlyZWQnKVxuICAgIH1cblxuICAgIHRoaXMuaHRtbFRyYW5zZm9ybWVycy5wdXNoKHRyYW5zZm9ybWVyKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGZ1bmN0aW9uIHRvIGNhbGwgdG8gdHJhbnNmb3JtIHRoZSBtYXJrZG93biBiZWZvcmUgaXQncyBwYXJzZWQgYnkgdGhlIG1hcmtkb3duIGNvbXBpbGVyLlxuICAgKiBAcGFyYW0gdHJhbnNmb3JtIHRoZSBmdW5jdGlvbiB0byBjYWxsLlxuICAgKi9cbiAgYWRkTWFya2Rvd25UcmFuc2Zvcm1lcih0cmFuc2Zvcm06IE1hcmtkb3duVHJhbnNmb3JtZXIpIHtcbiAgICBpZiAodHJhbnNmb3JtID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcignYXJndW1lbnQgXCJ0cmFuc2Zvcm1cIiBpcyByZXF1aXJlZCcpXG4gICAgfVxuXG4gICAgdGhpcy5tYXJrZG93blRyYW5zZm9ybWVycy5wdXNoKHRyYW5zZm9ybSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBmdW5jdGlvbiB0byBjYWxsIHRvIHVwZGF0ZSBtYXJrZWQgbGlicmFyeSByZW5kZXJlci5cbiAgICogQHBhcmFtIHRyYW5zZm9ybSB0aGUgZnVuY3Rpb24gdG8gY2FsbC5cbiAgICovXG4gIGFkZFJlbmRlcmVyVHJhbnNmb3JtZXIodHJhbnNmb3JtOiBSZW5kZXJlclRyYW5zZm9ybWVyKSB7XG4gICAgaWYgKHRyYW5zZm9ybSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoJ2FyZ3VtZW50IFwidHJhbnNmb3JtXCIgaXMgcmVxdWlyZWQnKVxuICAgIH1cblxuICAgIHRoaXMucmVuZGVyZXJUcmFuc2Zvcm1lcnMucHVzaCh0cmFuc2Zvcm0pXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgZnVuY3Rpb24gdG8gY2FsbCB0byB1cGRhdGUgbWFya2VkIGxpYnJhcnkgdG9rZW5pemVyLlxuICAgKiBAcGFyYW0gdHJhbnNmb3JtIHRoZSBmdW5jdGlvbiB0byBjYWxsLlxuICAgKi9cbiAgYWRkVG9rZW5pemVyVHJhbnNmb3JtZXIodHJhbnNmb3JtOiBUb2tlbml6ZXJUcmFuc2Zvcm1lcikge1xuICAgIGlmICh0cmFuc2Zvcm0gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCdhcmd1bWVudCBcInRyYW5zZm9ybVwiIGlzIHJlcXVpcmVkJylcbiAgICB9XG5cbiAgICB0aGlzLnRva2VuaXplclRyYW5zZm9ybWVycy5wdXNoKHRyYW5zZm9ybSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSB0aGUgcmVnaXN0ZXJlZCBhc3QgdHJhbnNmb3JtZXIgZnVuY3Rpb25zIHRvIHRoZSBnaXZlbiBhc3QuXG4gICAqIEBwYXJhbSBhc3QgdGhlIGFzdCB0byB0cmFuc2Zvcm0uXG4gICAqIEByZXR1cm5zIHRoZSB0cmFuc2Zvcm1lZCBhc3QuXG4gICAqL1xuICB0cmFuc2Zvcm1Bc3QoYXN0OiBUb2tlbnNMaXN0KTogVG9rZW5zTGlzdCB7XG4gICAgaWYgKGFzdCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoJ2FyZ3VtZW50IFwiYXN0XCIgaXMgcmVxdWlyZWQnKVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZm4gb2YgdGhpcy5hc3RUcmFuc2Zvcm1lcnMpIHtcbiAgICAgIGFzdCA9IGZuKGFzdClcbiAgICB9XG5cbiAgICByZXR1cm4gYXN0XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgdGhlIHJlZ2lzdGVyZWQgaHRtbCB0cmFuc2Zvcm1lciBmdW5jdGlvbnMgdG8gdGhlIGdpdmVuIGh0bWwuXG4gICAqIEBwYXJhbSBlbGVtZW50IHRoZSBodG1sIGVsZW1lbnQgdG8gdHJhbnNmb3JtLlxuICAgKiBAcmV0dXJucyB0aGUgdHJhbnNmb3JtZWQgaHRtbC5cbiAgICovXG4gIHRyYW5zZm9ybUhUTUwoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoJ2FyZ3VtZW50IFwiaHRtbFwiIGlzIHJlcXVpcmVkJylcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZuIG9mIHRoaXMuaHRtbFRyYW5zZm9ybWVycykge1xuICAgICAgZm4oZWxlbWVudClcbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudFxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoZSByZWdpc3RlcmVkIG1hcmtkb3duIHRyYW5zZm9ybWVyIGZ1bmN0aW9ucyB0byB0aGUgZ2l2ZW4gbWFya2Rvd24uXG4gICAqIEBwYXJhbSBtYXJrZG93biB0aGUgbWFya2Rvd24gdG8gdHJhbnNmb3JtLlxuICAgKiBAcmV0dXJucyB0aGUgdHJhbnNmb3JtZWQgbWFya2Rvd24uXG4gICAqL1xuICB0cmFuc2Zvcm1NYXJrZG93bihtYXJrZG93bjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAobWFya2Rvd24gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCdhcmd1bWVudCBcIm1hcmtkb3duXCIgaXMgcmVxdWlyZWQnKVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZm4gb2YgdGhpcy5tYXJrZG93blRyYW5zZm9ybWVycykge1xuICAgICAgbWFya2Rvd24gPSBmbihtYXJrZG93bilcbiAgICB9XG5cbiAgICByZXR1cm4gbWFya2Rvd25cbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSB0aGUgcmVnaXN0ZXJlZCByZW5kZXJlciB0cmFuc2Zvcm1lciBmdW5jdGlvbnMgdG8gdGhlIGdpdmVuIHJlbmRlcmVyLlxuICAgKiBAcGFyYW0gcmVuZGVyZXIgdGhlIHJlbmRlcmVyIHRvIHRyYW5zZm9ybS5cbiAgICogQHJldHVybnMgdGhlIHRyYW5zZm9ybWVkIHJlbmRlcmVyLlxuICAgKi9cbiAgdHJhbnNmb3JtUmVuZGVyZXIocmVuZGVyZXI6IFJlbmRlcmVyKTogUmVuZGVyZXIge1xuICAgIGlmIChyZW5kZXJlciA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoJ2FyZ3VtZW50IFwicmVuZGVyZXJcIiBpcyByZXF1aXJlZCcpXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmbiBvZiB0aGlzLnJlbmRlcmVyVHJhbnNmb3JtZXJzKSB7XG4gICAgICByZW5kZXJlciA9IGZuKHJlbmRlcmVyKVxuICAgIH1cblxuICAgIHJldHVybiByZW5kZXJlclxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoZSByZWdpc3RlcmVkIHRva2VuaXplciB0cmFuc2Zvcm1lciBmdW5jdGlvbnMgdG8gdGhlIGdpdmVuIHRva2VuaXplci5cbiAgICogQHBhcmFtIHRva2VuaXplciB0aGUgdG9rZW5pemVyIHRvIHRyYW5zZm9ybS5cbiAgICogQHJldHVybnMgdGhlIHRyYW5zZm9ybWVkIHRva2VuaXplci5cbiAgICovXG4gIHRyYW5zZm9ybVRva2VuaXplcih0b2tlbml6ZXI6IFRva2VuaXplcik6IFRva2VuaXplciB7XG4gICAgaWYgKHRva2VuaXplciA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoJ2FyZ3VtZW50IFwidG9rZW5pemVyXCIgaXMgcmVxdWlyZWQnKVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZm4gb2YgdGhpcy50b2tlbml6ZXJUcmFuc2Zvcm1lcnMpIHtcbiAgICAgIHRva2VuaXplciA9IGZuKHRva2VuaXplcilcbiAgICB9XG5cbiAgICByZXR1cm4gdG9rZW5pemVyXG4gIH1cblxuICAvKipcbiAgICogQWRkIG5ldyBzdHlsZXNoZWV0IGVsZW1lbnQgdG8gdGhlIGRvY3VtZW50LlxuICAgKiBAcGFyYW0gdXJsIHVybCB0byB0aGUgc3R5bGVzaGVldC5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgZWxlbWVudCBpcyBsb2FkZWQuXG4gICAqL1xuICBhZGRTdHlsZSh1cmw6IHN0cmluZykge1xuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJylcbiAgICBsaW5rLnJlbCA9ICdzdHlsZXNoZWV0J1xuICAgIGxpbmsuaHJlZiA9IHVybFxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluaylcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsaW5rLm9ubG9hZCA9IHJlc29sdmVcbiAgICAgIGxpbmsub25lcnJvciA9IHJlamVjdFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQWRkIG5ldyBzY3JpcHQgZWxlbWVudCB0byB0aGUgZG9jdW1lbnQuXG4gICAqIEBwYXJhbSB1cmwgdXJsIHRvIHRoZSBzY3JpcHQuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGVsZW1lbnQgaXMgbG9hZGVkLlxuICAgKi9cbiAgYWRkU2NyaXB0KHVybDogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0JylcbiAgICBzY3JpcHQudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnXG4gICAgc2NyaXB0LnNyYyA9IHVybFxuICAgIHNjcmlwdC5kZWZlciA9IHRydWVcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdClcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBzY3JpcHQub25sb2FkID0gcmVzb2x2ZVxuICAgICAgc2NyaXB0Lm9uZXJyb3IgPSByZWplY3RcbiAgICB9KVxuICB9XG59XG4iXX0=