UNPKG

styled-string-builder

Version:

String Styler class based on a builder design pattern

170 lines (168 loc) 36.3 kB
import { BrightBackgroundColors, BrightForegroundColors, StandardBackgroundColors, StandardForegroundColors, styles, } from "./constants"; import { clear, colorize256, colorizeANSI, colorizeRGB, raw, applyStyle, } from "./colors"; /** * @class StyledString * @description A class that extends string functionality with ANSI color and style options. * @summary StyledString provides methods to apply various ANSI color and style options to text strings. * It implements the ColorizeOptions interface and proxies native string methods to the underlying text. * This class allows for chaining of styling methods and easy application of colors and styles to text. * * @implements {ColorizeOptions} * @param {string} text - The initial text string to be styled. */ export class StyledString { constructor(text) { this.text = text; // Basic colors Object.entries(StandardForegroundColors).forEach(([name, code]) => { Object.defineProperty(this, name, { get: () => this.foreground(code), }); }); Object.entries(BrightForegroundColors).forEach(([name, code]) => { Object.defineProperty(this, name, { get: () => this.foreground(code), }); }); // Background colors Object.entries(StandardBackgroundColors).forEach(([name, code]) => { Object.defineProperty(this, name, { get: () => this.background(code), }); }); Object.entries(BrightBackgroundColors).forEach(([name, code]) => { Object.defineProperty(this, name, { get: () => this.background(code), }); }); // Styles Object.entries(styles).forEach(([name, code]) => { Object.defineProperty(this, name, { get: () => this.style(code), }); }); } /** * @description Clears all styling from the text. * @summary Removes all ANSI color and style codes from the text. * @return {StyledString} The StyledString instance with cleared styling. */ clear() { this.text = clear(this.text); return this; } /** * @description Applies raw ANSI codes to the text. * @summary Allows direct application of ANSI escape sequences to the text. * @param {string} rawAnsi - The raw ANSI escape sequence to apply. * @return {StyledString} The StyledString instance with the raw ANSI code applied. */ raw(rawAnsi) { this.text = raw(this.text, rawAnsi); return this; } /** * @description Applies a foreground color to the text. * @summary Sets the text color using ANSI color codes. * @param {number} n - The ANSI color code for the foreground color. * @return {StyledString} The StyledString instance with the foreground color applied. */ foreground(n) { this.text = colorizeANSI(this.text, n); return this; } /** * @description Applies a background color to the text. * @summary Sets the background color of the text using ANSI color codes. * @param {number} n - The ANSI color code for the background color. * @return {StyledString} The StyledString instance with the background color applied. */ background(n) { this.text = colorizeANSI(this.text, n, true); return this; } /** * @description Applies a text style to the string. * @summary Sets text styles such as bold, italic, or underline using ANSI style codes. * @param {number | string} n - The style code or key from the styles object. * @return {StyledString} The StyledString instance with the style applied. */ style(n) { if (typeof n === "string" && !(n in styles)) { console.warn(`Invalid style: ${n}`); return this; } this.text = applyStyle(this.text, n); return this; } /** * @description Applies a 256-color foreground color to the text. * @summary Sets the text color using the extended 256-color palette. * @param {number} n - The color number from the 256-color palette. * @return {StyledString} The StyledString instance with the 256-color foreground applied. */ color256(n) { this.text = colorize256(this.text, n); return this; } /** * @description Applies a 256-color background color to the text. * @summary Sets the background color using the extended 256-color palette. * @param {number} n - The color number from the 256-color palette. * @return {StyledString} The StyledString instance with the 256-color background applied. */ bgColor256(n) { this.text = colorize256(this.text, n, true); return this; } /** * @description Applies an RGB foreground color to the text. * @summary Sets the text color using RGB values. * @param {number} r - The red component (0-255). * @param {number} g - The green component (0-255). * @param {number} b - The blue component (0-255). * @return {StyledString} The StyledString instance with the RGB foreground color applied. */ rgb(r, g, b) { this.text = colorizeRGB(this.text, r, g, b); return this; } /** * @description Applies an RGB background color to the text. * @summary Sets the background color using RGB values. * @param {number} r - The red component (0-255). * @param {number} g - The green component (0-255). * @param {number} b - The blue component (0-255). * @return {StyledString} The StyledString instance with the RGB background color applied. */ bgRgb(r, g, b) { this.text = colorizeRGB(this.text, r, g, b, true); return this; } /** * @description Converts the StyledString to a regular string. * @summary Returns the underlying text with all applied styling. * @return {string} The styled text as a regular string. */ toString() { return this.text; } } /** * @description Applies styling to a given text string. * @summary This function takes a string and returns a StyledString object, which is an enhanced * version of the original string with additional methods for applying various ANSI color and style * options. It sets up a mapper object with methods for different styling operations and then * defines properties on the text string to make these methods accessible. * * @param {string[]} t The input text to be styled. * @return {StyledString} A StyledString object with additional styling methods. * * @function style * * @memberOf StyledString */ export function style(...t) { return new StyledString(t.join(" ")); } //# sourceMappingURL=data:application/json;charset=utf8;base64,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QUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUztRQUNqQyxJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLENBQVM7UUFDbkMsSUFBSSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNsRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0NBQ0Y7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLEtBQUssQ0FBQyxHQUFHLENBQVc7SUFDbEMsT0FBTyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdkMsQ0FBQyIsImZpbGUiOiJzdHJpbmdzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQnJpZ2h0QmFja2dyb3VuZENvbG9ycyxcbiAgQnJpZ2h0Rm9yZWdyb3VuZENvbG9ycyxcbiAgU3RhbmRhcmRCYWNrZ3JvdW5kQ29sb3JzLFxuICBTdGFuZGFyZEZvcmVncm91bmRDb2xvcnMsXG4gIHN0eWxlcyxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBjbGVhcixcbiAgY29sb3JpemUyNTYsXG4gIGNvbG9yaXplQU5TSSxcbiAgY29sb3JpemVSR0IsXG4gIHJhdyxcbiAgYXBwbHlTdHlsZSxcbn0gZnJvbSBcIi4vY29sb3JzXCI7XG5cbi8qKlxuICogQHR5cGVkZWYgQ29sb3JpemVPcHRpb25zXG4gKiBAZGVzY3JpcHRpb24gT3B0aW9ucyBmb3IgdGV4dCBjb2xvcml6YXRpb24gdXNpbmcgQU5TSSBjb2Rlcy5cbiAqIEBzdW1tYXJ5IFRoaXMgdHlwZSBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG9iamVjdCByZXR1cm5lZCBieSB0aGUgY29sb3JpemUgZnVuY3Rpb24uXG4gKiBJdCBpbmNsdWRlcyBtZXRob2RzIGZvciBhcHBseWluZyB2YXJpb3VzIGNvbG9yIGFuZCBzdHlsZSBvcHRpb25zIHRvIHRleHQgdXNpbmcgQU5TSSBlc2NhcGUgY29kZXMuXG4gKlxuICogQHByb3BlcnR5IHtTdHlsZWRTdHJpbmd9IFN0YW5kYXJkRm9yZWdyb3VuZENvbG9ycyBHZXR0ZXIgZm9yIGVhY2ggc3RhbmRhcmQgZm9yZWdyb3VuZCBjb2xvci5cbiAqIEBwcm9wZXJ0eSB7U3R5bGVkU3RyaW5nfSBCcmlnaHRGb3JlZ3JvdW5kQ29sb3JzIEdldHRlciBmb3IgZWFjaCBicmlnaHQgZm9yZWdyb3VuZCBjb2xvci5cbiAqIEBwcm9wZXJ0eSB7U3R5bGVkU3RyaW5nfSBTdGFuZGFyZEJhY2tncm91bmRDb2xvcnMgR2V0dGVyIGZvciBlYWNoIHN0YW5kYXJkIGJhY2tncm91bmQgY29sb3IuXG4gKiBAcHJvcGVydHkge1N0eWxlZFN0cmluZ30gQnJpZ2h0QmFja2dyb3VuZENvbG9ycyBHZXR0ZXIgZm9yIGVhY2ggYnJpZ2h0IGJhY2tncm91bmQgY29sb3IuXG4gKiBAcHJvcGVydHkge1N0eWxlZFN0cmluZ30gc3R5bGVzIEdldHRlciBmb3IgZWFjaCB0ZXh0IHN0eWxlLlxuICogQHByb3BlcnR5IHtmdW5jdGlvbigpOiBTdHlsZWRTdHJpbmd9IGNsZWFyIFJlbW92ZXMgYWxsIHN0eWxpbmcgZnJvbSB0aGUgdGV4dC5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oc3RyaW5nKTogU3R5bGVkU3RyaW5nfSByYXcgQXBwbGllcyByYXcgQU5TSSBjb2RlcyB0byB0aGUgdGV4dC5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24obnVtYmVyKTogU3R5bGVkU3RyaW5nfSBmb3JlZ3JvdW5kIEFwcGxpZXMgYSBmb3JlZ3JvdW5kIGNvbG9yIHVzaW5nIEFOU0kgY29kZXMuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKG51bWJlcik6IFN0eWxlZFN0cmluZ30gYmFja2dyb3VuZCBBcHBsaWVzIGEgYmFja2dyb3VuZCBjb2xvciB1c2luZyBBTlNJIGNvZGVzLlxuICogQHByb3BlcnR5IHtmdW5jdGlvbihzdHJpbmcpOiBTdHlsZWRTdHJpbmd9IHN0eWxlIEFwcGxpZXMgYSB0ZXh0IHN0eWxlIHVzaW5nIEFOU0kgY29kZXMuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKG51bWJlcik6IFN0eWxlZFN0cmluZ30gY29sb3IyNTYgQXBwbGllcyBhIDI1Ni1jb2xvciBmb3JlZ3JvdW5kIGNvbG9yLlxuICogQHByb3BlcnR5IHtmdW5jdGlvbihudW1iZXIpOiBTdHlsZWRTdHJpbmd9IGJnQ29sb3IyNTYgQXBwbGllcyBhIDI1Ni1jb2xvciBiYWNrZ3JvdW5kIGNvbG9yLlxuICogQHByb3BlcnR5IHtmdW5jdGlvbihudW1iZXIsIG51bWJlciwgbnVtYmVyKTogU3R5bGVkU3RyaW5nfSByZ2IgQXBwbGllcyBhbiBSR0IgZm9yZWdyb3VuZCBjb2xvci5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24obnVtYmVyLCBudW1iZXIsIG51bWJlcik6IFN0eWxlZFN0cmluZ30gYmdSZ2IgQXBwbGllcyBhbiBSR0IgYmFja2dyb3VuZCBjb2xvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0ZXh0IFRoZSB1bmRlcmx5aW5nIHRleHQgY29udGVudC5cbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOlN0eWxlZFN0cmluZ1xuICovXG5leHBvcnQgdHlwZSBDb2xvcml6ZU9wdGlvbnMgPSB7XG4gIFtrIGluIGtleW9mIHR5cGVvZiBTdGFuZGFyZEZvcmVncm91bmRDb2xvcnNdOiBTdHlsZWRTdHJpbmc7XG59ICYgeyBbayBpbiBrZXlvZiB0eXBlb2YgQnJpZ2h0Rm9yZWdyb3VuZENvbG9yc106IFN0eWxlZFN0cmluZyB9ICYge1xuICBbayBpbiBrZXlvZiB0eXBlb2YgU3RhbmRhcmRCYWNrZ3JvdW5kQ29sb3JzXTogU3R5bGVkU3RyaW5nO1xufSAmIHsgW2sgaW4ga2V5b2YgdHlwZW9mIEJyaWdodEJhY2tncm91bmRDb2xvcnNdOiBTdHlsZWRTdHJpbmcgfSAmIHtcbiAgW2sgaW4ga2V5b2YgdHlwZW9mIHN0eWxlc106IFN0eWxlZFN0cmluZztcbn0gJiB7XG4gIGNsZWFyOiAoKSA9PiBTdHlsZWRTdHJpbmc7XG4gIHJhdzogKHJhdzogc3RyaW5nKSA9PiBTdHlsZWRTdHJpbmc7XG4gIGZvcmVncm91bmQ6IChuOiBudW1iZXIpID0+IFN0eWxlZFN0cmluZztcbiAgYmFja2dyb3VuZDogKG46IG51bWJlcikgPT4gU3R5bGVkU3RyaW5nO1xuICBzdHlsZTogKG46IG51bWJlciB8IGtleW9mIHR5cGVvZiBzdHlsZXMpID0+IFN0eWxlZFN0cmluZztcbiAgY29sb3IyNTY6IChuOiBudW1iZXIpID0+IFN0eWxlZFN0cmluZztcbiAgYmdDb2xvcjI1NjogKG46IG51bWJlcikgPT4gU3R5bGVkU3RyaW5nO1xuICByZ2I6IChyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKSA9PiBTdHlsZWRTdHJpbmc7XG4gIGJnUmdiOiAocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlcikgPT4gU3R5bGVkU3RyaW5nO1xuICB0ZXh0OiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIEBjbGFzcyBTdHlsZWRTdHJpbmdcbiAqIEBkZXNjcmlwdGlvbiBBIGNsYXNzIHRoYXQgZXh0ZW5kcyBzdHJpbmcgZnVuY3Rpb25hbGl0eSB3aXRoIEFOU0kgY29sb3IgYW5kIHN0eWxlIG9wdGlvbnMuXG4gKiBAc3VtbWFyeSBTdHlsZWRTdHJpbmcgcHJvdmlkZXMgbWV0aG9kcyB0byBhcHBseSB2YXJpb3VzIEFOU0kgY29sb3IgYW5kIHN0eWxlIG9wdGlvbnMgdG8gdGV4dCBzdHJpbmdzLlxuICogSXQgaW1wbGVtZW50cyB0aGUgQ29sb3JpemVPcHRpb25zIGludGVyZmFjZSBhbmQgcHJveGllcyBuYXRpdmUgc3RyaW5nIG1ldGhvZHMgdG8gdGhlIHVuZGVybHlpbmcgdGV4dC5cbiAqIFRoaXMgY2xhc3MgYWxsb3dzIGZvciBjaGFpbmluZyBvZiBzdHlsaW5nIG1ldGhvZHMgYW5kIGVhc3kgYXBwbGljYXRpb24gb2YgY29sb3JzIGFuZCBzdHlsZXMgdG8gdGV4dC5cbiAqIFxuICogQGltcGxlbWVudHMge0NvbG9yaXplT3B0aW9uc31cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gVGhlIGluaXRpYWwgdGV4dCBzdHJpbmcgdG8gYmUgc3R5bGVkLlxuICovXG5leHBvcnQgY2xhc3MgU3R5bGVkU3RyaW5nIGltcGxlbWVudHMgQ29sb3JpemVPcHRpb25zIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGJsYWNrIGNvbG9yIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIGJsYWNrIGZvcmVncm91bmQgY29sb3IuXG4gICAqL1xuICBibGFjayE6IFN0eWxlZFN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgcmVkIGNvbG9yIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIHJlZCBmb3JlZ3JvdW5kIGNvbG9yLlxuICAgKi9cbiAgcmVkITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyBncmVlbiBjb2xvciB0byB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgR2V0dGVyIHRoYXQgcmV0dXJucyBhIG5ldyBTdHlsZWRTdHJpbmcgd2l0aCBncmVlbiBmb3JlZ3JvdW5kIGNvbG9yLlxuICAgKi9cbiAgZ3JlZW4hOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIHllbGxvdyBjb2xvciB0byB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgR2V0dGVyIHRoYXQgcmV0dXJucyBhIG5ldyBTdHlsZWRTdHJpbmcgd2l0aCB5ZWxsb3cgZm9yZWdyb3VuZCBjb2xvci5cbiAgICovXG4gIHllbGxvdyE6IFN0eWxlZFN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYmx1ZSBjb2xvciB0byB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgR2V0dGVyIHRoYXQgcmV0dXJucyBhIG5ldyBTdHlsZWRTdHJpbmcgd2l0aCBibHVlIGZvcmVncm91bmQgY29sb3IuXG4gICAqL1xuICBibHVlITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyBtYWdlbnRhIGNvbG9yIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIG1hZ2VudGEgZm9yZWdyb3VuZCBjb2xvci5cbiAgICovXG4gIG1hZ2VudGEhOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGN5YW4gY29sb3IgdG8gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggY3lhbiBmb3JlZ3JvdW5kIGNvbG9yLlxuICAgKi9cbiAgY3lhbiE6IFN0eWxlZFN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgd2hpdGUgY29sb3IgdG8gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggd2hpdGUgZm9yZWdyb3VuZCBjb2xvci5cbiAgICovXG4gIHdoaXRlITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyBicmlnaHQgYmxhY2sgKGdyYXkpIGNvbG9yIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIGJyaWdodCBibGFjayBmb3JlZ3JvdW5kIGNvbG9yLlxuICAgKi9cbiAgYnJpZ2h0QmxhY2shOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGJyaWdodCByZWQgY29sb3IgdG8gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggYnJpZ2h0IHJlZCBmb3JlZ3JvdW5kIGNvbG9yLlxuICAgKi9cbiAgYnJpZ2h0UmVkITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyBicmlnaHQgZ3JlZW4gY29sb3IgdG8gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggYnJpZ2h0IGdyZWVuIGZvcmVncm91bmQgY29sb3IuXG4gICAqL1xuICBicmlnaHRHcmVlbiE6IFN0eWxlZFN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYnJpZ2h0IHllbGxvdyBjb2xvciB0byB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgR2V0dGVyIHRoYXQgcmV0dXJucyBhIG5ldyBTdHlsZWRTdHJpbmcgd2l0aCBicmlnaHQgeWVsbG93IGZvcmVncm91bmQgY29sb3IuXG4gICAqL1xuICBicmlnaHRZZWxsb3chOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGJyaWdodCBibHVlIGNvbG9yIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIGJyaWdodCBibHVlIGZvcmVncm91bmQgY29sb3IuXG4gICAqL1xuICBicmlnaHRCbHVlITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyBicmlnaHQgbWFnZW50YSBjb2xvciB0byB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgR2V0dGVyIHRoYXQgcmV0dXJucyBhIG5ldyBTdHlsZWRTdHJpbmcgd2l0aCBicmlnaHQgbWFnZW50YSBmb3JlZ3JvdW5kIGNvbG9yLlxuICAgKi9cbiAgYnJpZ2h0TWFnZW50YSE6IFN0eWxlZFN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYnJpZ2h0IGN5YW4gY29sb3IgdG8gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggYnJpZ2h0IGN5YW4gZm9yZWdyb3VuZCBjb2xvci5cbiAgICovXG4gIGJyaWdodEN5YW4hOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGJyaWdodCB3aGl0ZSBjb2xvciB0byB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgR2V0dGVyIHRoYXQgcmV0dXJucyBhIG5ldyBTdHlsZWRTdHJpbmcgd2l0aCBicmlnaHQgd2hpdGUgZm9yZWdyb3VuZCBjb2xvci5cbiAgICovXG4gIGJyaWdodFdoaXRlITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyBibGFjayBiYWNrZ3JvdW5kIGNvbG9yIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIGJsYWNrIGJhY2tncm91bmQgY29sb3IuXG4gICAqL1xuICBiZ0JsYWNrITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyByZWQgYmFja2dyb3VuZCBjb2xvciB0byB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgR2V0dGVyIHRoYXQgcmV0dXJucyBhIG5ldyBTdHlsZWRTdHJpbmcgd2l0aCByZWQgYmFja2dyb3VuZCBjb2xvci5cbiAgICovXG4gIGJnUmVkITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyBncmVlbiBiYWNrZ3JvdW5kIGNvbG9yIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIGdyZWVuIGJhY2tncm91bmQgY29sb3IuXG4gICAqL1xuICBiZ0dyZWVuITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyB5ZWxsb3cgYmFja2dyb3VuZCBjb2xvciB0byB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgR2V0dGVyIHRoYXQgcmV0dXJucyBhIG5ldyBTdHlsZWRTdHJpbmcgd2l0aCB5ZWxsb3cgYmFja2dyb3VuZCBjb2xvci5cbiAgICovXG4gIGJnWWVsbG93ITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyBibHVlIGJhY2tncm91bmQgY29sb3IgdG8gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggYmx1ZSBiYWNrZ3JvdW5kIGNvbG9yLlxuICAgKi9cbiAgYmdCbHVlITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyBtYWdlbnRhIGJhY2tncm91bmQgY29sb3IgdG8gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggbWFnZW50YSBiYWNrZ3JvdW5kIGNvbG9yLlxuICAgKi9cbiAgYmdNYWdlbnRhITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyBjeWFuIGJhY2tncm91bmQgY29sb3IgdG8gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggY3lhbiBiYWNrZ3JvdW5kIGNvbG9yLlxuICAgKi9cbiAgYmdDeWFuITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyB3aGl0ZSBiYWNrZ3JvdW5kIGNvbG9yIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIHdoaXRlIGJhY2tncm91bmQgY29sb3IuXG4gICAqL1xuICBiZ1doaXRlITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyBicmlnaHQgYmxhY2sgKGdyYXkpIGJhY2tncm91bmQgY29sb3IgdG8gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggYnJpZ2h0IGJsYWNrIGJhY2tncm91bmQgY29sb3IuXG4gICAqL1xuICBiZ0JyaWdodEJsYWNrITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyBicmlnaHQgcmVkIGJhY2tncm91bmQgY29sb3IgdG8gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggYnJpZ2h0IHJlZCBiYWNrZ3JvdW5kIGNvbG9yLlxuICAgKi9cbiAgYmdCcmlnaHRSZWQhOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGJyaWdodCBncmVlbiBiYWNrZ3JvdW5kIGNvbG9yIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIGJyaWdodCBncmVlbiBiYWNrZ3JvdW5kIGNvbG9yLlxuICAgKi9cbiAgYmdCcmlnaHRHcmVlbiE6IFN0eWxlZFN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYnJpZ2h0IHllbGxvdyBiYWNrZ3JvdW5kIGNvbG9yIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIGJyaWdodCB5ZWxsb3cgYmFja2dyb3VuZCBjb2xvci5cbiAgICovXG4gIGJnQnJpZ2h0WWVsbG93ITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyBicmlnaHQgYmx1ZSBiYWNrZ3JvdW5kIGNvbG9yIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIGJyaWdodCBibHVlIGJhY2tncm91bmQgY29sb3IuXG4gICAqL1xuICBiZ0JyaWdodEJsdWUhOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGJyaWdodCBtYWdlbnRhIGJhY2tncm91bmQgY29sb3IgdG8gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggYnJpZ2h0IG1hZ2VudGEgYmFja2dyb3VuZCBjb2xvci5cbiAgICovXG4gIGJnQnJpZ2h0TWFnZW50YSE6IFN0eWxlZFN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYnJpZ2h0IGN5YW4gYmFja2dyb3VuZCBjb2xvciB0byB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgR2V0dGVyIHRoYXQgcmV0dXJucyBhIG5ldyBTdHlsZWRTdHJpbmcgd2l0aCBicmlnaHQgY3lhbiBiYWNrZ3JvdW5kIGNvbG9yLlxuICAgKi9cbiAgYmdCcmlnaHRDeWFuITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyBicmlnaHQgd2hpdGUgYmFja2dyb3VuZCBjb2xvciB0byB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgR2V0dGVyIHRoYXQgcmV0dXJucyBhIG5ldyBTdHlsZWRTdHJpbmcgd2l0aCBicmlnaHQgd2hpdGUgYmFja2dyb3VuZCBjb2xvci5cbiAgICovXG4gIGJnQnJpZ2h0V2hpdGUhOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXNldHMgYWxsIHN0eWxpbmcgYXBwbGllZCB0byB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgR2V0dGVyIHRoYXQgcmV0dXJucyBhIG5ldyBTdHlsZWRTdHJpbmcgd2l0aCBhbGwgc3R5bGluZyByZXNldC5cbiAgICovXG4gIHJlc2V0ITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyBib2xkIHN0eWxlIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIGJvbGQgc3R5bGUuXG4gICAqL1xuICBib2xkITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyBkaW0gKGRlY3JlYXNlZCBpbnRlbnNpdHkpIHN0eWxlIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIGRpbSBzdHlsZS5cbiAgICovXG4gIGRpbSE6IFN0eWxlZFN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgaXRhbGljIHN0eWxlIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIGl0YWxpYyBzdHlsZS5cbiAgICovXG4gIGl0YWxpYyE6IFN0eWxlZFN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgdW5kZXJsaW5lIHN0eWxlIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIHVuZGVybGluZSBzdHlsZS5cbiAgICovXG4gIHVuZGVybGluZSE6IFN0eWxlZFN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYmxpbmtpbmcgc3R5bGUgdG8gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggYmxpbmtpbmcgc3R5bGUuXG4gICAqL1xuICBibGluayE6IFN0eWxlZFN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEludmVydHMgdGhlIGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgY29sb3JzIG9mIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIGludmVydGVkIGNvbG9ycy5cbiAgICovXG4gIGludmVyc2UhOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIaWRlcyB0aGUgdGV4dCAoc2FtZSBjb2xvciBhcyBiYWNrZ3JvdW5kKS5cbiAgICogQHN1bW1hcnkgR2V0dGVyIHRoYXQgcmV0dXJucyBhIG5ldyBTdHlsZWRTdHJpbmcgd2l0aCBoaWRkZW4gdGV4dC5cbiAgICovXG4gIGhpZGRlbiE6IFN0eWxlZFN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgc3RyaWtldGhyb3VnaCBzdHlsZSB0byB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgR2V0dGVyIHRoYXQgcmV0dXJucyBhIG5ldyBTdHlsZWRTdHJpbmcgd2l0aCBzdHJpa2V0aHJvdWdoIHN0eWxlLlxuICAgKi9cbiAgc3RyaWtldGhyb3VnaCE6IFN0eWxlZFN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgZG91YmxlIHVuZGVybGluZSBzdHlsZSB0byB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgR2V0dGVyIHRoYXQgcmV0dXJucyBhIG5ldyBTdHlsZWRTdHJpbmcgd2l0aCBkb3VibGUgdW5kZXJsaW5lIHN0eWxlLlxuICAgKi9cbiAgZG91YmxlVW5kZXJsaW5lITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVzZXRzIHRoZSB0ZXh0IGNvbG9yIHRvIG5vcm1hbCBpbnRlbnNpdHkuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggbm9ybWFsIGNvbG9yIGludGVuc2l0eS5cbiAgICovXG4gIG5vcm1hbENvbG9yITogU3R5bGVkU3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVtb3ZlcyBpdGFsaWMgb3IgZnJha3R1ciBzdHlsZSBmcm9tIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIGl0YWxpYyBvciBmcmFrdHVyIHN0eWxlIHJlbW92ZWQuXG4gICAqL1xuICBub0l0YWxpY09yRnJha3R1ciE6IFN0eWxlZFN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlbW92ZXMgdW5kZXJsaW5lIHN0eWxlIGZyb20gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggdW5kZXJsaW5lIHN0eWxlIHJlbW92ZWQuXG4gICAqL1xuICBub1VuZGVybGluZSE6IFN0eWxlZFN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlbW92ZXMgYmxpbmtpbmcgc3R5bGUgZnJvbSB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgR2V0dGVyIHRoYXQgcmV0dXJucyBhIG5ldyBTdHlsZWRTdHJpbmcgd2l0aCBibGlua2luZyBzdHlsZSByZW1vdmVkLlxuICAgKi9cbiAgbm9CbGluayE6IFN0eWxlZFN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlbW92ZXMgY29sb3IgaW52ZXJzaW9uIGZyb20gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEdldHRlciB0aGF0IHJldHVybnMgYSBuZXcgU3R5bGVkU3RyaW5nIHdpdGggY29sb3IgaW52ZXJzaW9uIHJlbW92ZWQuXG4gICAqL1xuICBub0ludmVyc2UhOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZW1vdmVzIGhpZGRlbiBzdHlsZSBmcm9tIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBHZXR0ZXIgdGhhdCByZXR1cm5zIGEgbmV3IFN0eWxlZFN0cmluZyB3aXRoIGhpZGRlbiBzdHlsZSByZW1vdmVkLlxuICAgKi9cbiAgbm9IaWRkZW4hOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZW1vdmVzIHN0cmlrZXRocm91Z2ggc3R5bGUgZnJvbSB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgR2V0dGVyIHRoYXQgcmV0dXJucyBhIG5ldyBTdHlsZWRTdHJpbmcgd2l0aCBzdHJpa2V0aHJvdWdoIHN0eWxlIHJlbW92ZWQuXG4gICAqL1xuICBub1N0cmlrZXRocm91Z2ghOiBTdHlsZWRTdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgdGV4dFxuICAgKiBAc3VtbWFyeSBUaGUgc3R5bGVkIHRleHQgYXMgYSByZWd1bGFyIHN0cmluZy5cbiAgICovXG4gIHRleHQhOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IodGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy50ZXh0ID0gdGV4dDtcbiAgICAvLyBCYXNpYyBjb2xvcnNcbiAgICBPYmplY3QuZW50cmllcyhTdGFuZGFyZEZvcmVncm91bmRDb2xvcnMpLmZvckVhY2goKFtuYW1lLCBjb2RlXSkgPT4ge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIG5hbWUsIHtcbiAgICAgICAgZ2V0OiAoKSA9PiB0aGlzLmZvcmVncm91bmQoY29kZSksXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIE9iamVjdC5lbnRyaWVzKEJyaWdodEZvcmVncm91bmRDb2xvcnMpLmZvckVhY2goKFtuYW1lLCBjb2RlXSkgPT4ge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIG5hbWUsIHtcbiAgICAgICAgZ2V0OiAoKSA9PiB0aGlzLmZvcmVncm91bmQoY29kZSksXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIEJhY2tncm91bmQgY29sb3JzXG4gICAgT2JqZWN0LmVudHJpZXMoU3RhbmRhcmRCYWNrZ3JvdW5kQ29sb3JzKS5mb3JFYWNoKChbbmFtZSwgY29kZV0pID0+IHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBuYW1lLCB7XG4gICAgICAgIGdldDogKCkgPT4gdGhpcy5iYWNrZ3JvdW5kKGNvZGUpLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZW50cmllcyhCcmlnaHRCYWNrZ3JvdW5kQ29sb3JzKS5mb3JFYWNoKChbbmFtZSwgY29kZV0pID0+IHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBuYW1lLCB7XG4gICAgICAgIGdldDogKCkgPT4gdGhpcy5iYWNrZ3JvdW5kKGNvZGUpLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBTdHlsZXNcbiAgICBPYmplY3QuZW50cmllcyhzdHlsZXMpLmZvckVhY2goKFtuYW1lLCBjb2RlXSkgPT4ge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIG5hbWUsIHtcbiAgICAgICAgZ2V0OiAoKSA9PiB0aGlzLnN0eWxlKGNvZGUpLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENsZWFycyBhbGwgc3R5bGluZyBmcm9tIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGFsbCBBTlNJIGNvbG9yIGFuZCBzdHlsZSBjb2RlcyBmcm9tIHRoZSB0ZXh0LlxuICAgKiBAcmV0dXJuIHtTdHlsZWRTdHJpbmd9IFRoZSBTdHlsZWRTdHJpbmcgaW5zdGFuY2Ugd2l0aCBjbGVhcmVkIHN0eWxpbmcuXG4gICAqL1xuICBjbGVhcigpOiBTdHlsZWRTdHJpbmcge1xuICAgIHRoaXMudGV4dCA9IGNsZWFyKHRoaXMudGV4dCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgcmF3IEFOU0kgY29kZXMgdG8gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IEFsbG93cyBkaXJlY3QgYXBwbGljYXRpb24gb2YgQU5TSSBlc2NhcGUgc2VxdWVuY2VzIHRvIHRoZSB0ZXh0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmF3QW5zaSAtIFRoZSByYXcgQU5TSSBlc2NhcGUgc2VxdWVuY2UgdG8gYXBwbHkuXG4gICAqIEByZXR1cm4ge1N0eWxlZFN0cmluZ30gVGhlIFN0eWxlZFN0cmluZyBpbnN0YW5jZSB3aXRoIHRoZSByYXcgQU5TSSBjb2RlIGFwcGxpZWQuXG4gICAqL1xuICByYXcocmF3QW5zaTogc3RyaW5nKTogU3R5bGVkU3RyaW5nIHtcbiAgICB0aGlzLnRleHQgPSByYXcodGhpcy50ZXh0LCByYXdBbnNpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyBhIGZvcmVncm91bmQgY29sb3IgdG8gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IFNldHMgdGhlIHRleHQgY29sb3IgdXNpbmcgQU5TSSBjb2xvciBjb2Rlcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG4gLSBUaGUgQU5TSSBjb2xvciBjb2RlIGZvciB0aGUgZm9yZWdyb3VuZCBjb2xvci5cbiAgICogQHJldHVybiB7U3R5bGVkU3RyaW5nfSBUaGUgU3R5bGVkU3RyaW5nIGluc3RhbmNlIHdpdGggdGhlIGZvcmVncm91bmQgY29sb3IgYXBwbGllZC5cbiAgICovXG4gIGZvcmVncm91bmQobjogbnVtYmVyKTogU3R5bGVkU3RyaW5nIHtcbiAgICB0aGlzLnRleHQgPSBjb2xvcml6ZUFOU0kodGhpcy50ZXh0LCBuKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyBhIGJhY2tncm91bmQgY29sb3IgdG8gdGhlIHRleHQuXG4gICAqIEBzdW1tYXJ5IFNldHMgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIHRleHQgdXNpbmcgQU5TSSBjb2xvciBjb2Rlcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG4gLSBUaGUgQU5TSSBjb2xvciBjb2RlIGZvciB0aGUgYmFja2dyb3VuZCBjb2xvci5cbiAgICogQHJldHVybiB7U3R5bGVkU3RyaW5nfSBUaGUgU3R5bGVkU3RyaW5nIGluc3RhbmNlIHdpdGggdGhlIGJhY2tncm91bmQgY29sb3IgYXBwbGllZC5cbiAgICovXG4gIGJhY2tncm91bmQobjogbnVtYmVyKTogU3R5bGVkU3RyaW5nIHtcbiAgICB0aGlzLnRleHQgPSBjb2xvcml6ZUFOU0kodGhpcy50ZXh0LCBuLCB0cnVlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyBhIHRleHQgc3R5bGUgdG8gdGhlIHN0cmluZy5cbiAgICogQHN1bW1hcnkgU2V0cyB0ZXh0IHN0eWxlcyBzdWNoIGFzIGJvbGQsIGl0YWxpYywgb3IgdW5kZXJsaW5lIHVzaW5nIEFOU0kgc3R5bGUgY29kZXMuXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgc3RyaW5nfSBuIC0gVGhlIHN0eWxlIGNvZGUgb3Iga2V5IGZyb20gdGhlIHN0eWxlcyBvYmplY3QuXG4gICAqIEByZXR1cm4ge1N0eWxlZFN0cmluZ30gVGhlIFN0eWxlZFN0cmluZyBpbnN0YW5jZSB3aXRoIHRoZSBzdHlsZSBhcHBsaWVkLlxuICAgKi9cbiAgc3R5bGUobjogbnVtYmVyIHwga2V5b2YgdHlwZW9mIHN0eWxlcyk6IFN0eWxlZFN0cmluZyB7XG4gICAgaWYgKHR5cGVvZiBuID09PSBcInN0cmluZ1wiICYmICEobiBpbiBzdHlsZXMpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYEludmFsaWQgc3R5bGU6ICR7bn1gKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0aGlzLnRleHQgPSBhcHBseVN0eWxlKHRoaXMudGV4dCwgbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYSAyNTYtY29sb3IgZm9yZWdyb3VuZCBjb2xvciB0byB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgU2V0cyB0aGUgdGV4dCBjb2xvciB1c2luZyB0aGUgZXh0ZW5kZWQgMjU2LWNvbG9yIHBhbGV0dGUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBuIC0gVGhlIGNvbG9yIG51bWJlciBmcm9tIHRoZSAyNTYtY29sb3IgcGFsZXR0ZS5cbiAgICogQHJldHVybiB7U3R5bGVkU3RyaW5nfSBUaGUgU3R5bGVkU3RyaW5nIGluc3RhbmNlIHdpdGggdGhlIDI1Ni1jb2xvciBmb3JlZ3JvdW5kIGFwcGxpZWQuXG4gICAqL1xuICBjb2xvcjI1NihuOiBudW1iZXIpOiBTdHlsZWRTdHJpbmcge1xuICAgIHRoaXMudGV4dCA9IGNvbG9yaXplMjU2KHRoaXMudGV4dCwgbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYSAyNTYtY29sb3IgYmFja2dyb3VuZCBjb2xvciB0byB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgU2V0cyB0aGUgYmFja2dyb3VuZCBjb2xvciB1c2luZyB0aGUgZXh0ZW5kZWQgMjU2LWNvbG9yIHBhbGV0dGUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBuIC0gVGhlIGNvbG9yIG51bWJlciBmcm9tIHRoZSAyNTYtY29sb3IgcGFsZXR0ZS5cbiAgICogQHJldHVybiB7U3R5bGVkU3RyaW5nfSBUaGUgU3R5bGVkU3RyaW5nIGluc3RhbmNlIHdpdGggdGhlIDI1Ni1jb2xvciBiYWNrZ3JvdW5kIGFwcGxpZWQuXG4gICAqL1xuICBiZ0NvbG9yMjU2KG46IG51bWJlcik6IFN0eWxlZFN0cmluZyB7XG4gICAgdGhpcy50ZXh0ID0gY29sb3JpemUyNTYodGhpcy50ZXh0LCBuLCB0cnVlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyBhbiBSR0IgZm9yZWdyb3VuZCBjb2xvciB0byB0aGUgdGV4dC5cbiAgICogQHN1bW1hcnkgU2V0cyB0aGUgdGV4dCBjb2xvciB1c2luZyBSR0IgdmFsdWVzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gciAtIFRoZSByZWQgY29tcG9uZW50ICgwLTI1NSkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBnIC0gVGhlIGdyZWVuIGNvbXBvbmVudCAoMC0yNTUpLlxuICAgKiBAcGFyYW0ge251bWJlcn0gYiAtIFRoZSBibHVlIGNvbXBvbmVudCAoMC0yNTUpLlxuICAgKiBAcmV0dXJuIHtTdHlsZWRTdHJpbmd9IFRoZSBTdHlsZWRTdHJpbmcgaW5zdGFuY2Ugd2l0aCB0aGUgUkdCIGZvcmVncm91bmQgY29sb3IgYXBwbGllZC5cbiAgICovXG4gIHJnYihyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKTogU3R5bGVkU3RyaW5nIHtcbiAgICB0aGlzLnRleHQgPSBjb2xvcml6ZVJHQih0aGlzLnRleHQsIHIsIGcsIGIpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIGFuIFJHQiBiYWNrZ3JvdW5kIGNvbG9yIHRvIHRoZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBTZXRzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIHVzaW5nIFJHQiB2YWx1ZXMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByIC0gVGhlIHJlZCBjb21wb25lbnQgKDAtMjU1KS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGcgLSBUaGUgZ3JlZW4gY29tcG9uZW50ICgwLTI1NSkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBiIC0gVGhlIGJsdWUgY29tcG9uZW50ICgwLTI1NSkuXG4gICAqIEByZXR1cm4ge1N0eWxlZFN0cmluZ30gVGhlIFN0eWxlZFN0cmluZyBpbnN0YW5jZSB3aXRoIHRoZSBSR0IgYmFja2dyb3VuZCBjb2xvciBhcHBsaWVkLlxuICAgKi9cbiAgYmdSZ2IocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlcik6IFN0eWxlZFN0cmluZyB7XG4gICAgdGhpcy50ZXh0ID0gY29sb3JpemVSR0IodGhpcy50ZXh0LCByLCBnLCBiLCB0cnVlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udmVydHMgdGhlIFN0eWxlZFN0cmluZyB0byBhIHJlZ3VsYXIgc3RyaW5nLlxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHRleHQgd2l0aCBhbGwgYXBwbGllZCBzdHlsaW5nLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBzdHlsZWQgdGV4dCBhcyBhIHJlZ3VsYXIgc3RyaW5nLlxuICAgKi9cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0O1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgc3R5bGluZyB0byBhIGdpdmVuIHRleHQgc3RyaW5nLlxuICogQHN1bW1hcnkgVGhpcyBmdW5jdGlvbiB0YWtlcyBhIHN0cmluZyBhbmQgcmV0dXJucyBhIFN0eWxlZFN0cmluZyBvYmplY3QsIHdoaWNoIGlzIGFuIGVuaGFuY2VkXG4gKiB2ZXJzaW9uIG9mIHRoZSBvcmlnaW5hbCBzdHJpbmcgd2l0aCBhZGRpdGlvbmFsIG1ldGhvZHMgZm9yIGFwcGx5aW5nIHZhcmlvdXMgQU5TSSBjb2xvciBhbmQgc3R5bGVcbiAqIG9wdGlvbnMuIEl0IHNldHMgdXAgYSBtYXBwZXIgb2JqZWN0IHdpdGggbWV0aG9kcyBmb3IgZGlmZmVyZW50IHN0eWxpbmcgb3BlcmF0aW9ucyBhbmQgdGhlblxuICogZGVmaW5lcyBwcm9wZXJ0aWVzIG9uIHRoZSB0ZXh0IHN0cmluZyB0byBtYWtlIHRoZXNlIG1ldGhvZHMgYWNjZXNzaWJsZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSB0ICBUaGUgaW5wdXQgdGV4dCB0byBiZSBzdHlsZWQuXG4gKiBAcmV0dXJuIHtTdHlsZWRTdHJpbmd9IEEgU3R5bGVkU3RyaW5nIG9iamVjdCB3aXRoIGFkZGl0aW9uYWwgc3R5bGluZyBtZXRob2RzLlxuICpcbiAqIEBmdW5jdGlvbiBzdHlsZVxuICpcbiAqIEBtZW1iZXJPZiBTdHlsZWRTdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0eWxlKC4uLnQ6IHN0cmluZ1tdKTogU3R5bGVkU3RyaW5nIHtcbiAgcmV0dXJuIG5ldyBTdHlsZWRTdHJpbmcodC5qb2luKFwiIFwiKSk7XG59Il19