@macedon-technologies/batman 1.17.2 → 1.18.0
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 +205 -26
- package/.swamp.yaml +6 -0
- package/API.md +164 -1
- package/CLAUDE.md +44 -0
- package/architecture-rules/README.md +42 -0
- package/architecture-rules/check.ts +162 -0
- package/architecture-rules/rules.json +3 -0
- package/architecture-rules/tsconfig.json +14 -0
- package/attestation/manifest.ts +40 -0
- package/attestation/tsconfig.json +13 -0
- package/attestation/verify.ts +142 -0
- package/build-tools/scan-generated-workflows.ts +18 -11
- package/lib/Application.js +6 -1
- package/lib/BatmanProject.js +8 -2
- package/lib/BootcampProject.js +8 -2
- package/lib/CodeOwnersFile.js +1 -1
- package/lib/ProductionDeployWorkflow.js +1 -1
- package/lib/ProjenWorkflowHardening.d.ts +18 -0
- package/lib/ProjenWorkflowHardening.js +59 -0
- package/lib/SoftwareFactoryArchitectureRules.d.ts +10 -0
- package/lib/SoftwareFactoryArchitectureRules.js +245 -0
- package/lib/SoftwareFactoryAttestation.d.ts +18 -0
- package/lib/SoftwareFactoryAttestation.js +221 -0
- package/lib/SoftwareFactoryFiles.d.ts +45 -0
- package/lib/SoftwareFactoryFiles.js +102 -0
- package/lib/SoftwareFactoryModels.d.ts +25 -0
- package/lib/SoftwareFactoryModels.js +306 -0
- package/lib/SoftwareFactoryOpenSpecGates.d.ts +8 -0
- package/lib/SoftwareFactoryOpenSpecGates.js +75 -0
- package/lib/SoftwareFactoryWorkflows.d.ts +28 -0
- package/lib/SoftwareFactoryWorkflows.js +326 -0
- package/lib/StagingDeployWorkflow.js +1 -1
- package/lib/WorkflowActionVersions.d.ts +31 -1
- package/lib/WorkflowActionVersions.js +5 -1
- package/lib/WorkflowAutoDiscover.js +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +2 -1
- package/lib/utils.js +29 -1
- package/models/@goodcraft/github/platform-common-pr.yaml +10 -0
- package/models/@swamp/software-factory/platform-common-factory.yaml +240 -0
- package/models/@webframp/github/platform-common-issues.yaml +8 -0
- package/models/command/shell/platform-common-shell-architecture.yaml +8 -0
- package/models/command/shell/platform-common-shell-manifest.yaml +8 -0
- package/models/command/shell/platform-common-shell.yaml +8 -0
- package/openspec-gates/check-tasks-complete.ts +44 -0
- package/openspec-gates/tsconfig.json +13 -0
- package/package.json +6 -1
- package/workflows/workflow-openspec-plan-verify.yaml +51 -0
- package/workflows/workflow-openspec-tasks-verify.yaml +51 -0
- package/workflows/workflow-pre-pr-verify.yaml +118 -0
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SoftwareFactoryWorkflows = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
const projen_1 = require("projen");
|
|
6
|
+
const javascript_1 = require("projen/lib/javascript");
|
|
7
|
+
const utils_1 = require("./utils");
|
|
8
|
+
const WorkflowActionVersions_1 = require("./WorkflowActionVersions");
|
|
9
|
+
/**
|
|
10
|
+
* The 3 swamp workflows the factory's gate stages run (openspec-plan-verify,
|
|
11
|
+
* openspec-tasks-verify, pre-pr-verify), plus the GitHub Action that
|
|
12
|
+
* re-verifies a PR's embedded attestation at merge time.
|
|
13
|
+
*
|
|
14
|
+
* The swamp workflow YAMLs carry a swamp-assigned `id` that must stay stable
|
|
15
|
+
* across synths (swamp uses it as the workflow's identity), so — like the
|
|
16
|
+
* model instances in `SoftwareFactoryModels` — they're `SampleFile`s, written
|
|
17
|
+
* once and then owned by the team. `verify-attestation.yml` has no such
|
|
18
|
+
* identity constraint and is a plain GitHub Actions workflow, so it's built
|
|
19
|
+
* the same managed way `PrDeployWorkflow` is.
|
|
20
|
+
*/
|
|
21
|
+
class SoftwareFactoryWorkflows {
|
|
22
|
+
constructor(project, options) {
|
|
23
|
+
const { repoName } = options;
|
|
24
|
+
const shellModel = `${repoName}-shell`;
|
|
25
|
+
const shellArchitectureModel = `${repoName}-shell-architecture`;
|
|
26
|
+
const shellManifestModel = `${repoName}-shell-manifest`;
|
|
27
|
+
new projen_1.SampleFile(project, 'workflows/workflow-openspec-plan-verify.yaml', {
|
|
28
|
+
contents: `id: ${(0, crypto_1.randomUUID)()}
|
|
29
|
+
name: openspec-plan-verify
|
|
30
|
+
description: >-
|
|
31
|
+
Fails unless the named OpenSpec change is well-formed (proposal, design,
|
|
32
|
+
specs with deltas, tasks all present) via \`openspec validate\`. Gates the
|
|
33
|
+
factory's planning stage: a request can't proceed to implementation until
|
|
34
|
+
it's a real OpenSpec change, not just prose in a swamp artifact.
|
|
35
|
+
tags: {}
|
|
36
|
+
inputs:
|
|
37
|
+
type: object
|
|
38
|
+
required: [changeSlug]
|
|
39
|
+
properties:
|
|
40
|
+
changeSlug:
|
|
41
|
+
type: string
|
|
42
|
+
description: The openspec change name (openspec/changes/<changeSlug>/).
|
|
43
|
+
jobs:
|
|
44
|
+
- name: verify
|
|
45
|
+
description: Validate the OpenSpec change is complete and well-formed
|
|
46
|
+
steps:
|
|
47
|
+
- name: validate
|
|
48
|
+
description: openspec validate <changeSlug> --type change
|
|
49
|
+
task:
|
|
50
|
+
type: model_method
|
|
51
|
+
modelIdOrName: ${shellModel}
|
|
52
|
+
methodName: execute
|
|
53
|
+
inputs:
|
|
54
|
+
run: 'openspec validate \${{ inputs.changeSlug }} --type change'
|
|
55
|
+
dependsOn: []
|
|
56
|
+
weight: 0
|
|
57
|
+
allowFailure: false
|
|
58
|
+
- name: assert-valid
|
|
59
|
+
description: openspec validate must exit 0
|
|
60
|
+
task:
|
|
61
|
+
type: assert
|
|
62
|
+
expr: >-
|
|
63
|
+
data.query('modelName == "${shellModel}" && name == "result" &&
|
|
64
|
+
workflowRunId == "' + run.id + '"')[0].attributes.exitCode == 0
|
|
65
|
+
message: >-
|
|
66
|
+
OpenSpec change is not valid/complete (missing proposal, design,
|
|
67
|
+
specs with deltas, or tasks) — see the ${shellModel} result data
|
|
68
|
+
for openspec's own remediation output
|
|
69
|
+
severity: high
|
|
70
|
+
dependsOn:
|
|
71
|
+
- step: validate
|
|
72
|
+
condition:
|
|
73
|
+
type: succeeded
|
|
74
|
+
weight: 0
|
|
75
|
+
allowFailure: false
|
|
76
|
+
dependsOn: []
|
|
77
|
+
weight: 0
|
|
78
|
+
version: 1
|
|
79
|
+
`,
|
|
80
|
+
});
|
|
81
|
+
new projen_1.SampleFile(project, 'workflows/workflow-openspec-tasks-verify.yaml', {
|
|
82
|
+
contents: `id: ${(0, crypto_1.randomUUID)()}
|
|
83
|
+
name: openspec-tasks-verify
|
|
84
|
+
description: >-
|
|
85
|
+
Fails unless every task in the named OpenSpec change's tasks.md is checked
|
|
86
|
+
off (openspec-gates/check-tasks-complete.ts, via \`pnpm run
|
|
87
|
+
openspec:check-tasks-complete\`). Gates the factory's implementing stage:
|
|
88
|
+
work isn't done until the change's own task list says it's done, not just
|
|
89
|
+
because an artifact was recorded.
|
|
90
|
+
tags: {}
|
|
91
|
+
inputs:
|
|
92
|
+
type: object
|
|
93
|
+
required: [changeSlug]
|
|
94
|
+
properties:
|
|
95
|
+
changeSlug:
|
|
96
|
+
type: string
|
|
97
|
+
description: The openspec change name (openspec/changes/<changeSlug>/).
|
|
98
|
+
jobs:
|
|
99
|
+
- name: verify
|
|
100
|
+
description: Check every task in the change's tasks.md is complete
|
|
101
|
+
steps:
|
|
102
|
+
- name: check-tasks
|
|
103
|
+
description: pnpm run openspec:check-tasks-complete -- <changeSlug>
|
|
104
|
+
task:
|
|
105
|
+
type: model_method
|
|
106
|
+
modelIdOrName: ${shellModel}
|
|
107
|
+
methodName: execute
|
|
108
|
+
inputs:
|
|
109
|
+
run: 'pnpm run openspec:check-tasks-complete -- \${{ inputs.changeSlug }}'
|
|
110
|
+
dependsOn: []
|
|
111
|
+
weight: 0
|
|
112
|
+
allowFailure: false
|
|
113
|
+
- name: assert-tasks-complete
|
|
114
|
+
description: openspec:check-tasks-complete must exit 0
|
|
115
|
+
task:
|
|
116
|
+
type: assert
|
|
117
|
+
expr: >-
|
|
118
|
+
data.query('modelName == "${shellModel}" && name == "result" &&
|
|
119
|
+
workflowRunId == "' + run.id + '"')[0].attributes.exitCode == 0
|
|
120
|
+
message: >-
|
|
121
|
+
OpenSpec change has incomplete tasks — see the ${shellModel}
|
|
122
|
+
result data for the completedTasks/totalTasks breakdown
|
|
123
|
+
severity: high
|
|
124
|
+
dependsOn:
|
|
125
|
+
- step: check-tasks
|
|
126
|
+
condition:
|
|
127
|
+
type: succeeded
|
|
128
|
+
weight: 0
|
|
129
|
+
allowFailure: false
|
|
130
|
+
dependsOn: []
|
|
131
|
+
weight: 0
|
|
132
|
+
version: 1
|
|
133
|
+
`,
|
|
134
|
+
});
|
|
135
|
+
new projen_1.SampleFile(project, 'workflows/workflow-pre-pr-verify.yaml', {
|
|
136
|
+
contents: `id: ${(0, crypto_1.randomUUID)()}
|
|
137
|
+
name: pre-pr-verify
|
|
138
|
+
description: >-
|
|
139
|
+
Pre-PR verification: run the same checks CI would run, before the factory
|
|
140
|
+
opens a PR rather than after — build/synth/test/lint (pnpm build) and the
|
|
141
|
+
architecture rule registry (pnpm validate:architecture). Both must pass.
|
|
142
|
+
tags: {}
|
|
143
|
+
inputs:
|
|
144
|
+
type: object
|
|
145
|
+
properties:
|
|
146
|
+
commit:
|
|
147
|
+
type: string
|
|
148
|
+
description: >-
|
|
149
|
+
The commit sha being verified. Read by the built-in
|
|
150
|
+
@swamp/verification-attestation report's subject.commit — pass the
|
|
151
|
+
real HEAD sha or the attestation renders "unknown".
|
|
152
|
+
branch:
|
|
153
|
+
type: string
|
|
154
|
+
description: Same as commit, but for @swamp/verification-attestation's subject.branch.
|
|
155
|
+
jobs:
|
|
156
|
+
- name: verify
|
|
157
|
+
description: Build/test/lint plus architecture-rule checks, gating PR creation
|
|
158
|
+
steps:
|
|
159
|
+
- name: build
|
|
160
|
+
description: compile -> cdk synth -> jest -> eslint (existing projen build task)
|
|
161
|
+
task:
|
|
162
|
+
type: model_method
|
|
163
|
+
modelIdOrName: ${shellModel}
|
|
164
|
+
methodName: execute
|
|
165
|
+
inputs:
|
|
166
|
+
run: pnpm build
|
|
167
|
+
dependsOn: []
|
|
168
|
+
weight: 0
|
|
169
|
+
allowFailure: false
|
|
170
|
+
- name: assert-build
|
|
171
|
+
description: pnpm build must exit 0
|
|
172
|
+
task:
|
|
173
|
+
type: assert
|
|
174
|
+
expr: >-
|
|
175
|
+
data.query('modelName == "${shellModel}" && name == "result" &&
|
|
176
|
+
workflowRunId == "' + run.id + '"')[0].attributes.exitCode == 0
|
|
177
|
+
message: >-
|
|
178
|
+
pnpm build failed (compile/synth/test/lint) — see the ${shellModel}
|
|
179
|
+
result data for stdout/stderr
|
|
180
|
+
severity: high
|
|
181
|
+
dependsOn:
|
|
182
|
+
- step: build
|
|
183
|
+
condition:
|
|
184
|
+
type: succeeded
|
|
185
|
+
weight: 0
|
|
186
|
+
allowFailure: false
|
|
187
|
+
- name: architecture
|
|
188
|
+
description: run the architecture rule registry (architecture-rules/rules.json)
|
|
189
|
+
task:
|
|
190
|
+
type: model_method
|
|
191
|
+
modelIdOrName: ${shellArchitectureModel}
|
|
192
|
+
methodName: execute
|
|
193
|
+
inputs:
|
|
194
|
+
run: pnpm run validate:architecture
|
|
195
|
+
dependsOn:
|
|
196
|
+
- step: assert-build
|
|
197
|
+
condition:
|
|
198
|
+
type: succeeded
|
|
199
|
+
weight: 0
|
|
200
|
+
allowFailure: false
|
|
201
|
+
- name: assert-architecture
|
|
202
|
+
description: architecture rule registry must exit 0 (no enabled-rule violations)
|
|
203
|
+
task:
|
|
204
|
+
type: assert
|
|
205
|
+
expr: >-
|
|
206
|
+
data.query('modelName == "${shellArchitectureModel}" && name == "result" &&
|
|
207
|
+
workflowRunId == "' + run.id + '"')[0].attributes.exitCode == 0
|
|
208
|
+
message: >-
|
|
209
|
+
architecture rule violation(s) found — see the ${shellModel} result
|
|
210
|
+
data for details
|
|
211
|
+
severity: high
|
|
212
|
+
dependsOn:
|
|
213
|
+
- step: architecture
|
|
214
|
+
condition:
|
|
215
|
+
type: succeeded
|
|
216
|
+
weight: 0
|
|
217
|
+
allowFailure: false
|
|
218
|
+
- name: manifest
|
|
219
|
+
description: >-
|
|
220
|
+
compute the attestation-manifest checksums (attestation/manifest.ts)
|
|
221
|
+
that verify-attestation.yml re-checks at merge time
|
|
222
|
+
task:
|
|
223
|
+
type: model_method
|
|
224
|
+
modelIdOrName: ${shellManifestModel}
|
|
225
|
+
methodName: execute
|
|
226
|
+
inputs:
|
|
227
|
+
run: pnpm run attestation:manifest
|
|
228
|
+
dependsOn:
|
|
229
|
+
- step: assert-architecture
|
|
230
|
+
condition:
|
|
231
|
+
type: succeeded
|
|
232
|
+
weight: 0
|
|
233
|
+
allowFailure: false
|
|
234
|
+
- name: assert-manifest
|
|
235
|
+
description: attestation:manifest must exit 0
|
|
236
|
+
task:
|
|
237
|
+
type: assert
|
|
238
|
+
expr: >-
|
|
239
|
+
data.query('modelName == "${shellManifestModel}" && name == "result" &&
|
|
240
|
+
workflowRunId == "' + run.id + '"')[0].attributes.exitCode == 0
|
|
241
|
+
message: >-
|
|
242
|
+
failed to compute the attestation manifest — see the
|
|
243
|
+
${shellManifestModel} result data for stdout/stderr
|
|
244
|
+
severity: high
|
|
245
|
+
dependsOn:
|
|
246
|
+
- step: manifest
|
|
247
|
+
condition:
|
|
248
|
+
type: succeeded
|
|
249
|
+
weight: 0
|
|
250
|
+
allowFailure: false
|
|
251
|
+
dependsOn: []
|
|
252
|
+
weight: 0
|
|
253
|
+
version: 1
|
|
254
|
+
`,
|
|
255
|
+
});
|
|
256
|
+
const packageManager = project.package.packageManager;
|
|
257
|
+
const actionVersions = (0, WorkflowActionVersions_1.resolveActionVersions)(options.actionVersions);
|
|
258
|
+
new projen_1.YamlFile(project, '.github/workflows/verify-attestation.yml', {
|
|
259
|
+
marker: true,
|
|
260
|
+
readonly: true,
|
|
261
|
+
obj: {
|
|
262
|
+
name: 'Verify Attestation',
|
|
263
|
+
on: {
|
|
264
|
+
pull_request: {
|
|
265
|
+
types: ['opened', 'synchronize', 'reopened'],
|
|
266
|
+
},
|
|
267
|
+
},
|
|
268
|
+
permissions: {
|
|
269
|
+
'contents': 'read',
|
|
270
|
+
'pull-requests': 'read',
|
|
271
|
+
},
|
|
272
|
+
jobs: {
|
|
273
|
+
verify: {
|
|
274
|
+
'runs-on': 'ubuntu-latest',
|
|
275
|
+
'steps': [
|
|
276
|
+
{
|
|
277
|
+
name: 'Checkout',
|
|
278
|
+
uses: actionVersions.checkout,
|
|
279
|
+
with: {
|
|
280
|
+
'persist-credentials': false,
|
|
281
|
+
},
|
|
282
|
+
},
|
|
283
|
+
...(packageManager === javascript_1.NodePackageManager.PNPM ? [{
|
|
284
|
+
name: 'Setup pnpm',
|
|
285
|
+
uses: actionVersions.pnpmActionSetup,
|
|
286
|
+
}] : []),
|
|
287
|
+
{
|
|
288
|
+
name: 'Setup Node.js',
|
|
289
|
+
uses: actionVersions.setupNode,
|
|
290
|
+
with: {
|
|
291
|
+
'node-version': '24',
|
|
292
|
+
'package-manager-cache': false,
|
|
293
|
+
},
|
|
294
|
+
},
|
|
295
|
+
{
|
|
296
|
+
name: 'Install dependencies',
|
|
297
|
+
run: (0, utils_1.installCommand)(packageManager),
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
name: 'Fetch PR body',
|
|
301
|
+
env: {
|
|
302
|
+
GH_TOKEN: '${{ secrets.GITHUB_TOKEN }}',
|
|
303
|
+
},
|
|
304
|
+
run: [
|
|
305
|
+
'gh pr view ${{ github.event.pull_request.number }} \\',
|
|
306
|
+
' --repo ${{ github.repository }} \\',
|
|
307
|
+
' --json body -q .body > /tmp/pr-body.md',
|
|
308
|
+
].join('\n'),
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
name: 'Verify attestation',
|
|
312
|
+
run: [
|
|
313
|
+
`${(0, utils_1.runScriptCommand)(packageManager, 'attestation:verify')} -- \\`,
|
|
314
|
+
' --body-file /tmp/pr-body.md \\',
|
|
315
|
+
' --commit ${{ github.event.pull_request.head.sha }}',
|
|
316
|
+
].join('\n'),
|
|
317
|
+
},
|
|
318
|
+
],
|
|
319
|
+
},
|
|
320
|
+
},
|
|
321
|
+
},
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
exports.SoftwareFactoryWorkflows = SoftwareFactoryWorkflows;
|
|
326
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU29mdHdhcmVGYWN0b3J5V29ya2Zsb3dzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NvZnR3YXJlRmFjdG9yeVdvcmtmbG93cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBb0M7QUFDcEMsbUNBQThDO0FBQzlDLHNEQUF3RTtBQUN4RSxtQ0FBMkQ7QUFDM0QscUVBQXlGO0FBZXpGOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBYSx3QkFBd0I7SUFDbkMsWUFBWSxPQUFvQixFQUFFLE9BQXdDO1FBQ3hFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDN0IsTUFBTSxVQUFVLEdBQUcsR0FBRyxRQUFRLFFBQVEsQ0FBQztRQUN2QyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsUUFBUSxxQkFBcUIsQ0FBQztRQUNoRSxNQUFNLGtCQUFrQixHQUFHLEdBQUcsUUFBUSxpQkFBaUIsQ0FBQztRQUV4RCxJQUFJLG1CQUFVLENBQUMsT0FBTyxFQUFFLDhDQUE4QyxFQUFFO1lBQ3RFLFFBQVEsRUFBRSxPQUFPLElBQUEsbUJBQVUsR0FBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MkJBdUJSLFVBQVU7Ozs7Ozs7Ozs7Ozt3Q0FZRyxVQUFVOzs7O3FEQUlHLFVBQVU7Ozs7Ozs7Ozs7OztDQVk5RDtTQUNJLENBQUMsQ0FBQztRQUVILElBQUksbUJBQVUsQ0FBQyxPQUFPLEVBQUUsK0NBQStDLEVBQUU7WUFDdkUsUUFBUSxFQUFFLE9BQU8sSUFBQSxtQkFBVSxHQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MkJBd0JSLFVBQVU7Ozs7Ozs7Ozs7Ozt3Q0FZRyxVQUFVOzs7NkRBR1csVUFBVTs7Ozs7Ozs7Ozs7O0NBWXRFO1NBQ0ksQ0FBQyxDQUFDO1FBRUgsSUFBSSxtQkFBVSxDQUFDLE9BQU8sRUFBRSx1Q0FBdUMsRUFBRTtZQUMvRCxRQUFRLEVBQUUsT0FBTyxJQUFBLG1CQUFVLEdBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsyQkEyQlIsVUFBVTs7Ozs7Ozs7Ozs7O3dDQVlHLFVBQVU7OztvRUFHa0IsVUFBVTs7Ozs7Ozs7Ozs7OzsyQkFhbkQsc0JBQXNCOzs7Ozs7Ozs7Ozs7Ozs7d0NBZVQsc0JBQXNCOzs7NkRBR0QsVUFBVTs7Ozs7Ozs7Ozs7Ozs7OzJCQWU1QyxrQkFBa0I7Ozs7Ozs7Ozs7Ozs7Ozt3Q0FlTCxrQkFBa0I7Ozs7Y0FJNUMsa0JBQWtCOzs7Ozs7Ozs7OztDQVcvQjtTQUNJLENBQUMsQ0FBQztRQUVILE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDO1FBQ3RELE1BQU0sY0FBYyxHQUFHLElBQUEsOENBQXFCLEVBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXJFLElBQUksaUJBQVEsQ0FBQyxPQUFPLEVBQUUsMENBQTBDLEVBQUU7WUFDaEUsTUFBTSxFQUFFLElBQUk7WUFDWixRQUFRLEVBQUUsSUFBSTtZQUNkLEdBQUcsRUFBRTtnQkFDSCxJQUFJLEVBQUUsb0JBQW9CO2dCQUMxQixFQUFFLEVBQUU7b0JBQ0YsWUFBWSxFQUFFO3dCQUNaLEtBQUssRUFBRSxDQUFDLFFBQVEsRUFBRSxhQUFhLEVBQUUsVUFBVSxDQUFDO3FCQUM3QztpQkFDRjtnQkFDRCxXQUFXLEVBQUU7b0JBQ1gsVUFBVSxFQUFFLE1BQU07b0JBQ2xCLGVBQWUsRUFBRSxNQUFNO2lCQUN4QjtnQkFDRCxJQUFJLEVBQUU7b0JBQ0osTUFBTSxFQUFFO3dCQUNOLFNBQVMsRUFBRSxlQUFlO3dCQUMxQixPQUFPLEVBQUU7NEJBQ1A7Z0NBQ0UsSUFBSSxFQUFFLFVBQVU7Z0NBQ2hCLElBQUksRUFBRSxjQUFjLENBQUMsUUFBUTtnQ0FDN0IsSUFBSSxFQUFFO29DQUNKLHFCQUFxQixFQUFFLEtBQUs7aUNBQzdCOzZCQUNGOzRCQUNELEdBQUcsQ0FBQyxjQUFjLEtBQUssK0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO29DQUNoRCxJQUFJLEVBQUUsWUFBWTtvQ0FDbEIsSUFBSSxFQUFFLGNBQWMsQ0FBQyxlQUFlO2lDQUNyQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs0QkFDUjtnQ0FDRSxJQUFJLEVBQUUsZUFBZTtnQ0FDckIsSUFBSSxFQUFFLGNBQWMsQ0FBQyxTQUFTO2dDQUM5QixJQUFJLEVBQUU7b0NBQ0osY0FBYyxFQUFFLElBQUk7b0NBQ3BCLHVCQUF1QixFQUFFLEtBQUs7aUNBQy9COzZCQUNGOzRCQUNEO2dDQUNFLElBQUksRUFBRSxzQkFBc0I7Z0NBQzVCLEdBQUcsRUFBRSxJQUFBLHNCQUFjLEVBQUMsY0FBYyxDQUFDOzZCQUNwQzs0QkFDRDtnQ0FDRSxJQUFJLEVBQUUsZUFBZTtnQ0FDckIsR0FBRyxFQUFFO29DQUNILFFBQVEsRUFBRSw2QkFBNkI7aUNBQ3hDO2dDQUNELEdBQUcsRUFBRTtvQ0FDSCx1REFBdUQ7b0NBQ3ZELHNDQUFzQztvQ0FDdEMsMENBQTBDO2lDQUMzQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7NkJBQ2I7NEJBQ0Q7Z0NBQ0UsSUFBSSxFQUFFLG9CQUFvQjtnQ0FDMUIsR0FBRyxFQUFFO29DQUNILEdBQUcsSUFBQSx3QkFBZ0IsRUFBQyxjQUFjLEVBQUUsb0JBQW9CLENBQUMsUUFBUTtvQ0FDakUsa0NBQWtDO29DQUNsQyxzREFBc0Q7aUNBQ3ZELENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQzs2QkFDYjt5QkFDRjtxQkFDRjtpQkFDRjthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBcFRELDREQW9UQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgU2FtcGxlRmlsZSwgWWFtbEZpbGUgfSBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgTm9kZVBhY2thZ2VNYW5hZ2VyLCBOb2RlUHJvamVjdCB9IGZyb20gJ3Byb2plbi9saWIvamF2YXNjcmlwdCc7XG5pbXBvcnQgeyBpbnN0YWxsQ29tbWFuZCwgcnVuU2NyaXB0Q29tbWFuZCB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgcmVzb2x2ZUFjdGlvblZlcnNpb25zLCBXb3JrZmxvd0FjdGlvblZlcnNpb25zIH0gZnJvbSAnLi9Xb3JrZmxvd0FjdGlvblZlcnNpb25zJztcblxuZXhwb3J0IGludGVyZmFjZSBTb2Z0d2FyZUZhY3RvcnlXb3JrZmxvd3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBiYXJlIHJlcG8gbmFtZSwgdXNlZCB0byBkZXJpdmUgdGhlIGA8cmVwb05hbWU+LXNoZWxsWy1hcmNoaXRlY3R1cmV8LW1hbmlmZXN0XWBcbiAgICogbW9kZWwgbmFtZXMgdGhlc2Ugd29ya2Zsb3dzIGRpc3BhdGNoIHNoZWxsIGNvbW1hbmRzIHRocm91Z2guXG4gICAqL1xuICByZWFkb25seSByZXBvTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZXMgZm9yIHRoZSBwaW5uZWQgYWN0aW9uIHZlcnNpb25zIHVzZWQgYnkgYHZlcmlmeS1hdHRlc3RhdGlvbi55bWxgLlxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aW9uVmVyc2lvbnM/OiBXb3JrZmxvd0FjdGlvblZlcnNpb25zO1xufVxuXG4vKipcbiAqIFRoZSAzIHN3YW1wIHdvcmtmbG93cyB0aGUgZmFjdG9yeSdzIGdhdGUgc3RhZ2VzIHJ1biAob3BlbnNwZWMtcGxhbi12ZXJpZnksXG4gKiBvcGVuc3BlYy10YXNrcy12ZXJpZnksIHByZS1wci12ZXJpZnkpLCBwbHVzIHRoZSBHaXRIdWIgQWN0aW9uIHRoYXRcbiAqIHJlLXZlcmlmaWVzIGEgUFIncyBlbWJlZGRlZCBhdHRlc3RhdGlvbiBhdCBtZXJnZSB0aW1lLlxuICpcbiAqIFRoZSBzd2FtcCB3b3JrZmxvdyBZQU1McyBjYXJyeSBhIHN3YW1wLWFzc2lnbmVkIGBpZGAgdGhhdCBtdXN0IHN0YXkgc3RhYmxlXG4gKiBhY3Jvc3Mgc3ludGhzIChzd2FtcCB1c2VzIGl0IGFzIHRoZSB3b3JrZmxvdydzIGlkZW50aXR5KSwgc28g4oCUIGxpa2UgdGhlXG4gKiBtb2RlbCBpbnN0YW5jZXMgaW4gYFNvZnR3YXJlRmFjdG9yeU1vZGVsc2Ag4oCUIHRoZXkncmUgYFNhbXBsZUZpbGVgcywgd3JpdHRlblxuICogb25jZSBhbmQgdGhlbiBvd25lZCBieSB0aGUgdGVhbS4gYHZlcmlmeS1hdHRlc3RhdGlvbi55bWxgIGhhcyBubyBzdWNoXG4gKiBpZGVudGl0eSBjb25zdHJhaW50IGFuZCBpcyBhIHBsYWluIEdpdEh1YiBBY3Rpb25zIHdvcmtmbG93LCBzbyBpdCdzIGJ1aWx0XG4gKiB0aGUgc2FtZSBtYW5hZ2VkIHdheSBgUHJEZXBsb3lXb3JrZmxvd2AgaXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTb2Z0d2FyZUZhY3RvcnlXb3JrZmxvd3Mge1xuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBOb2RlUHJvamVjdCwgb3B0aW9uczogU29mdHdhcmVGYWN0b3J5V29ya2Zsb3dzT3B0aW9ucykge1xuICAgIGNvbnN0IHsgcmVwb05hbWUgfSA9IG9wdGlvbnM7XG4gICAgY29uc3Qgc2hlbGxNb2RlbCA9IGAke3JlcG9OYW1lfS1zaGVsbGA7XG4gICAgY29uc3Qgc2hlbGxBcmNoaXRlY3R1cmVNb2RlbCA9IGAke3JlcG9OYW1lfS1zaGVsbC1hcmNoaXRlY3R1cmVgO1xuICAgIGNvbnN0IHNoZWxsTWFuaWZlc3RNb2RlbCA9IGAke3JlcG9OYW1lfS1zaGVsbC1tYW5pZmVzdGA7XG5cbiAgICBuZXcgU2FtcGxlRmlsZShwcm9qZWN0LCAnd29ya2Zsb3dzL3dvcmtmbG93LW9wZW5zcGVjLXBsYW4tdmVyaWZ5LnlhbWwnLCB7XG4gICAgICBjb250ZW50czogYGlkOiAke3JhbmRvbVVVSUQoKX1cbm5hbWU6IG9wZW5zcGVjLXBsYW4tdmVyaWZ5XG5kZXNjcmlwdGlvbjogPi1cbiAgRmFpbHMgdW5sZXNzIHRoZSBuYW1lZCBPcGVuU3BlYyBjaGFuZ2UgaXMgd2VsbC1mb3JtZWQgKHByb3Bvc2FsLCBkZXNpZ24sXG4gIHNwZWNzIHdpdGggZGVsdGFzLCB0YXNrcyBhbGwgcHJlc2VudCkgdmlhIFxcYG9wZW5zcGVjIHZhbGlkYXRlXFxgLiBHYXRlcyB0aGVcbiAgZmFjdG9yeSdzIHBsYW5uaW5nIHN0YWdlOiBhIHJlcXVlc3QgY2FuJ3QgcHJvY2VlZCB0byBpbXBsZW1lbnRhdGlvbiB1bnRpbFxuICBpdCdzIGEgcmVhbCBPcGVuU3BlYyBjaGFuZ2UsIG5vdCBqdXN0IHByb3NlIGluIGEgc3dhbXAgYXJ0aWZhY3QuXG50YWdzOiB7fVxuaW5wdXRzOlxuICB0eXBlOiBvYmplY3RcbiAgcmVxdWlyZWQ6IFtjaGFuZ2VTbHVnXVxuICBwcm9wZXJ0aWVzOlxuICAgIGNoYW5nZVNsdWc6XG4gICAgICB0eXBlOiBzdHJpbmdcbiAgICAgIGRlc2NyaXB0aW9uOiBUaGUgb3BlbnNwZWMgY2hhbmdlIG5hbWUgKG9wZW5zcGVjL2NoYW5nZXMvPGNoYW5nZVNsdWc+LykuXG5qb2JzOlxuICAtIG5hbWU6IHZlcmlmeVxuICAgIGRlc2NyaXB0aW9uOiBWYWxpZGF0ZSB0aGUgT3BlblNwZWMgY2hhbmdlIGlzIGNvbXBsZXRlIGFuZCB3ZWxsLWZvcm1lZFxuICAgIHN0ZXBzOlxuICAgICAgLSBuYW1lOiB2YWxpZGF0ZVxuICAgICAgICBkZXNjcmlwdGlvbjogb3BlbnNwZWMgdmFsaWRhdGUgPGNoYW5nZVNsdWc+IC0tdHlwZSBjaGFuZ2VcbiAgICAgICAgdGFzazpcbiAgICAgICAgICB0eXBlOiBtb2RlbF9tZXRob2RcbiAgICAgICAgICBtb2RlbElkT3JOYW1lOiAke3NoZWxsTW9kZWx9XG4gICAgICAgICAgbWV0aG9kTmFtZTogZXhlY3V0ZVxuICAgICAgICAgIGlucHV0czpcbiAgICAgICAgICAgIHJ1bjogJ29wZW5zcGVjIHZhbGlkYXRlIFxcJHt7IGlucHV0cy5jaGFuZ2VTbHVnIH19IC0tdHlwZSBjaGFuZ2UnXG4gICAgICAgIGRlcGVuZHNPbjogW11cbiAgICAgICAgd2VpZ2h0OiAwXG4gICAgICAgIGFsbG93RmFpbHVyZTogZmFsc2VcbiAgICAgIC0gbmFtZTogYXNzZXJ0LXZhbGlkXG4gICAgICAgIGRlc2NyaXB0aW9uOiBvcGVuc3BlYyB2YWxpZGF0ZSBtdXN0IGV4aXQgMFxuICAgICAgICB0YXNrOlxuICAgICAgICAgIHR5cGU6IGFzc2VydFxuICAgICAgICAgIGV4cHI6ID4tXG4gICAgICAgICAgICBkYXRhLnF1ZXJ5KCdtb2RlbE5hbWUgPT0gXCIke3NoZWxsTW9kZWx9XCIgJiYgbmFtZSA9PSBcInJlc3VsdFwiICYmXG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkID09IFwiJyArIHJ1bi5pZCArICdcIicpWzBdLmF0dHJpYnV0ZXMuZXhpdENvZGUgPT0gMFxuICAgICAgICAgIG1lc3NhZ2U6ID4tXG4gICAgICAgICAgICBPcGVuU3BlYyBjaGFuZ2UgaXMgbm90IHZhbGlkL2NvbXBsZXRlIChtaXNzaW5nIHByb3Bvc2FsLCBkZXNpZ24sXG4gICAgICAgICAgICBzcGVjcyB3aXRoIGRlbHRhcywgb3IgdGFza3MpIOKAlCBzZWUgdGhlICR7c2hlbGxNb2RlbH0gcmVzdWx0IGRhdGFcbiAgICAgICAgICAgIGZvciBvcGVuc3BlYydzIG93biByZW1lZGlhdGlvbiBvdXRwdXRcbiAgICAgICAgICBzZXZlcml0eTogaGlnaFxuICAgICAgICBkZXBlbmRzT246XG4gICAgICAgICAgLSBzdGVwOiB2YWxpZGF0ZVxuICAgICAgICAgICAgY29uZGl0aW9uOlxuICAgICAgICAgICAgICB0eXBlOiBzdWNjZWVkZWRcbiAgICAgICAgd2VpZ2h0OiAwXG4gICAgICAgIGFsbG93RmFpbHVyZTogZmFsc2VcbiAgICBkZXBlbmRzT246IFtdXG4gICAgd2VpZ2h0OiAwXG52ZXJzaW9uOiAxXG5gLFxuICAgIH0pO1xuXG4gICAgbmV3IFNhbXBsZUZpbGUocHJvamVjdCwgJ3dvcmtmbG93cy93b3JrZmxvdy1vcGVuc3BlYy10YXNrcy12ZXJpZnkueWFtbCcsIHtcbiAgICAgIGNvbnRlbnRzOiBgaWQ6ICR7cmFuZG9tVVVJRCgpfVxubmFtZTogb3BlbnNwZWMtdGFza3MtdmVyaWZ5XG5kZXNjcmlwdGlvbjogPi1cbiAgRmFpbHMgdW5sZXNzIGV2ZXJ5IHRhc2sgaW4gdGhlIG5hbWVkIE9wZW5TcGVjIGNoYW5nZSdzIHRhc2tzLm1kIGlzIGNoZWNrZWRcbiAgb2ZmIChvcGVuc3BlYy1nYXRlcy9jaGVjay10YXNrcy1jb21wbGV0ZS50cywgdmlhIFxcYHBucG0gcnVuXG4gIG9wZW5zcGVjOmNoZWNrLXRhc2tzLWNvbXBsZXRlXFxgKS4gR2F0ZXMgdGhlIGZhY3RvcnkncyBpbXBsZW1lbnRpbmcgc3RhZ2U6XG4gIHdvcmsgaXNuJ3QgZG9uZSB1bnRpbCB0aGUgY2hhbmdlJ3Mgb3duIHRhc2sgbGlzdCBzYXlzIGl0J3MgZG9uZSwgbm90IGp1c3RcbiAgYmVjYXVzZSBhbiBhcnRpZmFjdCB3YXMgcmVjb3JkZWQuXG50YWdzOiB7fVxuaW5wdXRzOlxuICB0eXBlOiBvYmplY3RcbiAgcmVxdWlyZWQ6IFtjaGFuZ2VTbHVnXVxuICBwcm9wZXJ0aWVzOlxuICAgIGNoYW5nZVNsdWc6XG4gICAgICB0eXBlOiBzdHJpbmdcbiAgICAgIGRlc2NyaXB0aW9uOiBUaGUgb3BlbnNwZWMgY2hhbmdlIG5hbWUgKG9wZW5zcGVjL2NoYW5nZXMvPGNoYW5nZVNsdWc+LykuXG5qb2JzOlxuICAtIG5hbWU6IHZlcmlmeVxuICAgIGRlc2NyaXB0aW9uOiBDaGVjayBldmVyeSB0YXNrIGluIHRoZSBjaGFuZ2UncyB0YXNrcy5tZCBpcyBjb21wbGV0ZVxuICAgIHN0ZXBzOlxuICAgICAgLSBuYW1lOiBjaGVjay10YXNrc1xuICAgICAgICBkZXNjcmlwdGlvbjogcG5wbSBydW4gb3BlbnNwZWM6Y2hlY2stdGFza3MtY29tcGxldGUgLS0gPGNoYW5nZVNsdWc+XG4gICAgICAgIHRhc2s6XG4gICAgICAgICAgdHlwZTogbW9kZWxfbWV0aG9kXG4gICAgICAgICAgbW9kZWxJZE9yTmFtZTogJHtzaGVsbE1vZGVsfVxuICAgICAgICAgIG1ldGhvZE5hbWU6IGV4ZWN1dGVcbiAgICAgICAgICBpbnB1dHM6XG4gICAgICAgICAgICBydW46ICdwbnBtIHJ1biBvcGVuc3BlYzpjaGVjay10YXNrcy1jb21wbGV0ZSAtLSBcXCR7eyBpbnB1dHMuY2hhbmdlU2x1ZyB9fSdcbiAgICAgICAgZGVwZW5kc09uOiBbXVxuICAgICAgICB3ZWlnaHQ6IDBcbiAgICAgICAgYWxsb3dGYWlsdXJlOiBmYWxzZVxuICAgICAgLSBuYW1lOiBhc3NlcnQtdGFza3MtY29tcGxldGVcbiAgICAgICAgZGVzY3JpcHRpb246IG9wZW5zcGVjOmNoZWNrLXRhc2tzLWNvbXBsZXRlIG11c3QgZXhpdCAwXG4gICAgICAgIHRhc2s6XG4gICAgICAgICAgdHlwZTogYXNzZXJ0XG4gICAgICAgICAgZXhwcjogPi1cbiAgICAgICAgICAgIGRhdGEucXVlcnkoJ21vZGVsTmFtZSA9PSBcIiR7c2hlbGxNb2RlbH1cIiAmJiBuYW1lID09IFwicmVzdWx0XCIgJiZcbiAgICAgICAgICAgIHdvcmtmbG93UnVuSWQgPT0gXCInICsgcnVuLmlkICsgJ1wiJylbMF0uYXR0cmlidXRlcy5leGl0Q29kZSA9PSAwXG4gICAgICAgICAgbWVzc2FnZTogPi1cbiAgICAgICAgICAgIE9wZW5TcGVjIGNoYW5nZSBoYXMgaW5jb21wbGV0ZSB0YXNrcyDigJQgc2VlIHRoZSAke3NoZWxsTW9kZWx9XG4gICAgICAgICAgICByZXN1bHQgZGF0YSBmb3IgdGhlIGNvbXBsZXRlZFRhc2tzL3RvdGFsVGFza3MgYnJlYWtkb3duXG4gICAgICAgICAgc2V2ZXJpdHk6IGhpZ2hcbiAgICAgICAgZGVwZW5kc09uOlxuICAgICAgICAgIC0gc3RlcDogY2hlY2stdGFza3NcbiAgICAgICAgICAgIGNvbmRpdGlvbjpcbiAgICAgICAgICAgICAgdHlwZTogc3VjY2VlZGVkXG4gICAgICAgIHdlaWdodDogMFxuICAgICAgICBhbGxvd0ZhaWx1cmU6IGZhbHNlXG4gICAgZGVwZW5kc09uOiBbXVxuICAgIHdlaWdodDogMFxudmVyc2lvbjogMVxuYCxcbiAgICB9KTtcblxuICAgIG5ldyBTYW1wbGVGaWxlKHByb2plY3QsICd3b3JrZmxvd3Mvd29ya2Zsb3ctcHJlLXByLXZlcmlmeS55YW1sJywge1xuICAgICAgY29udGVudHM6IGBpZDogJHtyYW5kb21VVUlEKCl9XG5uYW1lOiBwcmUtcHItdmVyaWZ5XG5kZXNjcmlwdGlvbjogPi1cbiAgUHJlLVBSIHZlcmlmaWNhdGlvbjogcnVuIHRoZSBzYW1lIGNoZWNrcyBDSSB3b3VsZCBydW4sIGJlZm9yZSB0aGUgZmFjdG9yeVxuICBvcGVucyBhIFBSIHJhdGhlciB0aGFuIGFmdGVyIOKAlCBidWlsZC9zeW50aC90ZXN0L2xpbnQgKHBucG0gYnVpbGQpIGFuZCB0aGVcbiAgYXJjaGl0ZWN0dXJlIHJ1bGUgcmVnaXN0cnkgKHBucG0gdmFsaWRhdGU6YXJjaGl0ZWN0dXJlKS4gQm90aCBtdXN0IHBhc3MuXG50YWdzOiB7fVxuaW5wdXRzOlxuICB0eXBlOiBvYmplY3RcbiAgcHJvcGVydGllczpcbiAgICBjb21taXQ6XG4gICAgICB0eXBlOiBzdHJpbmdcbiAgICAgIGRlc2NyaXB0aW9uOiA+LVxuICAgICAgICBUaGUgY29tbWl0IHNoYSBiZWluZyB2ZXJpZmllZC4gUmVhZCBieSB0aGUgYnVpbHQtaW5cbiAgICAgICAgQHN3YW1wL3ZlcmlmaWNhdGlvbi1hdHRlc3RhdGlvbiByZXBvcnQncyBzdWJqZWN0LmNvbW1pdCDigJQgcGFzcyB0aGVcbiAgICAgICAgcmVhbCBIRUFEIHNoYSBvciB0aGUgYXR0ZXN0YXRpb24gcmVuZGVycyBcInVua25vd25cIi5cbiAgICBicmFuY2g6XG4gICAgICB0eXBlOiBzdHJpbmdcbiAgICAgIGRlc2NyaXB0aW9uOiBTYW1lIGFzIGNvbW1pdCwgYnV0IGZvciBAc3dhbXAvdmVyaWZpY2F0aW9uLWF0dGVzdGF0aW9uJ3Mgc3ViamVjdC5icmFuY2guXG5qb2JzOlxuICAtIG5hbWU6IHZlcmlmeVxuICAgIGRlc2NyaXB0aW9uOiBCdWlsZC90ZXN0L2xpbnQgcGx1cyBhcmNoaXRlY3R1cmUtcnVsZSBjaGVja3MsIGdhdGluZyBQUiBjcmVhdGlvblxuICAgIHN0ZXBzOlxuICAgICAgLSBuYW1lOiBidWlsZFxuICAgICAgICBkZXNjcmlwdGlvbjogY29tcGlsZSAtPiBjZGsgc3ludGggLT4gamVzdCAtPiBlc2xpbnQgKGV4aXN0aW5nIHByb2plbiBidWlsZCB0YXNrKVxuICAgICAgICB0YXNrOlxuICAgICAgICAgIHR5cGU6IG1vZGVsX21ldGhvZFxuICAgICAgICAgIG1vZGVsSWRPck5hbWU6ICR7c2hlbGxNb2RlbH1cbiAgICAgICAgICBtZXRob2ROYW1lOiBleGVjdXRlXG4gICAgICAgICAgaW5wdXRzOlxuICAgICAgICAgICAgcnVuOiBwbnBtIGJ1aWxkXG4gICAgICAgIGRlcGVuZHNPbjogW11cbiAgICAgICAgd2VpZ2h0OiAwXG4gICAgICAgIGFsbG93RmFpbHVyZTogZmFsc2VcbiAgICAgIC0gbmFtZTogYXNzZXJ0LWJ1aWxkXG4gICAgICAgIGRlc2NyaXB0aW9uOiBwbnBtIGJ1aWxkIG11c3QgZXhpdCAwXG4gICAgICAgIHRhc2s6XG4gICAgICAgICAgdHlwZTogYXNzZXJ0XG4gICAgICAgICAgZXhwcjogPi1cbiAgICAgICAgICAgIGRhdGEucXVlcnkoJ21vZGVsTmFtZSA9PSBcIiR7c2hlbGxNb2RlbH1cIiAmJiBuYW1lID09IFwicmVzdWx0XCIgJiZcbiAgICAgICAgICAgIHdvcmtmbG93UnVuSWQgPT0gXCInICsgcnVuLmlkICsgJ1wiJylbMF0uYXR0cmlidXRlcy5leGl0Q29kZSA9PSAwXG4gICAgICAgICAgbWVzc2FnZTogPi1cbiAgICAgICAgICAgIHBucG0gYnVpbGQgZmFpbGVkIChjb21waWxlL3N5bnRoL3Rlc3QvbGludCkg4oCUIHNlZSB0aGUgJHtzaGVsbE1vZGVsfVxuICAgICAgICAgICAgcmVzdWx0IGRhdGEgZm9yIHN0ZG91dC9zdGRlcnJcbiAgICAgICAgICBzZXZlcml0eTogaGlnaFxuICAgICAgICBkZXBlbmRzT246XG4gICAgICAgICAgLSBzdGVwOiBidWlsZFxuICAgICAgICAgICAgY29uZGl0aW9uOlxuICAgICAgICAgICAgICB0eXBlOiBzdWNjZWVkZWRcbiAgICAgICAgd2VpZ2h0OiAwXG4gICAgICAgIGFsbG93RmFpbHVyZTogZmFsc2VcbiAgICAgIC0gbmFtZTogYXJjaGl0ZWN0dXJlXG4gICAgICAgIGRlc2NyaXB0aW9uOiBydW4gdGhlIGFyY2hpdGVjdHVyZSBydWxlIHJlZ2lzdHJ5IChhcmNoaXRlY3R1cmUtcnVsZXMvcnVsZXMuanNvbilcbiAgICAgICAgdGFzazpcbiAgICAgICAgICB0eXBlOiBtb2RlbF9tZXRob2RcbiAgICAgICAgICBtb2RlbElkT3JOYW1lOiAke3NoZWxsQXJjaGl0ZWN0dXJlTW9kZWx9XG4gICAgICAgICAgbWV0aG9kTmFtZTogZXhlY3V0ZVxuICAgICAgICAgIGlucHV0czpcbiAgICAgICAgICAgIHJ1bjogcG5wbSBydW4gdmFsaWRhdGU6YXJjaGl0ZWN0dXJlXG4gICAgICAgIGRlcGVuZHNPbjpcbiAgICAgICAgICAtIHN0ZXA6IGFzc2VydC1idWlsZFxuICAgICAgICAgICAgY29uZGl0aW9uOlxuICAgICAgICAgICAgICB0eXBlOiBzdWNjZWVkZWRcbiAgICAgICAgd2VpZ2h0OiAwXG4gICAgICAgIGFsbG93RmFpbHVyZTogZmFsc2VcbiAgICAgIC0gbmFtZTogYXNzZXJ0LWFyY2hpdGVjdHVyZVxuICAgICAgICBkZXNjcmlwdGlvbjogYXJjaGl0ZWN0dXJlIHJ1bGUgcmVnaXN0cnkgbXVzdCBleGl0IDAgKG5vIGVuYWJsZWQtcnVsZSB2aW9sYXRpb25zKVxuICAgICAgICB0YXNrOlxuICAgICAgICAgIHR5cGU6IGFzc2VydFxuICAgICAgICAgIGV4cHI6ID4tXG4gICAgICAgICAgICBkYXRhLnF1ZXJ5KCdtb2RlbE5hbWUgPT0gXCIke3NoZWxsQXJjaGl0ZWN0dXJlTW9kZWx9XCIgJiYgbmFtZSA9PSBcInJlc3VsdFwiICYmXG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkID09IFwiJyArIHJ1bi5pZCArICdcIicpWzBdLmF0dHJpYnV0ZXMuZXhpdENvZGUgPT0gMFxuICAgICAgICAgIG1lc3NhZ2U6ID4tXG4gICAgICAgICAgICBhcmNoaXRlY3R1cmUgcnVsZSB2aW9sYXRpb24ocykgZm91bmQg4oCUIHNlZSB0aGUgJHtzaGVsbE1vZGVsfSByZXN1bHRcbiAgICAgICAgICAgIGRhdGEgZm9yIGRldGFpbHNcbiAgICAgICAgICBzZXZlcml0eTogaGlnaFxuICAgICAgICBkZXBlbmRzT246XG4gICAgICAgICAgLSBzdGVwOiBhcmNoaXRlY3R1cmVcbiAgICAgICAgICAgIGNvbmRpdGlvbjpcbiAgICAgICAgICAgICAgdHlwZTogc3VjY2VlZGVkXG4gICAgICAgIHdlaWdodDogMFxuICAgICAgICBhbGxvd0ZhaWx1cmU6IGZhbHNlXG4gICAgICAtIG5hbWU6IG1hbmlmZXN0XG4gICAgICAgIGRlc2NyaXB0aW9uOiA+LVxuICAgICAgICAgIGNvbXB1dGUgdGhlIGF0dGVzdGF0aW9uLW1hbmlmZXN0IGNoZWNrc3VtcyAoYXR0ZXN0YXRpb24vbWFuaWZlc3QudHMpXG4gICAgICAgICAgdGhhdCB2ZXJpZnktYXR0ZXN0YXRpb24ueW1sIHJlLWNoZWNrcyBhdCBtZXJnZSB0aW1lXG4gICAgICAgIHRhc2s6XG4gICAgICAgICAgdHlwZTogbW9kZWxfbWV0aG9kXG4gICAgICAgICAgbW9kZWxJZE9yTmFtZTogJHtzaGVsbE1hbmlmZXN0TW9kZWx9XG4gICAgICAgICAgbWV0aG9kTmFtZTogZXhlY3V0ZVxuICAgICAgICAgIGlucHV0czpcbiAgICAgICAgICAgIHJ1bjogcG5wbSBydW4gYXR0ZXN0YXRpb246bWFuaWZlc3RcbiAgICAgICAgZGVwZW5kc09uOlxuICAgICAgICAgIC0gc3RlcDogYXNzZXJ0LWFyY2hpdGVjdHVyZVxuICAgICAgICAgICAgY29uZGl0aW9uOlxuICAgICAgICAgICAgICB0eXBlOiBzdWNjZWVkZWRcbiAgICAgICAgd2VpZ2h0OiAwXG4gICAgICAgIGFsbG93RmFpbHVyZTogZmFsc2VcbiAgICAgIC0gbmFtZTogYXNzZXJ0LW1hbmlmZXN0XG4gICAgICAgIGRlc2NyaXB0aW9uOiBhdHRlc3RhdGlvbjptYW5pZmVzdCBtdXN0IGV4aXQgMFxuICAgICAgICB0YXNrOlxuICAgICAgICAgIHR5cGU6IGFzc2VydFxuICAgICAgICAgIGV4cHI6ID4tXG4gICAgICAgICAgICBkYXRhLnF1ZXJ5KCdtb2RlbE5hbWUgPT0gXCIke3NoZWxsTWFuaWZlc3RNb2RlbH1cIiAmJiBuYW1lID09IFwicmVzdWx0XCIgJiZcbiAgICAgICAgICAgIHdvcmtmbG93UnVuSWQgPT0gXCInICsgcnVuLmlkICsgJ1wiJylbMF0uYXR0cmlidXRlcy5leGl0Q29kZSA9PSAwXG4gICAgICAgICAgbWVzc2FnZTogPi1cbiAgICAgICAgICAgIGZhaWxlZCB0byBjb21wdXRlIHRoZSBhdHRlc3RhdGlvbiBtYW5pZmVzdCDigJQgc2VlIHRoZVxuICAgICAgICAgICAgJHtzaGVsbE1hbmlmZXN0TW9kZWx9IHJlc3VsdCBkYXRhIGZvciBzdGRvdXQvc3RkZXJyXG4gICAgICAgICAgc2V2ZXJpdHk6IGhpZ2hcbiAgICAgICAgZGVwZW5kc09uOlxuICAgICAgICAgIC0gc3RlcDogbWFuaWZlc3RcbiAgICAgICAgICAgIGNvbmRpdGlvbjpcbiAgICAgICAgICAgICAgdHlwZTogc3VjY2VlZGVkXG4gICAgICAgIHdlaWdodDogMFxuICAgICAgICBhbGxvd0ZhaWx1cmU6IGZhbHNlXG4gICAgZGVwZW5kc09uOiBbXVxuICAgIHdlaWdodDogMFxudmVyc2lvbjogMVxuYCxcbiAgICB9KTtcblxuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gcHJvamVjdC5wYWNrYWdlLnBhY2thZ2VNYW5hZ2VyO1xuICAgIGNvbnN0IGFjdGlvblZlcnNpb25zID0gcmVzb2x2ZUFjdGlvblZlcnNpb25zKG9wdGlvbnMuYWN0aW9uVmVyc2lvbnMpO1xuXG4gICAgbmV3IFlhbWxGaWxlKHByb2plY3QsICcuZ2l0aHViL3dvcmtmbG93cy92ZXJpZnktYXR0ZXN0YXRpb24ueW1sJywge1xuICAgICAgbWFya2VyOiB0cnVlLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICBvYmo6IHtcbiAgICAgICAgbmFtZTogJ1ZlcmlmeSBBdHRlc3RhdGlvbicsXG4gICAgICAgIG9uOiB7XG4gICAgICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgICAgICB0eXBlczogWydvcGVuZWQnLCAnc3luY2hyb25pemUnLCAncmVvcGVuZWQnXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICAgICdjb250ZW50cyc6ICdyZWFkJyxcbiAgICAgICAgICAncHVsbC1yZXF1ZXN0cyc6ICdyZWFkJyxcbiAgICAgICAgfSxcbiAgICAgICAgam9iczoge1xuICAgICAgICAgIHZlcmlmeToge1xuICAgICAgICAgICAgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcsXG4gICAgICAgICAgICAnc3RlcHMnOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQ2hlY2tvdXQnLFxuICAgICAgICAgICAgICAgIHVzZXM6IGFjdGlvblZlcnNpb25zLmNoZWNrb3V0LFxuICAgICAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgICAgICdwZXJzaXN0LWNyZWRlbnRpYWxzJzogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgLi4uKHBhY2thZ2VNYW5hZ2VyID09PSBOb2RlUGFja2FnZU1hbmFnZXIuUE5QTSA/IFt7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1NldHVwIHBucG0nLFxuICAgICAgICAgICAgICAgIHVzZXM6IGFjdGlvblZlcnNpb25zLnBucG1BY3Rpb25TZXR1cCxcbiAgICAgICAgICAgICAgfV0gOiBbXSksXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnU2V0dXAgTm9kZS5qcycsXG4gICAgICAgICAgICAgICAgdXNlczogYWN0aW9uVmVyc2lvbnMuc2V0dXBOb2RlLFxuICAgICAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgICAgICdub2RlLXZlcnNpb24nOiAnMjQnLFxuICAgICAgICAgICAgICAgICAgJ3BhY2thZ2UtbWFuYWdlci1jYWNoZSc6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnSW5zdGFsbCBkZXBlbmRlbmNpZXMnLFxuICAgICAgICAgICAgICAgIHJ1bjogaW5zdGFsbENvbW1hbmQocGFja2FnZU1hbmFnZXIpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0ZldGNoIFBSIGJvZHknLFxuICAgICAgICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgICAgICAgR0hfVE9LRU46ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcnVuOiBbXG4gICAgICAgICAgICAgICAgICAnZ2ggcHIgdmlldyAke3sgZ2l0aHViLmV2ZW50LnB1bGxfcmVxdWVzdC5udW1iZXIgfX0gXFxcXCcsXG4gICAgICAgICAgICAgICAgICAnICAtLXJlcG8gJHt7IGdpdGh1Yi5yZXBvc2l0b3J5IH19IFxcXFwnLFxuICAgICAgICAgICAgICAgICAgJyAgLS1qc29uIGJvZHkgLXEgLmJvZHkgPiAvdG1wL3ByLWJvZHkubWQnLFxuICAgICAgICAgICAgICAgIF0uam9pbignXFxuJyksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnVmVyaWZ5IGF0dGVzdGF0aW9uJyxcbiAgICAgICAgICAgICAgICBydW46IFtcbiAgICAgICAgICAgICAgICAgIGAke3J1blNjcmlwdENvbW1hbmQocGFja2FnZU1hbmFnZXIsICdhdHRlc3RhdGlvbjp2ZXJpZnknKX0gLS0gXFxcXGAsXG4gICAgICAgICAgICAgICAgICAnICAtLWJvZHktZmlsZSAvdG1wL3ByLWJvZHkubWQgXFxcXCcsXG4gICAgICAgICAgICAgICAgICAnICAtLWNvbW1pdCAke3sgZ2l0aHViLmV2ZW50LnB1bGxfcmVxdWVzdC5oZWFkLnNoYSB9fScsXG4gICAgICAgICAgICAgICAgXS5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -7,7 +7,7 @@ const javascript_1 = require("projen/lib/javascript");
|
|
|
7
7
|
const utils_1 = require("./utils");
|
|
8
8
|
const WorkflowActionVersions_1 = require("./WorkflowActionVersions");
|
|
9
9
|
class StagingDeployWorkflow extends projen_1.YamlFile {
|
|
10
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.StagingDeployWorkflow", version: "1.
|
|
10
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.StagingDeployWorkflow", version: "1.18.0" };
|
|
11
11
|
constructor(project, options) {
|
|
12
12
|
const packageManager = project.package.packageManager;
|
|
13
13
|
const actionVersions = (0, WorkflowActionVersions_1.resolveActionVersions)(options.actionVersions);
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* SHA-pinned action references used by the generated deploy/cleanup workflows
|
|
2
|
+
* SHA-pinned action references used by the generated deploy/cleanup workflows, and applied
|
|
3
|
+
* to the workflows AwsCdkTypeScriptApp generates on its own (upgrade.yml, pull-request-lint.yml)
|
|
4
|
+
* via `hardenProjenGeneratedWorkflows` — see `ProjenWorkflowHardening.ts`.
|
|
3
5
|
*
|
|
4
6
|
* zizmor flags unpinned `uses:` references as a high-severity finding
|
|
5
7
|
* (https://docs.zizmor.sh/audits/#unpinned-uses) because a mutable tag can be
|
|
@@ -38,6 +40,34 @@ export interface WorkflowActionVersions {
|
|
|
38
40
|
* @default 'actions/github-script@d746ffe35508b1917358783b479e04febd2b8f71' // v9.0.0
|
|
39
41
|
*/
|
|
40
42
|
readonly githubScript?: string;
|
|
43
|
+
/**
|
|
44
|
+
* The `peter-evans/create-pull-request` action reference, used by projen's built-in
|
|
45
|
+
* dependency-upgrade workflow to open the upgrade PR.
|
|
46
|
+
*
|
|
47
|
+
* @default 'peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1' // v8.1.1
|
|
48
|
+
*/
|
|
49
|
+
readonly createPullRequest?: string;
|
|
50
|
+
/**
|
|
51
|
+
* The `actions/upload-artifact` action reference, used by projen's built-in
|
|
52
|
+
* dependency-upgrade workflow to pass the upgrade patch between jobs.
|
|
53
|
+
*
|
|
54
|
+
* @default 'actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a' // v7
|
|
55
|
+
*/
|
|
56
|
+
readonly uploadArtifact?: string;
|
|
57
|
+
/**
|
|
58
|
+
* The `actions/download-artifact` action reference, used by projen's built-in
|
|
59
|
+
* dependency-upgrade workflow to pass the upgrade patch between jobs.
|
|
60
|
+
*
|
|
61
|
+
* @default 'actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c' // v8
|
|
62
|
+
*/
|
|
63
|
+
readonly downloadArtifact?: string;
|
|
64
|
+
/**
|
|
65
|
+
* The `amannn/action-semantic-pull-request` action reference, used by projen's
|
|
66
|
+
* built-in pull-request-lint workflow to validate PR titles.
|
|
67
|
+
*
|
|
68
|
+
* @default 'amannn/action-semantic-pull-request@48f256284bd46cdaab1048c3721360e808335d50' // v6.1.1
|
|
69
|
+
*/
|
|
70
|
+
readonly semanticPullRequest?: string;
|
|
41
71
|
}
|
|
42
72
|
export declare const DEFAULT_WORKFLOW_ACTION_VERSIONS: Required<WorkflowActionVersions>;
|
|
43
73
|
export declare function resolveActionVersions(overrides?: WorkflowActionVersions): Required<WorkflowActionVersions>;
|
|
@@ -8,6 +8,10 @@ exports.DEFAULT_WORKFLOW_ACTION_VERSIONS = {
|
|
|
8
8
|
configureAwsCredentials: 'aws-actions/configure-aws-credentials@7474bc4690e29a8392af63c5b98e7449536d5c3a', // v4.3.1
|
|
9
9
|
pnpmActionSetup: 'pnpm/action-setup@0977fd99725f1db4007ccb2928dbb4e90d06cc86', // v6.0.10
|
|
10
10
|
githubScript: 'actions/github-script@d746ffe35508b1917358783b479e04febd2b8f71', // v9.0.0
|
|
11
|
+
createPullRequest: 'peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1', // v8.1.1
|
|
12
|
+
uploadArtifact: 'actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a', // v7
|
|
13
|
+
downloadArtifact: 'actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c', // v8
|
|
14
|
+
semanticPullRequest: 'amannn/action-semantic-pull-request@48f256284bd46cdaab1048c3721360e808335d50', // v6.1.1
|
|
11
15
|
};
|
|
12
16
|
function resolveActionVersions(overrides) {
|
|
13
17
|
return {
|
|
@@ -15,4 +19,4 @@ function resolveActionVersions(overrides) {
|
|
|
15
19
|
...overrides,
|
|
16
20
|
};
|
|
17
21
|
}
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV29ya2Zsb3dBY3Rpb25WZXJzaW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9Xb3JrZmxvd0FjdGlvblZlcnNpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTRGQSxzREFLQztBQWpCWSxRQUFBLGdDQUFnQyxHQUFxQztJQUNoRixRQUFRLEVBQUUsMkRBQTJELEVBQUUsU0FBUztJQUNoRixTQUFTLEVBQUUsNkRBQTZELEVBQUUsU0FBUztJQUNuRix1QkFBdUIsRUFBRSxnRkFBZ0YsRUFBRSxTQUFTO0lBQ3BILGVBQWUsRUFBRSw0REFBNEQsRUFBRSxVQUFVO0lBQ3pGLFlBQVksRUFBRSxnRUFBZ0UsRUFBRSxTQUFTO0lBQ3pGLGlCQUFpQixFQUFFLDBFQUEwRSxFQUFFLFNBQVM7SUFDeEcsY0FBYyxFQUFFLGtFQUFrRSxFQUFFLEtBQUs7SUFDekYsZ0JBQWdCLEVBQUUsb0VBQW9FLEVBQUUsS0FBSztJQUM3RixtQkFBbUIsRUFBRSw4RUFBOEUsRUFBRSxTQUFTO0NBQy9HLENBQUM7QUFFRixTQUFnQixxQkFBcUIsQ0FBQyxTQUFrQztJQUN0RSxPQUFPO1FBQ0wsR0FBRyx3Q0FBZ0M7UUFDbkMsR0FBRyxTQUFTO0tBQ2IsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNIQS1waW5uZWQgYWN0aW9uIHJlZmVyZW5jZXMgdXNlZCBieSB0aGUgZ2VuZXJhdGVkIGRlcGxveS9jbGVhbnVwIHdvcmtmbG93cywgYW5kIGFwcGxpZWRcbiAqIHRvIHRoZSB3b3JrZmxvd3MgQXdzQ2RrVHlwZVNjcmlwdEFwcCBnZW5lcmF0ZXMgb24gaXRzIG93biAodXBncmFkZS55bWwsIHB1bGwtcmVxdWVzdC1saW50LnltbClcbiAqIHZpYSBgaGFyZGVuUHJvamVuR2VuZXJhdGVkV29ya2Zsb3dzYCDigJQgc2VlIGBQcm9qZW5Xb3JrZmxvd0hhcmRlbmluZy50c2AuXG4gKlxuICogeml6bW9yIGZsYWdzIHVucGlubmVkIGB1c2VzOmAgcmVmZXJlbmNlcyBhcyBhIGhpZ2gtc2V2ZXJpdHkgZmluZGluZ1xuICogKGh0dHBzOi8vZG9jcy56aXptb3Iuc2gvYXVkaXRzLyN1bnBpbm5lZC11c2VzKSBiZWNhdXNlIGEgbXV0YWJsZSB0YWcgY2FuIGJlXG4gKiByZXBvaW50ZWQgdG8gZGlmZmVyZW50IGNvZGUgYWZ0ZXIgcmV2aWV3LiBFdmVyeSBmaWVsZCBoZXJlIGNhbiBiZVxuICogb3ZlcnJpZGRlbiBieSBjb25zdW1lcnMgd2hvIG5lZWQgYSBkaWZmZXJlbnQgcGlubmVkIFNIQSAoZS5nLiB0byBwaWNrIHVwIGFcbiAqIG5ld2VyIHJlbGVhc2UgYmVmb3JlIHRoaXMgcGFja2FnZSBkb2VzKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0FjdGlvblZlcnNpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBgYWN0aW9ucy9jaGVja291dGAgYWN0aW9uIHJlZmVyZW5jZS5cbiAgICpcbiAgICogQGRlZmF1bHQgJ2FjdGlvbnMvY2hlY2tvdXRAZmJjNmYzOTkyZDI0Yjc5NmQ1YTA0OGZmMjczZjdmY2M0YTdiNmMwOScgLy8gdjUuMS4wXG4gICAqL1xuICByZWFkb25seSBjaGVja291dD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGBhY3Rpb25zL3NldHVwLW5vZGVgIGFjdGlvbiByZWZlcmVuY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdhY3Rpb25zL3NldHVwLW5vZGVAYTA4NTNjMjQ1NDQ2MjdmNjVkZGYyNTlhYmU3M2IxZDE4YTU5MTQ0NCcgLy8gdjUuMC4wXG4gICAqL1xuICByZWFkb25seSBzZXR1cE5vZGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgYXdzLWFjdGlvbnMvY29uZmlndXJlLWF3cy1jcmVkZW50aWFsc2AgYWN0aW9uIHJlZmVyZW5jZS5cbiAgICpcbiAgICogQGRlZmF1bHQgJ2F3cy1hY3Rpb25zL2NvbmZpZ3VyZS1hd3MtY3JlZGVudGlhbHNANzQ3NGJjNDY5MGUyOWE4MzkyYWY2M2M1Yjk4ZTc0NDk1MzZkNWMzYScgLy8gdjQuMy4xXG4gICAqL1xuICByZWFkb25seSBjb25maWd1cmVBd3NDcmVkZW50aWFscz86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGBwbnBtL2FjdGlvbi1zZXR1cGAgYWN0aW9uIHJlZmVyZW5jZSwgdXNlZCB3aGVuIHRoZSBwcm9qZWN0J3MgcGFja2FnZSBtYW5hZ2VyIGlzIHBucG0uXG4gICAqXG4gICAqIEBkZWZhdWx0ICdwbnBtL2FjdGlvbi1zZXR1cEAwOTc3ZmQ5OTcyNWYxZGI0MDA3Y2NiMjkyOGRiYjRlOTBkMDZjYzg2JyAvLyB2Ni4wLjEwXG4gICAqL1xuICByZWFkb25seSBwbnBtQWN0aW9uU2V0dXA/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgYWN0aW9ucy9naXRodWItc2NyaXB0YCBhY3Rpb24gcmVmZXJlbmNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnYWN0aW9ucy9naXRodWItc2NyaXB0QGQ3NDZmZmUzNTUwOGIxOTE3MzU4NzgzYjQ3OWUwNGZlYmQyYjhmNzEnIC8vIHY5LjAuMFxuICAgKi9cbiAgcmVhZG9ubHkgZ2l0aHViU2NyaXB0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYHBldGVyLWV2YW5zL2NyZWF0ZS1wdWxsLXJlcXVlc3RgIGFjdGlvbiByZWZlcmVuY2UsIHVzZWQgYnkgcHJvamVuJ3MgYnVpbHQtaW5cbiAgICogZGVwZW5kZW5jeS11cGdyYWRlIHdvcmtmbG93IHRvIG9wZW4gdGhlIHVwZ3JhZGUgUFIuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdwZXRlci1ldmFucy9jcmVhdGUtcHVsbC1yZXF1ZXN0QDVmNjk3OGZhZjA4OWQ0ZDIwYjAwYzc3NjY5ODlkMDc2YmIyZmM3ZjEnIC8vIHY4LjEuMVxuICAgKi9cbiAgcmVhZG9ubHkgY3JlYXRlUHVsbFJlcXVlc3Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgYWN0aW9ucy91cGxvYWQtYXJ0aWZhY3RgIGFjdGlvbiByZWZlcmVuY2UsIHVzZWQgYnkgcHJvamVuJ3MgYnVpbHQtaW5cbiAgICogZGVwZW5kZW5jeS11cGdyYWRlIHdvcmtmbG93IHRvIHBhc3MgdGhlIHVwZ3JhZGUgcGF0Y2ggYmV0d2VlbiBqb2JzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnYWN0aW9ucy91cGxvYWQtYXJ0aWZhY3RAMDQzZmI0NmQxYTkzYzc3YWFlNjU2ZTdjMWM2NGE4NzVkMWZjNmEwYScgLy8gdjdcbiAgICovXG4gIHJlYWRvbmx5IHVwbG9hZEFydGlmYWN0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYGFjdGlvbnMvZG93bmxvYWQtYXJ0aWZhY3RgIGFjdGlvbiByZWZlcmVuY2UsIHVzZWQgYnkgcHJvamVuJ3MgYnVpbHQtaW5cbiAgICogZGVwZW5kZW5jeS11cGdyYWRlIHdvcmtmbG93IHRvIHBhc3MgdGhlIHVwZ3JhZGUgcGF0Y2ggYmV0d2VlbiBqb2JzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnYWN0aW9ucy9kb3dubG9hZC1hcnRpZmFjdEAzZTVmNDViMmNmYjkxNzIwNTRiNDA4N2E0MGU4ZTBiNWE1NDYxZTdjJyAvLyB2OFxuICAgKi9cbiAgcmVhZG9ubHkgZG93bmxvYWRBcnRpZmFjdD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGBhbWFubm4vYWN0aW9uLXNlbWFudGljLXB1bGwtcmVxdWVzdGAgYWN0aW9uIHJlZmVyZW5jZSwgdXNlZCBieSBwcm9qZW4nc1xuICAgKiBidWlsdC1pbiBwdWxsLXJlcXVlc3QtbGludCB3b3JrZmxvdyB0byB2YWxpZGF0ZSBQUiB0aXRsZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdhbWFubm4vYWN0aW9uLXNlbWFudGljLXB1bGwtcmVxdWVzdEA0OGYyNTYyODRiZDQ2Y2RhYWIxMDQ4YzM3MjEzNjBlODA4MzM1ZDUwJyAvLyB2Ni4xLjFcbiAgICovXG4gIHJlYWRvbmx5IHNlbWFudGljUHVsbFJlcXVlc3Q/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1dPUktGTE9XX0FDVElPTl9WRVJTSU9OUzogUmVxdWlyZWQ8V29ya2Zsb3dBY3Rpb25WZXJzaW9ucz4gPSB7XG4gIGNoZWNrb3V0OiAnYWN0aW9ucy9jaGVja291dEBmYmM2ZjM5OTJkMjRiNzk2ZDVhMDQ4ZmYyNzNmN2ZjYzRhN2I2YzA5JywgLy8gdjUuMS4wXG4gIHNldHVwTm9kZTogJ2FjdGlvbnMvc2V0dXAtbm9kZUBhMDg1M2MyNDU0NDYyN2Y2NWRkZjI1OWFiZTczYjFkMThhNTkxNDQ0JywgLy8gdjUuMC4wXG4gIGNvbmZpZ3VyZUF3c0NyZWRlbnRpYWxzOiAnYXdzLWFjdGlvbnMvY29uZmlndXJlLWF3cy1jcmVkZW50aWFsc0A3NDc0YmM0NjkwZTI5YTgzOTJhZjYzYzViOThlNzQ0OTUzNmQ1YzNhJywgLy8gdjQuMy4xXG4gIHBucG1BY3Rpb25TZXR1cDogJ3BucG0vYWN0aW9uLXNldHVwQDA5NzdmZDk5NzI1ZjFkYjQwMDdjY2IyOTI4ZGJiNGU5MGQwNmNjODYnLCAvLyB2Ni4wLjEwXG4gIGdpdGh1YlNjcmlwdDogJ2FjdGlvbnMvZ2l0aHViLXNjcmlwdEBkNzQ2ZmZlMzU1MDhiMTkxNzM1ODc4M2I0NzllMDRmZWJkMmI4ZjcxJywgLy8gdjkuMC4wXG4gIGNyZWF0ZVB1bGxSZXF1ZXN0OiAncGV0ZXItZXZhbnMvY3JlYXRlLXB1bGwtcmVxdWVzdEA1ZjY5NzhmYWYwODlkNGQyMGIwMGM3NzY2OTg5ZDA3NmJiMmZjN2YxJywgLy8gdjguMS4xXG4gIHVwbG9hZEFydGlmYWN0OiAnYWN0aW9ucy91cGxvYWQtYXJ0aWZhY3RAMDQzZmI0NmQxYTkzYzc3YWFlNjU2ZTdjMWM2NGE4NzVkMWZjNmEwYScsIC8vIHY3XG4gIGRvd25sb2FkQXJ0aWZhY3Q6ICdhY3Rpb25zL2Rvd25sb2FkLWFydGlmYWN0QDNlNWY0NWIyY2ZiOTE3MjA1NGI0MDg3YTQwZThlMGI1YTU0NjFlN2MnLCAvLyB2OFxuICBzZW1hbnRpY1B1bGxSZXF1ZXN0OiAnYW1hbm5uL2FjdGlvbi1zZW1hbnRpYy1wdWxsLXJlcXVlc3RANDhmMjU2Mjg0YmQ0NmNkYWFiMTA0OGMzNzIxMzYwZTgwODMzNWQ1MCcsIC8vIHY2LjEuMVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVBY3Rpb25WZXJzaW9ucyhvdmVycmlkZXM/OiBXb3JrZmxvd0FjdGlvblZlcnNpb25zKTogUmVxdWlyZWQ8V29ya2Zsb3dBY3Rpb25WZXJzaW9ucz4ge1xuICByZXR1cm4ge1xuICAgIC4uLkRFRkFVTFRfV09SS0ZMT1dfQUNUSU9OX1ZFUlNJT05TLFxuICAgIC4uLm92ZXJyaWRlcyxcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -39,7 +39,7 @@ const fs = __importStar(require("fs"));
|
|
|
39
39
|
const path = __importStar(require("path"));
|
|
40
40
|
const projen_1 = require("projen");
|
|
41
41
|
class WorkflowAutoDiscover extends projen_1.Component {
|
|
42
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.WorkflowAutoDiscover", version: "1.
|
|
42
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.WorkflowAutoDiscover", version: "1.18.0" };
|
|
43
43
|
constructor(project) {
|
|
44
44
|
super(project);
|
|
45
45
|
}
|
package/lib/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export * from './BatmanProject';
|
|
2
2
|
export { BootcampProject, BootcampProjectOptions } from './BootcampProject';
|
|
3
3
|
export * from './CodeOwnersFile';
|
|
4
|
+
export * from './SoftwareFactoryFiles';
|
|
4
5
|
export { EnvironmentConfig } from './MainFile';
|
|
5
6
|
export { ApplicationEnvironmentConfig } from './Application';
|
|
6
7
|
export * from './StagingDeployWorkflow';
|
package/lib/index.js
CHANGED
|
@@ -19,8 +19,9 @@ __exportStar(require("./BatmanProject"), exports);
|
|
|
19
19
|
var BootcampProject_1 = require("./BootcampProject");
|
|
20
20
|
Object.defineProperty(exports, "BootcampProject", { enumerable: true, get: function () { return BootcampProject_1.BootcampProject; } });
|
|
21
21
|
__exportStar(require("./CodeOwnersFile"), exports);
|
|
22
|
+
__exportStar(require("./SoftwareFactoryFiles"), exports);
|
|
22
23
|
__exportStar(require("./StagingDeployWorkflow"), exports);
|
|
23
24
|
__exportStar(require("./ProductionDeployWorkflow"), exports);
|
|
24
25
|
__exportStar(require("./WorkflowActionVersions"), exports);
|
|
25
26
|
__exportStar(require("./WorkflowAutoDiscover"), exports);
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrREFBZ0M7QUFDaEMscURBQTRFO0FBQW5FLGtIQUFBLGVBQWUsT0FBQTtBQUN4QixtREFBaUM7QUFDakMseURBQXVDO0FBR3ZDLDBEQUF3QztBQUN4Qyw2REFBMkM7QUFDM0MsMkRBQXlDO0FBQ3pDLHlEQUF1QyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vQmF0bWFuUHJvamVjdCc7XG5leHBvcnQgeyBCb290Y2FtcFByb2plY3QsIEJvb3RjYW1wUHJvamVjdE9wdGlvbnMgfSBmcm9tICcuL0Jvb3RjYW1wUHJvamVjdCc7XG5leHBvcnQgKiBmcm9tICcuL0NvZGVPd25lcnNGaWxlJztcbmV4cG9ydCAqIGZyb20gJy4vU29mdHdhcmVGYWN0b3J5RmlsZXMnO1xuZXhwb3J0IHsgRW52aXJvbm1lbnRDb25maWcgfSBmcm9tICcuL01haW5GaWxlJztcbmV4cG9ydCB7IEFwcGxpY2F0aW9uRW52aXJvbm1lbnRDb25maWcgfSBmcm9tICcuL0FwcGxpY2F0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vU3RhZ2luZ0RlcGxveVdvcmtmbG93JztcbmV4cG9ydCAqIGZyb20gJy4vUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93JztcbmV4cG9ydCAqIGZyb20gJy4vV29ya2Zsb3dBY3Rpb25WZXJzaW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL1dvcmtmbG93QXV0b0Rpc2NvdmVyJztcbiJdfQ==
|
package/lib/utils.js
CHANGED
|
@@ -139,9 +139,37 @@ function readmeContents(projectName) {
|
|
|
139
139
|
'| `web/src/services/BaseService.ts` | Base authenticated fetch hook |',
|
|
140
140
|
'| `.github/CODEOWNERS` | Code ownership policy |',
|
|
141
141
|
'| `.github/workflows/*.yml` | All CI/CD workflows |',
|
|
142
|
+
'| `architecture-rules/check.ts`, `tsconfig.json`, `README.md` | Architecture rule engine |',
|
|
143
|
+
'| `attestation/manifest.ts`, `verify.ts`, `tsconfig.json` | PR attestation mechanism |',
|
|
144
|
+
'| `openspec-gates/check-tasks-complete.ts`, `tsconfig.json` | OpenSpec task-completion gate |',
|
|
145
|
+
'| `workflows/workflow-*.yaml` | Swamp workflows the software factory runs |',
|
|
142
146
|
'',
|
|
143
147
|
'> **Tip:** Files with a `~~ Generated by projen. To modify, edit .projenrc.ts and run "npx projen". ~~` header are managed files.',
|
|
144
148
|
'',
|
|
149
|
+
'### Software Factory (`models/`, `architecture-rules/rules.json`)',
|
|
150
|
+
'',
|
|
151
|
+
'Batman also seeds a [swamp](https://github.com/swamp-club/swamp) software',
|
|
152
|
+
'factory — a `@swamp/software-factory` state machine that drives a GitHub',
|
|
153
|
+
'issue through intake, OpenSpec planning, implementation, pre-PR',
|
|
154
|
+
'verification, and an opened PR. The seed files under `models/**/*.yaml` and',
|
|
155
|
+
'`architecture-rules/rules.json` are generated once (like the files in',
|
|
156
|
+
'"Files You Can Edit" above) — tune the factory\'s stages/gates or add your',
|
|
157
|
+
'own architecture rules directly in those files.',
|
|
158
|
+
'',
|
|
159
|
+
'`swamp init` runs automatically as part of `install`/`install:ci` (a silent',
|
|
160
|
+
'no-op if `swamp` isn\'t on PATH, e.g. in CI), so the repo stays initialized',
|
|
161
|
+
'without a separate step. One-time setup beyond that, after your first',
|
|
162
|
+
'`npx projen`:',
|
|
163
|
+
'',
|
|
164
|
+
'```bash',
|
|
165
|
+
'# Pulls the software-factory/github extensions and creates the repo\'s',
|
|
166
|
+
'# secrets vault',
|
|
167
|
+
'npx projen swamp:bootstrap',
|
|
168
|
+
'',
|
|
169
|
+
'# Then store a GitHub token the factory can open PRs with',
|
|
170
|
+
'swamp vault put <repo>-secrets GITHUB_TOKEN --refresh-from "gh auth token"',
|
|
171
|
+
'```',
|
|
172
|
+
'',
|
|
145
173
|
'---',
|
|
146
174
|
'',
|
|
147
175
|
'## Where to Start',
|
|
@@ -186,4 +214,4 @@ function readmeContents(projectName) {
|
|
|
186
214
|
'This updates all managed files to the latest Batman standards. Your editable sample files are never touched.',
|
|
187
215
|
].join('\n');
|
|
188
216
|
}
|
|
189
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFLQSw0Q0FZQztBQU1ELHdDQVdDO0FBRUQsa0NBZ0JDO0FBRUQsd0NBaUlDO0FBdkxELHNEQUEyRDtBQUUzRDs7R0FFRztBQUNILFNBQWdCLGdCQUFnQixDQUFDLGNBQWtDLEVBQUUsTUFBYztJQUNqRixRQUFRLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssK0JBQWtCLENBQUMsR0FBRztZQUN6QixPQUFPLFdBQVcsTUFBTSxFQUFFLENBQUM7UUFDN0IsS0FBSywrQkFBa0IsQ0FBQyxHQUFHO1lBQ3pCLE9BQU8sV0FBVyxNQUFNLEVBQUUsQ0FBQztRQUM3QixLQUFLLCtCQUFrQixDQUFDLElBQUk7WUFDMUIsT0FBTyxRQUFRLE1BQU0sRUFBRSxDQUFDO1FBQzFCO1lBQ0Usb0ZBQW9GO1lBQ3BGLE9BQU8sUUFBUSxNQUFNLEVBQUUsQ0FBQztJQUM1QixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxjQUFrQztJQUMvRCxRQUFRLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssK0JBQWtCLENBQUMsR0FBRztZQUN6QixPQUFPLFFBQVEsQ0FBQztRQUNsQixLQUFLLCtCQUFrQixDQUFDLEdBQUc7WUFDekIsT0FBTywrQkFBK0IsQ0FBQztRQUN6QyxLQUFLLCtCQUFrQixDQUFDLElBQUk7WUFDMUIsT0FBTyxnQ0FBZ0MsQ0FBQztRQUMxQztZQUNFLE9BQU8sZ0NBQWdDLENBQUM7SUFDNUMsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFnQixXQUFXLENBQUMsS0FBVSxFQUFFLEtBQUssR0FBRyxDQUFDO0lBQy9DLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdB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RyxzREFBc0Q7UUFDdEQsZ0ZBQWdGO1FBQ2hGLHVFQUF1RTtRQUN2RSxrREFBa0Q7UUFDbEQscURBQXFEO1FBQ3JELEVBQUU7UUFDRixtSUFBbUk7UUFDbkksRUFBRTtRQUNGLEtBQUs7UUFDTCxFQUFFO1FBQ0YsbUJBQW1CO1FBQ25CLEVBQUU7UUFDRixnTUFBZ007UUFDaE0sRUFBRTtRQUNGLGlJQUFpSTtRQUNqSSxFQUFFO1FBQ0YsNEZBQTRGO1FBQzVGLEVBQUU7UUFDRixpSUFBaUk7UUFDakksS0FBSztRQUNMLEVBQUU7UUFDRix5QkFBeUI7UUFDekIsRUFBRTtRQUNGLFNBQVM7UUFDVCx3QkFBd0I7UUFDeEIsY0FBYztRQUNkLEVBQUU7UUFDRix1RUFBdUU7UUFDdkUsVUFBVTtRQUNWLEVBQUU7UUFDRix3SEFBd0g7UUFDeEgsNERBQTREO1FBQzVELEVBQUU7UUFDRixhQUFhO1FBQ2IsV0FBVztRQUNYLEVBQUU7UUFDRiwwREFBMEQ7UUFDMUQsWUFBWTtRQUNaLEtBQUs7UUFDTCxFQUFFO1FBQ0YsS0FBSztRQUNMLEVBQUU7UUFDRixxQkFBcUI7UUFDckIsRUFBRTtRQUNGLFNBQVM7UUFDVCw4Q0FBOEM7UUFDOUMsWUFBWTtRQUNaLEtBQUs7UUFDTCxFQUFFO1FBQ0YsOEdBQThHO0tBQy9HLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5vZGVQYWNrYWdlTWFuYWdlciB9IGZyb20gJ3Byb2plbi9saWIvamF2YXNjcmlwdCc7XG5cbi8qKlxuICogUmVuZGVycyB0aGUgY29tbWFuZCB1c2VkIHRvIHJ1biBhIHBhY2thZ2UuanNvbiBzY3JpcHQgZm9yIHRoZSBnaXZlbiBwYWNrYWdlIG1hbmFnZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5TY3JpcHRDb21tYW5kKHBhY2thZ2VNYW5hZ2VyOiBOb2RlUGFja2FnZU1hbmFnZXIsIHNjcmlwdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgc3dpdGNoIChwYWNrYWdlTWFuYWdlcikge1xuICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLk5QTTpcbiAgICAgIHJldHVybiBgbnBtIHJ1biAke3NjcmlwdH1gO1xuICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLkJVTjpcbiAgICAgIHJldHVybiBgYnVuIHJ1biAke3NjcmlwdH1gO1xuICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLlBOUE06XG4gICAgICByZXR1cm4gYHBucG0gJHtzY3JpcHR9YDtcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gYWxsIHlhcm4gdmFyaWFudHMgKHlhcm4sIHlhcm4yLCB5YXJuX2NsYXNzaWMsIHlhcm5fYmVycnkpIHNoYXJlIHRoZSBgeWFybmAgYmluYXJ5XG4gICAgICByZXR1cm4gYHlhcm4gJHtzY3JpcHR9YDtcbiAgfVxufVxuXG4vKipcbiAqIFJlbmRlcnMgdGhlIGNvbW1hbmQgdXNlZCB0byBkbyBhIGNsZWFuLCByZXByb2R1Y2libGUgZGVwZW5kZW5jeSBpbnN0YWxsIChlLmcuIGZvciBDSSlcbiAqIGZvciB0aGUgZ2l2ZW4gcGFja2FnZSBtYW5hZ2VyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zdGFsbENvbW1hbmQocGFja2FnZU1hbmFnZXI6IE5vZGVQYWNrYWdlTWFuYWdlcik6IHN0cmluZyB7XG4gIHN3aXRjaCAocGFja2FnZU1hbmFnZXIpIHtcbiAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5OUE06XG4gICAgICByZXR1cm4gJ25wbSBjaSc7XG4gICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuQlVOOlxuICAgICAgcmV0dXJuICdidW4gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZSc7XG4gICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuUE5QTTpcbiAgICAgIHJldHVybiAncG5wbSBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlJztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICd5YXJuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGUnO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVUcyh2YWx1ZTogYW55LCBkZXB0aCA9IDEpOiBzdHJpbmcge1xuICBjb25zdCBwYWQgPSAnICAnLnJlcGVhdChkZXB0aCk7XG4gIGNvbnN0IGlubmVyUGFkID0gJyAgJy5yZXBlYXQoZGVwdGggKyAxKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiBgJyR7dmFsdWV9J2A7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgY29uc3QgaXRlbXMgPSB2YWx1ZS5tYXAodiA9PiBgJHtpbm5lclBhZH0ke3NlcmlhbGl6ZVRzKHYsIGRlcHRoICsgMSl9YCkuam9pbignLFxcbicpO1xuICAgIHJldHVybiBgW1xcbiR7aXRlbXN9LFxcbiR7cGFkfV1gO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHZhbHVlKVxuICAgICAgLm1hcCgoW2ssIHZdKSA9PiBgJHtpbm5lclBhZH0ke2t9OiAke3NlcmlhbGl6ZVRzKHYsIGRlcHRoICsgMSl9YClcbiAgICAgIC5qb2luKCcsXFxuJyk7XG4gICAgcmV0dXJuIGB7XFxuJHtlbnRyaWVzfSxcXG4ke3BhZH19YDtcbiAgfVxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZG1lQ29udGVudHMocHJvamVjdE5hbWU6IHN0cmluZykge1xuICByZXR1cm4gW1xuICAgIGAjICR7cHJvamVjdE5hbWV9YCxcbiAgICAnJyxcbiAgICAnVGhpcyBwcm9qZWN0IHdhcyBib290c3RyYXBwZWQgd2l0aCBbQmF0bWFuXShodHRwczovL2dpdGh1Yi5jb20vbWFjZWRvbi10ZWNobm9sb2dpZXMvcGxhdGZvcm0tY29tbW9uKS4nLFxuICAgICcnLFxuICAgICcjIyBXaGF0IEJhdG1hbiBDcmVhdGVkJyxcbiAgICAnJyxcbiAgICAnIyMjIENESyBJbmZyYXN0cnVjdHVyZSAoYHNyYy9gKScsXG4gICAgJycsXG4gICAgJ3wgRmlsZSB8IERlc2NyaXB0aW9uIHwnLFxuICAgICd8LS0tLS0tfC0tLS0tLS0tLS0tLS18JyxcbiAgICAnfCBgc3JjL21haW4udHNgIHwgQ0RLIGFwcCBlbnRyeSBwb2ludCDigJQgaW5zdGFudGlhdGVzIGRldiwgc3RhZ2luZywgYW5kIHByb2QgYEFwcGxpY2F0aW9uU3RhY2tgcyB8JyxcbiAgICAnfCBgc3JjL0xvY2FsRGV2QXBwLnRzYCB8IExvY2FsIGRldmVsb3BtZW50IENESyBhcHAg4oCUIHVzZWQgYnkgYHlhcm4gY2RrOmRldmAgLSBkZXBsb3lzIHRvIEFXUyBmb3Igc2xvd2VyIGJ1dCBtb3JlIHRob3JvdWdoIHRlc3RpbmcgfCcsXG4gICAgJ3wgYHNyYy9HaXRIdWJSb2xlcy50c2AgfCBDREsgYXBwIGZvciBkZXBsb3lpbmcgdGhlIEdpdEh1YiBPSURDIElBTSByb2xlIChvbmUtdGltZSBib290c3RyYXApIHwnLFxuICAgICd8IGBzcmMvc3RhY2tzL0FwcGxpY2F0aW9uU3RhY2sudHNgIHwgWW91ciBwcmltYXJ5IHN0YWNrIOKAlCBleHRlbmQgaXQgdG8gYWRkIHJlc291cmNlcyB8JyxcbiAgICAnfCBgc3JjL3N0YWNrcy9CYXNlQXBwbGljYXRpb25TdGFjay50c2AgfCBCYXNlIHN0YWNrIHdpdGggVlBDLCBBUEksIHN0YXRpYyB3ZWJzaXRlLCBEYXRhZG9nLCBhbmQgUm91dGUgNTMgd2lyZWQgdXAgfCcsXG4gICAgJ3wgYHNyYy9zdGFja3MvR2l0SHViUm9sZXNTdGFjay50c2AgfCBJQU0gcm9sZSBzdGFjayBmb3IgR2l0SHViIEFjdGlvbnMgT0lEQyBhdXRoZW50aWNhdGlvbiB8JyxcbiAgICAnfCBgc3JjL2NvbnN0cnVjdHMvQXBpLnRzYCB8IEFQSSBHYXRld2F5ICsgTGFtYmRhIGNvbnN0cnVjdCB3aXRoIENsZXJrIEpXVCBhdXRob3JpemVyIHwnLFxuICAgICd8IGBzcmMvY29uc3RydWN0cy9TdGF0aWNXZWJzaXRlLnRzYCB8IENsb3VkRnJvbnQgKyBTMyArIEFDTSArIFJvdXRlIDUzIGNvbnN0cnVjdCB8JyxcbiAgICAnfCBgc3JjL2NvbnN0cnVjdHMvaGFuZGxlci9BcGkuRnVuY3Rpb24udHNgIHwgTGFtYmRhIGhhbmRsZXIgZW50cnkgcG9pbnQsIGJhc2ljIHdyYXBwZXIgYXJvdW5kIEV4cHJlc3MtY29tcGF0aWJsZSBhcHAgY29kZSB8JyxcbiAgICAnfCBgc3JjL2FzcGVjdHMvRGF0YURvZ0FzcGVjdC50c2AgfCBDREsgYXNwZWN0IHRoYXQgd2lyZXMgYWxsIExhbWJkYSBmdW5jdGlvbnMgdG8gRGF0YWRvZyB8JyxcbiAgICAnJyxcbiAgICAnIyMjIEZyb250ZW5kIChgd2ViL2ApJyxcbiAgICAnJyxcbiAgICAnfCBGaWxlIHwgRGVzY3JpcHRpb24gfCcsXG4gICAgJ3wtLS0tLS18LS0tLS0tLS0tLS0tLXwnLFxuICAgICd8IGB3ZWIvc3JjL21haW4udHN4YCB8IFJlYWN0IGFwcCBlbnRyeSBwb2ludCB3aXRoIENsZXJrIGFuZCBSZWFjdCBRdWVyeSBwcm92aWRlcnMgfCcsXG4gICAgJ3wgYHdlYi9zcmMvQXBwLnRzeGAgfCBSb290IGFwcGxpY2F0aW9uIGNvbXBvbmVudCB8JyxcbiAgICAnfCBgd2ViL3NyYy9BcHAuY3NzYCAvIGB3ZWIvc3JjL2luZGV4LmNzc2AgfCBCYXNlIHN0eWxlc2hlZXRzIChUYWlsd2luZCBDU1MgdjQpIHwnLFxuICAgICd8IGB3ZWIvc3JjL2NvbmZpZy50c2AgfCBgdXNlQ29uZmlnKClgIGhvb2sg4oCUIGxvYWRzIHJ1bnRpbWUgY29uZmlnIGZyb20gYGNvbmZpZy5qc29uYCB8JyxcbiAgICAnfCBgd2ViL3NyYy9zZXJ2aWNlcy9CYXNlU2VydmljZS50c2AgfCBgdXNlQmFzZVF1ZXJ5KClgIOKAlCBhdXRoZW50aWNhdGVkIEFQSSBmZXRjaCBob29rIHwnLFxuICAgICd8IGB3ZWIvc3JjL3NlcnZpY2VzL1Jvb3RTZXJ2aWNlLnRzYCB8IEV4YW1wbGUgc2VydmljZSB1c2luZyBgdXNlQmFzZVF1ZXJ5YCB8JyxcbiAgICAnfCBgd2ViL3B1YmxpYy9jb25maWcuanNvbmAgfCBSdW50aW1lIGNvbmZpZyAoQVBJIGJhc2UgVVJMLCBDbGVyayBwdWJsaXNoYWJsZSBrZXkpIHwnLFxuICAgICcnLFxuICAgICcjIyMgR2l0SHViIEFjdGlvbnMgV29ya2Zsb3dzIChgLmdpdGh1Yi93b3JrZmxvd3MvYCknLFxuICAgICcnLFxuICAgICd8IEZpbGUgfCBUcmlnZ2VyIHwnLFxuICAgICd8LS0tLS0tfC0tLS0tLS0tLXwnLFxuICAgICd8IGBwci1kZXBsb3kueW1sYCB8IE9uIHB1bGwgcmVxdWVzdCBvcGVuL3VwZGF0ZSDigJQgZGVwbG95cyBhIHBlci1QUiBkZXYgc3RhY2sgfCcsXG4gICAgJ3wgYHByLWNsZWFudXAueW1sYCB8IE9uIHB1bGwgcmVxdWVzdCBjbG9zZSDigJQgdGVhcnMgZG93biB0aGUgcGVyLVBSIGRldiBzdGFjayB8JyxcbiAgICAnfCBgc3RhZ2luZy1kZXBsb3kueW1sYCB8IE9uIHB1c2ggdG8gYG1haW5gIOKAlCBkZXBsb3lzIHRvIHN0YWdpbmcgfCcsXG4gICAgJ3wgYHByb2R1Y3Rpb24tZGVwbG95LnltbGAgfCBNYW51YWxseSB0cmlnZ2VyZWQg4oCUIGRlcGxveXMgdG8gcHJvZHVjdGlvbiB8JyxcbiAgICAnJyxcbiAgICAnLS0tJyxcbiAgICAnJyxcbiAgICAnIyMgRmlsZXMgWW91IENhbiBFZGl0JyxcbiAgICAnJyxcbiAgICAnVGhlc2UgZmlsZXMgYXJlIGdlbmVyYXRlZCBvbmNlIGFuZCBuZXZlciBvdmVyd3JpdHRlbiBieSBCYXRtYW4uIE1vZGlmeSB0aGVtIGZyZWVseS4nLFxuICAgICcnLFxuICAgICd8IEZpbGUgfCBXaGF0IHRvIGRvIHdpdGggaXQgfCcsXG4gICAgJ3wtLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18JyxcbiAgICAnfCBgLnByb2plbnJjLnRzIHwgVGhlIG1haW4gUHJvamVuIGNvbmZpZ3VyYXRpb24gZmlsZS4gQWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgZm9yIGVpdGhlciB0aGUgQVBJIG9yIHRoZSBXZWIgZnJvbnRlbmQgbmVlZCB0byBiZSBhZGRlZCBoZXJlIHwnLFxuICAgICd8IGBzcmMvc3RhY2tzL0FwcGxpY2F0aW9uU3RhY2sudHNgIHwgKipTdGFydCBoZXJlLioqIEFkZCBDREsgY29uc3RydWN0cyB0byBidWlsZCB5b3VyIGluZnJhc3RydWN0dXJlIHwnLFxuICAgICd8IGBzcmMvY29uc3RydWN0cy9oYW5kbGVyL2FwcC50cyB8IFRoZSBtYWluIG1vbm9saXRoaWMgQVBJIFJFU1Qgc2VydmVyIGZpbGUuIE1haW4gZmlsZSB5b3Ugc2hvdWxkIGJlIG1vZGlmeWluZyB8JyxcbiAgICAnfCBgd2ViL3NyYy9BcHAudHN4YCB8IEJ1aWxkIHlvdXIgVUkgaGVyZSB8JyxcbiAgICAnfCBgd2ViL3NyYy9BcHAuY3NzYCAvIGB3ZWIvc3JjL2luZGV4LmNzc2AgfCBTdHlsZSB5b3VyIGFwcGxpY2F0aW9uIHwnLFxuICAgICd8IGB3ZWIvc3JjL21haW4udHN4YCB8IEFkanVzdCB0b3AtbGV2ZWwgcHJvdmlkZXJzIG9yIHJvdXRpbmcgfCcsXG4gICAgJ3wgYHdlYi9zcmMvc2VydmljZXMvUm9vdFNlcnZpY2UudHNgIHwgQWRkIG9yIHJlcGxhY2UgQVBJIHNlcnZpY2UgaG9va3MgfCcsXG4gICAgJ3wgYHdlYi9wdWJsaWMvY29uZmlnLmpzb25gIHwgVXBkYXRlIGZvciBsb2NhbCBkZXZlbG9wbWVudCAoQVBJIFVSTCwgQ2xlcmsga2V5KSB8JyxcbiAgICAnJyxcbiAgICAnIyMgRmlsZXMgWW91IENhbm5vdCBFZGl0JyxcbiAgICAnJyxcbiAgICAnVGhlc2UgZmlsZXMgYXJlICoqbWFuYWdlZCBieSBCYXRtYW4qKiBhbmQgd2lsbCBiZSBvdmVyd3JpdHRlbiBldmVyeSB0aW1lIGBucHggcHJvamVuYCBydW5zLiBEbyBub3QgZWRpdCB0aGVtIGRpcmVjdGx5IOKAlCBtYWtlIGNoYW5nZXMgaW4gYC5wcm9qZW5yYy50c2AgaW5zdGVhZC4nLFxuICAgICcnLFxuICAgICc+IFshSU1QT1JUQU5UXScsXG4gICAgJz4gSWYgeW91IGhhdmUgQU5ZIGNoYW5nZXMgeW91IHdhbnQgdG8gbWFrZSB0byB0aGVzZSBmaWxlcywgbm90aWZ5ICN0ZWFtLWJhdG1hbiBvbiBTbGFjay4gJyxcbiAgICAnPiBXZSBtYWludGFpbiB0aGVzZSBmaWxlcyBhcyBwYXJ0IG9mIHRoZSBjb3JlIEJhdG1hbiBleHBlcmllbmNlLCBhbmQgeW91ciBmZWVkYmFjayBpcyBjcnVjaWFsIHRvIGVuc3VyZSB0aGV5IG1lZXQgeW91ciBuZWVkcy4nLFxuICAgICcnLFxuICAgICd8IEZpbGUgfCBXaHkgaXRcXCdzIG1hbmFnZWQgfCcsXG4gICAgJ3wtLS0tLS18LS0tLS0tLS0tLS0tLS0tLS18JyxcbiAgICAnfCBgc3JjL3N0YWNrcy9CYXNlQXBwbGljYXRpb25TdGFjay50c2AgfCBDb3JlIHN0YWNrIHdpcmluZyDigJQgdXBkYXRlZCB3aXRoIEJhdG1hbiByZWxlYXNlcyB8JyxcbiAgICAnfCBgc3JjL2FzcGVjdHMvRGF0YURvZ0FzcGVjdC50c2AgfCBEYXRhZG9nIENESyBhc3BlY3QgfCcsXG4gICAgJ3wgYHdlYi92aXRlLmNvbmZpZy50c2AgfCBWaXRlIGNvbmZpZ3VyYXRpb24gfCcsXG4gICAgJ3wgYHdlYi9lc2xpbnQuY29uZmlnLmpzYCB8IEVTTGludCBjb25maWd1cmF0aW9uIHwnLFxuICAgICd8IGB3ZWIvcG9zdGNzcy5jb25maWcuanNgIHwgUG9zdENTUyAvIFRhaWx3aW5kIGNvbmZpZ3VyYXRpb24gfCcsXG4gICAgJ3wgYHdlYi9pbmRleC5odG1sYCB8IEhUTUwgZW50cnkgcG9pbnQgfCcsXG4gICAgJ3wgYHdlYi90c2NvbmZpZy5qc29uYCAvIGB3ZWIvdHNjb25maWcuYXBwLmpzb25gIC8gYHdlYi90c2NvbmZpZy5ub2RlLmpzb25gIHwgVHlwZVNjcmlwdCBjb25maWd1cmF0aW9uIHwnLFxuICAgICd8IGB3ZWIvc3JjL3ZpdGUtZW52LmQudHNgIHwgVml0ZSB0eXBlIGRlY2xhcmF0aW9ucyB8JyxcbiAgICAnfCBgd2ViL3NyYy9jb25maWcudHNgIHwgUnVudGltZSBjb25maWcgaG9vayDigJQgc2hhcGUgZHJpdmVuIGJ5IGAucHJvamVucmMudHNgIHwnLFxuICAgICd8IGB3ZWIvc3JjL3NlcnZpY2VzL0Jhc2VTZXJ2aWNlLnRzYCB8IEJhc2UgYXV0aGVudGljYXRlZCBmZXRjaCBob29rIHwnLFxuICAgICd8IGAuZ2l0aHViL0NPREVPV05FUlNgIHwgQ29kZSBvd25lcnNoaXAgcG9saWN5IHwnLFxuICAgICd8IGAuZ2l0aHViL3dvcmtmbG93cy8qLnltbGAgfCBBbGwgQ0kvQ0Qgd29ya2Zsb3dzIHwnLFxuICAgICcnLFxuICAgICc+ICoqVGlwOioqIEZpbGVzIHdpdGggYSBgfn4gR2VuZXJhdGVkIGJ5IHByb2plbi4gVG8gbW9kaWZ5LCBlZGl0IC5wcm9qZW5yYy50cyBhbmQgcnVuIFwibnB4IHByb2plblwiLiB+fmAgaGVhZGVyIGFyZSBtYW5hZ2VkIGZpbGVzLicsXG4gICAgJycsXG4gICAgJy0tLScsXG4gICAgJycsXG4gICAgJyMjIFdoZXJlIHRvIFN0YXJ0JyxcbiAgICAnJyxcbiAgICAnMS4gKipgc3JjL3N0YWNrcy9BcHBsaWNhdGlvblN0YWNrLnRzYCoqIOKAlCBBZGQgeW91ciBDREsgY29uc3RydWN0cyBoZXJlLiBUaGUgYmFzZSBzdGFjayBhbHJlYWR5IHByb3ZpZGVzIGB0aGlzLmFwaWAsIGB0aGlzLnZwY2AsIGB0aGlzLmhvc3RlZFpvbmVgLCBhbmQgYHRoaXMuZGF0YWRvZ2AgYXMgcHJvdGVjdGVkIHByb3BlcnRpZXMuJyxcbiAgICAnJyxcbiAgICAnMi4gKipgd2ViL2AqKiDigJQgQnVpbGQgeW91ciBmcm9udGVuZC4gU3RhcnQgd2l0aCBgd2ViL3NyYy9BcHAudHN4YCBhbmQgYWRkIHNlcnZpY2VzIGFsb25nc2lkZSBgd2ViL3NyYy9zZXJ2aWNlcy9Sb290U2VydmljZS50c2AuJyxcbiAgICAnJyxcbiAgICAnMy4gKipgc3JjL2NvbnN0cnVjdHMvaGFuZGxlci9hcHAudHNgKiog4oCUIEltcGxlbWVudCB5b3VyIGJhY2tlbmQgTGFtYmRhIGhhbmRsZXIgbG9naWMgaGVyZS4nLFxuICAgICcnLFxuICAgICc0LiAqKmAucHJvamVucmMudHNgKiogLSBNYW5hZ2VzIHByb2plY3QgZGVwZW5kZW5jaWVzIGFuZCBjb25maWd1cmF0aW9uLiBSdW4gYG5weCBwcm9qZW5gIGFmdGVyIG1ha2luZyBhbnkgY2hhbmdlcyB0byB0aGlzIGZpbGUuJyxcbiAgICAnLS0tJyxcbiAgICAnJyxcbiAgICAnIyMgRGV2ZWxvcG1lbnQgV29ya2Zsb3cnLFxuICAgICcnLFxuICAgICdgYGBiYXNoJyxcbiAgICAnIyBJbnN0YWxsIGRlcGVuZGVuY2llcycsXG4gICAgJ3lhcm4gaW5zdGFsbCcsXG4gICAgJycsXG4gICAgJyMgU3RhcnQgbG9jYWwgZGV2IHNlcnZlciAoYmFja2VuZCBMYW1iZGEgKyBWaXRlIGZyb250ZW5kIGluIHBhcmFsbGVsKScsXG4gICAgJ3lhcm4gZGV2JyxcbiAgICAnJyxcbiAgICAnIyBEZXBsb3kgYSBwZXJzb25hbCBkZXYgc3RhY2sgdG8gQVdTIGFzIGFuIGFsdGVybmF0aXZlIHRvIGxvY2FsIGRldmVsb3BtZW50LCBwcm92aWRlcyBtb3JlIHRob3JvdWdoIGVuZC10by1lbmQgdGVzdGluZycsXG4gICAgJ3lhcm4gY2RrOmRldiAtLWNvbnRleHQgbG9jYWwtZGV2LXByZWZpeD15b3VyLWhhbmRsZSBkZXBsb3knLFxuICAgICcnLFxuICAgICcjIFJ1biB0ZXN0cycsXG4gICAgJ3lhcm4gdGVzdCcsXG4gICAgJycsXG4gICAgJyMgUmUtc3ludGhlc2l6ZSBwcm9qZWN0IGZpbGVzIGFmdGVyIGVkaXRpbmcgLnByb2plbnJjLnRzJyxcbiAgICAnbnB4IHByb2plbicsXG4gICAgJ2BgYCcsXG4gICAgJycsXG4gICAgJy0tLScsXG4gICAgJycsXG4gICAgJyMjIFVwZ3JhZGluZyBCYXRtYW4nLFxuICAgICcnLFxuICAgICdgYGBiYXNoJyxcbiAgICAneWFybiBhZGQgQG1hY2Vkb24tdGVjaG5vbG9naWVzL2JhdG1hbkBsYXRlc3QnLFxuICAgICducHggcHJvamVuJyxcbiAgICAnYGBgJyxcbiAgICAnJyxcbiAgICAnVGhpcyB1cGRhdGVzIGFsbCBtYW5hZ2VkIGZpbGVzIHRvIHRoZSBsYXRlc3QgQmF0bWFuIHN0YW5kYXJkcy4gWW91ciBlZGl0YWJsZSBzYW1wbGUgZmlsZXMgYXJlIG5ldmVyIHRvdWNoZWQuJyxcbiAgXS5qb2luKCdcXG4nKTtcbn1cbiJdfQ==
|
|
217
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFLQSw0Q0FZQztBQU1ELHdDQVdDO0FBRUQsa0NBZ0JDO0FBRUQsd0NBNkpDO0FBbk5ELHNEQUEyRDtBQUUzRDs7R0FFRztBQUNILFNBQWdCLGdCQUFnQixDQUFDLGNBQWtDLEVBQUUsTUFBYztJQUNqRixRQUFRLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssK0JBQWtCLENBQUMsR0FBRztZQUN6QixPQUFPLFdBQVcsTUFBTSxFQUFFLENBQUM7UUFDN0IsS0FBSywrQkFBa0IsQ0FBQyxHQUFHO1lBQ3pCLE9BQU8sV0FBVyxNQUFNLEVBQUUsQ0FBQztRQUM3QixLQUFLLCtCQUFrQixDQUFDLElBQUk7WUFDMUIsT0FBTyxRQUFRLE1BQU0sRUFBRSxDQUFDO1FBQzFCO1lBQ0Usb0ZBQW9GO1lBQ3BGLE9BQU8sUUFBUSxNQUFNLEVBQUUsQ0FBQztJQUM1QixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxjQUFrQztJQUMvRCxRQUFRLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssK0JBQWtCLENBQUMsR0FBRztZQUN6QixPQUFPLFFBQVEsQ0FBQztRQUNsQixLQUFLLCtCQUFrQixDQUFDLEdBQUc7WUFDekIsT0FBTywrQkFBK0IsQ0FBQztRQUN6QyxLQUFLLCtCQUFrQixDQUFDLElBQUk7WUFDMUIsT0FBTyxnQ0FBZ0MsQ0FBQztRQUMxQztZQUNFLE9BQU8sZ0NBQWdDLENBQUM7SUFDNUMsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFnQixXQUFXLENBQUMsS0FBVSxFQUFFLEtBQUssR0FBRyxDQUFDO0lBQy9DLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdB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RyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOb2RlUGFja2FnZU1hbmFnZXIgfSBmcm9tICdwcm9qZW4vbGliL2phdmFzY3JpcHQnO1xuXG4vKipcbiAqIFJlbmRlcnMgdGhlIGNvbW1hbmQgdXNlZCB0byBydW4gYSBwYWNrYWdlLmpzb24gc2NyaXB0IGZvciB0aGUgZ2l2ZW4gcGFja2FnZSBtYW5hZ2VyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuU2NyaXB0Q29tbWFuZChwYWNrYWdlTWFuYWdlcjogTm9kZVBhY2thZ2VNYW5hZ2VyLCBzY3JpcHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHN3aXRjaCAocGFja2FnZU1hbmFnZXIpIHtcbiAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5OUE06XG4gICAgICByZXR1cm4gYG5wbSBydW4gJHtzY3JpcHR9YDtcbiAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5CVU46XG4gICAgICByZXR1cm4gYGJ1biBydW4gJHtzY3JpcHR9YDtcbiAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5QTlBNOlxuICAgICAgcmV0dXJuIGBwbnBtICR7c2NyaXB0fWA7XG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIGFsbCB5YXJuIHZhcmlhbnRzICh5YXJuLCB5YXJuMiwgeWFybl9jbGFzc2ljLCB5YXJuX2JlcnJ5KSBzaGFyZSB0aGUgYHlhcm5gIGJpbmFyeVxuICAgICAgcmV0dXJuIGB5YXJuICR7c2NyaXB0fWA7XG4gIH1cbn1cblxuLyoqXG4gKiBSZW5kZXJzIHRoZSBjb21tYW5kIHVzZWQgdG8gZG8gYSBjbGVhbiwgcmVwcm9kdWNpYmxlIGRlcGVuZGVuY3kgaW5zdGFsbCAoZS5nLiBmb3IgQ0kpXG4gKiBmb3IgdGhlIGdpdmVuIHBhY2thZ2UgbWFuYWdlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbGxDb21tYW5kKHBhY2thZ2VNYW5hZ2VyOiBOb2RlUGFja2FnZU1hbmFnZXIpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuTlBNOlxuICAgICAgcmV0dXJuICducG0gY2knO1xuICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLkJVTjpcbiAgICAgIHJldHVybiAnYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGUnO1xuICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLlBOUE06XG4gICAgICByZXR1cm4gJ3BucG0gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZSc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAneWFybiBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlJztcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplVHModmFsdWU6IGFueSwgZGVwdGggPSAxKTogc3RyaW5nIHtcbiAgY29uc3QgcGFkID0gJyAgJy5yZXBlYXQoZGVwdGgpO1xuICBjb25zdCBpbm5lclBhZCA9ICcgICcucmVwZWF0KGRlcHRoICsgMSk7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gYCcke3ZhbHVlfSdgO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGNvbnN0IGl0ZW1zID0gdmFsdWUubWFwKHYgPT4gYCR7aW5uZXJQYWR9JHtzZXJpYWxpemVUcyh2LCBkZXB0aCArIDEpfWApLmpvaW4oJyxcXG4nKTtcbiAgICByZXR1cm4gYFtcXG4ke2l0ZW1zfSxcXG4ke3BhZH1dYDtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyh2YWx1ZSlcbiAgICAgIC5tYXAoKFtrLCB2XSkgPT4gYCR7aW5uZXJQYWR9JHtrfTogJHtzZXJpYWxpemVUcyh2LCBkZXB0aCArIDEpfWApXG4gICAgICAuam9pbignLFxcbicpO1xuICAgIHJldHVybiBge1xcbiR7ZW50cmllc30sXFxuJHtwYWR9fWA7XG4gIH1cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRtZUNvbnRlbnRzKHByb2plY3ROYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIFtcbiAgICBgIyAke3Byb2plY3ROYW1lfWAsXG4gICAgJycsXG4gICAgJ1RoaXMgcHJvamVjdCB3YXMgYm9vdHN0cmFwcGVkIHdpdGggW0JhdG1hbl0oaHR0cHM6Ly9naXRodWIuY29tL21hY2Vkb24tdGVjaG5vbG9naWVzL3BsYXRmb3JtLWNvbW1vbikuJyxcbiAgICAnJyxcbiAgICAnIyMgV2hhdCBCYXRtYW4gQ3JlYXRlZCcsXG4gICAgJycsXG4gICAgJyMjIyBDREsgSW5mcmFzdHJ1Y3R1cmUgKGBzcmMvYCknLFxuICAgICcnLFxuICAgICd8IEZpbGUgfCBEZXNjcmlwdGlvbiB8JyxcbiAgICAnfC0tLS0tLXwtLS0tLS0tLS0tLS0tfCcsXG4gICAgJ3wgYHNyYy9tYWluLnRzYCB8IENESyBhcHAgZW50cnkgcG9pbnQg4oCUIGluc3RhbnRpYXRlcyBkZXYsIHN0YWdpbmcsIGFuZCBwcm9kIGBBcHBsaWNhdGlvblN0YWNrYHMgfCcsXG4gICAgJ3wgYHNyYy9Mb2NhbERldkFwcC50c2AgfCBMb2NhbCBkZXZlbG9wbWVudCBDREsgYXBwIOKAlCB1c2VkIGJ5IGB5YXJuIGNkazpkZXZgIC0gZGVwbG95cyB0byBBV1MgZm9yIHNsb3dlciBidXQgbW9yZSB0aG9yb3VnaCB0ZXN0aW5nIHwnLFxuICAgICd8IGBzcmMvR2l0SHViUm9sZXMudHNgIHwgQ0RLIGFwcCBmb3IgZGVwbG95aW5nIHRoZSBHaXRIdWIgT0lEQyBJQU0gcm9sZSAob25lLXRpbWUgYm9vdHN0cmFwKSB8JyxcbiAgICAnfCBgc3JjL3N0YWNrcy9BcHBsaWNhdGlvblN0YWNrLnRzYCB8IFlvdXIgcHJpbWFyeSBzdGFjayDigJQgZXh0ZW5kIGl0IHRvIGFkZCByZXNvdXJjZXMgfCcsXG4gICAgJ3wgYHNyYy9zdGFja3MvQmFzZUFwcGxpY2F0aW9uU3RhY2sudHNgIHwgQmFzZSBzdGFjayB3aXRoIFZQQywgQVBJLCBzdGF0aWMgd2Vic2l0ZSwgRGF0YWRvZywgYW5kIFJvdXRlIDUzIHdpcmVkIHVwIHwnLFxuICAgICd8IGBzcmMvc3RhY2tzL0dpdEh1YlJvbGVzU3RhY2sudHNgIHwgSUFNIHJvbGUgc3RhY2sgZm9yIEdpdEh1YiBBY3Rpb25zIE9JREMgYXV0aGVudGljYXRpb24gfCcsXG4gICAgJ3wgYHNyYy9jb25zdHJ1Y3RzL0FwaS50c2AgfCBBUEkgR2F0ZXdheSArIExhbWJkYSBjb25zdHJ1Y3Qgd2l0aCBDbGVyayBKV1QgYXV0aG9yaXplciB8JyxcbiAgICAnfCBgc3JjL2NvbnN0cnVjdHMvU3RhdGljV2Vic2l0ZS50c2AgfCBDbG91ZEZyb250ICsgUzMgKyBBQ00gKyBSb3V0ZSA1MyBjb25zdHJ1Y3QgfCcsXG4gICAgJ3wgYHNyYy9jb25zdHJ1Y3RzL2hhbmRsZXIvQXBpLkZ1bmN0aW9uLnRzYCB8IExhbWJkYSBoYW5kbGVyIGVudHJ5IHBvaW50LCBiYXNpYyB3cmFwcGVyIGFyb3VuZCBFeHByZXNzLWNvbXBhdGlibGUgYXBwIGNvZGUgfCcsXG4gICAgJ3wgYHNyYy9hc3BlY3RzL0RhdGFEb2dBc3BlY3QudHNgIHwgQ0RLIGFzcGVjdCB0aGF0IHdpcmVzIGFsbCBMYW1iZGEgZnVuY3Rpb25zIHRvIERhdGFkb2cgfCcsXG4gICAgJycsXG4gICAgJyMjIyBGcm9udGVuZCAoYHdlYi9gKScsXG4gICAgJycsXG4gICAgJ3wgRmlsZSB8IERlc2NyaXB0aW9uIHwnLFxuICAgICd8LS0tLS0tfC0tLS0tLS0tLS0tLS18JyxcbiAgICAnfCBgd2ViL3NyYy9tYWluLnRzeGAgfCBSZWFjdCBhcHAgZW50cnkgcG9pbnQgd2l0aCBDbGVyayBhbmQgUmVhY3QgUXVlcnkgcHJvdmlkZXJzIHwnLFxuICAgICd8IGB3ZWIvc3JjL0FwcC50c3hgIHwgUm9vdCBhcHBsaWNhdGlvbiBjb21wb25lbnQgfCcsXG4gICAgJ3wgYHdlYi9zcmMvQXBwLmNzc2AgLyBgd2ViL3NyYy9pbmRleC5jc3NgIHwgQmFzZSBzdHlsZXNoZWV0cyAoVGFpbHdpbmQgQ1NTIHY0KSB8JyxcbiAgICAnfCBgd2ViL3NyYy9jb25maWcudHNgIHwgYHVzZUNvbmZpZygpYCBob29rIOKAlCBsb2FkcyBydW50aW1lIGNvbmZpZyBmcm9tIGBjb25maWcuanNvbmAgfCcsXG4gICAgJ3wgYHdlYi9zcmMvc2VydmljZXMvQmFzZVNlcnZpY2UudHNgIHwgYHVzZUJhc2VRdWVyeSgpYCDigJQgYXV0aGVudGljYXRlZCBBUEkgZmV0Y2ggaG9vayB8JyxcbiAgICAnfCBgd2ViL3NyYy9zZXJ2aWNlcy9Sb290U2VydmljZS50c2AgfCBFeGFtcGxlIHNlcnZpY2UgdXNpbmcgYHVzZUJhc2VRdWVyeWAgfCcsXG4gICAgJ3wgYHdlYi9wdWJsaWMvY29uZmlnLmpzb25gIHwgUnVudGltZSBjb25maWcgKEFQSSBiYXNlIFVSTCwgQ2xlcmsgcHVibGlzaGFibGUga2V5KSB8JyxcbiAgICAnJyxcbiAgICAnIyMjIEdpdEh1YiBBY3Rpb25zIFdvcmtmbG93cyAoYC5naXRodWIvd29ya2Zsb3dzL2ApJyxcbiAgICAnJyxcbiAgICAnfCBGaWxlIHwgVHJpZ2dlciB8JyxcbiAgICAnfC0tLS0tLXwtLS0tLS0tLS18JyxcbiAgICAnfCBgcHItZGVwbG95LnltbGAgfCBPbiBwdWxsIHJlcXVlc3Qgb3Blbi91cGRhdGUg4oCUIGRlcGxveXMgYSBwZXItUFIgZGV2IHN0YWNrIHwnLFxuICAgICd8IGBwci1jbGVhbnVwLnltbGAgfCBPbiBwdWxsIHJlcXVlc3QgY2xvc2Ug4oCUIHRlYXJzIGRvd24gdGhlIHBlci1QUiBkZXYgc3RhY2sgfCcsXG4gICAgJ3wgYHN0YWdpbmctZGVwbG95LnltbGAgfCBPbiBwdXNoIHRvIGBtYWluYCDigJQgZGVwbG95cyB0byBzdGFnaW5nIHwnLFxuICAgICd8IGBwcm9kdWN0aW9uLWRlcGxveS55bWxgIHwgTWFudWFsbHkgdHJpZ2dlcmVkIOKAlCBkZXBsb3lzIHRvIHByb2R1Y3Rpb24gfCcsXG4gICAgJycsXG4gICAgJy0tLScsXG4gICAgJycsXG4gICAgJyMjIEZpbGVzIFlvdSBDYW4gRWRpdCcsXG4gICAgJycsXG4gICAgJ1RoZXNlIGZpbGVzIGFyZSBnZW5lcmF0ZWQgb25jZSBhbmQgbmV2ZXIgb3ZlcndyaXR0ZW4gYnkgQmF0bWFuLiBNb2RpZnkgdGhlbSBmcmVlbHkuJyxcbiAgICAnJyxcbiAgICAnfCBGaWxlIHwgV2hhdCB0byBkbyB3aXRoIGl0IHwnLFxuICAgICd8LS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfCcsXG4gICAgJ3wgYC5wcm9qZW5yYy50cyB8IFRoZSBtYWluIFByb2plbiBjb25maWd1cmF0aW9uIGZpbGUuIEFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIGZvciBlaXRoZXIgdGhlIEFQSSBvciB0aGUgV2ViIGZyb250ZW5kIG5lZWQgdG8gYmUgYWRkZWQgaGVyZSB8JyxcbiAgICAnfCBgc3JjL3N0YWNrcy9BcHBsaWNhdGlvblN0YWNrLnRzYCB8ICoqU3RhcnQgaGVyZS4qKiBBZGQgQ0RLIGNvbnN0cnVjdHMgdG8gYnVpbGQgeW91ciBpbmZyYXN0cnVjdHVyZSB8JyxcbiAgICAnfCBgc3JjL2NvbnN0cnVjdHMvaGFuZGxlci9hcHAudHMgfCBUaGUgbWFpbiBtb25vbGl0aGljIEFQSSBSRVNUIHNlcnZlciBmaWxlLiBNYWluIGZpbGUgeW91IHNob3VsZCBiZSBtb2RpZnlpbmcgfCcsXG4gICAgJ3wgYHdlYi9zcmMvQXBwLnRzeGAgfCBCdWlsZCB5b3VyIFVJIGhlcmUgfCcsXG4gICAgJ3wgYHdlYi9zcmMvQXBwLmNzc2AgLyBgd2ViL3NyYy9pbmRleC5jc3NgIHwgU3R5bGUgeW91ciBhcHBsaWNhdGlvbiB8JyxcbiAgICAnfCBgd2ViL3NyYy9tYWluLnRzeGAgfCBBZGp1c3QgdG9wLWxldmVsIHByb3ZpZGVycyBvciByb3V0aW5nIHwnLFxuICAgICd8IGB3ZWIvc3JjL3NlcnZpY2VzL1Jvb3RTZXJ2aWNlLnRzYCB8IEFkZCBvciByZXBsYWNlIEFQSSBzZXJ2aWNlIGhvb2tzIHwnLFxuICAgICd8IGB3ZWIvcHVibGljL2NvbmZpZy5qc29uYCB8IFVwZGF0ZSBmb3IgbG9jYWwgZGV2ZWxvcG1lbnQgKEFQSSBVUkwsIENsZXJrIGtleSkgfCcsXG4gICAgJycsXG4gICAgJyMjIEZpbGVzIFlvdSBDYW5ub3QgRWRpdCcsXG4gICAgJycsXG4gICAgJ1RoZXNlIGZpbGVzIGFyZSAqKm1hbmFnZWQgYnkgQmF0bWFuKiogYW5kIHdpbGwgYmUgb3ZlcndyaXR0ZW4gZXZlcnkgdGltZSBgbnB4IHByb2plbmAgcnVucy4gRG8gbm90IGVkaXQgdGhlbSBkaXJlY3RseSDigJQgbWFrZSBjaGFuZ2VzIGluIGAucHJvamVucmMudHNgIGluc3RlYWQuJyxcbiAgICAnJyxcbiAgICAnPiBbIUlNUE9SVEFOVF0nLFxuICAgICc+IElmIHlvdSBoYXZlIEFOWSBjaGFuZ2VzIHlvdSB3YW50IHRvIG1ha2UgdG8gdGhlc2UgZmlsZXMsIG5vdGlmeSAjdGVhbS1iYXRtYW4gb24gU2xhY2suICcsXG4gICAgJz4gV2UgbWFpbnRhaW4gdGhlc2UgZmlsZXMgYXMgcGFydCBvZiB0aGUgY29yZSBCYXRtYW4gZXhwZXJpZW5jZSwgYW5kIHlvdXIgZmVlZGJhY2sgaXMgY3J1Y2lhbCB0byBlbnN1cmUgdGhleSBtZWV0IHlvdXIgbmVlZHMuJyxcbiAgICAnJyxcbiAgICAnfCBGaWxlIHwgV2h5IGl0XFwncyBtYW5hZ2VkIHwnLFxuICAgICd8LS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tfCcsXG4gICAgJ3wgYHNyYy9zdGFja3MvQmFzZUFwcGxpY2F0aW9uU3RhY2sudHNgIHwgQ29yZSBzdGFjayB3aXJpbmcg4oCUIHVwZGF0ZWQgd2l0aCBCYXRtYW4gcmVsZWFzZXMgfCcsXG4gICAgJ3wgYHNyYy9hc3BlY3RzL0RhdGFEb2dBc3BlY3QudHNgIHwgRGF0YWRvZyBDREsgYXNwZWN0IHwnLFxuICAgICd8IGB3ZWIvdml0ZS5jb25maWcudHNgIHwgVml0ZSBjb25maWd1cmF0aW9uIHwnLFxuICAgICd8IGB3ZWIvZXNsaW50LmNvbmZpZy5qc2AgfCBFU0xpbnQgY29uZmlndXJhdGlvbiB8JyxcbiAgICAnfCBgd2ViL3Bvc3Rjc3MuY29uZmlnLmpzYCB8IFBvc3RDU1MgLyBUYWlsd2luZCBjb25maWd1cmF0aW9uIHwnLFxuICAgICd8IGB3ZWIvaW5kZXguaHRtbGAgfCBIVE1MIGVudHJ5IHBvaW50IHwnLFxuICAgICd8IGB3ZWIvdHNjb25maWcuanNvbmAgLyBgd2ViL3RzY29uZmlnLmFwcC5qc29uYCAvIGB3ZWIvdHNjb25maWcubm9kZS5qc29uYCB8IFR5cGVTY3JpcHQgY29uZmlndXJhdGlvbiB8JyxcbiAgICAnfCBgd2ViL3NyYy92aXRlLWVudi5kLnRzYCB8IFZpdGUgdHlwZSBkZWNsYXJhdGlvbnMgfCcsXG4gICAgJ3wgYHdlYi9zcmMvY29uZmlnLnRzYCB8IFJ1bnRpbWUgY29uZmlnIGhvb2sg4oCUIHNoYXBlIGRyaXZlbiBieSBgLnByb2plbnJjLnRzYCB8JyxcbiAgICAnfCBgd2ViL3NyYy9zZXJ2aWNlcy9CYXNlU2VydmljZS50c2AgfCBCYXNlIGF1dGhlbnRpY2F0ZWQgZmV0Y2ggaG9vayB8JyxcbiAgICAnfCBgLmdpdGh1Yi9DT0RFT1dORVJTYCB8IENvZGUgb3duZXJzaGlwIHBvbGljeSB8JyxcbiAgICAnfCBgLmdpdGh1Yi93b3JrZmxvd3MvKi55bWxgIHwgQWxsIENJL0NEIHdvcmtmbG93cyB8JyxcbiAgICAnfCBgYXJjaGl0ZWN0dXJlLXJ1bGVzL2NoZWNrLnRzYCwgYHRzY29uZmlnLmpzb25gLCBgUkVBRE1FLm1kYCB8IEFyY2hpdGVjdHVyZSBydWxlIGVuZ2luZSB8JyxcbiAgICAnfCBgYXR0ZXN0YXRpb24vbWFuaWZlc3QudHNgLCBgdmVyaWZ5LnRzYCwgYHRzY29uZmlnLmpzb25gIHwgUFIgYXR0ZXN0YXRpb24gbWVjaGFuaXNtIHwnLFxuICAgICd8IGBvcGVuc3BlYy1nYXRlcy9jaGVjay10YXNrcy1jb21wbGV0ZS50c2AsIGB0c2NvbmZpZy5qc29uYCB8IE9wZW5TcGVjIHRhc2stY29tcGxldGlvbiBnYXRlIHwnLFxuICAgICd8IGB3b3JrZmxvd3Mvd29ya2Zsb3ctKi55YW1sYCB8IFN3YW1wIHdvcmtmbG93cyB0aGUgc29mdHdhcmUgZmFjdG9yeSBydW5zIHwnLFxuICAgICcnLFxuICAgICc+ICoqVGlwOioqIEZpbGVzIHdpdGggYSBgfn4gR2VuZXJhdGVkIGJ5IHByb2plbi4gVG8gbW9kaWZ5LCBlZGl0IC5wcm9qZW5yYy50cyBhbmQgcnVuIFwibnB4IHByb2plblwiLiB+fmAgaGVhZGVyIGFyZSBtYW5hZ2VkIGZpbGVzLicsXG4gICAgJycsXG4gICAgJyMjIyBTb2Z0d2FyZSBGYWN0b3J5IChgbW9kZWxzL2AsIGBhcmNoaXRlY3R1cmUtcnVsZXMvcnVsZXMuanNvbmApJyxcbiAgICAnJyxcbiAgICAnQmF0bWFuIGFsc28gc2VlZHMgYSBbc3dhbXBdKGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FtcC1jbHViL3N3YW1wKSBzb2Z0d2FyZScsXG4gICAgJ2ZhY3Rvcnkg4oCUIGEgYEBzd2FtcC9zb2Z0d2FyZS1mYWN0b3J5YCBzdGF0ZSBtYWNoaW5lIHRoYXQgZHJpdmVzIGEgR2l0SHViJyxcbiAgICAnaXNzdWUgdGhyb3VnaCBpbnRha2UsIE9wZW5TcGVjIHBsYW5uaW5nLCBpbXBsZW1lbnRhdGlvbiwgcHJlLVBSJyxcbiAgICAndmVyaWZpY2F0aW9uLCBhbmQgYW4gb3BlbmVkIFBSLiBUaGUgc2VlZCBmaWxlcyB1bmRlciBgbW9kZWxzLyoqLyoueWFtbGAgYW5kJyxcbiAgICAnYGFyY2hpdGVjdHVyZS1ydWxlcy9ydWxlcy5qc29uYCBhcmUgZ2VuZXJhdGVkIG9uY2UgKGxpa2UgdGhlIGZpbGVzIGluJyxcbiAgICAnXCJGaWxlcyBZb3UgQ2FuIEVkaXRcIiBhYm92ZSkg4oCUIHR1bmUgdGhlIGZhY3RvcnlcXCdzIHN0YWdlcy9nYXRlcyBvciBhZGQgeW91cicsXG4gICAgJ293biBhcmNoaXRlY3R1cmUgcnVsZXMgZGlyZWN0bHkgaW4gdGhvc2UgZmlsZXMuJyxcbiAgICAnJyxcbiAgICAnYHN3YW1wIGluaXRgIHJ1bnMgYXV0b21hdGljYWxseSBhcyBwYXJ0IG9mIGBpbnN0YWxsYC9gaW5zdGFsbDpjaWAgKGEgc2lsZW50JyxcbiAgICAnbm8tb3AgaWYgYHN3YW1wYCBpc25cXCd0IG9uIFBBVEgsIGUuZy4gaW4gQ0kpLCBzbyB0aGUgcmVwbyBzdGF5cyBpbml0aWFsaXplZCcsXG4gICAgJ3dpdGhvdXQgYSBzZXBhcmF0ZSBzdGVwLiBPbmUtdGltZSBzZXR1cCBiZXlvbmQgdGhhdCwgYWZ0ZXIgeW91ciBmaXJzdCcsXG4gICAgJ2BucHggcHJvamVuYDonLFxuICAgICcnLFxuICAgICdgYGBiYXNoJyxcbiAgICAnIyBQdWxscyB0aGUgc29mdHdhcmUtZmFjdG9yeS9naXRodWIgZXh0ZW5zaW9ucyBhbmQgY3JlYXRlcyB0aGUgcmVwb1xcJ3MnLFxuICAgICcjIHNlY3JldHMgdmF1bHQnLFxuICAgICducHggcHJvamVuIHN3YW1wOmJvb3RzdHJhcCcsXG4gICAgJycsXG4gICAgJyMgVGhlbiBzdG9yZSBhIEdpdEh1YiB0b2tlbiB0aGUgZmFjdG9yeSBjYW4gb3BlbiBQUnMgd2l0aCcsXG4gICAgJ3N3YW1wIHZhdWx0IHB1dCA8cmVwbz4tc2VjcmV0cyBHSVRIVUJfVE9LRU4gLS1yZWZyZXNoLWZyb20gXCJnaCBhdXRoIHRva2VuXCInLFxuICAgICdgYGAnLFxuICAgICcnLFxuICAgICctLS0nLFxuICAgICcnLFxuICAgICcjIyBXaGVyZSB0byBTdGFydCcsXG4gICAgJycsXG4gICAgJzEuICoqYHNyYy9zdGFja3MvQXBwbGljYXRpb25TdGFjay50c2AqKiDigJQgQWRkIHlvdXIgQ0RLIGNvbnN0cnVjdHMgaGVyZS4gVGhlIGJhc2Ugc3RhY2sgYWxyZWFkeSBwcm92aWRlcyBgdGhpcy5hcGlgLCBgdGhpcy52cGNgLCBgdGhpcy5ob3N0ZWRab25lYCwgYW5kIGB0aGlzLmRhdGFkb2dgIGFzIHByb3RlY3RlZCBwcm9wZXJ0aWVzLicsXG4gICAgJycsXG4gICAgJzIuICoqYHdlYi9gKiog4oCUIEJ1aWxkIHlvdXIgZnJvbnRlbmQuIFN0YXJ0IHdpdGggYHdlYi9zcmMvQXBwLnRzeGAgYW5kIGFkZCBzZXJ2aWNlcyBhbG9uZ3NpZGUgYHdlYi9zcmMvc2VydmljZXMvUm9vdFNlcnZpY2UudHNgLicsXG4gICAgJycsXG4gICAgJzMuICoqYHNyYy9jb25zdHJ1Y3RzL2hhbmRsZXIvYXBwLnRzYCoqIOKAlCBJbXBsZW1lbnQgeW91ciBiYWNrZW5kIExhbWJkYSBoYW5kbGVyIGxvZ2ljIGhlcmUuJyxcbiAgICAnJyxcbiAgICAnNC4gKipgLnByb2plbnJjLnRzYCoqIC0gTWFuYWdlcyBwcm9qZWN0IGRlcGVuZGVuY2llcyBhbmQgY29uZmlndXJhdGlvbi4gUnVuIGBucHggcHJvamVuYCBhZnRlciBtYWtpbmcgYW55IGNoYW5nZXMgdG8gdGhpcyBmaWxlLicsXG4gICAgJy0tLScsXG4gICAgJycsXG4gICAgJyMjIERldmVsb3BtZW50IFdvcmtmbG93JyxcbiAgICAnJyxcbiAgICAnYGBgYmFzaCcsXG4gICAgJyMgSW5zdGFsbCBkZXBlbmRlbmNpZXMnLFxuICAgICd5YXJuIGluc3RhbGwnLFxuICAgICcnLFxuICAgICcjIFN0YXJ0IGxvY2FsIGRldiBzZXJ2ZXIgKGJhY2tlbmQgTGFtYmRhICsgVml0ZSBmcm9udGVuZCBpbiBwYXJhbGxlbCknLFxuICAgICd5YXJuIGRldicsXG4gICAgJycsXG4gICAgJyMgRGVwbG95IGEgcGVyc29uYWwgZGV2IHN0YWNrIHRvIEFXUyBhcyBhbiBhbHRlcm5hdGl2ZSB0byBsb2NhbCBkZXZlbG9wbWVudCwgcHJvdmlkZXMgbW9yZSB0aG9yb3VnaCBlbmQtdG8tZW5kIHRlc3RpbmcnLFxuICAgICd5YXJuIGNkazpkZXYgLS1jb250ZXh0IGxvY2FsLWRldi1wcmVmaXg9eW91ci1oYW5kbGUgZGVwbG95JyxcbiAgICAnJyxcbiAgICAnIyBSdW4gdGVzdHMnLFxuICAgICd5YXJuIHRlc3QnLFxuICAgICcnLFxuICAgICcjIFJlLXN5bnRoZXNpemUgcHJvamVjdCBmaWxlcyBhZnRlciBlZGl0aW5nIC5wcm9qZW5yYy50cycsXG4gICAgJ25weCBwcm9qZW4nLFxuICAgICdgYGAnLFxuICAgICcnLFxuICAgICctLS0nLFxuICAgICcnLFxuICAgICcjIyBVcGdyYWRpbmcgQmF0bWFuJyxcbiAgICAnJyxcbiAgICAnYGBgYmFzaCcsXG4gICAgJ3lhcm4gYWRkIEBtYWNlZG9uLXRlY2hub2xvZ2llcy9iYXRtYW5AbGF0ZXN0JyxcbiAgICAnbnB4IHByb2plbicsXG4gICAgJ2BgYCcsXG4gICAgJycsXG4gICAgJ1RoaXMgdXBkYXRlcyBhbGwgbWFuYWdlZCBmaWxlcyB0byB0aGUgbGF0ZXN0IEJhdG1hbiBzdGFuZGFyZHMuIFlvdXIgZWRpdGFibGUgc2FtcGxlIGZpbGVzIGFyZSBuZXZlciB0b3VjaGVkLicsXG4gIF0uam9pbignXFxuJyk7XG59XG4iXX0=
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
type: '@goodcraft/github'
|
|
2
|
+
typeVersion: 2026.06.14.1
|
|
3
|
+
id: 36ad5c9c-90ce-47b3-bf67-89ca9f3a234e
|
|
4
|
+
name: platform-common-pr
|
|
5
|
+
version: 1
|
|
6
|
+
tags: {}
|
|
7
|
+
globalArguments:
|
|
8
|
+
token: '${{ vault.get(platform-common-secrets, GITHUB_TOKEN) }}'
|
|
9
|
+
owner: macedon-technologies
|
|
10
|
+
methods: {}
|