UNPKG

@angular-package/wrapper

Version:

Wrap the text with the opening and closing chars.

86 lines 25 kB
var _Wrap_closing, _Wrap_opening, _Wrap_text; import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib"; export class Wrap extends String { constructor(opening, closing, text = '') { super(`${opening}${text}${closing}`); _Wrap_closing.set(this, void 0); _Wrap_opening.set(this, void 0); _Wrap_text.set(this, void 0); __classPrivateFieldSet(this, _Wrap_closing, String(closing), "f"); __classPrivateFieldSet(this, _Wrap_text, String(text), "f"); __classPrivateFieldSet(this, _Wrap_opening, String(opening), "f"); } get closing() { return __classPrivateFieldGet(this, _Wrap_closing, "f"); } get opening() { return __classPrivateFieldGet(this, _Wrap_opening, "f"); } get text() { return __classPrivateFieldGet(this, _Wrap_text, "f"); } get [(_Wrap_closing = new WeakMap(), _Wrap_opening = new WeakMap(), _Wrap_text = new WeakMap(), Symbol.toStringTag)]() { return 'Wrap'; } static hasClosing(text, closing) { return (typeof text === 'string' && text.length >= 1 && typeof closing === 'string' && closing.length >= 1 && text.slice(-closing.length) === closing); } static hasOpening(text, opening) { return (typeof text === 'string' && text.length >= 1 && typeof opening === 'string' && opening.length >= 1 && text.slice(0, opening.length) === opening); } static isWrap(value, opening, closing, text) { return typeof value === 'object' && value instanceof this ? (typeof opening === 'string' ? opening === value.opening : true) && (typeof closing === 'string' ? closing === value.closing : true) && (typeof text === 'string' ? text === value.text : true) : false; } getClosing() { return __classPrivateFieldGet(this, _Wrap_closing, "f"); } getOpening() { return __classPrivateFieldGet(this, _Wrap_opening, "f"); } getText() { return __classPrivateFieldGet(this, _Wrap_text, "f"); } hasClosing(closing) { return (__classPrivateFieldGet(this, _Wrap_closing, "f").length >= 1 && (typeof closing === 'string' ? __classPrivateFieldGet(this, _Wrap_closing, "f") === closing : true)); } hasOpening(opening) { return (__classPrivateFieldGet(this, _Wrap_opening, "f").length >= 1 && (typeof opening === 'string' ? __classPrivateFieldGet(this, _Wrap_opening, "f") === opening : true)); } hasText(text) { return (__classPrivateFieldGet(this, _Wrap_text, "f").length >= 1 && (typeof text === 'string' ? __classPrivateFieldGet(this, _Wrap_text, "f") === text : true)); } isWrapped(opening = __classPrivateFieldGet(this, _Wrap_opening, "f"), closing = __classPrivateFieldGet(this, _Wrap_closing, "f")) { return this.hasOpening(opening) && this.hasClosing(closing); } replaceClosing(closing) { return `${__classPrivateFieldGet(this, _Wrap_opening, "f")}${__classPrivateFieldGet(this, _Wrap_text, "f")}${closing}`; } replaceOpening(opening) { return `${opening}${__classPrivateFieldGet(this, _Wrap_text, "f")}${__classPrivateFieldGet(this, _Wrap_closing, "f")}`; } replaceText(text) { return `${__classPrivateFieldGet(this, _Wrap_opening, "f")}${text}${__classPrivateFieldGet(this, _Wrap_closing, "f")}`; } toString() { return super.toString(); } valueOf() { return super.valueOf(); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JhcC5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3dyYXBwZXIvc3JjL2xpYi93cmFwLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBS0EsTUFBTSxPQUFPLElBSVgsU0FBUSxNQUFNO0lBa0lkLFlBQVksT0FBZ0IsRUFBRSxPQUFnQixFQUFFLE9BQWEsRUFBVTtRQUNyRSxLQUFLLENBQUMsR0FBRyxPQUFPLEdBQUcsSUFBSSxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUM7UUF2RnZDLGdDQUFrQjtRQUtsQixnQ0FBa0I7UUFLakIsNkJBQVk7UUE4RVgsdUJBQUEsSUFBSSxpQkFBWSxNQUFNLENBQUMsT0FBTyxDQUFZLE1BQUEsQ0FBQztRQUMzQyx1QkFBQSxJQUFJLGNBQVMsTUFBTSxDQUFDLElBQUksQ0FBUyxNQUFBLENBQUM7UUFDbEMsdUJBQUEsSUFBSSxpQkFBWSxNQUFNLENBQUMsT0FBTyxDQUFZLE1BQUEsQ0FBQztJQUM3QyxDQUFDO0lBaElELElBQVcsT0FBTztRQUNoQixPQUFPLHVCQUFBLElBQUkscUJBQVMsQ0FBQztJQUN2QixDQUFDO0lBT0QsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sdUJBQUEsSUFBSSxxQkFBUyxDQUFDO0lBQ3ZCLENBQUM7SUFPRCxJQUFXLElBQUk7UUFDYixPQUFPLHVCQUFBLElBQUksa0JBQU0sQ0FBQztJQUNwQixDQUFDO0lBUUQsSUFBVyw0RkFBQyxNQUFNLENBQUMsV0FBVyxFQUFDO1FBQzdCLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUE0Qk0sTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFZLEVBQUUsT0FBZTtRQUNwRCxPQUFPLENBQ0wsT0FBTyxJQUFJLEtBQUssUUFBUTtZQUN4QixJQUFJLENBQUMsTUFBTSxJQUFJLENBQUM7WUFDaEIsT0FBTyxPQUFPLEtBQUssUUFBUTtZQUMzQixPQUFPLENBQUMsTUFBTSxJQUFJLENBQUM7WUFDbkIs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QUF1QjtRQUV2QixPQUFPLEdBQUcsT0FBTyxHQUFHLHVCQUFBLElBQUksa0JBQU0sR0FBRyx1QkFBQSxJQUFJLHFCQUFTLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0lBU00sV0FBVyxDQUNoQixJQUFpQjtRQUVqQixPQUFPLEdBQUcsdUJBQUEsSUFBSSxxQkFBUyxHQUFHLElBQUksR0FBRyx1QkFBQSxJQUFJLHFCQUFTLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0lBUU0sUUFBUTtRQUNiLE9BQU8sS0FBSyxDQUFDLFFBQVEsRUFBbUMsQ0FBQztJQUMzRCxDQUFDO0lBUU0sT0FBTztRQUNaLE9BQU8sS0FBSyxDQUFDLE9BQU8sRUFBbUMsQ0FBQztJQUMxRCxDQUFDO0NBRUYiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBgV3JhcGAgb2JqZWN0IGlzIGJhc2VkIG9uIHRoZSBgU3RyaW5nYCBvYmplY3QgYW5kIHJlcHJlc2VudHMgdGhlIGltbXV0YWJsZSBwcmltaXRpdmUgdmFsdWUgb2YgdGhlIHRleHQgd3JhcHBlZCBieSB0aGUgb3BlbmluZyBhbmRcbiAqIGNsb3NpbmcgY2hhcnMuIEl0IGlzIGRlc2lnbmVkIHRvIHByZXNlcnZlIHRoZSB0eXBlIG5hbWVzIG9mIHRoZSBzdXBwbGllZCBvcGVuaW5nLCB0ZXh0LCBhbmQgY2xvc2luZyBjaGFycyBieSB1c2luZyB0aGUgZ2VuZXJpYyB0eXBlXG4gKiB2YXJpYWJsZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBXcmFwPFxuICBPcGVuaW5nIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuICBUZXh0IGV4dGVuZHMgc3RyaW5nID0gYGAsXG4gIENsb3NpbmcgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmdcbj4gZXh0ZW5kcyBTdHJpbmcge1xuICAvLyNyZWdpb24gaW5zdGFuY2UgcHVibGljIGFjY2Vzc29ycy5cbiAgLyoqXG4gICAqIFRoZSBgZ2V0YCBhY2Nlc3NvciBnZXRzIHRoZSBjbG9zaW5nIG9mIHRoZSB3cmFwIGJ5IHJldHVybmluZyB0aGUgYCNjbG9zaW5nYCBwcm9wZXJ0eSBvZiBhIHNwZWNpZmllZCBvYmplY3QuXG4gICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgaXMgY2xvc2luZyBvZiB0aGUgd3JhcCBvZiBhIGdlbmVyaWMgdHlwZSB2YXJpYWJsZSBgQ2xvc2luZ2AuXG4gICAqIEBhbmd1bGFycGFja2FnZVxuICAgKi9cbiAgcHVibGljIGdldCBjbG9zaW5nKCk6IENsb3Npbmcge1xuICAgIHJldHVybiB0aGlzLiNjbG9zaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBgZ2V0YCBhY2Nlc3NvciBnZXRzIHRoZSBvcGVuaW5nIG9mIHRoZSB3cmFwIGJ5IHJldHVybmluZyB0aGUgYCNvcGVuaW5nYCBwcm9wZXJ0eSBvZiBhIHNwZWNpZmllZCBvYmplY3QuXG4gICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG9wZW5pbmcgb2YgdGhlIHdyYXAgb2YgYSBnZW5lcmljIHR5cGUgdmFyaWFibGUgYE9wZW5pbmdgLlxuICAgKiBAYW5ndWxhcnBhY2thZ2VcbiAgICovXG4gIHB1YmxpYyBnZXQgb3BlbmluZygpOiBPcGVuaW5nIHtcbiAgICByZXR1cm4gdGhpcy4jb3BlbmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYGdldGAgYWNjZXNzb3IgZ2V0cyB0aGUgdGV4dCBvZiB0aGUgYFdyYXBgIGJ5IHJldHVybmluZyB0aGUgYCN0ZXh0YCBwcm9wZXJ0eSBvZiBhIHNwZWNpZmllZCBvYmplY3QuXG4gICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHRleHQgb2YgYSBnZW5lcmljIHR5cGUgdmFyaWFibGUgYFRleHRgLlxuICAgKiBAYW5ndWxhcnBhY2thZ2VcbiAgICovXG4gIHB1YmxpYyBnZXQgdGV4dCgpOiBUZXh0IHtcbiAgICByZXR1cm4gdGhpcy4jdGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYGdldGAgYWNjZXNzb3IsIHdpdGggdGhlIGhlbHAgb2YgYHRvU3RyaW5nVGFnYCwgY2hhbmdlcyB0aGUgZGVmYXVsdCB0YWcgdG8gYCd3cmFwJ2AgZm9yIGFuIGluc3RhbmNlIG9mIGBXcmFwYC4gSXQgY2FuIGJlIHJlYWQgYnlcbiAgICogdGhlIGB0eXBlT2YoKWAgZnVuY3Rpb24gb2YgYEBhbmd1bGFyLXBhY2thZ2UvdHlwZWAuXG4gICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHdvcmQgJ3dyYXBgIG9mIGEgYHN0cmluZ2AuXG4gICAqIEBhbmd1bGFycGFja2FnZVxuICAgKi9cbiAgcHVibGljIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnV3JhcCc7XG4gIH1cbiAgLy8jZW5kcmVnaW9uIGluc3RhbmNlIHB1YmxpYyBhY2Nlc3NvcnMuXG5cbiAgLy8jcmVnaW9uIGluc3RhbmNlIHByaXZhdGUgcHJvcGVydGllcy5cbiAgLyoqXG4gICAqIFByaXZhdGUgcHJvcGVydHkgb2YgdGhlIGNsb3NpbmcgY2hhcnMgb2YgYSBnZW5lcmljIHR5cGUgdmFyaWFibGUgYENsb3NpbmdgLlxuICAgKi9cbiAgI2Nsb3Npbmc6IENsb3Npbmc7XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgcHJvcGVydHkgb2YgdGhlIG9wZW5pbmcgY2hhcnMgb2YgYSBnZW5lcmljIHR5cGUgdmFyaWFibGUgYE9wZW5pbmdgLlxuICAgKi9cbiAgI29wZW5pbmc6IE9wZW5pbmc7XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgcHJvcGVydHkgb2YgdGV4dCBvZiBhIGdlbmVyaWMgdHlwZSB2YXJpYWJsZSBgVGV4dGAuXG4gICAqL1xuICAgI3RleHQ6IFRleHQ7XG4gICAvLyNlbmRyZWdpb24gaW5zdGFuY2UgcHJpdmF0ZSBwcm9wZXJ0aWVzLlxuXG4gIC8vI3JlZ2lvbiBzdGF0aWMgcHVibGljIG1ldGhvZHMuXG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kIGNoZWNrcyB3aGV0aGVyIHRoZSB0ZXh0IGhhcyBnaXZlbiBgY2xvc2luZ2AgY2hhcnMgYXQgdGhlIGVuZC5cbiAgICogQHBhcmFtIHRleHQgVGhlIHRleHQgb2YgYHN0cmluZ2AgdHlwZSwgdG8gY2hlY2sgd2hldGhlciBpdCBjb250YWlucyBnaXZlbiBgY2xvc2luZ2AgY2hhcnMuXG4gICAqIEBwYXJhbSBjbG9zaW5nIFRoZSBjbG9zaW5nIGNoYXJzIG9mIGBzdHJpbmdgIHR5cGUgdG8gY2hlY2sgaWYgYSBnaXZlbiBgdGV4dGAgY29udGFpbnMuXG4gICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBgYm9vbGVhbmAgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBgdGV4dGAgY29udGFpbnMgYGNsb3NpbmdgIGNoYXJzIGF0IHRoZSBlbmQuXG4gICAqIEBhbmd1bGFycGFja2FnZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBoYXNDbG9zaW5nKHRleHQ6IHN0cmluZywgY2xvc2luZzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJyAmJlxuICAgICAgdGV4dC5sZW5ndGggPj0gMSAmJlxuICAgICAgdHlwZW9mIGNsb3NpbmcgPT09ICdzdHJpbmcnICYmXG4gICAgICBjbG9zaW5nLmxlbmd0aCA+PSAxICYmXG4gICAgICB0ZXh0LnNsaWNlKC1jbG9zaW5nLmxlbmd0aCkgPT09IGNsb3NpbmdcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSB0ZXh0IGhhcyBgb3BlbmluZ2AgY2hhcnMgYXQgdGhlIGJlZ2lubmluZy5cbiAgICogQHBhcmFtIHRleHQgVGhlIHRleHQgb2YgYHN0cmluZ2AsIHRvIGNoZWNrIHdoZXRoZXIgaXQgY29udGFpbnMgZ2l2ZW4gYG9wZW5pbmdgIGNoYXJzLlxuICAgKiBAcGFyYW0gb3BlbmluZyBUaGUgb3BlbmluZyBjaGFycyBvZiBgc3RyaW5nYCB0byBjaGVjayBpZiBhIGdpdmVuIGB0ZXh0YCBjb250YWlucy5cbiAgICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSBpcyBhIGBib29sZWFuYCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGB0ZXh0YCBjb250YWlucyBgb3BlbmluZ2AgY2hhcnMgYXQgdGhlIGJlZ2lubmluZy5cbiAgICogQGFuZ3VsYXJwYWNrYWdlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGhhc09wZW5pbmcodGV4dDogc3RyaW5nLCBvcGVuaW5nOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIHRleHQgPT09ICdzdHJpbmcnICYmXG4gICAgICB0ZXh0Lmxlbmd0aCA+PSAxICYmXG4gICAgICB0eXBlb2Ygb3BlbmluZyA9PT0gJ3N0cmluZycgJiZcbiAgICAgIG9wZW5pbmcubGVuZ3RoID49IDEgJiZcbiAgICAgIHRleHQuc2xpY2UoMCwgb3BlbmluZy5sZW5ndGgpID09PSBvcGVuaW5nXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kIGNoZWNrcyB3aGV0aGVyIHRoZSBgdmFsdWVgIG9mIGFueSB0eXBlIGlzIHRoZSBgV3JhcGAgaW5zdGFuY2Ugb2YgYW55IG9yIGdpdmVuIGBvcGVuaW5nYCBhbmQgYGNsb3NpbmdgIGNoYXJzLlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIGFueSB0eXBlIHRvIHRlc3QgYWdhaW5zdCB0aGUgYFdyYXBgIGluc3RhbmNlIG9mIGFueSBvciBnaXZlbiBvcGVuaW5nIGFuZCBjbG9zaW5nLlxuICAgKiBAcGFyYW0gb3BlbmluZyBPcHRpb25hbCBvcGVuaW5nIGNoYXJzIG9mIGEgZ2VuZXJpYyB0eXBlIHZhcmlhYmxlIGBPcGVuaW5nYCB0byBjaGVjayBpZiB0aGUgZ2l2ZW4gYHZhbHVlYCBjb250YWlucy5cbiAgICogQHBhcmFtIGNsb3NpbmcgT3B0aW9uYWwgY2xvc2luZyBjaGFycyBvZiBhIGdlbmVyaWMgdHlwZSB2YXJpYWJsZSBgQ2xvc2luZ2AgdG8gY2hlY2sgaWYgdGhlIGdpdmVuIGB2YWx1ZWAgY29udGFpbnMuXG4gICAqIEBwYXJhbSB0ZXh0IEFuIG9wdGlvbmFsIHRleHQgb2YgYSBnZW5lcmljIHR5cGUgdmFyaWFibGUgYFRleHRgIHRvIGNoZWNrIGlmIHRoZSBnaXZlbiBgdmFsdWVgIGNvbnRhaW5zLlxuICAgKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgYGJvb2xlYW5gIHR5cGUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB2YWx1ZSBpcyBhbiBpbnN0YW5jZSBvZiBgV3JhcGAgb2YgYW55LCBvciB0aGUgZ2l2ZW4gb3BlbmluZyxcbiAgICogY2xvc2luZywgYW5kIHRleHQuXG4gICAqIEBhbmd1bGFycGFja2FnZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpc1dyYXA8XG4gICAgT3BlbmluZyBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbiAgICBDbG9zaW5nIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuICAgIFRleHQgZXh0ZW5kcyBzdHJpbmcgPSBgYFxuICA+KFxuICAgIHZhbHVlOiBhbnksXG4gICAgb3BlbmluZz86IE9wZW5pbmcsXG4gICAgY2xvc2luZz86IENsb3NpbmcsXG4gICAgdGV4dD86IFRleHRcbiAgKTogdmFsdWUgaXMgV3JhcDxPcGVuaW5nLCBUZXh0LCBDbG9zaW5nPiB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgaW5zdGFuY2VvZiB0aGlzXG4gICAgICA/ICh0eXBlb2Ygb3BlbmluZyA9PT0gJ3N0cmluZycgPyBvcGVuaW5nID09PSB2YWx1ZS5vcGVuaW5nIDogdHJ1ZSkgJiZcbiAgICAgICAgICAodHlwZW9mIGNsb3NpbmcgPT09ICdzdHJpbmcnID8gY2xvc2luZyA9PT0gdmFsdWUuY2xvc2luZyA6IHRydWUpICYmXG4gICAgICAgICAgKHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJyA/IHRleHQgPT09IHZhbHVlLnRleHQgOiB0cnVlKVxuICAgICAgOiBmYWxzZTtcbiAgfVxuICAvLyNlbmRyZWdpb24gc3RhdGljIHB1YmxpYyBtZXRob2RzLlxuXG4gIC8vI3JlZ2lvbiBjb25zdHJ1Y3Rvci5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgYFdyYXBgIGluc3RhbmNlIG9mIHRoZSBvcGVuaW5nIGFuZCBjbG9zaW5nIGNoYXJzIGFuZCBvcHRpb25hbCB0ZXh0IHRvIHdyYXAuXG4gICAqIEBwYXJhbSBvcGVuaW5nIE9wZW5pbmcgY2hhcmFjdGVycyBvZiB0aGUgZ2VuZXJpYyB0eXBlIHZhcmlhYmxlIGBPcGVuaW5nYCBwbGFjZWQgYmVmb3JlIHRoZSBnaXZlbiBgdGV4dGAuIEFuIGVtcHR5IGBzdHJpbmdgIGluZGljYXRlc1xuICAgKiB0aGF0IGZvciB0aGUgYGhhc09wZW5pbmcoKWAgYW5kIGBpc1dyYXBwZWQoKWAgbWV0aG9kcywgdGhlIG9wZW5pbmcgY2hhcnMgYXJlIGB1bmRlZmluZWRgLCByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICogQHBhcmFtIGNsb3NpbmcgQ2xvc2luZyBjaGFyYWN0ZXJzIG9mIHRoZSBnZW5lcmljIHR5cGUgdmFyaWFibGUgYENsb3NpbmdgIHBsYWNlZCBhZnRlciB0aGUgZ2l2ZW4gYHRleHRgLiBBbiBlbXB0eSBgc3RyaW5nYCBpbmRpY2F0ZXNcbiAgICogdGhhdCBmb3IgdGhlIGBoYXNDbG9zaW5nKClgIGFuZCBgaXNXcmFwcGVkKClgIG1ldGhvZHMsIHRoZSBjbG9zaW5nIGNoYXJzIGFyZSBgdW5kZWZpbmVkYCwgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAqIEBwYXJhbSB0ZXh0IEFuIG9wdGlvbmFsIHRleHQgcGxhY2VkIGJldHdlZW4gdGhlIGdpdmVuIGBvcGVuaW5nYCBhbmQgYGNsb3NpbmdgIGNoYXJzIG9uIHRoZSB0ZW1wbGF0ZSBgJHtPcGVuaW5nfSR7VGV4dH0ke0Nsb3Npbmd9YC5cbiAgICogQGFuZ3VsYXJwYWNrYWdlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcGVuaW5nOiBPcGVuaW5nLCBjbG9zaW5nOiBDbG9zaW5nLCB0ZXh0OiBUZXh0ID0gJycgYXMgVGV4dCkge1xuICAgIHN1cGVyKGAke29wZW5pbmd9JHt0ZXh0fSR7Y2xvc2luZ31gKTtcbiAgICB0aGlzLiNjbG9zaW5nID0gU3RyaW5nKGNsb3NpbmcpIGFzIENsb3Npbmc7XG4gICAgdGhpcy4jdGV4dCA9IFN0cmluZyh0ZXh0KSBhcyBUZXh0O1xuICAgIHRoaXMuI29wZW5pbmcgPSBTdHJpbmcob3BlbmluZykgYXMgT3BlbmluZztcbiAgfVxuICAvLyNlbmRyZWdpb24gY29uc3RydWN0b3IuXG5cbiAgLy8jcmVnaW9uIGluc3RhbmNlIHB1YmxpYyBtZXRob2RzLlxuICAvKipcbiAgICogR2V0cyB0aGUgY2xvc2luZyBjaGFycyBvZiB0aGUgd3JhcCBieSByZXR1cm5pbmcgdGhlIGAjY2xvc2luZ2AgcHJvcGVydHkgb2YgYSBzcGVjaWZpZWQgb2JqZWN0LlxuICAgKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIGlzIGNsb3NpbmcgY2hhcnMgb2YgYSBnZW5lcmljIHR5cGUgdmFyaWFibGUgYENsb3NpbmdgLlxuICAgKiBAYW5ndWxhcnBhY2thZ2VcbiAgICovXG4gIHB1YmxpYyBnZXRDbG9zaW5nKCk6IENsb3Npbmcge1xuICAgIHJldHVybiB0aGlzLiNjbG9zaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG9wZW5pbmcgY2hhcnMgb2YgdGhlIHdyYXAgYnkgcmV0dXJuaW5nIHRoZSBgI29wZW5pbmdgIHByb3BlcnR5IG9mIGEgc3BlY2lmaWVkIG9iamVjdC5cbiAgICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSBpcyBvcGVuaW5nIGNoYXJzIG9mIGEgZ2VuZXJpYyB0eXBlIHZhcmlhYmxlIGBPcGVuaW5nYC5cbiAgICogQGFuZ3VsYXJwYWNrYWdlXG4gICAqL1xuICBwdWJsaWMgZ2V0T3BlbmluZygpOiBPcGVuaW5nIHtcbiAgICByZXR1cm4gdGhpcy4jb3BlbmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB0ZXh0IG9mIHRoZSB3cmFwIGJ5IHJldHVybmluZyB0aGUgYCN0ZXh0YCBwcm9wZXJ0eSBvZiBhIHNwZWNpZmllZCBvYmplY3QsIHdpdGhvdXQgdGhlIG9wZW5pbmcgYW5kIGNsb3NpbmcgY2hhcnMgb2YgdGhlIGBXcmFwYC5cbiAgICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgdGV4dCBvZiBhIGdlbmVyaWMgdHlwZSB2YXJpYWJsZSBgVGV4dGAuXG4gICAqIEBhbmd1bGFycGFja2FnZVxuICAgKi9cbiAgcHVibGljIGdldFRleHQoKTogVGV4dCB7XG4gICAgcmV0dXJuIHRoaXMuI3RleHQ7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHByaW1pdGl2ZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBvYmplY3QgaGFzIHRoZSBjbG9zaW5nIGNoYXJzIG9yIGdpdmVuIGBjbG9zaW5nYCBjaGFycy4gSWYgZ2l2ZW4gYGNsb3NpbmdgIGNoYXJzIGluXG4gICAqIHRoZSBjb25zdHJ1Y3RvciBhcmUgdGhlIGVtcHR5IGBzdHJpbmdgLCB0aGUgbWV0aG9kIHJldHVybnMgYGZhbHNlYC5cbiAgICogQHBhcmFtIGNsb3NpbmcgT3B0aW9uYWwgY2xvc2luZyBjaGFycyBvZiBhIGBzdHJpbmdgIHR5cGUgdG8gY2hlY2sgd2hldGhlciB0aGUgcHJpbWl0aXZlIHZhbHVlIGNvbnRhaW5zIHRoZW0gYXQgdGhlICoqZW5kKiouXG4gICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBgYm9vbGVhbmAgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBwcmltaXRpdmUgdmFsdWUgaGFzIHRoZSBjbG9zaW5nIGNoYXJzIG9yIGdpdmVuIGNsb3NpbmcgY2hhcnMuXG4gICAqIEBhbmd1bGFycGFja2FnZVxuICAgKi9cbiAgcHVibGljIGhhc0Nsb3NpbmcoY2xvc2luZz86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLiNjbG9zaW5nLmxlbmd0aCA+PSAxICYmXG4gICAgICAodHlwZW9mIGNsb3NpbmcgPT09ICdzdHJpbmcnID8gdGhpcy4jY2xvc2luZyA9PT0gY2xvc2luZyA6IHRydWUpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcHJpbWl0aXZlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIG9iamVjdCBoYXMgdGhlIG9wZW5pbmcgY2hhcnMgb3IgZ2l2ZW4gYG9wZW5pbmdgIGNoYXJzLiBJZiBnaXZlbiBgb3BlbmluZ2AgY2hhcnMgaW5cbiAgICogdGhlIGNvbnN0cnVjdG9yIGFyZSB0aGUgZW1wdHkgYHN0cmluZ2AsIHRoZSBtZXRob2QgcmV0dXJucyBgZmFsc2VgLlxuICAgKiBAcGFyYW0gb3BlbmluZyBPcHRpb25hbCBvcGVuaW5nIGNoYXJzIG9mIGEgYHN0cmluZ2AgdHlwZSB0byBjaGVjayBpZiB0aGUgcHJpbWl0aXZlIHZhbHVlIGNvbnRhaW5zIHRoZW0gYXQgdGhlICoqYmVnaW5uaW5nKiouXG4gICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBgYm9vbGVhbmAgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBwcmltaXRpdmUgdmFsdWUgaGFzIHRoZSBvcGVuaW5nIGNoYXJzIG9yIGdpdmVuIGBvcGVuaW5nYCBjaGFycy5cbiAgICogQGFuZ3VsYXJwYWNrYWdlXG4gICAqL1xuICBwdWJsaWMgaGFzT3BlbmluZyhvcGVuaW5nPzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuI29wZW5pbmcubGVuZ3RoID49IDEgJiZcbiAgICAgICh0eXBlb2Ygb3BlbmluZyA9PT0gJ3N0cmluZycgPyB0aGlzLiNvcGVuaW5nID09PSBvcGVuaW5nIDogdHJ1ZSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtZXRob2QgY2hlY2tzIHdoZXRoZXIgdGhlIHRleHQgb2YgYSBzcGVjaWZpZWQgYFdyYXBgIG9iamVjdCBpcyBkZWZpbmVkLCB3aGljaCBtZWFucyBpdCdzIGEgYHN0cmluZ2Agb2YgYXQgbGVhc3Qgb25lIGNoYXIgYW5kXG4gICAqIG9wdGlvbmFsbHkgZXF1YWwgdG8gdGhlIGdpdmVuIGB0ZXh0YC5cbiAgICogQHBhcmFtIHRleHQgT3B0aW9uYWwgdGV4dCBvZiBgc3RyaW5nYCB0eXBlIHRvIGNoZWNrIHdoZXRoZXIgaXQncyBlcXVhbCB0byB0aGUgdGV4dCBvZiB0aGUgYFdyYXBgIG9iamVjdC5cbiAgICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSBpcyBhIGBib29sZWFuYCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRleHQgaXMgZGVmaW5lZCBhbmQgb3B0aW9uYWxseSBlcXVhbCB0byB0aGUgZ2l2ZW4gdGV4dC5cbiAgICogQGFuZ3VsYXJwYWNrYWdlXG4gICAqL1xuICBwdWJsaWMgaGFzVGV4dCh0ZXh0Pzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuI3RleHQubGVuZ3RoID49IDEgJiZcbiAgICAgICh0eXBlb2YgdGV4dCA9PT0gJ3N0cmluZycgPyB0aGlzLiN0ZXh0ID09PSB0ZXh0IDogdHJ1ZSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtZXRob2QgY2hlY2tzIHdoZXRoZXIgdGhlIHByaW1pdGl2ZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGBvYmplY3RgIGlzIHdyYXBwZWQgYnkgdGhlIG9wZW5pbmcgYW5kIGNsb3NpbmcgY2hhcnMgb2YgYW4gaW5zdGFuY2Ugb3JcbiAgICogZ2l2ZW4gYG9wZW5pbmdgIGFuZCBgY2xvc2luZ2AgY2hhcnMuIElmIGdpdmVuIGBvcGVuaW5nYCBvciBgY2xvc2luZ2AgY2hhcnMgaW4gdGhlIGNvbnN0cnVjdG9yIGFyZSB0aGUgZW1wdHkgYHN0cmluZ2AsIHRoZSBtZXRob2RcbiAgICogcmV0dXJucyBgZmFsc2VgLlxuICAgKiBAcGFyYW0gb3BlbmluZyBPcHRpb25hbCBvcGVuaW5nIGNoYXJzIG9mIGEgYHN0cmluZ2AgdHlwZSB0byBjaGVjayBpZiB0aGUgcHJpbWl0aXZlIHZhbHVlIGNvbnRhaW5zIHRoZW0gYXQgdGhlIGJlZ2lubmluZy4gVGhlIGRlZmF1bHRcbiAgICogdmFsdWUgaXMgcGlja2VkIGZyb20gdGhlIHByaXZhdGUgYCNvcGVuaW5nYCBwcm9wZXJ0eSBvZiBhbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIGNsb3NpbmcgT3B0aW9uYWwgY2xvc2luZyBjaGFycyBvZiBhIGBzdHJpbmdgIHR5cGUgdG8gY2hlY2sgaWYgdGhlIHByaW1pdGl2ZSB2YWx1ZSBjb250YWlucyB0aGVtIGF0IHRoZSBlbmQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzXG4gICAqIHBpY2tlZCBmcm9tIHRoZSBwcml2YXRlIGAjY2xvc2luZ2AgcHJvcGVydHkgb2YgYW4gaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBgYm9vbGVhbmAgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBvYmplY3QgaGFzIGJvdGggb3BlbmluZyBhbmQgY2xvc2luZyBjaGFycyBvciBnaXZlbiBgb3BlbmluZ2AgYW5kXG4gICAqIGBjbG9zaW5nYCBjaGFycy5cbiAgICogQGFuZ3VsYXJwYWNrYWdlXG4gICAqL1xuICBwdWJsaWMgaXNXcmFwcGVkKFxuICAgIG9wZW5pbmc6IHN0cmluZyA9IHRoaXMuI29wZW5pbmcsXG4gICAgY2xvc2luZzogc3RyaW5nID0gdGhpcy4jY2xvc2luZ1xuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNPcGVuaW5nKG9wZW5pbmcpICYmIHRoaXMuaGFzQ2xvc2luZyhjbG9zaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwcmltaXRpdmUgdmFsdWUgd2l0aCByZXBsYWNlZCBjbG9zaW5nIGNoYXJzLlxuICAgKiBAcGFyYW0gY2xvc2luZyBUaGUgY2xvc2luZyBjaGFycyBvZiBhIGdlbmVyaWMgdHlwZSB2YXJpYWJsZSBgUmVwbGFjZUNsb3NpbmdgIHRvIHJlcGxhY2UgdGhlIGNsb3NpbmcgY2hhcnMgaW4gdGhlIHByaW1pdGl2ZSB2YWx1ZS5cbiAgICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgcHJpbWl0aXZlIHZhbHVlIHdpdGggcmVwbGFjZWQgY2xvc2luZyBjaGFycyBvZiBhIGdlbmVyaWMgdHlwZSB2YXJpYWJsZXMgaW4gb3JkZXIgYE9wZW5pbmdgLCBgVGV4dGAgYW5kXG4gICAqIGBSZXBsYWNlQ2xvc2luZ2Agb24gdGhlIHRlbXBsYXRlIGAke09wZW5pbmd9JHtUZXh0fSR7UmVwbGFjZUNsb3Npbmd9YC5cbiAgICogQGFuZ3VsYXJwYWNrYWdlXG4gICAqL1xuICBwdWJsaWMgcmVwbGFjZUNsb3Npbmc8UmVwbGFjZUNsb3NpbmcgZXh0ZW5kcyBzdHJpbmcgPSAnJz4oXG4gICAgY2xvc2luZzogUmVwbGFjZUNsb3NpbmdcbiAgKTogYCR7T3BlbmluZ30ke1RleHR9JHtSZXBsYWNlQ2xvc2luZ31gIHtcbiAgICByZXR1cm4gYCR7dGhpcy4jb3BlbmluZ30ke3RoaXMuI3RleHR9JHtjbG9zaW5nfWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcHJpbWl0aXZlIHZhbHVlIHdpdGggcmVwbGFjZWQgb3BlbmluZyBjaGFycy5cbiAgICogQHBhcmFtIG9wZW5pbmcgVGhlIG9wZW5pbmcgY2hhcnMgb2YgYSBnZW5lcmljIHR5cGUgdmFyaWFibGUgYFJlcGxhY2VPcGVuaW5nYCB0byByZXBsYWNlIHRoZSBvcGVuaW5nIGNoYXJzIGluIHRoZSBwcmltaXRpdmUgdmFsdWUuXG4gICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHByaW1pdGl2ZSB2YWx1ZSB3aXRoIHJlcGxhY2VkIG9wZW5pbmcgY2hhcnMgb2YgYSBnZW5lcmljIHR5cGUgdmFyaWFibGVzIGluIG9yZGVyIGBSZXBsYWNlT3BlbmluZ2AsXG4gICAqIGBUZXh0YCBhbmQgYENsb3NpbmdgIG9uIHRoZSB0ZW1wbGF0ZSBgJHtSZXBsYWNlT3BlbmluZ30ke1RleHR9JHtDbG9zaW5nfWAuXG4gICAqIEBhbmd1bGFycGFja2FnZVxuICAgKi9cbiAgcHVibGljIHJlcGxhY2VPcGVuaW5nPFJlcGxhY2VPcGVuaW5nIGV4dGVuZHMgc3RyaW5nID0gJyc+KFxuICAgIG9wZW5pbmc6IFJlcGxhY2VPcGVuaW5nXG4gICk6IGAke1JlcGxhY2VPcGVuaW5nfSR7VGV4dH0ke0Nsb3Npbmd9YCB7XG4gICAgcmV0dXJuIGAke29wZW5pbmd9JHt0aGlzLiN0ZXh0fSR7dGhpcy4jY2xvc2luZ31gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHByaW1pdGl2ZSB2YWx1ZSB3aXRoIHJlcGxhY2VkIHRleHQuXG4gICAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IG9mIGEgZ2VuZXJpYyB0eXBlIHZhcmlhYmxlIGBSZXBsYWNlVGV4dGAgdG8gcmVwbGFjZSB0aGUgdGV4dCBpbiB0aGUgcHJpbWl0aXZlIHZhbHVlLlxuICAgKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBwcmltaXRpdmUgdmFsdWUgd2l0aCByZXBsYWNlZCB0ZXh0IG9mIGEgZ2VuZXJpYyB0eXBlIHZhcmlhYmxlcyBpbiBvcmRlciBgT3BlbmluZ2AsIGBSZXBsYWNlVGV4dGBcbiAgICogYW5kIGBDbG9zaW5nYCBvbiB0aGUgdGVtcGxhdGUgYCR7T3BlbmluZ30ke1JlcGxhY2VUZXh0fSR7Q2xvc2luZ31gLlxuICAgKiBAYW5ndWxhcnBhY2thZ2VcbiAgICovXG4gIHB1YmxpYyByZXBsYWNlVGV4dDxSZXBsYWNlVGV4dCBleHRlbmRzIHN0cmluZyA9ICcnPihcbiAgICB0ZXh0OiBSZXBsYWNlVGV4dFxuICApOiBgJHtPcGVuaW5nfSR7UmVwbGFjZVRleHR9JHtDbG9zaW5nfWAge1xuICAgIHJldHVybiBgJHt0aGlzLiNvcGVuaW5nfSR7dGV4dH0ke3RoaXMuI2Nsb3Npbmd9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB3cmFwLCB0aGUgcHJpbWl0aXZlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIGBXcmFwYCBvYmplY3QuXG4gICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHdyYXAgb2YgZ2VuZXJpYyB0eXBlIHZhcmlhYmxlcyBpbiBvcmRlciBgT3BlbmluZ2AsIGBUZXh0YCwgYW5kIGBDbG9zaW5nYCBvbiB0aGUgdGVtcGxhdGVcbiAgICogYCR7T3BlbmluZ30ke1RleHR9JHtDbG9zaW5nfWAuXG4gICAqIEBhbmd1bGFycGFja2FnZVxuICAgKi9cbiAgcHVibGljIHRvU3RyaW5nKCk6IGAke09wZW5pbmd9JHtUZXh0fSR7Q2xvc2luZ31gIHtcbiAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSBhcyBgJHtPcGVuaW5nfSR7VGV4dH0ke0Nsb3Npbmd9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB3cmFwLCBwcmltaXRpdmUgdmFsdWUgb2YgYSBzcGVjaWZpZWQgYFdyYXBgIG9iamVjdC5cbiAgICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgd3JhcCBvZiBnZW5lcmljIHR5cGUgdmFyaWFibGVzIGluIG9yZGVyIGBPcGVuaW5nYCwgYFRleHRgLCBhbmQgYENsb3NpbmdgIG9uIHRoZSB0ZW1wbGF0ZVxuICAgKiBgJHtPcGVuaW5nfSR7VGV4dH0ke0Nsb3Npbmd9YC5cbiAgICogQGFuZ3VsYXJwYWNrYWdlXG4gICAqL1xuICBwdWJsaWMgdmFsdWVPZigpOiBgJHtPcGVuaW5nfSR7VGV4dH0ke0Nsb3Npbmd9YCB7XG4gICAgcmV0dXJuIHN1cGVyLnZhbHVlT2YoKSBhcyBgJHtPcGVuaW5nfSR7VGV4dH0ke0Nsb3Npbmd9YDtcbiAgfVxuICAvLyNlbmRyZWdpb24gaW5zdGFuY2UgcHVibGljIG1ldGhvZHMuXG59XG4iXX0=