ngx-showdown-angular-latest
Version:
An Angular 17 integration for Showdown
303 lines • 25.6 kB
JavaScript
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