UNPKG

projen

Version:

CDK for software projects

159 lines • 22.5 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.AutoQueue = exports.MergeMethod = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const github_1 = require("./github"); const workflows = __importStar(require("./workflows-model")); const component_1 = require("../component"); /** * The merge method used to add the PR to the merge queue * * Behavior can be further configured in repository settings. */ var MergeMethod; (function (MergeMethod) { MergeMethod["SQUASH"] = "squash"; MergeMethod["MERGE"] = "merge"; MergeMethod["REBASE"] = "rebase"; })(MergeMethod || (exports.MergeMethod = MergeMethod = {})); /** * Automatically add pull requests to the merge queue * PRs will be merged once they pass required checks. */ class AutoQueue extends component_1.Component { static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.AutoQueue", version: "0.103.12" }; constructor(scope, options = {}) { super(scope); const workflowEngine = github_1.GitHub.of(this.project); if (!workflowEngine) { throw new Error(`Cannot add ${new.target.name} to project without GitHub enabled. Please enable GitHub for this project.`); } const labels = options.labels ?? []; const usernames = options.allowedUsernames ?? []; const conditions = []; if (labels.length > 0) { conditions.push("(" + labels .map((l) => `contains(github.event.pull_request.labels.*.name, '${l}')`) .join(" || ") + ")"); } if (usernames.length > 0) { conditions.push("(" + usernames .map((u) => `github.event.pull_request.user.login == '${u}'`) .join(" || ") + ")"); } let needsEditedEvent = false; if (options.targetBranches) { // Branch conditions, based off the 'opened' or 'edited' events. // // The current workflow will only run if the target branch is one of the intended // ones, so we only need to check if the event type is correct. needsEditedEvent = true; const isOpened = `github.event.action == 'opened'`; const isBranchChanged = `(github.event.action == 'edited' && github.event.changes.base)`; conditions.push(`(${isOpened} || ${isBranchChanged})`); } const credentials = options.projenCredentials ?? workflowEngine.projenCredentials; const mergeMethod = options.mergeMethod ?? MergeMethod.SQUASH; // The merge method is interpolated into a shell command below. Even though the // type system restricts this to `MergeMethod`, that guarantee does not hold for // consumers in other jsii languages or plain JavaScript, so validate explicitly. const validMergeMethods = Object.values(MergeMethod); if (!validMergeMethods.includes(mergeMethod)) { const allowed = Object.entries(MergeMethod) .map(([name, value]) => `MergeMethod.${name} ("${value}")`) .join(", "); throw new Error(`Invalid mergeMethod "${mergeMethod}" in AutoQueueOptions. ` + `Set 'mergeMethod' to one of: ${allowed}, or leave it unset to default to MergeMethod.SQUASH.`); } const autoQueueJob = { name: "Set AutoQueue on PR #${{ github.event.number }}", ...workflowEngine.runsOnConfig(options), permissions: { pullRequests: workflows.JobPermission.WRITE, contents: workflows.JobPermission.WRITE, }, if: conditions.length ? conditions.join(" && ") : undefined, environment: credentials.environment, steps: [ ...credentials.setupSteps, { id: "auto-queue-pr", run: `gh pr merge --auto --${mergeMethod} "$PR_NUMBER" --repo "$GH_REPO"`, env: { GH_TOKEN: credentials.tokenRef, GH_REPO: "${{ github.repository }}", PR_NUMBER: "${{ github.event.number }}", }, }, ], }; const workflow = workflowEngine.addWorkflow("auto-queue"); workflow.on({ // The 'pull request' event gives the workflow 'read-only' permissions on some // pull requests (such as the ones from dependabot) when using the `GITHUB_TOKEN` // security token. This prevents the workflow from approving these pull requests. // Github has placed this guard so as to prevent security attacks by simply opening // a pull request and triggering a workflow on a commit that was not vetted to make // unintended changes to the repository. // // Instead use the 'pull request target' event here that gives the Github workflow // 'read-write' permissions. This is safe because, this event, unlike the 'pull request' // event references the BASE commit of the pull request and not the HEAD commit. // // We only enable auto-queue when a PR is opened, reopened or moving from Draft to Ready, // or retargeted to a different branch. Specifically, if a user disables auto-queue we try very hard to avoid // accidentally re-enabling it. // // The 'edited' trigger is only used to detect base branch changes. pullRequestTarget: { types: [ "opened", "reopened", "ready_for_review", ...(needsEditedEvent ? ["edited"] : []), ], branches: options.targetBranches, }, }); workflow.addJobs({ enableAutoQueue: autoQueueJob }); } } exports.AutoQueue = AutoQueue; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by1xdWV1ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9naXRodWIvYXV0by1xdWV1ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EscUNBQWtDO0FBRWxDLDZEQUErQztBQUMvQyw0Q0FBeUM7QUFHekM7Ozs7R0FJRztBQUNILElBQVksV0FJWDtBQUpELFdBQVksV0FBVztJQUNyQixnQ0FBaUIsQ0FBQTtJQUNqQiw4QkFBZSxDQUFBO0lBQ2YsZ0NBQWlCLENBQUE7QUFDbkIsQ0FBQyxFQUpXLFdBQVcsMkJBQVgsV0FBVyxRQUl0QjtBQXNFRDs7O0dBR0c7QUFDSCxNQUFhLFNBQVUsU0FBUSxxQkFBUzs7SUFDdEMsWUFBWSxLQUFpQixFQUFFLFVBQTRCLEVBQUU7UUFDM0QsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWIsTUFBTSxjQUFjLEdBQUcsZUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQ2IsY0FDRSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQ2IsNEVBQTRFLENBQzdFLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFDcEMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixJQUFJLEVBQUUsQ0FBQztRQUVqRCxNQUFNLFVBQVUsR0FBYSxFQUFFLENBQUM7UUFDaEMsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RCLFVBQVUsQ0FBQyxJQUFJLENBQ2IsR0FBRztnQkFDRCxNQUFNO3FCQUNILEdBQUcsQ0FDRixDQUFDLENBQUMsRUFBRSxFQUFFLENBQ0osc0RBQXNELENBQUMsSUFBSSxDQUM5RDtx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eEMsRUFBRTtZQUNGLGtGQUFrRjtZQUNsRix3RkFBd0Y7WUFDeEYsZ0ZBQWdGO1lBQ2hGLEVBQUU7WUFDRix5RkFBeUY7WUFDekYsNkdBQTZHO1lBQzdHLCtCQUErQjtZQUMvQixFQUFFO1lBQ0YsbUVBQW1FO1lBQ25FLGlCQUFpQixFQUFFO2dCQUNqQixLQUFLLEVBQUU7b0JBQ0wsUUFBUTtvQkFDUixVQUFVO29CQUNWLGtCQUFrQjtvQkFDbEIsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2lCQUNqRDtnQkFDRCxRQUFRLEVBQUUsT0FBTyxDQUFDLGNBQWM7YUFDakM7U0FDRixDQUFDLENBQUM7UUFDSCxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDdEQsQ0FBQzs7QUEzSEgsOEJBNEhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IEdpdEh1YiB9IGZyb20gXCIuL2dpdGh1YlwiO1xuaW1wb3J0IHR5cGUgeyBHaXRodWJDcmVkZW50aWFscyB9IGZyb20gXCIuL2dpdGh1Yi1jcmVkZW50aWFsc1wiO1xuaW1wb3J0ICogYXMgd29ya2Zsb3dzIGZyb20gXCIuL3dvcmtmbG93cy1tb2RlbFwiO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgeyBSdW5zT25PcHRpb25zIH0gZnJvbSBcIi4uL3J1bm5lci1vcHRpb25zXCI7XG5cbi8qKlxuICogVGhlIG1lcmdlIG1ldGhvZCB1c2VkIHRvIGFkZCB0aGUgUFIgdG8gdGhlIG1lcmdlIHF1ZXVlXG4gKlxuICogQmVoYXZpb3IgY2FuIGJlIGZ1cnRoZXIgY29uZmlndXJlZCBpbiByZXBvc2l0b3J5IHNldHRpbmdzLlxuICovXG5leHBvcnQgZW51bSBNZXJnZU1ldGhvZCB7XG4gIFNRVUFTSCA9IFwic3F1YXNoXCIsXG4gIE1FUkdFID0gXCJtZXJnZVwiLFxuICBSRUJBU0UgPSBcInJlYmFzZVwiLFxufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yICdBdXRvUXVldWUnXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b1F1ZXVlT3B0aW9ucyBleHRlbmRzIFJ1bnNPbk9wdGlvbnMge1xuICAvKipcbiAgICogT25seSBwdWxsIHJlcXVlc3RzIGF1dGhvcmVkIGJ5IHRoZXNlIEdpdGh1YiB1c2VybmFtZXMgd2lsbCBoYXZlIGF1dG8tcXVldWUgZW5hYmxlZC5cbiAgICogQGRlZmF1bHQgLSBwdWxsIHJlcXVlc3RzIGZyb20gYWxsIHVzZXJzIGFyZSBlbGlnaWJsZSBmb3IgYXV0by1xdWV1aW5nXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkVXNlcm5hbWVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIE9ubHkgcHVsbCByZXF1ZXN0cyB3aXRoIG9uZSBvZiB0aGlzIGxhYmVscyB3aWxsIGhhdmUgYXV0by1xdWV1ZSBlbmFibGVkLlxuICAgKiBAZGVmYXVsdCAtIGFsbCBwdWxsIHJlcXVlc3RzIGFyZSBlbGlnaWJsZSBmb3IgYXV0by1xdWV1ZWluZ1xuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWxzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIENob29zZSBhIG1ldGhvZCBmb3IgYXV0aGVudGljYXRpbmcgd2l0aCBHaXRIdWIgdG8gZW5hYmxlIGF1dG8tcXVldWUgb24gcHVsbCByZXF1ZXN0cy5cbiAgICpcbiAgICogVGhlIHdvcmtmbG93IGNhbm5vdCB1c2UgYSBkZWZhdWx0IGdpdGh1YiB0b2tlbi4gUXVldWluZyBhIFBSXG4gICAqIHdpdGggdGhlIGRlZmF1bHQgdG9rZW4gd2lsbCBub3QgdHJpZ2dlciBhbnkgbWVyZ2UgcXVldWUgd29ya2Zsb3dzLFxuICAgKiB3aGljaCByZXN1bHRzIGluIHRoZSBQUiBqdXN0IG5vdCBnZXR0aW5nIG1lcmdlZCBhdCBhbGwuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9wcm9qZW4uaW8vZG9jcy9pbnRlZ3JhdGlvbnMvZ2l0aHViL1xuICAgKiBAZGVmYXVsdCAtIHVzZXMgY3JlZGVudGlhbHMgZnJvbSB0aGUgR2l0SHViIGNvbXBvbmVudFxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVuQ3JlZGVudGlhbHM/OiBHaXRodWJDcmVkZW50aWFscztcblxuICAvKipcbiAgICogVGhlIG1ldGhvZCB1c2VkIHRvIGFkZCB0aGUgUFIgdG8gdGhlIG1lcmdlIHF1ZXVlXG4gICAqIEFueSBicmFuY2ggcHJvdGVjdGlvbiBydWxlcyBtdXN0IGFsbG93IHRoaXMgbWVyZ2UgbWV0aG9kLlxuICAgKiBAZGVmYXVsdCBNZXJnZU1ldGhvZC5TUVVBU0hcbiAgICovXG4gIHJlYWRvbmx5IG1lcmdlTWV0aG9kPzogTWVyZ2VNZXRob2Q7XG5cbiAgLyoqXG4gICAqIFRoZSBicmFuY2ggbmFtZXMgdGhhdCB3ZSBzaG91bGQgYXV0by1xdWV1ZSBmb3JcbiAgICpcbiAgICogVGhpcyBzZXQgb2YgYnJhbmNoZXMgc2hvdWxkIGJlIGEgc3Vic2V0IG9mIGBNZXJnZVF1ZXVlT3B0aW9ucy50YXJnZXRCcmFuY2hlc2AuXG4gICAqXG4gICAqIEJlIHN1cmUgbm90IHRvIGVuYWJsZSBgYXV0b1F1ZXVlYCBmb3IgYnJhbmNoZXMgdGhhdCBkb24ndCBoYXZlIGJyYW5jaCBydWxlc1xuICAgKiB3aXRoIG1lcmdlIHJlcXVpcmVtZW50cyBzZXQgdXAsIG90aGVyd2lzZSBuZXcgUFJzIHdpbGwgYmUgbWVyZ2VkXG4gICAqIGltbWVkaWF0ZWx5IGFmdGVyIGNyZWF0aW5nIHdpdGhvdXQgYSBjaGFuY2UgZm9yIHJldmlldy5cbiAgICpcbiAgICogIyMgQXV0b21hdGljYWxseSBtZXJnaW5nIGEgc2V0IG9mIFN0YWNrZWQgUFJzXG4gICAqXG4gICAqIElmIHlvdSBzZXQgdGhpcyB0byBgWydtYWluJ11gIHlvdSBjYW4gYXV0b21hdGljYWxseSBtZXJnZSBhIHNldCBvZiBTdGFja2VkIFBSc1xuICAgKiBpbiB0aGUgcmlnaHQgb3JkZXIuIEl0IHdvcmtzIGxpa2UgdGhpczpcbiAgICpcbiAgICogLSBDcmVhdGUgUFIgIzEgZnJvbSBicmFuY2ggYGFgLCB0YXJnZXRpbmcgYG1haW5gLlxuICAgKiAtIENyZWF0ZSBQUiAjMiBmcm9tIGJyYW5jaCBgYmAsIHRhcmdldGluZyBicmFuY2ggYGFgLlxuICAgKiAtIENyZWF0ZSBQUiAjMyBmcm9tIGJyYW5jaCBgY2AsIHRhcmdldGluZyBicmFuY2ggYGJgLlxuICAgKlxuICAgKiBJbml0aWFsbHksIFBSICMxIHdpbGwgYmUgc2V0IHRvIGF1dG8tbWVyZ2UsIFBScyAjMiBhbmQgIzMgd2lsbCBub3QuXG4gICAqXG4gICAqIE9uY2UgUFIgIzEgcGFzc2VzIGFsbCBvZiBpdHMgcmVxdWlyZW1lbnRzIGl0IHdpbGwgbWVyZ2UuIFRoYXQgd2lsbCBkZWxldGVcbiAgICogYnJhbmNoIGBhYCBhbmQgY2hhbmdlICB0aGUgdGFyZ2V0IGJyYW5jaCBvZiBQUiAjMiBjaGFuZ2UgdG8gYG1haW5gLiBBdCB0aGF0XG4gICAqIHBvaW50LCBhdXRvLXF1ZXVlaW5nIHdpbGwgc3dpdGNoIG9uIGZvciBQUiAjMiBhbmQgaXQgZ2V0cyBtZXJnZWQsIGV0Yy5cbiAgICpcbiAgICogPiBbIUlNUE9SVEFOVF1cbiAgICogPiBUaGlzIGNvbXBvbmVudCB3aWxsIG5ldmVyIGRpc2FibGUgQXV0b01lcmdlLCBvbmx5IGVuYWJsZSBpdC4gU28gaWYgYSBQUiBpc1xuICAgKiA+IGluaXRpYWxseSB0YXJnZXRlZCBhdCBvbmUgb2YgdGhlIGJyYW5jaGVzIGluIHRoaXMgbGlzdCwgYW5kIHRoZW5cbiAgICogPiBzdWJzZXF1ZW50bHkgcmV0YXJnZXRlZCB0byBhbm90aGVyIGJyYW5jaCwgKkF1dG9NZXJnZSBpcyBub3RcbiAgICogPiBhdXRvbWF0aWNhbGx5IHR1cm5lZCBvZmYqLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0QnJhbmNoZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBBdXRvbWF0aWNhbGx5IGFkZCBwdWxsIHJlcXVlc3RzIHRvIHRoZSBtZXJnZSBxdWV1ZVxuICogUFJzIHdpbGwgYmUgbWVyZ2VkIG9uY2UgdGhleSBwYXNzIHJlcXVpcmVkIGNoZWNrcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEF1dG9RdWV1ZSBleHRlbmRzIENvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBJQ29uc3RydWN0LCBvcHRpb25zOiBBdXRvUXVldWVPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihzY29wZSk7XG5cbiAgICBjb25zdCB3b3JrZmxvd0VuZ2luZSA9IEdpdEh1Yi5vZih0aGlzLnByb2plY3QpO1xuICAgIGlmICghd29ya2Zsb3dFbmdpbmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBhZGQgJHtcbiAgICAgICAgICBuZXcudGFyZ2V0Lm5hbWVcbiAgICAgICAgfSB0byBwcm9qZWN0IHdpdGhvdXQgR2l0SHViIGVuYWJsZWQuIFBsZWFzZSBlbmFibGUgR2l0SHViIGZvciB0aGlzIHByb2plY3QuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgbGFiZWxzID0gb3B0aW9ucy5sYWJlbHMgPz8gW107XG4gICAgY29uc3QgdXNlcm5hbWVzID0gb3B0aW9ucy5hbGxvd2VkVXNlcm5hbWVzID8/IFtdO1xuXG4gICAgY29uc3QgY29uZGl0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAobGFiZWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChcbiAgICAgICAgXCIoXCIgK1xuICAgICAgICAgIGxhYmVsc1xuICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgKGwpID0+XG4gICAgICAgICAgICAgICAgYGNvbnRhaW5zKGdpdGh1Yi5ldmVudC5wdWxsX3JlcXVlc3QubGFiZWxzLioubmFtZSwgJyR7bH0nKWAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuam9pbihcIiB8fCBcIikgK1xuICAgICAgICAgIFwiKVwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHVzZXJuYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25kaXRpb25zLnB1c2goXG4gICAgICAgIFwiKFwiICtcbiAgICAgICAgICB1c2VybmFtZXNcbiAgICAgICAgICAgIC5tYXAoKHUpID0+IGBnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LnVzZXIubG9naW4gPT0gJyR7dX0nYClcbiAgICAgICAgICAgIC5qb2luKFwiIHx8IFwiKSArXG4gICAgICAgICAgXCIpXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCBuZWVkc0VkaXRlZEV2ZW50ID0gZmFsc2U7XG4gICAgaWYgKG9wdGlvbnMudGFyZ2V0QnJhbmNoZXMpIHtcbiAgICAgIC8vIEJyYW5jaCBjb25kaXRpb25zLCBiYXNlZCBvZmYgdGhlICdvcGVuZWQnIG9yICdlZGl0ZWQnIGV2ZW50cy5cbiAgICAgIC8vXG4gICAgICAvLyBUaGUgY3VycmVudCB3b3JrZmxvdyB3aWxsIG9ubHkgcnVuIGlmIHRoZSB0YXJnZXQgYnJhbmNoIGlzIG9uZSBvZiB0aGUgaW50ZW5kZWRcbiAgICAgIC8vIG9uZXMsIHNvIHdlIG9ubHkgbmVlZCB0byBjaGVjayBpZiB0aGUgZXZlbnQgdHlwZSBpcyBjb3JyZWN0LlxuICAgICAgbmVlZHNFZGl0ZWRFdmVudCA9IHRydWU7XG5cbiAgICAgIGNvbnN0IGlzT3BlbmVkID0gYGdpdGh1Yi5ldmVudC5hY3Rpb24gPT0gJ29wZW5lZCdgO1xuICAgICAgY29uc3QgaXNCcmFuY2hDaGFuZ2VkID0gYChnaXRodWIuZXZlbnQuYWN0aW9uID09ICdlZGl0ZWQnICYmIGdpdGh1Yi5ldmVudC5jaGFuZ2VzLmJhc2UpYDtcblxuICAgICAgY29uZGl0aW9ucy5wdXNoKGAoJHtpc09wZW5lZH0gfHwgJHtpc0JyYW5jaENoYW5nZWR9KWApO1xuICAgIH1cblxuICAgIGNvbnN0IGNyZWRlbnRpYWxzID1cbiAgICAgIG9wdGlvbnMucHJvamVuQ3JlZGVudGlhbHMgPz8gd29ya2Zsb3dFbmdpbmUucHJvamVuQ3JlZGVudGlhbHM7XG4gICAgY29uc3QgbWVyZ2VNZXRob2QgPSBvcHRpb25zLm1lcmdlTWV0aG9kID8/IE1lcmdlTWV0aG9kLlNRVUFTSDtcblxuICAgIC8vIFRoZSBtZXJnZSBtZXRob2QgaXMgaW50ZXJwb2xhdGVkIGludG8gYSBzaGVsbCBjb21tYW5kIGJlbG93LiBFdmVuIHRob3VnaCB0aGVcbiAgICAvLyB0eXBlIHN5c3RlbSByZXN0cmljdHMgdGhpcyB0byBgTWVyZ2VNZXRob2RgLCB0aGF0IGd1YXJhbnRlZSBkb2VzIG5vdCBob2xkIGZvclxuICAgIC8vIGNvbnN1bWVycyBpbiBvdGhlciBqc2lpIGxhbmd1YWdlcyBvciBwbGFpbiBKYXZhU2NyaXB0LCBzbyB2YWxpZGF0ZSBleHBsaWNpdGx5LlxuICAgIGNvbnN0IHZhbGlkTWVyZ2VNZXRob2RzID0gT2JqZWN0LnZhbHVlcyhNZXJnZU1ldGhvZCk7XG4gICAgaWYgKCF2YWxpZE1lcmdlTWV0aG9kcy5pbmNsdWRlcyhtZXJnZU1ldGhvZCkpIHtcbiAgICAgIGNvbnN0IGFsbG93ZWQgPSBPYmplY3QuZW50cmllcyhNZXJnZU1ldGhvZClcbiAgICAgICAgLm1hcCgoW25hbWUsIHZhbHVlXSkgPT4gYE1lcmdlTWV0aG9kLiR7bmFtZX0gKFwiJHt2YWx1ZX1cIilgKVxuICAgICAgICAuam9pbihcIiwgXCIpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBtZXJnZU1ldGhvZCBcIiR7bWVyZ2VNZXRob2R9XCIgaW4gQXV0b1F1ZXVlT3B0aW9ucy4gYCArXG4gICAgICAgICAgYFNldCAnbWVyZ2VNZXRob2QnIHRvIG9uZSBvZjogJHthbGxvd2VkfSwgb3IgbGVhdmUgaXQgdW5zZXQgdG8gZGVmYXVsdCB0byBNZXJnZU1ldGhvZC5TUVVBU0guYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgYXV0b1F1ZXVlSm9iOiB3b3JrZmxvd3MuSm9iID0ge1xuICAgICAgbmFtZTogXCJTZXQgQXV0b1F1ZXVlIG9uIFBSICMke3sgZ2l0aHViLmV2ZW50Lm51bWJlciB9fVwiLFxuICAgICAgLi4ud29ya2Zsb3dFbmdpbmUucnVuc09uQ29uZmlnKG9wdGlvbnMpLFxuICAgICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgcHVsbFJlcXVlc3RzOiB3b3JrZmxvd3MuSm9iUGVybWlzc2lvbi5XUklURSxcbiAgICAgICAgY29udGVudHM6IHdvcmtmbG93cy5Kb2JQZXJtaXNzaW9uLldSSVRFLFxuICAgICAgfSxcbiAgICAgIGlmOiBjb25kaXRpb25zLmxlbmd0aCA/IGNvbmRpdGlvbnMuam9pbihcIiAmJiBcIikgOiB1bmRlZmluZWQsXG4gICAgICBlbnZpcm9ubWVudDogY3JlZGVudGlhbHMuZW52aXJvbm1lbnQsXG4gICAgICBzdGVwczogW1xuICAgICAgICAuLi5jcmVkZW50aWFscy5zZXR1cFN0ZXBzLFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6IFwiYXV0by1xdWV1ZS1wclwiLFxuICAgICAgICAgIHJ1bjogYGdoIHByIG1lcmdlIC0tYXV0byAtLSR7bWVyZ2VNZXRob2R9IFwiJFBSX05VTUJFUlwiIC0tcmVwbyBcIiRHSF9SRVBPXCJgLFxuICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgR0hfVE9LRU46IGNyZWRlbnRpYWxzLnRva2VuUmVmLFxuICAgICAgICAgICAgR0hfUkVQTzogXCIke3sgZ2l0aHViLnJlcG9zaXRvcnkgfX1cIixcbiAgICAgICAgICAgIFBSX05VTUJFUjogXCIke3sgZ2l0aHViLmV2ZW50Lm51bWJlciB9fVwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG5cbiAgICBjb25zdCB3b3JrZmxvdyA9IHdvcmtmbG93RW5naW5lLmFkZFdvcmtmbG93KFwiYXV0by1xdWV1ZVwiKTtcbiAgICB3b3JrZmxvdy5vbih7XG4gICAgICAvLyBUaGUgJ3B1bGwgcmVxdWVzdCcgZXZlbnQgZ2l2ZXMgdGhlIHdvcmtmbG93ICdyZWFkLW9ubHknIHBlcm1pc3Npb25zIG9uIHNvbWVcbiAgICAgIC8vIHB1bGwgcmVxdWVzdHMgKHN1Y2ggYXMgdGhlIG9uZXMgZnJvbSBkZXBlbmRhYm90KSB3aGVuIHVzaW5nIHRoZSBgR0lUSFVCX1RPS0VOYFxuICAgICAgLy8gc2VjdXJpdHkgdG9rZW4uIFRoaXMgcHJldmVudHMgdGhlIHdvcmtmbG93IGZyb20gYXBwcm92aW5nIHRoZXNlIHB1bGwgcmVxdWVzdHMuXG4gICAgICAvLyBHaXRodWIgaGFzIHBsYWNlZCB0aGlzIGd1YXJkIHNvIGFzIHRvIHByZXZlbnQgc2VjdXJpdHkgYXR0YWNrcyBieSBzaW1wbHkgb3BlbmluZ1xuICAgICAgLy8gYSBwdWxsIHJlcXVlc3QgYW5kIHRyaWdnZXJpbmcgYSB3b3JrZmxvdyBvbiBhIGNvbW1pdCB0aGF0IHdhcyBub3QgdmV0dGVkIHRvIG1ha2VcbiAgICAgIC8vIHVuaW50ZW5kZWQgY2hhbmdlcyB0byB0aGUgcmVwb3NpdG9yeS5cbiAgICAgIC8vXG4gICAgICAvLyBJbnN0ZWFkIHVzZSB0aGUgJ3B1bGwgcmVxdWVzdCB0YXJnZXQnIGV2ZW50IGhlcmUgdGhhdCBnaXZlcyB0aGUgR2l0aHViIHdvcmtmbG93XG4gICAgICAvLyAncmVhZC13cml0ZScgcGVybWlzc2lvbnMuIFRoaXMgaXMgc2FmZSBiZWNhdXNlLCB0aGlzIGV2ZW50LCB1bmxpa2UgdGhlICdwdWxsIHJlcXVlc3QnXG4gICAgICAvLyBldmVudCByZWZlcmVuY2VzIHRoZSBCQVNFIGNvbW1pdCBvZiB0aGUgcHVsbCByZXF1ZXN0IGFuZCBub3QgdGhlIEhFQUQgY29tbWl0LlxuICAgICAgLy9cbiAgICAgIC8vIFdlIG9ubHkgZW5hYmxlIGF1dG8tcXVldWUgd2hlbiBhIFBSIGlzIG9wZW5lZCwgcmVvcGVuZWQgb3IgbW92aW5nIGZyb20gRHJhZnQgdG8gUmVhZHksXG4gICAgICAvLyBvciByZXRhcmdldGVkIHRvIGEgZGlmZmVyZW50IGJyYW5jaC4gU3BlY2lmaWNhbGx5LCBpZiBhIHVzZXIgZGlzYWJsZXMgYXV0by1xdWV1ZSB3ZSB0cnkgdmVyeSBoYXJkIHRvIGF2b2lkXG4gICAgICAvLyBhY2NpZGVudGFsbHkgcmUtZW5hYmxpbmcgaXQuXG4gICAgICAvL1xuICAgICAgLy8gVGhlICdlZGl0ZWQnIHRyaWdnZXIgaXMgb25seSB1c2VkIHRvIGRldGVjdCBiYXNlIGJyYW5jaCBjaGFuZ2VzLlxuICAgICAgcHVsbFJlcXVlc3RUYXJnZXQ6IHtcbiAgICAgICAgdHlwZXM6IFtcbiAgICAgICAgICBcIm9wZW5lZFwiLFxuICAgICAgICAgIFwicmVvcGVuZWRcIixcbiAgICAgICAgICBcInJlYWR5X2Zvcl9yZXZpZXdcIixcbiAgICAgICAgICAuLi4obmVlZHNFZGl0ZWRFdmVudCA/IFtcImVkaXRlZFwiIGFzIGNvbnN0XSA6IFtdKSxcbiAgICAgICAgXSxcbiAgICAgICAgYnJhbmNoZXM6IG9wdGlvbnMudGFyZ2V0QnJhbmNoZXMsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHdvcmtmbG93LmFkZEpvYnMoeyBlbmFibGVBdXRvUXVldWU6IGF1dG9RdWV1ZUpvYiB9KTtcbiAgfVxufVxuIl19