UNPKG

patch-package

Version:

When forking just won't work, patch it.

146 lines 22.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var chalk_1 = require("chalk"); var path_1 = require("./path"); var spawnSafe_1 = require("./spawnSafe"); var filterFiles_1 = require("./filterFiles"); var fs_extra_1 = require("fs-extra"); var rimraf_1 = require("rimraf"); var fs_extra_2 = require("fs-extra"); var tmp_1 = require("tmp"); var patchFs_1 = require("./patchFs"); var PackageDetails_1 = require("./PackageDetails"); function printNoPackageFoundError(packageName, packageJsonPath) { console.error("No such package " + packageName + "\n\n File not found: " + packageJsonPath); } exports.makePatch = function (packagePathSpecifier, appPath, packageManager, includePaths, excludePaths, patchDir) { if (patchDir === void 0) { patchDir = "patches"; } var _a; var packageDetails = PackageDetails_1.getPatchDetailsFromCliString(packagePathSpecifier); if (!packageDetails) { console.error("No such package", packagePathSpecifier); return; } var appPackageJson = require(path_1.join(appPath, "package.json")); var packagePath = path_1.join(appPath, packageDetails.path); var packageJsonPath = path_1.join(packagePath, "package.json"); if (!fs_extra_1.existsSync(packageJsonPath)) { printNoPackageFoundError(packagePathSpecifier, packageJsonPath); process.exit(1); } var packageVersion = require(packageJsonPath).version; // packageVersionSpecifier is the version string used by the app package.json // it won't be present for nested deps. // We need it only for patching deps specified with file:./ // which I think only happens in tests // but might happen in real life too. var packageVersionSpecifier = packageDetails.isNested ? null : appPackageJson.dependencies[packageDetails.name] || appPackageJson.devDependencies[packageDetails.name] || null; if (packageVersionSpecifier && packageVersionSpecifier.startsWith("file:") && packageVersionSpecifier[5] !== "/") { packageVersionSpecifier = "file:" + path_1.resolve(appPath, packageVersionSpecifier.slice(5)); } else { packageVersionSpecifier = null; } var tmpRepo = tmp_1.dirSync({ unsafeCleanup: true }); var tmpRepoPackagePath = path_1.join(tmpRepo.name, packageDetails.path); var tmpRepoNpmRoot = tmpRepoPackagePath.slice(0, -("/node_modules/" + packageDetails.name).length); var tmpRepoPackageJsonPath = path_1.join(tmpRepoNpmRoot, "package.json"); try { var patchesDir = path_1.join(appPath, patchDir); console.info(chalk_1.grey("•"), "Creating temporary folder"); // make a blank package.json fs_extra_1.mkdirpSync(tmpRepoNpmRoot); fs_extra_1.writeFileSync(tmpRepoPackageJsonPath, JSON.stringify({ dependencies: (_a = {}, _a[packageDetails.name] = packageVersionSpecifier || packageVersion, _a), })); if (packageManager === "yarn") { console.info(chalk_1.grey("•"), "Installing " + packageDetails.name + "@" + packageVersion + " with yarn"); spawnSafe_1.spawnSafeSync("yarn", ["install", "--ignore-engines"], { cwd: tmpRepoNpmRoot, }); } else { console.info(chalk_1.grey("•"), "Installing " + packageDetails.name + "@" + packageVersion + " with npm"); spawnSafe_1.spawnSafeSync("npm", ["i"], { cwd: tmpRepoNpmRoot }); } var git = function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } return spawnSafe_1.spawnSafeSync("git", args, { cwd: tmpRepo.name, env: { HOME: tmpRepo.name }, }); }; // remove nested node_modules just to be safe rimraf_1.sync(path_1.join(tmpRepoPackagePath, "node_modules")); // remove .git just to be safe rimraf_1.sync(path_1.join(tmpRepoPackagePath, "node_modules")); // commit the package console.info(chalk_1.grey("•"), "Diffing your files with clean files"); fs_extra_1.writeFileSync(path_1.join(tmpRepo.name, ".gitignore"), "!/node_modules\n\n"); git("init"); git("config", "--local", "user.name", "patch-package"); git("config", "--local", "user.email", "patch@pack.age"); // remove ignored files first filterFiles_1.removeIgnoredFiles(tmpRepoPackagePath, includePaths, excludePaths); git("add", "-f", packageDetails.path); git("commit", "--allow-empty", "-m", "init"); // replace package with user's version rimraf_1.sync(tmpRepoPackagePath); fs_extra_2.copySync(packagePath, tmpRepoPackagePath); // remove nested node_modules just to be safe rimraf_1.sync(path_1.join(tmpRepoPackagePath, "node_modules")); // remove .git just to be safe rimraf_1.sync(path_1.join(tmpRepoPackagePath, "node_modules")); // also remove ignored files like before filterFiles_1.removeIgnoredFiles(tmpRepoPackagePath, includePaths, excludePaths); // stage all files git("add", "-f", packageDetails.path); // get diff of changes var diffResult = git("diff", "--cached", "--no-color", "--ignore-space-at-eol", "--no-ext-diff"); if (diffResult.stdout.length === 0) { console.warn("\u2049\uFE0F Not creating patch file for package '" + packagePathSpecifier + "'"); console.warn("\u2049\uFE0F There don't appear to be any changes."); process.exit(1); } else { var packageNames = packageDetails.packageNames .map(function (name) { return name.replace(/\//g, "+"); }) .join("++"); // maybe delete existing patchFs_1.getPatchFiles(patchDir).forEach(function (filename) { var deets = PackageDetails_1.getPackageDetailsFromPatchFilename(filename); if (deets && deets.path === packageDetails.path) { fs_extra_1.unlinkSync(path_1.join(patchDir, filename)); } }); var patchFileName = packageNames + "+" + packageVersion + ".patch"; var patchPath = path_1.join(patchesDir, patchFileName); if (!fs_extra_1.existsSync(path_1.dirname(patchPath))) { // scoped package fs_extra_1.mkdirSync(path_1.dirname(patchPath)); } fs_extra_1.writeFileSync(patchPath, diffResult.stdout); console.log(chalk_1.green("✔") + " Created file " + patchDir + "/" + patchFileName); } } catch (e) { console.error(e); throw e; } finally { tmpRepo.removeCallback(); } }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFrZVBhdGNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21ha2VQYXRjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtCQUFtQztBQUNuQywrQkFBK0M7QUFDL0MseUNBQTJDO0FBRTNDLDZDQUFrRDtBQUNsRCxxQ0FNaUI7QUFDakIsaUNBQXVDO0FBQ3ZDLHFDQUFtQztBQUNuQywyQkFBNkI7QUFDN0IscUNBQXlDO0FBQ3pDLG1EQUd5QjtBQUV6QixTQUFTLHdCQUF3QixDQUMvQixXQUFtQixFQUNuQixlQUF1QjtJQUV2QixPQUFPLENBQUMsS0FBSyxDQUNYLHFCQUFtQixXQUFXLDhCQUVkLGVBQWlCLENBQ2xDLENBQUE7QUFDSCxDQUFDO0FBRVksUUFBQSxTQUFTLEdBQUcsVUFDdkIsb0JBQTRCLEVBQzVCLE9BQWUsRUFDZixjQUE4QixFQUM5QixZQUFvQixFQUNwQixZQUFvQixFQUNwQixRQUE0QjtJQUE1Qix5QkFBQSxFQUFBLG9CQUE0Qjs7SUFFNUIsSUFBTSxjQUFjLEdBQUcsNkNBQTRCLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtJQUV6RSxJQUFJLENBQUMsY0FBYyxFQUFFO1FBQ25CLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsb0JBQW9CLENBQUMsQ0FBQTtRQUN0RCxPQUFNO0tBQ1A7SUFDRCxJQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsV0FBSSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFBO0lBQzdELElBQU0sV0FBVyxHQUFHLFdBQUksQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3RELElBQU0sZUFBZSxHQUFHLFdBQUksQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUE7SUFFekQsSUFBSSxDQUFDLHFCQUFVLENBQUMsZUFBZSxDQUFDLEVBQUU7UUFDaEMsd0JBQXdCLENBQUMsb0JBQW9CLEVBQUUsZUFBZSxDQUFDLENBQUE7UUFDL0Qs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LElBQU0sYUFBYSxHQUFNLFlBQVksU0FBSSxjQUFjLFdBQVEsQ0FBQTtZQUUvRCxJQUFNLFNBQVMsR0FBRyxXQUFJLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFBO1lBQ2pELElBQUksQ0FBQyxxQkFBVSxDQUFDLGNBQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFO2dCQUNuQyxpQkFBaUI7Z0JBQ2pCLG9CQUFTLENBQUMsY0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUE7YUFDOUI7WUFDRCx3QkFBYSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FBSSxhQUFLLENBQUMsR0FBRyxDQUFDLHNCQUFpQixRQUFRLFNBQUksYUFBZSxDQUFDLENBQUE7U0FDdkU7S0FDRjtJQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ1YsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNoQixNQUFNLENBQUMsQ0FBQTtLQUNSO1lBQVM7UUFDUixPQUFPLENBQUMsY0FBYyxFQUFFLENBQUE7S0FDekI7QUFDSCxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBncmVlbiwgZ3JleSB9IGZyb20gXCJjaGFsa1wiXG5pbXBvcnQgeyBqb2luLCBkaXJuYW1lLCByZXNvbHZlIH0gZnJvbSBcIi4vcGF0aFwiXG5pbXBvcnQgeyBzcGF3blNhZmVTeW5jIH0gZnJvbSBcIi4vc3Bhd25TYWZlXCJcbmltcG9ydCB7IFBhY2thZ2VNYW5hZ2VyIH0gZnJvbSBcIi4vZGV0ZWN0UGFja2FnZU1hbmFnZXJcIlxuaW1wb3J0IHsgcmVtb3ZlSWdub3JlZEZpbGVzIH0gZnJvbSBcIi4vZmlsdGVyRmlsZXNcIlxuaW1wb3J0IHtcbiAgd3JpdGVGaWxlU3luYyxcbiAgZXhpc3RzU3luYyxcbiAgbWtkaXJTeW5jLFxuICB1bmxpbmtTeW5jLFxuICBta2RpcnBTeW5jLFxufSBmcm9tIFwiZnMtZXh0cmFcIlxuaW1wb3J0IHsgc3luYyBhcyByaW1yYWYgfSBmcm9tIFwicmltcmFmXCJcbmltcG9ydCB7IGNvcHlTeW5jIH0gZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCB7IGRpclN5bmMgfSBmcm9tIFwidG1wXCJcbmltcG9ydCB7IGdldFBhdGNoRmlsZXMgfSBmcm9tIFwiLi9wYXRjaEZzXCJcbmltcG9ydCB7XG4gIGdldFBhdGNoRGV0YWlsc0Zyb21DbGlTdHJpbmcsXG4gIGdldFBhY2thZ2VEZXRhaWxzRnJvbVBhdGNoRmlsZW5hbWUsXG59IGZyb20gXCIuL1BhY2thZ2VEZXRhaWxzXCJcblxuZnVuY3Rpb24gcHJpbnROb1BhY2thZ2VGb3VuZEVycm9yKFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICBwYWNrYWdlSnNvblBhdGg6IHN0cmluZyxcbikge1xuICBjb25zb2xlLmVycm9yKFxuICAgIGBObyBzdWNoIHBhY2thZ2UgJHtwYWNrYWdlTmFtZX1cblxuICBGaWxlIG5vdCBmb3VuZDogJHtwYWNrYWdlSnNvblBhdGh9YCxcbiAgKVxufVxuXG5leHBvcnQgY29uc3QgbWFrZVBhdGNoID0gKFxuICBwYWNrYWdlUGF0aFNwZWNpZmllcjogc3RyaW5nLFxuICBhcHBQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VNYW5hZ2VyOiBQYWNrYWdlTWFuYWdlcixcbiAgaW5jbHVkZVBhdGhzOiBSZWdFeHAsXG4gIGV4Y2x1ZGVQYXRoczogUmVnRXhwLFxuICBwYXRjaERpcjogc3RyaW5nID0gXCJwYXRjaGVzXCIsXG4pID0+IHtcbiAgY29uc3QgcGFja2FnZURldGFpbHMgPSBnZXRQYXRjaERldGFpbHNGcm9tQ2xpU3RyaW5nKHBhY2thZ2VQYXRoU3BlY2lmaWVyKVxuXG4gIGlmICghcGFja2FnZURldGFpbHMpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiTm8gc3VjaCBwYWNrYWdlXCIsIHBhY2thZ2VQYXRoU3BlY2lmaWVyKVxuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IGFwcFBhY2thZ2VKc29uID0gcmVxdWlyZShqb2luKGFwcFBhdGgsIFwicGFja2FnZS5qc29uXCIpKVxuICBjb25zdCBwYWNrYWdlUGF0aCA9IGpvaW4oYXBwUGF0aCwgcGFja2FnZURldGFpbHMucGF0aClcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gam9pbihwYWNrYWdlUGF0aCwgXCJwYWNrYWdlLmpzb25cIilcblxuICBpZiAoIWV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkge1xuICAgIHByaW50Tm9QYWNrYWdlRm91bmRFcnJvcihwYWNrYWdlUGF0aFNwZWNpZmllciwgcGFja2FnZUpzb25QYXRoKVxuICAgIHByb2Nlc3MuZXhpdCgxKVxuICB9XG5cbiAgY29uc3QgcGFja2FnZVZlcnNpb24gPSByZXF1aXJlKHBhY2thZ2VKc29uUGF0aCkudmVyc2lvbiBhcyBzdHJpbmdcblxuICAvLyBwYWNrYWdlVmVyc2lvblNwZWNpZmllciBpcyB0aGUgdmVyc2lvbiBzdHJpbmcgdXNlZCBieSB0aGUgYXBwIHBhY2thZ2UuanNvblxuICAvLyBpdCB3b24ndCBiZSBwcmVzZW50IGZvciBuZXN0ZWQgZGVwcy5cbiAgLy8gV2UgbmVlZCBpdCBvbmx5IGZvciBwYXRjaGluZyBkZXBzIHNwZWNpZmllZCB3aXRoIGZpbGU6Li9cbiAgLy8gd2hpY2ggSSB0aGluayBvbmx5IGhhcHBlbnMgaW4gdGVzdHNcbiAgLy8gYnV0IG1pZ2h0IGhhcHBlbiBpbiByZWFsIGxpZmUgdG9vLlxuICBsZXQgcGFja2FnZVZlcnNpb25TcGVjaWZpZXI6IG51bGwgfCBzdHJpbmcgPSBwYWNrYWdlRGV0YWlscy5pc05lc3RlZFxuICAgID8gbnVsbFxuICAgIDogYXBwUGFja2FnZUpzb24uZGVwZW5kZW5jaWVzW3BhY2thZ2VEZXRhaWxzLm5hbWVdIHx8XG4gICAgICBhcHBQYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXNbcGFja2FnZURldGFpbHMubmFtZV0gfHxcbiAgICAgIG51bGxcblxuICBpZiAoXG4gICAgcGFja2FnZVZlcnNpb25TcGVjaWZpZXIgJiZcbiAgICBwYWNrYWdlVmVyc2lvblNwZWNpZmllci5zdGFydHNXaXRoKFwiZmlsZTpcIikgJiZcbiAgICBwYWNrYWdlVmVyc2lvblNwZWNpZmllcls1XSAhPT0gXCIvXCJcbiAgKSB7XG4gICAgcGFja2FnZVZlcnNpb25TcGVjaWZpZXIgPVxuICAgICAgXCJmaWxlOlwiICsgcmVzb2x2ZShhcHBQYXRoLCBwYWNrYWdlVmVyc2lvblNwZWNpZmllci5zbGljZSg1KSlcbiAgfSBlbHNlIHtcbiAgICBwYWNrYWdlVmVyc2lvblNwZWNpZmllciA9IG51bGxcbiAgfVxuXG4gIGNvbnN0IHRtcFJlcG8gPSBkaXJTeW5jKHsgdW5zYWZlQ2xlYW51cDogdHJ1ZSB9KVxuICBjb25zdCB0bXBSZXBvUGFja2FnZVBhdGggPSBqb2luKHRtcFJlcG8ubmFtZSwgcGFja2FnZURldGFpbHMucGF0aClcbiAgY29uc3QgdG1wUmVwb05wbVJvb3QgPSB0bXBSZXBvUGFja2FnZVBhdGguc2xpY2UoXG4gICAgMCxcbiAgICAtYC9ub2RlX21vZHVsZXMvJHtwYWNrYWdlRGV0YWlscy5uYW1lfWAubGVuZ3RoLFxuICApXG5cbiAgY29uc3QgdG1wUmVwb1BhY2thZ2VKc29uUGF0aCA9IGpvaW4odG1wUmVwb05wbVJvb3QsIFwicGFja2FnZS5qc29uXCIpXG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYXRjaGVzRGlyID0gam9pbihhcHBQYXRoLCBwYXRjaERpcilcblxuICAgIGNvbnNvbGUuaW5mbyhncmV5KFwi4oCiXCIpLCBcIkNyZWF0aW5nIHRlbXBvcmFyeSBmb2xkZXJcIilcblxuICAgIC8vIG1ha2UgYSBibGFuayBwYWNrYWdlLmpzb25cbiAgICBta2RpcnBTeW5jKHRtcFJlcG9OcG1Sb290KVxuICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICB0bXBSZXBvUGFja2FnZUpzb25QYXRoLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBkZXBlbmRlbmNpZXM6IHtcbiAgICAgICAgICBbcGFja2FnZURldGFpbHMubmFtZV06IHBhY2thZ2VWZXJzaW9uU3BlY2lmaWVyIHx8IHBhY2thZ2VWZXJzaW9uLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgKVxuXG4gICAgaWYgKHBhY2thZ2VNYW5hZ2VyID09PSBcInlhcm5cIikge1xuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBncmV5KFwi4oCiXCIpLFxuICAgICAgICBgSW5zdGFsbGluZyAke3BhY2thZ2VEZXRhaWxzLm5hbWV9QCR7cGFja2FnZVZlcnNpb259IHdpdGggeWFybmAsXG4gICAgICApXG4gICAgICBzcGF3blNhZmVTeW5jKGB5YXJuYCwgW1wiaW5zdGFsbFwiLCBcIi0taWdub3JlLWVuZ2luZXNcIl0sIHtcbiAgICAgICAgY3dkOiB0bXBSZXBvTnBtUm9vdCxcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgZ3JleShcIuKAolwiKSxcbiAgICAgICAgYEluc3RhbGxpbmcgJHtwYWNrYWdlRGV0YWlscy5uYW1lfUAke3BhY2thZ2VWZXJzaW9ufSB3aXRoIG5wbWAsXG4gICAgICApXG4gICAgICBzcGF3blNhZmVTeW5jKGBucG1gLCBbXCJpXCJdLCB7IGN3ZDogdG1wUmVwb05wbVJvb3QgfSlcbiAgICB9XG5cbiAgICBjb25zdCBnaXQgPSAoLi4uYXJnczogc3RyaW5nW10pID0+XG4gICAgICBzcGF3blNhZmVTeW5jKFwiZ2l0XCIsIGFyZ3MsIHtcbiAgICAgICAgY3dkOiB0bXBSZXBvLm5hbWUsXG4gICAgICAgIGVudjogeyBIT01FOiB0bXBSZXBvLm5hbWUgfSxcbiAgICAgIH0pXG5cbiAgICAvLyByZW1vdmUgbmVzdGVkIG5vZGVfbW9kdWxlcyBqdXN0IHRvIGJlIHNhZmVcbiAgICByaW1yYWYoam9pbih0bXBSZXBvUGFja2FnZVBhdGgsIFwibm9kZV9tb2R1bGVzXCIpKVxuICAgIC8vIHJlbW92ZSAuZ2l0IGp1c3QgdG8gYmUgc2FmZVxuICAgIHJpbXJhZihqb2luKHRtcFJlcG9QYWNrYWdlUGF0aCwgXCJub2RlX21vZHVsZXNcIikpXG5cbiAgICAvLyBjb21taXQgdGhlIHBhY2thZ2VcbiAgICBjb25zb2xlLmluZm8oZ3JleShcIuKAolwiKSwgXCJEaWZmaW5nIHlvdXIgZmlsZXMgd2l0aCBjbGVhbiBmaWxlc1wiKVxuICAgIHdyaXRlRmlsZVN5bmMoam9pbih0bXBSZXBvLm5hbWUsIFwiLmdpdGlnbm9yZVwiKSwgXCIhL25vZGVfbW9kdWxlc1xcblxcblwiKVxuICAgIGdpdChcImluaXRcIilcbiAgICBnaXQoXCJjb25maWdcIiwgXCItLWxvY2FsXCIsIFwidXNlci5uYW1lXCIsIFwicGF0Y2gtcGFja2FnZVwiKVxuICAgIGdpdChcImNvbmZpZ1wiLCBcIi0tbG9jYWxcIiwgXCJ1c2VyLmVtYWlsXCIsIFwicGF0Y2hAcGFjay5hZ2VcIilcblxuICAgIC8vIHJlbW92ZSBpZ25vcmVkIGZpbGVzIGZpcnN0XG4gICAgcmVtb3ZlSWdub3JlZEZpbGVzKHRtcFJlcG9QYWNrYWdlUGF0aCwgaW5jbHVkZVBhdGhzLCBleGNsdWRlUGF0aHMpXG5cbiAgICBnaXQoXCJhZGRcIiwgXCItZlwiLCBwYWNrYWdlRGV0YWlscy5wYXRoKVxuICAgIGdpdChcImNvbW1pdFwiLCBcIi0tYWxsb3ctZW1wdHlcIiwgXCItbVwiLCBcImluaXRcIilcblxuICAgIC8vIHJlcGxhY2UgcGFja2FnZSB3aXRoIHVzZXIncyB2ZXJzaW9uXG4gICAgcmltcmFmKHRtcFJlcG9QYWNrYWdlUGF0aClcblxuICAgIGNvcHlTeW5jKHBhY2thZ2VQYXRoLCB0bXBSZXBvUGFja2FnZVBhdGgpXG5cbiAgICAvLyByZW1vdmUgbmVzdGVkIG5vZGVfbW9kdWxlcyBqdXN0IHRvIGJlIHNhZmVcbiAgICByaW1yYWYoam9pbih0bXBSZXBvUGFja2FnZVBhdGgsIFwibm9kZV9tb2R1bGVzXCIpKVxuICAgIC8vIHJlbW92ZSAuZ2l0IGp1c3QgdG8gYmUgc2FmZVxuICAgIHJpbXJhZihqb2luKHRtcFJlcG9QYWNrYWdlUGF0aCwgXCJub2RlX21vZHVsZXNcIikpXG5cbiAgICAvLyBhbHNvIHJlbW92ZSBpZ25vcmVkIGZpbGVzIGxpa2UgYmVmb3JlXG4gICAgcmVtb3ZlSWdub3JlZEZpbGVzKHRtcFJlcG9QYWNrYWdlUGF0aCwgaW5jbHVkZVBhdGhzLCBleGNsdWRlUGF0aHMpXG5cbiAgICAvLyBzdGFnZSBhbGwgZmlsZXNcbiAgICBnaXQoXCJhZGRcIiwgXCItZlwiLCBwYWNrYWdlRGV0YWlscy5wYXRoKVxuXG4gICAgLy8gZ2V0IGRpZmYgb2YgY2hhbmdlc1xuICAgIGNvbnN0IGRpZmZSZXN1bHQgPSBnaXQoXG4gICAgICBcImRpZmZcIixcbiAgICAgIFwiLS1jYWNoZWRcIixcbiAgICAgIFwiLS1uby1jb2xvclwiLFxuICAgICAgXCItLWlnbm9yZS1zcGFjZS1hdC1lb2xcIixcbiAgICAgIFwiLS1uby1leHQtZGlmZlwiLFxuICAgIClcblxuICAgIGlmIChkaWZmUmVzdWx0LnN0ZG91dC5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYOKBie+4jyAgTm90IGNyZWF0aW5nIHBhdGNoIGZpbGUgZm9yIHBhY2thZ2UgJyR7cGFja2FnZVBhdGhTcGVjaWZpZXJ9J2AsXG4gICAgICApXG4gICAgICBjb25zb2xlLndhcm4oYOKBie+4jyAgVGhlcmUgZG9uJ3QgYXBwZWFyIHRvIGJlIGFueSBjaGFuZ2VzLmApXG4gICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcGFja2FnZU5hbWVzID0gcGFja2FnZURldGFpbHMucGFja2FnZU5hbWVzXG4gICAgICAgIC5tYXAobmFtZSA9PiBuYW1lLnJlcGxhY2UoL1xcLy9nLCBcIitcIikpXG4gICAgICAgIC5qb2luKFwiKytcIilcblxuICAgICAgLy8gbWF5YmUgZGVsZXRlIGV4aXN0aW5nXG4gICAgICBnZXRQYXRjaEZpbGVzKHBhdGNoRGlyKS5mb3JFYWNoKGZpbGVuYW1lID0+IHtcbiAgICAgICAgY29uc3QgZGVldHMgPSBnZXRQYWNrYWdlRGV0YWlsc0Zyb21QYXRjaEZpbGVuYW1lKGZpbGVuYW1lKVxuICAgICAgICBpZiAoZGVldHMgJiYgZGVldHMucGF0aCA9PT0gcGFja2FnZURldGFpbHMucGF0aCkge1xuICAgICAgICAgIHVubGlua1N5bmMoam9pbihwYXRjaERpciwgZmlsZW5hbWUpKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBjb25zdCBwYXRjaEZpbGVOYW1lID0gYCR7cGFja2FnZU5hbWVzfSske3BhY2thZ2VWZXJzaW9ufS5wYXRjaGBcblxuICAgICAgY29uc3QgcGF0Y2hQYXRoID0gam9pbihwYXRjaGVzRGlyLCBwYXRjaEZpbGVOYW1lKVxuICAgICAgaWYgKCFleGlzdHNTeW5jKGRpcm5hbWUocGF0Y2hQYXRoKSkpIHtcbiAgICAgICAgLy8gc2NvcGVkIHBhY2thZ2VcbiAgICAgICAgbWtkaXJTeW5jKGRpcm5hbWUocGF0Y2hQYXRoKSlcbiAgICAgIH1cbiAgICAgIHdyaXRlRmlsZVN5bmMocGF0Y2hQYXRoLCBkaWZmUmVzdWx0LnN0ZG91dClcbiAgICAgIGNvbnNvbGUubG9nKGAke2dyZWVuKFwi4pyUXCIpfSBDcmVhdGVkIGZpbGUgJHtwYXRjaERpcn0vJHtwYXRjaEZpbGVOYW1lfWApXG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5lcnJvcihlKVxuICAgIHRocm93IGVcbiAgfSBmaW5hbGx5IHtcbiAgICB0bXBSZXBvLnJlbW92ZUNhbGxiYWNrKClcbiAgfVxufVxuIl19