@firestartr/cli 0.1.10 â 0.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/index.js +534 -191
- package/build/provisioner/dist-cdktf/index.js +34 -2
- package/build/provisioner/dist-cdktf/index.js.map +1 -1
- package/build/provisioner/dist-cdktf/src/handlers/index.d.ts +1 -1
- package/build/provisioner/dist-cdktf/tsconfig.cdktf.tsbuildinfo +1 -1
- package/package.json +1 -1
package/build/index.js
CHANGED
|
@@ -232157,6 +232157,10 @@ exports["default"] = {
|
|
|
232157
232157
|
{
|
|
232158
232158
|
"type": "object",
|
|
232159
232159
|
"properties": {
|
|
232160
|
+
"policy": {
|
|
232161
|
+
"type": "string",
|
|
232162
|
+
"enum": ["apply", "create-only", "create-update-only", "full-control", "observe", "observe-only"]
|
|
232163
|
+
},
|
|
232160
232164
|
"name": {
|
|
232161
232165
|
"type": "string",
|
|
232162
232166
|
},
|
|
@@ -232211,7 +232215,7 @@ exports["default"] = {
|
|
|
232211
232215
|
}
|
|
232212
232216
|
}
|
|
232213
232217
|
};
|
|
232214
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
232218
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVycmFmb3JtLnNjaGVtYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jbGFpbXMvdGZ3b3Jrc3BhY2VzL3RlcnJhZm9ybS5zY2hlbWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxrQkFBZTtJQUVYLFNBQVMsRUFBRSx5Q0FBeUM7SUFFcEQsS0FBSyxFQUFFLG1CQUFtQjtJQUUxQixhQUFhLEVBQUU7UUFFYixtQkFBbUIsRUFBRTtZQUVuQixLQUFLLEVBQUUsOENBQThDO1lBRXJELE1BQU0sRUFBRSxRQUFRO1lBRWhCLGFBQWEsRUFBRSx1QkFBdUI7WUFFdEMsT0FBTyxFQUFFO2dCQUVQLEVBQUMsTUFBTSxFQUFFLCtDQUErQyxFQUFDO2dCQUV6RDtvQkFDRSxNQUFNLEVBQUUsUUFBUTtvQkFFaEIsWUFBWSxFQUFFO3dCQUVaLFFBQVEsRUFBRTs0QkFFUixNQUFNLEVBQUUsUUFBUTs0QkFFaEIsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLGNBQWMsQ0FBQzt5QkFFbEc7d0JBRUQsTUFBTSxFQUFFOzRCQUVOLE1BQU0sRUFBRSxRQUFRO3lCQUNqQjt3QkFFRCxRQUFRLEVBQUU7NEJBRVIsTUFBTSxFQUFFLFFBQVE7NEJBRWhCLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQzt5QkFFakQ7d0JBRUQsY0FBYyxFQUFFOzRCQUVkLE1BQU0sRUFBRSxRQUFROzRCQUVoQixhQUFhLEVBQUUsZ0RBQWdEO3lCQUVoRTt3QkFFRCxRQUFRLEVBQUM7NEJBRVAsTUFBTSxFQUFFLFFBQVE7NEJBRWhCLFlBQVksRUFBRSxFQUFFOzRCQUVoQixzQkFBc0IsRUFBRSxJQUFJO3lCQUU3Qjt3QkFFRCxRQUFRLEVBQUU7NEJBRVIsTUFBTSxFQUFFLFFBQVE7eUJBRWpCO3dCQUVELFNBQVMsRUFBRTs0QkFFVCxNQUFNLEVBQUUsUUFBUTs0QkFFaEIsWUFBWSxFQUFFO2dDQUVaLFdBQVcsRUFBRTtvQ0FFWCxNQUFNLEVBQUUsT0FBTztvQ0FFZixPQUFPLEVBQUU7d0NBRVAsTUFBTSxFQUFFLFFBQVE7d0NBRWhCLFlBQVksRUFBRTs0Q0FFWixNQUFNLEVBQUU7Z0RBRU4sTUFBTSxFQUFFLFFBQVE7NkNBQ2pCO3lDQUVGO3dDQUVELHNCQUFzQixFQUFFLEtBQUs7cUNBRTlCO2lDQUVGO2dDQUVELFNBQVMsRUFBRTtvQ0FFVCxNQUFNLEVBQUUsUUFBUTtvQ0FFaEIsWUFBWSxFQUFFO3dDQUVaLE1BQU0sRUFBRTs0Q0FFTixNQUFNLEVBQUUsUUFBUTt5Q0FDakI7cUNBRUY7b0NBRUQsc0JBQXNCLEVBQUUsS0FBSztpQ0FDOUI7NkJBRUY7NEJBRUQsVUFBVSxFQUFFLENBQUMsV0FBVyxDQUFDOzRCQUV6QixzQkFBc0IsRUFBRSxLQUFLO3lCQUU5QjtxQkFFRjtvQkFFRCxVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUM7aUJBRXBEO2FBRUY7U0FFRjtLQUNGO0NBQ0osQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IHtcblxuICAgIFwiJHNjaGVtYVwiOiBcImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDcvc2NoZW1hI1wiLFxuXG4gICAgXCIkaWRcIjogXCJUZXJyYWZvcm1Qcm92aWRlclwiLFxuXG4gICAgXCJkZWZpbml0aW9uc1wiOiB7XG5cbiAgICAgIFwiVGVycmFmb3JtUHJvdmlkZXJcIjoge1xuXG4gICAgICAgIFwiJGlkXCI6IFwiZmlyZXN0YXJ0ci5kZXY6Ly90ZXJyYWZvcm0vVGVycmFmb3JtUHJvdmlkZXJcIixcblxuICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcblxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiQSB0ZXJyYWZvcm0gd29ya3NwYWNlXCIsXG5cbiAgICAgICAgXCJhbGxPZlwiOiBbXG5cbiAgICAgICAgICB7XCIkcmVmXCI6IFwiZmlyZXN0YXJ0ci5kZXY6Ly9jb21tb24vQ2xhaW1Qcm92aWRlckVudmVsb3BlXCJ9LFxuXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXG5cbiAgICAgICAgICAgIFwicHJvcGVydGllc1wiOiB7XG5cbiAgICAgICAgICAgICAgXCJwb2xpY3lcIjoge1xuXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXG5cbiAgICAgICAgICAgICAgICBcImVudW1cIjogW1wiYXBwbHlcIiwgXCJjcmVhdGUtb25seVwiLCBcImNyZWF0ZS11cGRhdGUtb25seVwiLCBcImZ1bGwtY29udHJvbFwiLCBcIm9ic2VydmVcIiwgXCJvYnNlcnZlLW9ubHlcIl1cblxuICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgIFwibmFtZVwiOiB7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgIFwic291cmNlXCI6IHtcblxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxuXG4gICAgICAgICAgICAgICAgXCJlbnVtXCI6IFtcInJlbW90ZVwiLCBcImlubGluZVwiLCBcIlJlbW90ZVwiLCBcIklubGluZVwiXVxuXG4gICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgXCJ2YWx1ZXNTY2hlbWFcIjoge1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcblxuICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJhIGxvY2F0b3IgZm9yIGEganNvbiBzY2hlbWEgdG8gdmFsaWRhdGUgdmFsdWVzXCJcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgXCJ2YWx1ZXNcIjp7XG5cbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcblxuICAgICAgICAgICAgICAgIFwicHJvcGVydGllc1wiOiB7fSxcblxuICAgICAgICAgICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogdHJ1ZVxuXG4gICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgXCJtb2R1bGVcIjoge1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICBcImNvbnRleHRcIjoge1xuXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXG5cbiAgICAgICAgICAgICAgICBcInByb3BlcnRpZXNcIjoge1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgXCJwcm92aWRlcnNcIjoge1xuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImFycmF5XCIsXG5cbiAgICAgICAgICAgICAgICAgICAgXCJpdGVtc1wiOiB7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxuXG4gICAgICAgICAgICAgICAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgICBcImJhY2tlbmRcIjoge1xuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxuXG4gICAgICAgICAgICAgICAgICAgIFwicHJvcGVydGllc1wiOiB7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllc1wiOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBcInJlcXVpcmVkXCI6IFtcInByb3ZpZGVyc1wiXSxcblxuICAgICAgICAgICAgICAgIFwiYWRkaXRpb25hbFByb3BlcnRpZXNcIjogZmFsc2VcblxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIFwicmVxdWlyZWRcIjogW1widmFsdWVzXCIsIFwiY29udGV4dFwiLCBcInNvdXJjZVwiLCBcIm5hbWVcIl1cblxuICAgICAgICAgIH1cblxuICAgICAgICBdXG5cbiAgICAgIH1cbiAgICB9XG59XG4iXX0=
|
|
232215
232219
|
|
|
232216
232220
|
/***/ }),
|
|
232217
232221
|
|
|
@@ -235333,6 +235337,7 @@ const crawler_1 = __nccwpck_require__(26675);
|
|
|
235333
235337
|
const fs_1 = __importDefault(__nccwpck_require__(57147));
|
|
235334
235338
|
const path_1 = __importDefault(__nccwpck_require__(71017));
|
|
235335
235339
|
const catalog_common_1 = __importDefault(__nccwpck_require__(74100));
|
|
235340
|
+
const github_1 = __importDefault(__nccwpck_require__(39759));
|
|
235336
235341
|
const CLAIM_REF_ANNOTATION = "firestartr.dev/claim-ref";
|
|
235337
235342
|
const log = (0, debug_1.default)("firestartr:renderer");
|
|
235338
235343
|
/*
|
|
@@ -235390,7 +235395,21 @@ exports.render = render;
|
|
|
235390
235395
|
* Function called when rendering Terraform workspaces Plans
|
|
235391
235396
|
* based on the previous renderer Terraform workspaces
|
|
235392
235397
|
*/
|
|
235393
|
-
async function renderWorkspacePlans(source, destiny, prLink, sha) {
|
|
235398
|
+
async function renderWorkspacePlans(source, destiny, prLink, sha, ghCli = github_1.default) {
|
|
235399
|
+
const [orgRepo, prNumber] = prLink.split("#");
|
|
235400
|
+
const [org, repo] = orgRepo.split("/");
|
|
235401
|
+
const { data: files } = await ghCli.pulls.getPrFiles(parseInt(prNumber), repo, org);
|
|
235402
|
+
if (files && files.length > 0 && files[0].status == "removed") {
|
|
235403
|
+
const content = await ghCli.repo.getContent(files[0].filename, repo, org);
|
|
235404
|
+
const workspace = catalog_common_1.default.io.fromYaml(content);
|
|
235405
|
+
workspace.kind = "FirestartrTerraformWorkspacePlan";
|
|
235406
|
+
workspace.metadata.annotations = Object.assign(Object.assign({}, workspace.metadata.annotations), { [catalog_common_1.default.generic.getFirestartrAnnotation("pull-request-plan")]: prLink, [catalog_common_1.default.generic.getFirestartrAnnotation("plan-sha")]: sha });
|
|
235407
|
+
workspace.metadata.annotations[catalog_common_1.default.generic.getFirestartrAnnotation("policy")] = "destroy";
|
|
235408
|
+
const workspacePlan = catalog_common_1.default.io.toYaml(Object.assign({}, workspace), { quotingType: '"', lineWidth: -1 });
|
|
235409
|
+
const fileName = path_1.default.join(destiny, path_1.default.basename(files[0].filename));
|
|
235410
|
+
fs_1.default.writeFileSync(fileName, workspacePlan);
|
|
235411
|
+
return;
|
|
235412
|
+
}
|
|
235394
235413
|
// Iterate over the source folder and get the list of Terraform workspaces
|
|
235395
235414
|
await (0, crawler_1.crawl)(source, () => true, (entry, data) => {
|
|
235396
235415
|
const fileName = path_1.default.join(destiny, path_1.default.basename(entry));
|
|
@@ -235582,7 +235601,7 @@ function getPreviousCRfromClaim(claim, previousCRs) {
|
|
|
235582
235601
|
function isExcludedFromPreviousCR(crKind) {
|
|
235583
235602
|
return ["FirestartrGithubRepositoryFeature"].includes(crKind);
|
|
235584
235603
|
}
|
|
235585
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVuZGVyZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxxQ0FBa0Q7QUFDbEQsaURBQWtDO0FBQ2xDLGtEQUEwQjtBQUUxQixpQ0FBdUQ7QUFFdkQscUVBQTBFO0FBRzFFLHlEQUF1SDtBQUN2SCwrQ0FBa0Q7QUFDbEQscUNBQW1FO0FBRW5FLHdEQUFpRTtBQUNqRSx1Q0FBa0M7QUFDbEMsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUN4QixvRUFBb0M7QUFDcEMsTUFBTSxvQkFBb0IsR0FBRywwQkFBMEIsQ0FBQTtBQUd2RCxNQUFNLEdBQUcsR0FBRyxJQUFBLGVBQUssRUFBQyxxQkFBcUIsQ0FBQyxDQUFBO0FBcUN4Qzs7Ozs7Ozs7Ozs7R0FXRztBQUNJLEtBQUssVUFBVSxpQkFBaUIsQ0FFckMsWUFBMEIsRUFFMUIsTUFBVyxFQUFFLEVBRWIsbUJBQTJCLGVBQWUsRUFFMUMsY0FBc0IsaUJBQWlCO0lBSXZDLE1BQU0sWUFBWSxHQUFHLElBQUksV0FBRyxDQUFDO1FBRTNCLE1BQU0sRUFBRSxnQkFBZ0I7UUFFeEIsbUJBQW1CLEVBQUUsT0FBTztRQUU1QixjQUFjLEVBQUUsc0JBQWMsQ0FBQyxpQkFBaUI7S0FFakQsQ0FBQyxDQUFBO0lBRUYsTUFBTSxlQUFlLEdBQUcsSUFBSSxXQUFHLENBQUM7UUFFOUIsTUFBTSxFQUFFLFdBQVc7UUFFbkIsbUJBQW1CLEVBQUUsT0FBTztRQUU1QixjQUFjLEVBQUUsc0JBQWMsQ0FBQyxpQkFBaUI7S0FFakQsQ0FBQyxDQUFBO0lBRUYsTUFBTSxNQUFNLEdBQVEsTUFBTSxhQUFhLENBRXJDLFlBQVksRUFFWixlQUFlLEVBRWY7UUFDRSxZQUFZO1FBRVosR0FBRztRQUVILE9BQU8sRUFBRSxFQUFFO0tBQ1osQ0FDRixDQUFBO0lBRUQsZUFBZSxDQUFDLEtBQUssRUFBRSxD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QWEsSUFBSSxlQUFlLEVBQUM7UUFFekMsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBRTdDLElBQUcsSUFBQSw0QkFBZSxFQUFDLFVBQVUsQ0FBQztZQUFFLFNBQVE7UUFFeEMsSUFBRyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQUUsU0FBUTtRQUV0RCxJQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBQztZQUV6RixPQUFPLFVBQVUsQ0FBQTtTQUVsQjtLQUVGO0lBRUQsT0FBTyxLQUFLLENBQUE7QUFFZCxDQUFDO0FBR0QsU0FBUyx3QkFBd0IsQ0FBQyxNQUFjO0lBRzlDLE9BQU8sQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUcvRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IElSZW5hbWVSZXN1bHQsIGxvYWRBbGwgfSBmcm9tIFwiLi9sb2FkZXJcIjtcbmltcG9ydCAqIGFzIGNoYXJ0cyBmcm9tIFwiLi9jaGFydHNcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiO1xuaW1wb3J0IHsgQmFzZUNoYXJ0IH0gZnJvbSBcIi4vY2hhcnRzL2Jhc2VcIjtcbmltcG9ydCB7IEFwaU9iamVjdCwgQXBwLCBZYW1sT3V0cHV0VHlwZSB9IGZyb20gXCJjZGs4c1wiO1xuaW1wb3J0IHsgR2xvYmFsU2VjdGlvbiB9IGZyb20gXCIuL2dsb2JhbHMvYmFzZVwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVGZWF0dXJlc1BhdGNoZXMgfSBmcm9tIFwiLi9jaGFydHMvZ2l0aHViL2ZlYXR1cmVSZW5kZXJlclwiO1xuaW1wb3J0IHsgT3ZlcnJpZGVyUGF0Y2hlcyB9IGZyb20gXCIuL292ZXJyaWRlcnMvYmFzZVwiO1xuaW1wb3J0IHsgSUN1c3RvbVJlc291cmNlUGF0Y2ggfSBmcm9tIFwiLi9wYXRjaGVzXCI7XG5pbXBvcnQgeyBpc0NhdGFsb2dFbnRpdHksIHZhbGlkYXRlUmVmZXJlbnRpYWxJbnRlZ3JpdHksIHZhbGlkYXRlVGZTdGF0ZUtleVVuaXF1ZW5lc3MgfSBmcm9tIFwiLi92YWxpZGF0aW9ucy9yZWZlcmVuY2VzXCI7XG5pbXBvcnQgeyAgc2V0UmVuZGVyZWRDbGFpbSB9IGZyb20gXCIuL3JlZnJlc29sdmVyXCI7XG5pbXBvcnQgeyBBbGxvd2VkUHJvdmlkZXJzLCBnZXRDb25maWd1cmVkUHJvdmlkZXIgfSBmcm9tIFwiLi9jb25maWdcIjtcbmltcG9ydCB7IE5vcm1hbGl6ZXIgfSBmcm9tIFwiLi9ub3JtYWxpemVycy9iYXNlXCI7XG5pbXBvcnQgeyBzb3J0UmVuZGVyQ2xhaW1zQnlLaW5kIH0gZnJvbSBcIi4vcmVmc1NvcnRlci9yZWZzU29ydGVyXCI7XG5pbXBvcnQgeyBjcmF3bCB9IGZyb20gXCIuL2NyYXdsZXJcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgY29tbW9uIGZyb20gXCJjYXRhbG9nX2NvbW1vblwiO1xuY29uc3QgQ0xBSU1fUkVGX0FOTk9UQVRJT04gPSBcImZpcmVzdGFydHIuZGV2L2NsYWltLXJlZlwiXG5cblxuY29uc3QgbG9nID0gRGVidWcoXCJmaXJlc3RhcnRyOnJlbmRlcmVyXCIpXG5cbmV4cG9ydCB0eXBlIFJlbmRlckNsYWltRGF0YSA9IHtcblxuICBjbGFpbTogYW55XG5cbiAgY2xhaW1QYXRoPzogc3RyaW5nXG5cbiAgaW5pdGlhbGl6ZXJzOiBhbnkgW11cblxuICBvdmVycmlkZXM6IE92ZXJyaWRlclBhdGNoZXNbXVxuXG4gIGdsb2JhbHM6IEdsb2JhbFNlY3Rpb25bXSxcblxuICBub3JtYWxpemVyczogTm9ybWFsaXplcltdXG5cbn1cblxudHlwZSBDbGFpbUtpbmQgPSBzdHJpbmc7XG50eXBlIENsYWltTmFtZSA9IHN0cmluZztcbmV4cG9ydCB0eXBlIFJlbmRlckNsYWltS2V5ID0gYCR7Q2xhaW1LaW5kfS0ke0NsYWltTmFtZX1gXG5cbnR5cGUgQ1JLaW5kID0gc3RyaW5nO1xudHlwZSBDUk5hbWUgPSBzdHJpbmc7XG50eXBlIFJlbmRlckNSS2V5ID0gYCR7Q1JLaW5kfS0ke0NSTmFtZX1gXG5cbmV4cG9ydCB0eXBlIFJlbmRlcmVkQ3JNYXAgPSB7XG5cbiAgW2tleTogUmVuZGVyQ1JLZXldOiBBcGlPYmplY3Rcbn1cblxuZXhwb3J0IHR5cGUgUmVuZGVyQ2xhaW1zID0ge1xuXG4gIFtrZXk6IFJlbmRlckNsYWltS2V5XTogUmVuZGVyQ2xhaW1EYXRhXG5cbn1cblxuLypcbiAqIEZ1bmN0aW9uIGNhbGxlZCB3aGVuIHJlbmRlcmluZyBmcm9tIHRoZSBpbXBvcnRlciBjbGFzcy5cbiAqXG4gKiBJbnB1dDpcbiAqIC0gcmVuZGVyQ2xhaW1zOiBhIFJlbmRlckNsYWltcyBvYmplY3QsIHdoaWNoIGNvbnRhaW5zIHRoZSBsaXN0IG9mIGNsYWltc1xuICogICB3ZSB3YW50IHRvIHJlbmRlclxuICpcbiAqIFJldHVybjpcbiAqIC0gVGhlIHJlc3VsdCBvZiByZW5kZXJpbmcgdGhlIHJlbmRlckNsYWltcyBvYmplY3QsIHBsdXMgdGhlXG4gKiAgIHJlbmRlcmVkIGZpcmVzdGFydHItYWxsIGdyb3VwXG4gKlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVyRnJvbUltcG9ydHMoXG5cbiAgcmVuZGVyQ2xhaW1zOiBSZW5kZXJDbGFpbXMsXG5cbiAgY3JzOiBhbnkgPSB7fSxcblxuICBjYXRhbG9nT3V0cHV0RGlyOiBzdHJpbmcgPSBcIi90bXAvLmNhdGFsb2dcIixcblxuICBjck91dHB1dERpcjogc3RyaW5nID0gXCIvdG1wLy5yZXNvdXJjZXNcIixcblxuKSB7XG5cbiAgY29uc3QgY2F0YWxvZ1Njb3BlID0gbmV3IEFwcCh7XG5cbiAgICBvdXRkaXI6IGNhdGFsb2dPdXRwdXREaXIsXG5cbiAgICBvdXRwdXRGaWxlRXh0ZW5zaW9uOiBcIi55YW1sXCIsXG5cbiAgICB5YW1sT3V0cHV0VHlwZTogWWFtbE91dHB1dFR5cGUuRklMRV9QRVJfUkVTT1VSQ0UsXG5cbiAgfSlcblxuICBjb25zdCBmaXJlc3RhcnRyU2NvcGUgPSBuZXcgQXBwKHtcblxuICAgIG91dGRpcjogY3JPdXRwdXREaXIsXG5cbiAgICBvdXRwdXRGaWxlRXh0ZW5zaW9uOiBcIi55YW1sXCIsXG5cbiAgICB5YW1sT3V0cHV0VHlwZTogWWFtbE91dHB1dFR5cGUuRklMRV9QRVJfUkVTT1VSQ0UsXG5cbiAgfSlcblxuICBjb25zdCByZXN1bHQ6IGFueSA9IGF3YWl0IGZSZW5kZXJDbGFpbXMoXG5cbiAgICBjYXRhbG9nU2NvcGUsXG5cbiAgICBmaXJlc3RhcnRyU2NvcGUsXG5cbiAgICB7XG4gICAgICByZW5kZXJDbGFpbXMsXG5cbiAgICAgIGNycyxcblxuICAgICAgcmVuYW1lczogW11cbiAgICB9LFxuICApXG5cbiAgZmlyZXN0YXJ0clNjb3BlLnN5bnRoKClcblxuICByZXR1cm4gcmVzdWx0XG5cbn1cblxuXG4vKlxuICogRnVuY3Rpb24gY2FsbGVkIHdoZW4gcmVuZGVyaW5nIGJ1dCBub3QgaW1wb3J0aW5nXG4gKlxuICogSW5wdXQ6XG4gKiAtIHNjb3BlOiBhbiBvYmplY3QsIHVzZWQgdG8gcmVwcmVzZW50IENES1RGJ3MgZXhlY3V0aW9uIHNjb3BlXG4gKlxuICogUmV0dXJuOlxuICogLSBUaGUgcmVzdWx0IG9mIHJlbmRlcmluZyB0aGUgcmVuZGVyQ2xhaW1zIG9iamVjdCwgcGx1cyB0aGVcbiAqICAgcmVuZGVyZWQgZmlyZXN0YXJ0ci1hbGwgZ3JvdXBcbiAqXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5kZXIoXG5cbiAgY2F0YWxvZ1Njb3BlOiBDb25zdHJ1Y3QsXG5cbiAgZmlyZXN0YXJ0clNjb3BlOiBDb25zdHJ1Y3QsXG5cbiAgKTogUHJvbWlzZTxSZW5kZXJlZENyTWFwPiB7XG5cbiAgY29uc3QgZGF0YToge1xuXG4gICAgcmVuZGVyQ2xhaW1zOiBSZW5kZXJDbGFpbXMsXG5cbiAgICBjcnM6IGFueSxcblxuICAgIHJlbmFtZXM/OiBJUmVuYW1lUmVzdWx0W11cblxuICB9ID0gYXdhaXQgbG9hZEFsbCgpXG5cbiAgY29uc3QgcmVzdWx0OiBhbnkgPSBhd2FpdCBmUmVuZGVyQ2xhaW1zKGNhdGFsb2dTY29wZSwgZmlyZXN0YXJ0clNjb3BlLCBkYXRhKVxuXG4gIHZhbGlkYXRlUmVmZXJlbnRpYWxJbnRlZ3JpdHkocmVzdWx0KVxuXG4gIHZhbGlkYXRlVGZTdGF0ZUtleVVuaXF1ZW5lc3MocmVzdWx0KVxuXG4gIHJldHVybiByZXN1bHRcblxufVxuXG4vKlxuICogRnVuY3Rpb24gY2FsbGVkIHdoZW4gcmVuZGVyaW5nIFRlcnJhZm9ybSB3b3Jrc3BhY2VzIFBsYW5zXG4gKiBiYXNlZCBvbiB0aGUgcHJldmlvdXMgcmVuZGVyZXIgVGVycmFmb3JtIHdvcmtzcGFjZXNcbiovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVyV29ya3NwYWNlUGxhbnMoc291cmNlOiBzdHJpbmcsIGRlc3Rpbnk6IHN0cmluZywgcHJMaW5rOiBzdHJpbmcsIHNoYTogc3RyaW5nKSB7XG5cbiAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBzb3VyY2UgZm9sZGVyIGFuZCBnZXQgdGhlIGxpc3Qgb2YgVGVycmFmb3JtIHdvcmtzcGFjZXNcblxuICBhd2FpdCBjcmF3bChzb3VyY2UsICgpID0+IHRydWUsIChlbnRyeTogc3RyaW5nLCBkYXRhOiBhbnkpID0+IHtcblxuICAgIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5qb2luKGRlc3RpbnksIHBhdGguYmFzZW5hbWUoZW50cnkpKVxuXG4gICAgY29uc3Qgd29ya3NwYWNlOiBhbnkgPSBjb21tb24uaW8uZnJvbVlhbWwoZGF0YSlcblxuICAgIHdvcmtzcGFjZS5raW5kID0gXCJGaXJlc3RhcnRyVGVycmFmb3JtV29ya3NwYWNlUGxhblwiXG4gICAgd29ya3NwYWNlLm1ldGFkYXRhLmFubm90YXRpb25zID0ge1xuICAgICAgLi4ud29ya3NwYWNlLm1ldGFkYXRhLmFubm90YXRpb25zLFxuICAgICAgW2NvbW1vbi5nZW5lcmljLmdldEZpcmVzdGFydHJBbm5vdGF0aW9uKFwicHVsbC1yZXF1ZXN0LXBsYW5cIildOiBwckxpbmssXG4gICAgICBbY29tbW9uLmdlbmVyaWMuZ2V0RmlyZXN0YXJ0ckFubm90YXRpb24oXCJwbGFuLXNoYVwiKV06IHNoYVxuICAgIH1cblxuICAgIGNvbnN0IHdvcmtzcGFjZVBsYW4gPSBjb21tb24uaW8udG9ZYW1sKHtcbiAgICAgIC4uLndvcmtzcGFjZVxuICAgIH0sIHsgcXVvdGluZ1R5cGU6ICdcIicsIGxpbmVXaWR0aDogLTEgfSlcblxuICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZU5hbWUsIHdvcmtzcGFjZVBsYW4pXG5cbiAgfSlcblxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkTGFzdFN0YXRlQW5kTGFzdENsYWltQW5ub3RhdGlvbnMoXG4gIGZpbGVQYXRoOiBzdHJpbmcsIGxhc3RTdGF0ZVBSTGluazogc3RyaW5nLCBsYXN0Q2xhaW1QUkxpbms6IHN0cmluZ1xuKSB7XG5cbiAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBzb3VyY2UgZm9sZGVyIGFuZCBnZXQgdGhlIGxpc3Qgb2YgVGVycmFmb3JtIHdvcmtzcGFjZXNcblxuICBjb25zdCB3b3Jrc3BhY2U6IGFueSA9IGNvbW1vbi5pby5mcm9tWWFtbChmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsIFwidXRmLThcIikpO1xuXG4gIGNvbnN0IHN0YXRlTGlua0FzQXJyYXk6IHN0cmluZ1tdID0gbGFzdFN0YXRlUFJMaW5rLnNwbGl0KFwiL1wiKTtcbiAgY29uc3Qgc3RhdGVBbm5vdGF0aW9uVmFsdWU6IHN0cmluZyA9IGAke3N0YXRlTGlua0FzQXJyYXlbM119LyR7c3RhdGVMaW5rQXNBcnJheVs0XX0jJHtzdGF0ZUxpbmtBc0FycmF5WzZdfWBcblxuICBjb25zdCBjbGFpbUxpbmtBc0FycmF5OiBzdHJpbmdbXSA9IGxhc3RDbGFpbVBSTGluay5zcGxpdChcIi9cIik7XG4gIGNvbnN0IGNsYWltQW5ub3RhdGlvblZhbHVlOiBzdHJpbmcgPSBgJHtjbGFpbUxpbmtBc0FycmF5WzNdfS8ke2NsYWltTGlua0FzQXJyYXlbNF19IyR7Y2xhaW1MaW5rQXNBcnJheVs2XX1gXG5cbiAgd29ya3NwYWNlLm1ldGFkYXRhLmFubm90YXRpb25zID0ge1xuICAgIC4uLndvcmtzcGFjZS5tZXRhZGF0YS5hbm5vdGF0aW9ucyxcbiAgICBbY29tbW9uLmdlbmVyaWMuZ2V0RmlyZXN0YXJ0ckFubm90YXRpb24oXCJsYXN0LXN0YXRlLXByXCIpXTogc3RhdGVBbm5vdGF0aW9uVmFsdWUsXG4gICAgW2NvbW1vbi5nZW5lcmljLmdldEZpcmVzdGFydHJBbm5vdGF0aW9uKFwibGFzdC1jbGFpbS1wclwiKV06IGNsYWltQW5ub3RhdGlvblZhbHVlXG4gIH1cblxuICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBjb21tb24uaW8udG9ZYW1sKFxuICAgIHsgLi4ud29ya3NwYWNlIH0sIHsgcXVvdGluZ1R5cGU6ICdcIicsIGxpbmVXaWR0aDogLTEgfVxuICApKVxuXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZSZW5kZXJDbGFpbXMoXG5cbiAgY2F0YWxvZ1Njb3BlOiBDb25zdHJ1Y3QsXG5cbiAgZmlyZXN0YXJ0clNjb3BlOiBDb25zdHJ1Y3QsXG5cbiAgZGF0YToge1xuXG4gICAgcmVuZGVyQ2xhaW1zOiBSZW5kZXJDbGFpbXMsXG5cbiAgICBjcnM6IGFueSxcblxuICAgIHJlbmFtZXM/OiBJUmVuYW1lUmVzdWx0W11cblxuICB9LFxuXG4pOiBQcm9taXNlPFJlbmRlcmVkQ3JNYXA+IHtcblxuICBjb25zdCByZXN1bHQ6IFJlbmRlcmVkQ3JNYXAgPSB7fVxuXG4gIGNvbnN0IHsgcmVuZGVyQ2xhaW1zLCBjcnMgfSA9IGRhdGFcblxuICBjb25zdCBzb3J0ZWRLaW5kcyA9IHNvcnRLaW5kcyhbXCJVc2VyQ2xhaW1cIiwgXCJHcm91cENsYWltXCIsIFwiQ29tcG9uZW50Q2xhaW1cIiwgXCJEb21haW5DbGFpbVwiLCBcIlN5c3RlbUNsYWltXCIsIFwiVEZXb3Jrc3BhY2VDbGFpbVwiLCBcIkFyZ29EZXBsb3lDbGFpbVwiXSwgcmVuZGVyQ2xhaW1zKVxuXG4gIGZvciAoY29uc3QgcmVuZGVyQ2xhaW1zIG9mIHNvcnRlZEtpbmRzKSB7XG5cbiAgICBmb3IgKGNvbnN0IGNsYWltS2V5IG9mIE9iamVjdC5rZXlzKHJlbmRlckNsYWltcykpIHtcblxuICAgICAgY29uc3QgY2xhaW0gPSByZW5kZXJDbGFpbXNbY2xhaW1LZXkgYXMgUmVuZGVyQ2xhaW1LZXldLmNsYWltXG5cbiAgICAgIGNvbnN0IGNvbmZpZ3VyZWRQcm92aWRlciA9IGdldENvbmZpZ3VyZWRQcm92aWRlcigpLnRvU3RyaW5nKClcblxuICAgICAgbGV0IHByb3ZpZGVycyA9IE9iamVjdC5rZXlzKGNsYWltLnByb3ZpZGVycylcblxuICAgICAgaWYoY29uZmlndXJlZFByb3ZpZGVyICE9IEFsbG93ZWRQcm92aWRlcnMuYWxsLnRvU3RyaW5nKCkpe1xuXG4gICAgICAgIHByb3ZpZGVycyA9IHByb3ZpZGVycy5maWx0ZXIoXG5cbiAgICAgICAgICAocHJvdmlkZXI6IHN0cmluZykgPT4gcHJvdmlkZXIgPT09IGNvbmZpZ3VyZWRQcm92aWRlclxuXG4gICAgICAgIClcblxuICAgICAgfVxuXG5cbiAgICAgIGNvbnN0IHByZXZpb3VzQ1IgPSBnZXRQcmV2aW91c0NSZnJvbUNsYWltKGNsYWltLCBjcnMpXG5cbiAgICAgIGNvbnN0IHBhdGNoZXMgPSBhd2FpdCBleHRyYWN0UGF0Y2hlcyhyZW5kZXJDbGFpbXNbY2xhaW1LZXkgYXMgUmVuZGVyQ2xhaW1LZXldLCBwcmV2aW91c0NSKVxuXG4gICAgICBpZiAoIXByZXZpb3VzQ1IpIHtcblxuICAgICAgICBsb2coYE5vIENSIGZvdW5kIGZvciBjbGFpbSAke2NsYWltS2V5fSwgaXQgd2lsbCBiZSByZW5kZXJlZCBmcm9tIHNjcmF0Y2hgKVxuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtmaXJlc3RhcnRyRW50aXR5LCBleHRyYUNoYXJ0cywgY2F0YWxvZ0VudGl0eX0gID0gYXdhaXQgcmVuZGVyQ2xhaW0oXG5cbiAgICAgICAgY2F0YWxvZ1Njb3BlLFxuXG4gICAgICAgIGZpcmVzdGFydHJTY29wZSxcblxuICAgICAgICBjbGFpbSxcblxuICAgICAgICBwYXRjaGVzLFxuXG4gICAgICAgIHByZXZpb3VzQ1IsXG5cbiAgICAgIClcblxuICAgICAgaWYoY2F0YWxvZ0VudGl0eSkge1xuXG4gICAgICAgIHJlc3VsdFtgJHtjYXRhbG9nRW50aXR5LmtpbmR9LSR7Y2F0YWxvZ0VudGl0eS5tZXRhZGF0YS5uYW1lfWBdID0gY2F0YWxvZ0VudGl0eS50b0pzb24oKVxuICAgICAgXG4gICAgICB9XG5cbiAgICAgIC8qKlxuXG4gICAgICAqIElmIHRoZXJlIGlzIG5vIHByb3ZpZGVyIGRvbid0IHN0b3JlIHRoZSBDUiBpbiB0aGUgbWFwXG5cbiAgICAgICovXG5cbiAgICAgIGlmICghZmlyZXN0YXJ0ckVudGl0eSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGZpcmVzdGFydHJFbnRpdHlKc29uID0gZmlyZXN0YXJ0ckVudGl0eS50b0pzb24oKVxuXG4gICAgICBzZXRSZW5kZXJlZENsYWltKGNsYWltLCBmaXJlc3RhcnRyRW50aXR5SnNvbilcblxuICAgICAgZm9yKGNvbnN0IGV4dHJhQ2hhcnQgb2YgZXh0cmFDaGFydHMpe1xuXG4gICAgICAgIGNvbnN0IHtjbGFpbSwgY2hhcnR9ID0gZXh0cmFDaGFydFxuXG4gICAgICAgIHNldFJlbmRlcmVkQ2xhaW0oY2xhaW0sIGNoYXJ0LnRvSnNvbigpKVxuXG4gICAgICAgIHJlc3VsdFtgJHtjaGFydC5raW5kfS0ke2NoYXJ0Lm1ldGFkYXRhLm5hbWV9YF0gPSBjaGFydC50b0pzb24oKVxuXG4gICAgICB9XG5cbiAgICAgIGlmKCFmaXJlc3RhcnRyRW50aXR5SnNvbi5tZXRhZGF0YS5hbm5vdGF0aW9ucyB8fCAhZmlyZXN0YXJ0ckVudGl0eUpzb24ubWV0YWRhdGEubmFtZSkgdGhyb3cgZmlyZXN0YXJ0ckVudGl0eUpzb25cblxuICAgICAgcmVzdWx0W2Ake2ZpcmVzdGFydHJFbnRpdHkua2luZH0tJHtmaXJlc3RhcnRyRW50aXR5SnNvbi5tZXRhZGF0YS5uYW1lfWBdID0gZmlyZXN0YXJ0ckVudGl0eUpzb25cblxuICAgIH1cblxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxuXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RQYXRjaGVzKFxuXG4gIGNsYWltVG9SZW5kZXJEYXRhOiBSZW5kZXJDbGFpbURhdGEsIHByZXZpb3VzQ1I6IGFueVxuXG4pOiBQcm9taXNlPElDdXN0b21SZXNvdXJjZVBhdGNoW10+IHtcblxuICBsZXQgdG90YWxQYXRjaGVzOiBJQ3VzdG9tUmVzb3VyY2VQYXRjaFtdID0gW11cblxuXG4gIGZvciAoY29uc3Qgbm9ybWFsaXplciBvZiBjbGFpbVRvUmVuZGVyRGF0YS5ub3JtYWxpemVycykge1xuXG4gICAgY29uc3QgcGF0Y2hlcyA9IGF3YWl0IG5vcm1hbGl6ZXIucGF0Y2hlcyhjbGFpbVRvUmVuZGVyRGF0YVtcImNsYWltXCJdLCBwcmV2aW91c0NSKVxuXG4gICAgdG90YWxQYXRjaGVzID0gdG90YWxQYXRjaGVzLmNvbmNhdChwYXRjaGVzKS5mbGF0KClcblxuICB9XG5cbiAgZm9yIChjb25zdCBpbml0aWFsaXplciBvZiBjbGFpbVRvUmVuZGVyRGF0YS5pbml0aWFsaXplcnMpIHtcblxuICAgIGNvbnN0IHBhdGNoZXMgPSBhd2FpdCBpbml0aWFsaXplci5wYXRjaGVzKGNsYWltVG9SZW5kZXJEYXRhW1wiY2xhaW1cIl0sIHByZXZpb3VzQ1IpXG5cbiAgICB0b3RhbFBhdGNoZXMgPSB0b3RhbFBhdGNoZXMuY29uY2F0KHBhdGNoZXMpLmZsYXQoKVxuXG4gIH1cblxuICBmb3IgKGNvbnN0IG92ZXJyaWRlciBvZiBjbGFpbVRvUmVuZGVyRGF0YS5vdmVycmlkZXMpIHtcblxuICAgIGNvbnN0IHBhdGNoZXMgPSBhd2FpdCBvdmVycmlkZXIucGF0Y2hlcyhjbGFpbVRvUmVuZGVyRGF0YVtcImNsYWltXCJdLCBwcmV2aW91c0NSKVxuXG4gICAgdG90YWxQYXRjaGVzID0gdG90YWxQYXRjaGVzLmNvbmNhdChwYXRjaGVzKS5mbGF0KClcblxuICB9XG5cblxuICBpZiAoY2xhaW1Ub1JlbmRlckRhdGEuY2xhaW0ua2luZCA9PT0gXCJDb21wb25lbnRDbGFpbVwiKSB7XG5cbiAgICB0b3RhbFBhdGNoZXMgPSB0b3RhbFBhdGNoZXMuY29uY2F0KChhd2FpdCBnZW5lcmF0ZUZlYXR1cmVzUGF0Y2hlcyhjbGFpbVRvUmVuZGVyRGF0YS5jbGFpbSkpKS5mbGF0KClcblxuICB9XG5cblxuICBmb3IgKGNvbnN0IGdsb2JhbCBvZiBjbGFpbVRvUmVuZGVyRGF0YS5nbG9iYWxzKSB7XG5cbiAgICBjb25zdCBwYXRjaGVzID0gYXdhaXQgZ2xvYmFsLnBhdGNoZXMoY2xhaW1Ub1JlbmRlckRhdGEuY2xhaW0sIHByZXZpb3VzQ1IpXG5cbiAgICB0b3RhbFBhdGNoZXMgPSB0b3RhbFBhdGNoZXMuY29uY2F0KHBhdGNoZXMpLmZsYXQoKVxuXG4gIH1cblxuICByZXR1cm4gdG90YWxQYXRjaGVzXG5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUmVuZGVyQ2xhaW1SZXN1bHQge1xuICBjYXRhbG9nRW50aXR5PzogQXBpT2JqZWN0O1xuICBmaXJlc3RhcnRyRW50aXR5PzogQXBpT2JqZWN0O1xuICBleHRyYUNoYXJ0czogeyBjbGFpbToge2tpbmQ6IHN0cmluZywgbmFtZTogc3RyaW5nfSwgY2hhcnQ6IEFwaU9iamVjdH1bXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVuZGVyQ2xhaW0oXG5cbiAgY2F0YWxvZ1Njb3BlOiBDb25zdHJ1Y3QsXG5cbiAgZmlyZXN0YXJ0clNjb3BlOiBDb25zdHJ1Y3QsXG5cbiAgY2xhaW06IGFueSxcblxuICBwYXRjaGVzOiBJQ3VzdG9tUmVzb3VyY2VQYXRjaFtdLFxuXG4gIHByZXZpb3VzQ1I6IGFueSB8IG51bGwgPSBudWxsXG5cbiAgKTogUHJvbWlzZTxJUmVuZGVyQ2xhaW1SZXN1bHQ+IHtcblxuICBsZXQgY2F0YWxvZ0VudGl0eTogQmFzZUNoYXJ0IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBsZXQgZmlyZXN0YXJ0ckVudGl0eTogQmFzZUNoYXJ0IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGNoYXJ0SWQgPSBgJHtjbGFpbS5raW5kfS0ke2NsYWltLm5hbWV9YC50b0xvd2VyQ2FzZSgpO1xuXG4gIGxldCBmaXJlc3RhcnRySWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGlmIChwcmV2aW91c0NSKSB7XG5cbiAgICBmaXJlc3RhcnRySWQgPSBwcmV2aW91c0NSPy5zcGVjPy5maXJlc3RhcnRyPy50ZlN0YXRlS2V5IHx8IG51bGw7XG5cbiAgfVxuXG4gIGNvbnN0IHJlbmRlclBhdGNoZXMgPSBwYXRjaGVzLmZpbHRlcigocGF0Y2g6IGFueSkgPT4gIXBhdGNoLmlzUG9zdFBhdGNoKVxuICBjb25zdCBwb3N0UGF0Y2hlcyA9IHBhdGNoZXMuZmlsdGVyKChwYXRjaDphbnkpID0+IHBhdGNoLmlzUG9zdFBhdGNoKVxuXG4gIGNvbnN0IHByb3ZpZGVyID0gZ2V0Q29uZmlndXJlZFByb3ZpZGVyKClcblxuICBzd2l0Y2ggKGNsYWltLmtpbmQpIHtcblxuICAgIGNhc2UgXCJEb21haW5DbGFpbVwiOlxuXG4gICAgICBjYXRhbG9nRW50aXR5ID0gbmV3IGNoYXJ0cy5kZWZhdWx0LkNhdGFsb2dEb21haW5DaGFydChcbiAgICAgICAgY2F0YWxvZ1Njb3BlLCBcbiAgICAgICAgYGNhdGFsb2ctJHtjaGFydElkfWAsIFxuICAgICAgICBmaXJlc3RhcnRySWQsIFxuICAgICAgICBjbGFpbSwgXG4gICAgICAgIHJlbmRlclBhdGNoZXNcbiAgICAgICk7XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIlN5c3RlbUNsYWltXCI6XG5cbiAgICAgIGNhdGFsb2dFbnRpdHkgPSBuZXcgY2hhcnRzLmRlZmF1bHQuQ2F0YWxvZ1N5c3RlbUNoYXJ0KFxuICAgICAgICBjYXRhbG9nU2NvcGUsIFxuICAgICAgICBgY2F0YWxvZy0ke2NoYXJ0SWR9YCwgXG4gICAgICAgIGZpcmVzdGFydHJJZCwgXG4gICAgICAgIGNsYWltLCBcbiAgICAgICAgcmVuZGVyUGF0Y2hlc1xuICAgICAgKTtcblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiR3JvdXBDbGFpbVwiOlxuXG4gICAgICBjYXRhbG9nRW50aXR5ID0gbmV3IGNoYXJ0cy5kZWZhdWx0LkNhdGFsb2dHcm91cENoYXJ0KGNhdGFsb2dTY29wZSwgYGNhdGFsb2ctJHtjaGFydElkfWAsIGZpcmVzdGFydHJJZCwgY2xhaW0sIHJlbmRlclBhdGNoZXMpO1xuXG4gICAgICBpZiAoY2xhaW0ucHJvdmlkZXJzLmdpdGh1YiAmJiAocHJvdmlkZXIgPT09IEFsbG93ZWRQcm92aWRlcnMuZ2l0aHViIHx8IHByb3ZpZGVyID09PSBBbGxvd2VkUHJvdmlkZXJzLmFsbCkpIHtcblxuICAgICAgICBmaXJlc3RhcnRyRW50aXR5ID0gbmV3IGNoYXJ0cy5kZWZhdWx0LkdpdGh1Ykdyb3VwQ2hhcnQoXG4gICAgICAgICAgZmlyZXN0YXJ0clNjb3BlLFxuICAgICAgICAgIGBnaXRodWItJHtjaGFydElkfWAsXG4gICAgICAgICAgZmlyZXN0YXJ0cklkLFxuICAgICAgICAgIGNsYWltLFxuICAgICAgICAgIHJlbmRlclBhdGNoZXNcbiAgICAgICAgKTtcblxuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgXCJVc2VyQ2xhaW1cIjpcblxuICAgICAgY2F0YWxvZ0VudGl0eSA9IG5ldyBjaGFydHMuZGVmYXVsdC5DYXRhbG9nVXNlckNoYXJ0KGNhdGFsb2dTY29wZSwgY2hhcnRJZCwgZmlyZXN0YXJ0cklkLCBjbGFpbSwgcmVuZGVyUGF0Y2hlcyk7XG5cbiAgICAgIGlmIChjbGFpbS5wcm92aWRlcnMuZ2l0aHViICYmIChwcm92aWRlciA9PT0gQWxsb3dlZFByb3ZpZGVycy5naXRodWIgfHwgcHJvdmlkZXIgPT09IEFsbG93ZWRQcm92aWRlcnMuYWxsKSkge1xuXG4gICAgICAgIGZpcmVzdGFydHJFbnRpdHkgPSBuZXcgY2hhcnRzLmRlZmF1bHQuR2l0aHViTWVtYmVyc2hpcENoYXJ0KFxuICAgICAgICAgIGZpcmVzdGFydHJTY29wZSxcbiAgICAgICAgICBgZ2l0aHViLSR7Y2hhcnRJZH1gLFxuICAgICAgICAgIGZpcmVzdGFydHJJZCxcbiAgICAgICAgICBjbGFpbSxcbiAgICAgICAgICByZW5kZXJQYXRjaGVzXG4gICAgICAgICk7XG5cbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiQ29tcG9uZW50Q2xhaW1cIjpcblxuICAgICAgaWYgKGNsYWltLnByb3ZpZGVycy5naXRodWIgJiYgKHByb3ZpZGVyID09PSBBbGxvd2VkUHJvdmlkZXJzLmdpdGh1YiB8fCBwcm92aWRlciA9PT0gQWxsb3dlZFByb3ZpZGVycy5hbGwpKSB7XG5cbiAgICAgICAgZmlyZXN0YXJ0ckVudGl0eSA9IG5ldyBjaGFydHMuZGVmYXVsdC5HaXRodWJSZXBvc2l0b3J5Q2hhcnQoXG4gICAgICAgICAgZmlyZXN0YXJ0clNjb3BlLFxuICAgICAgICAgIGBnaXRodWItJHtjaGFydElkfWAsXG4gICAgICAgICAgZmlyZXN0YXJ0cklkLFxuICAgICAgICAgIGNsYWltLFxuICAgICAgICAgIHJlbmRlclBhdGNoZXNcbiAgICAgICAgKTtcblxuICAgICAgfVxuICAgICAgY2F0YWxvZ0VudGl0eSA9IG5ldyBjaGFydHMuZGVmYXVsdC5DYXRhbG9nQ29tcG9uZW50Q2hhcnQoXG4gICAgICAgIGNhdGFsb2dTY29wZSwgY2hhcnRJZCwgZmlyZXN0YXJ0cklkLCBjbGFpbSwgcmVuZGVyUGF0Y2hlc1xuICAgICAgKTtcblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiVEZXb3Jrc3BhY2VDbGFpbVwiOlxuXG4gICAgICBpZiAoY2xhaW0ucHJvdmlkZXJzLnRlcnJhZm9ybSAmJiAocHJvdmlkZXIgPT09IEFsbG93ZWRQcm92aWRlcnMudGVycmFmb3JtIHx8IHByb3ZpZGVyID09PSBBbGxvd2VkUHJvdmlkZXJzLmFsbCkpIHtcblxuICAgICAgICBmaXJlc3RhcnRyRW50aXR5ID0gbmV3IGNoYXJ0cy5kZWZhdWx0LlRGV29ya3NwYWNlQ2hhcnQoXG4gICAgICAgICAgZmlyZXN0YXJ0clNjb3BlLCBcbiAgICAgICAgICBgdGVycmFmb3JtLSR7Y2hhcnRJZH1gLCBcbiAgICAgICAgICBmaXJlc3RhcnRySWQsXG4gICAgICAgICAgY2xhaW0sXG4gICAgICAgICAgcmVuZGVyUGF0Y2hlc1xuICAgICAgICApO1xuXG4gICAgICB9XG4gICAgICBjYXRhbG9nRW50aXR5ID0gbmV3IGNoYXJ0cy5kZWZhdWx0LkNhdGFsb2dURldvcmtzcGFjZUNoYXJ0KFxuICAgICAgICBjYXRhbG9nU2NvcGUsIGNoYXJ0SWQsIGZpcmVzdGFydHJJZCwgY2xhaW0sIHJlbmRlclBhdGNoZXNcbiAgICAgICk7XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIkFyZ29EZXBsb3lDbGFpbVwiOlxuXG4gICAgICBpZiAoY2xhaW0ucHJvdmlkZXJzLmFyZ29jZCAmJiAocHJvdmlkZXIgPT09IEFsbG93ZWRQcm92aWRlcnMuYXJnb2NkIHx8IHByb3ZpZGVyID09PSBBbGxvd2VkUHJvdmlkZXJzLmFsbCkpIHtcblxuICAgICAgICBmaXJlc3RhcnRyRW50aXR5ID0gbmV3IGNoYXJ0cy5kZWZhdWx0LkFyZ29EZXBsb3lDaGFydChcbiAgICAgICAgICBmaXJlc3RhcnRyU2NvcGUsIFxuICAgICAgICAgIGBhcmdvY2QtJHtjaGFydElkfWAsIFxuICAgICAgICAgIGZpcmVzdGFydHJJZCxcbiAgICAgICAgICBjbGFpbSxcbiAgICAgICAgICByZW5kZXJQYXRjaGVzXG4gICAgICAgICk7XG5cbiAgICAgIH1cbiAgICAgIFxuICAgICAgY2F0YWxvZ0VudGl0eSA9IG5ldyBjaGFydHMuZGVmYXVsdC5DYXRhbG9nQXJnb0RlcGxveUNoYXJ0KFxuICAgICAgICBjYXRhbG9nU2NvcGUsIGNoYXJ0SWQsIGZpcmVzdGFydHJJZCwgY2xhaW0sIHJlbmRlclBhdGNoZXNcbiAgICAgICk7XG5cbiAgICAgIGJyZWFrO1xuXG5cbiAgICBkZWZhdWx0OlxuXG4gICAgICBjb25zb2xlLmVycm9yKGBVbmtub3duIGNsYWltIGtpbmQ6ICR7Y2xhaW0ua2luZH1gKTtcblxuICAgICAgYnJlYWs7XG4gIH1cblxuICAvKipcbiAgICogVGhlcmUgaXMgdGhlIHBvc3NpYmlsaXR5IHRvIG9ubHkgcmVuZGVyIHRoZSBjYXRhbG9nIGVudGl0eSwgYnV0IG5vdCB0aGUgb3RoZXIgd2F5IGFyb3VuZFxuICAgKi9cbiAgaWYgKCFjYXRhbG9nRW50aXR5KSB7XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byByZW5kZXIgY2xhaW0gJHtjbGFpbS5raW5kfS0ke2NsYWltLm5hbWV9YCk7XG5cbiAgfVxuXG4gIC8qXG4gICAqXG4gICAqIFJlbmRlciBwaGFzZVxuICAgKlxuICAgKi9cbiAgY29uc3QgW2NhdGFsb2dDaGFydCwgZmlyZXN0YXJ0ckVudGl0eUNoYXJ0XSA9IGF3YWl0IFByb21pc2UuYWxsKFxuXG4gICAgW1xuICAgICAgcHJvdmlkZXIgPT09IEFsbG93ZWRQcm92aWRlcnMuYWxsID8gY2F0YWxvZ0VudGl0eS5yZW5kZXIoKSA6IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpLFxuXG4gICAgICBmaXJlc3RhcnRyRW50aXR5Py5yZW5kZXIoKSxcblxuICAgIF1cblxuICApXG5cbiAgLypcbiAgICpcbiAgICogUG9zdCByZW5kZXIgcGhhc2UgKGFuZCByZXR1cm4pXG4gICAqXG4gICAqL1xuICByZXR1cm4ge1xuXG4gICAgY2F0YWxvZ0VudGl0eTogY2F0YWxvZ0NoYXJ0ID8gYXdhaXQgY2F0YWxvZ0NoYXJ0LnBvc3RSZW5kZXJlcihwb3N0UGF0Y2hlcykgOiB1bmRlZmluZWQsXG5cbiAgICBmaXJlc3RhcnRyRW50aXR5OiBhd2FpdCAoZmlyZXN0YXJ0ckVudGl0eUNoYXJ0ID8gZmlyZXN0YXJ0ckVudGl0eUNoYXJ0LnBvc3RSZW5kZXJlcihwb3N0UGF0Y2hlcykgOiB1bmRlZmluZWQpLFxuXG4gICAgZXh0cmFDaGFydHM6IGF3YWl0IGZpcmVzdGFydHJFbnRpdHk/LmV4dHJhQ2hhcnRzKCkgfHwgW11cbiAgfTtcblxufVxuXG5cblxuZnVuY3Rpb24gc29ydEtpbmRzKG9yZGVyZWRLaW5kczogc3RyaW5nW10sIGNsYWltczogUmVuZGVyQ2xhaW1zKSB7XG5cbiAgY29uc3QgcmVzdWx0OiBSZW5kZXJDbGFpbXNbXSA9IFtdXG5cbiAgZm9yIChjb25zdCBraW5kIG9mIG9yZGVyZWRLaW5kcykge1xuXG4gICAgY29uc3Qga2luZFJlbmRlckNsYWltczogYW55ID0gc29ydFJlbmRlckNsYWltc0J5S2luZChjbGFpbXMsIFtraW5kXSlcblxuICAgIHJlc3VsdC5wdXNoKGtpbmRSZW5kZXJDbGFpbXMpXG5cbiAgfVxuXG4gIHJldHVybiByZXN1bHRcblxufVxuXG5cblxuXG5cbmZ1bmN0aW9uIGdldFByZXZpb3VzQ1Jmcm9tQ2xhaW0oY2xhaW06IGFueSwgcHJldmlvdXNDUnM6IGFueSkge1xuXG4gIGNvbnN0IHByZXZpb3VzQ1JzS2V5cyA9IE9iamVjdC5rZXlzKHByZXZpb3VzQ1JzKVxuXG4gIGZvcihjb25zdCBwcmV2aW91c0NSS2V5IG9mIHByZXZpb3VzQ1JzS2V5cyl7XG5cbiAgICBjb25zdCBwcmV2aW91c0NSID0gcHJldmlvdXNDUnNbcHJldmlvdXNDUktleV1cblxuICAgIGlmKGlzQ2F0YWxvZ0VudGl0eShwcmV2aW91c0NSKSkgY29udGludWVcblxuICAgIGlmKGlzRXhjbHVkZWRGcm9tUHJldmlvdXNDUihwcmV2aW91c0NSLmtpbmQpKSBjb250aW51ZVxuXG4gICAgaWYocHJldmlvdXNDUi5tZXRhZGF0YS5hbm5vdGF0aW9uc1tDTEFJTV9SRUZfQU5OT1RBVElPTl0gPT09IGAke2NsYWltLmtpbmR9LyR7Y2xhaW0ubmFtZX1gKXtcblxuICAgICAgcmV0dXJuIHByZXZpb3VzQ1JcblxuICAgIH1cblxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG5cbn1cblxuXG5mdW5jdGlvbiBpc0V4Y2x1ZGVkRnJvbVByZXZpb3VzQ1IoY3JLaW5kOiBzdHJpbmcpe1xuXG5cbiAgcmV0dXJuIFtcIkZpcmVzdGFydHJHaXRodWJSZXBvc2l0b3J5RmVhdHVyZVwiXS5pbmNsdWRlcyhjcktpbmQpXG5cblxufVxuIl19
|
|
235604
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVuZGVyZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxxQ0FBa0Q7QUFDbEQsaURBQWtDO0FBQ2xDLGtEQUEwQjtBQUUxQixpQ0FBdUQ7QUFFdkQscUVBQTBFO0FBRzFFLHlEQUF1SDtBQUN2SCwrQ0FBa0Q7QUFDbEQscUNBQW1FO0FBRW5FLHdEQUFpRTtBQUNqRSx1Q0FBa0M7QUFDbEMsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUN4QixvRUFBb0M7QUFDcEMsb0RBQTRCO0FBQzVCLE1BQU0sb0JBQW9CLEdBQUcsMEJBQTBCLENBQUE7QUFHdkQsTUFBTSxHQUFHLEdBQUcsSUFBQSxlQUFLLEVBQUMscUJBQXFCLENBQUMsQ0FBQTtBQXFDeEM7Ozs7Ozs7Ozs7O0dBV0c7QUFDSSxLQUFLLFVBQVUsaUJBQWlCLENBRXJDLFlBQTBCLEVBRTFCLE1BQVcsRUFBRSxFQUViLG1CQUEyQixlQUFlLEVBRTFDLGNBQXNCLGlCQUFpQjtJQUl2QyxNQUFNLFlBQVksR0FBRyxJQUFJLFdBQUcsQ0FBQztRQUUzQixNQUFNLEVBQUUsZ0JBQWdCO1FBRXhCLG1CQUFtQixFQUFFLE9BQU87UUFFNUIsY0FBYyxFQUFFLHNCQUFjLENBQUMsaUJBQWlCO0tBRWpELENBQUMsQ0FBQTtJQUVGLE1BQU0sZUFBZSxHQUFHLElBQUksV0FBRyxDQUFDO1FBRTlCLE1BQU0sRUFBRSxXQUFXO1FBRW5CLG1CQUFtQixFQUFFLE9BQU87UUFFNUIsY0FBYyxFQUFFLHNCQUFjLENBQUMsaUJBQWlCO0tBRWpELENBQUMsQ0FBQTtJQUVGLE1BQU0sTUFBTSxHQUFRLE1BQU0sYUFBYSxDQUVyQyxZQUFZLEVBRVosZUFBZSxFQUVmO1FBQ0UsWUFBWTtRQUVaLEdBQUc7UUFFSCxPQUFPLEVBQUUsRUFBRTtLQUNaLENBQ0YsQ0FBQTtJQUVELGVBQWUsQ0FB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RUFBRSxNQUFvQjtJQUU3RCxNQUFNLE1BQU0sR0FBbUIsRUFBRSxDQUFBO0lBRWpDLEtBQUssTUFBTSxJQUFJLElBQUksWUFBWSxFQUFFO1FBRS9CLE1BQU0sZ0JBQWdCLEdBQVEsSUFBQSxtQ0FBc0IsRUFBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBRXBFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtLQUU5QjtJQUVELE9BQU8sTUFBTSxDQUFBO0FBRWYsQ0FBQztBQU1ELFNBQVMsc0JBQXNCLENBQUMsS0FBVSxFQUFFLFdBQWdCO0lBRTFELE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7SUFFaEQsS0FBSSxNQUFNLGFBQWEsSUFBSSxlQUFlLEVBQUM7UUFFekMsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBRTdDLElBQUcsSUFBQSw0QkFBZSxFQUFDLFVBQVUsQ0FBQztZQUFFLFNBQVE7UUFFeEMsSUFBRyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQUUsU0FBUTtRQUV0RCxJQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBQztZQUV6RixPQUFPLFVBQVUsQ0FBQTtTQUVsQjtLQUVGO0lBRUQsT0FBTyxLQUFLLENBQUE7QUFFZCxDQUFDO0FBR0QsU0FBUyx3QkFBd0IsQ0FBQyxNQUFjO0lBRzlDLE9BQU8sQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUcvRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IElSZW5hbWVSZXN1bHQsIGxvYWRBbGwgfSBmcm9tIFwiLi9sb2FkZXJcIjtcbmltcG9ydCAqIGFzIGNoYXJ0cyBmcm9tIFwiLi9jaGFydHNcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiO1xuaW1wb3J0IHsgQmFzZUNoYXJ0IH0gZnJvbSBcIi4vY2hhcnRzL2Jhc2VcIjtcbmltcG9ydCB7IEFwaU9iamVjdCwgQXBwLCBZYW1sT3V0cHV0VHlwZSB9IGZyb20gXCJjZGs4c1wiO1xuaW1wb3J0IHsgR2xvYmFsU2VjdGlvbiB9IGZyb20gXCIuL2dsb2JhbHMvYmFzZVwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVGZWF0dXJlc1BhdGNoZXMgfSBmcm9tIFwiLi9jaGFydHMvZ2l0aHViL2ZlYXR1cmVSZW5kZXJlclwiO1xuaW1wb3J0IHsgT3ZlcnJpZGVyUGF0Y2hlcyB9IGZyb20gXCIuL292ZXJyaWRlcnMvYmFzZVwiO1xuaW1wb3J0IHsgSUN1c3RvbVJlc291cmNlUGF0Y2ggfSBmcm9tIFwiLi9wYXRjaGVzXCI7XG5pbXBvcnQgeyBpc0NhdGFsb2dFbnRpdHksIHZhbGlkYXRlUmVmZXJlbnRpYWxJbnRlZ3JpdHksIHZhbGlkYXRlVGZTdGF0ZUtleVVuaXF1ZW5lc3MgfSBmcm9tIFwiLi92YWxpZGF0aW9ucy9yZWZlcmVuY2VzXCI7XG5pbXBvcnQgeyAgc2V0UmVuZGVyZWRDbGFpbSB9IGZyb20gXCIuL3JlZnJlc29sdmVyXCI7XG5pbXBvcnQgeyBBbGxvd2VkUHJvdmlkZXJzLCBnZXRDb25maWd1cmVkUHJvdmlkZXIgfSBmcm9tIFwiLi9jb25maWdcIjtcbmltcG9ydCB7IE5vcm1hbGl6ZXIgfSBmcm9tIFwiLi9ub3JtYWxpemVycy9iYXNlXCI7XG5pbXBvcnQgeyBzb3J0UmVuZGVyQ2xhaW1zQnlLaW5kIH0gZnJvbSBcIi4vcmVmc1NvcnRlci9yZWZzU29ydGVyXCI7XG5pbXBvcnQgeyBjcmF3bCB9IGZyb20gXCIuL2NyYXdsZXJcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgY29tbW9uIGZyb20gXCJjYXRhbG9nX2NvbW1vblwiO1xuaW1wb3J0IGdpdGh1YiBmcm9tIFwiZ2l0aHViXCI7XG5jb25zdCBDTEFJTV9SRUZfQU5OT1RBVElPTiA9IFwiZmlyZXN0YXJ0ci5kZXYvY2xhaW0tcmVmXCJcblxuXG5jb25zdCBsb2cgPSBEZWJ1ZyhcImZpcmVzdGFydHI6cmVuZGVyZXJcIilcblxuZXhwb3J0IHR5cGUgUmVuZGVyQ2xhaW1EYXRhID0ge1xuXG4gIGNsYWltOiBhbnlcblxuICBjbGFpbVBhdGg/OiBzdHJpbmdcblxuICBpbml0aWFsaXplcnM6IGFueSBbXVxuXG4gIG92ZXJyaWRlczogT3ZlcnJpZGVyUGF0Y2hlc1tdXG5cbiAgZ2xvYmFsczogR2xvYmFsU2VjdGlvbltdLFxuXG4gIG5vcm1hbGl6ZXJzOiBOb3JtYWxpemVyW11cblxufVxuXG50eXBlIENsYWltS2luZCA9IHN0cmluZztcbnR5cGUgQ2xhaW1OYW1lID0gc3RyaW5nO1xuZXhwb3J0IHR5cGUgUmVuZGVyQ2xhaW1LZXkgPSBgJHtDbGFpbUtpbmR9LSR7Q2xhaW1OYW1lfWBcblxudHlwZSBDUktpbmQgPSBzdHJpbmc7XG50eXBlIENSTmFtZSA9IHN0cmluZztcbnR5cGUgUmVuZGVyQ1JLZXkgPSBgJHtDUktpbmR9LSR7Q1JOYW1lfWBcblxuZXhwb3J0IHR5cGUgUmVuZGVyZWRDck1hcCA9IHtcblxuICBba2V5OiBSZW5kZXJDUktleV06IEFwaU9iamVjdFxufVxuXG5leHBvcnQgdHlwZSBSZW5kZXJDbGFpbXMgPSB7XG5cbiAgW2tleTogUmVuZGVyQ2xhaW1LZXldOiBSZW5kZXJDbGFpbURhdGFcblxufVxuXG4vKlxuICogRnVuY3Rpb24gY2FsbGVkIHdoZW4gcmVuZGVyaW5nIGZyb20gdGhlIGltcG9ydGVyIGNsYXNzLlxuICpcbiAqIElucHV0OlxuICogLSByZW5kZXJDbGFpbXM6IGEgUmVuZGVyQ2xhaW1zIG9iamVjdCwgd2hpY2ggY29udGFpbnMgdGhlIGxpc3Qgb2YgY2xhaW1zXG4gKiAgIHdlIHdhbnQgdG8gcmVuZGVyXG4gKlxuICogUmV0dXJuOlxuICogLSBUaGUgcmVzdWx0IG9mIHJlbmRlcmluZyB0aGUgcmVuZGVyQ2xhaW1zIG9iamVjdCwgcGx1cyB0aGVcbiAqICAgcmVuZGVyZWQgZmlyZXN0YXJ0ci1hbGwgZ3JvdXBcbiAqXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5kZXJGcm9tSW1wb3J0cyhcblxuICByZW5kZXJDbGFpbXM6IFJlbmRlckNsYWltcyxcblxuICBjcnM6IGFueSA9IHt9LFxuXG4gIGNhdGFsb2dPdXRwdXREaXI6IHN0cmluZyA9IFwiL3RtcC8uY2F0YWxvZ1wiLFxuXG4gIGNyT3V0cHV0RGlyOiBzdHJpbmcgPSBcIi90bXAvLnJlc291cmNlc1wiLFxuXG4pIHtcblxuICBjb25zdCBjYXRhbG9nU2NvcGUgPSBuZXcgQXBwKHtcblxuICAgIG91dGRpcjogY2F0YWxvZ091dHB1dERpcixcblxuICAgIG91dHB1dEZpbGVFeHRlbnNpb246IFwiLnlhbWxcIixcblxuICAgIHlhbWxPdXRwdXRUeXBlOiBZYW1sT3V0cHV0VHlwZS5GSUxFX1BFUl9SRVNPVVJDRSxcblxuICB9KVxuXG4gIGNvbnN0IGZpcmVzdGFydHJTY29wZSA9IG5ldyBBcHAoe1xuXG4gICAgb3V0ZGlyOiBjck91dHB1dERpcixcblxuICAgIG91dHB1dEZpbGVFeHRlbnNpb246IFwiLnlhbWxcIixcblxuICAgIHlhbWxPdXRwdXRUeXBlOiBZYW1sT3V0cHV0VHlwZS5GSUxFX1BFUl9SRVNPVVJDRSxcblxuICB9KVxuXG4gIGNvbnN0IHJlc3VsdDogYW55ID0gYXdhaXQgZlJlbmRlckNsYWltcyhcblxuICAgIGNhdGFsb2dTY29wZSxcblxuICAgIGZpcmVzdGFydHJTY29wZSxcblxuICAgIHtcbiAgICAgIHJlbmRlckNsYWltcyxcblxuICAgICAgY3JzLFxuXG4gICAgICByZW5hbWVzOiBbXVxuICAgIH0sXG4gIClcblxuICBmaXJlc3RhcnRyU2NvcGUuc3ludGgoKVxuXG4gIHJldHVybiByZXN1bHRcblxufVxuXG5cbi8qXG4gKiBGdW5jdGlvbiBjYWxsZWQgd2hlbiByZW5kZXJpbmcgYnV0IG5vdCBpbXBvcnRpbmdcbiAqXG4gKiBJbnB1dDpcbiAqIC0gc2NvcGU6IGFuIG9iamVjdCwgdXNlZCB0byByZXByZXNlbnQgQ0RLVEYncyBleGVjdXRpb24gc2NvcGVcbiAqXG4gKiBSZXR1cm46XG4gKiAtIFRoZSByZXN1bHQgb2YgcmVuZGVyaW5nIHRoZSByZW5kZXJDbGFpbXMgb2JqZWN0LCBwbHVzIHRoZVxuICogICByZW5kZXJlZCBmaXJlc3RhcnRyLWFsbCBncm91cFxuICpcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmRlcihcblxuICBjYXRhbG9nU2NvcGU6IENvbnN0cnVjdCxcblxuICBmaXJlc3RhcnRyU2NvcGU6IENvbnN0cnVjdCxcblxuICApOiBQcm9taXNlPFJlbmRlcmVkQ3JNYXA+IHtcblxuICBjb25zdCBkYXRhOiB7XG5cbiAgICByZW5kZXJDbGFpbXM6IFJlbmRlckNsYWltcyxcblxuICAgIGNyczogYW55LFxuXG4gICAgcmVuYW1lcz86IElSZW5hbWVSZXN1bHRbXVxuXG4gIH0gPSBhd2FpdCBsb2FkQWxsKClcblxuICBjb25zdCByZXN1bHQ6IGFueSA9IGF3YWl0IGZSZW5kZXJDbGFpbXMoY2F0YWxvZ1Njb3BlLCBmaXJlc3RhcnRyU2NvcGUsIGRhdGEpXG5cbiAgdmFsaWRhdGVSZWZlcmVudGlhbEludGVncml0eShyZXN1bHQpXG5cbiAgdmFsaWRhdGVUZlN0YXRlS2V5VW5pcXVlbmVzcyhyZXN1bHQpXG5cbiAgcmV0dXJuIHJlc3VsdFxuXG59XG5cbi8qXG4gKiBGdW5jdGlvbiBjYWxsZWQgd2hlbiByZW5kZXJpbmcgVGVycmFmb3JtIHdvcmtzcGFjZXMgUGxhbnNcbiAqIGJhc2VkIG9uIHRoZSBwcmV2aW91cyByZW5kZXJlciBUZXJyYWZvcm0gd29ya3NwYWNlc1xuKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5kZXJXb3Jrc3BhY2VQbGFucyhzb3VyY2U6IHN0cmluZywgZGVzdGlueTogc3RyaW5nLCBwckxpbms6IHN0cmluZywgc2hhOiBzdHJpbmcsIGdoQ2xpOiBhbnkgPSBnaXRodWIpIHtcblxuICBjb25zdCBbb3JnUmVwbywgcHJOdW1iZXJdID0gcHJMaW5rLnNwbGl0KFwiI1wiKVxuXG4gIGNvbnN0IFsgb3JnLCByZXBvIF0gPSBvcmdSZXBvLnNwbGl0KFwiL1wiKVxuXG4gIGNvbnN0IHsgZGF0YTogZmlsZXMgfSA9IGF3YWl0IGdoQ2xpLnB1bGxzLmdldFByRmlsZXMoXG4gICAgcGFyc2VJbnQocHJOdW1iZXIpLFxuICAgIHJlcG8sXG4gICAgb3JnXG4gIClcblxuICBpZihmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwICYmIGZpbGVzWzBdLnN0YXR1cyA9PSBcInJlbW92ZWRcIil7XG5cbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZ2hDbGkucmVwby5nZXRDb250ZW50KFxuICAgIFxuICAgICAgZmlsZXNbMF0uZmlsZW5hbWUsXG4gICAgXG4gICAgICByZXBvLFxuICAgIFxuICAgICAgb3JnLFxuICAgIFxuICAgIClcblxuICAgIGNvbnN0IHdvcmtzcGFjZTogYW55ID0gY29tbW9uLmlvLmZyb21ZYW1sKGNvbnRlbnQpXG5cbiAgICB3b3Jrc3BhY2Uua2luZCA9IFwiRmlyZXN0YXJ0clRlcnJhZm9ybVdvcmtzcGFjZVBsYW5cIlxuICAgIFxuICAgIHdvcmtzcGFjZS5tZXRhZGF0YS5hbm5vdGF0aW9ucyA9IHtcbiAgICBcbiAgICAgIC4uLndvcmtzcGFjZS5tZXRhZGF0YS5hbm5vdGF0aW9ucyxcbiAgICAgIFxuICAgICAgW2NvbW1vbi5nZW5lcmljLmdldEZpcmVzdGFydHJBbm5vdGF0aW9uKFwicHVsbC1yZXF1ZXN0LXBsYW5cIildOiBwckxpbmssXG4gICAgICBcbiAgICAgIFtjb21tb24uZ2VuZXJpYy5nZXRGaXJlc3RhcnRyQW5ub3RhdGlvbihcInBsYW4tc2hhXCIpXTogc2hhLFxuICAgIFxuICAgIH1cbiAgICBcbiAgICB3b3Jrc3BhY2UubWV0YWRhdGEuYW5ub3RhdGlvbnNbXG4gICAgXG4gICAgICBjb21tb24uZ2VuZXJpYy5nZXRGaXJlc3RhcnRyQW5ub3RhdGlvbihcInBvbGljeVwiKVxuICAgIFxuICAgIF0gPSBcImRlc3Ryb3lcIlxuXG4gICAgY29uc3Qgd29ya3NwYWNlUGxhbiA9IGNvbW1vbi5pby50b1lhbWwoXG4gICAgXG4gICAgICB7Li4ud29ya3NwYWNlfSwgXG4gICAgXG4gICAgICB7IHF1b3RpbmdUeXBlOiAnXCInLCBsaW5lV2lkdGg6IC0xIH1cbiAgICBcbiAgICApXG4gICAgXG4gICAgY29uc3QgZmlsZU5hbWUgPSBwYXRoLmpvaW4oZGVzdGlueSwgcGF0aC5iYXNlbmFtZShmaWxlc1swXS5maWxlbmFtZSkpXG4gICAgXG4gICAgZnMud3JpdGVGaWxlU3luYyhmaWxlTmFtZSwgd29ya3NwYWNlUGxhbilcbiAgICBcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIEl0ZXJhdGUgb3ZlciB0aGUgc291cmNlIGZvbGRlciBhbmQgZ2V0IHRoZSBsaXN0IG9mIFRlcnJhZm9ybSB3b3Jrc3BhY2VzXG4gIGF3YWl0IGNyYXdsKHNvdXJjZSwgKCkgPT4gdHJ1ZSwgKGVudHJ5OiBzdHJpbmcsIGRhdGE6IGFueSkgPT4ge1xuXG4gICAgY29uc3QgZmlsZU5hbWUgPSBwYXRoLmpvaW4oZGVzdGlueSwgcGF0aC5iYXNlbmFtZShlbnRyeSkpXG5cbiAgICBjb25zdCB3b3Jrc3BhY2U6IGFueSA9IGNvbW1vbi5pby5mcm9tWWFtbChkYXRhKVxuXG4gICAgd29ya3NwYWNlLmtpbmQgPSBcIkZpcmVzdGFydHJUZXJyYWZvcm1Xb3Jrc3BhY2VQbGFuXCJcbiAgICB3b3Jrc3BhY2UubWV0YWRhdGEuYW5ub3RhdGlvbnMgPSB7XG4gICAgICAuLi53b3Jrc3BhY2UubWV0YWRhdGEuYW5ub3RhdGlvbnMsXG4gICAgICBbY29tbW9uLmdlbmVyaWMuZ2V0RmlyZXN0YXJ0ckFubm90YXRpb24oXCJwdWxsLXJlcXVlc3QtcGxhblwiKV06IHByTGluayxcbiAgICAgIFtjb21tb24uZ2VuZXJpYy5nZXRGaXJlc3RhcnRyQW5ub3RhdGlvbihcInBsYW4tc2hhXCIpXTogc2hhXG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHdvcmtzcGFjZVBsYW4gPSBjb21tb24uaW8udG9ZYW1sKHtcbiAgICAgIC4uLndvcmtzcGFjZVxuICAgIH0sIHsgcXVvdGluZ1R5cGU6ICdcIicsIGxpbmVXaWR0aDogLTEgfSlcblxuICAgIGZzLndyaXRlRmlsZVN5bmMoZmlsZU5hbWUsIHdvcmtzcGFjZVBsYW4pXG5cbiAgfSlcblxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkTGFzdFN0YXRlQW5kTGFzdENsYWltQW5ub3RhdGlvbnMoXG4gIGZpbGVQYXRoOiBzdHJpbmcsIGxhc3RTdGF0ZVBSTGluazogc3RyaW5nLCBsYXN0Q2xhaW1QUkxpbms6IHN0cmluZ1xuKSB7XG5cbiAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBzb3VyY2UgZm9sZGVyIGFuZCBnZXQgdGhlIGxpc3Qgb2YgVGVycmFmb3JtIHdvcmtzcGFjZXNcblxuICBjb25zdCB3b3Jrc3BhY2U6IGFueSA9IGNvbW1vbi5pby5mcm9tWWFtbChmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsIFwidXRmLThcIikpO1xuXG4gIGNvbnN0IHN0YXRlTGlua0FzQXJyYXk6IHN0cmluZ1tdID0gbGFzdFN0YXRlUFJMaW5rLnNwbGl0KFwiL1wiKTtcbiAgY29uc3Qgc3RhdGVBbm5vdGF0aW9uVmFsdWU6IHN0cmluZyA9IGAke3N0YXRlTGlua0FzQXJyYXlbM119LyR7c3RhdGVMaW5rQXNBcnJheVs0XX0jJHtzdGF0ZUxpbmtBc0FycmF5WzZdfWBcblxuICBjb25zdCBjbGFpbUxpbmtBc0FycmF5OiBzdHJpbmdbXSA9IGxhc3RDbGFpbVBSTGluay5zcGxpdChcIi9cIik7XG4gIGNvbnN0IGNsYWltQW5ub3RhdGlvblZhbHVlOiBzdHJpbmcgPSBgJHtjbGFpbUxpbmtBc0FycmF5WzNdfS8ke2NsYWltTGlua0FzQXJyYXlbNF19IyR7Y2xhaW1MaW5rQXNBcnJheVs2XX1gXG5cbiAgd29ya3NwYWNlLm1ldGFkYXRhLmFubm90YXRpb25zID0ge1xuICAgIC4uLndvcmtzcGFjZS5tZXRhZGF0YS5hbm5vdGF0aW9ucyxcbiAgICBbY29tbW9uLmdlbmVyaWMuZ2V0RmlyZXN0YXJ0ckFubm90YXRpb24oXCJsYXN0LXN0YXRlLXByXCIpXTogc3RhdGVBbm5vdGF0aW9uVmFsdWUsXG4gICAgW2NvbW1vbi5nZW5lcmljLmdldEZpcmVzdGFydHJBbm5vdGF0aW9uKFwibGFzdC1jbGFpbS1wclwiKV06IGNsYWltQW5ub3RhdGlvblZhbHVlXG4gIH1cblxuICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBjb21tb24uaW8udG9ZYW1sKFxuICAgIHsgLi4ud29ya3NwYWNlIH0sIHsgcXVvdGluZ1R5cGU6ICdcIicsIGxpbmVXaWR0aDogLTEgfVxuICApKVxuXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZSZW5kZXJDbGFpbXMoXG5cbiAgY2F0YWxvZ1Njb3BlOiBDb25zdHJ1Y3QsXG5cbiAgZmlyZXN0YXJ0clNjb3BlOiBDb25zdHJ1Y3QsXG5cbiAgZGF0YToge1xuXG4gICAgcmVuZGVyQ2xhaW1zOiBSZW5kZXJDbGFpbXMsXG5cbiAgICBjcnM6IGFueSxcblxuICAgIHJlbmFtZXM/OiBJUmVuYW1lUmVzdWx0W11cblxuICB9LFxuXG4pOiBQcm9taXNlPFJlbmRlcmVkQ3JNYXA+IHtcblxuICBjb25zdCByZXN1bHQ6IFJlbmRlcmVkQ3JNYXAgPSB7fVxuXG4gIGNvbnN0IHsgcmVuZGVyQ2xhaW1zLCBjcnMgfSA9IGRhdGFcblxuICBjb25zdCBzb3J0ZWRLaW5kcyA9IHNvcnRLaW5kcyhbXCJVc2VyQ2xhaW1cIiwgXCJHcm91cENsYWltXCIsIFwiQ29tcG9uZW50Q2xhaW1cIiwgXCJEb21haW5DbGFpbVwiLCBcIlN5c3RlbUNsYWltXCIsIFwiVEZXb3Jrc3BhY2VDbGFpbVwiLCBcIkFyZ29EZXBsb3lDbGFpbVwiXSwgcmVuZGVyQ2xhaW1zKVxuXG4gIGZvciAoY29uc3QgcmVuZGVyQ2xhaW1zIG9mIHNvcnRlZEtpbmRzKSB7XG5cbiAgICBmb3IgKGNvbnN0IGNsYWltS2V5IG9mIE9iamVjdC5rZXlzKHJlbmRlckNsYWltcykpIHtcblxuICAgICAgY29uc3QgY2xhaW0gPSByZW5kZXJDbGFpbXNbY2xhaW1LZXkgYXMgUmVuZGVyQ2xhaW1LZXldLmNsYWltXG5cbiAgICAgIGNvbnN0IGNvbmZpZ3VyZWRQcm92aWRlciA9IGdldENvbmZpZ3VyZWRQcm92aWRlcigpLnRvU3RyaW5nKClcblxuICAgICAgbGV0IHByb3ZpZGVycyA9IE9iamVjdC5rZXlzKGNsYWltLnByb3ZpZGVycylcblxuICAgICAgaWYoY29uZmlndXJlZFByb3ZpZGVyICE9IEFsbG93ZWRQcm92aWRlcnMuYWxsLnRvU3RyaW5nKCkpe1xuXG4gICAgICAgIHByb3ZpZGVycyA9IHByb3ZpZGVycy5maWx0ZXIoXG5cbiAgICAgICAgICAocHJvdmlkZXI6IHN0cmluZykgPT4gcHJvdmlkZXIgPT09IGNvbmZpZ3VyZWRQcm92aWRlclxuXG4gICAgICAgIClcblxuICAgICAgfVxuXG5cbiAgICAgIGNvbnN0IHByZXZpb3VzQ1IgPSBnZXRQcmV2aW91c0NSZnJvbUNsYWltKGNsYWltLCBjcnMpXG5cbiAgICAgIGNvbnN0IHBhdGNoZXMgPSBhd2FpdCBleHRyYWN0UGF0Y2hlcyhyZW5kZXJDbGFpbXNbY2xhaW1LZXkgYXMgUmVuZGVyQ2xhaW1LZXldLCBwcmV2aW91c0NSKVxuXG4gICAgICBpZiAoIXByZXZpb3VzQ1IpIHtcblxuICAgICAgICBsb2coYE5vIENSIGZvdW5kIGZvciBjbGFpbSAke2NsYWltS2V5fSwgaXQgd2lsbCBiZSByZW5kZXJlZCBmcm9tIHNjcmF0Y2hgKVxuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtmaXJlc3RhcnRyRW50aXR5LCBleHRyYUNoYXJ0cywgY2F0YWxvZ0VudGl0eX0gID0gYXdhaXQgcmVuZGVyQ2xhaW0oXG5cbiAgICAgICAgY2F0YWxvZ1Njb3BlLFxuXG4gICAgICAgIGZpcmVzdGFydHJTY29wZSxcblxuICAgICAgICBjbGFpbSxcblxuICAgICAgICBwYXRjaGVzLFxuXG4gICAgICAgIHByZXZpb3VzQ1IsXG5cbiAgICAgIClcblxuICAgICAgaWYoY2F0YWxvZ0VudGl0eSkge1xuXG4gICAgICAgIHJlc3VsdFtgJHtjYXRhbG9nRW50aXR5LmtpbmR9LSR7Y2F0YWxvZ0VudGl0eS5tZXRhZGF0YS5uYW1lfWBdID0gY2F0YWxvZ0VudGl0eS50b0pzb24oKVxuICAgICAgXG4gICAgICB9XG5cbiAgICAgIC8qKlxuXG4gICAgICAqIElmIHRoZXJlIGlzIG5vIHByb3ZpZGVyIGRvbid0IHN0b3JlIHRoZSBDUiBpbiB0aGUgbWFwXG5cbiAgICAgICovXG5cbiAgICAgIGlmICghZmlyZXN0YXJ0ckVudGl0eSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGZpcmVzdGFydHJFbnRpdHlKc29uID0gZmlyZXN0YXJ0ckVudGl0eS50b0pzb24oKVxuXG4gICAgICBzZXRSZW5kZXJlZENsYWltKGNsYWltLCBmaXJlc3RhcnRyRW50aXR5SnNvbilcblxuICAgICAgZm9yKGNvbnN0IGV4dHJhQ2hhcnQgb2YgZXh0cmFDaGFydHMpe1xuXG4gICAgICAgIGNvbnN0IHtjbGFpbSwgY2hhcnR9ID0gZXh0cmFDaGFydFxuXG4gICAgICAgIHNldFJlbmRlcmVkQ2xhaW0oY2xhaW0sIGNoYXJ0LnRvSnNvbigpKVxuXG4gICAgICAgIHJlc3VsdFtgJHtjaGFydC5raW5kfS0ke2NoYXJ0Lm1ldGFkYXRhLm5hbWV9YF0gPSBjaGFydC50b0pzb24oKVxuXG4gICAgICB9XG5cbiAgICAgIGlmKCFmaXJlc3RhcnRyRW50aXR5SnNvbi5tZXRhZGF0YS5hbm5vdGF0aW9ucyB8fCAhZmlyZXN0YXJ0ckVudGl0eUpzb24ubWV0YWRhdGEubmFtZSkgdGhyb3cgZmlyZXN0YXJ0ckVudGl0eUpzb25cblxuICAgICAgcmVzdWx0W2Ake2ZpcmVzdGFydHJFbnRpdHkua2luZH0tJHtmaXJlc3RhcnRyRW50aXR5SnNvbi5tZXRhZGF0YS5uYW1lfWBdID0gZmlyZXN0YXJ0ckVudGl0eUpzb25cblxuICAgIH1cblxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxuXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RQYXRjaGVzKFxuXG4gIGNsYWltVG9SZW5kZXJEYXRhOiBSZW5kZXJDbGFpbURhdGEsIHByZXZpb3VzQ1I6IGFueVxuXG4pOiBQcm9taXNlPElDdXN0b21SZXNvdXJjZVBhdGNoW10+IHtcblxuICBsZXQgdG90YWxQYXRjaGVzOiBJQ3VzdG9tUmVzb3VyY2VQYXRjaFtdID0gW11cblxuXG4gIGZvciAoY29uc3Qgbm9ybWFsaXplciBvZiBjbGFpbVRvUmVuZGVyRGF0YS5ub3JtYWxpemVycykge1xuXG4gICAgY29uc3QgcGF0Y2hlcyA9IGF3YWl0IG5vcm1hbGl6ZXIucGF0Y2hlcyhjbGFpbVRvUmVuZGVyRGF0YVtcImNsYWltXCJdLCBwcmV2aW91c0NSKVxuXG4gICAgdG90YWxQYXRjaGVzID0gdG90YWxQYXRjaGVzLmNvbmNhdChwYXRjaGVzKS5mbGF0KClcblxuICB9XG5cbiAgZm9yIChjb25zdCBpbml0aWFsaXplciBvZiBjbGFpbVRvUmVuZGVyRGF0YS5pbml0aWFsaXplcnMpIHtcblxuICAgIGNvbnN0IHBhdGNoZXMgPSBhd2FpdCBpbml0aWFsaXplci5wYXRjaGVzKGNsYWltVG9SZW5kZXJEYXRhW1wiY2xhaW1cIl0sIHByZXZpb3VzQ1IpXG5cbiAgICB0b3RhbFBhdGNoZXMgPSB0b3RhbFBhdGNoZXMuY29uY2F0KHBhdGNoZXMpLmZsYXQoKVxuXG4gIH1cblxuICBmb3IgKGNvbnN0IG92ZXJyaWRlciBvZiBjbGFpbVRvUmVuZGVyRGF0YS5vdmVycmlkZXMpIHtcblxuICAgIGNvbnN0IHBhdGNoZXMgPSBhd2FpdCBvdmVycmlkZXIucGF0Y2hlcyhjbGFpbVRvUmVuZGVyRGF0YVtcImNsYWltXCJdLCBwcmV2aW91c0NSKVxuXG4gICAgdG90YWxQYXRjaGVzID0gdG90YWxQYXRjaGVzLmNvbmNhdChwYXRjaGVzKS5mbGF0KClcblxuICB9XG5cblxuICBpZiAoY2xhaW1Ub1JlbmRlckRhdGEuY2xhaW0ua2luZCA9PT0gXCJDb21wb25lbnRDbGFpbVwiKSB7XG5cbiAgICB0b3RhbFBhdGNoZXMgPSB0b3RhbFBhdGNoZXMuY29uY2F0KChhd2FpdCBnZW5lcmF0ZUZlYXR1cmVzUGF0Y2hlcyhjbGFpbVRvUmVuZGVyRGF0YS5jbGFpbSkpKS5mbGF0KClcblxuICB9XG5cblxuICBmb3IgKGNvbnN0IGdsb2JhbCBvZiBjbGFpbVRvUmVuZGVyRGF0YS5nbG9iYWxzKSB7XG5cbiAgICBjb25zdCBwYXRjaGVzID0gYXdhaXQgZ2xvYmFsLnBhdGNoZXMoY2xhaW1Ub1JlbmRlckRhdGEuY2xhaW0sIHByZXZpb3VzQ1IpXG5cbiAgICB0b3RhbFBhdGNoZXMgPSB0b3RhbFBhdGNoZXMuY29uY2F0KHBhdGNoZXMpLmZsYXQoKVxuXG4gIH1cblxuICByZXR1cm4gdG90YWxQYXRjaGVzXG5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUmVuZGVyQ2xhaW1SZXN1bHQge1xuICBjYXRhbG9nRW50aXR5PzogQXBpT2JqZWN0O1xuICBmaXJlc3RhcnRyRW50aXR5PzogQXBpT2JqZWN0O1xuICBleHRyYUNoYXJ0czogeyBjbGFpbToge2tpbmQ6IHN0cmluZywgbmFtZTogc3RyaW5nfSwgY2hhcnQ6IEFwaU9iamVjdH1bXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVuZGVyQ2xhaW0oXG5cbiAgY2F0YWxvZ1Njb3BlOiBDb25zdHJ1Y3QsXG5cbiAgZmlyZXN0YXJ0clNjb3BlOiBDb25zdHJ1Y3QsXG5cbiAgY2xhaW06IGFueSxcblxuICBwYXRjaGVzOiBJQ3VzdG9tUmVzb3VyY2VQYXRjaFtdLFxuXG4gIHByZXZpb3VzQ1I6IGFueSB8IG51bGwgPSBudWxsXG5cbiAgKTogUHJvbWlzZTxJUmVuZGVyQ2xhaW1SZXN1bHQ+IHtcblxuICBsZXQgY2F0YWxvZ0VudGl0eTogQmFzZUNoYXJ0IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBsZXQgZmlyZXN0YXJ0ckVudGl0eTogQmFzZUNoYXJ0IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGNoYXJ0SWQgPSBgJHtjbGFpbS5raW5kfS0ke2NsYWltLm5hbWV9YC50b0xvd2VyQ2FzZSgpO1xuXG4gIGxldCBmaXJlc3RhcnRySWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGlmIChwcmV2aW91c0NSKSB7XG5cbiAgICBmaXJlc3RhcnRySWQgPSBwcmV2aW91c0NSPy5zcGVjPy5maXJlc3RhcnRyPy50ZlN0YXRlS2V5IHx8IG51bGw7XG5cbiAgfVxuXG4gIGNvbnN0IHJlbmRlclBhdGNoZXMgPSBwYXRjaGVzLmZpbHRlcigocGF0Y2g6IGFueSkgPT4gIXBhdGNoLmlzUG9zdFBhdGNoKVxuICBjb25zdCBwb3N0UGF0Y2hlcyA9IHBhdGNoZXMuZmlsdGVyKChwYXRjaDphbnkpID0+IHBhdGNoLmlzUG9zdFBhdGNoKVxuXG4gIGNvbnN0IHByb3ZpZGVyID0gZ2V0Q29uZmlndXJlZFByb3ZpZGVyKClcblxuICBzd2l0Y2ggKGNsYWltLmtpbmQpIHtcblxuICAgIGNhc2UgXCJEb21haW5DbGFpbVwiOlxuXG4gICAgICBjYXRhbG9nRW50aXR5ID0gbmV3IGNoYXJ0cy5kZWZhdWx0LkNhdGFsb2dEb21haW5DaGFydChcbiAgICAgICAgY2F0YWxvZ1Njb3BlLCBcbiAgICAgICAgYGNhdGFsb2ctJHtjaGFydElkfWAsIFxuICAgICAgICBmaXJlc3RhcnRySWQsIFxuICAgICAgICBjbGFpbSwgXG4gICAgICAgIHJlbmRlclBhdGNoZXNcbiAgICAgICk7XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIlN5c3RlbUNsYWltXCI6XG5cbiAgICAgIGNhdGFsb2dFbnRpdHkgPSBuZXcgY2hhcnRzLmRlZmF1bHQuQ2F0YWxvZ1N5c3RlbUNoYXJ0KFxuICAgICAgICBjYXRhbG9nU2NvcGUsIFxuICAgICAgICBgY2F0YWxvZy0ke2NoYXJ0SWR9YCwgXG4gICAgICAgIGZpcmVzdGFydHJJZCwgXG4gICAgICAgIGNsYWltLCBcbiAgICAgICAgcmVuZGVyUGF0Y2hlc1xuICAgICAgKTtcblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiR3JvdXBDbGFpbVwiOlxuXG4gICAgICBjYXRhbG9nRW50aXR5ID0gbmV3IGNoYXJ0cy5kZWZhdWx0LkNhdGFsb2dHcm91cENoYXJ0KGNhdGFsb2dTY29wZSwgYGNhdGFsb2ctJHtjaGFydElkfWAsIGZpcmVzdGFydHJJZCwgY2xhaW0sIHJlbmRlclBhdGNoZXMpO1xuXG4gICAgICBpZiAoY2xhaW0ucHJvdmlkZXJzLmdpdGh1YiAmJiAocHJvdmlkZXIgPT09IEFsbG93ZWRQcm92aWRlcnMuZ2l0aHViIHx8IHByb3ZpZGVyID09PSBBbGxvd2VkUHJvdmlkZXJzLmFsbCkpIHtcblxuICAgICAgICBmaXJlc3RhcnRyRW50aXR5ID0gbmV3IGNoYXJ0cy5kZWZhdWx0LkdpdGh1Ykdyb3VwQ2hhcnQoXG4gICAgICAgICAgZmlyZXN0YXJ0clNjb3BlLFxuICAgICAgICAgIGBnaXRodWItJHtjaGFydElkfWAsXG4gICAgICAgICAgZmlyZXN0YXJ0cklkLFxuICAgICAgICAgIGNsYWltLFxuICAgICAgICAgIHJlbmRlclBhdGNoZXNcbiAgICAgICAgKTtcblxuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgXCJVc2VyQ2xhaW1cIjpcblxuICAgICAgY2F0YWxvZ0VudGl0eSA9IG5ldyBjaGFydHMuZGVmYXVsdC5DYXRhbG9nVXNlckNoYXJ0KGNhdGFsb2dTY29wZSwgY2hhcnRJZCwgZmlyZXN0YXJ0cklkLCBjbGFpbSwgcmVuZGVyUGF0Y2hlcyk7XG5cbiAgICAgIGlmIChjbGFpbS5wcm92aWRlcnMuZ2l0aHViICYmIChwcm92aWRlciA9PT0gQWxsb3dlZFByb3ZpZGVycy5naXRodWIgfHwgcHJvdmlkZXIgPT09IEFsbG93ZWRQcm92aWRlcnMuYWxsKSkge1xuXG4gICAgICAgIGZpcmVzdGFydHJFbnRpdHkgPSBuZXcgY2hhcnRzLmRlZmF1bHQuR2l0aHViTWVtYmVyc2hpcENoYXJ0KFxuICAgICAgICAgIGZpcmVzdGFydHJTY29wZSxcbiAgICAgICAgICBgZ2l0aHViLSR7Y2hhcnRJZH1gLFxuICAgICAgICAgIGZpcmVzdGFydHJJZCxcbiAgICAgICAgICBjbGFpbSxcbiAgICAgICAgICByZW5kZXJQYXRjaGVzXG4gICAgICAgICk7XG5cbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiQ29tcG9uZW50Q2xhaW1cIjpcblxuICAgICAgaWYgKGNsYWltLnByb3ZpZGVycy5naXRodWIgJiYgKHByb3ZpZGVyID09PSBBbGxvd2VkUHJvdmlkZXJzLmdpdGh1YiB8fCBwcm92aWRlciA9PT0gQWxsb3dlZFByb3ZpZGVycy5hbGwpKSB7XG5cbiAgICAgICAgZmlyZXN0YXJ0ckVudGl0eSA9IG5ldyBjaGFydHMuZGVmYXVsdC5HaXRodWJSZXBvc2l0b3J5Q2hhcnQoXG4gICAgICAgICAgZmlyZXN0YXJ0clNjb3BlLFxuICAgICAgICAgIGBnaXRodWItJHtjaGFydElkfWAsXG4gICAgICAgICAgZmlyZXN0YXJ0cklkLFxuICAgICAgICAgIGNsYWltLFxuICAgICAgICAgIHJlbmRlclBhdGNoZXNcbiAgICAgICAgKTtcblxuICAgICAgfVxuICAgICAgY2F0YWxvZ0VudGl0eSA9IG5ldyBjaGFydHMuZGVmYXVsdC5DYXRhbG9nQ29tcG9uZW50Q2hhcnQoXG4gICAgICAgIGNhdGFsb2dTY29wZSwgY2hhcnRJZCwgZmlyZXN0YXJ0cklkLCBjbGFpbSwgcmVuZGVyUGF0Y2hlc1xuICAgICAgKTtcblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiVEZXb3Jrc3BhY2VDbGFpbVwiOlxuXG4gICAgICBpZiAoY2xhaW0ucHJvdmlkZXJzLnRlcnJhZm9ybSAmJiAocHJvdmlkZXIgPT09IEFsbG93ZWRQcm92aWRlcnMudGVycmFmb3JtIHx8IHByb3ZpZGVyID09PSBBbGxvd2VkUHJvdmlkZXJzLmFsbCkpIHtcblxuICAgICAgICBmaXJlc3RhcnRyRW50aXR5ID0gbmV3IGNoYXJ0cy5kZWZhdWx0LlRGV29ya3NwYWNlQ2hhcnQoXG4gICAgICAgICAgZmlyZXN0YXJ0clNjb3BlLCBcbiAgICAgICAgICBgdGVycmFmb3JtLSR7Y2hhcnRJZH1gLCBcbiAgICAgICAgICBmaXJlc3RhcnRySWQsXG4gICAgICAgICAgY2xhaW0sXG4gICAgICAgICAgcmVuZGVyUGF0Y2hlc1xuICAgICAgICApO1xuXG4gICAgICB9XG4gICAgICBjYXRhbG9nRW50aXR5ID0gbmV3IGNoYXJ0cy5kZWZhdWx0LkNhdGFsb2dURldvcmtzcGFjZUNoYXJ0KFxuICAgICAgICBjYXRhbG9nU2NvcGUsIGNoYXJ0SWQsIGZpcmVzdGFydHJJZCwgY2xhaW0sIHJlbmRlclBhdGNoZXNcbiAgICAgICk7XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIkFyZ29EZXBsb3lDbGFpbVwiOlxuXG4gICAgICBpZiAoY2xhaW0ucHJvdmlkZXJzLmFyZ29jZCAmJiAocHJvdmlkZXIgPT09IEFsbG93ZWRQcm92aWRlcnMuYXJnb2NkIHx8IHByb3ZpZGVyID09PSBBbGxvd2VkUHJvdmlkZXJzLmFsbCkpIHtcblxuICAgICAgICBmaXJlc3RhcnRyRW50aXR5ID0gbmV3IGNoYXJ0cy5kZWZhdWx0LkFyZ29EZXBsb3lDaGFydChcbiAgICAgICAgICBmaXJlc3RhcnRyU2NvcGUsIFxuICAgICAgICAgIGBhcmdvY2QtJHtjaGFydElkfWAsIFxuICAgICAgICAgIGZpcmVzdGFydHJJZCxcbiAgICAgICAgICBjbGFpbSxcbiAgICAgICAgICByZW5kZXJQYXRjaGVzXG4gICAgICAgICk7XG5cbiAgICAgIH1cbiAgICAgIFxuICAgICAgY2F0YWxvZ0VudGl0eSA9IG5ldyBjaGFydHMuZGVmYXVsdC5DYXRhbG9nQXJnb0RlcGxveUNoYXJ0KFxuICAgICAgICBjYXRhbG9nU2NvcGUsIGNoYXJ0SWQsIGZpcmVzdGFydHJJZCwgY2xhaW0sIHJlbmRlclBhdGNoZXNcbiAgICAgICk7XG5cbiAgICAgIGJyZWFrO1xuXG5cbiAgICBkZWZhdWx0OlxuXG4gICAgICBjb25zb2xlLmVycm9yKGBVbmtub3duIGNsYWltIGtpbmQ6ICR7Y2xhaW0ua2luZH1gKTtcblxuICAgICAgYnJlYWs7XG4gIH1cblxuICAvKipcbiAgICogVGhlcmUgaXMgdGhlIHBvc3NpYmlsaXR5IHRvIG9ubHkgcmVuZGVyIHRoZSBjYXRhbG9nIGVudGl0eSwgYnV0IG5vdCB0aGUgb3RoZXIgd2F5IGFyb3VuZFxuICAgKi9cbiAgaWYgKCFjYXRhbG9nRW50aXR5KSB7XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byByZW5kZXIgY2xhaW0gJHtjbGFpbS5raW5kfS0ke2NsYWltLm5hbWV9YCk7XG5cbiAgfVxuXG4gIC8qXG4gICAqXG4gICAqIFJlbmRlciBwaGFzZVxuICAgKlxuICAgKi9cbiAgY29uc3QgW2NhdGFsb2dDaGFydCwgZmlyZXN0YXJ0ckVudGl0eUNoYXJ0XSA9IGF3YWl0IFByb21pc2UuYWxsKFxuXG4gICAgW1xuICAgICAgcHJvdmlkZXIgPT09IEFsbG93ZWRQcm92aWRlcnMuYWxsID8gY2F0YWxvZ0VudGl0eS5yZW5kZXIoKSA6IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpLFxuXG4gICAgICBmaXJlc3RhcnRyRW50aXR5Py5yZW5kZXIoKSxcblxuICAgIF1cblxuICApXG5cbiAgLypcbiAgICpcbiAgICogUG9zdCByZW5kZXIgcGhhc2UgKGFuZCByZXR1cm4pXG4gICAqXG4gICAqL1xuICByZXR1cm4ge1xuXG4gICAgY2F0YWxvZ0VudGl0eTogY2F0YWxvZ0NoYXJ0ID8gYXdhaXQgY2F0YWxvZ0NoYXJ0LnBvc3RSZW5kZXJlcihwb3N0UGF0Y2hlcykgOiB1bmRlZmluZWQsXG5cbiAgICBmaXJlc3RhcnRyRW50aXR5OiBhd2FpdCAoZmlyZXN0YXJ0ckVudGl0eUNoYXJ0ID8gZmlyZXN0YXJ0ckVudGl0eUNoYXJ0LnBvc3RSZW5kZXJlcihwb3N0UGF0Y2hlcykgOiB1bmRlZmluZWQpLFxuXG4gICAgZXh0cmFDaGFydHM6IGF3YWl0IGZpcmVzdGFydHJFbnRpdHk/LmV4dHJhQ2hhcnRzKCkgfHwgW11cbiAgfTtcblxufVxuXG5cblxuZnVuY3Rpb24gc29ydEtpbmRzKG9yZGVyZWRLaW5kczogc3RyaW5nW10sIGNsYWltczogUmVuZGVyQ2xhaW1zKSB7XG5cbiAgY29uc3QgcmVzdWx0OiBSZW5kZXJDbGFpbXNbXSA9IFtdXG5cbiAgZm9yIChjb25zdCBraW5kIG9mIG9yZGVyZWRLaW5kcykge1xuXG4gICAgY29uc3Qga2luZFJlbmRlckNsYWltczogYW55ID0gc29ydFJlbmRlckNsYWltc0J5S2luZChjbGFpbXMsIFtraW5kXSlcblxuICAgIHJlc3VsdC5wdXNoKGtpbmRSZW5kZXJDbGFpbXMpXG5cbiAgfVxuXG4gIHJldHVybiByZXN1bHRcblxufVxuXG5cblxuXG5cbmZ1bmN0aW9uIGdldFByZXZpb3VzQ1Jmcm9tQ2xhaW0oY2xhaW06IGFueSwgcHJldmlvdXNDUnM6IGFueSkge1xuXG4gIGNvbnN0IHByZXZpb3VzQ1JzS2V5cyA9IE9iamVjdC5rZXlzKHByZXZpb3VzQ1JzKVxuXG4gIGZvcihjb25zdCBwcmV2aW91c0NSS2V5IG9mIHByZXZpb3VzQ1JzS2V5cyl7XG5cbiAgICBjb25zdCBwcmV2aW91c0NSID0gcHJldmlvdXNDUnNbcHJldmlvdXNDUktleV1cblxuICAgIGlmKGlzQ2F0YWxvZ0VudGl0eShwcmV2aW91c0NSKSkgY29udGludWVcblxuICAgIGlmKGlzRXhjbHVkZWRGcm9tUHJldmlvdXNDUihwcmV2aW91c0NSLmtpbmQpKSBjb250aW51ZVxuXG4gICAgaWYocHJldmlvdXNDUi5tZXRhZGF0YS5hbm5vdGF0aW9uc1tDTEFJTV9SRUZfQU5OT1RBVElPTl0gPT09IGAke2NsYWltLmtpbmR9LyR7Y2xhaW0ubmFtZX1gKXtcblxuICAgICAgcmV0dXJuIHByZXZpb3VzQ1JcblxuICAgIH1cblxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG5cbn1cblxuXG5mdW5jdGlvbiBpc0V4Y2x1ZGVkRnJvbVByZXZpb3VzQ1IoY3JLaW5kOiBzdHJpbmcpe1xuXG5cbiAgcmV0dXJuIFtcIkZpcmVzdGFydHJHaXRodWJSZXBvc2l0b3J5RmVhdHVyZVwiXS5pbmNsdWRlcyhjcktpbmQpXG5cblxufVxuIl19
|
|
235586
235605
|
|
|
235587
235606
|
/***/ }),
|
|
235588
235607
|
|
|
@@ -237086,7 +237105,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
237086
237105
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
237087
237106
|
};
|
|
237088
237107
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
237089
|
-
exports.commentInPR = void 0;
|
|
237108
|
+
exports.getPrFiles = exports.commentInPR = void 0;
|
|
237090
237109
|
const auth_1 = __nccwpck_require__(7745);
|
|
237091
237110
|
const debug_1 = __importDefault(__nccwpck_require__(67984));
|
|
237092
237111
|
const messageLog = (0, debug_1.default)('firestartr:github:pull_request');
|
|
@@ -237098,7 +237117,39 @@ async function commentInPR(comment, pr_number, repo, owner = "prefapp") {
|
|
|
237098
237117
|
});
|
|
237099
237118
|
}
|
|
237100
237119
|
exports.commentInPR = commentInPR;
|
|
237101
|
-
|
|
237120
|
+
async function getPrFiles(pr_number, repo, owner = "prefapp") {
|
|
237121
|
+
messageLog(`Getting PR details of PR ${pr_number} of ${owner}/${repo}`);
|
|
237122
|
+
const octokit = await (0, auth_1.getOctokitForOrg)(owner);
|
|
237123
|
+
return await octokit.rest.pulls.listFiles({
|
|
237124
|
+
owner, repo, pull_number: pr_number
|
|
237125
|
+
});
|
|
237126
|
+
}
|
|
237127
|
+
exports.getPrFiles = getPrFiles;
|
|
237128
|
+
async function filterPrBy(filter, opts) {
|
|
237129
|
+
let foundPr = null;
|
|
237130
|
+
let retries = 0;
|
|
237131
|
+
const { title, state, repo, owner, userType } = filter;
|
|
237132
|
+
const { maxRetries } = opts;
|
|
237133
|
+
const octokit = await (0, auth_1.getOctokitForOrg)(owner);
|
|
237134
|
+
while (retries < maxRetries) {
|
|
237135
|
+
const resp = await octokit.rest.pulls.list({
|
|
237136
|
+
owner,
|
|
237137
|
+
repo,
|
|
237138
|
+
state,
|
|
237139
|
+
per_page: 100,
|
|
237140
|
+
page: retries
|
|
237141
|
+
});
|
|
237142
|
+
foundPr = resp.data.find(pr => {
|
|
237143
|
+
return pr.title
|
|
237144
|
+
.includes(title) &&
|
|
237145
|
+
pr?.user?.type === userType;
|
|
237146
|
+
});
|
|
237147
|
+
if (foundPr)
|
|
237148
|
+
return foundPr;
|
|
237149
|
+
retries++;
|
|
237150
|
+
}
|
|
237151
|
+
}
|
|
237152
|
+
exports["default"] = { commentInPR, getPrFiles, filterPrBy };
|
|
237102
237153
|
|
|
237103
237154
|
|
|
237104
237155
|
/***/ }),
|
|
@@ -239100,7 +239151,7 @@ const informer_1 = __nccwpck_require__(41151);
|
|
|
239100
239151
|
const dummy_1 = __nccwpck_require__(73490);
|
|
239101
239152
|
const processItem_1 = __nccwpck_require__(84766);
|
|
239102
239153
|
const cdktf_1 = __nccwpck_require__(10805);
|
|
239103
|
-
const
|
|
239154
|
+
const process_operation_1 = __nccwpck_require__(3937);
|
|
239104
239155
|
const leader_election_1 = __nccwpck_require__(29856);
|
|
239105
239156
|
const catalog_common_1 = __importDefault(__nccwpck_require__(74100));
|
|
239106
239157
|
const processOperationPlan_1 = __nccwpck_require__(79980);
|
|
@@ -239164,7 +239215,7 @@ function getProvisionImplementation(plural) {
|
|
|
239164
239215
|
let implementation = undefined;
|
|
239165
239216
|
switch (plural) {
|
|
239166
239217
|
case "terraformworkspaces":
|
|
239167
|
-
implementation =
|
|
239218
|
+
implementation = process_operation_1.processOperation;
|
|
239168
239219
|
break;
|
|
239169
239220
|
case "terraformworkspaceplans":
|
|
239170
239221
|
implementation = processOperationPlan_1.processOperationPlan;
|
|
@@ -240193,7 +240244,7 @@ async function inform(pluralKind, item, op, lastWorkItem = null) {
|
|
|
240193
240244
|
};
|
|
240194
240245
|
return workItem;
|
|
240195
240246
|
case "onRename":
|
|
240196
|
-
if (await (0, status_1.needsProvisioningOnCreate)(
|
|
240247
|
+
if (await (0, status_1.needsProvisioningOnCreate)(item)) {
|
|
240197
240248
|
log("onRename - needsProvisioningOnCreate true %s", item.metadata.name);
|
|
240198
240249
|
workItem = {
|
|
240199
240250
|
operation: OperationType.RENAMED,
|
|
@@ -240217,7 +240268,7 @@ async function inform(pluralKind, item, op, lastWorkItem = null) {
|
|
|
240217
240268
|
return workItem;
|
|
240218
240269
|
case "onAdd":
|
|
240219
240270
|
log("onAdd %s", item.metadata.name);
|
|
240220
|
-
if (await (0, status_1.needsProvisioningOnCreate)(
|
|
240271
|
+
if (await (0, status_1.needsProvisioningOnCreate)(item)) {
|
|
240221
240272
|
workItem = {
|
|
240222
240273
|
operation: OperationType.CREATED,
|
|
240223
240274
|
item,
|
|
@@ -240734,11 +240785,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
240734
240785
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
240735
240786
|
exports.observe = void 0;
|
|
240736
240787
|
const ctl_1 = __nccwpck_require__(46679);
|
|
240737
|
-
const fast_json_patch_1 = __importDefault(__nccwpck_require__(75177));
|
|
240738
240788
|
const debug_1 = __importDefault(__nccwpck_require__(67984));
|
|
240739
240789
|
const catalog_common_1 = __importDefault(__nccwpck_require__(74100));
|
|
240740
240790
|
const log = (0, debug_1.default)('firestartr:operator:reflector');
|
|
240741
240791
|
const k8s = __importStar(__nccwpck_require__(54851));
|
|
240792
|
+
const store_1 = __nccwpck_require__(87432);
|
|
240742
240793
|
/**
|
|
240743
240794
|
* Execute the callbacks for each item in the store
|
|
240744
240795
|
* @param {string} kind - Kind to observe
|
|
@@ -240749,7 +240800,7 @@ const k8s = __importStar(__nccwpck_require__(54851));
|
|
|
240749
240800
|
* @param {Function} onRename - Function to call when an item is renamed
|
|
240750
240801
|
*/
|
|
240751
240802
|
async function observe(kind, namespace, onAdd, onChange, onDelete, _onRename) {
|
|
240752
|
-
const store = new Store(kind);
|
|
240803
|
+
const store = new store_1.Store(kind);
|
|
240753
240804
|
const { kc } = await (0, ctl_1.getConnection)();
|
|
240754
240805
|
try {
|
|
240755
240806
|
const k8sApi = kc.makeApiClient(k8s.CustomObjectsApi);
|
|
@@ -240761,29 +240812,37 @@ async function observe(kind, namespace, onAdd, onChange, onDelete, _onRename) {
|
|
|
240761
240812
|
};
|
|
240762
240813
|
const informer = k8s.makeInformer(kc, apiPaths, listFn);
|
|
240763
240814
|
informer.on('add', (obj) => {
|
|
240764
|
-
log(`informer: ADDED ${obj.metadata.name}`);
|
|
240765
240815
|
store.add(obj);
|
|
240766
|
-
|
|
240816
|
+
if (store.hasDeletionTimestamp(obj)) {
|
|
240817
|
+
log(`informer (on add): The item ${obj.metadata.name} has a deletion timestamp, marking for deletion`);
|
|
240818
|
+
store.markToDelete(obj);
|
|
240819
|
+
onDelete(obj);
|
|
240820
|
+
}
|
|
240821
|
+
else {
|
|
240822
|
+
log(`informer (on add): The item ${obj.metadata.name} has been added`);
|
|
240823
|
+
onAdd(obj);
|
|
240824
|
+
}
|
|
240767
240825
|
});
|
|
240768
240826
|
informer.on('update', (obj) => {
|
|
240769
|
-
log(`informer:
|
|
240770
|
-
if (store.getItem(obj).markedToDelete
|
|
240771
|
-
|
|
240772
|
-
|
|
240827
|
+
log(`informer (on update): The item ${obj.kind}: ${obj.metadata.name} has been updated`);
|
|
240828
|
+
if (!store.getItem(obj).markedToDelete &&
|
|
240829
|
+
store.hasDeletionTimestamp(obj) &&
|
|
240830
|
+
(store.hasBeenMarkedToDelete(obj) || store.modified(obj))) {
|
|
240831
|
+
log(`informer (on update): The item ${obj.kind}: ${obj.metadata.name} has a deletion timestamp, marking for deletion`);
|
|
240773
240832
|
store.markToDelete(obj);
|
|
240774
240833
|
onDelete(obj);
|
|
240775
240834
|
}
|
|
240776
240835
|
else if (store.modified(obj)) {
|
|
240836
|
+
log(`informer (on update): The item ${obj.kind}: ${obj.metadata.name} has been modified`);
|
|
240777
240837
|
onChange(obj);
|
|
240778
240838
|
}
|
|
240779
240839
|
});
|
|
240780
240840
|
informer.on('delete', (obj) => {
|
|
240781
|
-
log(`informer:
|
|
240841
|
+
log(`informer (on delete): The item ${obj.metadata.name} :${obj.metadata.name} has been deleted from etcd`);
|
|
240782
240842
|
store.remove(obj);
|
|
240783
240843
|
});
|
|
240784
240844
|
informer.on('error', (err) => {
|
|
240785
|
-
|
|
240786
|
-
// Restart informer after 5sec
|
|
240845
|
+
log(`informer (on error): ERROR %O`, err);
|
|
240787
240846
|
setTimeout(() => {
|
|
240788
240847
|
informer.start();
|
|
240789
240848
|
}, 5000);
|
|
@@ -240797,52 +240856,6 @@ async function observe(kind, namespace, onAdd, onChange, onDelete, _onRename) {
|
|
|
240797
240856
|
}
|
|
240798
240857
|
}
|
|
240799
240858
|
exports.observe = observe;
|
|
240800
|
-
class Store {
|
|
240801
|
-
kind;
|
|
240802
|
-
store = {};
|
|
240803
|
-
constructor(kind) {
|
|
240804
|
-
this.kind = kind;
|
|
240805
|
-
}
|
|
240806
|
-
add(item) {
|
|
240807
|
-
this.store[itemPath(this.kind, item)] = {
|
|
240808
|
-
item
|
|
240809
|
-
};
|
|
240810
|
-
}
|
|
240811
|
-
isMarkedToDelete(item) {
|
|
240812
|
-
return "deletionTimestamp" in item.metadata;
|
|
240813
|
-
}
|
|
240814
|
-
markToDelete(item) {
|
|
240815
|
-
this.store[itemPath(this.kind, item)] = {
|
|
240816
|
-
item,
|
|
240817
|
-
markedToDelete: true
|
|
240818
|
-
};
|
|
240819
|
-
}
|
|
240820
|
-
modified(item) {
|
|
240821
|
-
const oldItem = this.getItem(item).item;
|
|
240822
|
-
const patches = fast_json_patch_1.default.compare(item, oldItem);
|
|
240823
|
-
let updated = false;
|
|
240824
|
-
for (const patch of patches) {
|
|
240825
|
-
if (patch.path.match(/^\/spec/) || patch.path.match(/\/metadata.*annotations/)) {
|
|
240826
|
-
updated = true;
|
|
240827
|
-
break;
|
|
240828
|
-
}
|
|
240829
|
-
}
|
|
240830
|
-
this.store[itemPath(this.kind, item)] = {
|
|
240831
|
-
item
|
|
240832
|
-
};
|
|
240833
|
-
console.log(Object.keys(this.store));
|
|
240834
|
-
return updated;
|
|
240835
|
-
}
|
|
240836
|
-
remove(item) {
|
|
240837
|
-
delete this.store[itemPath(this.kind, item)];
|
|
240838
|
-
}
|
|
240839
|
-
getItem(item) {
|
|
240840
|
-
return this.store[itemPath(this.kind, item)];
|
|
240841
|
-
}
|
|
240842
|
-
}
|
|
240843
|
-
function itemPath(kind, item) {
|
|
240844
|
-
return `${item.metadata.namespace}/${kind}/${item.metadata.name}`;
|
|
240845
|
-
}
|
|
240846
240859
|
|
|
240847
240860
|
|
|
240848
240861
|
/***/ }),
|
|
@@ -240991,7 +241004,7 @@ const ctl_1 = __nccwpck_require__(46679);
|
|
|
240991
241004
|
const debug_1 = __importDefault(__nccwpck_require__(67984));
|
|
240992
241005
|
const log = (0, debug_1.default)('firestartr:operator:retry');
|
|
240993
241006
|
const NEXT_RETRY_SECS = 1000 * 60;
|
|
240994
|
-
const MAXRETRY =
|
|
241007
|
+
const MAXRETRY = 5;
|
|
240995
241008
|
const retryWatchers = {};
|
|
240996
241009
|
async function initRetry(enqueue) {
|
|
240997
241010
|
loop(enqueue);
|
|
@@ -241011,6 +241024,9 @@ exports.initRetry = initRetry;
|
|
|
241011
241024
|
function retry(itemPath) {
|
|
241012
241025
|
if (retryWatchers[itemPath]) {
|
|
241013
241026
|
retryWatchers[itemPath].retryCounter++;
|
|
241027
|
+
log(`đ Retrying failed for: ${itemPath}, increasing retry counter to ${retryWatchers[itemPath].retryCounter}`);
|
|
241028
|
+
log(`đ Remaining retries for ${itemPath}: ${MAXRETRY - retryWatchers[itemPath].retryCounter}`);
|
|
241029
|
+
log(`đ Next retry for ${itemPath} in ${NEXT_RETRY_SECS * retryWatchers[itemPath].retryCounter} seconds`);
|
|
241014
241030
|
retryWatchers[itemPath].retry = false;
|
|
241015
241031
|
retryWatchers[itemPath].nextRetry = setTimeout(() => {
|
|
241016
241032
|
if (itemPath in retryWatchers)
|
|
@@ -241090,67 +241106,47 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
241090
241106
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
241091
241107
|
};
|
|
241092
241108
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
241093
|
-
exports.updateTransition = exports.
|
|
241109
|
+
exports.updateTransition = exports.needsProvisioningOnCreate = void 0;
|
|
241094
241110
|
const ctl_1 = __nccwpck_require__(46679);
|
|
241095
241111
|
const debug_1 = __importDefault(__nccwpck_require__(67984));
|
|
241096
241112
|
const log = (0, debug_1.default)('firestartr:operator:status');
|
|
241097
|
-
|
|
241098
|
-
|
|
241099
|
-
|
|
241100
|
-
if (!("status" in
|
|
241101
|
-
|
|
241102
|
-
try {
|
|
241103
|
-
const errorCondition = getConditionByType(k8sItem.status.conditions, "ERROR");
|
|
241104
|
-
if (errorCondition.status === "True" &&
|
|
241105
|
-
errorCondition.observedGeneration >= k8sItem.metadata.generation) {
|
|
241106
|
-
return true;
|
|
241107
|
-
}
|
|
241108
|
-
}
|
|
241109
|
-
catch (e) {
|
|
241110
|
-
catalog_common_1.default.io.writeFunctionLog("needsProvisioningOnCreate", `Error getting error condition: ${e}`);
|
|
241111
|
-
}
|
|
241112
|
-
try {
|
|
241113
|
-
const provisionedCondition = getConditionByType(k8sItem.status.conditions, "PROVISIONED");
|
|
241114
|
-
if (provisionedCondition.status === "True" &&
|
|
241115
|
-
provisionedCondition.observedGeneration >= k8sItem.metadata.generation) {
|
|
241116
|
-
return false;
|
|
241117
|
-
}
|
|
241113
|
+
async function needsProvisioningOnCreate(cr) {
|
|
241114
|
+
const fCrLog = (cr) => `The item ${cr.kind}: ${cr.metadata.name}`;
|
|
241115
|
+
// NO STATUS
|
|
241116
|
+
if (!("status" in cr) || !("conditions" in cr.status)) {
|
|
241117
|
+
log(`${fCrLog(cr)} has no status or conditions, provisioning...`);
|
|
241118
241118
|
return true;
|
|
241119
241119
|
}
|
|
241120
|
-
|
|
241121
|
-
|
|
241122
|
-
|
|
241120
|
+
// ERROR
|
|
241121
|
+
const errCond = getConditionByType(cr.status.conditions, "ERROR");
|
|
241122
|
+
if (errCond && errCond.status === "True") {
|
|
241123
|
+
log(`${fCrLog(cr)} has an error condition, skipping provisioning...`);
|
|
241124
|
+
return false;
|
|
241123
241125
|
}
|
|
241124
|
-
|
|
241125
|
-
|
|
241126
|
-
|
|
241127
|
-
|
|
241128
|
-
|
|
241129
|
-
return true;
|
|
241130
|
-
try {
|
|
241131
|
-
const errorCondition = getConditionByType(k8sItem.status.conditions, "ERROR");
|
|
241132
|
-
if (errorCondition.status === "True" &&
|
|
241133
|
-
errorCondition.observedGeneration >= k8sItem.metadata.generation) {
|
|
241134
|
-
return true;
|
|
241135
|
-
}
|
|
241126
|
+
// PROVISIONED
|
|
241127
|
+
const provCond = getConditionByType(cr.status.conditions, "PROVISIONED");
|
|
241128
|
+
if (provCond && provCond.status === "True" && provCond.observedGeneration >= cr.metadata.generation) {
|
|
241129
|
+
log(`${fCrLog(cr)} has already been provisioned, skipping provisioning...`);
|
|
241130
|
+
return false;
|
|
241136
241131
|
}
|
|
241137
|
-
|
|
241138
|
-
|
|
241139
|
-
|
|
241140
|
-
|
|
241141
|
-
|
|
241142
|
-
return false;
|
|
241143
|
-
}
|
|
241144
|
-
const provisioningCondition = getConditionByType(k8sItem.status.conditions, "PROVISIONING");
|
|
241145
|
-
return provisioningCondition.status !== "True";
|
|
241132
|
+
// DELETED
|
|
241133
|
+
const delCond = getConditionByType(cr.status.conditions, "DELETED");
|
|
241134
|
+
if (delCond && delCond.status === "True" && delCond.observedGeneration >= cr.metadata.generation) {
|
|
241135
|
+
log(`${fCrLog(cr)} has been deleted, skipping provisioning`);
|
|
241136
|
+
return false;
|
|
241146
241137
|
}
|
|
241147
|
-
|
|
241138
|
+
// PROVISIONING
|
|
241139
|
+
const provisioningCondition = getConditionByType(cr.status.conditions, "PROVISIONING");
|
|
241140
|
+
if (provisioningCondition && provisioningCondition.status === "True") {
|
|
241141
|
+
log(`${fCrLog(cr)} is in PROVISIONING state, it was not finished, provisioning again...`);
|
|
241148
241142
|
return true;
|
|
241149
241143
|
}
|
|
241144
|
+
log(`${fCrLog(cr)} is in a not handled state, skipping provisioning...`);
|
|
241145
|
+
return false;
|
|
241150
241146
|
}
|
|
241151
|
-
exports.
|
|
241147
|
+
exports.needsProvisioningOnCreate = needsProvisioningOnCreate;
|
|
241152
241148
|
async function updateTransition(itemPath, reason, type, statusValue, message = "", updateStatusOnly = false) {
|
|
241153
|
-
log("
|
|
241149
|
+
log("Update transition for item: %s, reason: %s, type: %s, status: %s, message: %s, updateStatusOnly: %s", itemPath, reason, type, statusValue, message, updateStatusOnly);
|
|
241154
241150
|
const k8sItem = await (0, ctl_1.getItemByItemPath)(itemPath);
|
|
241155
241151
|
if (!("status" in k8sItem))
|
|
241156
241152
|
k8sItem.status = {};
|
|
@@ -241169,20 +241165,18 @@ async function updateTransition(itemPath, reason, type, statusValue, message = "
|
|
|
241169
241165
|
}
|
|
241170
241166
|
exports.updateTransition = updateTransition;
|
|
241171
241167
|
function getRelevantCondition(conditionList, type) {
|
|
241172
|
-
|
|
241173
|
-
|
|
241174
|
-
|
|
241175
|
-
|
|
241176
|
-
|
|
241177
|
-
|
|
241178
|
-
|
|
241179
|
-
|
|
241180
|
-
|
|
241181
|
-
|
|
241182
|
-
|
|
241183
|
-
|
|
241184
|
-
};
|
|
241185
|
-
}
|
|
241168
|
+
const condition = getConditionByType(conditionList, type);
|
|
241169
|
+
if (condition)
|
|
241170
|
+
return condition;
|
|
241171
|
+
return {
|
|
241172
|
+
"lastTransitionTime": new Date().toJSON(),
|
|
241173
|
+
"lastUpdateTime": new Date().toJSON(),
|
|
241174
|
+
"message": "",
|
|
241175
|
+
"observedGeneration": -1,
|
|
241176
|
+
"reason": "",
|
|
241177
|
+
"status": "",
|
|
241178
|
+
"type": type,
|
|
241179
|
+
};
|
|
241186
241180
|
}
|
|
241187
241181
|
function updateCondition(condition, reason, status, message, generation) {
|
|
241188
241182
|
condition.lastUpdateTime = new Date().toJSON();
|
|
@@ -241197,7 +241191,7 @@ function getConditionByType(conditionList, type) {
|
|
|
241197
241191
|
if (conditionList[i].type === type)
|
|
241198
241192
|
return conditionList[i];
|
|
241199
241193
|
}
|
|
241200
|
-
|
|
241194
|
+
return false;
|
|
241201
241195
|
}
|
|
241202
241196
|
function updateConditionByType(conditionList, type, newCondition) {
|
|
241203
241197
|
let typeFound = false;
|
|
@@ -241213,6 +241207,82 @@ function updateConditionByType(conditionList, type, newCondition) {
|
|
|
241213
241207
|
}
|
|
241214
241208
|
|
|
241215
241209
|
|
|
241210
|
+
/***/ }),
|
|
241211
|
+
|
|
241212
|
+
/***/ 87432:
|
|
241213
|
+
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
|
|
241214
|
+
|
|
241215
|
+
"use strict";
|
|
241216
|
+
|
|
241217
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
241218
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
241219
|
+
};
|
|
241220
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
241221
|
+
exports.itemPath = exports.Store = void 0;
|
|
241222
|
+
const fast_json_patch_1 = __importDefault(__nccwpck_require__(75177));
|
|
241223
|
+
const debug_1 = __importDefault(__nccwpck_require__(67984));
|
|
241224
|
+
const log = (0, debug_1.default)('firestartr:operator:store');
|
|
241225
|
+
class Store {
|
|
241226
|
+
kind;
|
|
241227
|
+
store = {};
|
|
241228
|
+
constructor(kind) {
|
|
241229
|
+
this.kind = kind;
|
|
241230
|
+
}
|
|
241231
|
+
add(item) {
|
|
241232
|
+
this.store[itemPath(this.kind, item)] = {
|
|
241233
|
+
item
|
|
241234
|
+
};
|
|
241235
|
+
}
|
|
241236
|
+
hasDeletionTimestamp(item) {
|
|
241237
|
+
return "deletionTimestamp" in item.metadata;
|
|
241238
|
+
}
|
|
241239
|
+
markToDelete(item) {
|
|
241240
|
+
this.store[itemPath(this.kind, item)] = {
|
|
241241
|
+
item,
|
|
241242
|
+
markedToDelete: true
|
|
241243
|
+
};
|
|
241244
|
+
}
|
|
241245
|
+
hasBeenMarkedToDelete(item) {
|
|
241246
|
+
const oldItem = this.getItem(item).item;
|
|
241247
|
+
const patches = fast_json_patch_1.default.compare(item, oldItem);
|
|
241248
|
+
let updated = false;
|
|
241249
|
+
for (const patch of patches) {
|
|
241250
|
+
if (patch.path.match(/^\/metadata\/deletionTimestamp/)) {
|
|
241251
|
+
updated = true;
|
|
241252
|
+
break;
|
|
241253
|
+
}
|
|
241254
|
+
}
|
|
241255
|
+
return updated;
|
|
241256
|
+
}
|
|
241257
|
+
modified(item) {
|
|
241258
|
+
const oldItem = this.getItem(item).item;
|
|
241259
|
+
const patches = fast_json_patch_1.default.compare(item, oldItem);
|
|
241260
|
+
let updated = false;
|
|
241261
|
+
for (const patch of patches) {
|
|
241262
|
+
if (patch.path.match(/^\/spec/) || patch.path.match(/\/metadata.*annotations/)) {
|
|
241263
|
+
updated = true;
|
|
241264
|
+
break;
|
|
241265
|
+
}
|
|
241266
|
+
}
|
|
241267
|
+
this.store[itemPath(this.kind, item)] = {
|
|
241268
|
+
item
|
|
241269
|
+
};
|
|
241270
|
+
return updated;
|
|
241271
|
+
}
|
|
241272
|
+
remove(item) {
|
|
241273
|
+
delete this.store[itemPath(this.kind, item)];
|
|
241274
|
+
}
|
|
241275
|
+
getItem(item) {
|
|
241276
|
+
return this.store[itemPath(this.kind, item)];
|
|
241277
|
+
}
|
|
241278
|
+
}
|
|
241279
|
+
exports.Store = Store;
|
|
241280
|
+
function itemPath(kind, item) {
|
|
241281
|
+
return `${item.metadata.namespace}/${kind}/${item.metadata.name}`;
|
|
241282
|
+
}
|
|
241283
|
+
exports.itemPath = itemPath;
|
|
241284
|
+
|
|
241285
|
+
|
|
241216
241286
|
/***/ }),
|
|
241217
241287
|
|
|
241218
241288
|
/***/ 74298:
|
|
@@ -241383,7 +241453,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
241383
241453
|
};
|
|
241384
241454
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
241385
241455
|
exports.buildProvisionerContext = exports.processOperationPlan = void 0;
|
|
241386
|
-
const informer_1 = __nccwpck_require__(41151);
|
|
241387
241456
|
const debug_1 = __importDefault(__nccwpck_require__(67984));
|
|
241388
241457
|
const terraform_provisioner_1 = __nccwpck_require__(6777);
|
|
241389
241458
|
const github_1 = __importDefault(__nccwpck_require__(39759));
|
|
@@ -241394,12 +241463,15 @@ const TF_PROJECTS_PATH = "/tmp/tfworkspaces";
|
|
|
241394
241463
|
function processOperationPlan(item, op, handler) {
|
|
241395
241464
|
try {
|
|
241396
241465
|
clearLocalTfProjects();
|
|
241397
|
-
|
|
241398
|
-
|
|
241399
|
-
|
|
241400
|
-
|
|
241401
|
-
|
|
241402
|
-
|
|
241466
|
+
const policy = getPolicy(item);
|
|
241467
|
+
if (policy === "observe" || policy === "apply") {
|
|
241468
|
+
return plan(item, op, handler);
|
|
241469
|
+
}
|
|
241470
|
+
else if (policy === "destroy") {
|
|
241471
|
+
return plan(item, op, handler, "plain-text", "plan-destroy");
|
|
241472
|
+
}
|
|
241473
|
+
else {
|
|
241474
|
+
return nothing(item, op, handler);
|
|
241403
241475
|
}
|
|
241404
241476
|
}
|
|
241405
241477
|
catch (e) {
|
|
@@ -241408,7 +241480,7 @@ function processOperationPlan(item, op, handler) {
|
|
|
241408
241480
|
}
|
|
241409
241481
|
}
|
|
241410
241482
|
exports.processOperationPlan = processOperationPlan;
|
|
241411
|
-
async function* nothing(item, op,
|
|
241483
|
+
async function* nothing(item, op, _handler) {
|
|
241412
241484
|
yield {
|
|
241413
241485
|
item,
|
|
241414
241486
|
reason: op,
|
|
@@ -241417,19 +241489,19 @@ async function* nothing(item, op, handler) {
|
|
|
241417
241489
|
message: "NOTHING"
|
|
241418
241490
|
};
|
|
241419
241491
|
}
|
|
241420
|
-
async function* plan(item, op, handler, format = "plain-text") {
|
|
241492
|
+
async function* plan(item, op, handler, format = "plain-text", action = "plan") {
|
|
241421
241493
|
if (format == "plain-text") {
|
|
241422
|
-
for await (const transition of doPlanPlainTextFormat(item, op, handler)) {
|
|
241494
|
+
for await (const transition of doPlanPlainTextFormat(item, op, handler, action)) {
|
|
241423
241495
|
yield transition;
|
|
241424
241496
|
}
|
|
241425
241497
|
}
|
|
241426
241498
|
else if (format == "json") {
|
|
241427
|
-
for await (const transition of doPlanJSONFormat(item, op, handler)) {
|
|
241499
|
+
for await (const transition of doPlanJSONFormat(item, op, handler, action)) {
|
|
241428
241500
|
yield transition;
|
|
241429
241501
|
}
|
|
241430
241502
|
}
|
|
241431
241503
|
}
|
|
241432
|
-
async function* doPlanPlainTextFormat(item, op, handler) {
|
|
241504
|
+
async function* doPlanPlainTextFormat(item, op, handler, action) {
|
|
241433
241505
|
try {
|
|
241434
241506
|
yield {
|
|
241435
241507
|
item,
|
|
@@ -241455,7 +241527,7 @@ async function* doPlanPlainTextFormat(item, op, handler) {
|
|
|
241455
241527
|
const deps = await handler.resolveReferences();
|
|
241456
241528
|
log('Item %s has the following dependencies: %O', item.metadata.name, deps);
|
|
241457
241529
|
const context = buildProvisionerContext(item, deps);
|
|
241458
|
-
const tfPlanOutput = await (0, terraform_provisioner_1.runTerraformProvisioner)(context,
|
|
241530
|
+
const tfPlanOutput = await (0, terraform_provisioner_1.runTerraformProvisioner)(context, action);
|
|
241459
241531
|
await publishPlan(item, tfPlanOutput);
|
|
241460
241532
|
yield {
|
|
241461
241533
|
item,
|
|
@@ -241509,7 +241581,7 @@ async function* doPlanPlainTextFormat(item, op, handler) {
|
|
|
241509
241581
|
}
|
|
241510
241582
|
}
|
|
241511
241583
|
}
|
|
241512
|
-
async function* doPlanJSONFormat(item, op, handler) {
|
|
241584
|
+
async function* doPlanJSONFormat(item, op, handler, action) {
|
|
241513
241585
|
try {
|
|
241514
241586
|
yield {
|
|
241515
241587
|
item,
|
|
@@ -241535,7 +241607,7 @@ async function* doPlanJSONFormat(item, op, handler) {
|
|
|
241535
241607
|
const deps = await handler.resolveReferences();
|
|
241536
241608
|
log('Item %s has the following dependencies: %O', item.metadata.name, deps);
|
|
241537
241609
|
const context = buildProvisionerContext(item, deps);
|
|
241538
|
-
const tfPlan = await (0, terraform_provisioner_1.runTerraformProvisioner)(context,
|
|
241610
|
+
const tfPlan = await (0, terraform_provisioner_1.runTerraformProvisioner)(context, action);
|
|
241539
241611
|
if (tfPlan.summary.hasChanges()) {
|
|
241540
241612
|
yield {
|
|
241541
241613
|
item,
|
|
@@ -241843,6 +241915,11 @@ async function publishPlan(item, planOutput) {
|
|
|
241843
241915
|
console.error(e);
|
|
241844
241916
|
}
|
|
241845
241917
|
}
|
|
241918
|
+
function getPolicy(item) {
|
|
241919
|
+
const policy = item.metadata.annotations && item.metadata.annotations["firestartr.dev/policy"];
|
|
241920
|
+
if (policy)
|
|
241921
|
+
return policy;
|
|
241922
|
+
}
|
|
241846
241923
|
|
|
241847
241924
|
|
|
241848
241925
|
/***/ }),
|
|
@@ -241941,7 +242018,7 @@ const terraform_provisioner_1 = __nccwpck_require__(6777);
|
|
|
241941
242018
|
const ctl_1 = __nccwpck_require__(46679);
|
|
241942
242019
|
const ctx_1 = __nccwpck_require__(15284);
|
|
241943
242020
|
const resolver_1 = __nccwpck_require__(31022);
|
|
241944
|
-
const
|
|
242021
|
+
const process_operation_1 = __nccwpck_require__(3937);
|
|
241945
242022
|
const cdk8s_renderer_1 = __importDefault(__nccwpck_require__(80318));
|
|
241946
242023
|
const ctl_2 = __nccwpck_require__(59018);
|
|
241947
242024
|
const debug_1 = __importDefault(__nccwpck_require__(67984));
|
|
@@ -241988,7 +242065,7 @@ async function buildContext(claim, namespace, command) {
|
|
|
241988
242065
|
};
|
|
241989
242066
|
compute["runProvision"] = async () => {
|
|
241990
242067
|
infolog("đ Running terraform process...");
|
|
241991
|
-
const data = await (0,
|
|
242068
|
+
const data = await (0, process_operation_1.buildProvisionerContext)(cr, deps);
|
|
241992
242069
|
const result = await (0, terraform_provisioner_1.runTerraformProvisioner)(data, command);
|
|
241993
242070
|
infolog("â
Terraform process finished");
|
|
241994
242071
|
return result;
|
|
@@ -242000,7 +242077,72 @@ exports.buildContext = buildContext;
|
|
|
242000
242077
|
|
|
242001
242078
|
/***/ }),
|
|
242002
242079
|
|
|
242003
|
-
/***/
|
|
242080
|
+
/***/ 31058:
|
|
242081
|
+
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
|
|
242082
|
+
|
|
242083
|
+
"use strict";
|
|
242084
|
+
|
|
242085
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
242086
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
242087
|
+
};
|
|
242088
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
242089
|
+
exports.policyAllowsOp = exports.policies = void 0;
|
|
242090
|
+
const informer_1 = __nccwpck_require__(41151);
|
|
242091
|
+
const debug_1 = __importDefault(__nccwpck_require__(67984));
|
|
242092
|
+
const debug = (0, debug_1.default)("firestartr:operator:tfworkspaces:policies");
|
|
242093
|
+
exports.policies = {
|
|
242094
|
+
"observe": [
|
|
242095
|
+
informer_1.OperationType.NOTHING
|
|
242096
|
+
],
|
|
242097
|
+
"apply": [
|
|
242098
|
+
informer_1.OperationType.UPDATED,
|
|
242099
|
+
informer_1.OperationType.CREATED,
|
|
242100
|
+
informer_1.OperationType.RENAMED,
|
|
242101
|
+
informer_1.OperationType.SYNC,
|
|
242102
|
+
informer_1.OperationType.RETRY,
|
|
242103
|
+
informer_1.OperationType.NOTHING
|
|
242104
|
+
],
|
|
242105
|
+
"create-only": [
|
|
242106
|
+
informer_1.OperationType.CREATED,
|
|
242107
|
+
informer_1.OperationType.RETRY,
|
|
242108
|
+
],
|
|
242109
|
+
"create-update-only": [
|
|
242110
|
+
informer_1.OperationType.UPDATED,
|
|
242111
|
+
informer_1.OperationType.CREATED,
|
|
242112
|
+
informer_1.OperationType.RETRY,
|
|
242113
|
+
informer_1.OperationType.RENAMED,
|
|
242114
|
+
informer_1.OperationType.SYNC,
|
|
242115
|
+
informer_1.OperationType.NOTHING
|
|
242116
|
+
],
|
|
242117
|
+
"full-control": [
|
|
242118
|
+
informer_1.OperationType.UPDATED,
|
|
242119
|
+
informer_1.OperationType.CREATED,
|
|
242120
|
+
informer_1.OperationType.RENAMED,
|
|
242121
|
+
informer_1.OperationType.SYNC,
|
|
242122
|
+
informer_1.OperationType.MARKED_TO_DELETION,
|
|
242123
|
+
informer_1.OperationType.RETRY,
|
|
242124
|
+
informer_1.OperationType.NOTHING
|
|
242125
|
+
],
|
|
242126
|
+
};
|
|
242127
|
+
function policyAllowsOp(policy, op, item) {
|
|
242128
|
+
if (op === informer_1.OperationType.RETRY.toString() && exports.policies[policy].includes(op)) {
|
|
242129
|
+
if ("deletionTimestamp" in item.metadata && "full-control" !== policy) {
|
|
242130
|
+
return false;
|
|
242131
|
+
}
|
|
242132
|
+
else {
|
|
242133
|
+
return true;
|
|
242134
|
+
}
|
|
242135
|
+
}
|
|
242136
|
+
if (!exports.policies[policy])
|
|
242137
|
+
return false;
|
|
242138
|
+
return exports.policies[policy].includes(op);
|
|
242139
|
+
}
|
|
242140
|
+
exports.policyAllowsOp = policyAllowsOp;
|
|
242141
|
+
|
|
242142
|
+
|
|
242143
|
+
/***/ }),
|
|
242144
|
+
|
|
242145
|
+
/***/ 3937:
|
|
242004
242146
|
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
|
|
242005
242147
|
|
|
242006
242148
|
"use strict";
|
|
@@ -242036,38 +242178,39 @@ exports.buildProvisionerContext = exports.processOperation = void 0;
|
|
|
242036
242178
|
const informer_1 = __nccwpck_require__(41151);
|
|
242037
242179
|
const debug_1 = __importDefault(__nccwpck_require__(67984));
|
|
242038
242180
|
const terraform_provisioner_1 = __nccwpck_require__(6777);
|
|
242039
|
-
const log = (0, debug_1.default)('firestartr:operator:terraform');
|
|
242040
|
-
const github_1 = __importDefault(__nccwpck_require__(39759));
|
|
242041
242181
|
const fs = __importStar(__nccwpck_require__(57147));
|
|
242042
242182
|
const path = __importStar(__nccwpck_require__(71017));
|
|
242043
|
-
const
|
|
242183
|
+
const user_feedback_ops_1 = __nccwpck_require__(36322);
|
|
242184
|
+
const policies_1 = __nccwpck_require__(31058);
|
|
242185
|
+
const log = (0, debug_1.default)('firestartr:operator:terraform');
|
|
242044
242186
|
const TF_PROJECTS_PATH = "/tmp/tfworkspaces";
|
|
242045
242187
|
function processOperation(item, op, handler) {
|
|
242046
242188
|
try {
|
|
242047
242189
|
clearLocalTfProjects();
|
|
242048
242190
|
const policy = getPolicy(item);
|
|
242049
|
-
if (policy === "observe" ||
|
|
242191
|
+
if (!policy || policy === "observe" || policy === "observe-only") {
|
|
242050
242192
|
return observe(item, op, handler);
|
|
242051
242193
|
}
|
|
242052
|
-
|
|
242053
|
-
|
|
242054
|
-
|
|
242055
|
-
|
|
242056
|
-
|
|
242057
|
-
|
|
242058
|
-
|
|
242059
|
-
|
|
242060
|
-
|
|
242061
|
-
|
|
242062
|
-
|
|
242063
|
-
|
|
242064
|
-
|
|
242065
|
-
|
|
242066
|
-
|
|
242067
|
-
|
|
242068
|
-
|
|
242069
|
-
|
|
242070
|
-
|
|
242194
|
+
if (!(0, policies_1.policyAllowsOp)(policy, op, item)) {
|
|
242195
|
+
return errorPolicyNotAllowsOp(item, op, policy, handler);
|
|
242196
|
+
}
|
|
242197
|
+
switch (op) {
|
|
242198
|
+
case informer_1.OperationType.UPDATED:
|
|
242199
|
+
return updated(item, op, handler);
|
|
242200
|
+
case informer_1.OperationType.CREATED:
|
|
242201
|
+
return created(item, op, handler);
|
|
242202
|
+
case informer_1.OperationType.RENAMED:
|
|
242203
|
+
return renamed(item, op, handler);
|
|
242204
|
+
case informer_1.OperationType.SYNC:
|
|
242205
|
+
return sync(item, op, handler);
|
|
242206
|
+
case informer_1.OperationType.MARKED_TO_DELETION:
|
|
242207
|
+
return markedToDeletion(item, op, handler);
|
|
242208
|
+
case informer_1.OperationType.RETRY:
|
|
242209
|
+
return retry(item, op, handler);
|
|
242210
|
+
case informer_1.OperationType.NOTHING:
|
|
242211
|
+
return nothing(item, op, handler);
|
|
242212
|
+
default:
|
|
242213
|
+
throw new Error(`Operation ${op} not supported`);
|
|
242071
242214
|
}
|
|
242072
242215
|
}
|
|
242073
242216
|
catch (e) {
|
|
@@ -242107,7 +242250,11 @@ async function* doPlanJSONFormat(item, op, handler) {
|
|
|
242107
242250
|
const deps = await handler.resolveReferences();
|
|
242108
242251
|
log('Item %s has the following dependencies: %O', item.metadata.name, deps);
|
|
242109
242252
|
const context = buildProvisionerContext(item, deps);
|
|
242110
|
-
|
|
242253
|
+
let planType = "plan-json";
|
|
242254
|
+
if ("deletionTimestamp" in item.metadata) {
|
|
242255
|
+
planType = "plan-destroy-json";
|
|
242256
|
+
}
|
|
242257
|
+
const tfPlan = await (0, terraform_provisioner_1.runTerraformProvisioner)(context, planType);
|
|
242111
242258
|
if (tfPlan.summary.hasChanges()) {
|
|
242112
242259
|
yield {
|
|
242113
242260
|
item,
|
|
@@ -242116,6 +242263,7 @@ async function* doPlanJSONFormat(item, op, handler) {
|
|
|
242116
242263
|
status: "False",
|
|
242117
242264
|
message: "Plan has changes"
|
|
242118
242265
|
};
|
|
242266
|
+
policies_1.policyAllowsOp;
|
|
242119
242267
|
yield {
|
|
242120
242268
|
item,
|
|
242121
242269
|
reason: op,
|
|
@@ -242213,7 +242361,7 @@ async function* updated(item, op, handler) {
|
|
|
242213
242361
|
}
|
|
242214
242362
|
}
|
|
242215
242363
|
async function* retry(item, op, handler) {
|
|
242216
|
-
if (
|
|
242364
|
+
if (isDestroyRetry(item)) {
|
|
242217
242365
|
for await (const transition of markedToDeletion(item, op, handler)) {
|
|
242218
242366
|
yield transition;
|
|
242219
242367
|
}
|
|
@@ -242224,6 +242372,14 @@ async function* retry(item, op, handler) {
|
|
|
242224
242372
|
}
|
|
242225
242373
|
}
|
|
242226
242374
|
}
|
|
242375
|
+
function isDestroyRetry(item) {
|
|
242376
|
+
if ("deletionTimestamp" in item.metadata) {
|
|
242377
|
+
return true;
|
|
242378
|
+
}
|
|
242379
|
+
return false;
|
|
242380
|
+
}
|
|
242381
|
+
function canDestroyRetry(item, op, handler) {
|
|
242382
|
+
}
|
|
242227
242383
|
async function* sync(item, op, handler) {
|
|
242228
242384
|
yield {
|
|
242229
242385
|
item,
|
|
@@ -242246,6 +242402,20 @@ async function* sync(item, op, handler) {
|
|
|
242246
242402
|
async function* markedToDeletion(item, op, handler) {
|
|
242247
242403
|
try {
|
|
242248
242404
|
let type = "DELETING";
|
|
242405
|
+
yield {
|
|
242406
|
+
item,
|
|
242407
|
+
reason: op,
|
|
242408
|
+
type: "PROVISIONING",
|
|
242409
|
+
status: "False",
|
|
242410
|
+
message: "markedToDeletion"
|
|
242411
|
+
};
|
|
242412
|
+
yield {
|
|
242413
|
+
item,
|
|
242414
|
+
reason: op,
|
|
242415
|
+
type: "DELETED",
|
|
242416
|
+
status: "False",
|
|
242417
|
+
message: "markedToDeletion"
|
|
242418
|
+
};
|
|
242249
242419
|
yield {
|
|
242250
242420
|
item,
|
|
242251
242421
|
reason: op,
|
|
@@ -242284,7 +242454,7 @@ async function* markedToDeletion(item, op, handler) {
|
|
|
242284
242454
|
const deps = await handler.resolveReferences();
|
|
242285
242455
|
const context = buildProvisionerContext(item, deps);
|
|
242286
242456
|
const destroyOutput = await (0, terraform_provisioner_1.runTerraformProvisioner)(context, "destroy");
|
|
242287
|
-
await
|
|
242457
|
+
await (0, user_feedback_ops_1.tryPublishDestroy)(item, destroyOutput);
|
|
242288
242458
|
yield {
|
|
242289
242459
|
item,
|
|
242290
242460
|
reason: op,
|
|
@@ -242292,6 +242462,13 @@ async function* markedToDeletion(item, op, handler) {
|
|
|
242292
242462
|
status: "False",
|
|
242293
242463
|
message: "Destroying process finished"
|
|
242294
242464
|
};
|
|
242465
|
+
yield {
|
|
242466
|
+
item,
|
|
242467
|
+
reason: op,
|
|
242468
|
+
type: "DELETED",
|
|
242469
|
+
status: "True",
|
|
242470
|
+
message: "destroyed"
|
|
242471
|
+
};
|
|
242295
242472
|
await handler.finalize(handler.pluralKind, item.metadata.namespace, item, "firestartr.dev/finalizer");
|
|
242296
242473
|
await handler.writeTerraformOutputInTfResult(item, destroyOutput);
|
|
242297
242474
|
handler.success();
|
|
@@ -242325,6 +242502,13 @@ async function* nothing(item, op, handler) {
|
|
|
242325
242502
|
*/
|
|
242326
242503
|
async function* doApply(item, op, handler) {
|
|
242327
242504
|
try {
|
|
242505
|
+
yield {
|
|
242506
|
+
item,
|
|
242507
|
+
reason: op,
|
|
242508
|
+
type: "DELETED",
|
|
242509
|
+
status: "False",
|
|
242510
|
+
message: "markedToDeletion"
|
|
242511
|
+
};
|
|
242328
242512
|
yield {
|
|
242329
242513
|
item,
|
|
242330
242514
|
reason: op,
|
|
@@ -242366,7 +242550,7 @@ async function* doApply(item, op, handler) {
|
|
|
242366
242550
|
log('Item %s has the following dependencies: %O', item.metadata.name, deps);
|
|
242367
242551
|
const context = buildProvisionerContext(item, deps);
|
|
242368
242552
|
const applyOutput = await (0, terraform_provisioner_1.runTerraformProvisioner)(context, "apply");
|
|
242369
|
-
await tryPublishApply(item, applyOutput);
|
|
242553
|
+
await (0, user_feedback_ops_1.tryPublishApply)(item, applyOutput);
|
|
242370
242554
|
const terraformOutputJson = await (0, terraform_provisioner_1.runTerraformProvisioner)(context, "output");
|
|
242371
242555
|
if (!terraformOutputJson) {
|
|
242372
242556
|
throw new Error(`Terraform output is empty for ${item.kind}/${item.metadata.name}`);
|
|
@@ -242399,7 +242583,7 @@ async function* doApply(item, op, handler) {
|
|
|
242399
242583
|
}
|
|
242400
242584
|
catch (e) {
|
|
242401
242585
|
console.error(e);
|
|
242402
|
-
await tryPublishApply(item, e);
|
|
242586
|
+
await (0, user_feedback_ops_1.tryPublishApply)(item, e);
|
|
242403
242587
|
log("Error applying item %s: %O", item.metadata.name, e);
|
|
242404
242588
|
yield {
|
|
242405
242589
|
item,
|
|
@@ -242428,6 +242612,73 @@ async function* doApply(item, op, handler) {
|
|
|
242428
242612
|
}
|
|
242429
242613
|
}
|
|
242430
242614
|
}
|
|
242615
|
+
async function* errorPolicyNotAllowsOp(item, op, policy, handler) {
|
|
242616
|
+
const fSearchAllowedPoliciesForOp = (op) => {
|
|
242617
|
+
let allowedPolicies = [];
|
|
242618
|
+
for (const [key, value] of Object.entries(policies_1.policies)) {
|
|
242619
|
+
if (value.includes(op)) {
|
|
242620
|
+
allowedPolicies.push(key);
|
|
242621
|
+
}
|
|
242622
|
+
}
|
|
242623
|
+
if (allowedPolicies.length > 0)
|
|
242624
|
+
return allowedPolicies.join(", ");
|
|
242625
|
+
return "none";
|
|
242626
|
+
};
|
|
242627
|
+
const errorMessage = `Operation ${op} not allowed by policy \`${policy}\`, to allow this operation, switch to one of the following policies: \`${fSearchAllowedPoliciesForOp(op)}\``;
|
|
242628
|
+
const reason = "POLICY CONFLICT";
|
|
242629
|
+
await (0, user_feedback_ops_1.tryPublishError)(item, reason, errorMessage);
|
|
242630
|
+
yield {
|
|
242631
|
+
item,
|
|
242632
|
+
reason: op,
|
|
242633
|
+
type: "ERROR",
|
|
242634
|
+
status: "True",
|
|
242635
|
+
message: errorMessage
|
|
242636
|
+
};
|
|
242637
|
+
yield {
|
|
242638
|
+
item,
|
|
242639
|
+
reason: op,
|
|
242640
|
+
type: "PROVISIONED",
|
|
242641
|
+
status: "False",
|
|
242642
|
+
message: errorMessage
|
|
242643
|
+
};
|
|
242644
|
+
yield {
|
|
242645
|
+
item,
|
|
242646
|
+
reason: op,
|
|
242647
|
+
type: "PROVISIONING",
|
|
242648
|
+
status: "False",
|
|
242649
|
+
message: errorMessage
|
|
242650
|
+
};
|
|
242651
|
+
yield {
|
|
242652
|
+
item,
|
|
242653
|
+
reason: op,
|
|
242654
|
+
type: "OUT_OF_SYNC",
|
|
242655
|
+
status: "False",
|
|
242656
|
+
message: errorMessage
|
|
242657
|
+
};
|
|
242658
|
+
yield {
|
|
242659
|
+
item,
|
|
242660
|
+
reason: op,
|
|
242661
|
+
type: "DELETED",
|
|
242662
|
+
status: "False",
|
|
242663
|
+
message: errorMessage
|
|
242664
|
+
};
|
|
242665
|
+
yield {
|
|
242666
|
+
item,
|
|
242667
|
+
reason: op,
|
|
242668
|
+
type: "PLANNING",
|
|
242669
|
+
status: "False",
|
|
242670
|
+
message: errorMessage
|
|
242671
|
+
};
|
|
242672
|
+
yield {
|
|
242673
|
+
item,
|
|
242674
|
+
reason: op,
|
|
242675
|
+
type: "DELETING",
|
|
242676
|
+
status: "False",
|
|
242677
|
+
message: errorMessage
|
|
242678
|
+
};
|
|
242679
|
+
await handler.writeTerraformOutputInTfResult(item, errorMessage);
|
|
242680
|
+
handler.error();
|
|
242681
|
+
}
|
|
242431
242682
|
/**
|
|
242432
242683
|
* @description Adapts the CR to the format expected by the terraform provisioner
|
|
242433
242684
|
* @param item - CR to be applied
|
|
@@ -242619,6 +242870,23 @@ function getErrorOutputMessage(cr, key, ref) {
|
|
|
242619
242870
|
throw new Error(`â Source ${cr.spec.source} not supported`);
|
|
242620
242871
|
}
|
|
242621
242872
|
}
|
|
242873
|
+
|
|
242874
|
+
|
|
242875
|
+
/***/ }),
|
|
242876
|
+
|
|
242877
|
+
/***/ 36322:
|
|
242878
|
+
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
|
|
242879
|
+
|
|
242880
|
+
"use strict";
|
|
242881
|
+
|
|
242882
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
242883
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
242884
|
+
};
|
|
242885
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
242886
|
+
exports.publishError = exports.tryPublishError = exports.publishApply = exports.tryPublishDestroy = exports.tryPublishApply = void 0;
|
|
242887
|
+
const github_1 = __importDefault(__nccwpck_require__(39759));
|
|
242888
|
+
const debug_1 = __importDefault(__nccwpck_require__(67984));
|
|
242889
|
+
const log = (0, debug_1.default)('firestartr:operator:terraform');
|
|
242622
242890
|
async function tryPublishApply(item, planOutput) {
|
|
242623
242891
|
try {
|
|
242624
242892
|
if (!("firestartr.dev/last-state-pr" in item.metadata.annotations)) {
|
|
@@ -242631,7 +242899,63 @@ async function tryPublishApply(item, planOutput) {
|
|
|
242631
242899
|
log(`Error publishing apply: ${e}`);
|
|
242632
242900
|
}
|
|
242633
242901
|
}
|
|
242902
|
+
exports.tryPublishApply = tryPublishApply;
|
|
242903
|
+
async function tryPublishDestroy(item, destroyOutput) {
|
|
242904
|
+
try {
|
|
242905
|
+
log("Trying to publish destroy");
|
|
242906
|
+
const { repo, org } = extractPrInfo(item);
|
|
242907
|
+
const lastPr = await github_1.default.pulls.filterPrBy({
|
|
242908
|
+
title: `hydrate: ${item.metadata.name}`,
|
|
242909
|
+
state: 'closed',
|
|
242910
|
+
repo,
|
|
242911
|
+
owner: org,
|
|
242912
|
+
userType: 'Bot'
|
|
242913
|
+
}, {
|
|
242914
|
+
maxRetries: 3
|
|
242915
|
+
});
|
|
242916
|
+
if (!lastPr) {
|
|
242917
|
+
log(`CR ${item.metadata.name} has no last state PR. Skipping terraform destroy publish.`);
|
|
242918
|
+
return;
|
|
242919
|
+
}
|
|
242920
|
+
const comment = `<h1>
|
|
242921
|
+
<img width="25" src="https://static-00.iconduck.com/assets.00/file-type-terraform-icon-1821x2048-mbxeegff.png"> Terraform destroy
|
|
242922
|
+
</h1>
|
|
242923
|
+
<p><b>TFWorkspace: </b>${item.metadata.name}</p>
|
|
242924
|
+
|
|
242925
|
+
<details id=github>
|
|
242926
|
+
<summary>DESTROY LOGS</summary>
|
|
242927
|
+
|
|
242928
|
+
\`\`\`shell
|
|
242929
|
+
${destroyOutput}
|
|
242930
|
+
\`\`\`
|
|
242931
|
+
</details>`;
|
|
242932
|
+
log("Publishing comment in PR number: ", lastPr.number);
|
|
242933
|
+
await github_1.default.pulls.commentInPR(comment, lastPr.number, repo, org);
|
|
242934
|
+
log("Published destroy comment in PR number: ", lastPr.number);
|
|
242935
|
+
}
|
|
242936
|
+
catch (e) {
|
|
242937
|
+
log(`Error publishing apply: ${e}`);
|
|
242938
|
+
}
|
|
242939
|
+
}
|
|
242940
|
+
exports.tryPublishDestroy = tryPublishDestroy;
|
|
242634
242941
|
async function publishApply(item, applyOutput) {
|
|
242942
|
+
const { prNumber, repo, org } = extractPrInfo(item);
|
|
242943
|
+
const comment = `<h1>
|
|
242944
|
+
<img width="25" src="https://static-00.iconduck.com/assets.00/file-type-terraform-icon-1821x2048-mbxeegff.png"> Terraform apply
|
|
242945
|
+
</h1>
|
|
242946
|
+
<p><b>TFWorkspace: </b>${item.metadata.name}</p>
|
|
242947
|
+
|
|
242948
|
+
<details id=github>
|
|
242949
|
+
<summary>APPLY LOGS</summary>
|
|
242950
|
+
|
|
242951
|
+
\`\`\`shell
|
|
242952
|
+
${applyOutput}
|
|
242953
|
+
\`\`\`
|
|
242954
|
+
</details>`;
|
|
242955
|
+
await github_1.default.pulls.commentInPR(comment, parseInt(prNumber), repo, org);
|
|
242956
|
+
}
|
|
242957
|
+
exports.publishApply = publishApply;
|
|
242958
|
+
function extractPrInfo(item) {
|
|
242635
242959
|
const prInfo = item.metadata.annotations["firestartr.dev/last-state-pr"];
|
|
242636
242960
|
const prNumber = prInfo.split("#")[1];
|
|
242637
242961
|
if (!prNumber)
|
|
@@ -242642,20 +242966,27 @@ async function publishApply(item, applyOutput) {
|
|
|
242642
242966
|
const repo = prInfo.split("#")[0].split("/")[1];
|
|
242643
242967
|
if (!repo)
|
|
242644
242968
|
throw new Error("No repo found in CR");
|
|
242645
|
-
|
|
242646
|
-
|
|
242647
|
-
|
|
242648
|
-
|
|
242649
|
-
|
|
242650
|
-
|
|
242651
|
-
|
|
242652
|
-
|
|
242653
|
-
|
|
242654
|
-
|
|
242655
|
-
|
|
242656
|
-
|
|
242969
|
+
return { prNumber, repo, org };
|
|
242970
|
+
}
|
|
242971
|
+
async function tryPublishError(item, reason, message) {
|
|
242972
|
+
try {
|
|
242973
|
+
await publishError(item, reason, message);
|
|
242974
|
+
}
|
|
242975
|
+
catch (e) {
|
|
242976
|
+
log(`Error publishing warning: ${e}`);
|
|
242977
|
+
}
|
|
242978
|
+
}
|
|
242979
|
+
exports.tryPublishError = tryPublishError;
|
|
242980
|
+
async function publishError(item, reason, message) {
|
|
242981
|
+
const { prNumber, repo, org } = extractPrInfo(item);
|
|
242982
|
+
const comment = `# â Error on claim ${item.metadata.annotations["firestartr.dev/claim-ref"].split("/")[1]}
|
|
242983
|
+
### đ Reason: ${reason}
|
|
242984
|
+
#### âšī¸ Details:
|
|
242985
|
+
${message}
|
|
242986
|
+
`;
|
|
242657
242987
|
await github_1.default.pulls.commentInPR(comment, parseInt(prNumber), repo, org);
|
|
242658
242988
|
}
|
|
242989
|
+
exports.publishError = publishError;
|
|
242659
242990
|
|
|
242660
242991
|
|
|
242661
242992
|
/***/ }),
|
|
@@ -243864,6 +244195,12 @@ async function execCommand(command, tfProject) {
|
|
|
243864
244195
|
case "apply":
|
|
243865
244196
|
await tfProject.apply();
|
|
243866
244197
|
break;
|
|
244198
|
+
case "plan-destroy":
|
|
244199
|
+
await tfProject.planDestroy("human");
|
|
244200
|
+
break;
|
|
244201
|
+
case "plan-destroy-json":
|
|
244202
|
+
await tfProject.planDestroy("json");
|
|
244203
|
+
break;
|
|
243867
244204
|
case "destroy":
|
|
243868
244205
|
await tfProject.destroy();
|
|
243869
244206
|
break;
|
|
@@ -243965,6 +244302,12 @@ class TFProjectManager {
|
|
|
243965
244302
|
this.tfOutput = null;
|
|
243966
244303
|
this.tfOutput = await (0, utils_1.plan)(this.projectPath, this.secrets, format);
|
|
243967
244304
|
}
|
|
244305
|
+
async planDestroy(format) {
|
|
244306
|
+
await this.__init();
|
|
244307
|
+
if (format == "json")
|
|
244308
|
+
this.tfOutput = null;
|
|
244309
|
+
this.tfOutput = await (0, utils_1.plan)(this.projectPath, this.secrets, format, ["plan", "-destroy"]);
|
|
244310
|
+
}
|
|
243968
244311
|
async apply() {
|
|
243969
244312
|
await this.__init();
|
|
243970
244313
|
this.tfOutput += await (0, utils_1.apply)(this.projectPath, this.secrets);
|
|
@@ -244389,8 +244732,8 @@ async function initFromModule(path, source, secrets) {
|
|
|
244389
244732
|
], secrets, []);
|
|
244390
244733
|
}
|
|
244391
244734
|
exports.initFromModule = initFromModule;
|
|
244392
|
-
async function plan(path, secrets, format) {
|
|
244393
|
-
const plan = await tfExec(path,
|
|
244735
|
+
async function plan(path, secrets, format, args = ["plan"]) {
|
|
244736
|
+
const plan = await tfExec(path, args
|
|
244394
244737
|
.concat(format == "json" ?
|
|
244395
244738
|
["-json"]
|
|
244396
244739
|
:
|