@jjrawlins/cdk-diff-pr-github-action 0.0.1-beta → 0.0.1
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/.jsii +475 -33
- package/.mergify.yml +102 -0
- package/API.md +351 -11
- package/README.md +223 -39
- package/lib/CdkDiffIamTemplate.d.ts +3 -1
- package/lib/CdkDiffIamTemplate.js +10 -5
- package/lib/CdkDiffStackWorkflow.d.ts +2 -2
- package/lib/CdkDiffStackWorkflow.js +19 -20
- package/lib/CdkDriftDetectionWorkflow.d.ts +32 -0
- package/lib/CdkDriftDetectionWorkflow.js +281 -0
- package/lib/CdkDriftIamTemplate.d.ts +10 -0
- package/lib/CdkDriftIamTemplate.js +77 -0
- package/lib/bin/cdk-changeset-script.js +3 -3
- package/lib/bin/cdk-drift-detection-script.d.ts +15 -0
- package/lib/bin/cdk-drift-detection-script.js +196 -0
- package/lib/bin/detect-drift.js +162 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +3 -1
- package/package.json +7 -2
- package/sonar-project.properties +17 -0
- package/.junie/guidelines.md +0 -62
- package/.yalc/@jjrawlins/cdk-diff-pr-github-action/.jsii +0 -3917
- package/.yalc/@jjrawlins/cdk-diff-pr-github-action/.junie/guidelines.md +0 -62
- package/.yalc/@jjrawlins/cdk-diff-pr-github-action/.tool-versions +0 -3
- package/.yalc/@jjrawlins/cdk-diff-pr-github-action/API.md +0 -276
- package/.yalc/@jjrawlins/cdk-diff-pr-github-action/LICENSE +0 -202
- package/.yalc/@jjrawlins/cdk-diff-pr-github-action/README.md +0 -146
- package/.yalc/@jjrawlins/cdk-diff-pr-github-action/lib/CdkDiffIamTemplate.d.ts +0 -8
- package/.yalc/@jjrawlins/cdk-diff-pr-github-action/lib/CdkDiffIamTemplate.js +0 -96
- package/.yalc/@jjrawlins/cdk-diff-pr-github-action/lib/CdkDiffStackWorkflow.d.ts +0 -22
- package/.yalc/@jjrawlins/cdk-diff-pr-github-action/lib/CdkDiffStackWorkflow.js +0 -144
- package/.yalc/@jjrawlins/cdk-diff-pr-github-action/lib/bin/cdk-changeset-script.d.ts +0 -9
- package/.yalc/@jjrawlins/cdk-diff-pr-github-action/lib/bin/cdk-changeset-script.js +0 -256
- package/.yalc/@jjrawlins/cdk-diff-pr-github-action/lib/bin/describe-cfn-changeset.js +0 -204
- package/.yalc/@jjrawlins/cdk-diff-pr-github-action/lib/index.d.ts +0 -2
- package/.yalc/@jjrawlins/cdk-diff-pr-github-action/lib/index.js +0 -19
- package/.yalc/@jjrawlins/cdk-diff-pr-github-action/package.json +0 -137
- package/.yalc/@jjrawlins/cdk-diff-pr-github-action/yalc.lock +0 -10
- package/.yalc/@jjrawlins/cdk-diff-pr-github-action/yalc.sig +0 -1
- package/lib/bin/describe-cfn-changeset.d.ts +0 -1
- package/lib/bin/describe-cfn-changeset.js +0 -204
- package/yalc.lock +0 -10
- /package/{.yalc/@jjrawlins/cdk-diff-pr-github-action/lib/bin/describe-cfn-changeset.d.ts → lib/bin/detect-drift.d.ts} +0 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface Stack {
|
|
2
|
+
readonly stackName: string;
|
|
3
|
+
readonly driftDetectionRoleToAssumeRegion: string;
|
|
4
|
+
readonly driftDetectionRoleToAssumeArn: string;
|
|
5
|
+
readonly failOnDrift?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface CdkDriftDetectionWorkflowProps {
|
|
8
|
+
readonly scriptOutputPath?: string;
|
|
9
|
+
readonly project: any;
|
|
10
|
+
readonly workflowName?: string;
|
|
11
|
+
readonly schedule?: string;
|
|
12
|
+
readonly createIssues?: boolean;
|
|
13
|
+
readonly oidcRoleArn: string;
|
|
14
|
+
readonly oidcRegion: string;
|
|
15
|
+
readonly stacks: Stack[];
|
|
16
|
+
readonly nodeVersion?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Optional hook to append additional GitHub Actions steps after drift detection per stack.
|
|
19
|
+
* You can supply a static array of steps, or a factory that receives context and returns steps.
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* Optional additional GitHub Action steps to run after drift detection for each stack.
|
|
23
|
+
* These steps run after results are uploaded for each stack. You can include
|
|
24
|
+
* any notifications you like (e.g., Slack). Provide explicit inputs (e.g., payload/markdown)
|
|
25
|
+
* directly in your step without relying on a pre-generated payload.
|
|
26
|
+
*/
|
|
27
|
+
readonly postGitHubSteps?: any;
|
|
28
|
+
}
|
|
29
|
+
export declare class CdkDriftDetectionWorkflow {
|
|
30
|
+
private static scriptCreated;
|
|
31
|
+
constructor(props: CdkDriftDetectionWorkflowProps);
|
|
32
|
+
}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.CdkDriftDetectionWorkflow = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
const github_1 = require("projen/lib/github");
|
|
7
|
+
const workflows_model_1 = require("projen/lib/github/workflows-model");
|
|
8
|
+
const cdk_drift_detection_script_1 = require("./bin/cdk-drift-detection-script");
|
|
9
|
+
const githubActionsAwsCredentialsVersion = 'v5';
|
|
10
|
+
const githubActionsCheckoutVersion = 'v5';
|
|
11
|
+
const githubActionsSetupNodeVersion = 'v5';
|
|
12
|
+
const githubActionsUploadArtifactVersion = 'v4';
|
|
13
|
+
const githubActionsDownloadArtifactVersion = 'v5';
|
|
14
|
+
const githubActionsGithubScriptVersion = 'v8';
|
|
15
|
+
class CdkDriftDetectionWorkflow {
|
|
16
|
+
constructor(props) {
|
|
17
|
+
const name = props.workflowName ?? 'drift-detection';
|
|
18
|
+
const fileName = toKebabCase(name) + '.yml';
|
|
19
|
+
const nodeVersion = props.nodeVersion ?? '24.x';
|
|
20
|
+
const createIssues = props.createIssues ?? true;
|
|
21
|
+
const project = props.project;
|
|
22
|
+
const scriptOutputPath = props.scriptOutputPath ?? '.github/workflows/scripts/detect-drift.ts';
|
|
23
|
+
// Only create the drift detection script once to avoid collisions
|
|
24
|
+
if (!CdkDriftDetectionWorkflow.scriptCreated) {
|
|
25
|
+
new cdk_drift_detection_script_1.CdkDriftDetectionScript({
|
|
26
|
+
project: props.project,
|
|
27
|
+
outputPath: scriptOutputPath,
|
|
28
|
+
});
|
|
29
|
+
CdkDriftDetectionWorkflow.scriptCreated = true;
|
|
30
|
+
}
|
|
31
|
+
const gh = project.github ?? new github_1.GitHub(project);
|
|
32
|
+
const workflow = new github_1.GithubWorkflow(gh, name, { fileName });
|
|
33
|
+
// triggers: schedule + manual dispatch with stack choice
|
|
34
|
+
const stackChoices = ['all', ...props.stacks.map((s) => s.stackName)];
|
|
35
|
+
workflow.on({
|
|
36
|
+
schedule: props.schedule ? [{ cron: props.schedule }] : undefined,
|
|
37
|
+
workflowDispatch: {
|
|
38
|
+
inputs: {
|
|
39
|
+
stack: {
|
|
40
|
+
description: "Stack to check for drift ('all' to run every stack)",
|
|
41
|
+
required: false,
|
|
42
|
+
type: 'choice',
|
|
43
|
+
options: stackChoices,
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
// One job per stack
|
|
49
|
+
const jobs = {};
|
|
50
|
+
for (const stack of props.stacks) {
|
|
51
|
+
const sanitizedStackName = toKebabCase(toGithubJobId(stack.stackName));
|
|
52
|
+
const originalStackName = stack.stackName;
|
|
53
|
+
const jobId = `drift-${sanitizedStackName}`;
|
|
54
|
+
const resultsFile = `drift-results-${sanitizedStackName}.json`;
|
|
55
|
+
const innerCond = "github.event_name == 'schedule' || !github.event.inputs.stack || github.event.inputs.stack == 'all' || github.event.inputs.stack == '" + sanitizedStackName + "' || github.event.inputs.stack == '" + originalStackName + "'";
|
|
56
|
+
const condExpr = '${{ ' + innerCond + ' }}';
|
|
57
|
+
const notCondExpr = '${{ !(' + innerCond + ') }}';
|
|
58
|
+
const rawPost = props.postGitHubSteps;
|
|
59
|
+
const postSteps = typeof rawPost === 'function' ? rawPost({ stack: sanitizedStackName }) : (rawPost ?? []);
|
|
60
|
+
jobs[jobId] = {
|
|
61
|
+
name: `Drift Detection - ${sanitizedStackName}`,
|
|
62
|
+
runsOn: ['ubuntu-latest'],
|
|
63
|
+
permissions: {
|
|
64
|
+
contents: workflows_model_1.JobPermission.READ,
|
|
65
|
+
idToken: workflows_model_1.JobPermission.WRITE,
|
|
66
|
+
issues: workflows_model_1.JobPermission.WRITE,
|
|
67
|
+
},
|
|
68
|
+
env: {
|
|
69
|
+
AWS_DEFAULT_REGION: stack.driftDetectionRoleToAssumeRegion,
|
|
70
|
+
AWS_REGION: stack.driftDetectionRoleToAssumeRegion,
|
|
71
|
+
DRIFT_DETECTION_OUTPUT: resultsFile,
|
|
72
|
+
STACK_ID: sanitizedStackName,
|
|
73
|
+
STACK_NAME: stack.stackName,
|
|
74
|
+
},
|
|
75
|
+
// No job-level condition; we gate steps so the job always completes and summary can run
|
|
76
|
+
steps: [
|
|
77
|
+
{ name: 'Skip (stack not selected)', if: notCondExpr, run: 'echo "Stack not selected; skipping drift detection for this job."' },
|
|
78
|
+
{ name: 'Checkout', if: condExpr, uses: `actions/checkout@${githubActionsCheckoutVersion}` },
|
|
79
|
+
{
|
|
80
|
+
name: 'Setup Node.js',
|
|
81
|
+
if: condExpr,
|
|
82
|
+
uses: `actions/setup-node@${githubActionsSetupNodeVersion}`,
|
|
83
|
+
with: { 'node-version': nodeVersion },
|
|
84
|
+
},
|
|
85
|
+
{ name: 'Install dependencies', if: condExpr, run: 'yarn install --frozen-lockfile || npm ci', env: { GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}' } },
|
|
86
|
+
{
|
|
87
|
+
name: 'AWS Credentials',
|
|
88
|
+
if: condExpr,
|
|
89
|
+
id: 'creds',
|
|
90
|
+
uses: `aws-actions/configure-aws-credentials@${githubActionsAwsCredentialsVersion}`,
|
|
91
|
+
with: {
|
|
92
|
+
'role-to-assume': props.oidcRoleArn,
|
|
93
|
+
'role-session-name': 'GitHubAction',
|
|
94
|
+
'aws-region': props.oidcRegion,
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
name: 'Assume Drift Detection Role',
|
|
99
|
+
if: condExpr,
|
|
100
|
+
uses: `aws-actions/configure-aws-credentials@${githubActionsAwsCredentialsVersion}`,
|
|
101
|
+
with: {
|
|
102
|
+
'role-to-assume': stack.driftDetectionRoleToAssumeArn,
|
|
103
|
+
'role-chaining': true,
|
|
104
|
+
'role-skip-session-tagging': true,
|
|
105
|
+
'aws-region': stack.driftDetectionRoleToAssumeRegion,
|
|
106
|
+
'aws-access-key-id': '${{ steps.creds.outputs.aws-access-key-id }}',
|
|
107
|
+
'aws-secret-access-key': '${{ steps.creds.outputs.aws-secret-access-key }}',
|
|
108
|
+
'aws-session-token': '${{ steps.creds.outputs.aws-session-token }}',
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
name: 'Detect drift',
|
|
113
|
+
if: condExpr,
|
|
114
|
+
id: 'drift',
|
|
115
|
+
continueOnError: true, // allow artifact upload and issue creation even when drift is detected
|
|
116
|
+
run: [
|
|
117
|
+
'set +e',
|
|
118
|
+
// Use the bundled script from this package
|
|
119
|
+
'node ./node_modules/@jjrawlins/cdk-diff-pr-github-action/lib/bin/detect-drift.js',
|
|
120
|
+
'status=$?',
|
|
121
|
+
'if [ -f "$DRIFT_DETECTION_OUTPUT" ]; then echo "Results file created: $DRIFT_DETECTION_OUTPUT"; fi',
|
|
122
|
+
// Expose useful outputs for downstream steps
|
|
123
|
+
"STACK_ARN=$(aws cloudformation describe-stacks --stack-name \"$STACK_NAME\" --query 'Stacks[0].StackId' --output text 2>/dev/null || true)",
|
|
124
|
+
'echo "stack-arn=$STACK_ARN" >> "$GITHUB_OUTPUT"',
|
|
125
|
+
'exit $status',
|
|
126
|
+
].join('\n'),
|
|
127
|
+
env: {
|
|
128
|
+
STACK_NAME: stack.stackName,
|
|
129
|
+
AWS_REGION: stack.driftDetectionRoleToAssumeRegion,
|
|
130
|
+
DRIFT_DETECTION_OUTPUT: resultsFile,
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
name: 'Upload results',
|
|
135
|
+
if: condExpr,
|
|
136
|
+
uses: `actions/upload-artifact@${githubActionsUploadArtifactVersion}`,
|
|
137
|
+
with: { 'name': `drift-results-${sanitizedStackName}`, 'path': resultsFile, 'if-no-files-found': 'ignore' },
|
|
138
|
+
},
|
|
139
|
+
...(createIssues
|
|
140
|
+
? [
|
|
141
|
+
{
|
|
142
|
+
name: 'Create Issue on Drift',
|
|
143
|
+
if: "always() && steps.drift.outcome == 'failure'",
|
|
144
|
+
id: 'issue',
|
|
145
|
+
uses: `actions/github-script@${githubActionsGithubScriptVersion}`,
|
|
146
|
+
with: { 'result-encoding': 'string', 'script': issueScript(sanitizedStackName, stack.driftDetectionRoleToAssumeRegion, resultsFile) },
|
|
147
|
+
},
|
|
148
|
+
]
|
|
149
|
+
: []),
|
|
150
|
+
...postSteps.map((step) => {
|
|
151
|
+
const s = { ...step };
|
|
152
|
+
// By default, only run extra notification steps when drift occurs
|
|
153
|
+
s.if = s.if ?? "always() && steps.drift.outcome == 'failure'";
|
|
154
|
+
return s;
|
|
155
|
+
}),
|
|
156
|
+
],
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
// summary aggregator job
|
|
160
|
+
jobs['drift-summary'] = {
|
|
161
|
+
name: 'Drift Detection Summary',
|
|
162
|
+
needs: Object.keys(jobs).filter((j) => j.startsWith('drift-') && j !== 'drift-summary'),
|
|
163
|
+
runsOn: ['ubuntu-latest'],
|
|
164
|
+
permissions: { contents: workflows_model_1.JobPermission.READ },
|
|
165
|
+
steps: [
|
|
166
|
+
{
|
|
167
|
+
name: 'Download all artifacts',
|
|
168
|
+
uses: `actions/download-artifact@${githubActionsDownloadArtifactVersion}`,
|
|
169
|
+
with: { path: 'drift-results' },
|
|
170
|
+
},
|
|
171
|
+
{ name: 'Generate summary', shell: 'bash', run: summaryScript() },
|
|
172
|
+
],
|
|
173
|
+
};
|
|
174
|
+
workflow.addJobs(jobs);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
exports.CdkDriftDetectionWorkflow = CdkDriftDetectionWorkflow;
|
|
178
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
179
|
+
CdkDriftDetectionWorkflow[_a] = { fqn: "@jjrawlins/cdk-diff-pr-github-action.CdkDriftDetectionWorkflow", version: "0.0.1" };
|
|
180
|
+
CdkDriftDetectionWorkflow.scriptCreated = false;
|
|
181
|
+
function issueScript(stack, region, resultsFile) {
|
|
182
|
+
// Construct a plain JS script string (no template string nesting mishaps)
|
|
183
|
+
const lines = [
|
|
184
|
+
"const fs = require('fs');",
|
|
185
|
+
`const resultsFile = '${resultsFile}';`,
|
|
186
|
+
"if (!fs.existsSync(resultsFile)) { console.log('No results file found'); return 'NO_RESULTS'; }",
|
|
187
|
+
"const results = JSON.parse(fs.readFileSync(resultsFile, 'utf8'));",
|
|
188
|
+
"const driftedStacks = results.filter(r => r.driftStatus === 'DRIFTED');",
|
|
189
|
+
"if (driftedStacks.length === 0) { console.log('No drift detected'); return 'NO_DRIFT'; }",
|
|
190
|
+
`const title = 'Drift Detected in ${stack}';`,
|
|
191
|
+
`let body = '## Drift Detection Report\\n\\n' + '**Stack:** ${stack}\\n' + '**Region:** ${region}\\n' + '**Time:** ' + new Date().toISOString() + '\\n\\n';`,
|
|
192
|
+
"body += '### Summary\\n';",
|
|
193
|
+
"body += '- Total stacks checked: ' + results.length + '\\n';",
|
|
194
|
+
"body += '- Drifted stacks: ' + driftedStacks.length + '\\n\\n';",
|
|
195
|
+
"body += '### Drifted Stacks\\n';",
|
|
196
|
+
'for (const s of driftedStacks) {',
|
|
197
|
+
' const resources = s.driftedResources || [];',
|
|
198
|
+
" body += '#### ' + s.stackName + '\\n';",
|
|
199
|
+
" body += '- Drifted resources: ' + resources.length + '\\n';",
|
|
200
|
+
" for (const r of resources) { body += ' - ' + r.logicalResourceId + ' (' + r.resourceType + ')\\n'; }",
|
|
201
|
+
" body += '\\n';",
|
|
202
|
+
'}',
|
|
203
|
+
"body += '### Action Required\\n' + 'Please review the drifted resources and either:\\n1. Update the infrastructure code to match the actual state\\n2. Restore the resources to match the expected state\\n\\n';",
|
|
204
|
+
'body += `[View workflow run](${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId})`;',
|
|
205
|
+
// List or update an issue with labels
|
|
206
|
+
`const issues = await github.rest.issues.listForRepo({ owner: context.repo.owner, repo: context.repo.repo, state: 'open', labels: ['drift-detection', '${stack}'] });`,
|
|
207
|
+
'let issueNumber;',
|
|
208
|
+
'if (issues.data.length === 0) {',
|
|
209
|
+
` const created = await github.rest.issues.create({ owner: context.repo.owner, repo: context.repo.repo, title, body, labels: ['drift-detection', '${stack}'] });`,
|
|
210
|
+
' issueNumber = created.data.number;',
|
|
211
|
+
'} else {',
|
|
212
|
+
' const issue = issues.data[0];',
|
|
213
|
+
' issueNumber = issue.number;',
|
|
214
|
+
' await github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, issue_number: issue.number, body });',
|
|
215
|
+
'}',
|
|
216
|
+
'return String(issueNumber ?? "");',
|
|
217
|
+
];
|
|
218
|
+
return lines.join('\n');
|
|
219
|
+
}
|
|
220
|
+
function summaryScript() {
|
|
221
|
+
return [
|
|
222
|
+
'#!/bin/bash',
|
|
223
|
+
'set -e',
|
|
224
|
+
'echo "## Drift Detection Summary" >> $GITHUB_STEP_SUMMARY',
|
|
225
|
+
'echo "" >> $GITHUB_STEP_SUMMARY',
|
|
226
|
+
'',
|
|
227
|
+
'total_stacks=0',
|
|
228
|
+
'total_drifted=0',
|
|
229
|
+
'total_errors=0',
|
|
230
|
+
'',
|
|
231
|
+
'shopt -s nullglob',
|
|
232
|
+
'for file in drift-results-*.json drift-results/*/drift-results-*.json; do',
|
|
233
|
+
' if [[ -f "$file" ]]; then',
|
|
234
|
+
' stack=$(basename "$file" | sed -E \"s/^drift-results-([^.]+)\\.json$/\\1/\")',
|
|
235
|
+
' echo "### Stack: $stack" >> $GITHUB_STEP_SUMMARY',
|
|
236
|
+
' jq -r \'' +
|
|
237
|
+
'. as $results |\n' +
|
|
238
|
+
'"- Total stacks: " + ($results | length | tostring) + "\\n" +\n' +
|
|
239
|
+
'"- Drifted: " + ([.[] | select(.driftStatus == "DRIFTED")] | length | tostring) + "\\n" +\n' +
|
|
240
|
+
'"- Errors: " + ([.[] | select(.error)] | length | tostring) + "\\n" +\n' +
|
|
241
|
+
'([.[] | select(.driftStatus == "DRIFTED")] | if length > 0 then "\\n**Drifted stacks:**\\n" + (map(" - " + .stackName + " (" + ((.driftedResources // []) | length | tostring) + " resources)") | join("\\n")) else "" end)\n' +
|
|
242
|
+
'\'' +
|
|
243
|
+
' "$file" >> $GITHUB_STEP_SUMMARY',
|
|
244
|
+
' echo "" >> $GITHUB_STEP_SUMMARY',
|
|
245
|
+
' total_stacks=$((total_stacks + $(jq \"length\" \"$file\")))',
|
|
246
|
+
' total_drifted=$((total_drifted + $(jq \"[.[] | select(.driftStatus == \\\"DRIFTED\\\")] | length\" \"$file\")))',
|
|
247
|
+
' total_errors=$((total_errors + $(jq \"[.[] | select(.error)] | length\" \"$file\")))',
|
|
248
|
+
' fi',
|
|
249
|
+
'done',
|
|
250
|
+
'',
|
|
251
|
+
'echo "### Overall Summary" >> $GITHUB_STEP_SUMMARY',
|
|
252
|
+
'echo "- Total stacks checked: $total_stacks" >> $GITHUB_STEP_SUMMARY',
|
|
253
|
+
'echo "- Total drifted stacks: $total_drifted" >> $GITHUB_STEP_SUMMARY',
|
|
254
|
+
'echo "- Total errors: $total_errors" >> $GITHUB_STEP_SUMMARY',
|
|
255
|
+
'',
|
|
256
|
+
'if [[ $total_drifted -gt 0 ]]; then',
|
|
257
|
+
' echo "" >> $GITHUB_STEP_SUMMARY',
|
|
258
|
+
' echo "⚠️ **Action required:** Drift detected in $total_drifted stacks" >> $GITHUB_STEP_SUMMARY',
|
|
259
|
+
'fi',
|
|
260
|
+
].join('\n');
|
|
261
|
+
}
|
|
262
|
+
function toKebabCase(s) {
|
|
263
|
+
return s.replace(/[^a-zA-Z0-9]+/g, '-').replace(/^-+|-+$/g, '').toLowerCase();
|
|
264
|
+
}
|
|
265
|
+
function toGithubJobId(s) {
|
|
266
|
+
// GitHub job_id must start with a letter or underscore and contain only A-Za-z0-9, '-', '_'
|
|
267
|
+
// 1) Replace any disallowed chars with '-'
|
|
268
|
+
let out = s.replace(/[^A-Za-z0-9_-]+/g, '-');
|
|
269
|
+
// 2) Collapse consecutive dashes
|
|
270
|
+
out = out.replace(/-+/g, '-');
|
|
271
|
+
// 3) Trim leading/trailing dashes (underscores are allowed at start)
|
|
272
|
+
out = out.replace(/^-+|-+$/g, '');
|
|
273
|
+
// 4) Lowercase for consistency (not required by GitHub but keeps things stable)
|
|
274
|
+
out = out.toLowerCase();
|
|
275
|
+
// 5) Ensure it starts with a letter or underscore
|
|
276
|
+
if (!out || !/^[a-z_]/i.test(out)) {
|
|
277
|
+
out = `s-${out}`;
|
|
278
|
+
}
|
|
279
|
+
return out;
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2RrRHJpZnREZXRlY3Rpb25Xb3JrZmxvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9DZGtEcmlmdERldGVjdGlvbldvcmtmbG93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsOENBQTJEO0FBQzNELHVFQUFrRTtBQUNsRSxpRkFBMkU7QUFFM0UsTUFBTSxrQ0FBa0MsR0FBRyxJQUFJLENBQUM7QUFDaEQsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLENBQUM7QUFDMUMsTUFBTSw2QkFBNkIsR0FBRyxJQUFJLENBQUM7QUFDM0MsTUFBTSxrQ0FBa0MsR0FBRyxJQUFJLENBQUM7QUFDaEQsTUFBTSxvQ0FBb0MsR0FBRyxJQUFJLENBQUM7QUFDbEQsTUFBTSxnQ0FBZ0MsR0FBRyxJQUFJLENBQUM7QUFnRDlDLE1BQWEseUJBQXlCO0lBR3BDLFlBQVksS0FBcUM7UUFDL0MsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFlBQVksSUFBSSxpQkFBaUIsQ0FBQztRQUNyRCxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQzVDLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDO1FBQ2hELE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDO1FBQ2hELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDOUIsTUFBTSxnQkFBZ0IsR0FBRSxLQUFLLENBQUMsZ0JBQWdCLElBQUksMkNBQTJDLENBQUM7UUFFOUYsa0VBQWtFO1FBQ2xFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUM3QyxJQUFJLG9EQUF1QixDQUFDO2dCQUMxQixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87Z0JBQ3RCLFVBQVUsRUFBRSxnQkFBZ0I7YUFDN0IsQ0FBQyxDQUFDO1lBQ0gseUJBQXlCLENBQUMsYUFBYSxH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QUNwRCxzRUFBc0U7UUFDdEUsdUVBQXVFO1FBQ3ZFLDhEQUE4RDtRQUM5RCxFQUFFO1FBQ0YscUNBQXFDO1FBQ3JDLG1DQUFtQztRQUNuQyxrR0FBa0c7UUFDbEcsSUFBSTtLQUNMLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLENBQVM7SUFDNUIsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDaEYsQ0FBQztBQUdELFNBQVMsYUFBYSxDQUFDLENBQVM7SUFDOUIsNEZBQTRGO0lBQzVGLDJDQUEyQztJQUMzQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzdDLGlDQUFpQztJQUNqQyxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDOUIscUVBQXFFO0lBQ3JFLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNsQyxnRkFBZ0Y7SUFDaEYsR0FBRyxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN4QixrREFBa0Q7SUFDbEQsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNsQyxHQUFHLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgR2l0SHViLCBHaXRodWJXb3JrZmxvdyB9IGZyb20gJ3Byb2plbi9saWIvZ2l0aHViJztcbmltcG9ydCB7IEpvYlBlcm1pc3Npb24gfSBmcm9tICdwcm9qZW4vbGliL2dpdGh1Yi93b3JrZmxvd3MtbW9kZWwnO1xuaW1wb3J0IHsgQ2RrRHJpZnREZXRlY3Rpb25TY3JpcHQgfSBmcm9tICcuL2Jpbi9jZGstZHJpZnQtZGV0ZWN0aW9uLXNjcmlwdCc7XG5cbmNvbnN0IGdpdGh1YkFjdGlvbnNBd3NDcmVkZW50aWFsc1ZlcnNpb24gPSAndjUnO1xuY29uc3QgZ2l0aHViQWN0aW9uc0NoZWNrb3V0VmVyc2lvbiA9ICd2NSc7XG5jb25zdCBnaXRodWJBY3Rpb25zU2V0dXBOb2RlVmVyc2lvbiA9ICd2NSc7XG5jb25zdCBnaXRodWJBY3Rpb25zVXBsb2FkQXJ0aWZhY3RWZXJzaW9uID0gJ3Y0JztcbmNvbnN0IGdpdGh1YkFjdGlvbnNEb3dubG9hZEFydGlmYWN0VmVyc2lvbiA9ICd2NSc7XG5jb25zdCBnaXRodWJBY3Rpb25zR2l0aHViU2NyaXB0VmVyc2lvbiA9ICd2OCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhY2sge1xuICByZWFkb25seSBzdGFja05hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgZHJpZnREZXRlY3Rpb25Sb2xlVG9Bc3N1bWVSZWdpb246IHN0cmluZztcbiAgcmVhZG9ubHkgZHJpZnREZXRlY3Rpb25Sb2xlVG9Bc3N1bWVBcm46IHN0cmluZztcbiAgcmVhZG9ubHkgZmFpbE9uRHJpZnQ/OiBib29sZWFuOyAvLyBpZiB0cnVlLCBmYWlsIGpvYiB3aGVuIGRyaWZ0IGRldGVjdGVkIChkZWZhdWx0IHRydWUpXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2RrRHJpZnREZXRlY3Rpb25Xb3JrZmxvd1Byb3BzIHtcbiAgcmVhZG9ubHkgc2NyaXB0T3V0cHV0UGF0aD86IHN0cmluZztcbiAgcmVhZG9ubHkgcHJvamVjdDogYW55OyAvLyBhdm9pZCBleHBvcnRpbmcgcHJvamVuIHR5cGVzIGluIHB1YmxpYyBBUElcbiAgcmVhZG9ubHkgd29ya2Zsb3dOYW1lPzogc3RyaW5nOyAvLyB3b3JrZmxvdyB3b3JrZmxvd05hbWUgKGFsc28gdXNlZCB0byBkZXJpdmUgZmlsZSB3b3JrZmxvd05hbWUpXG4gIHJlYWRvbmx5IHNjaGVkdWxlPzogc3RyaW5nOyAvLyBjcm9uIGV4cHJlc3Npb24sIGUuZy4gJzAgMCAqICogKidcbiAgcmVhZG9ubHkgY3JlYXRlSXNzdWVzPzogYm9vbGVhbjsgLy8gY3JlYXRlL3VwZGF0ZSBpc3N1ZSB3aGVuIGRyaWZ0IGRldGVjdGVkIG9uIHNjaGVkdWxlIChkZWZhdWx0IHRydWUpXG4gIHJlYWRvbmx5IG9pZGNSb2xlQXJuOiBzdHJpbmc7IC8vIGRlZmF1bHQgT0lEQyByb2xlIEFSTiB0byBhc3N1bWUgZm9yIGFsbCBzdGFja3NcbiAgcmVhZG9ubHkgb2lkY1JlZ2lvbjogc3RyaW5nOyAvLyBkZWZhdWx0IE9JREMgcmVnaW9uIHRvIGFzc3VtZSBmb3IgYWxsIHN0YWNrc1xuICByZWFkb25seSBzdGFja3M6IFN0YWNrW107XG4gIHJlYWRvbmx5IG5vZGVWZXJzaW9uPzogc3RyaW5nOyAvLyBlLmcuLCAnMjQueCdcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGhvb2sgdG8gYXBwZW5kIGFkZGl0aW9uYWwgR2l0SHViIEFjdGlvbnMgc3RlcHMgYWZ0ZXIgZHJpZnQgZGV0ZWN0aW9uIHBlciBzdGFjay5cbiAgICogWW91IGNhbiBzdXBwbHkgYSBzdGF0aWMgYXJyYXkgb2Ygc3RlcHMsIG9yIGEgZmFjdG9yeSB0aGF0IHJlY2VpdmVzIGNvbnRleHQgYW5kIHJldHVybnMgc3RlcHMuXG4gICAqL1xuICAvKipcbiAgICogT3B0aW9uYWwgYWRkaXRpb25hbCBHaXRIdWIgQWN0aW9uIHN0ZXBzIHRvIHJ1biBhZnRlciBkcmlmdCBkZXRlY3Rpb24gZm9yIGVhY2ggc3RhY2suXG4gICAqIFRoZXNlIHN0ZXBzIHJ1biBhZnRlciByZXN1bHRzIGFyZSB1cGxvYWRlZCBmb3IgZWFjaCBzdGFjay4gWW91IGNhbiBpbmNsdWRlXG4gICAqIGFueSBub3RpZmljYXRpb25zIHlvdSBsaWtlIChlLmcuLCBTbGFjaykuIFByb3ZpZGUgZXhwbGljaXQgaW5wdXRzIChlLmcuLCBwYXlsb2FkL21hcmtkb3duKVxuICAgKiBkaXJlY3RseSBpbiB5b3VyIHN0ZXAgd2l0aG91dCByZWx5aW5nIG9uIGEgcHJlLWdlbmVyYXRlZCBwYXlsb2FkLlxuICAgKi9cbiAgLy8gTk9URToganNpaSBkb2VzIG5vdCBzdXBwb3J0IGZ1bmN0aW9uIHR5cGVzIGluIHB1YmxpYyBBUElzOyB1c2UgJ2FueScgaGVyZSBhbmQgYWNjZXB0IGVpdGhlcjpcbiAgLy8gLSBBbiBhcnJheSBvZiBHaXRIdWIgc3RlcHMsIG9yXG4gIC8vIC0gQSBmdW5jdGlvbiAoY3R4OiB7IHN0YWNrOiBzdHJpbmcgfSkgPT4gR2l0SHViU3RlcFtdXG4gIC8vIFRoZSBjb25zdHJ1Y3RvciBoYW5kbGVzIGJvdGggYXQgcnVudGltZS5cbiAgcmVhZG9ubHkgcG9zdEdpdEh1YlN0ZXBzPzogYW55O1xufVxuXG50eXBlIEdpdEh1YlN0ZXAgPSB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGlkPzogc3RyaW5nO1xuICBpZj86IHN0cmluZztcbiAgdXNlcz86IHN0cmluZztcbiAgcnVuPzogc3RyaW5nO1xuICB3aXRoPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgY29udGludWVPbkVycm9yPzogYm9vbGVhbjtcbiAgc2hlbGw/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY2xhc3MgQ2RrRHJpZnREZXRlY3Rpb25Xb3JrZmxvdyB7XG4gIHByaXZhdGUgc3RhdGljIHNjcmlwdENyZWF0ZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogQ2RrRHJpZnREZXRlY3Rpb25Xb3JrZmxvd1Byb3BzKSB7XG4gICAgY29uc3QgbmFtZSA9IHByb3BzLndvcmtmbG93TmFtZSA/PyAnZHJpZnQtZGV0ZWN0aW9uJztcbiAgICBjb25zdCBmaWxlTmFtZSA9IHRvS2ViYWJDYXNlKG5hbWUpICsgJy55bWwnO1xuICAgIGNvbnN0IG5vZGVWZXJzaW9uID0gcHJvcHMubm9kZVZlcnNpb24gPz8gJzI0LngnO1xuICAgIGNvbnN0IGNyZWF0ZUlzc3VlcyA9IHByb3BzLmNyZWF0ZUlzc3VlcyA/PyB0cnVlO1xuICAgIGNvbnN0IHByb2plY3QgPSBwcm9wcy5wcm9qZWN0O1xuICAgIGNvbnN0IHNjcmlwdE91dHB1dFBhdGg9IHByb3BzLnNjcmlwdE91dHB1dFBhdGggPz8gJy5naXRodWIvd29ya2Zsb3dzL3NjcmlwdHMvZGV0ZWN0LWRyaWZ0LnRzJztcblxuICAgIC8vIE9ubHkgY3JlYXRlIHRoZSBkcmlmdCBkZXRlY3Rpb24gc2NyaXB0IG9uY2UgdG8gYXZvaWQgY29sbGlzaW9uc1xuICAgIGlmICghQ2RrRHJpZnREZXRlY3Rpb25Xb3JrZmxvdy5zY3JpcHRDcmVhdGVkKSB7XG4gICAgICBuZXcgQ2RrRHJpZnREZXRlY3Rpb25TY3JpcHQoe1xuICAgICAgICBwcm9qZWN0OiBwcm9wcy5wcm9qZWN0LFxuICAgICAgICBvdXRwdXRQYXRoOiBzY3JpcHRPdXRwdXRQYXRoLFxuICAgICAgfSk7XG4gICAgICBDZGtEcmlmdERldGVjdGlvbldvcmtmbG93LnNjcmlwdENyZWF0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGdoID0gKHByb2plY3QgYXMgYW55KS5naXRodWIgPz8gbmV3IEdpdEh1Yihwcm9qZWN0KTtcbiAgICBjb25zdCB3b3JrZmxvdyA9IG5ldyBHaXRodWJXb3JrZmxvdyhnaCwgbmFtZSwgeyBmaWxlTmFtZSB9KTtcblxuICAgIC8vIHRyaWdnZXJzOiBzY2hlZHVsZSArIG1hbnVhbCBkaXNwYXRjaCB3aXRoIHN0YWNrIGNob2ljZVxuICAgIGNvbnN0IHN0YWNrQ2hvaWNlcyA9IFsnYWxsJywgLi4ucHJvcHMuc3RhY2tzLm1hcCgocykgPT4gcy5zdGFja05hbWUpXTtcbiAgICB3b3JrZmxvdy5vbih7XG4gICAgICBzY2hlZHVsZTogcHJvcHMuc2NoZWR1bGUgPyBbeyBjcm9uOiBwcm9wcy5zY2hlZHVsZSB9XSA6IHVuZGVmaW5lZCxcbiAgICAgIHdvcmtmbG93RGlzcGF0Y2g6IHtcbiAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgc3RhY2s6IHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlN0YWNrIHRvIGNoZWNrIGZvciBkcmlmdCAoJ2FsbCcgdG8gcnVuIGV2ZXJ5IHN0YWNrKVwiLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgdHlwZTogJ2Nob2ljZScsXG4gICAgICAgICAgICBvcHRpb25zOiBzdGFja0Nob2ljZXMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBPbmUgam9iIHBlciBzdGFja1xuICAgIGNvbnN0IGpvYnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblxuICAgIGZvciAoY29uc3Qgc3RhY2sgb2YgcHJvcHMuc3RhY2tzKSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWRTdGFja05hbWUgPSB0b0tlYmFiQ2FzZSh0b0dpdGh1YkpvYklkKHN0YWNrLnN0YWNrTmFtZSkpO1xuICAgICAgY29uc3Qgb3JpZ2luYWxTdGFja05hbWUgPSBzdGFjay5zdGFja05hbWU7XG4gICAgICBjb25zdCBqb2JJZCA9IGBkcmlmdC0ke3Nhbml0aXplZFN0YWNrTmFtZX1gO1xuICAgICAgY29uc3QgcmVzdWx0c0ZpbGUgPSBgZHJpZnQtcmVzdWx0cy0ke3Nhbml0aXplZFN0YWNrTmFtZX0uanNvbmA7XG4gICAgICBjb25zdCBpbm5lckNvbmQgPSBcImdpdGh1Yi5ldmVudF9uYW1lID09ICdzY2hlZHVsZScgfHwgIWdpdGh1Yi5ldmVudC5pbnB1dHMuc3RhY2sgfHwgZ2l0aHViLmV2ZW50LmlucHV0cy5zdGFjayA9PSAnYWxsJyB8fCBnaXRodWIuZXZlbnQuaW5wdXRzLnN0YWNrID09ICdcIiArIHNhbml0aXplZFN0YWNrTmFtZSArIFwiJyB8fCBnaXRodWIuZXZlbnQuaW5wdXRzLnN0YWNrID09ICdcIiArIG9yaWdpbmFsU3RhY2tOYW1lICsgXCInXCI7XG4gICAgICBjb25zdCBjb25kRXhwciA9ICcke3sgJyArIGlubmVyQ29uZCArICcgfX0nO1xuICAgICAgY29uc3Qgbm90Q29uZEV4cHIgPSAnJHt7ICEoJyArIGlubmVyQ29uZCArICcpIH19JztcblxuICAgICAgY29uc3QgcmF3UG9zdCA9IHByb3BzLnBvc3RHaXRIdWJTdGVwcztcbiAgICAgIGNvbnN0IHBvc3RTdGVwczogR2l0SHViU3RlcFtdID0gdHlwZW9mIHJhd1Bvc3QgPT09ICdmdW5jdGlvbicgPyAocmF3UG9zdCBhcyAoY3R4OiB7IHN0YWNrOiBzdHJpbmcgfSkgPT4gR2l0SHViU3RlcFtdKSh7IHN0YWNrOiBzYW5pdGl6ZWRTdGFja05hbWUgfSkgOiAocmF3UG9zdCA/PyBbXSk7XG5cbiAgICAgIGpvYnNbam9iSWRdID0ge1xuICAgICAgICBuYW1lOiBgRHJpZnQgRGV0ZWN0aW9uIC0gJHtzYW5pdGl6ZWRTdGFja05hbWV9YCxcbiAgICAgICAgcnVuc09uOiBbJ3VidW50dS1sYXRlc3QnXSxcbiAgICAgICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgICBjb250ZW50czogSm9iUGVybWlzc2lvbi5SRUFELFxuICAgICAgICAgIGlkVG9rZW46IEpvYlBlcm1pc3Npb24uV1JJVEUsXG4gICAgICAgICAgaXNzdWVzOiBKb2JQZXJtaXNzaW9uLldSSVRFLFxuICAgICAgICB9LFxuICAgICAgICBlbnY6IHtcbiAgICAgICAgICBBV1NfREVGQVVMVF9SRUdJT046IHN0YWNrLmRyaWZ0RGV0ZWN0aW9uUm9sZVRvQXNzdW1lUmVnaW9uLFxuICAgICAgICAgIEFXU19SRUdJT046IHN0YWNrLmRyaWZ0RGV0ZWN0aW9uUm9sZVRvQXNzdW1lUmVnaW9uLFxuICAgICAgICAgIERSSUZUX0RFVEVDVElPTl9PVVRQVVQ6IHJlc3VsdHNGaWxlLFxuICAgICAgICAgIFNUQUNLX0lEOiBzYW5pdGl6ZWRTdGFja05hbWUsXG4gICAgICAgICAgU1RBQ0tfTkFNRTogc3RhY2suc3RhY2tOYW1lLFxuICAgICAgICB9LFxuICAgICAgICAvLyBObyBqb2ItbGV2ZWwgY29uZGl0aW9uOyB3ZSBnYXRlIHN0ZXBzIHNvIHRoZSBqb2IgYWx3YXlzIGNvbXBsZXRlcyBhbmQgc3VtbWFyeSBjYW4gcnVuXG4gICAgICAgIHN0ZXBzOiBbXG4gICAgICAgICAgeyBuYW1lOiAnU2tpcCAoc3RhY2sgbm90IHNlbGVjdGVkKScsIGlmOiBub3RDb25kRXhwciwgcnVuOiAnZWNobyBcIlN0YWNrIG5vdCBzZWxlY3RlZDsgc2tpcHBpbmcgZHJpZnQgZGV0ZWN0aW9uIGZvciB0aGlzIGpvYi5cIicgfSxcbiAgICAgICAgICB7IG5hbWU6ICdDaGVja291dCcsIGlmOiBjb25kRXhwciwgdXNlczogYGFjdGlvbnMvY2hlY2tvdXRAJHtnaXRodWJBY3Rpb25zQ2hlY2tvdXRWZXJzaW9ufWAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnU2V0dXAgTm9kZS5qcycsXG4gICAgICAgICAgICBpZjogY29uZEV4cHIsXG4gICAgICAgICAgICB1c2VzOiBgYWN0aW9ucy9zZXR1cC1ub2RlQCR7Z2l0aHViQWN0aW9uc1NldHVwTm9kZVZlcnNpb259YCxcbiAgICAgICAgICAgIHdpdGg6IHsgJ25vZGUtdmVyc2lvbic6IG5vZGVWZXJzaW9uIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IG5hbWU6ICdJbnN0YWxsIGRlcGVuZGVuY2llcycsIGlmOiBjb25kRXhwciwgcnVuOiAneWFybiBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlIHx8IG5wbSBjaScsIGVudjogeyBHSVRIVUJfVE9LRU46ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nIH0gfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnQVdTIENyZWRlbnRpYWxzJyxcbiAgICAgICAgICAgIGlmOiBjb25kRXhwcixcbiAgICAgICAgICAgIGlkOiAnY3JlZHMnLFxuICAgICAgICAgICAgdXNlczogYGF3cy1hY3Rpb25zL2NvbmZpZ3VyZS1hd3MtY3JlZGVudGlhbHNAJHtnaXRodWJBY3Rpb25zQXdzQ3JlZGVudGlhbHNWZXJzaW9ufWAsXG4gICAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICAgICdyb2xlLXRvLWFzc3VtZSc6IHByb3BzLm9pZGNSb2xlQXJuLFxuICAgICAgICAgICAgICAncm9sZS1zZXNzaW9uLW5hbWUnOiAnR2l0SHViQWN0aW9uJyxcbiAgICAgICAgICAgICAgJ2F3cy1yZWdpb24nOiBwcm9wcy5vaWRjUmVnaW9uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdBc3N1bWUgRHJpZnQgRGV0ZWN0aW9uIFJvbGUnLFxuICAgICAgICAgICAgaWY6IGNvbmRFeHByLFxuICAgICAgICAgICAgdXNlczogYGF3cy1hY3Rpb25zL2NvbmZpZ3VyZS1hd3MtY3JlZGVudGlhbHNAJHtnaXRodWJBY3Rpb25zQXdzQ3JlZGVudGlhbHNWZXJzaW9ufWAsXG4gICAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICAgICdyb2xlLXRvLWFzc3VtZSc6IHN0YWNrLmRyaWZ0RGV0ZWN0aW9uUm9sZVRvQXNzdW1lQXJuLFxuICAgICAgICAgICAgICAncm9sZS1jaGFpbmluZyc6IHRydWUsXG4gICAgICAgICAgICAgICdyb2xlLXNraXAtc2Vzc2lvbi10YWdnaW5nJzogdHJ1ZSxcbiAgICAgICAgICAgICAgJ2F3cy1yZWdpb24nOiBzdGFjay5kcmlmdERldGVjdGlvblJvbGVUb0Fzc3VtZVJlZ2lvbixcbiAgICAgICAgICAgICAgJ2F3cy1hY2Nlc3Mta2V5LWlkJzogJyR7eyBzdGVwcy5jcmVkcy5vdXRwdXRzLmF3cy1hY2Nlc3Mta2V5LWlkIH19JyxcbiAgICAgICAgICAgICAgJ2F3cy1zZWNyZXQtYWNjZXNzLWtleSc6ICcke3sgc3RlcHMuY3JlZHMub3V0cHV0cy5hd3Mtc2VjcmV0LWFjY2Vzcy1rZXkgfX0nLFxuICAgICAgICAgICAgICAnYXdzLXNlc3Npb24tdG9rZW4nOiAnJHt7IHN0ZXBzLmNyZWRzLm91dHB1dHMuYXdzLXNlc3Npb24tdG9rZW4gfX0nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdEZXRlY3QgZHJpZnQnLFxuICAgICAgICAgICAgaWY6IGNvbmRFeHByLFxuICAgICAgICAgICAgaWQ6ICdkcmlmdCcsXG4gICAgICAgICAgICBjb250aW51ZU9uRXJyb3I6IHRydWUsIC8vIGFsbG93IGFydGlmYWN0IHVwbG9hZCBhbmQgaXNzdWUgY3JlYXRpb24gZXZlbiB3aGVuIGRyaWZ0IGlzIGRldGVjdGVkXG4gICAgICAgICAgICBydW46IFtcbiAgICAgICAgICAgICAgJ3NldCArZScsXG4gICAgICAgICAgICAgIC8vIFVzZSB0aGUgYnVuZGxlZCBzY3JpcHQgZnJvbSB0aGlzIHBhY2thZ2VcbiAgICAgICAgICAgICAgJ25vZGUgLi9ub2RlX21vZHVsZXMvQGpqcmF3bGlucy9jZGstZGlmZi1wci1naXRodWItYWN0aW9uL2xpYi9iaW4vZGV0ZWN0LWRyaWZ0LmpzJyxcbiAgICAgICAgICAgICAgJ3N0YXR1cz0kPycsXG4gICAgICAgICAgICAgICdpZiBbIC1mIFwiJERSSUZUX0RFVEVDVElPTl9PVVRQVVRcIiBdOyB0aGVuIGVjaG8gXCJSZXN1bHRzIGZpbGUgY3JlYXRlZDogJERSSUZUX0RFVEVDVElPTl9PVVRQVVRcIjsgZmknLFxuICAgICAgICAgICAgICAvLyBFeHBvc2UgdXNlZnVsIG91dHB1dHMgZm9yIGRvd25zdHJlYW0gc3RlcHNcbiAgICAgICAgICAgICAgXCJTVEFDS19BUk49JChhd3MgY2xvdWRmb3JtYXRpb24gZGVzY3JpYmUtc3RhY2tzIC0tc3RhY2stbmFtZSBcXFwiJFNUQUNLX05BTUVcXFwiIC0tcXVlcnkgJ1N0YWNrc1swXS5TdGFja0lkJyAtLW91dHB1dCB0ZXh0IDI+L2Rldi9udWxsIHx8IHRydWUpXCIsXG4gICAgICAgICAgICAgICdlY2hvIFwic3RhY2stYXJuPSRTVEFDS19BUk5cIiA+PiBcIiRHSVRIVUJfT1VUUFVUXCInLFxuICAgICAgICAgICAgICAnZXhpdCAkc3RhdHVzJyxcbiAgICAgICAgICAgIF0uam9pbignXFxuJyksXG4gICAgICAgICAgICBlbnY6IHtcbiAgICAgICAgICAgICAgU1RBQ0tfTkFNRTogc3RhY2suc3RhY2tOYW1lLFxuICAgICAgICAgICAgICBBV1NfUkVHSU9OOiBzdGFjay5kcmlmdERldGVjdGlvblJvbGVUb0Fzc3VtZVJlZ2lvbixcbiAgICAgICAgICAgICAgRFJJRlRfREVURUNUSU9OX09VVFBVVDogcmVzdWx0c0ZpbGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ1VwbG9hZCByZXN1bHRzJyxcbiAgICAgICAgICAgIGlmOiBjb25kRXhwcixcbiAgICAgICAgICAgIHVzZXM6IGBhY3Rpb25zL3VwbG9hZC1hcnRpZmFjdEAke2dpdGh1YkFjdGlvbnNVcGxvYWRBcnRpZmFjdFZlcnNpb259YCxcbiAgICAgICAgICAgIHdpdGg6IHsgJ25hbWUnOiBgZHJpZnQtcmVzdWx0cy0ke3Nhbml0aXplZFN0YWNrTmFtZX1gLCAncGF0aCc6IHJlc3VsdHNGaWxlLCAnaWYtbm8tZmlsZXMtZm91bmQnOiAnaWdub3JlJyB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uKFxuICAgICAgICAgICAgY3JlYXRlSXNzdWVzXG4gICAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdDcmVhdGUgSXNzdWUgb24gRHJpZnQnLFxuICAgICAgICAgICAgICAgICAgaWY6IFwiYWx3YXlzKCkgJiYgc3RlcHMuZHJpZnQub3V0Y29tZSA9PSAnZmFpbHVyZSdcIixcbiAgICAgICAgICAgICAgICAgIGlkOiAnaXNzdWUnLFxuICAgICAgICAgICAgICAgICAgdXNlczogYGFjdGlvbnMvZ2l0aHViLXNjcmlwdEAke2dpdGh1YkFjdGlvbnNHaXRodWJTY3JpcHRWZXJzaW9ufWAsXG4gICAgICAgICAgICAgICAgICB3aXRoOiB7ICdyZXN1bHQtZW5jb2RpbmcnOiAnc3RyaW5nJywgJ3NjcmlwdCc6IGlzc3VlU2NyaXB0KHNhbml0aXplZFN0YWNrTmFtZSwgc3RhY2suZHJpZnREZXRlY3Rpb25Sb2xlVG9Bc3N1bWVSZWdpb24sIHJlc3VsdHNGaWxlKSB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgOiBbXVxuICAgICAgICAgICksXG4gICAgICAgICAgLi4ucG9zdFN0ZXBzLm1hcCgoc3RlcCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgczogYW55ID0geyAuLi4oc3RlcCBhcyBhbnkpIH07XG4gICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBvbmx5IHJ1biBleHRyYSBub3RpZmljYXRpb24gc3RlcHMgd2hlbiBkcmlmdCBvY2N1cnNcbiAgICAgICAgICAgIHMuaWYgPSBzLmlmID8/IFwiYWx3YXlzKCkgJiYgc3RlcHMuZHJpZnQub3V0Y29tZSA9PSAnZmFpbHVyZSdcIjtcbiAgICAgICAgICAgIHJldHVybiBzO1xuICAgICAgICAgIH0pLFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBzdW1tYXJ5IGFnZ3JlZ2F0b3Igam9iXG4gICAgam9ic1snZHJpZnQtc3VtbWFyeSddID0ge1xuICAgICAgbmFtZTogJ0RyaWZ0IERldGVjdGlvbiBTdW1tYXJ5JyxcbiAgICAgIG5lZWRzOiBPYmplY3Qua2V5cyhqb2JzKS5maWx0ZXIoKGopID0+IGouc3RhcnRzV2l0aCgnZHJpZnQtJykgJiYgaiAhPT0gJ2RyaWZ0LXN1bW1hcnknKSxcbiAgICAgIHJ1bnNPbjogWyd1YnVudHUtbGF0ZXN0J10sXG4gICAgICBwZXJtaXNzaW9uczogeyBjb250ZW50czogSm9iUGVybWlzc2lvbi5SRUFEIH0sXG4gICAgICBzdGVwczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ0Rvd25sb2FkIGFsbCBhcnRpZmFjdHMnLFxuICAgICAgICAgIHVzZXM6IGBhY3Rpb25zL2Rvd25sb2FkLWFydGlmYWN0QCR7Z2l0aHViQWN0aW9uc0Rvd25sb2FkQXJ0aWZhY3RWZXJzaW9ufWAsXG4gICAgICAgICAgd2l0aDogeyBwYXRoOiAnZHJpZnQtcmVzdWx0cycgfSxcbiAgICAgICAgfSxcbiAgICAgICAgeyBuYW1lOiAnR2VuZXJhdGUgc3VtbWFyeScsIHNoZWxsOiAnYmFzaCcsIHJ1bjogc3VtbWFyeVNjcmlwdCgpIH0sXG4gICAgICBdLFxuICAgIH07XG5cbiAgICB3b3JrZmxvdy5hZGRKb2JzKGpvYnMpO1xuICB9XG59XG5cblxuZnVuY3Rpb24gaXNzdWVTY3JpcHQoc3RhY2s6IHN0cmluZywgcmVnaW9uOiBzdHJpbmcsIHJlc3VsdHNGaWxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBDb25zdHJ1Y3QgYSBwbGFpbiBKUyBzY3JpcHQgc3RyaW5nIChubyB0ZW1wbGF0ZSBzdHJpbmcgbmVzdGluZyBtaXNoYXBzKVxuICBjb25zdCBsaW5lcyA9IFtcbiAgICBcImNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcIixcbiAgICBgY29uc3QgcmVzdWx0c0ZpbGUgPSAnJHtyZXN1bHRzRmlsZX0nO2AsXG4gICAgXCJpZiAoIWZzLmV4aXN0c1N5bmMocmVzdWx0c0ZpbGUpKSB7IGNvbnNvbGUubG9nKCdObyByZXN1bHRzIGZpbGUgZm91bmQnKTsgcmV0dXJuICdOT19SRVNVTFRTJzsgfVwiLFxuICAgIFwiY29uc3QgcmVzdWx0cyA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHJlc3VsdHNGaWxlLCAndXRmOCcpKTtcIixcbiAgICBcImNvbnN0IGRyaWZ0ZWRTdGFja3MgPSByZXN1bHRzLmZpbHRlcihyID0+IHIuZHJpZnRTdGF0dXMgPT09ICdEUklGVEVEJyk7XCIsXG4gICAgXCJpZiAoZHJpZnRlZFN0YWNrcy5sZW5ndGggPT09IDApIHsgY29uc29sZS5sb2coJ05vIGRyaWZ0IGRldGVjdGVkJyk7IHJldHVybiAnTk9fRFJJRlQnOyB9XCIsXG4gICAgYGNvbnN0IHRpdGxlID0gJ0RyaWZ0IERldGVjdGVkIGluICR7c3RhY2t9JztgLFxuICAgIGBsZXQgYm9keSA9ICcjIyBEcmlmdCBEZXRlY3Rpb24gUmVwb3J0XFxcXG5cXFxcbicgKyAnKipTdGFjazoqKiAke3N0YWNrfVxcXFxuJyArICcqKlJlZ2lvbjoqKiAke3JlZ2lvbn1cXFxcbicgKyAnKipUaW1lOioqICcgKyBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgKyAnXFxcXG5cXFxcbic7YCxcbiAgICBcImJvZHkgKz0gJyMjIyBTdW1tYXJ5XFxcXG4nO1wiLFxuICAgIFwiYm9keSArPSAnLSBUb3RhbCBzdGFja3MgY2hlY2tlZDogJyArIHJlc3VsdHMubGVuZ3RoICsgJ1xcXFxuJztcIixcbiAgICBcImJvZHkgKz0gJy0gRHJpZnRlZCBzdGFja3M6ICcgKyBkcmlmdGVkU3RhY2tzLmxlbmd0aCArICdcXFxcblxcXFxuJztcIixcbiAgICBcImJvZHkgKz0gJyMjIyBEcmlmdGVkIFN0YWNrc1xcXFxuJztcIixcbiAgICAnZm9yIChjb25zdCBzIG9mIGRyaWZ0ZWRTdGFja3MpIHsnLFxuICAgICcgIGNvbnN0IHJlc291cmNlcyA9IHMuZHJpZnRlZFJlc291cmNlcyB8fCBbXTsnLFxuICAgIFwiICBib2R5ICs9ICcjIyMjICcgKyBzLnN0YWNrTmFtZSArICdcXFxcbic7XCIsXG4gICAgXCIgIGJvZHkgKz0gJy0gRHJpZnRlZCByZXNvdXJjZXM6ICcgKyByZXNvdXJjZXMubGVuZ3RoICsgJ1xcXFxuJztcIixcbiAgICBcIiAgZm9yIChjb25zdCByIG9mIHJlc291cmNlcykgeyBib2R5ICs9ICcgIC0gJyArIHIubG9naWNhbFJlc291cmNlSWQgKyAnICgnICsgci5yZXNvdXJjZVR5cGUgKyAnKVxcXFxuJzsgfVwiLFxuICAgIFwiICBib2R5ICs9ICdcXFxcbic7XCIsXG4gICAgJ30nLFxuICAgIFwiYm9keSArPSAnIyMjIEFjdGlvbiBSZXF1aXJlZFxcXFxuJyArICdQbGVhc2UgcmV2aWV3IHRoZSBkcmlmdGVkIHJlc291cmNlcyBhbmQgZWl0aGVyOlxcXFxuMS4gVXBkYXRlIHRoZSBpbmZyYXN0cnVjdHVyZSBjb2RlIHRvIG1hdGNoIHRoZSBhY3R1YWwgc3RhdGVcXFxcbjIuIFJlc3RvcmUgdGhlIHJlc291cmNlcyB0byBtYXRjaCB0aGUgZXhwZWN0ZWQgc3RhdGVcXFxcblxcXFxuJztcIixcbiAgICAnYm9keSArPSBgW1ZpZXcgd29ya2Zsb3cgcnVuXSgke2NvbnRleHQuc2VydmVyVXJsfS8ke2NvbnRleHQucmVwby5vd25lcn0vJHtjb250ZXh0LnJlcG8ucmVwb30vYWN0aW9ucy9ydW5zLyR7Y29udGV4dC5ydW5JZH0pYDsnLFxuICAgIC8vIExpc3Qgb3IgdXBkYXRlIGFuIGlzc3VlIHdpdGggbGFiZWxzXG4gICAgYGNvbnN0IGlzc3VlcyA9IGF3YWl0IGdpdGh1Yi5yZXN0Lmlzc3Vlcy5saXN0Rm9yUmVwbyh7IG93bmVyOiBjb250ZXh0LnJlcG8ub3duZXIsIHJlcG86IGNvbnRleHQucmVwby5yZXBvLCBzdGF0ZTogJ29wZW4nLCBsYWJlbHM6IFsnZHJpZnQtZGV0ZWN0aW9uJywgJyR7c3RhY2t9J10gfSk7YCxcbiAgICAnbGV0IGlzc3VlTnVtYmVyOycsXG4gICAgJ2lmIChpc3N1ZXMuZGF0YS5sZW5ndGggPT09IDApIHsnLFxuICAgIGAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCBnaXRodWIucmVzdC5pc3N1ZXMuY3JlYXRlKHsgb3duZXI6IGNvbnRleHQucmVwby5vd25lciwgcmVwbzogY29udGV4dC5yZXBvLnJlcG8sIHRpdGxlLCBib2R5LCBsYWJlbHM6IFsnZHJpZnQtZGV0ZWN0aW9uJywgJyR7c3RhY2t9J10gfSk7YCxcbiAgICAnICBpc3N1ZU51bWJlciA9IGNyZWF0ZWQuZGF0YS5udW1iZXI7JyxcbiAgICAnfSBlbHNlIHsnLFxuICAgICcgIGNvbnN0IGlzc3VlID0gaXNzdWVzLmRhdGFbMF07JyxcbiAgICAnICBpc3N1ZU51bWJlciA9IGlzc3VlLm51bWJlcjsnLFxuICAgICcgIGF3YWl0IGdpdGh1Yi5yZXN0Lmlzc3Vlcy5jcmVhdGVDb21tZW50KHsgb3duZXI6IGNvbnRleHQucmVwby5vd25lciwgcmVwbzogY29udGV4dC5yZXBvLnJlcG8sIGlzc3VlX251bWJlcjogaXNzdWUubnVtYmVyLCBib2R5IH0pOycsXG4gICAgJ30nLFxuICAgICdyZXR1cm4gU3RyaW5nKGlzc3VlTnVtYmVyID8/IFwiXCIpOycsXG4gIF07XG4gIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbn1cblxuXG5mdW5jdGlvbiBzdW1tYXJ5U2NyaXB0KCk6IHN0cmluZyB7XG4gIHJldHVybiBbXG4gICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAnc2V0IC1lJyxcbiAgICAnZWNobyBcIiMjIERyaWZ0IERldGVjdGlvbiBTdW1tYXJ5XCIgPj4gJEdJVEhVQl9TVEVQX1NVTU1BUlknLFxuICAgICdlY2hvIFwiXCIgPj4gJEdJVEhVQl9TVEVQX1NVTU1BUlknLFxuICAgICcnLFxuICAgICd0b3RhbF9zdGFja3M9MCcsXG4gICAgJ3RvdGFsX2RyaWZ0ZWQ9MCcsXG4gICAgJ3RvdGFsX2Vycm9ycz0wJyxcbiAgICAnJyxcbiAgICAnc2hvcHQgLXMgbnVsbGdsb2InLFxuICAgICdmb3IgZmlsZSBpbiBkcmlmdC1yZXN1bHRzLSouanNvbiBkcmlmdC1yZXN1bHRzLyovZHJpZnQtcmVzdWx0cy0qLmpzb247IGRvJyxcbiAgICAnICBpZiBbWyAtZiBcIiRmaWxlXCIgXV07IHRoZW4nLFxuICAgICcgICAgc3RhY2s9JChiYXNlbmFtZSBcIiRmaWxlXCIgfCBzZWQgLUUgXFxcInMvXmRyaWZ0LXJlc3VsdHMtKFteLl0rKVxcXFwuanNvbiQvXFxcXDEvXFxcIiknLFxuICAgICcgICAgZWNobyBcIiMjIyBTdGFjazogJHN0YWNrXCIgPj4gJEdJVEhVQl9TVEVQX1NVTU1BUlknLFxuICAgICcgICAganEgLXIgXFwnJyArXG4gICAgICAnLiBhcyAkcmVzdWx0cyB8XFxuJyArXG4gICAgICAnXCItIFRvdGFsIHN0YWNrczogXCIgKyAoJHJlc3VsdHMgfCBsZW5ndGggfCB0b3N0cmluZykgKyBcIlxcXFxuXCIgK1xcbicgK1xuICAgICAgJ1wiLSBEcmlmdGVkOiBcIiArIChbLltdIHwgc2VsZWN0KC5kcmlmdFN0YXR1cyA9PSBcIkRSSUZURURcIildIHwgbGVuZ3RoIHwgdG9zdHJpbmcpICsgXCJcXFxcblwiICtcXG4nICtcbiAgICAgICdcIi0gRXJyb3JzOiBcIiArIChbLltdIHwgc2VsZWN0KC5lcnJvcildIHwgbGVuZ3RoIHwgdG9zdHJpbmcpICsgXCJcXFxcblwiICtcXG4nICtcbiAgICAgICcoWy5bXSB8IHNlbGVjdCguZHJpZnRTdGF0dXMgPT0gXCJEUklGVEVEXCIpXSB8IGlmIGxlbmd0aCA+IDAgdGhlbiBcIlxcXFxuKipEcmlmdGVkIHN0YWNrczoqKlxcXFxuXCIgKyAobWFwKFwiICAtIFwiICsgLnN0YWNrTmFtZSArIFwiIChcIiArICgoLmRyaWZ0ZWRSZXNvdXJjZXMgLy8gW10pIHwgbGVuZ3RoIHwgdG9zdHJpbmcpICsgXCIgcmVzb3VyY2VzKVwiKSB8IGpvaW4oXCJcXFxcblwiKSkgZWxzZSBcIlwiIGVuZClcXG4nICtcbiAgICAnXFwnJyArXG4gICAgJyBcIiRmaWxlXCIgPj4gJEdJVEhVQl9TVEVQX1NVTU1BUlknLFxuICAgICcgICAgZWNobyBcIlwiID4+ICRHSVRIVUJfU1RFUF9TVU1NQVJZJyxcbiAgICAnICAgIHRvdGFsX3N0YWNrcz0kKCh0b3RhbF9zdGFja3MgKyAkKGpxIFxcXCJsZW5ndGhcXFwiIFxcXCIkZmlsZVxcXCIpKSknLFxuICAgICcgICAgdG90YWxfZHJpZnRlZD0kKCh0b3RhbF9kcmlmdGVkICsgJChqcSBcXFwiWy5bXSB8IHNlbGVjdCguZHJpZnRTdGF0dXMgPT0gXFxcXFxcXCJEUklGVEVEXFxcXFxcXCIpXSB8IGxlbmd0aFxcXCIgXFxcIiRmaWxlXFxcIikpKScsXG4gICAgJyAgICB0b3RhbF9lcnJvcnM9JCgodG90YWxfZXJyb3JzICsgJChqcSBcXFwiWy5bXSB8IHNlbGVjdCguZXJyb3IpXSB8IGxlbmd0aFxcXCIgXFxcIiRmaWxlXFxcIikpKScsXG4gICAgJyAgZmknLFxuICAgICdkb25lJyxcbiAgICAnJyxcbiAgICAnZWNobyBcIiMjIyBPdmVyYWxsIFN1bW1hcnlcIiA+PiAkR0lUSFVCX1NURVBfU1VNTUFSWScsXG4gICAgJ2VjaG8gXCItIFRvdGFsIHN0YWNrcyBjaGVja2VkOiAkdG90YWxfc3RhY2tzXCIgPj4gJEdJVEhVQl9TVEVQX1NVTU1BUlknLFxuICAgICdlY2hvIFwiLSBUb3RhbCBkcmlmdGVkIHN0YWNrczogJHRvdGFsX2RyaWZ0ZWRcIiA+PiAkR0lUSFVCX1NURVBfU1VNTUFSWScsXG4gICAgJ2VjaG8gXCItIFRvdGFsIGVycm9yczogJHRvdGFsX2Vycm9yc1wiID4+ICRHSVRIVUJfU1RFUF9TVU1NQVJZJyxcbiAgICAnJyxcbiAgICAnaWYgW1sgJHRvdGFsX2RyaWZ0ZWQgLWd0IDAgXV07IHRoZW4nLFxuICAgICcgIGVjaG8gXCJcIiA+PiAkR0lUSFVCX1NURVBfU1VNTUFSWScsXG4gICAgJyAgZWNobyBcIuKaoO+4jyAqKkFjdGlvbiByZXF1aXJlZDoqKiBEcmlmdCBkZXRlY3RlZCBpbiAkdG90YWxfZHJpZnRlZCBzdGFja3NcIiA+PiAkR0lUSFVCX1NURVBfU1VNTUFSWScsXG4gICAgJ2ZpJyxcbiAgXS5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24gdG9LZWJhYkNhc2Uoczogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHMucmVwbGFjZSgvW15hLXpBLVowLTldKy9nLCAnLScpLnJlcGxhY2UoL14tK3wtKyQvZywgJycpLnRvTG93ZXJDYXNlKCk7XG59XG5cblxuZnVuY3Rpb24gdG9HaXRodWJKb2JJZChzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBHaXRIdWIgam9iX2lkIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciBvciB1bmRlcnNjb3JlIGFuZCBjb250YWluIG9ubHkgQS1aYS16MC05LCAnLScsICdfJ1xuICAvLyAxKSBSZXBsYWNlIGFueSBkaXNhbGxvd2VkIGNoYXJzIHdpdGggJy0nXG4gIGxldCBvdXQgPSBzLnJlcGxhY2UoL1teQS1aYS16MC05Xy1dKy9nLCAnLScpO1xuICAvLyAyKSBDb2xsYXBzZSBjb25zZWN1dGl2ZSBkYXNoZXNcbiAgb3V0ID0gb3V0LnJlcGxhY2UoLy0rL2csICctJyk7XG4gIC8vIDMpIFRyaW0gbGVhZGluZy90cmFpbGluZyBkYXNoZXMgKHVuZGVyc2NvcmVzIGFyZSBhbGxvd2VkIGF0IHN0YXJ0KVxuICBvdXQgPSBvdXQucmVwbGFjZSgvXi0rfC0rJC9nLCAnJyk7XG4gIC8vIDQpIExvd2VyY2FzZSBmb3IgY29uc2lzdGVuY3kgKG5vdCByZXF1aXJlZCBieSBHaXRIdWIgYnV0IGtlZXBzIHRoaW5ncyBzdGFibGUpXG4gIG91dCA9IG91dC50b0xvd2VyQ2FzZSgpO1xuICAvLyA1KSBFbnN1cmUgaXQgc3RhcnRzIHdpdGggYSBsZXR0ZXIgb3IgdW5kZXJzY29yZVxuICBpZiAoIW91dCB8fCAhL15bYS16X10vaS50ZXN0KG91dCkpIHtcbiAgICBvdXQgPSBgcy0ke291dH1gO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iXX0=
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface CdkDriftIamTemplateProps {
|
|
2
|
+
readonly project: any;
|
|
3
|
+
readonly roleName: string;
|
|
4
|
+
readonly outputPath?: string;
|
|
5
|
+
readonly oidcRoleArn: string;
|
|
6
|
+
readonly oidcRegion: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class CdkDriftIamTemplate {
|
|
9
|
+
constructor(props: CdkDriftIamTemplateProps);
|
|
10
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.CdkDriftIamTemplate = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
const projen_1 = require("projen");
|
|
7
|
+
class CdkDriftIamTemplate {
|
|
8
|
+
constructor(props) {
|
|
9
|
+
const outputPath = props.outputPath ?? 'cdk-drift-workflow-iam-template.yaml';
|
|
10
|
+
props.project.addTask('deploy-cdkdrift-iam-template', {
|
|
11
|
+
description: 'Deploy the CDK Drift Detection IAM template via CloudFormation (accepts extra AWS CLI args, e.g., --parameter-overrides Key=Value...)',
|
|
12
|
+
receiveArgs: true,
|
|
13
|
+
exec: `aws cloudformation deploy --template-file ${outputPath} --stack-name cdk-drift-workflow-iam-role --capabilities CAPABILITY_NAMED_IAM`,
|
|
14
|
+
});
|
|
15
|
+
new projen_1.TextFile(props.project, outputPath, {
|
|
16
|
+
lines: [
|
|
17
|
+
"AWSTemplateFormatVersion: '2010-09-09'",
|
|
18
|
+
"Description: 'IAM role for CDK Drift Detection Workflow'",
|
|
19
|
+
'',
|
|
20
|
+
'Parameters:',
|
|
21
|
+
' GitHubOIDCRoleArn:',
|
|
22
|
+
' Type: String',
|
|
23
|
+
" Description: 'ARN of the existing GitHub OIDC role that can assume this drift role'",
|
|
24
|
+
` Default: '${props.oidcRoleArn}'`,
|
|
25
|
+
'',
|
|
26
|
+
'Resources:',
|
|
27
|
+
' # CloudFormation Drift Detection Role - minimal permissions for drift detection operations',
|
|
28
|
+
' CdkDriftRole:',
|
|
29
|
+
' Type: AWS::IAM::Role',
|
|
30
|
+
' Properties:',
|
|
31
|
+
" RoleName: '" + props.roleName + "'",
|
|
32
|
+
' AssumeRolePolicyDocument:',
|
|
33
|
+
" Version: '2012-10-17'",
|
|
34
|
+
' Statement:',
|
|
35
|
+
' - Effect: Allow',
|
|
36
|
+
' Principal:',
|
|
37
|
+
' AWS: !Ref GitHubOIDCRoleArn',
|
|
38
|
+
' Action: sts:AssumeRole',
|
|
39
|
+
' Condition:',
|
|
40
|
+
' StringEquals:',
|
|
41
|
+
" aws:RequestedRegion: '" + props.oidcRegion + "'",
|
|
42
|
+
' Policies:',
|
|
43
|
+
' - PolicyName: CloudFormationDriftAccess',
|
|
44
|
+
' PolicyDocument:',
|
|
45
|
+
" Version: '2012-10-17'",
|
|
46
|
+
' Statement:',
|
|
47
|
+
' # CloudFormation drift detection operations',
|
|
48
|
+
' - Effect: Allow',
|
|
49
|
+
' Action:',
|
|
50
|
+
' - cloudformation:DetectStackDrift',
|
|
51
|
+
' - cloudformation:DescribeStackDriftDetectionStatus',
|
|
52
|
+
' - cloudformation:DescribeStackResourceDrifts',
|
|
53
|
+
' - cloudformation:DescribeStacks',
|
|
54
|
+
' - cloudformation:ListStackResources',
|
|
55
|
+
' - cloudformation:DetectStackResourceDrift',
|
|
56
|
+
" Resource: '*'",
|
|
57
|
+
'',
|
|
58
|
+
'Outputs:',
|
|
59
|
+
' CdkDriftRoleArn:',
|
|
60
|
+
" Description: 'ARN of the CDK drift detection role'",
|
|
61
|
+
' Value: !GetAtt CdkDriftRole.Arn',
|
|
62
|
+
' Export:',
|
|
63
|
+
" Name: !Sub '${AWS::StackName}-CdkDriftRoleArn'",
|
|
64
|
+
'',
|
|
65
|
+
' CdkDriftRoleName:',
|
|
66
|
+
" Description: 'Name of the CDK drift detection role'",
|
|
67
|
+
' Value: !Ref CdkDriftRole',
|
|
68
|
+
' Export:',
|
|
69
|
+
" Name: !Sub '${AWS::StackName}-CdkDriftRoleName'",
|
|
70
|
+
],
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
exports.CdkDriftIamTemplate = CdkDriftIamTemplate;
|
|
75
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
76
|
+
CdkDriftIamTemplate[_a] = { fqn: "@jjrawlins/cdk-diff-pr-github-action.CdkDriftIamTemplate", version: "0.0.1" };
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2RrRHJpZnRJYW1UZW1wbGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9DZGtEcmlmdElhbVRlbXBsYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsbUNBQWtDO0FBVWxDLE1BQWEsbUJBQW1CO0lBQzlCLFlBQVksS0FBK0I7UUFDekMsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsSUFBSSxzQ0FBc0MsQ0FBQztRQUU5RSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyw4QkFBOEIsRUFBRTtZQUNwRCxXQUFXLEVBQ1QsdUlBQXVJO1lBQ3pJLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLElBQUksRUFDRiw2Q0FBNkMsVUFBVSwrRUFBK0U7U0FDekksQ0FBQyxDQUFDO1FBRUgsSUFBSSxpQkFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFO1lBQ3RDLEtBQUssRUFBRTtnQkFDTCx3Q0FBd0M7Z0JBQ3hDLDBEQUEwRDtnQkFDMUQsRUFBRTtnQkFDRixhQUFhO2dCQUNiLHNCQUFzQjtnQkFDdEIsa0JBQWtCO2dCQUNsQix5RkFBeUY7Z0JBQ3pGLGlCQUFpQixLQUFLLENBQUMsV0FBVyxHQUFHO2dCQUNyQyxFQUFFO2dCQUNGLFlBQVk7Z0JBQ1osOEZBQThGO2dCQUM5RixpQkFBaUI7Z0JBQ2pCLDBCQUEwQjtnQkFDMUIsaUJBQWlCO2dCQUNqQixtQkFBbUIsR0FBRyxLQUFLLENBQUMsUUFBUSxHQUFHLEdBQUc7Z0JBQzFDLGlDQUFpQztnQkFDakMsK0JBQStCO2dCQUMvQixvQkFBb0I7Z0JBQ3BCLDJCQUEyQjtnQkFDM0Isd0JBQXdCO2dCQUN4QiwyQ0FBMkM7Z0JBQzNDLG9DQUFvQztnQkFDcEMsd0JBQXdCO2dCQUN4Qiw2QkFBNkI7Z0JBQzdCLHdDQUF3QyxHQUFHLEtBQUssQ0FBQyxVQUFVLEdBQUcsR0FBRztnQkFDakUsaUJBQWlCO2dCQUNqQixpREFBaUQ7Z0JBQ2pELDJCQUEyQjtnQkFDM0IsbUNBQW1DO2dCQUNuQyx3QkFBd0I7Z0JBQ3hCLDJEQUEyRDtnQkFDM0QsK0JBQStCO2dCQUMvQix5QkFBeUI7Z0JBQ3pCLHFEQUFxRDtnQkFDckQsc0VBQXNFO2dCQUN0RSxnRUFBZ0U7Z0JBQ2hFLG1EQUFtRDtnQkFDbkQsdURBQXVEO2dCQUN2RCw2REFBNkQ7Z0JBQzdELCtCQUErQjtnQkFDL0IsRUFBRTtnQkFDRixVQUFVO2dCQUNWLG9CQUFvQjtnQkFDcEIsd0RBQXdEO2dCQUN4RCxxQ0FBcUM7Z0JBQ3JDLGFBQWE7Z0JBQ2Isc0RBQXNEO2dCQUN0RCxFQUFFO2dCQUNGLHFCQUFxQjtnQkFDckIseURBQXlEO2dCQUN6RCw4QkFBOEI7Z0JBQzlCLGFBQWE7Z0JBQ2IsdURBQXVEO2FBQ3hEO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUFyRUgsa0RBc0VDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGV4dEZpbGUgfSBmcm9tICdwcm9qZW4nO1xuXG5leHBvcnQgaW50ZXJmYWNlIENka0RyaWZ0SWFtVGVtcGxhdGVQcm9wcyB7XG4gIHJlYWRvbmx5IHByb2plY3Q6IGFueTtcbiAgcmVhZG9ubHkgcm9sZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgb3V0cHV0UGF0aD86IHN0cmluZztcbiAgcmVhZG9ubHkgb2lkY1JvbGVBcm46IHN0cmluZztcbiAgcmVhZG9ubHkgb2lkY1JlZ2lvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgQ2RrRHJpZnRJYW1UZW1wbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBDZGtEcmlmdElhbVRlbXBsYXRlUHJvcHMpIHtcbiAgICBjb25zdCBvdXRwdXRQYXRoID0gcHJvcHMub3V0cHV0UGF0aCA/PyAnY2RrLWRyaWZ0LXdvcmtmbG93LWlhbS10ZW1wbGF0ZS55YW1sJztcblxuICAgIHByb3BzLnByb2plY3QuYWRkVGFzaygnZGVwbG95LWNka2RyaWZ0LWlhbS10ZW1wbGF0ZScsIHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnRGVwbG95IHRoZSBDREsgRHJpZnQgRGV0ZWN0aW9uIElBTSB0ZW1wbGF0ZSB2aWEgQ2xvdWRGb3JtYXRpb24gKGFjY2VwdHMgZXh0cmEgQVdTIENMSSBhcmdzLCBlLmcuLCAtLXBhcmFtZXRlci1vdmVycmlkZXMgS2V5PVZhbHVlLi4uKScsXG4gICAgICByZWNlaXZlQXJnczogdHJ1ZSxcbiAgICAgIGV4ZWM6XG4gICAgICAgIGBhd3MgY2xvdWRmb3JtYXRpb24gZGVwbG95IC0tdGVtcGxhdGUtZmlsZSAke291dHB1dFBhdGh9IC0tc3RhY2stbmFtZSBjZGstZHJpZnQtd29ya2Zsb3ctaWFtLXJvbGUgLS1jYXBhYmlsaXRpZXMgQ0FQQUJJTElUWV9OQU1FRF9JQU1gLFxuICAgIH0pO1xuXG4gICAgbmV3IFRleHRGaWxlKHByb3BzLnByb2plY3QsIG91dHB1dFBhdGgsIHtcbiAgICAgIGxpbmVzOiBbXG4gICAgICAgIFwiQVdTVGVtcGxhdGVGb3JtYXRWZXJzaW9uOiAnMjAxMC0wOS0wOSdcIixcbiAgICAgICAgXCJEZXNjcmlwdGlvbjogJ0lBTSByb2xlIGZvciBDREsgRHJpZnQgRGV0ZWN0aW9uIFdvcmtmbG93J1wiLFxuICAgICAgICAnJyxcbiAgICAgICAgJ1BhcmFtZXRlcnM6JyxcbiAgICAgICAgJyAgR2l0SHViT0lEQ1JvbGVBcm46JyxcbiAgICAgICAgJyAgICBUeXBlOiBTdHJpbmcnLFxuICAgICAgICBcIiAgICBEZXNjcmlwdGlvbjogJ0FSTiBvZiB0aGUgZXhpc3RpbmcgR2l0SHViIE9JREMgcm9sZSB0aGF0IGNhbiBhc3N1bWUgdGhpcyBkcmlmdCByb2xlJ1wiLFxuICAgICAgICBgICAgIERlZmF1bHQ6ICcke3Byb3BzLm9pZGNSb2xlQXJufSdgLFxuICAgICAgICAnJyxcbiAgICAgICAgJ1Jlc291cmNlczonLFxuICAgICAgICAnICAjIENsb3VkRm9ybWF0aW9uIERyaWZ0IERldGVjdGlvbiBSb2xlIC0gbWluaW1hbCBwZXJtaXNzaW9ucyBmb3IgZHJpZnQgZGV0ZWN0aW9uIG9wZXJhdGlvbnMnLFxuICAgICAgICAnICBDZGtEcmlmdFJvbGU6JyxcbiAgICAgICAgJyAgICBUeXBlOiBBV1M6OklBTTo6Um9sZScsXG4gICAgICAgICcgICAgUHJvcGVydGllczonLFxuICAgICAgICBcIiAgICAgIFJvbGVOYW1lOiAnXCIgKyBwcm9wcy5yb2xlTmFtZSArIFwiJ1wiLFxuICAgICAgICAnICAgICAgQXNzdW1lUm9sZVBvbGljeURvY3VtZW50OicsXG4gICAgICAgIFwiICAgICAgICBWZXJzaW9uOiAnMjAxMi0xMC0xNydcIixcbiAgICAgICAgJyAgICAgICAgU3RhdGVtZW50OicsXG4gICAgICAgICcgICAgICAgICAgLSBFZmZlY3Q6IEFsbG93JyxcbiAgICAgICAgJyAgICAgICAgICAgIFByaW5jaXBhbDonLFxuICAgICAgICAnICAgICAgICAgICAgICBBV1M6ICFSZWYgR2l0SHViT0lEQ1JvbGVBcm4nLFxuICAgICAgICAnICAgICAgICAgICAgQWN0aW9uOiBzdHM6QXNzdW1lUm9sZScsXG4gICAgICAgICcgICAgICAgICAgICBDb25kaXRpb246JyxcbiAgICAgICAgJyAgICAgICAgICAgICAgU3RyaW5nRXF1YWxzOicsXG4gICAgICAgIFwiICAgICAgICAgICAgICAgIGF3czpSZXF1ZXN0ZWRSZWdpb246ICdcIiArIHByb3BzLm9pZGNSZWdpb24gKyBcIidcIixcbiAgICAgICAgJyAgICAgIFBvbGljaWVzOicsXG4gICAgICAgICcgICAgICAgIC0gUG9saWN5TmFtZTogQ2xvdWRGb3JtYXRpb25EcmlmdEFjY2VzcycsXG4gICAgICAgICcgICAgICAgICAgUG9saWN5RG9jdW1lbnQ6JyxcbiAgICAgICAgXCIgICAgICAgICAgICBWZXJzaW9uOiAnMjAxMi0xMC0xNydcIixcbiAgICAgICAgJyAgICAgICAgICAgIFN0YXRlbWVudDonLFxuICAgICAgICAnICAgICAgICAgICAgICAjIENsb3VkRm9ybWF0aW9uIGRyaWZ0IGRldGVjdGlvbiBvcGVyYXRpb25zJyxcbiAgICAgICAgJyAgICAgICAgICAgICAgLSBFZmZlY3Q6IEFsbG93JyxcbiAgICAgICAgJyAgICAgICAgICAgICAgICBBY3Rpb246JyxcbiAgICAgICAgJyAgICAgICAgICAgICAgICAgIC0gY2xvdWRmb3JtYXRpb246RGV0ZWN0U3RhY2tEcmlmdCcsXG4gICAgICAgICcgICAgICAgICAgICAgICAgICAtIGNsb3VkZm9ybWF0aW9uOkRlc2NyaWJlU3RhY2tEcmlmdERldGVjdGlvblN0YXR1cycsXG4gICAgICAgICcgICAgICAgICAgICAgICAgICAtIGNsb3VkZm9ybWF0aW9uOkRlc2NyaWJlU3RhY2tSZXNvdXJjZURyaWZ0cycsXG4gICAgICAgICcgICAgICAgICAgICAgICAgICAtIGNsb3VkZm9ybWF0aW9uOkRlc2NyaWJlU3RhY2tzJyxcbiAgICAgICAgJyAgICAgICAgICAgICAgICAgIC0gY2xvdWRmb3JtYXRpb246TGlzdFN0YWNrUmVzb3VyY2VzJyxcbiAgICAgICAgJyAgICAgICAgICAgICAgICAgIC0gY2xvdWRmb3JtYXRpb246RGV0ZWN0U3RhY2tSZXNvdXJjZURyaWZ0JyxcbiAgICAgICAgXCIgICAgICAgICAgICAgICAgUmVzb3VyY2U6ICcqJ1wiLFxuICAgICAgICAnJyxcbiAgICAgICAgJ091dHB1dHM6JyxcbiAgICAgICAgJyAgQ2RrRHJpZnRSb2xlQXJuOicsXG4gICAgICAgIFwiICAgIERlc2NyaXB0aW9uOiAnQVJOIG9mIHRoZSBDREsgZHJpZnQgZGV0ZWN0aW9uIHJvbGUnXCIsXG4gICAgICAgICcgICAgVmFsdWU6ICFHZXRBdHQgQ2RrRHJpZnRSb2xlLkFybicsXG4gICAgICAgICcgICAgRXhwb3J0OicsXG4gICAgICAgIFwiICAgICAgTmFtZTogIVN1YiAnJHtBV1M6OlN0YWNrTmFtZX0tQ2RrRHJpZnRSb2xlQXJuJ1wiLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgQ2RrRHJpZnRSb2xlTmFtZTonLFxuICAgICAgICBcIiAgICBEZXNjcmlwdGlvbjogJ05hbWUgb2YgdGhlIENESyBkcmlmdCBkZXRlY3Rpb24gcm9sZSdcIixcbiAgICAgICAgJyAgICBWYWx1ZTogIVJlZiBDZGtEcmlmdFJvbGUnLFxuICAgICAgICAnICAgIEV4cG9ydDonLFxuICAgICAgICBcIiAgICAgIE5hbWU6ICFTdWIgJyR7QVdTOjpTdGFja05hbWV9LUNka0RyaWZ0Um9sZU5hbWUnXCIsXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -41,8 +41,8 @@ class CdkChangesetScript {
|
|
|
41
41
|
' const props: string[] = [];',
|
|
42
42
|
' for (const d of details) {',
|
|
43
43
|
" if (d?.Target?.Attribute !== 'Properties') continue;",
|
|
44
|
-
" const
|
|
45
|
-
' props.push(`- ${
|
|
44
|
+
" const workflowName = d?.Target?.Name ?? '-';",
|
|
45
|
+
' props.push(`- ${workflowName}`);',
|
|
46
46
|
' }',
|
|
47
47
|
" return props.join('<br>');",
|
|
48
48
|
'}',
|
|
@@ -253,4 +253,4 @@ class CdkChangesetScript {
|
|
|
253
253
|
}
|
|
254
254
|
}
|
|
255
255
|
exports.CdkChangesetScript = CdkChangesetScript;
|
|
256
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWNoYW5nZXNldC1zY3JpcHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmluL2Nkay1jaGFuZ2VzZXQtc2NyaXB0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFrQztBQVFsQyxNQUFhLGtCQUFrQjtJQUM3QixZQUFZLEtBQThCO1FBQ3hDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLElBQUksb0NBQW9DLENBQUM7UUFFNUUsSUFBSSxpQkFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFO1lBQ3RDLEtBQUssRUFBRTtnQkFDTCwyQ0FBMkM7Z0JBQzNDLGtHQUFrRztnQkFDbEcsRUFBRTtnQkFDRix5R0FBeUc7Z0JBQ3pHLEVBQUU7Z0JBQ0YsS0FBSztnQkFDTCx3QkFBd0I7Z0JBQ3hCLEtBQUs7Z0JBQ0wsMEVBQTBFO2dCQUMxRSxFQUFFO2dCQUNGLEtBQUs7Z0JBQ0wsNkNBQTZDO2dCQUM3QyxpRUFBaUU7Z0JBQ2pFLEtBQUs7Z0JBQ0wsZ0RBQWdEO2dCQUNoRCwyREFBMkQ7Z0JBQzNELDhDQUE4QztnQkFDOUMsbUJBQW1CO2dCQUNuQixnQkFBZ0I7Z0JBQ2hCLG1CQUFtQjtnQkFDbkIsTUFBTTtnQkFDTiwwREFBMEQ7Z0JBQzFELHNDQUFzQztnQkFDdEMsR0FBRztnQkFDSCxFQUFFO2dCQUNGLEtBQUs7Z0JBQ0wsK0VBQStFO2dCQUMvRSx3Q0FBd0M7Z0JBQ3hDLEtBQUs7Z0JBQ0wsdURBQXVEO2dCQUN2RCwwREFBMEQ7Z0JBQzFELCtCQUErQjtnQkFDL0IsOEJBQThCO2dCQUM5QiwwREFBMEQ7Z0JBQzFELDBDQUEwQztnQkFDMUMsOEJBQThCO2dCQUM5QixLQUFLO2dCQUNMLDhCQUE4QjtnQkFDOUIsR0FBRztnQkFDSCxFQUFFO2dCQUNGLEtBQUs7Z0JBQ0wsd0ZBQXdGO2dCQUN4Rix5R0FBeUc7Z0JBQ3pHLDJHQUEyRztnQkFDM0csS0FBSztnQkFDTCx1R0FBdUc7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QUMvRCx5RUFBeUU7Z0JBQ3pFLDJCQUEyQjtnQkFDM0IsYUFBYTtnQkFDYixLQUFLO2dCQUNMLEVBQUU7Z0JBQ0YsNkZBQTZGO2dCQUM3RixnQ0FBZ0M7Z0JBQ2hDLDJDQUEyQztnQkFDM0MsbUJBQW1CO2dCQUNuQiwyQkFBMkI7Z0JBQzNCLHlCQUF5QjtnQkFDekIsTUFBTTtnQkFDTixrQ0FBa0M7Z0JBQ2xDLG1DQUFtQztnQkFDbkMsbUJBQW1CO2dCQUNuQiwyQkFBMkI7Z0JBQzNCLHlCQUF5QjtnQkFDekIsTUFBTTtnQkFDTixvR0FBb0c7Z0JBQ3BHLEVBQUU7Z0JBQ0YsNkdBQTZHO2dCQUM3Ryx3REFBd0Q7Z0JBQ3hELEVBQUU7Z0JBQ0Ysc0JBQXNCO2dCQUN0Qix1RUFBdUU7Z0JBQ3ZFLHNCQUFzQjtnQkFDdEIsRUFBRTtnQkFDRiwrQ0FBK0M7Z0JBQy9DLDhCQUE4QjtnQkFDOUIsV0FBVztnQkFDWCwyREFBMkQ7Z0JBQzNELHNGQUFzRjtnQkFDdEYsd0JBQXdCO2dCQUN4QixtRkFBbUY7Z0JBQ25GLE9BQU87Z0JBQ1AsS0FBSztnQkFDTCxFQUFFO2dCQUNGLG1DQUFtQztnQkFDbkMsNkNBQTZDO2dCQUM3QyxXQUFXO2dCQUNYLHdFQUF3RTtnQkFDeEUsNkRBQTZEO2dCQUM3RCx3QkFBd0I7Z0JBQ3hCLDRFQUE0RTtnQkFDNUUsZ0VBQWdFO2dCQUNoRSxPQUFPO2dCQUNQLEtBQUs7Z0JBQ0wsRUFBRTtnQkFDRiw0R0FBNEc7Z0JBQzVHLDhDQUE4QztnQkFDOUMsMEVBQTBFO2dCQUMxRSxLQUFLO2dCQUNMLEdBQUc7Z0JBQ0gsRUFBRTtnQkFDRix5QkFBeUI7Z0JBQ3pCLHVCQUF1QjtnQkFDdkIseUJBQXlCO2dCQUN6QixLQUFLO2FBQ047U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUExUEQsZ0RBMFBDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGV4dEZpbGUgfSBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgQXdzQ2RrVHlwZVNjcmlwdEFwcCB9IGZyb20gJ3Byb2plbi9saWIvYXdzY2RrJztcblxuaW50ZXJmYWNlIENka0NoYW5nZXNldFNjcmlwdFByb3BzIHtcbiAgcHJvamVjdDogQXdzQ2RrVHlwZVNjcmlwdEFwcDtcbiAgb3V0cHV0UGF0aD86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIENka0NoYW5nZXNldFNjcmlwdCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBDZGtDaGFuZ2VzZXRTY3JpcHRQcm9wcykge1xuICAgIGNvbnN0IG91dHB1dFBhdGggPSBwcm9wcy5vdXRwdXRQYXRoID8/ICdwcm9qZW5yYy9kZXNjcmliZS1jZm4tY2hhbmdlc2V0LnRzJztcblxuICAgIG5ldyBUZXh0RmlsZShwcm9wcy5wcm9qZWN0LCBvdXRwdXRQYXRoLCB7XG4gICAgICBsaW5lczogW1xuICAgICAgICBcImltcG9ydCB7IGFwcGVuZEZpbGUgfSBmcm9tICdmcy9wcm9taXNlcyc7XCIsXG4gICAgICAgIFwiaW1wb3J0IHsgQ2xvdWRGb3JtYXRpb25DbGllbnQsIERlc2NyaWJlQ2hhbmdlU2V0Q29tbWFuZCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1jbG91ZGZvcm1hdGlvbic7XCIsXG4gICAgICAgICcnLFxuICAgICAgICBcInR5cGUgQ2hhbmdlID0gTm9uTnVsbGFibGU8QXdhaXRlZDxSZXR1cm5UeXBlPENsb3VkRm9ybWF0aW9uQ2xpZW50WydzZW5kJ10+PiBleHRlbmRzIGFueSA/IGFueSA6IG5ldmVyPjtcIixcbiAgICAgICAgJycsXG4gICAgICAgICcvKionLFxuICAgICAgICAnICogU21hbGwgc2xlZXAgaGVscGVyLicsXG4gICAgICAgICcgKi8nLFxuICAgICAgICAnY29uc3Qgc2xlZXAgPSAobXM6IG51bWJlcikgPT4gbmV3IFByb21pc2UoKHJlcykgPT4gc2V0VGltZW91dChyZXMsIG1zKSk7JyxcbiAgICAgICAgJycsXG4gICAgICAgICcvKionLFxuICAgICAgICAnICogQnVpbGQgdGhlIEhUTUwgY29sb3IgY2hpcCBmb3IgYW4gYWN0aW9uLicsXG4gICAgICAgICcgKiBNb2RpZnk9Ymx1ZSwgQWRkPWdyZWVuLCBSZW1vdmU9cmVkIChtYXRjaCBwcmV0dHlfZm9ybWF0LnB5KS4nLFxuICAgICAgICAnICovJyxcbiAgICAgICAgJ2Z1bmN0aW9uIGFjdGlvbkNoaXAoYWN0aW9uPzogc3RyaW5nKTogc3RyaW5nIHsnLFxuICAgICAgICAnICAvLyBVc2UgZW1vamkgaW5zdGVhZCBvZiBleHRlcm5hbCBpbWFnZXMgZm9yIHJlbGlhYmlsaXR5JyxcbiAgICAgICAgJyAgY29uc3QgZW1vamlNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7JyxcbiAgICAgICAgXCIgICAgTW9kaWZ5OiAn8J+UtScsXCIsXG4gICAgICAgIFwiICAgIEFkZDogJ/Cfn6InLFwiLFxuICAgICAgICBcIiAgICBSZW1vdmU6ICfwn5S0JyxcIixcbiAgICAgICAgJyAgfTsnLFxuICAgICAgICBcIiAgY29uc3QgbWFyayA9IGFjdGlvbiA/IChlbW9qaU1hcFthY3Rpb25dID8/ICfimqonKSA6ICfimqonO1wiLFxuICAgICAgICBcIiAgcmV0dXJuIGAke21hcmt9ICR7YWN0aW9uID8/ICctJ31gO1wiLFxuICAgICAgICAnfScsXG4gICAgICAgICcnLFxuICAgICAgICAnLyoqJyxcbiAgICAgICAgXCIgKiBFeHRyYWN0IGNoYW5nZWQgcHJvcGVydHkgbmFtZXMgb25seSB3aGVyZSBUYXJnZXQuQXR0cmlidXRlID09ICdQcm9wZXJ0aWVzJ1wiLFxuICAgICAgICAnICogam9pbmVkIGJ5IDxicj4sIHByZWZpeGVkIHdpdGggXCItIFwiLicsXG4gICAgICAgICcgKi8nLFxuICAgICAgICAnZnVuY3Rpb24gY2hhbmdlZFByb3BlcnRpZXNIVE1MKGNoYW5nZTogYW55KTogc3RyaW5nIHsnLFxuICAgICAgICAnICBjb25zdCBkZXRhaWxzID0gY2hhbmdlPy5SZXNvdXJjZUNoYW5nZT8uRGV0YWlscyA/PyBbXTsnLFxuICAgICAgICAnICBjb25zdCBwcm9wczogc3RyaW5nW10gPSBbXTsnLFxuICAgICAgICAnICBmb3IgKGNvbnN0IGQgb2YgZGV0YWlscykgeycsXG4gICAgICAgIFwiICAgIGlmIChkPy5UYXJnZXQ/LkF0dHJpYnV0ZSAhPT0gJ1Byb3BlcnRpZXMnKSBjb250aW51ZTtcIixcbiAgICAgICAgXCIgICAgY29uc3QgbmFtZSA9IGQ/LlRhcmdldD8uTmFtZSA/PyAnLSc7XCIsXG4gICAgICAgICcgICAgcHJvcHMucHVzaChgLSAke25hbWV9YCk7JyxcbiAgICAgICAgJyAgfScsXG4gICAgICAgIFwiICByZXR1cm4gcHJvcHMuam9pbignPGJyPicpO1wiLFxuICAgICAgICAnfScsXG4gICAgICAgICcnLFxuICAgICAgICAnLyoqJyxcbiAgICAgICAgJyAqIERldGVybWluZSBpZiBhIGNoYW5nZSBzaG91bGQgYmUgaWdub3JlZCBiYXNlZCBvbiBsb2dpY2FsIElEcyBhbmQvb3IgcmVzb3VyY2UgdHlwZXMuJyxcbiAgICAgICAgXCIgKiAtIElHTk9SRV9MT0dJQ0FMX0lEUzogY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbG9naWNhbCBJRHMgdG8gaWdub3JlIChkZWZhdWx0IGluY2x1ZGVzICdDREtNZXRhZGF0YScpXCIsXG4gICAgICAgIFwiICogLSBJR05PUkVfUkVTT1VSQ0VfVFlQRVM6IGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlc291cmNlIHR5cGVzIHRvIGlnbm9yZSAoZS5nLiwgJ0FXUzo6Q0RLOjpNZXRhZGF0YScpXCIsXG4gICAgICAgICcgKi8nLFxuICAgICAgICAnZnVuY3Rpb24gc2hvdWxkSWdub3JlQ2hhbmdlKGNoYW5nZTogYW55LCBpZ25vcmVJZHM6IFNldDxzdHJpbmc+LCBpZ25vcmVUeXBlczogU2V0PHN0cmluZz4pOiBib29sZWFuIHsnLFxuICAgICAgICAnICBjb25zdCByYyA9IGNoYW5nZT8uUmVzb3VyY2VDaGFuZ2UgPz8ge307JyxcbiAgICAgICAgJyAgY29uc3QgbG9naWNhbElkID0gcmM/LkxvZ2ljYWxSZXNvdXJjZUlkIGFzIHN0cmluZyB8IHVuZGVmaW5lZDsnLFxuICAgICAgICAnICBjb25zdCByZXNvdXJjZVR5cGUgPSByYz8uUmVzb3VyY2VUeXBlIGFzIHN0cmluZyB8IHVuZGVmaW5lZDsnLFxuICAgICAgICAnICBpZiAobG9naWNhbElkICYmIGlnbm9yZUlkcy5oYXMobG9naWNhbElkKSkgcmV0dXJuIHRydWU7JyxcbiAgICAgICAgJyAgaWYgKHJlc291cmNlVHlwZSAmJiBpZ25vcmVUeXBlcy5oYXMocmVzb3VyY2VUeXBlKSkgcmV0dXJuIHRydWU7JyxcbiAgICAgICAgJyAgcmV0dXJuIGZhbHNlOycsXG4gICAgICAgICd9JyxcbiAgICAgICAgJycsXG4gICAgICAgICcvKionLFxuICAgICAgICAnICogR2VuZXJhdGUgdGhlIEhUTUwgYm9keSBzaW1pbGFyIHRvIHByZXR0eV9mb3JtYXQucHknLFxuICAgICAgICAnICovJyxcbiAgICAgICAgJ2Z1bmN0aW9uIGJ1aWxkSHRtbChzdGFja05hbWU6IHN0cmluZywgY2hhbmdlczogYW55W10pOiBzdHJpbmcgeycsXG4gICAgICAgICcgIGxldCBib2R5ID0gYDxoMT5DaGFuZ2Ugc2V0PC9oMT48aDI+U3RhY2sgTmFtZTogJHtzdGFja05hbWV9PC9oMj48YnI+YDsnLFxuICAgICAgICAnICBpZiAoKGNoYW5nZXM/Lmxlbmd0aCA/PyAwKSA+IDApIHsnLFxuICAgICAgICBcIiAgICBib2R5ICs9ICc8dGFibGU+PHRyPjx0aD5BY3Rpb24mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3RoPjx0aD5JRDwvdGg+PHRoPlR5cGU8L3RoPjx0aD5SZXBsYWNlbWVudDwvdGg+PHRoPkNoYW5nZWQgUHJvcGVydGllczwvdGg+PC90cj4nO1wiLFxuICAgICAgICAnICAgIGZvciAoY29uc3QgYyBvZiBjaGFuZ2VzKSB7JyxcbiAgICAgICAgJyAgICAgIGNvbnN0IHJjID0gYz8uUmVzb3VyY2VDaGFuZ2UgPz8ge307JyxcbiAgICAgICAgJyAgICAgIGNvbnN0IGFjdGlvbiA9IGFjdGlvbkNoaXAocmM/LkFjdGlvbik7JyxcbiAgICAgICAgXCIgICAgICBjb25zdCBsb2dpY2FsSWQgPSByYz8uTG9naWNhbFJlc291cmNlSWQgPz8gJy0nO1wiLFxuICAgICAgICBcIiAgICAgIGNvbnN0IHR5cGUgPSByYz8uUmVzb3VyY2VUeXBlID8/ICctJztcIixcbiAgICAgICAgXCIgICAgICBjb25zdCByZXBsYWNlbWVudCA9IHJjPy5SZXBsYWNlbWVudCA/PyAnLSc7XCIsXG4gICAgICAgICcgICAgICBjb25zdCBkZXRhaWxzID0gY2hhbmdlZFByb3BlcnRpZXNIVE1MKGMpOycsXG4gICAgICAgICcnLFxuICAgICAgICBcIiAgICAgIGJvZHkgKz0gJzx0cj4nO1wiLFxuICAgICAgICAnICAgICAgYm9keSArPSBgPHRkPiR7YWN0aW9ufTwvdGQ+YDsnLFxuICAgICAgICAnICAgICAgYm9keSArPSBgPHRkPiR7bG9naWNhbElkfTwvdGQ+YDsnLFxuICAgICAgICAnICAgICAgYm9keSArPSBgPHRkPiR7dHlwZX08L3RkPmA7JyxcbiAgICAgICAgJyAgICAgIGJvZHkgKz0gYDx0ZD4ke3JlcGxhY2VtZW50fTwvdGQ+YDsnLFxuICAgICAgICAnICAgICAgYm9keSArPSBgPHRkPiR7ZGV0YWlsc308L3RkPmA7JyxcbiAgICAgICAgXCIgICAgICBib2R5ICs9ICc8L3RyPic7XCIsXG4gICAgICAgICcgICAgfScsXG4gICAgICAgIFwiICAgIGJvZHkgKz0gJzwvdGFibGU+JztcIixcbiAgICAgICAgJyAgfSBlbHNlIHsnLFxuICAgICAgICBcIiAgICBib2R5ICs9ICdubyBjaGFuZ2UuJztcIixcbiAgICAgICAgJyAgfScsXG4gICAgICAgICcgIHJldHVybiBib2R5OycsXG4gICAgICAgICd9JyxcbiAgICAgICAgJycsXG4gICAgICAgICcvKionLFxuICAgICAgICAnICogUG9sbCBEZXNjcmliZUNoYW5nZVNldCB1bnRpbCBhIHRlcm1pbmFsIHN0YXR1cywgdGhlbiBwYWdpbmF0ZSB0byByZXRyaWV2ZSBhbGwgQ2hhbmdlcy4nLFxuICAgICAgICAnICovJyxcbiAgICAgICAgJ2FzeW5jIGZ1bmN0aW9uIGdldFRlcm1pbmFsQ2hhbmdlU2V0KCcsXG4gICAgICAgICcgIGNsaWVudDogQ2xvdWRGb3JtYXRpb25DbGllbnQsJyxcbiAgICAgICAgJyAgc3RhY2tOYW1lOiBzdHJpbmcsJyxcbiAgICAgICAgJyAgY2hhbmdlU2V0TmFtZTogc3RyaW5nLCcsXG4gICAgICAgICcgIG1heEF0dGVtcHRzID0gNjAsJyxcbiAgICAgICAgJyAgZGVsYXlNcyA9IDMwMDAsJyxcbiAgICAgICAgJyk6IFByb21pc2U8eyBzdGF0dXM/OiBzdHJpbmc7IHN0YXR1c1JlYXNvbj86IHN0cmluZzsgY2hhbmdlczogYW55W10gfT4geycsXG4gICAgICAgICcgIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IG1heEF0dGVtcHRzOyBhdHRlbXB0KyspIHsnLFxuICAgICAgICAnICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBjbGllbnQuc2VuZChuZXcgRGVzY3JpYmVDaGFuZ2VTZXRDb21tYW5kKHsnLFxuICAgICAgICAnICAgICAgU3RhY2tOYW1lOiBzdGFja05hbWUsJyxcbiAgICAgICAgJyAgICAgIENoYW5nZVNldE5hbWU6IGNoYW5nZVNldE5hbWUsJyxcbiAgICAgICAgJyAgICB9KSk7JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgICAgY29uc3Qgc3RhdHVzID0gcmVzcC5TdGF0dXM7JyxcbiAgICAgICAgJyAgICBjb25zdCBzdGF0dXNSZWFzb24gPSByZXNwLlN0YXR1c1JlYXNvbjsnLFxuICAgICAgICAnJyxcbiAgICAgICAgXCIgICAgaWYgKHN0YXR1cyA9PT0gJ0NSRUFURV9DT01QTEVURScgfHwgc3RhdHVzID09PSAnRkFJTEVEJykge1wiLFxuICAgICAgICAnICAgICAgLy8gR2F0aGVyIGFsbCBwYWdlcycsXG4gICAgICAgICcgICAgICBjb25zdCBjaGFuZ2VzOiBhbnlbXSA9IFtdOycsXG4gICAgICAgICcgICAgICBpZiAocmVzcC5DaGFuZ2VzKSBjaGFuZ2VzLnB1c2goLi4ucmVzcC5DaGFuZ2VzKTsnLFxuICAgICAgICAnICAgICAgbGV0IG5leHQgPSByZXNwLk5leHRUb2tlbjsnLFxuICAgICAgICAnICAgICAgd2hpbGUgKG5leHQpIHsnLFxuICAgICAgICAnICAgICAgICBjb25zdCBwYWdlID0gYXdhaXQgY2xpZW50LnNlbmQobmV3IERlc2NyaWJlQ2hhbmdlU2V0Q29tbWFuZCh7JyxcbiAgICAgICAgJyAgICAgICAgICBTdGFja05hbWU6IHN0YWNrTmFtZSwnLFxuICAgICAgICAnICAgICAgICAgIENoYW5nZVNldE5hbWU6IGNoYW5nZVNldE5hbWUsJyxcbiAgICAgICAgJyAgICAgICAgICBOZXh0VG9rZW46IG5leHQsJyxcbiAgICAgICAgJyAgICAgICAgfSkpOycsXG4gICAgICAgICcgICAgICAgIGlmIChwYWdlLkNoYW5nZXMpIGNoYW5nZXMucHVzaCguLi5wYWdlLkNoYW5nZXMpOycsXG4gICAgICAgICcgICAgICAgIG5leHQgPSBwYWdlLk5leHRUb2tlbjsnLFxuICAgICAgICAnICAgICAgfScsXG4gICAgICAgICcgICAgICByZXR1cm4geyBzdGF0dXMsIHN0YXR1c1JlYXNvbiwgY2hhbmdlcyB9OycsXG4gICAgICAgICcgICAgfScsXG4gICAgICAgICcnLFxuICAgICAgICAnICAgIC8vIE5vdCB0ZXJtaW5hbCB5ZXQ7IHdhaXQgYW5kIHJldHJ5JyxcbiAgICAgICAgJyAgICBhd2FpdCBzbGVlcChkZWxheU1zKTsnLFxuICAgICAgICAnICB9JyxcbiAgICAgICAgJycsXG4gICAgICAgIFwiICB0aHJvdyBuZXcgRXJyb3IoJ1RpbWVkIG91dCB3YWl0aW5nIGZvciBjaGFuZ2Ugc2V0IHRvIHJlYWNoIGEgdGVybWluYWwgc3RhdHVzLicpO1wiLFxuICAgICAgICAnfScsXG4gICAgICAgICcnLFxuICAgICAgICAnYXN5bmMgZnVuY3Rpb24gcG9zdEdpdGh1YkNvbW1lbnQodXJsOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcsIGJvZHk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4geycsXG4gICAgICAgICcgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgeycsXG4gICAgICAgIFwiICAgIG1ldGhvZDogJ1BPU1QnLFwiLFxuICAgICAgICAnICAgIGhlYWRlcnM6IHsnLFxuICAgICAgICBcIiAgICAgICdBdXRob3JpemF0aW9uJzogYHRva2VuICR7dG9rZW59YCxcIixcbiAgICAgICAgXCIgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFwiLFxuICAgICAgICBcIiAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uJyxcIixcbiAgICAgICAgJyAgICB9LCcsXG4gICAgICAgICcgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBib2R5IH0pLCcsXG4gICAgICAgICcgIH0pOycsXG4gICAgICAgICcnLFxuICAgICAgICAnICBpZiAoIXJlcy5vaykgeycsXG4gICAgICAgIFwiICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXMudGV4dCgpLmNhdGNoKCgpID0+ICcnKTtcIixcbiAgICAgICAgJyAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBwb3N0IEdpdEh1YiBjb21tZW50OiAke3Jlcy5zdGF0dXN9ICR7cmVzLnN0YXR1c1RleHR9ICR7dGV4dH1gKTsnLFxuICAgICAgICAnICB9JyxcbiAgICAgICAgJ30nLFxuICAgICAgICAnJyxcbiAgICAgICAgJ2FzeW5jIGZ1bmN0aW9uIGFwcGVuZFN0ZXBTdW1tYXJ5KHN1bW1hcnlQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4geycsXG4gICAgICAgIFwiICBhd2FpdCBhcHBlbmRGaWxlKHN1bW1hcnlQYXRoLCBgJHtjb250ZW50fVxcXFxuYCwgeyBlbmNvZGluZzogJ3V0ZjgnIH0pO1wiLFxuICAgICAgICAnfScsXG4gICAgICAgICcnLFxuICAgICAgICAnYXN5bmMgZnVuY3Rpb24gbWFpbigpIHsnLFxuICAgICAgICAnICBjb25zdCB7JyxcbiAgICAgICAgJyAgICBTVEFDS19OQU1FLCcsXG4gICAgICAgICcgICAgQ0hBTkdFX1NFVF9OQU1FLCcsXG4gICAgICAgICcgICAgQVdTX1JFR0lPTiwnLFxuICAgICAgICAnICAgIEdJVEhVQl9UT0tFTiwnLFxuICAgICAgICAnICAgIEdJVEhVQl9DT01NRU5UX1VSTCwnLFxuICAgICAgICAnICAgIEdJVEhVQl9TVEVQX1NVTU1BUlksJyxcbiAgICAgICAgJyAgICBJR05PUkVfTE9HSUNBTF9JRFMsJyxcbiAgICAgICAgJyAgICBJR05PUkVfUkVTT1VSQ0VfVFlQRVMsJyxcbiAgICAgICAgJyAgfSA9IHByb2Nlc3MuZW52OycsXG4gICAgICAgICcnLFxuICAgICAgICAnICBpZiAoIVNUQUNLX05BTUUpIHsnLFxuICAgICAgICBcIiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NUQUNLX05BTUUgaXMgcmVxdWlyZWQnKTtcIixcbiAgICAgICAgJyAgfScsXG4gICAgICAgICcgIGNvbnN0IHJlZ2lvbiA9IEFXU19SRUdJT04gfHwgcHJvY2Vzcy5lbnYuQVdTX0RFRkFVTFRfUkVHSU9OOycsXG4gICAgICAgICcgIGlmICghcmVnaW9uKSB7JyxcbiAgICAgICAgXCIgICAgdGhyb3cgbmV3IEVycm9yKCdBV1NfUkVHSU9OIGlzIHJlcXVpcmVkJyk7XCIsXG4gICAgICAgICcgIH0nLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgY29uc3QgY2hhbmdlU2V0TmFtZSA9IENIQU5HRV9TRVRfTkFNRSB8fCBTVEFDS19OQU1FOycsXG4gICAgICAgICcnLFxuICAgICAgICAnICBjb25zdCBjbGllbnQgPSBuZXcgQ2xvdWRGb3JtYXRpb25DbGllbnQoeyByZWdpb24gfSk7JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgIGxldCBzdGF0dXM6IHN0cmluZyB8IHVuZGVmaW5lZDsnLFxuICAgICAgICAnICBsZXQgc3RhdHVzUmVhc29uOiBzdHJpbmcgfCB1bmRlZmluZWQ7JyxcbiAgICAgICAgJyAgbGV0IGNoYW5nZXM6IGFueVtdID0gW107JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgIHRyeSB7JyxcbiAgICAgICAgJyAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRUZXJtaW5hbENoYW5nZVNldChjbGllbnQsIFNUQUNLX05BTUUsIGNoYW5nZVNldE5hbWUpOycsXG4gICAgICAgICcgICAgc3RhdHVzID0gcmVzdWx0LnN0YXR1czsnLFxuICAgICAgICAnICAgIHN0YXR1c1JlYXNvbiA9IHJlc3VsdC5zdGF0dXNSZWFzb247JyxcbiAgICAgICAgJyAgICBjaGFuZ2VzID0gcmVzdWx0LmNoYW5nZXMgPz8gW107JyxcbiAgICAgICAgJyAgfSBjYXRjaCAoZXJyOiBhbnkpIHsnLFxuICAgICAgICAnICAgIC8vIElmIERlc2NyaWJlQ2hhbmdlU2V0IGZhaWxzIGVudGlyZWx5LCBzdXJmYWNlIHRoZSBlcnJvcicsXG4gICAgICAgIFwiICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGRlc2NyaWJpbmcgY2hhbmdlIHNldDonLCBlcnI/Lm1lc3NhZ2UgfHwgZXJyKTtcIixcbiAgICAgICAgJyAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTsnLFxuICAgICAgICAnICAgIHJldHVybjsnLFxuICAgICAgICAnICB9JyxcbiAgICAgICAgJycsXG4gICAgICAgIFwiICAvLyBBcHBseSBpZ25vcmVzIGZyb20gZW52IHZhcnMgKElEcyBhbmQgdHlwZXMpLiBEZWZhdWx0IGlnbm9yZSBJRHMgaW5jbHVkZSAnQ0RLTWV0YWRhdGEnLlwiLFxuICAgICAgICAnICBjb25zdCBpZ25vcmVJZFNldCA9IG5ldyBTZXQoJyxcbiAgICAgICAgXCIgICAgKElHTk9SRV9MT0dJQ0FMX0lEUyA/PyAnQ0RLTWV0YWRhdGEnKVwiLFxuICAgICAgICBcIiAgICAgIC5zcGxpdCgnLCcpXCIsXG4gICAgICAgICcgICAgICAubWFwKHMgPT4gcy50cmltKCkpJyxcbiAgICAgICAgJyAgICAgIC5maWx0ZXIoQm9vbGVhbiksJyxcbiAgICAgICAgJyAgKTsnLFxuICAgICAgICAnICBjb25zdCBpZ25vcmVUeXBlU2V0ID0gbmV3IFNldCgnLFxuICAgICAgICBcIiAgICAoSUdOT1JFX1JFU09VUkNFX1RZUEVTID8/ICcnKVwiLFxuICAgICAgICBcIiAgICAgIC5zcGxpdCgnLCcpXCIsXG4gICAgICAgICcgICAgICAubWFwKHMgPT4gcy50cmltKCkpJyxcbiAgICAgICAgJyAgICAgIC5maWx0ZXIoQm9vbGVhbiksJyxcbiAgICAgICAgJyAgKTsnLFxuICAgICAgICAnICBjb25zdCBmaWx0ZXJlZENoYW5nZXMgPSBjaGFuZ2VzLmZpbHRlcihjID0+ICFzaG91bGRJZ25vcmVDaGFuZ2UoYywgaWdub3JlSWRTZXQsIGlnbm9yZVR5cGVTZXQpKTsnLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgLy8gQnVpbGQgSFRNTCBleGFjdGx5IGxpa2UgcHJldHR5X2Zvcm1hdC5weSBsb2dpYyAodGFibGUgd2hlbiB0aGVyZSBhcmUgY2hhbmdlczsgXCJubyBjaGFuZ2UuXCIgb3RoZXJ3aXNlKS4nLFxuICAgICAgICAnICBjb25zdCBodG1sID0gYnVpbGRIdG1sKFNUQUNLX05BTUUsIGZpbHRlcmVkQ2hhbmdlcyk7JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgIC8vIFByaW50IHRvIHN0ZG91dCcsXG4gICAgICAgICcgIC8vIFRoaXMgYWxsb3dzIGNhcHR1cmluZyBvdXRwdXQgb3IgcmVkaXJlY3RpbmcgdG8gYSBmaWxlIGlmIG5lZWRlZC4nLFxuICAgICAgICAnICBjb25zb2xlLmxvZyhodG1sKTsnLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgLy8gT3B0aW9uYWxseSBhcHBlbmQgdG8gR2l0SHViIFN0ZXAgU3VtbWFyeScsXG4gICAgICAgICcgIGlmIChHSVRIVUJfU1RFUF9TVU1NQVJZKSB7JyxcbiAgICAgICAgJyAgICB0cnkgeycsXG4gICAgICAgICcgICAgICBhd2FpdCBhcHBlbmRTdGVwU3VtbWFyeShHSVRIVUJfU1RFUF9TVU1NQVJZLCBodG1sKTsnLFxuICAgICAgICAnICAgICAgY29uc29sZS5lcnJvcihgQXBwZW5kZWQgSFRNTCB0byBHSVRIVUJfU1RFUF9TVU1NQVJZOiAke0dJVEhVQl9TVEVQX1NVTU1BUll9YCk7JyxcbiAgICAgICAgJyAgICB9IGNhdGNoIChlOiBhbnkpIHsnLFxuICAgICAgICBcIiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBhcHBlbmQgdG8gR0lUSFVCX1NURVBfU1VNTUFSWTonLCBlPy5tZXNzYWdlIHx8IGUpO1wiLFxuICAgICAgICAnICAgIH0nLFxuICAgICAgICAnICB9JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgIC8vIE9wdGlvbmFsbHkgcG9zdCBhIFBSIGNvbW1lbnQnLFxuICAgICAgICAnICBpZiAoR0lUSFVCX1RPS0VOICYmIEdJVEhVQl9DT01NRU5UX1VSTCkgeycsXG4gICAgICAgICcgICAgdHJ5IHsnLFxuICAgICAgICAnICAgICAgYXdhaXQgcG9zdEdpdGh1YkNvbW1lbnQoR0lUSFVCX0NPTU1FTlRfVVJMLCBHSVRIVUJfVE9LRU4sIGh0bWwpOycsXG4gICAgICAgIFwiICAgICAgY29uc29sZS5lcnJvcignUG9zdGVkIEhUTUwgYXMgYSBHaXRIdWIgUFIgY29tbWVudC4nKTtcIixcbiAgICAgICAgJyAgICB9IGNhdGNoIChlOiBhbnkpIHsnLFxuICAgICAgICBcIiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBwb3N0IEdpdEh1YiBQUiBjb21tZW50OicsIGU/Lm1lc3NhZ2UgfHwgZSk7XCIsXG4gICAgICAgICcgICAgICAvLyBEbyBub3QgZmFpbCB0aGUgd2hvbGUgc2NyaXB0IGp1c3QgZm9yIGNvbW1lbnQgcG9zdGluZycsXG4gICAgICAgICcgICAgfScsXG4gICAgICAgICcgIH0nLFxuICAgICAgICAnJyxcbiAgICAgICAgXCIgIC8vIE5vdGU6IFdoZW4gc3RhdHVzIGlzIEZBSUxFRCBkdWUgdG8gXFxcImRpZG4ndCBjb250YWluIGNoYW5nZXNcXFwiLCB0aGUgSFRNTCBuYXR1cmFsbHkgc2F5cyBcXFwibm8gY2hhbmdlLlxcXCJcIixcbiAgICAgICAgXCIgIGlmIChzdGF0dXMgPT09ICdGQUlMRUQnICYmIHN0YXR1c1JlYXNvbikge1wiLFxuICAgICAgICAnICAgIGNvbnNvbGUuZXJyb3IoYENoYW5nZSBzZXQgc3RhdHVzOiBGQUlMRUQuIFJlYXNvbjogJHtzdGF0dXNSZWFzb259YCk7JyxcbiAgICAgICAgJyAgfScsXG4gICAgICAgICd9JyxcbiAgICAgICAgJycsXG4gICAgICAgICdtYWluKCkuY2F0Y2goKGVycikgPT4geycsXG4gICAgICAgICcgIGNvbnNvbGUuZXJyb3IoZXJyKTsnLFxuICAgICAgICAnICBwcm9jZXNzLmV4aXRDb2RlID0gMTsnLFxuICAgICAgICAnfSk7JyxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
256
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWNoYW5nZXNldC1zY3JpcHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmluL2Nkay1jaGFuZ2VzZXQtc2NyaXB0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFrQztBQVFsQyxNQUFhLGtCQUFrQjtJQUM3QixZQUFZLEtBQThCO1FBQ3hDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLElBQUksb0NBQW9DLENBQUM7UUFFNUUsSUFBSSxpQkFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFO1lBQ3RDLEtBQUssRUFBRTtnQkFDTCwyQ0FBMkM7Z0JBQzNDLGtHQUFrRztnQkFDbEcsRUFBRTtnQkFDRix5R0FBeUc7Z0JBQ3pHLEVBQUU7Z0JBQ0YsS0FBSztnQkFDTCx3QkFBd0I7Z0JBQ3hCLEtBQUs7Z0JBQ0wsMEVBQTBFO2dCQUMxRSxFQUFFO2dCQUNGLEtBQUs7Z0JBQ0wsNkNBQTZDO2dCQUM3QyxpRUFBaUU7Z0JBQ2pFLEtBQUs7Z0JBQ0wsZ0RBQWdEO2dCQUNoRCwyREFBMkQ7Z0JBQzNELDhDQUE4QztnQkFDOUMsbUJBQW1CO2dCQUNuQixnQkFBZ0I7Z0JBQ2hCLG1CQUFtQjtnQkFDbkIsTUFBTTtnQkFDTiwwREFBMEQ7Z0JBQzFELHNDQUFzQztnQkFDdEMsR0FBRztnQkFDSCxFQUFFO2dCQUNGLEtBQUs7Z0JBQ0wsK0VBQStFO2dCQUMvRSx3Q0FBd0M7Z0JBQ3hDLEtBQUs7Z0JBQ0wsdURBQXVEO2dCQUN2RCwwREFBMEQ7Z0JBQzFELCtCQUErQjtnQkFDL0IsOEJBQThCO2dCQUM5QiwwREFBMEQ7Z0JBQzFELGtEQUFrRDtnQkFDbEQsc0NBQXNDO2dCQUN0QyxLQUFLO2dCQUNMLDhCQUE4QjtnQkFDOUIsR0FBRztnQkFDSCxFQUFFO2dCQUNGLEtBQUs7Z0JBQ0wsd0ZBQXdGO2dCQUN4Rix5R0FBeUc7Z0JBQ3pHLDJHQUEyRztnQkFDM0csS0FBSztnQkFDTCx1R0FBdUc7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QUMvRCx5RUFBeUU7Z0JBQ3pFLDJCQUEyQjtnQkFDM0IsYUFBYTtnQkFDYixLQUFLO2dCQUNMLEVBQUU7Z0JBQ0YsNkZBQTZGO2dCQUM3RixnQ0FBZ0M7Z0JBQ2hDLDJDQUEyQztnQkFDM0MsbUJBQW1CO2dCQUNuQiwyQkFBMkI7Z0JBQzNCLHlCQUF5QjtnQkFDekIsTUFBTTtnQkFDTixrQ0FBa0M7Z0JBQ2xDLG1DQUFtQztnQkFDbkMsbUJBQW1CO2dCQUNuQiwyQkFBMkI7Z0JBQzNCLHlCQUF5QjtnQkFDekIsTUFBTTtnQkFDTixvR0FBb0c7Z0JBQ3BHLEVBQUU7Z0JBQ0YsNkdBQTZHO2dCQUM3Ryx3REFBd0Q7Z0JBQ3hELEVBQUU7Z0JBQ0Ysc0JBQXNCO2dCQUN0Qix1RUFBdUU7Z0JBQ3ZFLHNCQUFzQjtnQkFDdEIsRUFBRTtnQkFDRiwrQ0FBK0M7Z0JBQy9DLDhCQUE4QjtnQkFDOUIsV0FBVztnQkFDWCwyREFBMkQ7Z0JBQzNELHNGQUFzRjtnQkFDdEYsd0JBQXdCO2dCQUN4QixtRkFBbUY7Z0JBQ25GLE9BQU87Z0JBQ1AsS0FBSztnQkFDTCxFQUFFO2dCQUNGLG1DQUFtQztnQkFDbkMsNkNBQTZDO2dCQUM3QyxXQUFXO2dCQUNYLHdFQUF3RTtnQkFDeEUsNkRBQTZEO2dCQUM3RCx3QkFBd0I7Z0JBQ3hCLDRFQUE0RTtnQkFDNUUsZ0VBQWdFO2dCQUNoRSxPQUFPO2dCQUNQLEtBQUs7Z0JBQ0wsRUFBRTtnQkFDRiw0R0FBNEc7Z0JBQzVHLDhDQUE4QztnQkFDOUMsMEVBQTBFO2dCQUMxRSxLQUFLO2dCQUNMLEdBQUc7Z0JBQ0gsRUFBRTtnQkFDRix5QkFBeUI7Z0JBQ3pCLHVCQUF1QjtnQkFDdkIseUJBQXlCO2dCQUN6QixLQUFLO2FBQ047U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUExUEQsZ0RBMFBDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGV4dEZpbGUgfSBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgQXdzQ2RrVHlwZVNjcmlwdEFwcCB9IGZyb20gJ3Byb2plbi9saWIvYXdzY2RrJztcblxuaW50ZXJmYWNlIENka0NoYW5nZXNldFNjcmlwdFByb3BzIHtcbiAgcHJvamVjdDogQXdzQ2RrVHlwZVNjcmlwdEFwcDtcbiAgb3V0cHV0UGF0aD86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIENka0NoYW5nZXNldFNjcmlwdCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBDZGtDaGFuZ2VzZXRTY3JpcHRQcm9wcykge1xuICAgIGNvbnN0IG91dHB1dFBhdGggPSBwcm9wcy5vdXRwdXRQYXRoID8/ICdwcm9qZW5yYy9kZXNjcmliZS1jZm4tY2hhbmdlc2V0LnRzJztcblxuICAgIG5ldyBUZXh0RmlsZShwcm9wcy5wcm9qZWN0LCBvdXRwdXRQYXRoLCB7XG4gICAgICBsaW5lczogW1xuICAgICAgICBcImltcG9ydCB7IGFwcGVuZEZpbGUgfSBmcm9tICdmcy9wcm9taXNlcyc7XCIsXG4gICAgICAgIFwiaW1wb3J0IHsgQ2xvdWRGb3JtYXRpb25DbGllbnQsIERlc2NyaWJlQ2hhbmdlU2V0Q29tbWFuZCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1jbG91ZGZvcm1hdGlvbic7XCIsXG4gICAgICAgICcnLFxuICAgICAgICBcInR5cGUgQ2hhbmdlID0gTm9uTnVsbGFibGU8QXdhaXRlZDxSZXR1cm5UeXBlPENsb3VkRm9ybWF0aW9uQ2xpZW50WydzZW5kJ10+PiBleHRlbmRzIGFueSA/IGFueSA6IG5ldmVyPjtcIixcbiAgICAgICAgJycsXG4gICAgICAgICcvKionLFxuICAgICAgICAnICogU21hbGwgc2xlZXAgaGVscGVyLicsXG4gICAgICAgICcgKi8nLFxuICAgICAgICAnY29uc3Qgc2xlZXAgPSAobXM6IG51bWJlcikgPT4gbmV3IFByb21pc2UoKHJlcykgPT4gc2V0VGltZW91dChyZXMsIG1zKSk7JyxcbiAgICAgICAgJycsXG4gICAgICAgICcvKionLFxuICAgICAgICAnICogQnVpbGQgdGhlIEhUTUwgY29sb3IgY2hpcCBmb3IgYW4gYWN0aW9uLicsXG4gICAgICAgICcgKiBNb2RpZnk9Ymx1ZSwgQWRkPWdyZWVuLCBSZW1vdmU9cmVkIChtYXRjaCBwcmV0dHlfZm9ybWF0LnB5KS4nLFxuICAgICAgICAnICovJyxcbiAgICAgICAgJ2Z1bmN0aW9uIGFjdGlvbkNoaXAoYWN0aW9uPzogc3RyaW5nKTogc3RyaW5nIHsnLFxuICAgICAgICAnICAvLyBVc2UgZW1vamkgaW5zdGVhZCBvZiBleHRlcm5hbCBpbWFnZXMgZm9yIHJlbGlhYmlsaXR5JyxcbiAgICAgICAgJyAgY29uc3QgZW1vamlNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7JyxcbiAgICAgICAgXCIgICAgTW9kaWZ5OiAn8J+UtScsXCIsXG4gICAgICAgIFwiICAgIEFkZDogJ/Cfn6InLFwiLFxuICAgICAgICBcIiAgICBSZW1vdmU6ICfwn5S0JyxcIixcbiAgICAgICAgJyAgfTsnLFxuICAgICAgICBcIiAgY29uc3QgbWFyayA9IGFjdGlvbiA/IChlbW9qaU1hcFthY3Rpb25dID8/ICfimqonKSA6ICfimqonO1wiLFxuICAgICAgICBcIiAgcmV0dXJuIGAke21hcmt9ICR7YWN0aW9uID8/ICctJ31gO1wiLFxuICAgICAgICAnfScsXG4gICAgICAgICcnLFxuICAgICAgICAnLyoqJyxcbiAgICAgICAgXCIgKiBFeHRyYWN0IGNoYW5nZWQgcHJvcGVydHkgbmFtZXMgb25seSB3aGVyZSBUYXJnZXQuQXR0cmlidXRlID09ICdQcm9wZXJ0aWVzJ1wiLFxuICAgICAgICAnICogam9pbmVkIGJ5IDxicj4sIHByZWZpeGVkIHdpdGggXCItIFwiLicsXG4gICAgICAgICcgKi8nLFxuICAgICAgICAnZnVuY3Rpb24gY2hhbmdlZFByb3BlcnRpZXNIVE1MKGNoYW5nZTogYW55KTogc3RyaW5nIHsnLFxuICAgICAgICAnICBjb25zdCBkZXRhaWxzID0gY2hhbmdlPy5SZXNvdXJjZUNoYW5nZT8uRGV0YWlscyA/PyBbXTsnLFxuICAgICAgICAnICBjb25zdCBwcm9wczogc3RyaW5nW10gPSBbXTsnLFxuICAgICAgICAnICBmb3IgKGNvbnN0IGQgb2YgZGV0YWlscykgeycsXG4gICAgICAgIFwiICAgIGlmIChkPy5UYXJnZXQ/LkF0dHJpYnV0ZSAhPT0gJ1Byb3BlcnRpZXMnKSBjb250aW51ZTtcIixcbiAgICAgICAgXCIgICAgY29uc3Qgd29ya2Zsb3dOYW1lID0gZD8uVGFyZ2V0Py5OYW1lID8/ICctJztcIixcbiAgICAgICAgJyAgICBwcm9wcy5wdXNoKGAtICR7d29ya2Zsb3dOYW1lfWApOycsXG4gICAgICAgICcgIH0nLFxuICAgICAgICBcIiAgcmV0dXJuIHByb3BzLmpvaW4oJzxicj4nKTtcIixcbiAgICAgICAgJ30nLFxuICAgICAgICAnJyxcbiAgICAgICAgJy8qKicsXG4gICAgICAgICcgKiBEZXRlcm1pbmUgaWYgYSBjaGFuZ2Ugc2hvdWxkIGJlIGlnbm9yZWQgYmFzZWQgb24gbG9naWNhbCBJRHMgYW5kL29yIHJlc291cmNlIHR5cGVzLicsXG4gICAgICAgIFwiICogLSBJR05PUkVfTE9HSUNBTF9JRFM6IGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGxvZ2ljYWwgSURzIHRvIGlnbm9yZSAoZGVmYXVsdCBpbmNsdWRlcyAnQ0RLTWV0YWRhdGEnKVwiLFxuICAgICAgICBcIiAqIC0gSUdOT1JFX1JFU09VUkNFX1RZUEVTOiBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZXNvdXJjZSB0eXBlcyB0byBpZ25vcmUgKGUuZy4sICdBV1M6OkNESzo6TWV0YWRhdGEnKVwiLFxuICAgICAgICAnICovJyxcbiAgICAgICAgJ2Z1bmN0aW9uIHNob3VsZElnbm9yZUNoYW5nZShjaGFuZ2U6IGFueSwgaWdub3JlSWRzOiBTZXQ8c3RyaW5nPiwgaWdub3JlVHlwZXM6IFNldDxzdHJpbmc+KTogYm9vbGVhbiB7JyxcbiAgICAgICAgJyAgY29uc3QgcmMgPSBjaGFuZ2U/LlJlc291cmNlQ2hhbmdlID8/IHt9OycsXG4gICAgICAgICcgIGNvbnN0IGxvZ2ljYWxJZCA9IHJjPy5Mb2dpY2FsUmVzb3VyY2VJZCBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7JyxcbiAgICAgICAgJyAgY29uc3QgcmVzb3VyY2VUeXBlID0gcmM/LlJlc291cmNlVHlwZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7JyxcbiAgICAgICAgJyAgaWYgKGxvZ2ljYWxJZCAmJiBpZ25vcmVJZHMuaGFzKGxvZ2ljYWxJZCkpIHJldHVybiB0cnVlOycsXG4gICAgICAgICcgIGlmIChyZXNvdXJjZVR5cGUgJiYgaWdub3JlVHlwZXMuaGFzKHJlc291cmNlVHlwZSkpIHJldHVybiB0cnVlOycsXG4gICAgICAgICcgIHJldHVybiBmYWxzZTsnLFxuICAgICAgICAnfScsXG4gICAgICAgICcnLFxuICAgICAgICAnLyoqJyxcbiAgICAgICAgJyAqIEdlbmVyYXRlIHRoZSBIVE1MIGJvZHkgc2ltaWxhciB0byBwcmV0dHlfZm9ybWF0LnB5JyxcbiAgICAgICAgJyAqLycsXG4gICAgICAgICdmdW5jdGlvbiBidWlsZEh0bWwoc3RhY2tOYW1lOiBzdHJpbmcsIGNoYW5nZXM6IGFueVtdKTogc3RyaW5nIHsnLFxuICAgICAgICAnICBsZXQgYm9keSA9IGA8aDE+Q2hhbmdlIHNldDwvaDE+PGgyPlN0YWNrIE5hbWU6ICR7c3RhY2tOYW1lfTwvaDI+PGJyPmA7JyxcbiAgICAgICAgJyAgaWYgKChjaGFuZ2VzPy5sZW5ndGggPz8gMCkgPiAwKSB7JyxcbiAgICAgICAgXCIgICAgYm9keSArPSAnPHRhYmxlPjx0cj48dGg+QWN0aW9uJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90aD48dGg+SUQ8L3RoPjx0aD5UeXBlPC90aD48dGg+UmVwbGFjZW1lbnQ8L3RoPjx0aD5DaGFuZ2VkIFByb3BlcnRpZXM8L3RoPjwvdHI+JztcIixcbiAgICAgICAgJyAgICBmb3IgKGNvbnN0IGMgb2YgY2hhbmdlcykgeycsXG4gICAgICAgICcgICAgICBjb25zdCByYyA9IGM/LlJlc291cmNlQ2hhbmdlID8/IHt9OycsXG4gICAgICAgICcgICAgICBjb25zdCBhY3Rpb24gPSBhY3Rpb25DaGlwKHJjPy5BY3Rpb24pOycsXG4gICAgICAgIFwiICAgICAgY29uc3QgbG9naWNhbElkID0gcmM/LkxvZ2ljYWxSZXNvdXJjZUlkID8/ICctJztcIixcbiAgICAgICAgXCIgICAgICBjb25zdCB0eXBlID0gcmM/LlJlc291cmNlVHlwZSA/PyAnLSc7XCIsXG4gICAgICAgIFwiICAgICAgY29uc3QgcmVwbGFjZW1lbnQgPSByYz8uUmVwbGFjZW1lbnQgPz8gJy0nO1wiLFxuICAgICAgICAnICAgICAgY29uc3QgZGV0YWlscyA9IGNoYW5nZWRQcm9wZXJ0aWVzSFRNTChjKTsnLFxuICAgICAgICAnJyxcbiAgICAgICAgXCIgICAgICBib2R5ICs9ICc8dHI+JztcIixcbiAgICAgICAgJyAgICAgIGJvZHkgKz0gYDx0ZD4ke2FjdGlvbn08L3RkPmA7JyxcbiAgICAgICAgJyAgICAgIGJvZHkgKz0gYDx0ZD4ke2xvZ2ljYWxJZH08L3RkPmA7JyxcbiAgICAgICAgJyAgICAgIGJvZHkgKz0gYDx0ZD4ke3R5cGV9PC90ZD5gOycsXG4gICAgICAgICcgICAgICBib2R5ICs9IGA8dGQ+JHtyZXBsYWNlbWVudH08L3RkPmA7JyxcbiAgICAgICAgJyAgICAgIGJvZHkgKz0gYDx0ZD4ke2RldGFpbHN9PC90ZD5gOycsXG4gICAgICAgIFwiICAgICAgYm9keSArPSAnPC90cj4nO1wiLFxuICAgICAgICAnICAgIH0nLFxuICAgICAgICBcIiAgICBib2R5ICs9ICc8L3RhYmxlPic7XCIsXG4gICAgICAgICcgIH0gZWxzZSB7JyxcbiAgICAgICAgXCIgICAgYm9keSArPSAnbm8gY2hhbmdlLic7XCIsXG4gICAgICAgICcgIH0nLFxuICAgICAgICAnICByZXR1cm4gYm9keTsnLFxuICAgICAgICAnfScsXG4gICAgICAgICcnLFxuICAgICAgICAnLyoqJyxcbiAgICAgICAgJyAqIFBvbGwgRGVzY3JpYmVDaGFuZ2VTZXQgdW50aWwgYSB0ZXJtaW5hbCBzdGF0dXMsIHRoZW4gcGFnaW5hdGUgdG8gcmV0cmlldmUgYWxsIENoYW5nZXMuJyxcbiAgICAgICAgJyAqLycsXG4gICAgICAgICdhc3luYyBmdW5jdGlvbiBnZXRUZXJtaW5hbENoYW5nZVNldCgnLFxuICAgICAgICAnICBjbGllbnQ6IENsb3VkRm9ybWF0aW9uQ2xpZW50LCcsXG4gICAgICAgICcgIHN0YWNrTmFtZTogc3RyaW5nLCcsXG4gICAgICAgICcgIGNoYW5nZVNldE5hbWU6IHN0cmluZywnLFxuICAgICAgICAnICBtYXhBdHRlbXB0cyA9IDYwLCcsXG4gICAgICAgICcgIGRlbGF5TXMgPSAzMDAwLCcsXG4gICAgICAgICcpOiBQcm9taXNlPHsgc3RhdHVzPzogc3RyaW5nOyBzdGF0dXNSZWFzb24/OiBzdHJpbmc7IGNoYW5nZXM6IGFueVtdIH0+IHsnLFxuICAgICAgICAnICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgYXR0ZW1wdCA8PSBtYXhBdHRlbXB0czsgYXR0ZW1wdCsrKSB7JyxcbiAgICAgICAgJyAgICBjb25zdCByZXNwID0gYXdhaXQgY2xpZW50LnNlbmQobmV3IERlc2NyaWJlQ2hhbmdlU2V0Q29tbWFuZCh7JyxcbiAgICAgICAgJyAgICAgIFN0YWNrTmFtZTogc3RhY2tOYW1lLCcsXG4gICAgICAgICcgICAgICBDaGFuZ2VTZXROYW1lOiBjaGFuZ2VTZXROYW1lLCcsXG4gICAgICAgICcgICAgfSkpOycsXG4gICAgICAgICcnLFxuICAgICAgICAnICAgIGNvbnN0IHN0YXR1cyA9IHJlc3AuU3RhdHVzOycsXG4gICAgICAgICcgICAgY29uc3Qgc3RhdHVzUmVhc29uID0gcmVzcC5TdGF0dXNSZWFzb247JyxcbiAgICAgICAgJycsXG4gICAgICAgIFwiICAgIGlmIChzdGF0dXMgPT09ICdDUkVBVEVfQ09NUExFVEUnIHx8IHN0YXR1cyA9PT0gJ0ZBSUxFRCcpIHtcIixcbiAgICAgICAgJyAgICAgIC8vIEdhdGhlciBhbGwgcGFnZXMnLFxuICAgICAgICAnICAgICAgY29uc3QgY2hhbmdlczogYW55W10gPSBbXTsnLFxuICAgICAgICAnICAgICAgaWYgKHJlc3AuQ2hhbmdlcykgY2hhbmdlcy5wdXNoKC4uLnJlc3AuQ2hhbmdlcyk7JyxcbiAgICAgICAgJyAgICAgIGxldCBuZXh0ID0gcmVzcC5OZXh0VG9rZW47JyxcbiAgICAgICAgJyAgICAgIHdoaWxlIChuZXh0KSB7JyxcbiAgICAgICAgJyAgICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBEZXNjcmliZUNoYW5nZVNldENvbW1hbmQoeycsXG4gICAgICAgICcgICAgICAgICAgU3RhY2tOYW1lOiBzdGFja05hbWUsJyxcbiAgICAgICAgJyAgICAgICAgICBDaGFuZ2VTZXROYW1lOiBjaGFuZ2VTZXROYW1lLCcsXG4gICAgICAgICcgICAgICAgICAgTmV4dFRva2VuOiBuZXh0LCcsXG4gICAgICAgICcgICAgICAgIH0pKTsnLFxuICAgICAgICAnICAgICAgICBpZiAocGFnZS5DaGFuZ2VzKSBjaGFuZ2VzLnB1c2goLi4ucGFnZS5DaGFuZ2VzKTsnLFxuICAgICAgICAnICAgICAgICBuZXh0ID0gcGFnZS5OZXh0VG9rZW47JyxcbiAgICAgICAgJyAgICAgIH0nLFxuICAgICAgICAnICAgICAgcmV0dXJuIHsgc3RhdHVzLCBzdGF0dXNSZWFzb24sIGNoYW5nZXMgfTsnLFxuICAgICAgICAnICAgIH0nLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgICAvLyBOb3QgdGVybWluYWwgeWV0OyB3YWl0IGFuZCByZXRyeScsXG4gICAgICAgICcgICAgYXdhaXQgc2xlZXAoZGVsYXlNcyk7JyxcbiAgICAgICAgJyAgfScsXG4gICAgICAgICcnLFxuICAgICAgICBcIiAgdGhyb3cgbmV3IEVycm9yKCdUaW1lZCBvdXQgd2FpdGluZyBmb3IgY2hhbmdlIHNldCB0byByZWFjaCBhIHRlcm1pbmFsIHN0YXR1cy4nKTtcIixcbiAgICAgICAgJ30nLFxuICAgICAgICAnJyxcbiAgICAgICAgJ2FzeW5jIGZ1bmN0aW9uIHBvc3RHaXRodWJDb21tZW50KHVybDogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCBib2R5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHsnLFxuICAgICAgICAnICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHsnLFxuICAgICAgICBcIiAgICBtZXRob2Q6ICdQT1NUJyxcIixcbiAgICAgICAgJyAgICBoZWFkZXJzOiB7JyxcbiAgICAgICAgXCIgICAgICAnQXV0aG9yaXphdGlvbic6IGB0b2tlbiAke3Rva2VufWAsXCIsXG4gICAgICAgIFwiICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcIixcbiAgICAgICAgXCIgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbicsXCIsXG4gICAgICAgICcgICAgfSwnLFxuICAgICAgICAnICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYm9keSB9KSwnLFxuICAgICAgICAnICB9KTsnLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgaWYgKCFyZXMub2spIHsnLFxuICAgICAgICBcIiAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzLnRleHQoKS5jYXRjaCgoKSA9PiAnJyk7XCIsXG4gICAgICAgICcgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcG9zdCBHaXRIdWIgY29tbWVudDogJHtyZXMuc3RhdHVzfSAke3Jlcy5zdGF0dXNUZXh0fSAke3RleHR9YCk7JyxcbiAgICAgICAgJyAgfScsXG4gICAgICAgICd9JyxcbiAgICAgICAgJycsXG4gICAgICAgICdhc3luYyBmdW5jdGlvbiBhcHBlbmRTdGVwU3VtbWFyeShzdW1tYXJ5UGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHsnLFxuICAgICAgICBcIiAgYXdhaXQgYXBwZW5kRmlsZShzdW1tYXJ5UGF0aCwgYCR7Y29udGVudH1cXFxcbmAsIHsgZW5jb2Rpbmc6ICd1dGY4JyB9KTtcIixcbiAgICAgICAgJ30nLFxuICAgICAgICAnJyxcbiAgICAgICAgJ2FzeW5jIGZ1bmN0aW9uIG1haW4oKSB7JyxcbiAgICAgICAgJyAgY29uc3QgeycsXG4gICAgICAgICcgICAgU1RBQ0tfTkFNRSwnLFxuICAgICAgICAnICAgIENIQU5HRV9TRVRfTkFNRSwnLFxuICAgICAgICAnICAgIEFXU19SRUdJT04sJyxcbiAgICAgICAgJyAgICBHSVRIVUJfVE9LRU4sJyxcbiAgICAgICAgJyAgICBHSVRIVUJfQ09NTUVOVF9VUkwsJyxcbiAgICAgICAgJyAgICBHSVRIVUJfU1RFUF9TVU1NQVJZLCcsXG4gICAgICAgICcgICAgSUdOT1JFX0xPR0lDQUxfSURTLCcsXG4gICAgICAgICcgICAgSUdOT1JFX1JFU09VUkNFX1RZUEVTLCcsXG4gICAgICAgICcgIH0gPSBwcm9jZXNzLmVudjsnLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgaWYgKCFTVEFDS19OQU1FKSB7JyxcbiAgICAgICAgXCIgICAgdGhyb3cgbmV3IEVycm9yKCdTVEFDS19OQU1FIGlzIHJlcXVpcmVkJyk7XCIsXG4gICAgICAgICcgIH0nLFxuICAgICAgICAnICBjb25zdCByZWdpb24gPSBBV1NfUkVHSU9OIHx8IHByb2Nlc3MuZW52LkFXU19ERUZBVUxUX1JFR0lPTjsnLFxuICAgICAgICAnICBpZiAoIXJlZ2lvbikgeycsXG4gICAgICAgIFwiICAgIHRocm93IG5ldyBFcnJvcignQVdTX1JFR0lPTiBpcyByZXF1aXJlZCcpO1wiLFxuICAgICAgICAnICB9JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgIGNvbnN0IGNoYW5nZVNldE5hbWUgPSBDSEFOR0VfU0VUX05BTUUgfHwgU1RBQ0tfTkFNRTsnLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgY29uc3QgY2xpZW50ID0gbmV3IENsb3VkRm9ybWF0aW9uQ2xpZW50KHsgcmVnaW9uIH0pOycsXG4gICAgICAgICcnLFxuICAgICAgICAnICBsZXQgc3RhdHVzOiBzdHJpbmcgfCB1bmRlZmluZWQ7JyxcbiAgICAgICAgJyAgbGV0IHN0YXR1c1JlYXNvbjogc3RyaW5nIHwgdW5kZWZpbmVkOycsXG4gICAgICAgICcgIGxldCBjaGFuZ2VzOiBhbnlbXSA9IFtdOycsXG4gICAgICAgICcnLFxuICAgICAgICAnICB0cnkgeycsXG4gICAgICAgICcgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0VGVybWluYWxDaGFuZ2VTZXQoY2xpZW50LCBTVEFDS19OQU1FLCBjaGFuZ2VTZXROYW1lKTsnLFxuICAgICAgICAnICAgIHN0YXR1cyA9IHJlc3VsdC5zdGF0dXM7JyxcbiAgICAgICAgJyAgICBzdGF0dXNSZWFzb24gPSByZXN1bHQuc3RhdHVzUmVhc29uOycsXG4gICAgICAgICcgICAgY2hhbmdlcyA9IHJlc3VsdC5jaGFuZ2VzID8/IFtdOycsXG4gICAgICAgICcgIH0gY2F0Y2ggKGVycjogYW55KSB7JyxcbiAgICAgICAgJyAgICAvLyBJZiBEZXNjcmliZUNoYW5nZVNldCBmYWlscyBlbnRpcmVseSwgc3VyZmFjZSB0aGUgZXJyb3InLFxuICAgICAgICBcIiAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkZXNjcmliaW5nIGNoYW5nZSBzZXQ6JywgZXJyPy5tZXNzYWdlIHx8IGVycik7XCIsXG4gICAgICAgICcgICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7JyxcbiAgICAgICAgJyAgICByZXR1cm47JyxcbiAgICAgICAgJyAgfScsXG4gICAgICAgICcnLFxuICAgICAgICBcIiAgLy8gQXBwbHkgaWdub3JlcyBmcm9tIGVudiB2YXJzIChJRHMgYW5kIHR5cGVzKS4gRGVmYXVsdCBpZ25vcmUgSURzIGluY2x1ZGUgJ0NES01ldGFkYXRhJy5cIixcbiAgICAgICAgJyAgY29uc3QgaWdub3JlSWRTZXQgPSBuZXcgU2V0KCcsXG4gICAgICAgIFwiICAgIChJR05PUkVfTE9HSUNBTF9JRFMgPz8gJ0NES01ldGFkYXRhJylcIixcbiAgICAgICAgXCIgICAgICAuc3BsaXQoJywnKVwiLFxuICAgICAgICAnICAgICAgLm1hcChzID0+IHMudHJpbSgpKScsXG4gICAgICAgICcgICAgICAuZmlsdGVyKEJvb2xlYW4pLCcsXG4gICAgICAgICcgICk7JyxcbiAgICAgICAgJyAgY29uc3QgaWdub3JlVHlwZVNldCA9IG5ldyBTZXQoJyxcbiAgICAgICAgXCIgICAgKElHTk9SRV9SRVNPVVJDRV9UWVBFUyA/PyAnJylcIixcbiAgICAgICAgXCIgICAgICAuc3BsaXQoJywnKVwiLFxuICAgICAgICAnICAgICAgLm1hcChzID0+IHMudHJpbSgpKScsXG4gICAgICAgICcgICAgICAuZmlsdGVyKEJvb2xlYW4pLCcsXG4gICAgICAgICcgICk7JyxcbiAgICAgICAgJyAgY29uc3QgZmlsdGVyZWRDaGFuZ2VzID0gY2hhbmdlcy5maWx0ZXIoYyA9PiAhc2hvdWxkSWdub3JlQ2hhbmdlKGMsIGlnbm9yZUlkU2V0LCBpZ25vcmVUeXBlU2V0KSk7JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgIC8vIEJ1aWxkIEhUTUwgZXhhY3RseSBsaWtlIHByZXR0eV9mb3JtYXQucHkgbG9naWMgKHRhYmxlIHdoZW4gdGhlcmUgYXJlIGNoYW5nZXM7IFwibm8gY2hhbmdlLlwiIG90aGVyd2lzZSkuJyxcbiAgICAgICAgJyAgY29uc3QgaHRtbCA9IGJ1aWxkSHRtbChTVEFDS19OQU1FLCBmaWx0ZXJlZENoYW5nZXMpOycsXG4gICAgICAgICcnLFxuICAgICAgICAnICAvLyBQcmludCB0byBzdGRvdXQnLFxuICAgICAgICAnICAvLyBUaGlzIGFsbG93cyBjYXB0dXJpbmcgb3V0cHV0IG9yIHJlZGlyZWN0aW5nIHRvIGEgZmlsZSBpZiBuZWVkZWQuJyxcbiAgICAgICAgJyAgY29uc29sZS5sb2coaHRtbCk7JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgIC8vIE9wdGlvbmFsbHkgYXBwZW5kIHRvIEdpdEh1YiBTdGVwIFN1bW1hcnknLFxuICAgICAgICAnICBpZiAoR0lUSFVCX1NURVBfU1VNTUFSWSkgeycsXG4gICAgICAgICcgICAgdHJ5IHsnLFxuICAgICAgICAnICAgICAgYXdhaXQgYXBwZW5kU3RlcFN1bW1hcnkoR0lUSFVCX1NURVBfU1VNTUFSWSwgaHRtbCk7JyxcbiAgICAgICAgJyAgICAgIGNvbnNvbGUuZXJyb3IoYEFwcGVuZGVkIEhUTUwgdG8gR0lUSFVCX1NURVBfU1VNTUFSWTogJHtHSVRIVUJfU1RFUF9TVU1NQVJZfWApOycsXG4gICAgICAgICcgICAgfSBjYXRjaCAoZTogYW55KSB7JyxcbiAgICAgICAgXCIgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gYXBwZW5kIHRvIEdJVEhVQl9TVEVQX1NVTU1BUlk6JywgZT8ubWVzc2FnZSB8fCBlKTtcIixcbiAgICAgICAgJyAgICB9JyxcbiAgICAgICAgJyAgfScsXG4gICAgICAgICcnLFxuICAgICAgICAnICAvLyBPcHRpb25hbGx5IHBvc3QgYSBQUiBjb21tZW50JyxcbiAgICAgICAgJyAgaWYgKEdJVEhVQl9UT0tFTiAmJiBHSVRIVUJfQ09NTUVOVF9VUkwpIHsnLFxuICAgICAgICAnICAgIHRyeSB7JyxcbiAgICAgICAgJyAgICAgIGF3YWl0IHBvc3RHaXRodWJDb21tZW50KEdJVEhVQl9DT01NRU5UX1VSTCwgR0lUSFVCX1RPS0VOLCBodG1sKTsnLFxuICAgICAgICBcIiAgICAgIGNvbnNvbGUuZXJyb3IoJ1Bvc3RlZCBIVE1MIGFzIGEgR2l0SHViIFBSIGNvbW1lbnQuJyk7XCIsXG4gICAgICAgICcgICAgfSBjYXRjaCAoZTogYW55KSB7JyxcbiAgICAgICAgXCIgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcG9zdCBHaXRIdWIgUFIgY29tbWVudDonLCBlPy5tZXNzYWdlIHx8IGUpO1wiLFxuICAgICAgICAnICAgICAgLy8gRG8gbm90IGZhaWwgdGhlIHdob2xlIHNjcmlwdCBqdXN0IGZvciBjb21tZW50IHBvc3RpbmcnLFxuICAgICAgICAnICAgIH0nLFxuICAgICAgICAnICB9JyxcbiAgICAgICAgJycsXG4gICAgICAgIFwiICAvLyBOb3RlOiBXaGVuIHN0YXR1cyBpcyBGQUlMRUQgZHVlIHRvIFxcXCJkaWRuJ3QgY29udGFpbiBjaGFuZ2VzXFxcIiwgdGhlIEhUTUwgbmF0dXJhbGx5IHNheXMgXFxcIm5vIGNoYW5nZS5cXFwiXCIsXG4gICAgICAgIFwiICBpZiAoc3RhdHVzID09PSAnRkFJTEVEJyAmJiBzdGF0dXNSZWFzb24pIHtcIixcbiAgICAgICAgJyAgICBjb25zb2xlLmVycm9yKGBDaGFuZ2Ugc2V0IHN0YXR1czogRkFJTEVELiBSZWFzb246ICR7c3RhdHVzUmVhc29ufWApOycsXG4gICAgICAgICcgIH0nLFxuICAgICAgICAnfScsXG4gICAgICAgICcnLFxuICAgICAgICAnbWFpbigpLmNhdGNoKChlcnIpID0+IHsnLFxuICAgICAgICAnICBjb25zb2xlLmVycm9yKGVycik7JyxcbiAgICAgICAgJyAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7JyxcbiAgICAgICAgJ30pOycsXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
interface CdkDriftDetectionScriptProps {
|
|
2
|
+
project: any;
|
|
3
|
+
outputPath?: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Projen helper to emit the drift detection script into the repository so
|
|
7
|
+
* GitHub workflows can execute it from a stable location.
|
|
8
|
+
*
|
|
9
|
+
* This mirrors the pattern used by CdkChangesetScript, but writes the
|
|
10
|
+
* drift script (detect-drift.ts) under the workflows scripts directory by default.
|
|
11
|
+
*/
|
|
12
|
+
export declare class CdkDriftDetectionScript {
|
|
13
|
+
constructor(props: CdkDriftDetectionScriptProps);
|
|
14
|
+
}
|
|
15
|
+
export {};
|