UNPKG

dkershner6-projen-awscdk-app

Version:

DKershner's preferred constructs for Projen AWS CDK Apps.

103 lines 16.7 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Node20AwsCdkApp = void 0; const clone_deep_1 = __importDefault(require("clone-deep")); const dkershner6_projen_awscdk_core_1 = require("dkershner6-projen-awscdk-core"); const dkershner6_projen_typescript_1 = require("dkershner6-projen-typescript"); const projen_1 = require("projen"); const util_1 = require("projen/lib/util"); class Node20AwsCdkApp extends projen_1.awscdk.AwsCdkTypeScriptApp { jestTransformer; publishToAwsOptions; constructor(options) { const combinedOptions = (0, util_1.deepMerge)([ (0, clone_deep_1.default)(dkershner6_projen_typescript_1.RECOMMENDED_NODE_20_PROJECT_OPTIONS), options, ]); super(combinedOptions); this.publishToAwsOptions = options.publishToAwsOptions; new dkershner6_projen_typescript_1.DKBugFixes(this); new dkershner6_projen_typescript_1.DKTasks(this); new dkershner6_projen_typescript_1.DKEslintConfig(this); this.jestTransformer = new dkershner6_projen_typescript_1.JestTransformer(this, options.jestOptions); this.eslint?.allowDevDeps(`${this.srcdir}/main.ts`); this.eslint?.allowDevDeps(`${this.srcdir}/*Stack.ts`); this.eslint?.allowDevDeps(`${this.srcdir}/*Stack/index.ts`); this.eslint?.allowDevDeps(`${this.srcdir}/stacks/**/*Stack.ts`); this.eslint?.allowDevDeps(`${this.srcdir}/stacks/**/*Stack/index.ts`); if (options.constructsVersionPinning) { this.addDeps(`constructs@${options.constructsVersion}`); } this.makeDeployAndSynthTasksNotRequireApproval(); if (this.package) { this.overridePackageTask(); } if (this.release && options.publishToAws) { const publishToAwsOptions = { ...(options.publishToAwsOptions ?? {}), deployJobStepBuilder: (builderParams) => this.buildDeployToAwsJobStep(builderParams.deployTask), defaultReleaseBranch: options.defaultReleaseBranch, publishTasks: options.publishTasks, jobConfiguration: { runsOn: options.workflowRunsOn, runsOnGroup: options.workflowRunsOnGroup, ...(options.publishToAwsOptions?.jobConfiguration ?? {}), }, workflowBootstrapSteps: options.workflowBootstrapSteps, workflowNodeVersion: options.workflowNodeVersion ?? options.maxNodeVersion ?? options.minNodeVersion ?? "20.10.0", }; new dkershner6_projen_awscdk_core_1.AwsAppPublisher(this, publishToAwsOptions); } const cleanCompileTask = this.tasks.tryFind("clean-compile") ?? this.tasks.addTask("clean-compile", { description: "Clean up the compiled output", }); cleanCompileTask.exec(`rm -rf ${this.cdkConfig.cdkout}`); } makeDeployAndSynthTasksNotRequireApproval() { const deployTask = this.tasks.tryFind("deploy"); if (deployTask) { const { exec, ...restOfTaskStep } = deployTask.steps[0]; deployTask.reset(exec, { ...restOfTaskStep, args: ["--all", "--require-approval never"], }); } const synthTask = this.tasks.tryFind("synth"); if (synthTask) { const { exec, ...restOfTaskStep } = synthTask.steps[0]; synthTask.reset(exec, { ...restOfTaskStep, args: ["--all", "--require-approval never"], }); } } overridePackageTask() { this.packageTask.reset(`mkdir -p ${this.artifactsDirectory}`); this.packageTask.exec(`cp -r ${this.cdkConfig.cdkout} ${this.artifactsDirectory}`); } buildDeployToAwsJobStep(deployTask) { const exec = deployTask.steps[0].exec; const args = deployTask.steps[0].args; return { ...(this.publishToAwsOptions?.deployJobStepConfiguration ?? {}), name: this.publishToAwsOptions?.deployJobStepConfiguration?.name ?? "Deploy to AWS", run: [ exec?.replace("cdk", `npx cdk@${this.cdkVersion}`), ...(args ?? []), `--app ${this.artifactsDirectory}/${this.cdkConfig.cdkout}`, ] .filter(Boolean) .join(" "), }; } } exports.Node20AwsCdkApp = Node20AwsCdkApp; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsNERBQW1DO0FBQ25DLGlGQUl1QztBQUN2QywrRUFPc0M7QUFDdEMsbUNBQXNDO0FBRXRDLDBDQUE0QztBQXVCNUMsTUFBYSxlQUFnQixTQUFRLGVBQU0sQ0FBQyxtQkFBbUI7SUFDM0MsZUFBZSxDQUFrQjtJQUVoQyxtQkFBbUIsQ0FBdUI7SUFFM0QsWUFBWSxPQUErQjtRQUN2QyxNQUFNLGVBQWUsR0FBRyxJQUFBLGdCQUFTLEVBQUM7WUFDOUIsSUFBQSxvQkFBUyxFQUFDLGtFQUFtQyxDQUFDO1lBQzlDLE9BQU87U0FDVixDQUFzQyxDQUFDO1FBQ3hDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUV2QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDO1FBRXZELElBQUkseUNBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQixJQUFJLHNDQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEIsSUFBSSw2Q0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSw4Q0FBZSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFdEUsSUFBSSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxVQUFVLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLFlBQVksQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sa0JBQWtCLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFN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O1FBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDakIsU0FBUyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FDOUQsQ0FBQztJQUNOLENBQUM7SUFFUyx1QkFBdUIsQ0FBQyxVQUFnQjtRQUM5QyxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN0QyxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN0QyxPQUFPO1lBQ0gsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSwwQkFBMEIsSUFBSSxFQUFFLENBQUM7WUFDL0QsSUFBSSxFQUNBLElBQUksQ0FBQyxtQkFBbUIsRUFBRSwwQkFBMEIsRUFBRSxJQUFJO2dCQUMxRCxlQUFlO1lBQ25CLEdBQUcsRUFBRTtnQkFDRCxJQUFJLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxXQUFXLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDbEQsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ2YsU0FBUyxJQUFJLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUU7YUFDOUQ7aUJBQ0ksTUFBTSxDQUFDLE9BQU8sQ0FBQztpQkFDZixJQUFJLENBQUMsR0FBRyxDQUFDO1NBQ2pCLENBQUM7SUFDTixDQUFDO0NBQ0o7QUE3R0QsMENBNkdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGRlZXBDbG9uZSBmcm9tIFwiY2xvbmUtZGVlcFwiO1xuaW1wb3J0IHtcbiAgICBBd3NBcHBQdWJsaXNoZXIsXG4gICAgQXdzQXBwUHVibGlzaGVyT3B0aW9ucyxcbiAgICBQdWJsaXNoVG9Bd3NPcHRpb25zLFxufSBmcm9tIFwiZGtlcnNobmVyNi1wcm9qZW4tYXdzY2RrLWNvcmVcIjtcbmltcG9ydCB7XG4gICAgUkVDT01NRU5ERURfTk9ERV8yMF9QUk9KRUNUX09QVElPTlMsXG4gICAgREtCdWdGaXhlcyxcbiAgICBES1Rhc2tzLFxuICAgIERLRXNsaW50Q29uZmlnLFxuICAgIE5vZGUyMFR5cGVTY3JpcHRQcm9qZWN0SmVzdE9wdGlvbnMsXG4gICAgSmVzdFRyYW5zZm9ybWVyLFxufSBmcm9tIFwiZGtlcnNobmVyNi1wcm9qZW4tdHlwZXNjcmlwdFwiO1xuaW1wb3J0IHsgVGFzaywgYXdzY2RrIH0gZnJvbSBcInByb2plblwiO1xuaW1wb3J0IHsgSm9iU3RlcCB9IGZyb20gXCJwcm9qZW4vbGliL2dpdGh1Yi93b3JrZmxvd3MtbW9kZWxcIjtcbmltcG9ydCB7IGRlZXBNZXJnZSB9IGZyb20gXCJwcm9qZW4vbGliL3V0aWxcIjtcblxuZXhwb3J0IGludGVyZmFjZSBOb2RlMjBBd3NDZGtBcHBPcHRpb25zXG4gICAgZXh0ZW5kcyBhd3NjZGsuQXdzQ2RrVHlwZVNjcmlwdEFwcE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRvIHBpbiB0aGUgdmVyc2lvbiBvZiBjb25zdHJ1Y3RzIHRvIHRoZSB2ZXJzaW9uIHNwZWNpZmllZCBpbiB0aGVcbiAgICAgKiBgY29uc3RydWN0c1ZlcnNpb25gIHByb3BlcnR5LlxuICAgICAqL1xuICAgIGNvbnN0cnVjdHNWZXJzaW9uUGlubmluZz86IGJvb2xlYW47XG5cbiAgICBqZXN0T3B0aW9ucz86IE5vZGUyMFR5cGVTY3JpcHRQcm9qZWN0SmVzdE9wdGlvbnM7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIHB1Ymxpc2ggdGhpcyBBcHAgdG8gQVdTLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHB1Ymxpc2hUb0F3cz86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBQb3B1bGF0ZSBpbiBvcmRlciB0byBhZGQgYSBkZXBsb3kgdG8gQVdTIGpvYiB0byB0aGUgcmVsZWFzZSB3b3JrZmxvdy5cbiAgICAgKi9cbiAgICByZWFkb25seSBwdWJsaXNoVG9Bd3NPcHRpb25zPzogUHVibGlzaFRvQXdzT3B0aW9ucztcbn1cblxuZXhwb3J0IGNsYXNzIE5vZGUyMEF3c0Nka0FwcCBleHRlbmRzIGF3c2Nkay5Bd3NDZGtUeXBlU2NyaXB0QXBwIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgamVzdFRyYW5zZm9ybWVyOiBKZXN0VHJhbnNmb3JtZXI7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IHB1Ymxpc2hUb0F3c09wdGlvbnM/OiBQdWJsaXNoVG9Bd3NPcHRpb25zO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogTm9kZTIwQXdzQ2RrQXBwT3B0aW9ucykge1xuICAgICAgICBjb25zdCBjb21iaW5lZE9wdGlvbnMgPSBkZWVwTWVyZ2UoW1xuICAgICAgICAgICAgZGVlcENsb25lKFJFQ09NTUVOREVEX05PREVfMjBfUFJPSkVDVF9PUFRJT05TKSxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgIF0pIGFzIGF3c2Nkay5Bd3NDZGtUeXBlU2NyaXB0QXBwT3B0aW9ucztcbiAgICAgICAgc3VwZXIoY29tYmluZWRPcHRpb25zKTtcblxuICAgICAgICB0aGlzLnB1Ymxpc2hUb0F3c09wdGlvbnMgPSBvcHRpb25zLnB1Ymxpc2hUb0F3c09wdGlvbnM7XG5cbiAgICAgICAgbmV3IERLQnVnRml4ZXModGhpcyk7XG4gICAgICAgIG5ldyBES1Rhc2tzKHRoaXMpO1xuICAgICAgICBuZXcgREtFc2xpbnRDb25maWcodGhpcyk7XG4gICAgICAgIHRoaXMuamVzdFRyYW5zZm9ybWVyID0gbmV3IEplc3RUcmFuc2Zvcm1lcih0aGlzLCBvcHRpb25zLmplc3RPcHRpb25zKTtcblxuICAgICAgICB0aGlzLmVzbGludD8uYWxsb3dEZXZEZXBzKGAke3RoaXMuc3JjZGlyfS9tYWluLnRzYCk7XG4gICAgICAgIHRoaXMuZXNsaW50Py5hbGxvd0RldkRlcHMoYCR7dGhpcy5zcmNkaXJ9LypTdGFjay50c2ApO1xuICAgICAgICB0aGlzLmVzbGludD8uYWxsb3dEZXZEZXBzKGAke3RoaXMuc3JjZGlyfS8qU3RhY2svaW5kZXgudHNgKTtcbiAgICAgICAgdGhpcy5lc2xpbnQ/LmFsbG93RGV2RGVwcyhgJHt0aGlzLnNyY2Rpcn0vc3RhY2tzLyoqLypTdGFjay50c2ApO1xuICAgICAgICB0aGlzLmVzbGludD8uYWxsb3dEZXZEZXBzKGAke3RoaXMuc3JjZGlyfS9zdGFja3MvKiovKlN0YWNrL2luZGV4LnRzYCk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuY29uc3RydWN0c1ZlcnNpb25QaW5uaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmFkZERlcHMoYGNvbnN0cnVjdHNAJHtvcHRpb25zLmNvbnN0cnVjdHNWZXJzaW9ufWApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tYWtlRGVwbG95QW5kU3ludGhUYXNrc05vdFJlcXVpcmVBcHByb3ZhbCgpO1xuXG4gICAgICAgIGlmICh0aGlzLnBhY2thZ2UpIHtcbiAgICAgICAgICAgIHRoaXMub3ZlcnJpZGVQYWNrYWdlVGFzaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucmVsZWFzZSAmJiBvcHRpb25zLnB1Ymxpc2hUb0F3cykge1xuICAgICAgICAgICAgY29uc3QgcHVibGlzaFRvQXdzT3B0aW9uczogQXdzQXBwUHVibGlzaGVyT3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAuLi4ob3B0aW9ucy5wdWJsaXNoVG9Bd3NPcHRpb25zID8/IHt9KSxcbiAgICAgICAgICAgICAgICBkZXBsb3lKb2JTdGVwQnVpbGRlcjogKGJ1aWxkZXJQYXJhbXMpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnVpbGREZXBsb3lUb0F3c0pvYlN0ZXAoYnVpbGRlclBhcmFtcy5kZXBsb3lUYXNrKSxcbiAgICAgICAgICAgICAgICBkZWZhdWx0UmVsZWFzZUJyYW5jaDogb3B0aW9ucy5kZWZhdWx0UmVsZWFzZUJyYW5jaCxcbiAgICAgICAgICAgICAgICBwdWJsaXNoVGFza3M6IG9wdGlvbnMucHVibGlzaFRhc2tzLFxuICAgICAgICAgICAgICAgIGpvYkNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgcnVuc09uOiBvcHRpb25zLndvcmtmbG93UnVuc09uLFxuICAgICAgICAgICAgICAgICAgICBydW5zT25Hcm91cDogb3B0aW9ucy53b3JrZmxvd1J1bnNPbkdyb3VwLFxuICAgICAgICAgICAgICAgICAgICAuLi4ob3B0aW9ucy5wdWJsaXNoVG9Bd3NPcHRpb25zPy5qb2JDb25maWd1cmF0aW9uID8/IHt9KSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHdvcmtmbG93Qm9vdHN0cmFwU3RlcHM6IG9wdGlvbnMud29ya2Zsb3dCb290c3RyYXBTdGVwcyxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd05vZGVWZXJzaW9uOlxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLndvcmtmbG93Tm9kZVZlcnNpb24gPz9cbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5tYXhOb2RlVmVyc2lvbiA/P1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm1pbk5vZGVWZXJzaW9uID8/XG4gICAgICAgICAgICAgICAgICAgIFwiMjAuMTAuMFwiLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgbmV3IEF3c0FwcFB1Ymxpc2hlcih0aGlzLCBwdWJsaXNoVG9Bd3NPcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNsZWFuQ29tcGlsZVRhc2sgPVxuICAgICAgICAgICAgdGhpcy50YXNrcy50cnlGaW5kKFwiY2xlYW4tY29tcGlsZVwiKSA/P1xuICAgICAgICAgICAgdGhpcy50YXNrcy5hZGRUYXNrKFwiY2xlYW4tY29tcGlsZVwiLCB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiQ2xlYW4gdXAgdGhlIGNvbXBpbGVkIG91dHB1dFwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNsZWFuQ29tcGlsZVRhc2suZXhlYyhgcm0gLXJmICR7dGhpcy5jZGtDb25maWcuY2Rrb3V0fWApO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZURlcGxveUFuZFN5bnRoVGFza3NOb3RSZXF1aXJlQXBwcm92YWwoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRlcGxveVRhc2sgPSB0aGlzLnRhc2tzLnRyeUZpbmQoXCJkZXBsb3lcIik7XG4gICAgICAgIGlmIChkZXBsb3lUYXNrKSB7XG4gICAgICAgICAgICBjb25zdCB7IGV4ZWMsIC4uLnJlc3RPZlRhc2tTdGVwIH0gPSBkZXBsb3lUYXNrLnN0ZXBzWzBdO1xuICAgICAgICAgICAgZGVwbG95VGFzay5yZXNldChleGVjLCB7XG4gICAgICAgICAgICAgICAgLi4ucmVzdE9mVGFza1N0ZXAsXG4gICAgICAgICAgICAgICAgYXJnczogW1wiLS1hbGxcIiwgXCItLXJlcXVpcmUtYXBwcm92YWwgbmV2ZXJcIl0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzeW50aFRhc2sgPSB0aGlzLnRhc2tzLnRyeUZpbmQoXCJzeW50aFwiKTtcbiAgICAgICAgaWYgKHN5bnRoVGFzaykge1xuICAgICAgICAgICAgY29uc3QgeyBleGVjLCAuLi5yZXN0T2ZUYXNrU3RlcCB9ID0gc3ludGhUYXNrLnN0ZXBzWzBdO1xuICAgICAgICAgICAgc3ludGhUYXNrLnJlc2V0KGV4ZWMsIHtcbiAgICAgICAgICAgICAgICAuLi5yZXN0T2ZUYXNrU3RlcCxcbiAgICAgICAgICAgICAgICBhcmdzOiBbXCItLWFsbFwiLCBcIi0tcmVxdWlyZS1hcHByb3ZhbCBuZXZlclwiXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlUGFja2FnZVRhc2soKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGFja2FnZVRhc2sucmVzZXQoYG1rZGlyIC1wICR7dGhpcy5hcnRpZmFjdHNEaXJlY3Rvcnl9YCk7XG4gICAgICAgIHRoaXMucGFja2FnZVRhc2suZXhlYyhcbiAgICAgICAgICAgIGBjcCAtciAke3RoaXMuY2RrQ29uZmlnLmNka291dH0gJHt0aGlzLmFydGlmYWN0c0RpcmVjdG9yeX1gLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBidWlsZERlcGxveVRvQXdzSm9iU3RlcChkZXBsb3lUYXNrOiBUYXNrKTogSm9iU3RlcCB7XG4gICAgICAgIGNvbnN0IGV4ZWMgPSBkZXBsb3lUYXNrLnN0ZXBzWzBdLmV4ZWM7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBkZXBsb3lUYXNrLnN0ZXBzWzBdLmFyZ3M7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi4odGhpcy5wdWJsaXNoVG9Bd3NPcHRpb25zPy5kZXBsb3lKb2JTdGVwQ29uZmlndXJhdGlvbiA/PyB7fSksXG4gICAgICAgICAgICBuYW1lOlxuICAgICAgICAgICAgICAgIHRoaXMucHVibGlzaFRvQXdzT3B0aW9ucz8uZGVwbG95Sm9iU3RlcENvbmZpZ3VyYXRpb24/Lm5hbWUgPz9cbiAgICAgICAgICAgICAgICBcIkRlcGxveSB0byBBV1NcIixcbiAgICAgICAgICAgIHJ1bjogW1xuICAgICAgICAgICAgICAgIGV4ZWM/LnJlcGxhY2UoXCJjZGtcIiwgYG5weCBjZGtAJHt0aGlzLmNka1ZlcnNpb259YCksXG4gICAgICAgICAgICAgICAgLi4uKGFyZ3MgPz8gW10pLFxuICAgICAgICAgICAgICAgIGAtLWFwcCAke3RoaXMuYXJ0aWZhY3RzRGlyZWN0b3J5fS8ke3RoaXMuY2RrQ29uZmlnLmNka291dH1gLFxuICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgICAgICAuam9pbihcIiBcIiksXG4gICAgICAgIH07XG4gICAgfVxufVxuIl19