UNPKG

ngx-showdown-angular-latest

Version:
303 lines 25.6 kB
import { Component, Input, Optional, SecurityContext } from '@angular/core'; import { ShowdownConverter } from './showdown-converter.provider'; import * as i0 from "@angular/core"; import * as i1 from "@angular/platform-browser"; import * as i2 from "./showdown-config.provider"; /** * @internal */ const MAP_OPTION = { '': true, true: true, false: false }; /** * @internal */ let _toOption = (value) => MAP_OPTION.hasOwnProperty(value) ? MAP_OPTION[value] : value; /** * The options keys for the dynamic properties set. * @internal */ const OPTIONS_PROPERTIES_KEYS = [ 'backslashEscapesHTMLTags', 'completeHTMLDocument', 'disableForced4SpacesIndentedSublists', 'emoji', 'encodeEmails', 'ghCodeBlocks', 'ghCompatibleHeaderId', 'ghMentions', 'ghMentionsLink', 'headerLevelStart', 'literalMidWordAsterisks', 'literalMidWordUnderscores', 'metadata', 'noHeaderId', 'omitExtraWLInCodeBlocks', 'openLinksInNewWindow', 'parseImgDimensions', 'prefixHeaderId', 'rawHeaderId', 'rawPrefixHeaderId', 'requireSpaceBeforeHeadingText', 'simpleLineBreaks', 'simplifiedAutoLink', 'smartIndentationFix', 'smoothLivePreview', 'splitAdjacentBlockquotes', 'strikethrough', 'tables', 'tablesHeaderId', 'tasklists', 'underline' ]; /** * A angular component for render `Markdown` to `HTML`. * * ### Example * * Setup as standalone * ```typescript * import { NgModule } from '@angular/core'; * import { ShowdownComponent } from 'ngx-showdown'; * * @NgModule({ * declarations: [ ShowdownComponent ]; * }) * export class AppModule {} * ``` * * Bind markdown value and options object * ```typescript * import { Component } from '@angular/core'; * import * as Showdown from 'showdown'; * * @Component({ * selector: 'some', * template: '<showdown [value]="text" [options]="options"></showdown>' * }) * export class SomeComponent { * text: string = ` * # Some header * --- * **Some bold** * `; * options: Showdown.ShowdownOptions = { smartIndentationFix: true }; * // ... * } * ``` * Bind single option (it have properties for all showdown options). * ```html * <showdown emoji="true" noHeaderId># Some text :+1:</showdown> * ``` * * Set static markdown value. * ```html * <showdown value="___Some static value___" underline></showdown> * ``` * * Use as directive on anther element. * ```html * <div showdown="# Div Element" headerLevelStart="2"></div> * ``` * * Static markdown value in the element content. * ```html * <div> * <showdown smartIndentationFix> * # List: * * a * * A * * b * </showdown> * </div> * ``` * * Set template reference variable. * ```html * <showdown #sd></showdown> * ``` * Or * ```html * <div showdown #sd="showdown"></div> * ``` */ export class ShowdownComponent extends ShowdownConverter { _elementRef; _domSanitizer; /** * The input markdown value. * * __Example :__ * * Set some static markdown value. * ```html * <showdown value="**Some bold value**"></showdown> * ``` * * Bind property with markdown value. * ```html * <textarea [(ngModel)]="text"></textarea> * <showdown [value]="text"></showdown> * ``` */ value; /** * Input alias to `value`. * * __Example :__ * * ```html * <div [showdown]="# Some Header"></div> * ``` * * Equivalent to * ```html * <showdown [value]="# Some Header"></showdown> * ``` */ set showdown(value) { this.value = value; } /** * The showdown options of the converter. * * __Example :__ * * Bind options * ```typescript * import { Component } from '@angular/core'; * import * as Showdown from 'showdown'; * * @Component({ * selector: `some`, * template: `<showdown [options]="options"># Some Header<showdown>` * }) * export class SomeComponent { * options: Showdown.ShowdownOptions = {headerLevelStart: 3}; * // ... * } * ``` * Or * ```html * <showdown [options]="{smartIndentationFix: true}"> # Indentation Fix<showdown> * ``` */ get options() { return this.getOptions(); } set options(options) { this.setOptions(options); } _sanitize; /** * Enables html sanitize, it will sanitize the converter html output by [`DomSanitizer`](https://angular.io/api/platform-browser/DomSanitizer#sanitize). * * __Example :__ * * ```typescript * import { Component } from '@angular/core'; * * @Component({ * selector: 'some', * styles: [`.box { width: 95%; padding: 5px; border: 1px solid black;}`], * template: ` * <h3>Input</h3> * <textarea class="box" [(ngModel)]="text"></textarea> * <input type="checkbox" [(ngModel)]="sanitize"/> <b>Sanitize</b> * <h3>Markdown</h3> * <pre class="box"><code>{{ text }}</code></pre> * <h3>Preview</h3> * <div class="box"> * <showdown #sd [value]="text" [sanitize]="sanitize"></showdown> * </div> * `; * }) * export class SomeComponent { * text: string = `# A cool link * <a href="javascript:alert('Hello!')">click me</a>`; * } * ``` */ set sanitize(sanitize) { this._sanitize = _toOption(sanitize); } constructor(_elementRef, _domSanitizer, config) { super(config); this._elementRef = _elementRef; this._domSanitizer = _domSanitizer; } /** * A angular lifecycle method, Use on init to check if it `content` type and load the element `content` to `value`. * @internal */ ngOnInit() { if (this.value === undefined && this._elementRef.nativeElement.innerHTML.trim() !== '') { this.render(this._elementRef.nativeElement.innerHTML); } } /** * A angular lifecycle method, Use to call to render method after changes. * @internal */ ngOnChanges() { this.render(); } /** * Convert the markdown value of {@link ShowdownComponent#value} to html and set the html result to the element content. * * __Example :__ * * ```html * <textarea #textarea (change)="showdown.render(textarea.value)"/># Some Header</textarea> * <showdown #showdown></showdown> * ``` * @param value - A markdown value to render (it will override the current value of `ShowdownComponent#value`) */ render(value) { if (typeof value === 'string') { this.value = value; } if (typeof this.value === 'string') { let result = this.makeHtml(this.value); if (this._sanitize) { result = this._domSanitizer.sanitize(SecurityContext.HTML, result); } this._elementRef.nativeElement.innerHTML = result; } } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: ShowdownComponent, deps: [{ token: i0.ElementRef }, { token: i1.DomSanitizer, optional: true }, { token: i2.ShowdownConfig, optional: true }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.5", type: ShowdownComponent, selector: "showdown,[showdown]", inputs: { backslashEscapesHTMLTags: "backslashEscapesHTMLTags", completeHTMLDocument: "completeHTMLDocument", disableForced4SpacesIndentedSublists: "disableForced4SpacesIndentedSublists", emoji: "emoji", encodeEmails: "encodeEmails", ghCodeBlocks: "ghCodeBlocks", ghCompatibleHeaderId: "ghCompatibleHeaderId", ghMentions: "ghMentions", ghMentionsLink: "ghMentionsLink", headerLevelStart: "headerLevelStart", literalMidWordAsterisks: "literalMidWordAsterisks", literalMidWordUnderscores: "literalMidWordUnderscores", metadata: "metadata", noHeaderId: "noHeaderId", omitExtraWLInCodeBlocks: "omitExtraWLInCodeBlocks", openLinksInNewWindow: "openLinksInNewWindow", parseImgDimensions: "parseImgDimensions", prefixHeaderId: "prefixHeaderId", rawHeaderId: "rawHeaderId", rawPrefixHeaderId: "rawPrefixHeaderId", requireSpaceBeforeHeadingText: "requireSpaceBeforeHeadingText", simpleLineBreaks: "simpleLineBreaks", simplifiedAutoLink: "simplifiedAutoLink", smartIndentationFix: "smartIndentationFix", smoothLivePreview: "smoothLivePreview", splitAdjacentBlockquotes: "splitAdjacentBlockquotes", strikethrough: "strikethrough", tables: "tables", tablesHeaderId: "tablesHeaderId", tasklists: "tasklists", underline: "underline", value: "value", showdown: "showdown", options: "options", sanitize: "sanitize" }, exportAs: ["showdown"], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: '<ng-content></ng-content>', isInline: true }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: ShowdownComponent, decorators: [{ type: Component, args: [{ selector: 'showdown,[showdown]', template: '<ng-content></ng-content>', exportAs: 'showdown', inputs: OPTIONS_PROPERTIES_KEYS }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.DomSanitizer, decorators: [{ type: Optional }] }, { type: i2.ShowdownConfig, decorators: [{ type: Optional }] }], propDecorators: { value: [{ type: Input }], showdown: [{ type: Input }], options: [{ type: Input }], sanitize: [{ type: Input }] } }); // Define options properties setter for angular directive and direct access for (let key of OPTIONS_PROPERTIES_KEYS) { Object.defineProperty(ShowdownComponent.prototype, key, { set(value) { this.setOption(key, _toOption(value)); }, configurable: true }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hvd2Rvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Nob3dkb3duLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBcUIsUUFBUSxFQUFFLGVBQWUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUkzRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7OztBQUVsRTs7R0FFRztBQUNILE1BQU0sVUFBVSxHQUFHO0lBQ2pCLEVBQUUsRUFBRSxJQUFJO0lBQ1IsSUFBSSxFQUFFLElBQUk7SUFDVixLQUFLLEVBQUUsS0FBSztDQUNiLENBQUM7QUFFRjs7R0FFRztBQUNILElBQUksU0FBUyxHQUFHLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUU3Rjs7O0dBR0c7QUFDSCxNQUFNLHVCQUF1QixHQUFhO0lBQ3hDLDBCQUEwQjtJQUMxQixzQkFBc0I7SUFDdEIsc0NBQXNDO0lBQ3RDLE9BQU87SUFDUCxjQUFjO0lBQ2QsY0FBYztJQUNkLHNCQUFzQjtJQUN0QixZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLGtCQUFrQjtJQUNsQix5QkFBeUI7SUFDekIsMkJBQTJCO0lBQzNCLFVBQVU7SUFDVixZQUFZO0lBQ1oseUJBQXlCO0lBQ3pCLHNCQUFzQjtJQUN0QixvQkFBb0I7SUFDcEIsZ0JBQWdCO0lBQ2hCLGFBQWE7SUFDYixtQkFBbUI7SUFDbkIsK0JBQStCO0lBQy9CLGtCQUFrQjtJQUNsQixvQkFBb0I7SUFDcEIscUJBQXFCO0lBQ3JCLG1CQUFtQjtJQUNuQiwwQkFBMEI7SUFDMUIsZUFBZTtJQUNmLFFBQVE7SUFDUixnQkFBZ0I7SUFDaEIsV0FBVztJQUNY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dUJBQXVCLEVBQUUsQ0FBQztJQUN4QyxNQUFNLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7UUFDdEQsR0FBRyxDQUFDLEtBQVU7WUFDWixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBQ0QsWUFBWSxFQUFFLElBQUk7S0FDbkIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPcHRpb25hbCwgU2VjdXJpdHlDb250ZXh0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgKiBhcyBTaG93ZG93biBmcm9tICdzaG93ZG93bic7XHJcbmltcG9ydCB7IFNob3dkb3duQ29uZmlnIH0gZnJvbSAnLi9zaG93ZG93bi1jb25maWcucHJvdmlkZXInO1xyXG5pbXBvcnQgeyBTaG93ZG93bkNvbnZlcnRlciB9IGZyb20gJy4vc2hvd2Rvd24tY29udmVydGVyLnByb3ZpZGVyJztcclxuXHJcbi8qKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmNvbnN0IE1BUF9PUFRJT04gPSB7XHJcbiAgJyc6IHRydWUsXHJcbiAgdHJ1ZTogdHJ1ZSxcclxuICBmYWxzZTogZmFsc2VcclxufTtcclxuXHJcbi8qKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmxldCBfdG9PcHRpb24gPSAodmFsdWU6IGFueSkgPT4gTUFQX09QVElPTi5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkgPyBNQVBfT1BUSU9OW3ZhbHVlXSA6IHZhbHVlO1xyXG5cclxuLyoqXHJcbiAqIFRoZSBvcHRpb25zIGtleXMgZm9yIHRoZSBkeW5hbWljIHByb3BlcnRpZXMgc2V0LlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmNvbnN0IE9QVElPTlNfUFJPUEVSVElFU19LRVlTOiBzdHJpbmdbXSA9IFtcclxuICAnYmFja3NsYXNoRXNjYXBlc0hUTUxUYWdzJyxcclxuICAnY29tcGxldGVIVE1MRG9jdW1lbnQnLFxyXG4gICdkaXNhYmxlRm9yY2VkNFNwYWNlc0luZGVudGVkU3VibGlzdHMnLFxyXG4gICdlbW9qaScsXHJcbiAgJ2VuY29kZUVtYWlscycsXHJcbiAgJ2doQ29kZUJsb2NrcycsXHJcbiAgJ2doQ29tcGF0aWJsZUhlYWRlcklkJyxcclxuICAnZ2hNZW50aW9ucycsXHJcbiAgJ2doTWVudGlvbnNMaW5rJyxcclxuICAnaGVhZGVyTGV2ZWxTdGFydCcsXHJcbiAgJ2xpdGVyYWxNaWRXb3JkQXN0ZXJpc2tzJyxcclxuICAnbGl0ZXJhbE1pZFdvcmRVbmRlcnNjb3JlcycsXHJcbiAgJ21ldGFkYXRhJyxcclxuICAnbm9IZWFkZXJJZCcsXHJcbiAgJ29taXRFeHRyYVdMSW5Db2RlQmxvY2tzJyxcclxuICAnb3BlbkxpbmtzSW5OZXdXaW5kb3cnLFxyXG4gICdwYXJzZUltZ0RpbWVuc2lvbnMnLFxyXG4gICdwcmVmaXhIZWFkZXJJZCcsXHJcbiAgJ3Jhd0hlYWRlcklkJyxcclxuICAncmF3UHJlZml4SGVhZGVySWQnLFxyXG4gICdyZXF1aXJlU3BhY2VCZWZvcmVIZWFkaW5nVGV4dCcsXHJcbiAgJ3NpbXBsZUxpbmVCcmVha3MnLFxyXG4gICdzaW1wbGlmaWVkQXV0b0xpbmsnLFxyXG4gICdzbWFydEluZGVudGF0aW9uRml4JyxcclxuICAnc21vb3RoTGl2ZVByZXZpZXcnLFxyXG4gICdzcGxpdEFkamFjZW50QmxvY2txdW90ZXMnLFxyXG4gICdzdHJpa2V0aHJvdWdoJyxcclxuICAndGFibGVzJyxcclxuICAndGFibGVzSGVhZGVySWQnLFxyXG4gICd0YXNrbGlzdHMnLFxyXG4gICd1bmRlcmxpbmUnXHJcbl07XHJcblxyXG4vLyBGb3IgdGhlIG9wdGlvbnMgc2V0dGVyIHByb3BlcnRpZXMgdGhhdCBkeW5hbWljIGRlZmluaXRpb24gKHRoZSBjb2RlIGFmdGVyIHRoZSBjbGFzcylcclxuZXhwb3J0IGludGVyZmFjZSBTaG93ZG93bkNvbXBvbmVudCBleHRlbmRzIFNob3dkb3duLlNob3dkb3duT3B0aW9ucyB7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIGFuZ3VsYXIgY29tcG9uZW50IGZvciByZW5kZXIgYE1hcmtkb3duYCB0byBgSFRNTGAuXHJcbiAqXHJcbiAqICMjIyBFeGFtcGxlXHJcbiAqXHJcbiAqIFNldHVwIGFzIHN0YW5kYWxvbmVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG4gKiBpbXBvcnQgeyBTaG93ZG93bkNvbXBvbmVudCB9IGZyb20gJ25neC1zaG93ZG93bic7XHJcbiAqXHJcbiAqIEBOZ01vZHVsZSh7XHJcbiAqICAgZGVjbGFyYXRpb25zOiBbIFNob3dkb3duQ29tcG9uZW50IF07XHJcbiAqIH0pXHJcbiAqIGV4cG9ydCBjbGFzcyBBcHBNb2R1bGUge31cclxuICogYGBgXHJcbiAqXHJcbiAqIEJpbmQgbWFya2Rvd24gdmFsdWUgYW5kIG9wdGlvbnMgb2JqZWN0XHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbiAqIGltcG9ydCAqIGFzIFNob3dkb3duIGZyb20gJ3Nob3dkb3duJztcclxuICpcclxuICogQENvbXBvbmVudCh7XHJcbiAqICAgc2VsZWN0b3I6ICdzb21lJyxcclxuICogICB0ZW1wbGF0ZTogJzxzaG93ZG93biBbdmFsdWVdPVwidGV4dFwiIFtvcHRpb25zXT1cIm9wdGlvbnNcIj48L3Nob3dkb3duPidcclxuICogfSlcclxuICogZXhwb3J0IGNsYXNzIFNvbWVDb21wb25lbnQge1xyXG4gKiAgIHRleHQ6IHN0cmluZyA9IGBcclxuICogICAgICMgU29tZSBoZWFkZXJcclxuICogICAgIC0tLVxyXG4gKiAgICAgKipTb21lIGJvbGQqKlxyXG4gKiAgIGA7XHJcbiAqICAgb3B0aW9uczogU2hvd2Rvd24uU2hvd2Rvd25PcHRpb25zID0geyBzbWFydEluZGVudGF0aW9uRml4OiB0cnVlIH07XHJcbiAqICAgLy8gLi4uXHJcbiAqIH1cclxuICogYGBgXHJcbiAqIEJpbmQgc2luZ2xlIG9wdGlvbiAoaXQgaGF2ZSBwcm9wZXJ0aWVzIGZvciBhbGwgc2hvd2Rvd24gb3B0aW9ucykuXHJcbiAqIGBgYGh0bWxcclxuICogPHNob3dkb3duIGVtb2ppPVwidHJ1ZVwiICBub0hlYWRlcklkPiMgU29tZSB0ZXh0IDorMTo8L3Nob3dkb3duPlxyXG4gKiBgYGBcclxuICpcclxuICogU2V0IHN0YXRpYyBtYXJrZG93biB2YWx1ZS5cclxuICogYGBgaHRtbFxyXG4gKiA8c2hvd2Rvd24gdmFsdWU9XCJfX19Tb21lIHN0YXRpYyB2YWx1ZV9fX1wiIHVuZGVybGluZT48L3Nob3dkb3duPlxyXG4gKiBgYGBcclxuICpcclxuICogVXNlIGFzIGRpcmVjdGl2ZSBvbiBhbnRoZXIgZWxlbWVudC5cclxuICogYGBgaHRtbFxyXG4gKiA8ZGl2IHNob3dkb3duPVwiIyBEaXYgRWxlbWVudFwiIGhlYWRlckxldmVsU3RhcnQ9XCIyXCI+PC9kaXY+XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBTdGF0aWMgbWFya2Rvd24gdmFsdWUgaW4gdGhlIGVsZW1lbnQgY29udGVudC5cclxuICogYGBgaHRtbFxyXG4gKiA8ZGl2PlxyXG4gKiAgICA8c2hvd2Rvd24gc21hcnRJbmRlbnRhdGlvbkZpeD5cclxuICogICAgICAgIyBMaXN0OlxyXG4gKiAgICAgICAqIGFcclxuICogICAgICAgICAgICAqIEFcclxuICogICAgICAgKiBiXHJcbiAqICAgIDwvc2hvd2Rvd24+XHJcbiAqIDwvZGl2PlxyXG4gKiBgYGBcclxuICpcclxuICogU2V0IHRlbXBsYXRlIHJlZmVyZW5jZSB2YXJpYWJsZS5cclxuICogYGBgaHRtbFxyXG4gKiA8c2hvd2Rvd24gI3NkPjwvc2hvd2Rvd24+XHJcbiAqIGBgYFxyXG4gKiBPclxyXG4gKiBgYGBodG1sXHJcbiAqIDxkaXYgc2hvd2Rvd24gI3NkPVwic2hvd2Rvd25cIj48L2Rpdj5cclxuICogYGBgXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3Nob3dkb3duLFtzaG93ZG93bl0nLFxyXG4gIHRlbXBsYXRlOiAnPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PicsXHJcbiAgZXhwb3J0QXM6ICdzaG93ZG93bicsXHJcbiAgaW5wdXRzOiBPUFRJT05TX1BST1BFUlRJRVNfS0VZU1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU2hvd2Rvd25Db21wb25lbnQgZXh0ZW5kcyBTaG93ZG93bkNvbnZlcnRlciBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBTaG93ZG93bi5TaG93ZG93bk9wdGlvbnMge1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgaW5wdXQgbWFya2Rvd24gdmFsdWUuXHJcbiAgICpcclxuICAgKiBfX0V4YW1wbGUgOl9fXHJcbiAgICpcclxuICAgKiBTZXQgc29tZSBzdGF0aWMgbWFya2Rvd24gdmFsdWUuXHJcbiAgICogYGBgaHRtbFxyXG4gICAqIDxzaG93ZG93biB2YWx1ZT1cIioqU29tZSBib2xkIHZhbHVlKipcIj48L3Nob3dkb3duPlxyXG4gICAqIGBgYFxyXG4gICAqXHJcbiAgICogQmluZCBwcm9wZXJ0eSB3aXRoIG1hcmtkb3duIHZhbHVlLlxyXG4gICAqIGBgYGh0bWxcclxuICAgKiA8dGV4dGFyZWEgWyhuZ01vZGVsKV09XCJ0ZXh0XCI+PC90ZXh0YXJlYT5cclxuICAgKiA8c2hvd2Rvd24gW3ZhbHVlXT1cInRleHRcIj48L3Nob3dkb3duPlxyXG4gICAqIGBgYFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHZhbHVlOiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIElucHV0IGFsaWFzIHRvIGB2YWx1ZWAuXHJcbiAgICpcclxuICAgKiBfX0V4YW1wbGUgOl9fXHJcbiAgICpcclxuICAgKiBgYGBodG1sXHJcbiAgICogPGRpdiBbc2hvd2Rvd25dPVwiIyBTb21lIEhlYWRlclwiPjwvZGl2PlxyXG4gICAqIGBgYFxyXG4gICAqXHJcbiAgICogRXF1aXZhbGVudCB0b1xyXG4gICAqIGBgYGh0bWxcclxuICAgKiA8c2hvd2Rvd24gW3ZhbHVlXT1cIiMgU29tZSBIZWFkZXJcIj48L3Nob3dkb3duPlxyXG4gICAqIGBgYFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHNldCBzaG93ZG93bih2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgc2hvd2Rvd24gb3B0aW9ucyBvZiB0aGUgY29udmVydGVyLlxyXG4gICAqXHJcbiAgICogX19FeGFtcGxlIDpfX1xyXG4gICAqXHJcbiAgICogQmluZCBvcHRpb25zXHJcbiAgICogYGBgdHlwZXNjcmlwdFxyXG4gICAqIGltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG4gICAqIGltcG9ydCAqIGFzIFNob3dkb3duIGZyb20gJ3Nob3dkb3duJztcclxuICAgKlxyXG4gICAqIEBDb21wb25lbnQoe1xyXG4gICAqICAgc2VsZWN0b3I6IGBzb21lYCxcclxuICAgKiAgIHRlbXBsYXRlOiBgPHNob3dkb3duIFtvcHRpb25zXT1cIm9wdGlvbnNcIj4jIFNvbWUgSGVhZGVyPHNob3dkb3duPmBcclxuICAgKiB9KVxyXG4gICAqIGV4cG9ydCBjbGFzcyBTb21lQ29tcG9uZW50IHtcclxuICAgKiAgIG9wdGlvbnM6IFNob3dkb3duLlNob3dkb3duT3B0aW9ucyA9IHtoZWFkZXJMZXZlbFN0YXJ0OiAzfTtcclxuICAgKiAgIC8vIC4uLlxyXG4gICAqIH1cclxuICAgKiBgYGBcclxuICAgKiBPclxyXG4gICAqIGBgYGh0bWxcclxuICAgKiA8c2hvd2Rvd24gW29wdGlvbnNdPVwie3NtYXJ0SW5kZW50YXRpb25GaXg6IHRydWV9XCI+ICMgSW5kZW50YXRpb24gRml4PHNob3dkb3duPlxyXG4gICAqIGBgYFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IG9wdGlvbnMoKTogU2hvd2Rvd24uU2hvd2Rvd25PcHRpb25zIHtcclxuICAgIHJldHVybiB0aGlzLmdldE9wdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIHNldCBvcHRpb25zKG9wdGlvbnM6IFNob3dkb3duLlNob3dkb3duT3B0aW9ucykge1xyXG4gICAgdGhpcy5zZXRPcHRpb25zKG9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2FuaXRpemU6IGJvb2xlYW47XHJcblxyXG4gIC8qKlxyXG4gICAqIEVuYWJsZXMgaHRtbCBzYW5pdGl6ZSwgaXQgd2lsbCBzYW5pdGl6ZSB0aGUgY29udmVydGVyIGh0bWwgb3V0cHV0IGJ5IFtgRG9tU2FuaXRpemVyYF0oaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9wbGF0Zm9ybS1icm93c2VyL0RvbVNhbml0aXplciNzYW5pdGl6ZSkuXHJcbiAgICpcclxuICAgKiBfX0V4YW1wbGUgOl9fXHJcbiAgICpcclxuICAgKiBgYGB0eXBlc2NyaXB0XHJcbiAgICogaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbiAgICpcclxuICAgKiBAQ29tcG9uZW50KHtcclxuICAgKiAgIHNlbGVjdG9yOiAnc29tZScsXHJcbiAgICogICBzdHlsZXM6IFtgLmJveCB7IHdpZHRoOiA5NSU7IHBhZGRpbmc6IDVweDsgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7fWBdLFxyXG4gICAqICAgdGVtcGxhdGU6IGBcclxuICAgKiAgICAgPGgzPklucHV0PC9oMz5cclxuICAgKiAgICAgPHRleHRhcmVhIGNsYXNzPVwiYm94XCIgWyhuZ01vZGVsKV09XCJ0ZXh0XCI+PC90ZXh0YXJlYT5cclxuICAgKiAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwic2FuaXRpemVcIi8+IDxiPlNhbml0aXplPC9iPlxyXG4gICAqICAgICA8aDM+TWFya2Rvd248L2gzPlxyXG4gICAqICAgICA8cHJlIGNsYXNzPVwiYm94XCI+PGNvZGU+e3sgdGV4dCB9fTwvY29kZT48L3ByZT5cclxuICAgKiAgICAgPGgzPlByZXZpZXc8L2gzPlxyXG4gICAqICAgICA8ZGl2IGNsYXNzPVwiYm94XCI+XHJcbiAgICogICAgICAgPHNob3dkb3duICNzZCBbdmFsdWVdPVwidGV4dFwiIFtzYW5pdGl6ZV09XCJzYW5pdGl6ZVwiPjwvc2hvd2Rvd24+XHJcbiAgICogICAgIDwvZGl2PlxyXG4gICAqICAgYDtcclxuICAgKiB9KVxyXG4gICAqIGV4cG9ydCBjbGFzcyBTb21lQ29tcG9uZW50IHtcclxuICAgKiAgICB0ZXh0OiBzdHJpbmcgPSBgIyBBIGNvb2wgbGlua1xyXG4gICAqIDxhIGhyZWY9XCJqYXZhc2NyaXB0OmFsZXJ0KCdIZWxsbyEnKVwiPmNsaWNrIG1lPC9hPmA7XHJcbiAgICogfVxyXG4gICAqIGBgYFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHNhbml0aXplKHNhbml0aXplOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9zYW5pdGl6ZSA9IF90b09wdGlvbihzYW5pdGl6ZSk7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmLCBAT3B0aW9uYWwoKSBwcml2YXRlIF9kb21TYW5pdGl6ZXI/OiBEb21TYW5pdGl6ZXIsIEBPcHRpb25hbCgpIGNvbmZpZz86IFNob3dkb3duQ29uZmlnKSB7XHJcbiAgICBzdXBlcihjb25maWcpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQSBhbmd1bGFyIGxpZmVjeWNsZSBtZXRob2QsIFVzZSBvbiBpbml0IHRvIGNoZWNrIGlmIGl0IGBjb250ZW50YCB0eXBlIGFuZCBsb2FkIHRoZSBlbGVtZW50IGBjb250ZW50YCB0byBgdmFsdWVgLlxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMudmFsdWUgPT09IHVuZGVmaW5lZCAmJiB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MLnRyaW0oKSAhPT0gJycpIHtcclxuICAgICAgdGhpcy5yZW5kZXIodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmlubmVySFRNTCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIGFuZ3VsYXIgbGlmZWN5Y2xlIG1ldGhvZCwgVXNlIHRvIGNhbGwgdG8gcmVuZGVyIG1ldGhvZCBhZnRlciBjaGFuZ2VzLlxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZW5kZXIoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnZlcnQgdGhlIG1hcmtkb3duIHZhbHVlIG9mIHtAbGluayBTaG93ZG93bkNvbXBvbmVudCN2YWx1ZX0gdG8gaHRtbCBhbmQgc2V0IHRoZSBodG1sIHJlc3VsdCB0byB0aGUgZWxlbWVudCBjb250ZW50LlxyXG4gICAqXHJcbiAgICogX19FeGFtcGxlIDpfX1xyXG4gICAqXHJcbiAgICogYGBgaHRtbFxyXG4gICAqIDx0ZXh0YXJlYSAjdGV4dGFyZWEgKGNoYW5nZSk9XCJzaG93ZG93bi5yZW5kZXIodGV4dGFyZWEudmFsdWUpXCIvPiMgU29tZSBIZWFkZXI8L3RleHRhcmVhPlxyXG4gICAqIDxzaG93ZG93biAjc2hvd2Rvd24+PC9zaG93ZG93bj5cclxuICAgKiBgYGBcclxuICAgKiBAcGFyYW0gdmFsdWUgLSBBIG1hcmtkb3duIHZhbHVlIHRvIHJlbmRlciAoaXQgd2lsbCBvdmVycmlkZSB0aGUgY3VycmVudCB2YWx1ZSBvZiBgU2hvd2Rvd25Db21wb25lbnQjdmFsdWVgKVxyXG4gICAqL1xyXG4gIHB1YmxpYyByZW5kZXIodmFsdWU/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIHRoaXMudmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIGxldCByZXN1bHQgPSB0aGlzLm1ha2VIdG1sKHRoaXMudmFsdWUpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX3Nhbml0aXplKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5fZG9tU2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5IVE1MLCByZXN1bHQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gcmVzdWx0O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuXHJcbi8vIERlZmluZSBvcHRpb25zIHByb3BlcnRpZXMgc2V0dGVyIGZvciBhbmd1bGFyIGRpcmVjdGl2ZSBhbmQgZGlyZWN0IGFjY2Vzc1xyXG5mb3IgKGxldCBrZXkgb2YgT1BUSU9OU19QUk9QRVJUSUVTX0tFWVMpIHtcclxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU2hvd2Rvd25Db21wb25lbnQucHJvdG90eXBlLCBrZXksIHtcclxuICAgIHNldCh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICAgIHRoaXMuc2V0T3B0aW9uKGtleSwgX3RvT3B0aW9uKHZhbHVlKSk7XHJcbiAgICB9LFxyXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgfSk7XHJcbn1cclxuIl19