@tricoteuses/assemblee
Version:
Retrieve, clean up & handle French Assemblée nationale's open data
151 lines • 19.7 kB
JavaScript
import path from "path";
import fs from "fs-extra";
import { getFiles } from "./file_systems.mjs";
import { execSync } from "child_process";
const MAXBUFFER = 50 * 1024 * 1024;
export function commit(repositoryDir, message) {
execSync("git add .", {
cwd: repositoryDir,
env: process.env,
encoding: "utf-8",
stdio: ["ignore", "ignore", "pipe"],
maxBuffer: MAXBUFFER
});
try {
execSync(`git commit -m "${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;
}
}
export function commitAndPush(repositoryDir, message, remotes) {
let exitCode = 0;
if (commit(repositoryDir, message)) {
for (const remote of remotes || []) {
try {
execSync(`git push ${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;
}
}
} else {
// There was nothing to commit.
exitCode = 10;
}
return exitCode;
}
export function resetAndPull(gitDir) {
execSync(`git reset --hard origin/master`, {
cwd: gitDir,
env: process.env,
encoding: "utf-8",
stdio: ["ignore", "ignore", "pipe"]
});
execSync(`git pull --rebase`, {
cwd: gitDir,
env: process.env,
encoding: "utf-8",
stdio: ["ignore", "ignore", "pipe"]
});
return true;
}
export function clone(gitGroupUrl, gitName, workingDir) {
if (gitGroupUrl !== undefined) {
execSync(`git clone ${gitGroupUrl}/${gitName}.git`, {
cwd: workingDir,
env: process.env,
encoding: "utf-8",
stdio: ["ignore", "ignore", "pipe"]
});
}
}
export function run(repositoryDir, args, verbose) {
try {
if (verbose) console.log(`git -C ${repositoryDir} ${args}`);
const output = execSync(`git ${args}`, {
cwd: repositoryDir,
maxBuffer: MAXBUFFER
}).toString().trim();
if (verbose) console.log(output);
return output;
} catch (childProcess) {
for (const output of ["stdout", "stderr"]) console.error(`${output}: ${childProcess[output]}`);
throw childProcess;
}
}
export function test(repositoryDir, args, verbose) {
try {
if (verbose) console.log(`git -C ${repositoryDir} ${args}`);
const output = execSync(`git ${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;
}
}
export function uidBranchUpdate(repositoryDir, subdirectories, notHard) {
const previousBranch = run(repositoryDir, "rev-parse --abbrev-ref HEAD");
const branch = "uid";
const cwd = process.cwd();
process.chdir(repositoryDir);
for (const subdirectory of subdirectories) {
const uidDirectory = `${subdirectory}/uid`;
fs.ensureDirSync(uidDirectory);
for (const pathname of getFiles([`${subdirectory}/**/*.json`])) {
const filename = path.basename(pathname);
fs.renameSync(pathname, `${uidDirectory}/${filename}`);
}
}
process.chdir(cwd);
if (test(repositoryDir, `rev-parse remotes/origin/${branch}`)) {
// if a remote branch exists, it must be used even if a local branch exists
run(repositoryDir, `branch --force ${branch} origin/${branch}`);
run(repositoryDir, `symbolic-ref HEAD refs/heads/${branch}`);
run(repositoryDir, "reset");
} else if (test(repositoryDir, `rev-parse refs/heads/${branch}`)) {
// if no remote branch exists but a local one exists, use it
run(repositoryDir, `symbolic-ref HEAD refs/heads/${branch}`);
run(repositoryDir, "reset");
} else {
// if there are no remote or local branches, create a new one
run(repositoryDir, `branch --force ${branch} master`);
run(repositoryDir, `symbolic-ref HEAD refs/heads/${branch}`);
run(repositoryDir, "reset");
run(repositoryDir, "rm -r .");
}
for (const subdirectory of subdirectories) {
const uidDirectory = `${subdirectory}/uid`;
run(repositoryDir, `add ${uidDirectory}`);
}
let status = false;
if (!test(repositoryDir, "diff --quiet --cached")) {
run(repositoryDir, `commit -m 'Update'`);
status = true;
}
run(repositoryDir, `symbolic-ref HEAD refs/heads/${previousBranch}`);
const resetOption = notHard ? "" : "--hard";
run(repositoryDir, `reset ${resetOption}`);
return status;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwYXRoIiwiZnMiLCJnZXRGaWxlcyIsImV4ZWNTeW5jIiwiTUFYQlVGRkVSIiwiY29tbWl0IiwicmVwb3NpdG9yeURpciIsIm1lc3NhZ2UiLCJjd2QiLCJlbnYiLCJwcm9jZXNzIiwiZW5jb2RpbmciLCJzdGRpbyIsIm1heEJ1ZmZlciIsImNoaWxkUHJvY2VzcyIsInN0ZG91dCIsInRlc3QiLCJjb25zb2xlIiwiZXJyb3IiLCJvdXRwdXQiLCJjb21taXRBbmRQdXNoIiwicmVtb3RlcyIsImV4aXRDb2RlIiwicmVtb3RlIiwic3RhdHVzIiwicmVzZXRBbmRQdWxsIiwiZ2l0RGlyIiwiY2xvbmUiLCJnaXRHcm91cFVybCIsImdpdE5hbWUiLCJ3b3JraW5nRGlyIiwidW5kZWZpbmVkIiwicnVuIiwiYXJncyIsInZlcmJvc2UiLCJsb2ciLCJ0b1N0cmluZyIsInRyaW0iLCJ1aWRCcmFuY2hVcGRhdGUiLCJzdWJkaXJlY3RvcmllcyIsIm5vdEhhcmQiLCJwcmV2aW91c0JyYW5jaCIsImJyYW5jaCIsImNoZGlyIiwic3ViZGlyZWN0b3J5IiwidWlkRGlyZWN0b3J5IiwiZW5zdXJlRGlyU3luYyIsInBhdGhuYW1lIiwiZmlsZW5hbWUiLCJiYXNlbmFtZSIsInJlbmFtZVN5bmMiLCJyZXNldE9wdGlvbiJdLCJzb3VyY2VzIjpbIi4uL3NyYy9naXQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuaW1wb3J0IGZzIGZyb20gXCJmcy1leHRyYVwiXG5pbXBvcnQgeyBnZXRGaWxlcyB9IGZyb20gXCIuL2ZpbGVfc3lzdGVtc1wiXG5pbXBvcnQgeyBDaGlsZFByb2Nlc3MsIGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIlxuXG5jb25zdCBNQVhCVUZGRVIgPSA1MCAqIDEwMjQgKiAxMDI0XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21taXQocmVwb3NpdG9yeURpcjogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgZXhlY1N5bmMoXCJnaXQgYWRkIC5cIiwge1xuICAgIGN3ZDogcmVwb3NpdG9yeURpcixcbiAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgbWF4QnVmZmVyOiBNQVhCVUZGRVIsXG4gIH0pXG4gIHRyeSB7XG4gICAgZXhlY1N5bmMoYGdpdCBjb21taXQgLW0gXCIke21lc3NhZ2V9XCIgLS1xdWlldGAsIHtcbiAgICAgIGN3ZDogcmVwb3NpdG9yeURpcixcbiAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcInBpcGVcIiwgXCJwaXBlXCJdLFxuICAgIH0pXG4gICAgcmV0dXJuIHRydWVcbiAgfSBjYXRjaCAoY2hpbGRQcm9jZXNzKSB7XG4gICAgaWYgKFxuICAgICAgKGNoaWxkUHJvY2VzcyBhcyBDaGlsZFByb2Nlc3MpLnN0ZG91dCA9PT0gbnVsbCB8fFxuICAgICAgIS9ub3RoaW5nIHRvIGNvbW1pdC8udGVzdCgoY2hpbGRQcm9jZXNzIGFzIGFueSkuc3Rkb3V0KVxuICAgICkge1xuICAgICAgY29uc29sZS5lcnJvcigoY2hpbGRQcm9jZXNzIGFzIGFueSkub3V0cHV0KVxuICAgICAgdGhyb3cgY2hpbGRQcm9jZXNzXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21taXRBbmRQdXNoKFxuICByZXBvc2l0b3J5RGlyOiBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZyxcbiAgcmVtb3Rlcz86IHN0cmluZ1tdLFxuKTogbnVtYmVyIHtcbiAgbGV0IGV4aXRDb2RlID0gMFxuICBpZiAoY29tbWl0KHJlcG9zaXRvcnlEaXIsIG1lc3NhZ2UpKSB7XG4gICAgZm9yIChjb25zdCByZW1vdGUgb2YgcmVtb3RlcyB8fCBbXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBwdXNoICR7cmVtb3RlfSBtYXN0ZXJgLCB7XG4gICAgICAgICAgY3dkOiByZXBvc2l0b3J5RGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2ggKGNoaWxkUHJvY2Vzcykge1xuICAgICAgICAvLyBEb24ndCBzdG9wIHdoZW4gcHVzaCBmYWlscy5cbiAgICAgICAgY29uc29sZS5lcnJvcigoY2hpbGRQcm9jZXNzIGFzIGFueSkub3V0cHV0KVxuICAgICAgICBleGl0Q29kZSA9IChjaGlsZFByb2Nlc3MgYXMgYW55KS5zdGF0dXNcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhlcmUgd2FzIG5vdGhpbmcgdG8gY29tbWl0LlxuICAgIGV4aXRDb2RlID0gMTBcbiAgfVxuICByZXR1cm4gZXhpdENvZGVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0QW5kUHVsbChnaXREaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBleGVjU3luYyhgZ2l0IHJlc2V0IC0taGFyZCBvcmlnaW4vbWFzdGVyYCwge1xuICAgIGN3ZDogZ2l0RGlyLFxuICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgfSlcblxuICBleGVjU3luYyhgZ2l0IHB1bGwgLS1yZWJhc2VgLCB7XG4gICAgY3dkOiBnaXREaXIsXG4gICAgZW52OiBwcm9jZXNzLmVudixcbiAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICB9KVxuXG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShcbiAgZ2l0R3JvdXBVcmw6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZ2l0TmFtZTogc3RyaW5nLFxuICB3b3JraW5nRGlyOiBzdHJpbmcsXG4pOiB2b2lkIHtcbiAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICBleGVjU3luYyhgZ2l0IGNsb25lICR7Z2l0R3JvdXBVcmx9LyR7Z2l0TmFtZX0uZ2l0YCwge1xuICAgICAgY3dkOiB3b3JraW5nRGlyLFxuICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW4oXG4gIHJlcG9zaXRvcnlEaXI6IHN0cmluZyxcbiAgYXJnczogc3RyaW5nLFxuICB2ZXJib3NlPzogYm9vbGVhbixcbik6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgaWYgKHZlcmJvc2UpIGNvbnNvbGUubG9nKGBnaXQgLUMgJHtyZXBvc2l0b3J5RGlyfSAke2FyZ3N9YClcbiAgICBjb25zdCBvdXRwdXQgPSBleGVjU3luYyhgZ2l0ICR7YXJnc31gLCB7XG4gICAgICBjd2Q6IHJlcG9zaXRvcnlEaXIsXG4gICAgICBtYXhCdWZmZXI6IE1BWEJVRkZFUixcbiAgICB9KVxuICAgICAgLnRvU3RyaW5nKClcbiAgICAgIC50cmltKClcbiAgICBpZiAodmVyYm9zZSkgY29uc29sZS5sb2cob3V0cHV0KVxuICAgIHJldHVybiBvdXRwdXRcbiAgfSBjYXRjaCAoY2hpbGRQcm9jZXNzKSB7XG4gICAgZm9yIChjb25zdCBvdXRwdXQgb2YgW1wic3Rkb3V0XCIsIFwic3RkZXJyXCJdKVxuICAgICAgY29uc29sZS5lcnJvcihgJHtvdXRwdXR9OiAkeyhjaGlsZFByb2Nlc3MgYXMgYW55KVtvdXRwdXRdfWApXG4gICAgdGhyb3cgY2hpbGRQcm9jZXNzXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRlc3QoXG4gIHJlcG9zaXRvcnlEaXI6IHN0cmluZyxcbiAgYXJnczogc3RyaW5nLFxuICB2ZXJib3NlPzogYm9vbGVhbixcbik6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGlmICh2ZXJib3NlKSBjb25zb2xlLmxvZyhgZ2l0IC1DICR7cmVwb3NpdG9yeURpcn0gJHthcmdzfWApXG4gICAgY29uc3Qgb3V0cHV0ID0gZXhlY1N5bmMoYGdpdCAke2FyZ3N9YCwge1xuICAgICAgY3dkOiByZXBvc2l0b3J5RGlyLFxuICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcInBpcGVcIiwgXCJwaXBlXCJdLFxuICAgICAgbWF4QnVmZmVyOiBNQVhCVUZGRVIsXG4gICAgfSlcbiAgICAgIC50b1N0cmluZygpXG4gICAgICAudHJpbSgpXG4gICAgaWYgKHZlcmJvc2UpIGNvbnNvbGUubG9nKG91dHB1dClcbiAgICByZXR1cm4gdHJ1ZVxuICB9IGNhdGNoIChjaGlsZFByb2Nlc3MpIHtcbiAgICBpZiAoKGNoaWxkUHJvY2VzcyBhcyBhbnkpLnN0YXR1cyAhPSAwKSByZXR1cm4gZmFsc2VcbiAgICB0aHJvdyBjaGlsZFByb2Nlc3NcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdWlkQnJhbmNoVXBkYXRlKFxuICByZXBvc2l0b3J5RGlyOiBzdHJpbmcsXG4gIHN1YmRpcmVjdG9yaWVzOiBhbnksXG4gIG5vdEhhcmQ6IGJvb2xlYW4sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgcHJldmlvdXNCcmFuY2ggPSBydW4ocmVwb3NpdG9yeURpciwgXCJyZXYtcGFyc2UgLS1hYmJyZXYtcmVmIEhFQURcIilcbiAgY29uc3QgYnJhbmNoID0gXCJ1aWRcIlxuICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpXG4gIHByb2Nlc3MuY2hkaXIocmVwb3NpdG9yeURpcilcbiAgZm9yIChjb25zdCBzdWJkaXJlY3Rvcnkgb2Ygc3ViZGlyZWN0b3JpZXMpIHtcbiAgICBjb25zdCB1aWREaXJlY3RvcnkgPSBgJHtzdWJkaXJlY3Rvcnl9L3VpZGBcbiAgICBmcy5lbnN1cmVEaXJTeW5jKHVpZERpcmVjdG9yeSlcbiAgICBmb3IgKGNvbnN0IHBhdGhuYW1lIG9mIGdldEZpbGVzKFtgJHtzdWJkaXJlY3Rvcnl9LyoqLyouanNvbmBdKSkge1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSBwYXRoLmJhc2VuYW1lKHBhdGhuYW1lKVxuICAgICAgZnMucmVuYW1lU3luYyhwYXRobmFtZSwgYCR7dWlkRGlyZWN0b3J5fS8ke2ZpbGVuYW1lfWApXG4gICAgfVxuICB9XG4gIHByb2Nlc3MuY2hkaXIoY3dkKVxuICBpZiAodGVzdChyZXBvc2l0b3J5RGlyLCBgcmV2LXBhcnNlIHJlbW90ZXMvb3JpZ2luLyR7YnJhbmNofWApKSB7XG4gICAgLy8gaWYgYSByZW1vdGUgYnJhbmNoIGV4aXN0cywgaXQgbXVzdCBiZSB1c2VkIGV2ZW4gaWYgYSBsb2NhbCBicmFuY2ggZXhpc3RzXG4gICAgcnVuKHJlcG9zaXRvcnlEaXIsIGBicmFuY2ggLS1mb3JjZSAke2JyYW5jaH0gb3JpZ2luLyR7YnJhbmNofWApXG4gICAgcnVuKHJlcG9zaXRvcnlEaXIsIGBzeW1ib2xpYy1yZWYgSEVBRCByZWZzL2hlYWRzLyR7YnJhbmNofWApXG4gICAgcnVuKHJlcG9zaXRvcnlEaXIsIFwicmVzZXRcIilcbiAgfSBlbHNlIGlmICh0ZXN0KHJlcG9zaXRvcnlEaXIsIGByZXYtcGFyc2UgcmVmcy9oZWFkcy8ke2JyYW5jaH1gKSkge1xuICAgIC8vIGlmIG5vIHJlbW90ZSBicmFuY2ggZXhpc3RzIGJ1dCBhIGxvY2FsIG9uZSBleGlzdHMsIHVzZSBpdFxuICAgIHJ1bihyZXBvc2l0b3J5RGlyLCBgc3ltYm9saWMtcmVmIEhFQUQgcmVmcy9oZWFkcy8ke2JyYW5jaH1gKVxuICAgIHJ1bihyZXBvc2l0b3J5RGlyLCBcInJlc2V0XCIpXG4gIH0gZWxzZSB7XG4gICAgLy8gaWYgdGhlcmUgYXJlIG5vIHJlbW90ZSBvciBsb2NhbCBicmFuY2hlcywgY3JlYXRlIGEgbmV3IG9uZVxuICAgIHJ1bihyZXBvc2l0b3J5RGlyLCBgYnJhbmNoIC0tZm9yY2UgJHticmFuY2h9IG1hc3RlcmApXG4gICAgcnVuKHJlcG9zaXRvcnlEaXIsIGBzeW1ib2xpYy1yZWYgSEVBRCByZWZzL2hlYWRzLyR7YnJhbmNofWApXG4gICAgcnVuKHJlcG9zaXRvcnlEaXIsIFwicmVzZXRcIilcbiAgICBydW4ocmVwb3NpdG9yeURpciwgXCJybSAtciAuXCIpXG4gIH1cbiAgZm9yIChjb25zdCBzdWJkaXJlY3Rvcnkgb2Ygc3ViZGlyZWN0b3JpZXMpIHtcbiAgICBjb25zdCB1aWREaXJlY3RvcnkgPSBgJHtzdWJkaXJlY3Rvcnl9L3VpZGBcbiAgICBydW4ocmVwb3NpdG9yeURpciwgYGFkZCAke3VpZERpcmVjdG9yeX1gKVxuICB9XG4gIGxldCBzdGF0dXMgPSBmYWxzZVxuICBpZiAoIXRlc3QocmVwb3NpdG9yeURpciwgXCJkaWZmIC0tcXVpZXQgLS1jYWNoZWRcIikpIHtcbiAgICBydW4ocmVwb3NpdG9yeURpciwgYGNvbW1pdCAtbSAnVXBkYXRlJ2ApXG4gICAgc3RhdHVzID0gdHJ1ZVxuICB9XG4gIHJ1bihyZXBvc2l0b3J5RGlyLCBgc3ltYm9saWMtcmVmIEhFQUQgcmVmcy9oZWFkcy8ke3ByZXZpb3VzQnJhbmNofWApXG4gIGNvbnN0IHJlc2V0T3B0aW9uID0gbm90SGFyZCA/IFwiXCIgOiBcIi0taGFyZFwiXG4gIHJ1bihyZXBvc2l0b3J5RGlyLCBgcmVzZXQgJHtyZXNldE9wdGlvbn1gKVxuICByZXR1cm4gc3RhdHVzXG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLElBQUksTUFBTSxNQUFNO0FBQ3ZCLE9BQU9DLEVBQUUsTUFBTSxVQUFVO0FBQUEsU0FDaEJDLFFBQVE7QUFDakIsU0FBdUJDLFFBQVEsUUFBUSxlQUFlO0FBRXRELE1BQU1DLFNBQVMsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUk7QUFFbEMsT0FBTyxTQUFTQyxNQUFNQSxDQUFDQyxhQUFxQixFQUFFQyxPQUFlLEVBQVc7RUFDdEVKLFFBQVEsQ0FBQyxXQUFXLEVBQUU7SUFDcEJLLEdBQUcsRUFBRUYsYUFBYTtJQUNsQkcsR0FBRyxFQUFFQyxPQUFPLENBQUNELEdBQUc7SUFDaEJFLFFBQVEsRUFBRSxPQUFPO0lBQ2pCQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQztJQUNuQ0MsU0FBUyxFQUFFVDtFQUNiLENBQUMsQ0FBQztFQUNGLElBQUk7SUFDRkQsUUFBUSxDQUFDLGtCQUFrQkksT0FBTyxXQUFXLEVBQUU7TUFDN0NDLEdBQUcsRUFBRUYsYUFBYTtNQUNsQkcsR0FBRyxFQUFFQyxPQUFPLENBQUNELEdBQUc7TUFDaEJFLFFBQVEsRUFBRSxPQUFPO01BQ2pCQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU07SUFDbEMsQ0FBQyxDQUFDO0lBQ0YsT0FBTyxJQUFJO0VBQ2IsQ0FBQyxDQUFDLE9BQU9FLFlBQVksRUFBRTtJQUNyQixJQUNHQSxZQUFZLENBQWtCQyxNQUFNLEtBQUssSUFBSSxJQUM5QyxDQUFDLG1CQUFtQixDQUFDQyxJQUFJLENBQUVGLFlBQVksQ0FBU0MsTUFBTSxDQUFDLEVBQ3ZEO01BQ0FFLE9BQU8sQ0FBQ0MsS0FBSyxDQUFFSixZQUFZLENBQVNLLE1BQU0sQ0FBQztNQUMzQyxNQUFNTCxZQUFZO0lBQ3BCO0lBQ0EsT0FBTyxLQUFLO0VBQ2Q7QUFDRjtBQUVBLE9BQU8sU0FBU00sYUFBYUEsQ0FDM0JkLGFBQXFCLEVBQ3JCQyxPQUFlLEVBQ2ZjLE9BQWtCLEVBQ1Y7RUFDUixJQUFJQyxRQUFRLEdBQUcsQ0FBQztFQUNoQixJQUFJakIsTUFBTSxDQUFDQyxhQUFhLEVBQUVDLE9BQU8sQ0FBQyxFQUFFO0lBQ2xDLEtBQUssTUFBTWdCLE1BQU0sSUFBSUYsT0FBTyxJQUFJLEVBQUUsRUFBRTtNQUNsQyxJQUFJO1FBQ0ZsQixRQUFRLENBQUMsWUFBWW9CLE1BQU0sU0FBUyxFQUFFO1VBQ3BDZixHQUFHLEVBQUVGLGFBQWE7VUFDbEJHLEdBQUcsRUFBRUMsT0FBTyxDQUFDRCxHQUFHO1VBQ2hCRSxRQUFRLEVBQUUsT0FBTztVQUNqQkMsS0FBSyxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNO1FBQ3BDLENBQUMsQ0FBQztNQUNKLENBQUMsQ0FBQyxPQUFPRSxZQUFZLEVBQUU7UUFDckI7UUFDQUcsT0FBTyxDQUFDQyxLQUFLLENBQUVKLFlBQVksQ0FBU0ssTUFBTSxDQUFDO1FBQzNDRyxRQUFRLEdBQUlSLFlBQVksQ0FBU1UsTUFBTTtNQUN6QztJQUNGO0VBQ0YsQ0FBQyxNQUFNO0lBQ0w7SUFDQUYsUUFBUSxHQUFHLEVBQUU7RUFDZjtFQUNBLE9BQU9BLFFBQVE7QUFDakI7QUFFQSxPQUFPLFNBQVNHLFlBQVlBLENBQUNDLE1BQWMsRUFBVztFQUNwRHZCLFFBQVEsQ0FBQyxnQ0FBZ0MsRUFBRTtJQUN6Q0ssR0FBRyxFQUFFa0IsTUFBTTtJQUNYakIsR0FBRyxFQUFFQyxPQUFPLENBQUNELEdBQUc7SUFDaEJFLFFBQVEsRUFBRSxPQUFPO0lBQ2pCQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU07RUFDcEMsQ0FBQyxDQUFDO0VBRUZULFFBQVEsQ0FBQyxtQkFBbUIsRUFBRTtJQUM1QkssR0FBRyxFQUFFa0IsTUFBTTtJQUNYakIsR0FBRyxFQUFFQyxPQUFPLENBQUNELEdBQUc7SUFDaEJFLFFBQVEsRUFBRSxPQUFPO0lBQ2pCQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU07RUFDcEMsQ0FBQyxDQUFDO0VBRUYsT0FBTyxJQUFJO0FBQ2I7QUFFQSxPQUFPLFNBQVNlLEtBQUtBLENBQ25CQyxXQUErQixFQUMvQkMsT0FBZSxFQUNmQyxVQUFrQixFQUNaO0VBQ04sSUFBSUYsV0FBVyxLQUFLRyxTQUFTLEVBQUU7SUFDN0I1QixRQUFRLENBQUMsYUFBYXlCLFdBQVcsSUFBSUMsT0FBTyxNQUFNLEVBQUU7TUFDbERyQixHQUFHLEVBQUVzQixVQUFVO01BQ2ZyQixHQUFHLEVBQUVDLE9BQU8sQ0FBQ0QsR0FBRztNQUNoQkUsUUFBUSxFQUFFLE9BQU87TUFDakJDLEtBQUssRUFBRSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTTtJQUNwQyxDQUFDLENBQUM7RUFDSjtBQUNGO0FBRUEsT0FBTyxTQUFTb0IsR0FBR0EsQ0FDakIxQixhQUFxQixFQUNyQjJCLElBQVksRUFDWkMsT0FBaUIsRUFDVDtFQUNSLElBQUk7SUFDRixJQUFJQSxPQUFPLEVBQUVqQixPQUFPLENBQUNrQixHQUFHLENBQUMsVUFBVTdCLGFBQWEsSUFBSTJCLElBQUksRUFBRSxDQUFDO0lBQzNELE1BQU1kLE1BQU0sR0FBR2hCLFFBQVEsQ0FBQyxPQUFPOEIsSUFBSSxFQUFFLEVBQUU7TUFDckN6QixHQUFHLEVBQUVGLGFBQWE7TUFDbEJPLFNBQVMsRUFBRVQ7SUFDYixDQUFDLENBQUMsQ0FDQ2dDLFFBQVEsQ0FBQyxDQUFDLENBQ1ZDLElBQUksQ0FBQyxDQUFDO0lBQ1QsSUFBSUgsT0FBTyxFQUFFakIsT0FBTyxDQUFDa0IsR0FBRyxDQUFDaEIsTUFBTSxDQUFDO0lBQ2hDLE9BQU9BLE1BQU07RUFDZixDQUFDLENBQUMsT0FBT0wsWUFBWSxFQUFFO0lBQ3JCLEtBQUssTUFBTUssTUFBTSxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxFQUN2Q0YsT0FBTyxDQUFDQyxLQUFLLENBQUMsR0FBR0MsTUFBTSxLQUFNTCxZQUFZLENBQVNLLE1BQU0sQ0FBQyxFQUFFLENBQUM7SUFDOUQsTUFBTUwsWUFBWTtFQUNwQjtBQUNGO0FBRUEsT0FBTyxTQUFTRSxJQUFJQSxDQUNsQlYsYUFBcUIsRUFDckIyQixJQUFZLEVBQ1pDLE9BQWlCLEVBQ1I7RUFDVCxJQUFJO0lBQ0YsSUFBSUEsT0FBTyxFQUFFakIsT0FBTyxDQUFDa0IsR0FBRyxDQUFDLFVBQVU3QixhQUFhLElBQUkyQixJQUFJLEVBQUUsQ0FBQztJQUMzRCxNQUFNZCxNQUFNLEdBQUdoQixRQUFRLENBQUMsT0FBTzhCLElBQUksRUFBRSxFQUFFO01BQ3JDekIsR0FBRyxFQUFFRixhQUFhO01BQ2xCTSxLQUFLLEVBQUUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQztNQUNqQ0MsU0FBUyxFQUFFVDtJQUNiLENBQUMsQ0FBQyxDQUNDZ0MsUUFBUSxDQUFDLENBQUMsQ0FDVkMsSUFBSSxDQUFDLENBQUM7SUFDVCxJQUFJSCxPQUFPLEVBQUVqQixPQUFPLENBQUNrQixHQUFHLENBQUNoQixNQUFNLENBQUM7SUFDaEMsT0FBTyxJQUFJO0VBQ2IsQ0FBQyxDQUFDLE9BQU9MLFlBQVksRUFBRTtJQUNyQixJQUFLQSxZQUFZLENBQVNVLE1BQU0sSUFBSSxDQUFDLEVBQUUsT0FBTyxLQUFLO0lBQ25ELE1BQU1WLFlBQVk7RUFDcEI7QUFDRjtBQUVBLE9BQU8sU0FBU3dCLGVBQWVBLENBQzdCaEMsYUFBcUIsRUFDckJpQyxjQUFtQixFQUNuQkMsT0FBZ0IsRUFDUDtFQUNULE1BQU1DLGNBQWMsR0FBR1QsR0FBRyxDQUFDMUIsYUFBYSxFQUFFLDZCQUE2QixDQUFDO0VBQ3hFLE1BQU1vQyxNQUFNLEdBQUcsS0FBSztFQUNwQixNQUFNbEMsR0FBRyxHQUFHRSxPQUFPLENBQUNGLEdBQUcsQ0FBQyxDQUFDO0VBQ3pCRSxPQUFPLENBQUNpQyxLQUFLLENBQUNyQyxhQUFhLENBQUM7RUFDNUIsS0FBSyxNQUFNc0MsWUFBWSxJQUFJTCxjQUFjLEVBQUU7SUFDekMsTUFBTU0sWUFBWSxHQUFHLEdBQUdELFlBQVksTUFBTTtJQUMxQzNDLEVBQUUsQ0FBQzZDLGFBQWEsQ0FBQ0QsWUFBWSxDQUFDO0lBQzlCLEtBQUssTUFBTUUsUUFBUSxJQUFJN0MsUUFBUSxDQUFDLENBQUMsR0FBRzBDLFlBQVksWUFBWSxDQUFDLENBQUMsRUFBRTtNQUM5RCxNQUFNSSxRQUFRLEdBQUdoRCxJQUFJLENBQUNpRCxRQUFRLENBQUNGLFFBQVEsQ0FBQztNQUN4QzlDLEVBQUUsQ0FBQ2lELFVBQVUsQ0FBQ0gsUUFBUSxFQUFFLEdBQUdGLFlBQVksSUFBSUcsUUFBUSxFQUFFLENBQUM7SUFDeEQ7RUFDRjtFQUNBdEMsT0FBTyxDQUFDaUMsS0FBSyxDQUFDbkMsR0FBRyxDQUFDO0VBQ2xCLElBQUlRLElBQUksQ0FBQ1YsYUFBYSxFQUFFLDRCQUE0Qm9DLE1BQU0sRUFBRSxDQUFDLEVBQUU7SUFDN0Q7SUFDQVYsR0FBRyxDQUFDMUIsYUFBYSxFQUFFLGtCQUFrQm9DLE1BQU0sV0FBV0EsTUFBTSxFQUFFLENBQUM7SUFDL0RWLEdBQUcsQ0FBQzFCLGFBQWEsRUFBRSxnQ0FBZ0NvQyxNQUFNLEVBQUUsQ0FBQztJQUM1RFYsR0FBRyxDQUFDMUIsYUFBYSxFQUFFLE9BQU8sQ0FBQztFQUM3QixDQUFDLE1BQU0sSUFBSVUsSUFBSSxDQUFDVixhQUFhLEVBQUUsd0JBQXdCb0MsTUFBTSxFQUFFLENBQUMsRUFBRTtJQUNoRTtJQUNBVixHQUFHLENBQUMxQixhQUFhLEVBQUUsZ0NBQWdDb0MsTUFBTSxFQUFFLENBQUM7SUFDNURWLEdBQUcsQ0FBQzFCLGFBQWEsRUFBRSxPQUFPLENBQUM7RUFDN0IsQ0FBQyxNQUFNO0lBQ0w7SUFDQTBCLEdBQUcsQ0FBQzFCLGFBQWEsRUFBRSxrQkFBa0JvQyxNQUFNLFNBQVMsQ0FBQztJQUNyRFYsR0FBRyxDQUFDMUIsYUFBYSxFQUFFLGdDQUFnQ29DLE1BQU0sRUFBRSxDQUFDO0lBQzVEVixHQUFHLENBQUMxQixhQUFhLEVBQUUsT0FBTyxDQUFDO0lBQzNCMEIsR0FBRyxDQUFDMUIsYUFBYSxFQUFFLFNBQVMsQ0FBQztFQUMvQjtFQUNBLEtBQUssTUFBTXNDLFlBQVksSUFBSUwsY0FBYyxFQUFFO0lBQ3pDLE1BQU1NLFlBQVksR0FBRyxHQUFHRCxZQUFZLE1BQU07SUFDMUNaLEdBQUcsQ0FBQzFCLGFBQWEsRUFBRSxPQUFPdUMsWUFBWSxFQUFFLENBQUM7RUFDM0M7RUFDQSxJQUFJckIsTUFBTSxHQUFHLEtBQUs7RUFDbEIsSUFBSSxDQUFDUixJQUFJLENBQUNWLGFBQWEsRUFBRSx1QkFBdUIsQ0FBQyxFQUFFO0lBQ2pEMEIsR0FBRyxDQUFDMUIsYUFBYSxFQUFFLG9CQUFvQixDQUFDO0lBQ3hDa0IsTUFBTSxHQUFHLElBQUk7RUFDZjtFQUNBUSxHQUFHLENBQUMxQixhQUFhLEVBQUUsZ0NBQWdDbUMsY0FBYyxFQUFFLENBQUM7RUFDcEUsTUFBTVUsV0FBVyxHQUFHWCxPQUFPLEdBQUcsRUFBRSxHQUFHLFFBQVE7RUFDM0NSLEdBQUcsQ0FBQzFCLGFBQWEsRUFBRSxTQUFTNkMsV0FBVyxFQUFFLENBQUM7RUFDMUMsT0FBTzNCLE1BQU07QUFDZiIsImlnbm9yZUxpc3QiOltdfQ==