File: //opt/code/node_modules/patch-package/dist/applyPatches.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var chalk_1 = require("chalk");
var fs = require("fs");
var path = require("path");
var spawnSafe_1 = require("./spawnSafe");
var patchFs_1 = require("./patchFs");
function findPatchFiles(appPath, reverse) {
var patchesDirectory = path.join(appPath, "patches");
if (!fs.existsSync(patchesDirectory)) {
return [];
}
var files = patchFs_1.getPatchFiles(patchesDirectory).filter(function (filename) {
return filename.match(/^.+(:|\+).+\.patch$/);
});
if (files.length === 0) {
console.log(chalk_1.cyan("No patch files found"));
}
files.forEach(function (filename) {
var match = filename.match(/^(.+?)(:|\+)(.+)\.patch$/);
var packageName = match[1];
var version = match[3];
var packageDir = path.join(appPath, "node_modules", packageName);
if (!fs.existsSync(packageDir)) {
console.warn(chalk_1.red("Warning:") + " Patch file found for package " + packageName +
(" which is not present at " + packageDir));
return null;
}
var packageJson = require(path.join(packageDir, "package.json"));
try {
applyPatch(path.resolve(patchesDirectory, filename), reverse);
if (packageJson.version !== version) {
printVersionMismatchWarning(packageName, packageJson.version, version);
}
else {
console.log(chalk_1.bold(packageName) + "@" + version + " " + chalk_1.green("✔"));
}
}
catch (e) {
// completely failed to apply patch
if (packageJson.version === version) {
printBrokenPatchFileError(packageName, filename);
}
else {
printPatchApplictionFailureError(packageName, packageJson.version, version, filename);
}
process.exit(1);
}
});
}
exports.default = findPatchFiles;
function gitApplyArgs(patchFilePath, _a) {
var reverse = _a.reverse, check = _a.check;
var args = ["apply", "--ignore-whitespace", "--whitespace=nowarn"];
if (reverse) {
args.push("--reverse");
}
if (check) {
args.push("--check");
}
args.push(patchFilePath);
return args;
}
exports.gitApplyArgs = gitApplyArgs;
function applyPatch(patchFilePath, reverse) {
// first find out if the patch file was made by patch-package
var firstLine = fs
.readFileSync(patchFilePath)
.slice(0, "patch-package\n".length)
.toString();
// if not then remove git headers before applying to make sure git
// doesn't skip files that aren't in the index
if (firstLine !== "patch-package\n") {
patchFilePath = patchFs_1.removeGitHeadersFromPath(patchFilePath);
}
try {
spawnSafe_1.default("git", gitApplyArgs(patchFilePath, { reverse: reverse, check: true }), {
logStdErrOnError: false,
});
spawnSafe_1.default("git", gitApplyArgs(patchFilePath, { reverse: reverse }), {
logStdErrOnError: false,
});
}
catch (e) {
// patch cli tool has no way to fail gracefully if patch was already
// applied, so to check, we need to try a dry-run of applying the patch in
// reverse, and if that works it means the patch was already applied
// sucessfully. Otherwise the patch just failed for some reason.
spawnSafe_1.default("git", gitApplyArgs(patchFilePath, { reverse: !reverse, check: true }), {
logStdErrOnError: false,
});
}
}
exports.applyPatch = applyPatch;
function printVersionMismatchWarning(packageName, actualVersion, originalVersion) {
console.warn("\n" + chalk_1.red("Warning:") + " patch-package detected a patch file version mismatch\n\n Don't worry! This is probably fine. The patch was still applied\n successfully. Here's the deets:\n\n Patch file created for\n\n " + packageName + "@" + chalk_1.bold(originalVersion) + "\n\n applied to\n\n " + packageName + "@" + chalk_1.bold(actualVersion) + "\n\n This warning is just to give you a heads-up. There is a small chance of\n breakage even though the patch was applied successfully. Make sure the package\n still behaves like you expect (you wrote tests, right?) and then run\n\n " + chalk_1.bold("patch-package " + packageName) + "\n\n to update the version in the patch file name and make this warning go away.\n");
}
function printBrokenPatchFileError(packageName, patchFileName) {
console.error("\n" + chalk_1.red.bold("**ERROR**") + " " + chalk_1.red("Failed to apply patch for package " + chalk_1.bold(packageName)) + "\n\n This error was caused because Git cannot apply the following patch file:\n\n patches/" + patchFileName + "\n\n This is usually caused by inconsistent whitespace in the patch file.\n");
}
function printPatchApplictionFailureError(packageName, actualVersion, originalVersion, patchFileName) {
console.error("\n" + chalk_1.red.bold("**ERROR**") + " " + chalk_1.red("Failed to apply patch for package " + chalk_1.bold(packageName)) + "\n\n This error was caused because " + chalk_1.bold(packageName) + " has changed since you\n made the patch file for it. This introduced conflicts with your patch,\n just like a merge conflict in Git when separate incompatible changes are\n made to the same piece of code.\n\n Maybe this means your patch file is no longer necessary, in which case\n hooray! Just delete it!\n\n Otherwise, you need to manually fix the patch file. Or generate a new one\n\n To generate a new one, just repeat the steps you made to generate the first\n one, but accounting for the changes in " + packageName + ".\n\n i.e. make changes, run `patch-package " + packageName + "`, and commit.\n\n To manually fix a patch file, Run:\n\n " + chalk_1.bold("patch -p1 -i patches/" + patchFileName + " --verbose --dry-run") + "\n\n To list rejected hunks. A 'hunk' is a section of patch file that describes\n one contiguous area of changes. They are numbered from 1 and begin with lines\n that look like this:\n\n @@ -48,5 +49,6 @@ function foo(bar) {\n\n Remove the conflicting hunks, then manually edit files in\n\n node_modules/" + packageName + "\n\n to reflect the changes that the conflicting hunks were supposed to make.\n\n Then run `patch-package " + packageName + "`\n\n Info:\n Patch was made for version " + chalk_1.green.bold(originalVersion) + "\n Meanwhile node_modules/" + chalk_1.bold(packageName) + " is version " + chalk_1.red.bold(actualVersion) + "\n");
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbHlQYXRjaGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FwcGx5UGF0Y2hlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtCQUE4QztBQUM5Qyx1QkFBd0I7QUFDeEIsMkJBQTRCO0FBQzVCLHlDQUF1QztBQUN2QyxxQ0FBbUU7QUFFbkUsd0JBQXVDLE9BQWUsRUFBRSxPQUFnQjtJQUN0RSxJQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBQ3RELEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQyxNQUFNLENBQUMsRUFBRSxDQUFBO0lBQ1gsQ0FBQztJQUNELElBQU0sS0FBSyxHQUFHLHVCQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBQSxRQUFRO1FBQzNELE9BQUEsUUFBUSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQztJQUFyQyxDQUFxQyxDQUN0QyxDQUFBO0lBRUQsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQTtJQUMzQyxDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFBLFFBQVE7UUFDcEIsSUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsQ0FBYSxDQUFBO1FBQ3BFLElBQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUM1QixJQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDeEIsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsY0FBYyxFQUFFLFdBQVcs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QUVyQixPQUFPLENBQUMsS0FBSyxDQUFDLE9BQ2QsV0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBSSxXQUFHLENBQzFCLHVDQUFxQyxZQUFJLENBQUMsV0FBVyxDQUFHLENBQ3pELDRDQUUrQixZQUFJLENBQUMsV0FBVyxDQUFDLHlnQkFXUixXQUFXLHFEQUVYLFdBQVcsdUVBSS9DLFlBQUksQ0FBQywwQkFBd0IsYUFBYSx5QkFBc0IsQ0FBQyxrVUFVckQsV0FBVyxvSEFJRCxXQUFXLHFEQUdQLGFBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLHFDQUMvQixZQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFlLFdBQUcsQ0FBQyxJQUFJLENBQ2pFLGFBQWEsQ0FDZCxPQUNGLENBQUMsQ0FBQTtBQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBib2xkLCBjeWFuLCBncmVlbiwgcmVkIH0gZnJvbSBcImNoYWxrXCJcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCBzcGF3blNhZmVTeW5jIGZyb20gXCIuL3NwYXduU2FmZVwiXG5pbXBvcnQgeyBnZXRQYXRjaEZpbGVzLCByZW1vdmVHaXRIZWFkZXJzRnJvbVBhdGggfSBmcm9tIFwiLi9wYXRjaEZzXCJcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZmluZFBhdGNoRmlsZXMoYXBwUGF0aDogc3RyaW5nLCByZXZlcnNlOiBib29sZWFuKSB7XG4gIGNvbnN0IHBhdGNoZXNEaXJlY3RvcnkgPSBwYXRoLmpvaW4oYXBwUGF0aCwgXCJwYXRjaGVzXCIpXG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRjaGVzRGlyZWN0b3J5KSkge1xuICAgIHJldHVybiBbXVxuICB9XG4gIGNvbnN0IGZpbGVzID0gZ2V0UGF0Y2hGaWxlcyhwYXRjaGVzRGlyZWN0b3J5KS5maWx0ZXIoZmlsZW5hbWUgPT5cbiAgICBmaWxlbmFtZS5tYXRjaCgvXi4rKDp8XFwrKS4rXFwucGF0Y2gkLyksXG4gIClcblxuICBpZiAoZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5sb2coY3lhbihcIk5vIHBhdGNoIGZpbGVzIGZvdW5kXCIpKVxuICB9XG5cbiAgZmlsZXMuZm9yRWFjaChmaWxlbmFtZSA9PiB7XG4gICAgY29uc3QgbWF0Y2ggPSBmaWxlbmFtZS5tYXRjaCgvXiguKz8pKDp8XFwrKSguKylcXC5wYXRjaCQvKSBhcyBzdHJpbmdbXVxuICAgIGNvbnN0IHBhY2thZ2VOYW1lID0gbWF0Y2hbMV1cbiAgICBjb25zdCB2ZXJzaW9uID0gbWF0Y2hbM11cbiAgICBjb25zdCBwYWNrYWdlRGlyID0gcGF0aC5qb2luKGFwcFBhdGgsIFwibm9kZV9tb2R1bGVzXCIsIHBhY2thZ2VOYW1lKVxuXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhY2thZ2VEaXIpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGAke3JlZChcIldhcm5pbmc6XCIpfSBQYXRjaCBmaWxlIGZvdW5kIGZvciBwYWNrYWdlICR7cGFja2FnZU5hbWV9YCArXG4gICAgICAgICAgYCB3aGljaCBpcyBub3QgcHJlc2VudCBhdCAke3BhY2thZ2VEaXJ9YCxcbiAgICAgIClcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgY29uc3QgcGFja2FnZUpzb24gPSByZXF1aXJlKHBhdGguam9pbihwYWNrYWdlRGlyLCBcInBhY2thZ2UuanNvblwiKSlcblxuICAgIHRyeSB7XG4gICAgICBhcHBseVBhdGNoKHBhdGgucmVzb2x2ZShwYXRjaGVzRGlyZWN0b3J5LCBmaWxlbmFtZSksIHJldmVyc2UpXG5cbiAgICAgIGlmIChwYWNrYWdlSnNvbi52ZXJzaW9uICE9PSB2ZXJzaW9uKSB7XG4gICAgICAgIHByaW50VmVyc2lvbk1pc21hdGNoV2FybmluZyhwYWNrYWdlTmFtZSwgcGFja2FnZUpzb24udmVyc2lvbiwgdmVyc2lvbilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke2JvbGQocGFja2FnZU5hbWUpfUAke3ZlcnNpb259ICR7Z3JlZW4oXCLinJRcIil9YClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBjb21wbGV0ZWx5IGZhaWxlZCB0byBhcHBseSBwYXRjaFxuICAgICAgaWYgKHBhY2thZ2VKc29uLnZlcnNpb24gPT09IHZlcnNpb24pIHtcbiAgICAgICAgcHJpbnRCcm9rZW5QYXRjaEZpbGVFcnJvcihwYWNrYWdlTmFtZSwgZmlsZW5hbWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcmludFBhdGNoQXBwbGljdGlvbkZhaWx1cmVFcnJvcihcbiAgICAgICAgICBwYWNrYWdlTmFtZSxcbiAgICAgICAgICBwYWNrYWdlSnNvbi52ZXJzaW9uLFxuICAgICAgICAgIHZlcnNpb24sXG4gICAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgIH1cbiAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdpdEFwcGx5QXJncyhcbiAgcGF0Y2hGaWxlUGF0aDogc3RyaW5nLFxuICB7XG4gICAgcmV2ZXJzZSxcbiAgICBjaGVjayxcbiAgfToge1xuICAgIHJldmVyc2U/OiBib29sZWFuXG4gICAgY2hlY2s/OiBib29sZWFuXG4gIH0sXG4pIHtcbiAgY29uc3QgYXJncyA9IFtcImFwcGx5XCIsIFwiLS1pZ25vcmUtd2hpdGVzcGFjZVwiLCBcIi0td2hpdGVzcGFjZT1ub3dhcm5cIl1cbiAgaWYgKHJldmVyc2UpIHtcbiAgICBhcmdzLnB1c2goXCItLXJldmVyc2VcIilcbiAgfVxuICBpZiAoY2hlY2spIHtcbiAgICBhcmdzLnB1c2goXCItLWNoZWNrXCIpXG4gIH1cblxuICBhcmdzLnB1c2gocGF0Y2hGaWxlUGF0aClcblxuICByZXR1cm4gYXJnc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlQYXRjaChwYXRjaEZpbGVQYXRoOiBzdHJpbmcsIHJldmVyc2U6IGJvb2xlYW4pIHtcbiAgLy8gZmlyc3QgZmluZCBvdXQgaWYgdGhlIHBhdGNoIGZpbGUgd2FzIG1hZGUgYnkgcGF0Y2gtcGFja2FnZVxuICBjb25zdCBmaXJzdExpbmUgPSBmc1xuICAgIC5yZWFkRmlsZVN5bmMocGF0Y2hGaWxlUGF0aClcbiAgICAuc2xpY2UoMCwgXCJwYXRjaC1wYWNrYWdlXFxuXCIubGVuZ3RoKVxuICAgIC50b1N0cmluZygpXG5cbiAgLy8gaWYgbm90IHRoZW4gcmVtb3ZlIGdpdCBoZWFkZXJzIGJlZm9yZSBhcHBseWluZyB0byBtYWtlIHN1cmUgZ2l0XG4gIC8vIGRvZXNuJ3Qgc2tpcCBmaWxlcyB0aGF0IGFyZW4ndCBpbiB0aGUgaW5kZXhcbiAgaWYgKGZpcnN0TGluZSAhPT0gXCJwYXRjaC1wYWNrYWdlXFxuXCIpIHtcbiAgICBwYXRjaEZpbGVQYXRoID0gcmVtb3ZlR2l0SGVhZGVyc0Zyb21QYXRoKHBhdGNoRmlsZVBhdGgpXG4gIH1cblxuICB0cnkge1xuICAgIHNwYXduU2FmZVN5bmMoXG4gICAgICBcImdpdFwiLFxuICAgICAgZ2l0QXBwbHlBcmdzKHBhdGNoRmlsZVBhdGgsIHsgcmV2ZXJzZSwgY2hlY2s6IHRydWUgfSksXG4gICAgICB7XG4gICAgICAgIGxvZ1N0ZEVyck9uRXJyb3I6IGZhbHNlLFxuICAgICAgfSxcbiAgICApXG5cbiAgICBzcGF3blNhZmVTeW5jKFwiZ2l0XCIsIGdpdEFwcGx5QXJncyhwYXRjaEZpbGVQYXRoLCB7IHJldmVyc2UgfSksIHtcbiAgICAgIGxvZ1N0ZEVyck9uRXJyb3I6IGZhbHNlLFxuICAgIH0pXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBwYXRjaCBjbGkgdG9vbCBoYXMgbm8gd2F5IHRvIGZhaWwgZ3JhY2VmdWxseSBpZiBwYXRjaCB3YXMgYWxyZWFkeVxuICAgIC8vIGFwcGxpZWQsIHNvIHRvIGNoZWNrLCB3ZSBuZWVkIHRvIHRyeSBhIGRyeS1ydW4gb2YgYXBwbHlpbmcgdGhlIHBhdGNoIGluXG4gICAgLy8gcmV2ZXJzZSwgYW5kIGlmIHRoYXQgd29ya3MgaXQgbWVhbnMgdGhlIHBhdGNoIHdhcyBhbHJlYWR5IGFwcGxpZWRcbiAgICAvLyBzdWNlc3NmdWxseS4gT3RoZXJ3aXNlIHRoZSBwYXRjaCBqdXN0IGZhaWxlZCBmb3Igc29tZSByZWFzb24uXG4gICAgc3Bhd25TYWZlU3luYyhcbiAgICAgIFwiZ2l0XCIsXG4gICAgICBnaXRBcHBseUFyZ3MocGF0Y2hGaWxlUGF0aCwgeyByZXZlcnNlOiAhcmV2ZXJzZSwgY2hlY2s6IHRydWUgfSksXG4gICAgICB7XG4gICAgICAgIGxvZ1N0ZEVyck9uRXJyb3I6IGZhbHNlLFxuICAgICAgfSxcbiAgICApXG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRWZXJzaW9uTWlzbWF0Y2hXYXJuaW5nKFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICBhY3R1YWxWZXJzaW9uOiBzdHJpbmcsXG4gIG9yaWdpbmFsVmVyc2lvbjogc3RyaW5nLFxuKSB7XG4gIGNvbnNvbGUud2FybihgXG4ke3JlZChcIldhcm5pbmc6XCIpfSBwYXRjaC1wYWNrYWdlIGRldGVjdGVkIGEgcGF0Y2ggZmlsZSB2ZXJzaW9uIG1pc21hdGNoXG5cbiAgRG9uJ3Qgd29ycnkhIFRoaXMgaXMgcHJvYmFibHkgZmluZS4gVGhlIHBhdGNoIHdhcyBzdGlsbCBhcHBsaWVkXG4gIHN1Y2Nlc3NmdWxseS4gSGVyZSdzIHRoZSBkZWV0czpcblxuICBQYXRjaCBmaWxlIGNyZWF0ZWQgZm9yXG5cbiAgICAke3BhY2thZ2VOYW1lfUAke2JvbGQob3JpZ2luYWxWZXJzaW9uKX1cblxuICBhcHBsaWVkIHRvXG5cbiAgICAke3BhY2thZ2VOYW1lfUAke2JvbGQoYWN0dWFsVmVyc2lvbil9XG5cbiAgVGhpcyB3YXJuaW5nIGlzIGp1c3QgdG8gZ2l2ZSB5b3UgYSBoZWFkcy11cC4gVGhlcmUgaXMgYSBzbWFsbCBjaGFuY2Ugb2ZcbiAgYnJlYWthZ2UgZXZlbiB0aG91Z2ggdGhlIHBhdGNoIHdhcyBhcHBsaWVkIHN1Y2Nlc3NmdWxseS4gTWFrZSBzdXJlIHRoZSBwYWNrYWdlXG4gIHN0aWxsIGJlaGF2ZXMgbGlrZSB5b3UgZXhwZWN0ICh5b3Ugd3JvdGUgdGVzdHMsIHJpZ2h0PykgYW5kIHRoZW4gcnVuXG5cbiAgICAke2JvbGQoYHBhdGNoLXBhY2thZ2UgJHtwYWNrYWdlTmFtZX1gKX1cblxuICB0byB1cGRhdGUgdGhlIHZlcnNpb24gaW4gdGhlIHBhdGNoIGZpbGUgbmFtZSBhbmQgbWFrZSB0aGlzIHdhcm5pbmcgZ28gYXdheS5cbmApXG59XG5cbmZ1bmN0aW9uIHByaW50QnJva2VuUGF0Y2hGaWxlRXJyb3IocGFja2FnZU5hbWU6IHN0cmluZywgcGF0Y2hGaWxlTmFtZTogc3RyaW5nKSB7XG4gIGNvbnNvbGUuZXJyb3IoYFxuJHtyZWQuYm9sZChcIioqRVJST1IqKlwiKX0gJHtyZWQoXG4gICAgYEZhaWxlZCB0byBhcHBseSBwYXRjaCBmb3IgcGFja2FnZSAke2JvbGQocGFja2FnZU5hbWUpfWAsXG4gICl9XG5cbiAgVGhpcyBlcnJvciB3YXMgY2F1c2VkIGJlY2F1c2UgR2l0IGNhbm5vdCBhcHBseSB0aGUgZm9sbG93aW5nIHBhdGNoIGZpbGU6XG5cbiAgICBwYXRjaGVzLyR7cGF0Y2hGaWxlTmFtZX1cblxuICBUaGlzIGlzIHVzdWFsbHkgY2F1c2VkIGJ5IGluY29uc2lzdGVudCB3aGl0ZXNwYWNlIGluIHRoZSBwYXRjaCBmaWxlLlxuYClcbn1cblxuZnVuY3Rpb24gcHJpbnRQYXRjaEFwcGxpY3Rpb25GYWlsdXJlRXJyb3IoXG4gIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gIGFjdHVhbFZlcnNpb246IHN0cmluZyxcbiAgb3JpZ2luYWxWZXJzaW9uOiBzdHJpbmcsXG4gIHBhdGNoRmlsZU5hbWU6IHN0cmluZyxcbikge1xuICBjb25zb2xlLmVycm9yKGBcbiR7cmVkLmJvbGQoXCIqKkVSUk9SKipcIil9ICR7cmVkKFxuICAgIGBGYWlsZWQgdG8gYXBwbHkgcGF0Y2ggZm9yIHBhY2thZ2UgJHtib2xkKHBhY2thZ2VOYW1lKX1gLFxuICApfVxuXG4gIFRoaXMgZXJyb3Igd2FzIGNhdXNlZCBiZWNhdXNlICR7Ym9sZChwYWNrYWdlTmFtZSl9IGhhcyBjaGFuZ2VkIHNpbmNlIHlvdVxuICBtYWRlIHRoZSBwYXRjaCBmaWxlIGZvciBpdC4gVGhpcyBpbnRyb2R1Y2VkIGNvbmZsaWN0cyB3aXRoIHlvdXIgcGF0Y2gsXG4gIGp1c3QgbGlrZSBhIG1lcmdlIGNvbmZsaWN0IGluIEdpdCB3aGVuIHNlcGFyYXRlIGluY29tcGF0aWJsZSBjaGFuZ2VzIGFyZVxuICBtYWRlIHRvIHRoZSBzYW1lIHBpZWNlIG9mIGNvZGUuXG5cbiAgTWF5YmUgdGhpcyBtZWFucyB5b3VyIHBhdGNoIGZpbGUgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeSwgaW4gd2hpY2ggY2FzZVxuICBob29yYXkhIEp1c3QgZGVsZXRlIGl0IVxuXG4gIE90aGVyd2lzZSwgeW91IG5lZWQgdG8gbWFudWFsbHkgZml4IHRoZSBwYXRjaCBmaWxlLiBPciBnZW5lcmF0ZSBhIG5ldyBvbmVcblxuICBUbyBnZW5lcmF0ZSBhIG5ldyBvbmUsIGp1c3QgcmVwZWF0IHRoZSBzdGVwcyB5b3UgbWFkZSB0byBnZW5lcmF0ZSB0aGUgZmlyc3RcbiAgb25lLCBidXQgYWNjb3VudGluZyBmb3IgdGhlIGNoYW5nZXMgaW4gJHtwYWNrYWdlTmFtZX0uXG5cbiAgaS5lLiBtYWtlIGNoYW5nZXMsIHJ1biBcXGBwYXRjaC1wYWNrYWdlICR7cGFja2FnZU5hbWV9XFxgLCBhbmQgY29tbWl0LlxuXG4gIFRvIG1hbnVhbGx5IGZpeCBhIHBhdGNoIGZpbGUsIFJ1bjpcblxuICAgICAke2JvbGQoYHBhdGNoIC1wMSAtaSBwYXRjaGVzLyR7cGF0Y2hGaWxlTmFtZX0gLS12ZXJib3NlIC0tZHJ5LXJ1bmApfVxuXG4gIFRvIGxpc3QgcmVqZWN0ZWQgaHVua3MuIEEgJ2h1bmsnIGlzIGEgc2VjdGlvbiBvZiBwYXRjaCBmaWxlIHRoYXQgZGVzY3JpYmVzXG4gIG9uZSBjb250aWd1b3VzIGFyZWEgb2YgY2hhbmdlcy4gVGhleSBhcmUgbnVtYmVyZWQgZnJvbSAxIGFuZCBiZWdpbiB3aXRoIGxpbmVzXG4gIHRoYXQgbG9vayBsaWtlIHRoaXM6XG5cbiAgICBAQCAtNDgsNSArNDksNiBAQCBmdW5jdGlvbiBmb28oYmFyKSB7XG5cbiAgUmVtb3ZlIHRoZSBjb25mbGljdGluZyBodW5rcywgdGhlbiBtYW51YWxseSBlZGl0IGZpbGVzIGluXG5cbiAgICBub2RlX21vZHVsZXMvJHtwYWNrYWdlTmFtZX1cblxuICB0byByZWZsZWN0IHRoZSBjaGFuZ2VzIHRoYXQgdGhlIGNvbmZsaWN0aW5nIGh1bmtzIHdlcmUgc3VwcG9zZWQgdG8gbWFrZS5cblxuICBUaGVuIHJ1biBcXGBwYXRjaC1wYWNrYWdlICR7cGFja2FnZU5hbWV9XFxgXG5cbiAgSW5mbzpcbiAgICBQYXRjaCB3YXMgbWFkZSBmb3IgdmVyc2lvbiAke2dyZWVuLmJvbGQob3JpZ2luYWxWZXJzaW9uKX1cbiAgICBNZWFud2hpbGUgbm9kZV9tb2R1bGVzLyR7Ym9sZChwYWNrYWdlTmFtZSl9IGlzIHZlcnNpb24gJHtyZWQuYm9sZChcbiAgICBhY3R1YWxWZXJzaW9uLFxuICApfVxuYClcbn1cbiJdfQ==