@tricoteuses/assemblee
Version:
Retrieve, clean up & handle French Assemblée nationale's open data
223 lines (222 loc) • 28.1 kB
JavaScript
;
require("core-js/modules/es.symbol.js");
require("core-js/modules/es.symbol.description.js");
require("core-js/modules/es.symbol.iterator.js");
require("core-js/modules/es.array.from.js");
require("core-js/modules/es.array.is-array.js");
require("core-js/modules/es.array.iterator.js");
require("core-js/modules/es.array.slice.js");
require("core-js/modules/es.function.name.js");
require("core-js/modules/es.object.define-property.js");
require("core-js/modules/es.string.iterator.js");
require("core-js/modules/web.dom-collections.iterator.js");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.clone = clone;
exports.commit = commit;
exports.commitAndPush = commitAndPush;
exports.resetAndPull = resetAndPull;
exports.run = run;
exports.test = test;
exports.uidBranchUpdate = uidBranchUpdate;
require("core-js/modules/es.array.concat.js");
require("core-js/modules/es.date.to-string.js");
require("core-js/modules/es.object.to-string.js");
require("core-js/modules/es.regexp.exec.js");
require("core-js/modules/es.regexp.to-string.js");
require("core-js/modules/es.string.trim.js");
var _path = _interopRequireDefault(require("path"));
var _fsExtra = _interopRequireDefault(require("fs-extra"));
var _file_systems = require("./file_systems");
var _child_process = require("child_process");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
var MAXBUFFER = 50 * 1024 * 1024;
function commit(repositoryDir, message) {
(0, _child_process.execSync)("git add .", {
cwd: repositoryDir,
env: process.env,
encoding: "utf-8",
stdio: ["ignore", "ignore", "pipe"],
maxBuffer: MAXBUFFER
});
try {
(0, _child_process.execSync)("git commit -m \"".concat(message, "\" --quiet"), {
cwd: repositoryDir,
env: process.env,
encoding: "utf-8",
stdio: ["ignore", "pipe", "pipe"]
});
return true;
} catch (childProcess) {
if (childProcess.stdout === null || !/nothing to commit/.test(childProcess.stdout)) {
console.error(childProcess.output);
throw childProcess;
}
return false;
}
}
function commitAndPush(repositoryDir, message, remotes) {
var exitCode = 0;
if (commit(repositoryDir, message)) {
var _iterator = _createForOfIteratorHelper(remotes || []),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var remote = _step.value;
try {
(0, _child_process.execSync)("git push ".concat(remote, " master"), {
cwd: repositoryDir,
env: process.env,
encoding: "utf-8",
stdio: ["ignore", "ignore", "pipe"]
});
} catch (childProcess) {
// Don't stop when push fails.
console.error(childProcess.output);
exitCode = childProcess.status;
}
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
} else {
// There was nothing to commit.
exitCode = 10;
}
return exitCode;
}
function resetAndPull(gitDir) {
(0, _child_process.execSync)("git reset --hard origin/master", {
cwd: gitDir,
env: process.env,
encoding: "utf-8",
stdio: ["ignore", "ignore", "pipe"]
});
(0, _child_process.execSync)("git pull --rebase", {
cwd: gitDir,
env: process.env,
encoding: "utf-8",
stdio: ["ignore", "ignore", "pipe"]
});
return true;
}
function clone(gitGroupUrl, gitName, workingDir) {
if (gitGroupUrl !== undefined) {
(0, _child_process.execSync)("git clone ".concat(gitGroupUrl, "/").concat(gitName, ".git"), {
cwd: workingDir,
env: process.env,
encoding: "utf-8",
stdio: ["ignore", "ignore", "pipe"]
});
}
}
function run(repositoryDir, args, verbose) {
try {
if (verbose) console.log("git -C ".concat(repositoryDir, " ").concat(args));
var output = (0, _child_process.execSync)("git ".concat(args), {
cwd: repositoryDir,
maxBuffer: MAXBUFFER
}).toString().trim();
if (verbose) console.log(output);
return output;
} catch (childProcess) {
for (var _i = 0, _arr = ["stdout", "stderr"]; _i < _arr.length; _i++) {
var _output = _arr[_i];
console.error("".concat(_output, ": ").concat(childProcess[_output]));
}
throw childProcess;
}
}
function test(repositoryDir, args, verbose) {
try {
if (verbose) console.log("git -C ".concat(repositoryDir, " ").concat(args));
var output = (0, _child_process.execSync)("git ".concat(args), {
cwd: repositoryDir,
stdio: ["ignore", "pipe", "pipe"],
maxBuffer: MAXBUFFER
}).toString().trim();
if (verbose) console.log(output);
return true;
} catch (childProcess) {
if (childProcess.status != 0) return false;
throw childProcess;
}
}
function uidBranchUpdate(repositoryDir, subdirectories, notHard) {
var previousBranch = run(repositoryDir, "rev-parse --abbrev-ref HEAD");
var branch = "uid";
var cwd = process.cwd();
process.chdir(repositoryDir);
var _iterator2 = _createForOfIteratorHelper(subdirectories),
_step2;
try {
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
var subdirectory = _step2.value;
var uidDirectory = "".concat(subdirectory, "/uid");
_fsExtra["default"].ensureDirSync(uidDirectory);
var _iterator4 = _createForOfIteratorHelper((0, _file_systems.getFiles)(["".concat(subdirectory, "/**/*.json")])),
_step4;
try {
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
var pathname = _step4.value;
var filename = _path["default"].basename(pathname);
_fsExtra["default"].renameSync(pathname, "".concat(uidDirectory, "/").concat(filename));
}
} catch (err) {
_iterator4.e(err);
} finally {
_iterator4.f();
}
}
} catch (err) {
_iterator2.e(err);
} finally {
_iterator2.f();
}
process.chdir(cwd);
if (test(repositoryDir, "rev-parse remotes/origin/".concat(branch))) {
// if a remote branch exists, it must be used even if a local branch exists
run(repositoryDir, "branch --force ".concat(branch, " origin/").concat(branch));
run(repositoryDir, "symbolic-ref HEAD refs/heads/".concat(branch));
run(repositoryDir, "reset");
} else if (test(repositoryDir, "rev-parse refs/heads/".concat(branch))) {
// if no remote branch exists but a local one exists, use it
run(repositoryDir, "symbolic-ref HEAD refs/heads/".concat(branch));
run(repositoryDir, "reset");
} else {
// if there are no remote or local branches, create a new one
run(repositoryDir, "branch --force ".concat(branch, " master"));
run(repositoryDir, "symbolic-ref HEAD refs/heads/".concat(branch));
run(repositoryDir, "reset");
run(repositoryDir, "rm -r .");
}
var _iterator3 = _createForOfIteratorHelper(subdirectories),
_step3;
try {
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
var _subdirectory = _step3.value;
var _uidDirectory = "".concat(_subdirectory, "/uid");
run(repositoryDir, "add ".concat(_uidDirectory));
}
} catch (err) {
_iterator3.e(err);
} finally {
_iterator3.f();
}
var status = false;
if (!test(repositoryDir, "diff --quiet --cached")) {
run(repositoryDir, "commit -m 'Update'");
status = true;
}
run(repositoryDir, "symbolic-ref HEAD refs/heads/".concat(previousBranch));
var resetOption = notHard ? "" : "--hard";
run(repositoryDir, "reset ".concat(resetOption));
return status;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcGF0aCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2ZzRXh0cmEiLCJfZmlsZV9zeXN0ZW1zIiwiX2NoaWxkX3Byb2Nlc3MiLCJlIiwiX19lc01vZHVsZSIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiciIsInQiLCJTeW1ib2wiLCJpdGVyYXRvciIsIkFycmF5IiwiaXNBcnJheSIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsImxlbmd0aCIsIl9uIiwiRiIsInMiLCJuIiwiZG9uZSIsInZhbHVlIiwiZiIsIlR5cGVFcnJvciIsIm8iLCJhIiwidSIsImNhbGwiLCJuZXh0IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiZnJvbSIsInRlc3QiLCJNQVhCVUZGRVIiLCJjb21taXQiLCJyZXBvc2l0b3J5RGlyIiwibWVzc2FnZSIsImV4ZWNTeW5jIiwiY3dkIiwiZW52IiwicHJvY2VzcyIsImVuY29kaW5nIiwic3RkaW8iLCJtYXhCdWZmZXIiLCJjb25jYXQiLCJjaGlsZFByb2Nlc3MiLCJzdGRvdXQiLCJjb25zb2xlIiwiZXJyb3IiLCJvdXRwdXQiLCJjb21taXRBbmRQdXNoIiwicmVtb3RlcyIsImV4aXRDb2RlIiwiX2l0ZXJhdG9yIiwiX3N0ZXAiLCJyZW1vdGUiLCJzdGF0dXMiLCJlcnIiLCJyZXNldEFuZFB1bGwiLCJnaXREaXIiLCJjbG9uZSIsImdpdEdyb3VwVXJsIiwiZ2l0TmFtZSIsIndvcmtpbmdEaXIiLCJ1bmRlZmluZWQiLCJydW4iLCJhcmdzIiwidmVyYm9zZSIsImxvZyIsInRyaW0iLCJfaSIsIl9hcnIiLCJ1aWRCcmFuY2hVcGRhdGUiLCJzdWJkaXJlY3RvcmllcyIsIm5vdEhhcmQiLCJwcmV2aW91c0JyYW5jaCIsImJyYW5jaCIsImNoZGlyIiwiX2l0ZXJhdG9yMiIsIl9zdGVwMiIsInN1YmRpcmVjdG9yeSIsInVpZERpcmVjdG9yeSIsImZzIiwiZW5zdXJlRGlyU3luYyIsIl9pdGVyYXRvcjQiLCJnZXRGaWxlcyIsIl9zdGVwNCIsInBhdGhuYW1lIiwiZmlsZW5hbWUiLCJwYXRoIiwiYmFzZW5hbWUiLCJyZW5hbWVTeW5jIiwiX2l0ZXJhdG9yMyIsIl9zdGVwMyIsInJlc2V0T3B0aW9uIl0sInNvdXJjZXMiOlsiLi4vc3JjL2dpdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCB7IGdldEZpbGVzIH0gZnJvbSBcIi4vZmlsZV9zeXN0ZW1zXCJcbmltcG9ydCB7IENoaWxkUHJvY2VzcywgZXhlY1N5bmMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiXG5cbmNvbnN0IE1BWEJVRkZFUiA9IDUwICogMTAyNCAqIDEwMjRcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbW1pdChyZXBvc2l0b3J5RGlyOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBleGVjU3luYyhcImdpdCBhZGQgLlwiLCB7XG4gICAgY3dkOiByZXBvc2l0b3J5RGlyLFxuICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICBtYXhCdWZmZXI6IE1BWEJVRkZFUixcbiAgfSlcbiAgdHJ5IHtcbiAgICBleGVjU3luYyhgZ2l0IGNvbW1pdCAtbSBcIiR7bWVzc2FnZX1cIiAtLXF1aWV0YCwge1xuICAgICAgY3dkOiByZXBvc2l0b3J5RGlyLFxuICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwicGlwZVwiLCBcInBpcGVcIl0sXG4gICAgfSlcbiAgICByZXR1cm4gdHJ1ZVxuICB9IGNhdGNoIChjaGlsZFByb2Nlc3MpIHtcbiAgICBpZiAoXG4gICAgICAoY2hpbGRQcm9jZXNzIGFzIENoaWxkUHJvY2Vzcykuc3Rkb3V0ID09PSBudWxsIHx8XG4gICAgICAhL25vdGhpbmcgdG8gY29tbWl0Ly50ZXN0KChjaGlsZFByb2Nlc3MgYXMgYW55KS5zdGRvdXQpXG4gICAgKSB7XG4gICAgICBjb25zb2xlLmVycm9yKChjaGlsZFByb2Nlc3MgYXMgYW55KS5vdXRwdXQpXG4gICAgICB0aHJvdyBjaGlsZFByb2Nlc3NcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbW1pdEFuZFB1c2goXG4gIHJlcG9zaXRvcnlEaXI6IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nLFxuICByZW1vdGVzPzogc3RyaW5nW10sXG4pOiBudW1iZXIge1xuICBsZXQgZXhpdENvZGUgPSAwXG4gIGlmIChjb21taXQocmVwb3NpdG9yeURpciwgbWVzc2FnZSkpIHtcbiAgICBmb3IgKGNvbnN0IHJlbW90ZSBvZiByZW1vdGVzIHx8IFtdKSB7XG4gICAgICB0cnkge1xuICAgICAgICBleGVjU3luYyhgZ2l0IHB1c2ggJHtyZW1vdGV9IG1hc3RlcmAsIHtcbiAgICAgICAgICBjd2Q6IHJlcG9zaXRvcnlEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoY2hpbGRQcm9jZXNzKSB7XG4gICAgICAgIC8vIERvbid0IHN0b3Agd2hlbiBwdXNoIGZhaWxzLlxuICAgICAgICBjb25zb2xlLmVycm9yKChjaGlsZFByb2Nlc3MgYXMgYW55KS5vdXRwdXQpXG4gICAgICAgIGV4aXRDb2RlID0gKGNoaWxkUHJvY2VzcyBhcyBhbnkpLnN0YXR1c1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBUaGVyZSB3YXMgbm90aGluZyB0byBjb21taXQuXG4gICAgZXhpdENvZGUgPSAxMFxuICB9XG4gIHJldHVybiBleGl0Q29kZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRBbmRQdWxsKGdpdERpcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGV4ZWNTeW5jKGBnaXQgcmVzZXQgLS1oYXJkIG9yaWdpbi9tYXN0ZXJgLCB7XG4gICAgY3dkOiBnaXREaXIsXG4gICAgZW52OiBwcm9jZXNzLmVudixcbiAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICB9KVxuXG4gIGV4ZWNTeW5jKGBnaXQgcHVsbCAtLXJlYmFzZWAsIHtcbiAgICBjd2Q6IGdpdERpcixcbiAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gIH0pXG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lKFxuICBnaXRHcm91cFVybDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBnaXROYW1lOiBzdHJpbmcsXG4gIHdvcmtpbmdEaXI6IHN0cmluZyxcbik6IHZvaWQge1xuICBpZiAoZ2l0R3JvdXBVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgIGV4ZWNTeW5jKGBnaXQgY2xvbmUgJHtnaXRHcm91cFVybH0vJHtnaXROYW1lfS5naXRgLCB7XG4gICAgICBjd2Q6IHdvcmtpbmdEaXIsXG4gICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bihcbiAgcmVwb3NpdG9yeURpcjogc3RyaW5nLFxuICBhcmdzOiBzdHJpbmcsXG4gIHZlcmJvc2U/OiBib29sZWFuLFxuKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICBpZiAodmVyYm9zZSkgY29uc29sZS5sb2coYGdpdCAtQyAke3JlcG9zaXRvcnlEaXJ9ICR7YXJnc31gKVxuICAgIGNvbnN0IG91dHB1dCA9IGV4ZWNTeW5jKGBnaXQgJHthcmdzfWAsIHtcbiAgICAgIGN3ZDogcmVwb3NpdG9yeURpcixcbiAgICAgIG1heEJ1ZmZlcjogTUFYQlVGRkVSLFxuICAgIH0pXG4gICAgICAudG9TdHJpbmcoKVxuICAgICAgLnRyaW0oKVxuICAgIGlmICh2ZXJib3NlKSBjb25zb2xlLmxvZyhvdXRwdXQpXG4gICAgcmV0dXJuIG91dHB1dFxuICB9IGNhdGNoIChjaGlsZFByb2Nlc3MpIHtcbiAgICBmb3IgKGNvbnN0IG91dHB1dCBvZiBbXCJzdGRvdXRcIiwgXCJzdGRlcnJcIl0pXG4gICAgICBjb25zb2xlLmVycm9yKGAke291dHB1dH06ICR7KGNoaWxkUHJvY2VzcyBhcyBhbnkpW291dHB1dF19YClcbiAgICB0aHJvdyBjaGlsZFByb2Nlc3NcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdGVzdChcbiAgcmVwb3NpdG9yeURpcjogc3RyaW5nLFxuICBhcmdzOiBzdHJpbmcsXG4gIHZlcmJvc2U/OiBib29sZWFuLFxuKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgaWYgKHZlcmJvc2UpIGNvbnNvbGUubG9nKGBnaXQgLUMgJHtyZXBvc2l0b3J5RGlyfSAke2FyZ3N9YClcbiAgICBjb25zdCBvdXRwdXQgPSBleGVjU3luYyhgZ2l0ICR7YXJnc31gLCB7XG4gICAgICBjd2Q6IHJlcG9zaXRvcnlEaXIsXG4gICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwicGlwZVwiLCBcInBpcGVcIl0sXG4gICAgICBtYXhCdWZmZXI6IE1BWEJVRkZFUixcbiAgICB9KVxuICAgICAgLnRvU3RyaW5nKClcbiAgICAgIC50cmltKClcbiAgICBpZiAodmVyYm9zZSkgY29uc29sZS5sb2cob3V0cHV0KVxuICAgIHJldHVybiB0cnVlXG4gIH0gY2F0Y2ggKGNoaWxkUHJvY2Vzcykge1xuICAgIGlmICgoY2hpbGRQcm9jZXNzIGFzIGFueSkuc3RhdHVzICE9IDApIHJldHVybiBmYWxzZVxuICAgIHRocm93IGNoaWxkUHJvY2Vzc1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1aWRCcmFuY2hVcGRhdGUoXG4gIHJlcG9zaXRvcnlEaXI6IHN0cmluZyxcbiAgc3ViZGlyZWN0b3JpZXM6IGFueSxcbiAgbm90SGFyZDogYm9vbGVhbixcbik6IGJvb2xlYW4ge1xuICBjb25zdCBwcmV2aW91c0JyYW5jaCA9IHJ1bihyZXBvc2l0b3J5RGlyLCBcInJldi1wYXJzZSAtLWFiYnJldi1yZWYgSEVBRFwiKVxuICBjb25zdCBicmFuY2ggPSBcInVpZFwiXG4gIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKClcbiAgcHJvY2Vzcy5jaGRpcihyZXBvc2l0b3J5RGlyKVxuICBmb3IgKGNvbnN0IHN1YmRpcmVjdG9yeSBvZiBzdWJkaXJlY3Rvcmllcykge1xuICAgIGNvbnN0IHVpZERpcmVjdG9yeSA9IGAke3N1YmRpcmVjdG9yeX0vdWlkYFxuICAgIGZzLmVuc3VyZURpclN5bmModWlkRGlyZWN0b3J5KVxuICAgIGZvciAoY29uc3QgcGF0aG5hbWUgb2YgZ2V0RmlsZXMoW2Ake3N1YmRpcmVjdG9yeX0vKiovKi5qc29uYF0pKSB7XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IHBhdGguYmFzZW5hbWUocGF0aG5hbWUpXG4gICAgICBmcy5yZW5hbWVTeW5jKHBhdGhuYW1lLCBgJHt1aWREaXJlY3Rvcnl9LyR7ZmlsZW5hbWV9YClcbiAgICB9XG4gIH1cbiAgcHJvY2Vzcy5jaGRpcihjd2QpXG4gIGlmICh0ZXN0KHJlcG9zaXRvcnlEaXIsIGByZXYtcGFyc2UgcmVtb3Rlcy9vcmlnaW4vJHticmFuY2h9YCkpIHtcbiAgICAvLyBpZiBhIHJlbW90ZSBicmFuY2ggZXhpc3RzLCBpdCBtdXN0IGJlIHVzZWQgZXZlbiBpZiBhIGxvY2FsIGJyYW5jaCBleGlzdHNcbiAgICBydW4ocmVwb3NpdG9yeURpciwgYGJyYW5jaCAtLWZvcmNlICR7YnJhbmNofSBvcmlnaW4vJHticmFuY2h9YClcbiAgICBydW4ocmVwb3NpdG9yeURpciwgYHN5bWJvbGljLXJlZiBIRUFEIHJlZnMvaGVhZHMvJHticmFuY2h9YClcbiAgICBydW4ocmVwb3NpdG9yeURpciwgXCJyZXNldFwiKVxuICB9IGVsc2UgaWYgKHRlc3QocmVwb3NpdG9yeURpciwgYHJldi1wYXJzZSByZWZzL2hlYWRzLyR7YnJhbmNofWApKSB7XG4gICAgLy8gaWYgbm8gcmVtb3RlIGJyYW5jaCBleGlzdHMgYnV0IGEgbG9jYWwgb25lIGV4aXN0cywgdXNlIGl0XG4gICAgcnVuKHJlcG9zaXRvcnlEaXIsIGBzeW1ib2xpYy1yZWYgSEVBRCByZWZzL2hlYWRzLyR7YnJhbmNofWApXG4gICAgcnVuKHJlcG9zaXRvcnlEaXIsIFwicmVzZXRcIilcbiAgfSBlbHNlIHtcbiAgICAvLyBpZiB0aGVyZSBhcmUgbm8gcmVtb3RlIG9yIGxvY2FsIGJyYW5jaGVzLCBjcmVhdGUgYSBuZXcgb25lXG4gICAgcnVuKHJlcG9zaXRvcnlEaXIsIGBicmFuY2ggLS1mb3JjZSAke2JyYW5jaH0gbWFzdGVyYClcbiAgICBydW4ocmVwb3NpdG9yeURpciwgYHN5bWJvbGljLXJlZiBIRUFEIHJlZnMvaGVhZHMvJHticmFuY2h9YClcbiAgICBydW4ocmVwb3NpdG9yeURpciwgXCJyZXNldFwiKVxuICAgIHJ1bihyZXBvc2l0b3J5RGlyLCBcInJtIC1yIC5cIilcbiAgfVxuICBmb3IgKGNvbnN0IHN1YmRpcmVjdG9yeSBvZiBzdWJkaXJlY3Rvcmllcykge1xuICAgIGNvbnN0IHVpZERpcmVjdG9yeSA9IGAke3N1YmRpcmVjdG9yeX0vdWlkYFxuICAgIHJ1bihyZXBvc2l0b3J5RGlyLCBgYWRkICR7dWlkRGlyZWN0b3J5fWApXG4gIH1cbiAgbGV0IHN0YXR1cyA9IGZhbHNlXG4gIGlmICghdGVzdChyZXBvc2l0b3J5RGlyLCBcImRpZmYgLS1xdWlldCAtLWNhY2hlZFwiKSkge1xuICAgIHJ1bihyZXBvc2l0b3J5RGlyLCBgY29tbWl0IC1tICdVcGRhdGUnYClcbiAgICBzdGF0dXMgPSB0cnVlXG4gIH1cbiAgcnVuKHJlcG9zaXRvcnlEaXIsIGBzeW1ib2xpYy1yZWYgSEVBRCByZWZzL2hlYWRzLyR7cHJldmlvdXNCcmFuY2h9YClcbiAgY29uc3QgcmVzZXRPcHRpb24gPSBub3RIYXJkID8gXCJcIiA6IFwiLS1oYXJkXCJcbiAgcnVuKHJlcG9zaXRvcnlEaXIsIGByZXNldCAke3Jlc2V0T3B0aW9ufWApXG4gIHJldHVybiBzdGF0dXNcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFBQSxLQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxRQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxhQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxjQUFBLEdBQUFILE9BQUE7QUFBc0QsU0FBQUQsdUJBQUFLLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxnQkFBQUEsQ0FBQTtBQUFBLFNBQUFFLDJCQUFBQyxDQUFBLEVBQUFILENBQUEsUUFBQUksQ0FBQSx5QkFBQUMsTUFBQSxJQUFBRixDQUFBLENBQUFFLE1BQUEsQ0FBQUMsUUFBQSxLQUFBSCxDQUFBLHFCQUFBQyxDQUFBLFFBQUFHLEtBQUEsQ0FBQUMsT0FBQSxDQUFBTCxDQUFBLE1BQUFDLENBQUEsR0FBQUssMkJBQUEsQ0FBQU4sQ0FBQSxNQUFBSCxDQUFBLElBQUFHLENBQUEsdUJBQUFBLENBQUEsQ0FBQU8sTUFBQSxJQUFBTixDQUFBLEtBQUFELENBQUEsR0FBQUMsQ0FBQSxPQUFBTyxFQUFBLE1BQUFDLENBQUEsWUFBQUEsRUFBQSxlQUFBQyxDQUFBLEVBQUFELENBQUEsRUFBQUUsQ0FBQSxXQUFBQSxFQUFBLFdBQUFILEVBQUEsSUFBQVIsQ0FBQSxD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