UNPKG

projen

Version:

CDK for software projects

149 lines • 17.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CommitAndTagVersion = void 0; /** * Library to invoke commit-and-tag-version */ const fs_1 = require("fs"); const path = require("node:path"); const logging = require("../logging"); const util_1 = require("../util"); const DEFAULT_CATV_SPEC = "commit-and-tag-version@^12"; class CommitAndTagVersion { constructor(packageSpec, cwd, options) { this.cwd = cwd; this.options = options; let cmd; if (!packageSpec) { // If no packageSpec is given, try and resolve the CATV binary // from devDependencies. This will speed up execution a lot. try { cmd = `${process.execPath} ${require.resolve("commit-and-tag-version/bin/cli.js")}`; } catch { // Oh well } } this.cmd = cmd ?? `npx ${packageSpec ?? DEFAULT_CATV_SPEC}`; } /** * Invoke the `commit-and-tag` package */ async invoke(options) { const catvConfig = { packageFiles: [ { filename: this.options.versionFile, type: "json", }, ], bumpFiles: [ { filename: this.options.versionFile, type: "json", }, ], commitAll: false, infile: this.options.changelogFile, prerelease: this.options.prerelease, header: "", skip: { commit: true, tag: true, bump: options.skipBump, changelog: options.skipChangelog, }, tagPrefix: this.options.tagPrefix ? `${this.options.tagPrefix}v` : undefined, releaseAs: options.releaseAs, dryRun: options.dryRun, ...this.options.configOptions, }; logging.debug(`.versionrc.json: ${JSON.stringify(catvConfig)}`); // Generate a temporary config file, then execute the package and remove the // config file again. const rcfile = path.join(this.cwd, ".versionrc.json"); await fs_1.promises.writeFile(rcfile, JSON.stringify(catvConfig, undefined, 2)); try { let ret; if (options.capture) { ret = (0, util_1.execCapture)(this.cmd, { cwd: this.cwd, }).toString(); } else { ret = (0, util_1.exec)(this.cmd, { cwd: this.cwd }); } return ret; } finally { await fs_1.promises.unlink(rcfile); } } /** * Regenerate the most recent change log * * Do this by deleting the most recent tag, running CATV, then * restoring the tag. * * We do this combined with skipping the bump to make CATV regenerate the * changelog of the most recent release (if we left the tag, the changelog * would be empty). */ async regeneratePreviousChangeLog(version, latestTag) { const oldCommit = (0, util_1.execCapture)(`git rev-parse ${latestTag}`, { cwd: this.cwd, }) .toString("utf8") .trim(); (0, util_1.exec)(`git tag --delete ${latestTag}`, { cwd: this.cwd }); try { await this.invoke({ releaseAs: version, skipBump: true, }); } finally { (0, util_1.exec)(`git tag ${latestTag} ${oldCommit}`, { cwd: this.cwd }); } } /** * Invoke CATV and return the version it would have bumped to * * CATV will always at least perform a patch bump, even if there aren't any * commits to look at. * * We have to do this by parsing the output string, which is pretty bad * but I don't see that we have another way. */ async dryRun() { const output = stripAnsi(await this.invoke({ capture: true, dryRun: true, skipChangelog: true, })); const re = /bumping version.*from ([0-9a-z.+-]+) to ([0-9a-z.+-]+)/im; const m = re.exec(output); if (!m) { throw new Error(`Could not match ${re} in ${output}`); } return m[2]; } } exports.CommitAndTagVersion = CommitAndTagVersion; /** * Strips ANSI escape codes from a string * * Need to use this because the `--no-colors` argument to CATV is sometimes * respected and sometimes not and it's driving me crazy. */ function stripAnsi(str) { // Pattern matches all ANSI escape sequences including colors, cursor movement, etc const pattern = [ "[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)", "(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))", ].join("|"); return str.replace(new RegExp(pattern, "g"), ""); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWl0LXRhZy12ZXJzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlbGVhc2UvY29tbWl0LXRhZy12ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOztHQUVHO0FBQ0gsMkJBQW9DO0FBQ3BDLGtDQUFrQztBQUVsQyxzQ0FBc0M7QUFDdEMsa0NBQTRDO0FBRTVDLE1BQU0saUJBQWlCLEdBQUcsNEJBQTRCLENBQUM7QUFtQnZELE1BQWEsbUJBQW1CO0lBRzlCLFlBQ0UsV0FBK0IsRUFDZCxHQUFXLEVBQ1gsT0FBNEI7UUFENUIsUUFBRyxHQUFILEdBQUcsQ0FBUTtRQUNYLFlBQU8sR0FBUCxPQUFPLENBQXFCO1FBRTdDLElBQUksR0FBRyxDQUFDO1FBQ1IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLDhEQUE4RDtZQUM5RCw0REFBNEQ7WUFDNUQsSUFBSSxDQUFDO2dCQUNILEdBQUcsR0FBRyxHQUFHLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxtQ0FBbUMsQ0FBQyxFQUFFLENBQUM7WUFDdEYsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCxVQUFVO1lBQ1osQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxPQUFPLFdBQVcsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO0lBQzlELENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxNQUFNLENBQ2pCLE9BQVU7UUFFVixNQUFNLFVBQVUsR0FBdUI7WUFDckMsWUFBWSxFQUFFO2dCQUNaO29CQUNFLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVc7b0JBQ2xDLElBQUksRUFBRSxNQUFNO2lCQUNiO2FBQ0Y7WUFDRCxTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVztvQkFDbEMsSUFBSSxFQUFFLE1BQU07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SSxDQUFDLE1BQU0sQ0FBQztZQUNoQixPQUFPLEVBQUUsSUFBSTtZQUNiLE1BQU0sRUFBRSxJQUFJO1lBQ1osYUFBYSxFQUFFLElBQUk7U0FDcEIsQ0FBQyxDQUNILENBQUM7UUFDRixNQUFNLEVBQUUsR0FBRywwREFBMEQsQ0FBQztRQUN0RSxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNQLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFFRCxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLENBQUM7Q0FDRjtBQXBJRCxrREFvSUM7QUF3QkQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFNBQVMsQ0FBQyxHQUFXO0lBQzVCLG1GQUFtRjtJQUNuRixNQUFNLE9BQU8sR0FBRztRQUNkLDhIQUE4SDtRQUM5SCwwREFBMEQ7S0FDM0QsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDWixPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ25ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIExpYnJhcnkgdG8gaW52b2tlIGNvbW1pdC1hbmQtdGFnLXZlcnNpb25cbiAqL1xuaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSBcImNvbnZlbnRpb25hbC1jaGFuZ2Vsb2ctY29uZmlnLXNwZWNcIjtcbmltcG9ydCAqIGFzIGxvZ2dpbmcgZnJvbSBcIi4uL2xvZ2dpbmdcIjtcbmltcG9ydCB7IGV4ZWMsIGV4ZWNDYXB0dXJlIH0gZnJvbSBcIi4uL3V0aWxcIjtcblxuY29uc3QgREVGQVVMVF9DQVRWX1NQRUMgPSBcImNvbW1pdC1hbmQtdGFnLXZlcnNpb25AXjEyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0QW5kVGFnT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHRhZ1ByZWZpeD86IHN0cmluZztcbiAgcmVhZG9ubHkgdmVyc2lvbkZpbGU6IHN0cmluZztcbiAgcmVhZG9ubHkgY2hhbmdlbG9nRmlsZT86IHN0cmluZztcbiAgcmVhZG9ubHkgcHJlcmVsZWFzZT86IHN0cmluZztcbiAgcmVhZG9ubHkgY29uZmlnT3B0aW9ucz86IENvbmZpZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnZva2VPcHRpb25zIHtcbiAgcmVhZG9ubHkgcmVsZWFzZUFzPzogc3RyaW5nO1xuICByZWFkb25seSBkcnlSdW4/OiBib29sZWFuO1xuICAvKiogQXZvaWQgdXBkYXRpbmcgdGhlIHZlcnNpb24gZmlsZXMgKi9cbiAgcmVhZG9ubHkgc2tpcEJ1bXA/OiBib29sZWFuO1xuICByZWFkb25seSBza2lwQ2hhbmdlbG9nPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgY2FwdHVyZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBDb21taXRBbmRUYWdWZXJzaW9uIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjbWQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwYWNrYWdlU3BlYzogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY3dkOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBDb21taXRBbmRUYWdPcHRpb25zLFxuICApIHtcbiAgICBsZXQgY21kO1xuICAgIGlmICghcGFja2FnZVNwZWMpIHtcbiAgICAgIC8vIElmIG5vIHBhY2thZ2VTcGVjIGlzIGdpdmVuLCB0cnkgYW5kIHJlc29sdmUgdGhlIENBVFYgYmluYXJ5XG4gICAgICAvLyBmcm9tIGRldkRlcGVuZGVuY2llcy4gVGhpcyB3aWxsIHNwZWVkIHVwIGV4ZWN1dGlvbiBhIGxvdC5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNtZCA9IGAke3Byb2Nlc3MuZXhlY1BhdGh9ICR7cmVxdWlyZS5yZXNvbHZlKFwiY29tbWl0LWFuZC10YWctdmVyc2lvbi9iaW4vY2xpLmpzXCIpfWA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gT2ggd2VsbFxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY21kID0gY21kID8/IGBucHggJHtwYWNrYWdlU3BlYyA/PyBERUZBVUxUX0NBVFZfU1BFQ31gO1xuICB9XG5cbiAgLyoqXG4gICAqIEludm9rZSB0aGUgYGNvbW1pdC1hbmQtdGFnYCBwYWNrYWdlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaW52b2tlPEEgZXh0ZW5kcyBJbnZva2VPcHRpb25zPihcbiAgICBvcHRpb25zOiBBLFxuICApOiBQcm9taXNlPEEgZXh0ZW5kcyB7IGNhcHR1cmU6IHRydWUgfSA/IHN0cmluZyA6IHZvaWQ+IHtcbiAgICBjb25zdCBjYXR2Q29uZmlnOiBDb21taXRBbmRUYWdDb25maWcgPSB7XG4gICAgICBwYWNrYWdlRmlsZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGZpbGVuYW1lOiB0aGlzLm9wdGlvbnMudmVyc2lvbkZpbGUsXG4gICAgICAgICAgdHlwZTogXCJqc29uXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgYnVtcEZpbGVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBmaWxlbmFtZTogdGhpcy5vcHRpb25zLnZlcnNpb25GaWxlLFxuICAgICAgICAgIHR5cGU6IFwianNvblwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGNvbW1pdEFsbDogZmFsc2UsXG4gICAgICBpbmZpbGU6IHRoaXMub3B0aW9ucy5jaGFuZ2Vsb2dGaWxlLFxuICAgICAgcHJlcmVsZWFzZTogdGhpcy5vcHRpb25zLnByZXJlbGVhc2UsXG4gICAgICBoZWFkZXI6IFwiXCIsXG4gICAgICBza2lwOiB7XG4gICAgICAgIGNvbW1pdDogdHJ1ZSxcbiAgICAgICAgdGFnOiB0cnVlLFxuICAgICAgICBidW1wOiBvcHRpb25zLnNraXBCdW1wLFxuICAgICAgICBjaGFuZ2Vsb2c6IG9wdGlvbnMuc2tpcENoYW5nZWxvZyxcbiAgICAgIH0sXG4gICAgICB0YWdQcmVmaXg6IHRoaXMub3B0aW9ucy50YWdQcmVmaXhcbiAgICAgICAgPyBgJHt0aGlzLm9wdGlvbnMudGFnUHJlZml4fXZgXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgcmVsZWFzZUFzOiBvcHRpb25zLnJlbGVhc2VBcyxcbiAgICAgIGRyeVJ1bjogb3B0aW9ucy5kcnlSdW4sXG4gICAgICAuLi50aGlzLm9wdGlvbnMuY29uZmlnT3B0aW9ucyxcbiAgICB9O1xuICAgIGxvZ2dpbmcuZGVidWcoYC52ZXJzaW9ucmMuanNvbjogJHtKU09OLnN0cmluZ2lmeShjYXR2Q29uZmlnKX1gKTtcblxuICAgIC8vIEdlbmVyYXRlIGEgdGVtcG9yYXJ5IGNvbmZpZyBmaWxlLCB0aGVuIGV4ZWN1dGUgdGhlIHBhY2thZ2UgYW5kIHJlbW92ZSB0aGVcbiAgICAvLyBjb25maWcgZmlsZSBhZ2Fpbi5cbiAgICBjb25zdCByY2ZpbGUgPSBwYXRoLmpvaW4odGhpcy5jd2QsIFwiLnZlcnNpb25yYy5qc29uXCIpO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShyY2ZpbGUsIEpTT04uc3RyaW5naWZ5KGNhdHZDb25maWcsIHVuZGVmaW5lZCwgMikpO1xuICAgIHRyeSB7XG4gICAgICBsZXQgcmV0OiBhbnk7XG4gICAgICBpZiAob3B0aW9ucy5jYXB0dXJlKSB7XG4gICAgICAgIHJldCA9IGV4ZWNDYXB0dXJlKHRoaXMuY21kLCB7XG4gICAgICAgICAgY3dkOiB0aGlzLmN3ZCxcbiAgICAgICAgfSkudG9TdHJpbmcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldCA9IGV4ZWModGhpcy5jbWQsIHsgY3dkOiB0aGlzLmN3ZCB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXQ7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGZzLnVubGluayhyY2ZpbGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdlbmVyYXRlIHRoZSBtb3N0IHJlY2VudCBjaGFuZ2UgbG9nXG4gICAqXG4gICAqIERvIHRoaXMgYnkgZGVsZXRpbmcgdGhlIG1vc3QgcmVjZW50IHRhZywgcnVubmluZyBDQVRWLCB0aGVuXG4gICAqIHJlc3RvcmluZyB0aGUgdGFnLlxuICAgKlxuICAgKiBXZSBkbyB0aGlzIGNvbWJpbmVkIHdpdGggc2tpcHBpbmcgdGhlIGJ1bXAgdG8gbWFrZSBDQVRWIHJlZ2VuZXJhdGUgdGhlXG4gICAqIGNoYW5nZWxvZyBvZiB0aGUgbW9zdCByZWNlbnQgcmVsZWFzZSAoaWYgd2UgbGVmdCB0aGUgdGFnLCB0aGUgY2hhbmdlbG9nXG4gICAqIHdvdWxkIGJlIGVtcHR5KS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWdlbmVyYXRlUHJldmlvdXNDaGFuZ2VMb2codmVyc2lvbjogc3RyaW5nLCBsYXRlc3RUYWc6IHN0cmluZykge1xuICAgIGNvbnN0IG9sZENvbW1pdCA9IGV4ZWNDYXB0dXJlKGBnaXQgcmV2LXBhcnNlICR7bGF0ZXN0VGFnfWAsIHtcbiAgICAgIGN3ZDogdGhpcy5jd2QsXG4gICAgfSlcbiAgICAgIC50b1N0cmluZyhcInV0ZjhcIilcbiAgICAgIC50cmltKCk7XG5cbiAgICBleGVjKGBnaXQgdGFnIC0tZGVsZXRlICR7bGF0ZXN0VGFnfWAsIHsgY3dkOiB0aGlzLmN3ZCB9KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5pbnZva2Uoe1xuICAgICAgICByZWxlYXNlQXM6IHZlcnNpb24sXG4gICAgICAgIHNraXBCdW1wOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGV4ZWMoYGdpdCB0YWcgJHtsYXRlc3RUYWd9ICR7b2xkQ29tbWl0fWAsIHsgY3dkOiB0aGlzLmN3ZCB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW52b2tlIENBVFYgYW5kIHJldHVybiB0aGUgdmVyc2lvbiBpdCB3b3VsZCBoYXZlIGJ1bXBlZCB0b1xuICAgKlxuICAgKiBDQVRWIHdpbGwgYWx3YXlzIGF0IGxlYXN0IHBlcmZvcm0gYSBwYXRjaCBidW1wLCBldmVuIGlmIHRoZXJlIGFyZW4ndCBhbnlcbiAgICogY29tbWl0cyB0byBsb29rIGF0LlxuICAgKlxuICAgKiBXZSBoYXZlIHRvIGRvIHRoaXMgYnkgcGFyc2luZyB0aGUgb3V0cHV0IHN0cmluZywgd2hpY2ggaXMgcHJldHR5IGJhZFxuICAgKiBidXQgSSBkb24ndCBzZWUgdGhhdCB3ZSBoYXZlIGFub3RoZXIgd2F5LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRyeVJ1bigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IG91dHB1dCA9IHN0cmlwQW5zaShcbiAgICAgIGF3YWl0IHRoaXMuaW52b2tlKHtcbiAgICAgICAgY2FwdHVyZTogdHJ1ZSxcbiAgICAgICAgZHJ5UnVuOiB0cnVlLFxuICAgICAgICBza2lwQ2hhbmdlbG9nOiB0cnVlLFxuICAgICAgfSksXG4gICAgKTtcbiAgICBjb25zdCByZSA9IC9idW1waW5nIHZlcnNpb24uKmZyb20gKFswLTlhLXouKy1dKykgdG8gKFswLTlhLXouKy1dKykvaW07XG4gICAgY29uc3QgbSA9IHJlLmV4ZWMob3V0cHV0KTtcbiAgICBpZiAoIW0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IG1hdGNoICR7cmV9IGluICR7b3V0cHV0fWApO1xuICAgIH1cblxuICAgIHJldHVybiBtWzJdO1xuICB9XG59XG5cbi8qKlxuICogTW9kZWxpbmcgdGhlIENBVFYgY29uZmlnIGZpbGVcbiAqL1xuaW50ZXJmYWNlIENvbW1pdEFuZFRhZ0NvbmZpZyBleHRlbmRzIENvbmZpZyB7XG4gIHBhY2thZ2VGaWxlcz86IEFycmF5PHsgZmlsZW5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nIH0+O1xuICBidW1wRmlsZXM/OiBBcnJheTx7IGZpbGVuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZyB9PjtcbiAgY29tbWl0QWxsPzogYm9vbGVhbjtcbiAgaW5maWxlPzogc3RyaW5nO1xuICBwcmVyZWxlYXNlPzogc3RyaW5nO1xuICBza2lwPzoge1xuICAgIGNvbW1pdD86IGJvb2xlYW47XG4gICAgdGFnPzogYm9vbGVhbjtcbiAgICBidW1wPzogYm9vbGVhbjtcbiAgICBjaGFuZ2Vsb2c/OiBib29sZWFuO1xuICB9O1xuICBmaXJzdFJlbGVhc2U/OiBib29sZWFuO1xuICB0YWdQcmVmaXg/OiBzdHJpbmc7XG4gIHJlbGVhc2VBcz86IHN0cmluZztcbiAgZHJ5UnVuPzogYm9vbGVhbjtcbiAgcGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBTdHJpcHMgQU5TSSBlc2NhcGUgY29kZXMgZnJvbSBhIHN0cmluZ1xuICpcbiAqIE5lZWQgdG8gdXNlIHRoaXMgYmVjYXVzZSB0aGUgYC0tbm8tY29sb3JzYCBhcmd1bWVudCB0byBDQVRWIGlzIHNvbWV0aW1lc1xuICogcmVzcGVjdGVkIGFuZCBzb21ldGltZXMgbm90IGFuZCBpdCdzIGRyaXZpbmcgbWUgY3JhenkuXG4gKi9cbmZ1bmN0aW9uIHN0cmlwQW5zaShzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFBhdHRlcm4gbWF0Y2hlcyBhbGwgQU5TSSBlc2NhcGUgc2VxdWVuY2VzIGluY2x1ZGluZyBjb2xvcnMsIGN1cnNvciBtb3ZlbWVudCwgZXRjXG4gIGNvbnN0IHBhdHRlcm4gPSBbXG4gICAgXCJbXFxcXHUwMDFCXFxcXHUwMDlCXVtbXFxcXF0oKSM7P10qKD86KD86KD86KD86O1stYS16QS1aXFxcXGRcXFxcLyMmLjo9PyVAfl9dKykqfFthLXpBLVpcXFxcZF0rKD86O1stYS16QS1aXFxcXGRcXFxcLyMmLjo9PyVAfl9dKikqKT9cXFxcdTAwMDcpXCIsXG4gICAgXCIoPzooPzpcXFxcZHsxLDR9KD86O1xcXFxkezAsNH0pKik/W1xcXFxkQS1QUi1UWmNmLW50cXJ5PT48fl0pKVwiLFxuICBdLmpvaW4oXCJ8XCIpO1xuICByZXR1cm4gc3RyLnJlcGxhY2UobmV3IFJlZ0V4cChwYXR0ZXJuLCBcImdcIiksIFwiXCIpO1xufVxuIl19