cdklabs-projen-project-types 0.2.15 → 0.2.17

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.
@@ -1,362 +0,0 @@
1
- "use strict";
2
- var _a;
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.CdkCliIntegTestsWorkflow = void 0;
5
- const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
- const projen_1 = require("projen");
7
- const NOT_FLAGGED_EXPR = "!contains(github.event.pull_request.labels.*.name, 'pr/exempt-integ-test')";
8
- /**
9
- * Add a workflow for running the tests
10
- *
11
- * This MUST be a separate workflow that runs in privileged context. We have a couple
12
- * of options:
13
- *
14
- * - `workflow_run`: we can trigger a privileged workflow run after the unprivileged
15
- * `pull_request` workflow finishes and reuse its output artifacts. The
16
- * problem is that the second run is disconnected from the PR so we would need
17
- * to script in visibility for approvals and success (by posting comments, for
18
- * example)
19
- * - Use only a `pull_request_target` workflow on the PR: this either would run
20
- * a privileged workflow on any user code submission (might be fine given the
21
- * workflow's `permissions`, but I'm sure this will make our security team uneasy
22
- * anyway), OR this would mean any build needs human confirmation which means slow
23
- * feedback.
24
- * - Use a `pull_request` for a regular fast-feedback build, and a separate
25
- * `pull_request_target` for the integ tests. This means we're building twice.
26
- *
27
- * Ultimately, our build isn't heavy enough to put in a lot of effort deduping
28
- * it, so we'll go with the simplest solution which is the last one: 2
29
- * independent workflows.
30
- *
31
- * projen doesn't make it easy to copy the relevant parts of the 'build' workflow,
32
- * so they're unfortunately duplicated here.
33
- */
34
- class CdkCliIntegTestsWorkflow extends projen_1.Component {
35
- constructor(repo, props) {
36
- super(repo);
37
- const buildWorkflow = repo.buildWorkflow;
38
- const runTestsWorkflow = repo.github?.addWorkflow('integ');
39
- if (!buildWorkflow || !runTestsWorkflow) {
40
- throw new Error('Expected build and run tests workflow');
41
- }
42
- buildWorkflow.workflow;
43
- props.allowUpstreamVersions?.forEach((pack) => {
44
- if (!props.localPackages.includes(pack)) {
45
- throw new Error(`Package in allowUpstreamVersions but not in localPackages: ${pack}`);
46
- }
47
- });
48
- let maxWorkersArg = '';
49
- if (props.maxWorkers) {
50
- maxWorkersArg = ` --maxWorkers=${props.maxWorkers}`;
51
- }
52
- runTestsWorkflow.on({
53
- pullRequestTarget: {
54
- branches: ['main'],
55
- },
56
- // Needs to trigger and report success on merge queue builds as well
57
- mergeGroup: {},
58
- // Never hurts to be able to run this manually
59
- workflowDispatch: {},
60
- });
61
- // The 'build' part runs on the 'integ-approval' environment, which requires
62
- // approval. The actual runs access the real environment, not requiring approval
63
- // anymore.
64
- //
65
- // This is for 2 reasons:
66
- // - The build job is the first one that runs. That means you get asked approval
67
- // immediately after push, instead of 5 minutes later after the build completes.
68
- // - The build job is only one job, versus the tests which are a matrix build.
69
- // If the matrix test job needs approval, the Pull Request timeline gets spammed
70
- // with an approval request for every individual run.
71
- const JOB_PREPARE = 'prepare';
72
- runTestsWorkflow.addJob(JOB_PREPARE, {
73
- environment: props.approvalEnvironment,
74
- runsOn: [props.buildRunsOn],
75
- permissions: {
76
- contents: projen_1.github.workflows.JobPermission.READ,
77
- },
78
- env: {
79
- CI: 'true',
80
- },
81
- // Don't run again on the merge queue, we already got confirmation that it works and the
82
- // tests are quite expensive.
83
- if: `github.event_name != 'merge_group' && ${NOT_FLAGGED_EXPR}`,
84
- steps: [
85
- {
86
- name: 'Checkout',
87
- uses: 'actions/checkout@v4',
88
- with: {
89
- // IMPORTANT! This must be `head.sha` not `head.ref`, otherwise we
90
- // are vulnerable to a TOCTOU attack.
91
- ref: '${{ github.event.pull_request.head.sha }}',
92
- repository: '${{ github.event.pull_request.head.repo.full_name }}',
93
- },
94
- },
95
- // We used to fetch tags from the repo using 'checkout', but if it's a fork
96
- // the tags won't be there, so we have to fetch them from upstream.
97
- //
98
- // The tags are necessary to realistically bump versions
99
- {
100
- name: 'Fetch tags from origin repo',
101
- run: [
102
- // Can be either aws/aws-cdk-cli or aws/aws-cdk-cli-testing
103
- // (Must clone over HTTPS because we have no SSH auth set up)
104
- `git remote add upstream https://github.com/${props.sourceRepo}.git`,
105
- 'git fetch upstream \'refs/tags/*:refs/tags/*\'',
106
- ].join('\n'),
107
- },
108
- {
109
- name: 'Setup Node.js',
110
- uses: 'actions/setup-node@v4',
111
- with: {
112
- 'node-version': 'lts/*',
113
- },
114
- },
115
- {
116
- name: 'Install dependencies',
117
- run: 'yarn install --check-files',
118
- },
119
- {
120
- name: 'Bump to realistic versions',
121
- run: 'yarn workspaces run bump',
122
- env: {
123
- TESTING_CANDIDATE: 'true',
124
- },
125
- },
126
- {
127
- name: 'build',
128
- run: 'npx projen build',
129
- env: {
130
- // This is necessary to prevent projen from resetting the version numbers to
131
- // 0.0.0 during its synthesis.
132
- RELEASE: 'true',
133
- },
134
- },
135
- {
136
- name: 'Upload artifact',
137
- uses: 'actions/upload-artifact@v4.4.0',
138
- with: {
139
- name: 'build-artifact',
140
- path: 'packages/**/dist/js/*.tgz',
141
- overwrite: 'true',
142
- },
143
- },
144
- ],
145
- });
146
- const verdaccioConfig = {
147
- storage: './storage',
148
- auth: { htpasswd: { file: './htpasswd' } },
149
- uplinks: { npmjs: { url: 'https://registry.npmjs.org/' } },
150
- packages: {},
151
- };
152
- for (const pack of props.localPackages) {
153
- const allowUpstream = props.allowUpstreamVersions?.includes(pack);
154
- verdaccioConfig.packages[pack] = {
155
- access: '$all',
156
- publish: '$all',
157
- proxy: allowUpstream ? 'npmjs' : 'none',
158
- };
159
- }
160
- ;
161
- verdaccioConfig.packages['**'] = {
162
- access: '$all',
163
- proxy: 'npmjs',
164
- };
165
- // bash only expands {...} if there's a , in there, otherwise it will leave the
166
- // braces in literally. So we need to do case analysis here. Thanks, I hate it.
167
- const tarballBashExpr = props.localPackages.length === 1
168
- ? `packages/${props.localPackages[0]}/dist/js/*.tgz`
169
- : `packages/{${props.localPackages.join(',')}}/dist/js/*.tgz`;
170
- // We create a matrix job for the test.
171
- // This job will run all the different test suites in parallel.
172
- const JOB_INTEG_MATRIX = 'integ_matrix';
173
- runTestsWorkflow.addJob(JOB_INTEG_MATRIX, {
174
- environment: props.testEnvironment,
175
- runsOn: [props.testRunsOn],
176
- needs: [JOB_PREPARE],
177
- permissions: {
178
- contents: projen_1.github.workflows.JobPermission.READ,
179
- idToken: projen_1.github.workflows.JobPermission.WRITE,
180
- },
181
- env: {
182
- // Otherwise Maven is too noisy
183
- MAVEN_ARGS: '--no-transfer-progress',
184
- // This is not actually a canary, but this prevents the tests from making
185
- // assumptions about the availability of source packages.
186
- IS_CANARY: 'true',
187
- CI: 'true',
188
- // This is necessary because the new versioning of @aws-cdk/cli-lib-alpha
189
- // matches the CLI and not the framework.
190
- CLI_LIB_VERSION_MIRRORS_CLI: 'true',
191
- },
192
- // Don't run again on the merge queue, we already got confirmation that it works and the
193
- // tests are quite expensive.
194
- if: `github.event_name != 'merge_group' && ${NOT_FLAGGED_EXPR}`,
195
- strategy: {
196
- failFast: false,
197
- matrix: {
198
- domain: {
199
- suite: [
200
- 'cli-integ-tests',
201
- 'init-csharp',
202
- 'init-fsharp',
203
- 'init-go',
204
- 'init-java',
205
- 'init-javascript',
206
- 'init-python',
207
- 'init-typescript-app',
208
- 'init-typescript-lib',
209
- 'tool-integrations',
210
- ],
211
- },
212
- },
213
- },
214
- steps: [
215
- {
216
- name: 'Download build artifacts',
217
- uses: 'actions/download-artifact@v4',
218
- with: {
219
- name: 'build-artifact',
220
- path: 'packages',
221
- },
222
- },
223
- {
224
- name: 'Set up JDK 18',
225
- if: 'matrix.suite == \'init-java\' || matrix.suite == \'cli-integ-tests\'',
226
- uses: 'actions/setup-java@v4',
227
- with: {
228
- 'java-version': '18',
229
- 'distribution': 'corretto',
230
- },
231
- },
232
- {
233
- name: 'Authenticate Via OIDC Role',
234
- id: 'creds',
235
- uses: 'aws-actions/configure-aws-credentials@v4',
236
- with: {
237
- 'aws-region': 'us-east-1',
238
- 'role-duration-seconds': props.enableAtmosphere ? 60 * 60 : 4 * 60 * 60,
239
- // Expect this in Environment Variables
240
- 'role-to-assume': props.enableAtmosphere ? props.enableAtmosphere.oidcRoleArn : '${{ vars.AWS_ROLE_TO_ASSUME_FOR_TESTING }}',
241
- 'role-session-name': 'run-tests@aws-cdk-cli-integ',
242
- 'output-credentials': true,
243
- },
244
- },
245
- // This is necessary for the init tests to succeed, they set up a git repo.
246
- {
247
- name: 'Set git identity',
248
- run: [
249
- 'git config --global user.name "aws-cdk-cli-integ"',
250
- 'git config --global user.email "noreply@example.com"',
251
- ].join('\n'),
252
- },
253
- {
254
- name: 'Install Verdaccio',
255
- run: 'npm install -g verdaccio pm2',
256
- },
257
- {
258
- name: 'Create Verdaccio config',
259
- run: [
260
- 'mkdir -p $HOME/.config/verdaccio',
261
- `echo '${JSON.stringify(verdaccioConfig)}' > $HOME/.config/verdaccio/config.yaml`,
262
- ].join('\n'),
263
- },
264
- {
265
- name: 'Start Verdaccio',
266
- run: [
267
- 'pm2 start verdaccio -- --config $HOME/.config/verdaccio/config.yaml',
268
- 'sleep 5 # Wait for Verdaccio to start',
269
- ].join('\n'),
270
- },
271
- {
272
- name: 'Configure npm to use local registry',
273
- run: [
274
- // This token is a bogus token. It doesn't represent any actual secret, it just needs to exist.
275
- 'echo \'//localhost:4873/:_authToken="MWRjNDU3OTE1NTljYWUyOTFkMWJkOGUyYTIwZWMwNTI6YTgwZjkyNDE0NzgwYWQzNQ=="\' > ~/.npmrc',
276
- 'echo \'registry=http://localhost:4873/\' >> ~/.npmrc',
277
- ].join('\n'),
278
- },
279
- {
280
- name: 'Find an locally publish all tarballs',
281
- run: [
282
- `for pkg in ${tarballBashExpr}; do`,
283
- ' npm publish $pkg',
284
- 'done',
285
- ].join('\n'),
286
- },
287
- {
288
- name: 'Download and install the test artifact',
289
- run: [
290
- 'npm install @aws-cdk-testing/cli-integ',
291
- // Move the installed files to the current directory, because as
292
- // currently configured the tests won't run from an installed
293
- // node_modules directory.
294
- 'mv ./node_modules/@aws-cdk-testing/cli-integ/* .',
295
- ].join('\n'),
296
- },
297
- {
298
- name: 'Determine latest package versions',
299
- id: 'versions',
300
- run: [
301
- 'CLI_VERSION=$(cd ${TMPDIR:-/tmp} && npm view aws-cdk version)',
302
- 'echo "CLI version: ${CLI_VERSION}"',
303
- 'echo "cli_version=${CLI_VERSION}" >> $GITHUB_OUTPUT',
304
- 'LIB_VERSION=$(cd ${TMPDIR:-/tmp} && npm view aws-cdk-lib version)',
305
- 'echo "lib version: ${LIB_VERSION}"',
306
- 'echo "lib_version=${LIB_VERSION}" >> $GITHUB_OUTPUT',
307
- ].join('\n'),
308
- },
309
- {
310
- name: 'Run the test suite: ${{ matrix.suite }}',
311
- run: [
312
- `bin/run-suite${maxWorkersArg} --use-cli-release=\${{ steps.versions.outputs.cli_version }} --framework-version=\${{ steps.versions.outputs.lib_version }} \${{ matrix.suite }}`,
313
- ].join('\n'),
314
- env: {
315
- JSII_SILENCE_WARNING_DEPRECATED_NODE_VERSION: 'true',
316
- JSII_SILENCE_WARNING_UNTESTED_NODE_VERSION: 'true',
317
- JSII_SILENCE_WARNING_KNOWN_BROKEN_NODE_VERSION: 'true',
318
- DOCKERHUB_DISABLED: 'true',
319
- ...(props.enableAtmosphere ?
320
- {
321
- CDK_INTEG_ATMOSPHERE_ENABLED: 'true',
322
- CDK_INTEG_ATMOSPHERE_ENDPOINT: props.enableAtmosphere.endpoint,
323
- CDK_INTEG_ATMOSPHERE_POOL: props.enableAtmosphere.pool,
324
- } :
325
- {
326
- AWS_REGIONS: ['us-east-2', 'eu-west-1', 'eu-north-1', 'ap-northeast-1', 'ap-south-1'].join(','),
327
- }),
328
- CDK_MAJOR_VERSION: '2',
329
- RELEASE_TAG: 'latest',
330
- GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}',
331
- },
332
- },
333
- ],
334
- });
335
- // Add a job that collates all matrix jobs into a single status
336
- // This is required so that we can setup required status checks
337
- // and if we ever change the test matrix, we don't need to update
338
- // the status check configuration.
339
- runTestsWorkflow.addJob('integ', {
340
- permissions: {},
341
- runsOn: [props.testRunsOn],
342
- needs: [JOB_PREPARE, JOB_INTEG_MATRIX],
343
- if: 'always()',
344
- steps: [
345
- {
346
- name: 'Integ test result',
347
- run: `echo \${{ needs.${JOB_INTEG_MATRIX}.result }}`,
348
- },
349
- {
350
- // Don't fail the job if the test was successful or intentionally skipped
351
- if: `\${{ !(contains(fromJSON('["success", "skipped"]'), needs.${JOB_PREPARE}.result) && contains(fromJSON('["success", "skipped"]'), needs.${JOB_INTEG_MATRIX}.result)) }}`,
352
- name: 'Set status based on matrix job',
353
- run: 'exit 1',
354
- },
355
- ],
356
- });
357
- }
358
- }
359
- exports.CdkCliIntegTestsWorkflow = CdkCliIntegTestsWorkflow;
360
- _a = JSII_RTTI_SYMBOL_1;
361
- CdkCliIntegTestsWorkflow[_a] = { fqn: "cdklabs-projen-project-types.CdkCliIntegTestsWorkflow", version: "0.2.15" };
362
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWNsaS1pbnRlZy10ZXN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jZGstY2xpLWludGVnLXRlc3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsbUNBQXVEO0FBRXZELE1BQU0sZ0JBQWdCLEdBQUcsNEVBQTRFLENBQUM7QUFxRnRHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBQ0gsTUFBYSx3QkFBeUIsU0FBUSxrQkFBUztJQUNyRCxZQUFZLElBQTRCLEVBQUUsS0FBb0M7UUFDNUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRVosTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUN6QyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBQ0MsYUFBcUIsQ0FBQyxRQUFrQyxDQUFDO1FBRTNELEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUM1QyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsTUFBTSxJQUFJLEtBQUssQ0FBQyw4REFBOEQsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN4RixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDckIsYUFBYSxHQUFHLGlCQUFpQixLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdEQsQ0FBQztRQUVELGdCQUFnQixDQUFDLEVBQUUsQ0FB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QVcsRUFBRSxRQUFRO3dCQUNyQixZQUFZLEVBQUUsNkJBQTZCO3FCQUM1QztpQkFDRjthQUNGO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsK0RBQStEO1FBQy9ELCtEQUErRDtRQUMvRCxpRUFBaUU7UUFDakUsa0NBQWtDO1FBQ2xDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7WUFDL0IsV0FBVyxFQUFFLEVBQUU7WUFDZixNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO1lBQzFCLEtBQUssRUFBRSxDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQztZQUN0QyxFQUFFLEVBQUUsVUFBVTtZQUNkLEtBQUssRUFBRTtnQkFDTDtvQkFDRSxJQUFJLEVBQUUsbUJBQW1CO29CQUN6QixHQUFHLEVBQUUsbUJBQW1CLGdCQUFnQixZQUFZO2lCQUNyRDtnQkFDRDtvQkFDRSx5RUFBeUU7b0JBQ3pFLEVBQUUsRUFBRSw2REFBNkQsV0FBVyxrRUFBa0UsZ0JBQWdCLGNBQWM7b0JBQzVLLElBQUksRUFBRSxnQ0FBZ0M7b0JBQ3RDLEdBQUcsRUFBRSxRQUFRO2lCQUNkO2FBQ0Y7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDOztBQTVVSCw0REE2VUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGdpdGh1YiwgamF2YXNjcmlwdCB9IGZyb20gJ3Byb2plbic7XG5cbmNvbnN0IE5PVF9GTEFHR0VEX0VYUFIgPSBcIiFjb250YWlucyhnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LmxhYmVscy4qLm5hbWUsICdwci9leGVtcHQtaW50ZWctdGVzdCcpXCI7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYXRtb3NwaGVyZSBzZXJ2aWNlIHVzYWdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF0bW9zcGhlcmVPcHRpb25zIHtcbiAgLyoqXG4gICAqIEF0bW9zcGhlcmUgc2VydmljZSBlbmRwb2ludC5cbiAgICovXG4gIHJlYWRvbmx5IGVuZHBvaW50OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBXaGljaCBwb29sIHRvIHJldHJpZXZlIGVudmlyb25tZW50cyBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9vbDogc3RyaW5nO1xuICAvKipcbiAgICogT0lEQyByb2xlIHRvIGFzc3VtZSBwcmlvciB0byB1c2luZyBhdG1vc3BoZXJlLiBNdXN0IGJlIGFsbG93IGxpc3RlZFxuICAgKiBvbiB0aGUgc2VydmljZSBlbmRwb2ludC5cbiAgICovXG4gIHJlYWRvbmx5IG9pZGNSb2xlQXJuOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2RrQ2xpSW50ZWdUZXN0c1dvcmtmbG93UHJvcHMge1xuICAvKipcbiAgICogUnVubmVycyBmb3IgdGhlIHdvcmtmbG93XG4gICAqL1xuICByZWFkb25seSBidWlsZFJ1bnNPbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSdW5uZXJzIGZvciB0aGUgd29ya2Zsb3dcbiAgICovXG4gIHJlYWRvbmx5IHRlc3RSdW5zT246IHN0cmluZztcblxuICAvKipcbiAgICogR2l0SHViIGVudmlyb25tZW50IG5hbWUgZm9yIGFwcHJvdmFsc1xuICAgKlxuICAgKiBNVVNUIGJlIGNvbmZpZ3VyZWQgdG8gcmVxdWlyZSBtYW51YWwgYXBwcm92YWwuXG4gICAqL1xuICByZWFkb25seSBhcHByb3ZhbEVudmlyb25tZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEdpdEh1YiBlbnZpcm9ubWVudCBuYW1lIGZvciBydW5uaW5nIHRoZSB0ZXN0c1xuICAgKlxuICAgKiBNVVNUIGJlIGNvbmZpZ3VyZWQgd2l0aG91dCBhcHByb3ZhbHMsIGFuZCB3aXRoIHRoZSBmb2xsb3dpbmcgdmFycyBhbmQgc2VjcmV0czpcbiAgICpcbiAgICogLSB2YXJzOiBBV1NfUk9MRV9UT19BU1NVTUVfRk9SX1RFU1RJTkdcbiAgICpcbiAgICogQW5kIHRoZSByb2xlIG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQgdG8gYWxsb3cgdGhlIEFzc3VtZVJvbGUgb3BlcmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgdGVzdEVudmlyb25tZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhY2thZ2VzIHRoYXQgYXJlIGxvY2FsbHkgdHJhbnNmZXJlZCAod2Ugd2lsbCBuZXZlciB1c2UgdGhlIHVwc3RyZWFtIHZlcnNpb25zKVxuICAgKlxuICAgKiBUYWtlcyBwYWNrYWdlIG5hbWVzOyB0aGVzZSBhcmUgZXhwZWN0ZWQgdG8gbGl2ZSBpbiBgcGFja2FnZXMvPE5BTUU+L2Rpc3QvanNgLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9jYWxQYWNrYWdlczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBvZmZpY2lhbCByZXBvIHRoaXMgd29ya2Zsb3cgaXMgdXNlZCBmb3JcbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVJlcG86IHN0cmluZztcblxuICAvKipcbiAgICogSWYgZ2l2ZW4sIGFsbG93cyBhY2Nlc3NpbmcgdXBzdHJlYW0gdmVyc2lvbnMgb2YgdGhlc2UgcGFja2FnZXNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyB1cHN0cmVhbSB2ZXJzaW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dVcHN0cmVhbVZlcnNpb25zPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBhdG1vc3BoZXJlIHNlcnZpY2UgdG8gcmV0cmlldmUgQVdTIHRlc3QgZW52aXJvbm1lbnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGF0bW9zcGhlcmUgaXMgbm90IHVzZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZUF0bW9zcGhlcmU/OiBBdG1vc3BoZXJlT3B0aW9ucztcblxuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHdvcmtlcnMgdGhlIHdvcmtlci1wb29sIHdpbGwgc3Bhd24gZm9yIHJ1bm5pbmcgdGVzdHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGNsaSBpbnRlZyB0ZXN0IHBhY2thZ2UgZGV0ZXJtaW5lcyBhIHNlbnNpYmxlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IG1heFdvcmtlcnM/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQWRkIGEgd29ya2Zsb3cgZm9yIHJ1bm5pbmcgdGhlIHRlc3RzXG4gKlxuICogVGhpcyBNVVNUIGJlIGEgc2VwYXJhdGUgd29ya2Zsb3cgdGhhdCBydW5zIGluIHByaXZpbGVnZWQgY29udGV4dC4gV2UgaGF2ZSBhIGNvdXBsZVxuICogb2Ygb3B0aW9uczpcbiAqXG4gKiAtIGB3b3JrZmxvd19ydW5gOiB3ZSBjYW4gdHJpZ2dlciBhIHByaXZpbGVnZWQgd29ya2Zsb3cgcnVuIGFmdGVyIHRoZSB1bnByaXZpbGVnZWRcbiAqICAgYHB1bGxfcmVxdWVzdGAgd29ya2Zsb3cgZmluaXNoZXMgYW5kIHJldXNlIGl0cyBvdXRwdXQgYXJ0aWZhY3RzLiBUaGVcbiAqICAgcHJvYmxlbSBpcyB0aGF0IHRoZSBzZWNvbmQgcnVuIGlzIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBQUiBzbyB3ZSB3b3VsZCBuZWVkXG4gKiAgIHRvIHNjcmlwdCBpbiB2aXNpYmlsaXR5IGZvciBhcHByb3ZhbHMgYW5kIHN1Y2Nlc3MgKGJ5IHBvc3RpbmcgY29tbWVudHMsIGZvclxuICogICBleGFtcGxlKVxuICogLSBVc2Ugb25seSBhIGBwdWxsX3JlcXVlc3RfdGFyZ2V0YCB3b3JrZmxvdyBvbiB0aGUgUFI6IHRoaXMgZWl0aGVyIHdvdWxkIHJ1blxuICogICBhIHByaXZpbGVnZWQgd29ya2Zsb3cgb24gYW55IHVzZXIgY29kZSBzdWJtaXNzaW9uIChtaWdodCBiZSBmaW5lIGdpdmVuIHRoZVxuICogICB3b3JrZmxvdydzIGBwZXJtaXNzaW9uc2AsIGJ1dCBJJ20gc3VyZSB0aGlzIHdpbGwgbWFrZSBvdXIgc2VjdXJpdHkgdGVhbSB1bmVhc3lcbiAqICAgYW55d2F5KSwgT1IgdGhpcyB3b3VsZCBtZWFuIGFueSBidWlsZCBuZWVkcyBodW1hbiBjb25maXJtYXRpb24gd2hpY2ggbWVhbnMgc2xvd1xuICogICBmZWVkYmFjay5cbiAqIC0gVXNlIGEgYHB1bGxfcmVxdWVzdGAgZm9yIGEgcmVndWxhciBmYXN0LWZlZWRiYWNrIGJ1aWxkLCBhbmQgYSBzZXBhcmF0ZVxuICogICBgcHVsbF9yZXF1ZXN0X3RhcmdldGAgZm9yIHRoZSBpbnRlZyB0ZXN0cy4gVGhpcyBtZWFucyB3ZSdyZSBidWlsZGluZyB0d2ljZS5cbiAqXG4gKiBVbHRpbWF0ZWx5LCBvdXIgYnVpbGQgaXNuJ3QgaGVhdnkgZW5vdWdoIHRvIHB1dCBpbiBhIGxvdCBvZiBlZmZvcnQgZGVkdXBpbmdcbiAqIGl0LCBzbyB3ZSdsbCBnbyB3aXRoIHRoZSBzaW1wbGVzdCBzb2x1dGlvbiB3aGljaCBpcyB0aGUgbGFzdCBvbmU6IDJcbiAqIGluZGVwZW5kZW50IHdvcmtmbG93cy5cbiAqXG4gKiBwcm9qZW4gZG9lc24ndCBtYWtlIGl0IGVhc3kgdG8gY29weSB0aGUgcmVsZXZhbnQgcGFydHMgb2YgdGhlICdidWlsZCcgd29ya2Zsb3csXG4gKiBzbyB0aGV5J3JlIHVuZm9ydHVuYXRlbHkgZHVwbGljYXRlZCBoZXJlLlxuICovXG5leHBvcnQgY2xhc3MgQ2RrQ2xpSW50ZWdUZXN0c1dvcmtmbG93IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocmVwbzogamF2YXNjcmlwdC5Ob2RlUHJvamVjdCwgcHJvcHM6IENka0NsaUludGVnVGVzdHNXb3JrZmxvd1Byb3BzKSB7XG4gICAgc3VwZXIocmVwbyk7XG5cbiAgICBjb25zdCBidWlsZFdvcmtmbG93ID0gcmVwby5idWlsZFdvcmtmbG93O1xuICAgIGNvbnN0IHJ1blRlc3RzV29ya2Zsb3cgPSByZXBvLmdpdGh1Yj8uYWRkV29ya2Zsb3coJ2ludGVnJyk7XG4gICAgaWYgKCFidWlsZFdvcmtmbG93IHx8ICFydW5UZXN0c1dvcmtmbG93KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGJ1aWxkIGFuZCBydW4gdGVzdHMgd29ya2Zsb3cnKTtcbiAgICB9XG4gICAgKChidWlsZFdvcmtmbG93IGFzIGFueSkud29ya2Zsb3cgYXMgZ2l0aHViLkdpdGh1YldvcmtmbG93KTtcblxuICAgIHByb3BzLmFsbG93VXBzdHJlYW1WZXJzaW9ucz8uZm9yRWFjaCgocGFjaykgPT4ge1xuICAgICAgaWYgKCFwcm9wcy5sb2NhbFBhY2thZ2VzLmluY2x1ZGVzKHBhY2spKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUGFja2FnZSBpbiBhbGxvd1Vwc3RyZWFtVmVyc2lvbnMgYnV0IG5vdCBpbiBsb2NhbFBhY2thZ2VzOiAke3BhY2t9YCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBsZXQgbWF4V29ya2Vyc0FyZyA9ICcnO1xuICAgIGlmIChwcm9wcy5tYXhXb3JrZXJzKSB7XG4gICAgICBtYXhXb3JrZXJzQXJnID0gYCAtLW1heFdvcmtlcnM9JHtwcm9wcy5tYXhXb3JrZXJzfWA7XG4gICAgfVxuXG4gICAgcnVuVGVzdHNXb3JrZmxvdy5vbih7XG4gICAgICBwdWxsUmVxdWVzdFRhcmdldDoge1xuICAgICAgICBicmFuY2hlczogWydtYWluJ10sXG4gICAgICB9LFxuICAgICAgLy8gTmVlZHMgdG8gdHJpZ2dlciBhbmQgcmVwb3J0IHN1Y2Nlc3Mgb24gbWVyZ2UgcXVldWUgYnVpbGRzIGFzIHdlbGxcbiAgICAgIG1lcmdlR3JvdXA6IHt9LFxuICAgICAgLy8gTmV2ZXIgaHVydHMgdG8gYmUgYWJsZSB0byBydW4gdGhpcyBtYW51YWxseVxuICAgICAgd29ya2Zsb3dEaXNwYXRjaDoge30sXG4gICAgfSk7XG4gICAgLy8gVGhlICdidWlsZCcgcGFydCBydW5zIG9uIHRoZSAnaW50ZWctYXBwcm92YWwnIGVudmlyb25tZW50LCB3aGljaCByZXF1aXJlc1xuICAgIC8vIGFwcHJvdmFsLiBUaGUgYWN0dWFsIHJ1bnMgYWNjZXNzIHRoZSByZWFsIGVudmlyb25tZW50LCBub3QgcmVxdWlyaW5nIGFwcHJvdmFsXG4gICAgLy8gYW55bW9yZS5cbiAgICAvL1xuICAgIC8vIFRoaXMgaXMgZm9yIDIgcmVhc29uczpcbiAgICAvLyAtIFRoZSBidWlsZCBqb2IgaXMgdGhlIGZpcnN0IG9uZSB0aGF0IHJ1bnMuIFRoYXQgbWVhbnMgeW91IGdldCBhc2tlZCBhcHByb3ZhbFxuICAgIC8vICAgaW1tZWRpYXRlbHkgYWZ0ZXIgcHVzaCwgaW5zdGVhZCBvZiA1IG1pbnV0ZXMgbGF0ZXIgYWZ0ZXIgdGhlIGJ1aWxkIGNvbXBsZXRlcy5cbiAgICAvLyAtIFRoZSBidWlsZCBqb2IgaXMgb25seSBvbmUgam9iLCB2ZXJzdXMgdGhlIHRlc3RzIHdoaWNoIGFyZSBhIG1hdHJpeCBidWlsZC5cbiAgICAvLyAgIElmIHRoZSBtYXRyaXggdGVzdCBqb2IgbmVlZHMgYXBwcm92YWwsIHRoZSBQdWxsIFJlcXVlc3QgdGltZWxpbmUgZ2V0cyBzcGFtbWVkXG4gICAgLy8gICB3aXRoIGFuIGFwcHJvdmFsIHJlcXVlc3QgZm9yIGV2ZXJ5IGluZGl2aWR1YWwgcnVuLlxuICAgIGNvbnN0IEpPQl9QUkVQQVJFID0gJ3ByZXBhcmUnO1xuICAgIHJ1blRlc3RzV29ya2Zsb3cuYWRkSm9iKEpPQl9QUkVQQVJFLCB7XG4gICAgICBlbnZpcm9ubWVudDogcHJvcHMuYXBwcm92YWxFbnZpcm9ubWVudCxcbiAgICAgIHJ1bnNPbjogW3Byb3BzLmJ1aWxkUnVuc09uXSxcbiAgICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgIGNvbnRlbnRzOiBnaXRodWIud29ya2Zsb3dzLkpvYlBlcm1pc3Npb24uUkVBRCxcbiAgICAgIH0sXG4gICAgICBlbnY6IHtcbiAgICAgICAgQ0k6ICd0cnVlJyxcbiAgICAgIH0sXG4gICAgICAvLyBEb24ndCBydW4gYWdhaW4gb24gdGhlIG1lcmdlIHF1ZXVlLCB3ZSBhbHJlYWR5IGdvdCBjb25maXJtYXRpb24gdGhhdCBpdCB3b3JrcyBhbmQgdGhlXG4gICAgICAvLyB0ZXN0cyBhcmUgcXVpdGUgZXhwZW5zaXZlLlxuICAgICAgaWY6IGBnaXRodWIuZXZlbnRfbmFtZSAhPSAnbWVyZ2VfZ3JvdXAnICYmICR7Tk9UX0ZMQUdHRURfRVhQUn1gLFxuICAgICAgc3RlcHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdDaGVja291dCcsXG4gICAgICAgICAgdXNlczogJ2FjdGlvbnMvY2hlY2tvdXRAdjQnLFxuICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgIC8vIElNUE9SVEFOVCEgVGhpcyBtdXN0IGJlIGBoZWFkLnNoYWAgbm90IGBoZWFkLnJlZmAsIG90aGVyd2lzZSB3ZVxuICAgICAgICAgICAgLy8gYXJlIHZ1bG5lcmFibGUgdG8gYSBUT0NUT1UgYXR0YWNrLlxuICAgICAgICAgICAgcmVmOiAnJHt7IGdpdGh1Yi5ldmVudC5wdWxsX3JlcXVlc3QuaGVhZC5zaGEgfX0nLFxuICAgICAgICAgICAgcmVwb3NpdG9yeTogJyR7eyBnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LmhlYWQucmVwby5mdWxsX25hbWUgfX0nLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIC8vIFdlIHVzZWQgdG8gZmV0Y2ggdGFncyBmcm9tIHRoZSByZXBvIHVzaW5nICdjaGVja291dCcsIGJ1dCBpZiBpdCdzIGEgZm9ya1xuICAgICAgICAvLyB0aGUgdGFncyB3b24ndCBiZSB0aGVyZSwgc28gd2UgaGF2ZSB0byBmZXRjaCB0aGVtIGZyb20gdXBzdHJlYW0uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoZSB0YWdzIGFyZSBuZWNlc3NhcnkgdG8gcmVhbGlzdGljYWxseSBidW1wIHZlcnNpb25zXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnRmV0Y2ggdGFncyBmcm9tIG9yaWdpbiByZXBvJyxcbiAgICAgICAgICBydW46IFtcbiAgICAgICAgICAgIC8vIENhbiBiZSBlaXRoZXIgYXdzL2F3cy1jZGstY2xpIG9yIGF3cy9hd3MtY2RrLWNsaS10ZXN0aW5nXG4gICAgICAgICAgICAvLyAoTXVzdCBjbG9uZSBvdmVyIEhUVFBTIGJlY2F1c2Ugd2UgaGF2ZSBubyBTU0ggYXV0aCBzZXQgdXApXG4gICAgICAgICAgICBgZ2l0IHJlbW90ZSBhZGQgdXBzdHJlYW0gaHR0cHM6Ly9naXRodWIuY29tLyR7cHJvcHMuc291cmNlUmVwb30uZ2l0YCxcbiAgICAgICAgICAgICdnaXQgZmV0Y2ggdXBzdHJlYW0gXFwncmVmcy90YWdzLyo6cmVmcy90YWdzLypcXCcnLFxuICAgICAgICAgIF0uam9pbignXFxuJyksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnU2V0dXAgTm9kZS5qcycsXG4gICAgICAgICAgdXNlczogJ2FjdGlvbnMvc2V0dXAtbm9kZUB2NCcsXG4gICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgJ25vZGUtdmVyc2lvbic6ICdsdHMvKicsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdJbnN0YWxsIGRlcGVuZGVuY2llcycsXG4gICAgICAgICAgcnVuOiAneWFybiBpbnN0YWxsIC0tY2hlY2stZmlsZXMnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ0J1bXAgdG8gcmVhbGlzdGljIHZlcnNpb25zJyxcbiAgICAgICAgICBydW46ICd5YXJuIHdvcmtzcGFjZXMgcnVuIGJ1bXAnLFxuICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgVEVTVElOR19DQU5ESURBVEU6ICd0cnVlJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ2J1aWxkJyxcbiAgICAgICAgICBydW46ICducHggcHJvamVuIGJ1aWxkJyxcbiAgICAgICAgICBlbnY6IHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIHByZXZlbnQgcHJvamVuIGZyb20gcmVzZXR0aW5nIHRoZSB2ZXJzaW9uIG51bWJlcnMgdG9cbiAgICAgICAgICAgIC8vIDAuMC4wIGR1cmluZyBpdHMgc3ludGhlc2lzLlxuICAgICAgICAgICAgUkVMRUFTRTogJ3RydWUnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnVXBsb2FkIGFydGlmYWN0JyxcbiAgICAgICAgICB1c2VzOiAnYWN0aW9ucy91cGxvYWQtYXJ0aWZhY3RAdjQuNC4wJyxcbiAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICBuYW1lOiAnYnVpbGQtYXJ0aWZhY3QnLFxuICAgICAgICAgICAgcGF0aDogJ3BhY2thZ2VzLyoqL2Rpc3QvanMvKi50Z3onLFxuICAgICAgICAgICAgb3ZlcndyaXRlOiAndHJ1ZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBjb25zdCB2ZXJkYWNjaW9Db25maWcgPSB7XG4gICAgICBzdG9yYWdlOiAnLi9zdG9yYWdlJyxcbiAgICAgIGF1dGg6IHsgaHRwYXNzd2Q6IHsgZmlsZTogJy4vaHRwYXNzd2QnIH0gfSxcbiAgICAgIHVwbGlua3M6IHsgbnBtanM6IHsgdXJsOiAnaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvJyB9IH0sXG4gICAgICBwYWNrYWdlczoge30gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgcGFjayBvZiBwcm9wcy5sb2NhbFBhY2thZ2VzKSB7XG4gICAgICBjb25zdCBhbGxvd1Vwc3RyZWFtID0gcHJvcHMuYWxsb3dVcHN0cmVhbVZlcnNpb25zPy5pbmNsdWRlcyhwYWNrKTtcblxuICAgICAgdmVyZGFjY2lvQ29uZmlnLnBhY2thZ2VzW3BhY2tdID0ge1xuICAgICAgICBhY2Nlc3M6ICckYWxsJyxcbiAgICAgICAgcHVibGlzaDogJyRhbGwnLFxuICAgICAgICBwcm94eTogYWxsb3dVcHN0cmVhbSA/ICducG1qcycgOiAnbm9uZScsXG4gICAgICB9O1xuICAgIH07XG4gICAgdmVyZGFjY2lvQ29uZmlnLnBhY2thZ2VzWycqKiddID0ge1xuICAgICAgYWNjZXNzOiAnJGFsbCcsXG4gICAgICBwcm94eTogJ25wbWpzJyxcbiAgICB9O1xuXG4gICAgLy8gYmFzaCBvbmx5IGV4cGFuZHMgey4uLn0gaWYgdGhlcmUncyBhICwgaW4gdGhlcmUsIG90aGVyd2lzZSBpdCB3aWxsIGxlYXZlIHRoZVxuICAgIC8vIGJyYWNlcyBpbiBsaXRlcmFsbHkuIFNvIHdlIG5lZWQgdG8gZG8gY2FzZSBhbmFseXNpcyBoZXJlLiBUaGFua3MsIEkgaGF0ZSBpdC5cbiAgICBjb25zdCB0YXJiYWxsQmFzaEV4cHIgPSBwcm9wcy5sb2NhbFBhY2thZ2VzLmxlbmd0aCA9PT0gMVxuICAgICAgPyBgcGFja2FnZXMvJHtwcm9wcy5sb2NhbFBhY2thZ2VzWzBdfS9kaXN0L2pzLyoudGd6YFxuICAgICAgOiBgcGFja2FnZXMveyR7cHJvcHMubG9jYWxQYWNrYWdlcy5qb2luKCcsJyl9fS9kaXN0L2pzLyoudGd6YDtcblxuICAgIC8vIFdlIGNyZWF0ZSBhIG1hdHJpeCBqb2IgZm9yIHRoZSB0ZXN0LlxuICAgIC8vIFRoaXMgam9iIHdpbGwgcnVuIGFsbCB0aGUgZGlmZmVyZW50IHRlc3Qgc3VpdGVzIGluIHBhcmFsbGVsLlxuICAgIGNvbnN0IEpPQl9JTlRFR19NQVRSSVggPSAnaW50ZWdfbWF0cml4JztcbiAgICBydW5UZXN0c1dvcmtmbG93LmFkZEpvYihKT0JfSU5URUdfTUFUUklYLCB7XG4gICAgICBlbnZpcm9ubWVudDogcHJvcHMudGVzdEVudmlyb25tZW50LFxuICAgICAgcnVuc09uOiBbcHJvcHMudGVzdFJ1bnNPbl0sXG4gICAgICBuZWVkczogW0pPQl9QUkVQQVJFXSxcbiAgICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgIGNvbnRlbnRzOiBnaXRodWIud29ya2Zsb3dzLkpvYlBlcm1pc3Npb24uUkVBRCxcbiAgICAgICAgaWRUb2tlbjogZ2l0aHViLndvcmtmbG93cy5Kb2JQZXJtaXNzaW9uLldSSVRFLFxuICAgICAgfSxcbiAgICAgIGVudjoge1xuICAgICAgICAvLyBPdGhlcndpc2UgTWF2ZW4gaXMgdG9vIG5vaXN5XG4gICAgICAgIE1BVkVOX0FSR1M6ICctLW5vLXRyYW5zZmVyLXByb2dyZXNzJyxcbiAgICAgICAgLy8gVGhpcyBpcyBub3QgYWN0dWFsbHkgYSBjYW5hcnksIGJ1dCB0aGlzIHByZXZlbnRzIHRoZSB0ZXN0cyBmcm9tIG1ha2luZ1xuICAgICAgICAvLyBhc3N1bXB0aW9ucyBhYm91dCB0aGUgYXZhaWxhYmlsaXR5IG9mIHNvdXJjZSBwYWNrYWdlcy5cbiAgICAgICAgSVNfQ0FOQVJZOiAndHJ1ZScsXG4gICAgICAgIENJOiAndHJ1ZScsXG4gICAgICAgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIG5ldyB2ZXJzaW9uaW5nIG9mIEBhd3MtY2RrL2NsaS1saWItYWxwaGFcbiAgICAgICAgLy8gbWF0Y2hlcyB0aGUgQ0xJIGFuZCBub3QgdGhlIGZyYW1ld29yay5cbiAgICAgICAgQ0xJX0xJQl9WRVJTSU9OX01JUlJPUlNfQ0xJOiAndHJ1ZScsXG4gICAgICB9LFxuICAgICAgLy8gRG9uJ3QgcnVuIGFnYWluIG9uIHRoZSBtZXJnZSBxdWV1ZSwgd2UgYWxyZWFkeSBnb3QgY29uZmlybWF0aW9uIHRoYXQgaXQgd29ya3MgYW5kIHRoZVxuICAgICAgLy8gdGVzdHMgYXJlIHF1aXRlIGV4cGVuc2l2ZS5cbiAgICAgIGlmOiBgZ2l0aHViLmV2ZW50X25hbWUgIT0gJ21lcmdlX2dyb3VwJyAmJiAke05PVF9GTEFHR0VEX0VYUFJ9YCxcbiAgICAgIHN0cmF0ZWd5OiB7XG4gICAgICAgIGZhaWxGYXN0OiBmYWxzZSxcbiAgICAgICAgbWF0cml4OiB7XG4gICAgICAgICAgZG9tYWluOiB7XG4gICAgICAgICAgICBzdWl0ZTogW1xuICAgICAgICAgICAgICAnY2xpLWludGVnLXRlc3RzJyxcbiAgICAgICAgICAgICAgJ2luaXQtY3NoYXJwJyxcbiAgICAgICAgICAgICAgJ2luaXQtZnNoYXJwJyxcbiAgICAgICAgICAgICAgJ2luaXQtZ28nLFxuICAgICAgICAgICAgICAnaW5pdC1qYXZhJyxcbiAgICAgICAgICAgICAgJ2luaXQtamF2YXNjcmlwdCcsXG4gICAgICAgICAgICAgICdpbml0LXB5dGhvbicsXG4gICAgICAgICAgICAgICdpbml0LXR5cGVzY3JpcHQtYXBwJyxcbiAgICAgICAgICAgICAgJ2luaXQtdHlwZXNjcmlwdC1saWInLFxuICAgICAgICAgICAgICAndG9vbC1pbnRlZ3JhdGlvbnMnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHN0ZXBzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnRG93bmxvYWQgYnVpbGQgYXJ0aWZhY3RzJyxcbiAgICAgICAgICB1c2VzOiAnYWN0aW9ucy9kb3dubG9hZC1hcnRpZmFjdEB2NCcsXG4gICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgbmFtZTogJ2J1aWxkLWFydGlmYWN0JyxcbiAgICAgICAgICAgIHBhdGg6ICdwYWNrYWdlcycsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdTZXQgdXAgSkRLIDE4JyxcbiAgICAgICAgICBpZjogJ21hdHJpeC5zdWl0ZSA9PSBcXCdpbml0LWphdmFcXCcgfHwgbWF0cml4LnN1aXRlID09IFxcJ2NsaS1pbnRlZy10ZXN0c1xcJycsXG4gICAgICAgICAgdXNlczogJ2FjdGlvbnMvc2V0dXAtamF2YUB2NCcsXG4gICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgJ2phdmEtdmVyc2lvbic6ICcxOCcsXG4gICAgICAgICAgICAnZGlzdHJpYnV0aW9uJzogJ2NvcnJldHRvJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ0F1dGhlbnRpY2F0ZSBWaWEgT0lEQyBSb2xlJyxcbiAgICAgICAgICBpZDogJ2NyZWRzJyxcbiAgICAgICAgICB1c2VzOiAnYXdzLWFjdGlvbnMvY29uZmlndXJlLWF3cy1jcmVkZW50aWFsc0B2NCcsXG4gICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgJ2F3cy1yZWdpb24nOiAndXMtZWFzdC0xJyxcbiAgICAgICAgICAgICdyb2xlLWR1cmF0aW9uLXNlY29uZHMnOiBwcm9wcy5lbmFibGVBdG1vc3BoZXJlID8gNjAgKiA2MCA6IDQgKiA2MCAqIDYwLFxuICAgICAgICAgICAgLy8gRXhwZWN0IHRoaXMgaW4gRW52aXJvbm1lbnQgVmFyaWFibGVzXG4gICAgICAgICAgICAncm9sZS10by1hc3N1bWUnOiBwcm9wcy5lbmFibGVBdG1vc3BoZXJlID8gcHJvcHMuZW5hYmxlQXRtb3NwaGVyZS5vaWRjUm9sZUFybiA6ICcke3sgdmFycy5BV1NfUk9MRV9UT19BU1NVTUVfRk9SX1RFU1RJTkcgfX0nLFxuICAgICAgICAgICAgJ3JvbGUtc2Vzc2lvbi1uYW1lJzogJ3J1bi10ZXN0c0Bhd3MtY2RrLWNsaS1pbnRlZycsXG4gICAgICAgICAgICAnb3V0cHV0LWNyZWRlbnRpYWxzJzogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIGluaXQgdGVzdHMgdG8gc3VjY2VlZCwgdGhleSBzZXQgdXAgYSBnaXQgcmVwby5cbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdTZXQgZ2l0IGlkZW50aXR5JyxcbiAgICAgICAgICBydW46IFtcbiAgICAgICAgICAgICdnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIubmFtZSBcImF3cy1jZGstY2xpLWludGVnXCInLFxuICAgICAgICAgICAgJ2dpdCBjb25maWcgLS1nbG9iYWwgdXNlci5lbWFpbCBcIm5vcmVwbHlAZXhhbXBsZS5jb21cIicsXG4gICAgICAgICAgXS5qb2luKCdcXG4nKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdJbnN0YWxsIFZlcmRhY2NpbycsXG4gICAgICAgICAgcnVuOiAnbnBtIGluc3RhbGwgLWcgdmVyZGFjY2lvIHBtMicsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnQ3JlYXRlIFZlcmRhY2NpbyBjb25maWcnLFxuICAgICAgICAgIHJ1bjogW1xuICAgICAgICAgICAgJ21rZGlyIC1wICRIT01FLy5jb25maWcvdmVyZGFjY2lvJyxcbiAgICAgICAgICAgIGBlY2hvICcke0pTT04uc3RyaW5naWZ5KHZlcmRhY2Npb0NvbmZpZyl9JyA+ICRIT01FLy5jb25maWcvdmVyZGFjY2lvL2NvbmZpZy55YW1sYCxcbiAgICAgICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ1N0YXJ0IFZlcmRhY2NpbycsXG4gICAgICAgICAgcnVuOiBbXG4gICAgICAgICAgICAncG0yIHN0YXJ0IHZlcmRhY2NpbyAtLSAtLWNvbmZpZyAkSE9NRS8uY29uZmlnL3ZlcmRhY2Npby9jb25maWcueWFtbCcsXG4gICAgICAgICAgICAnc2xlZXAgNSAjIFdhaXQgZm9yIFZlcmRhY2NpbyB0byBzdGFydCcsXG4gICAgICAgICAgXS5qb2luKCdcXG4nKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdDb25maWd1cmUgbnBtIHRvIHVzZSBsb2NhbCByZWdpc3RyeScsXG4gICAgICAgICAgcnVuOiBbXG4gICAgICAgICAgICAvLyBUaGlzIHRva2VuIGlzIGEgYm9ndXMgdG9rZW4uIEl0IGRvZXNuJ3QgcmVwcmVzZW50IGFueSBhY3R1YWwgc2VjcmV0LCBpdCBqdXN0IG5lZWRzIHRvIGV4aXN0LlxuICAgICAgICAgICAgJ2VjaG8gXFwnLy9sb2NhbGhvc3Q6NDg3My86X2F1dGhUb2tlbj1cIk1XUmpORFUzT1RFMU5UbGpZV1V5T1RGa01XSmtPR1V5WVRJd1pXTXdOVEk2WVRnd1pqa3lOREUwTnpnd1lXUXpOUT09XCJcXCcgPiB+Ly5ucG1yYycsXG4gICAgICAgICAgICAnZWNobyBcXCdyZWdpc3RyeT1odHRwOi8vbG9jYWxob3N0OjQ4NzMvXFwnID4+IH4vLm5wbXJjJyxcbiAgICAgICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ0ZpbmQgYW4gbG9jYWxseSBwdWJsaXNoIGFsbCB0YXJiYWxscycsXG4gICAgICAgICAgcnVuOiBbXG4gICAgICAgICAgICBgZm9yIHBrZyBpbiAke3RhcmJhbGxCYXNoRXhwcn07IGRvYCxcbiAgICAgICAgICAgICcgIG5wbSBwdWJsaXNoICRwa2cnLFxuICAgICAgICAgICAgJ2RvbmUnLFxuICAgICAgICAgIF0uam9pbignXFxuJyksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnRG93bmxvYWQgYW5kIGluc3RhbGwgdGhlIHRlc3QgYXJ0aWZhY3QnLFxuICAgICAgICAgIHJ1bjogW1xuICAgICAgICAgICAgJ25wbSBpbnN0YWxsIEBhd3MtY2RrLXRlc3RpbmcvY2xpLWludGVnJyxcbiAgICAgICAgICAgIC8vIE1vdmUgdGhlIGluc3RhbGxlZCBmaWxlcyB0byB0aGUgY3VycmVudCBkaXJlY3RvcnksIGJlY2F1c2UgYXNcbiAgICAgICAgICAgIC8vIGN1cnJlbnRseSBjb25maWd1cmVkIHRoZSB0ZXN0cyB3b24ndCBydW4gZnJvbSBhbiBpbnN0YWxsZWRcbiAgICAgICAgICAgIC8vIG5vZGVfbW9kdWxlcyBkaXJlY3RvcnkuXG4gICAgICAgICAgICAnbXYgLi9ub2RlX21vZHVsZXMvQGF3cy1jZGstdGVzdGluZy9jbGktaW50ZWcvKiAuJyxcbiAgICAgICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ0RldGVybWluZSBsYXRlc3QgcGFja2FnZSB2ZXJzaW9ucycsXG4gICAgICAgICAgaWQ6ICd2ZXJzaW9ucycsXG4gICAgICAgICAgcnVuOiBbXG4gICAgICAgICAgICAnQ0xJX1ZFUlNJT049JChjZCAke1RNUERJUjotL3RtcH0gJiYgbnBtIHZpZXcgYXdzLWNkayB2ZXJzaW9uKScsXG4gICAgICAgICAgICAnZWNobyBcIkNMSSB2ZXJzaW9uOiAke0NMSV9WRVJTSU9OfVwiJyxcbiAgICAgICAgICAgICdlY2hvIFwiY2xpX3ZlcnNpb249JHtDTElfVkVSU0lPTn1cIiA+PiAkR0lUSFVCX09VVFBVVCcsXG4gICAgICAgICAgICAnTElCX1ZFUlNJT049JChjZCAke1RNUERJUjotL3RtcH0gJiYgbnBtIHZpZXcgYXdzLWNkay1saWIgdmVyc2lvbiknLFxuICAgICAgICAgICAgJ2VjaG8gXCJsaWIgdmVyc2lvbjogJHtMSUJfVkVSU0lPTn1cIicsXG4gICAgICAgICAgICAnZWNobyBcImxpYl92ZXJzaW9uPSR7TElCX1ZFUlNJT059XCIgPj4gJEdJVEhVQl9PVVRQVVQnLFxuICAgICAgICAgIF0uam9pbignXFxuJyksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnUnVuIHRoZSB0ZXN0IHN1aXRlOiAke3sgbWF0cml4LnN1aXRlIH19JyxcbiAgICAgICAgICBydW46IFtcbiAgICAgICAgICAgIGBiaW4vcnVuLXN1aXRlJHttYXhXb3JrZXJzQXJnfSAtLXVzZS1jbGktcmVsZWFzZT1cXCR7eyBzdGVwcy52ZXJzaW9ucy5vdXRwdXRzLmNsaV92ZXJzaW9uIH19IC0tZnJhbWV3b3JrLXZlcnNpb249XFwke3sgc3RlcHMudmVyc2lvbnMub3V0cHV0cy5saWJfdmVyc2lvbiB9fSBcXCR7eyBtYXRyaXguc3VpdGUgfX1gLFxuICAgICAgICAgIF0uam9pbignXFxuJyksXG4gICAgICAgICAgZW52OiB7XG4gICAgICAgICAgICBKU0lJX1NJTEVOQ0VfV0FSTklOR19ERVBSRUNBVEVEX05PREVfVkVSU0lPTjogJ3RydWUnLFxuICAgICAgICAgICAgSlNJSV9TSUxFTkNFX1dBUk5JTkdfVU5URVNURURfTk9ERV9WRVJTSU9OOiAndHJ1ZScsXG4gICAgICAgICAgICBKU0lJX1NJTEVOQ0VfV0FSTklOR19LTk9XTl9CUk9LRU5fTk9ERV9WRVJTSU9OOiAndHJ1ZScsXG4gICAgICAgICAgICBET0NLRVJIVUJfRElTQUJMRUQ6ICd0cnVlJyxcbiAgICAgICAgICAgIC4uLihwcm9wcy5lbmFibGVBdG1vc3BoZXJlID9cbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIENES19JTlRFR19BVE1PU1BIRVJFX0VOQUJMRUQ6ICd0cnVlJyxcbiAgICAgICAgICAgICAgICBDREtfSU5URUdfQVRNT1NQSEVSRV9FTkRQT0lOVDogcHJvcHMuZW5hYmxlQXRtb3NwaGVyZS5lbmRwb2ludCxcbiAgICAgICAgICAgICAgICBDREtfSU5URUdfQVRNT1NQSEVSRV9QT09MOiBwcm9wcy5lbmFibGVBdG1vc3BoZXJlLnBvb2wsXG4gICAgICAgICAgICAgIH0gOlxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgQVdTX1JFR0lPTlM6IFsndXMtZWFzdC0yJywgJ2V1LXdlc3QtMScsICdldS1ub3J0aC0xJywgJ2FwLW5vcnRoZWFzdC0xJywgJ2FwLXNvdXRoLTEnXS5qb2luKCcsJyksXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgQ0RLX01BSk9SX1ZFUlNJT046ICcyJyxcbiAgICAgICAgICAgIFJFTEVBU0VfVEFHOiAnbGF0ZXN0JyxcbiAgICAgICAgICAgIEdJVEhVQl9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYSBqb2IgdGhhdCBjb2xsYXRlcyBhbGwgbWF0cml4IGpvYnMgaW50byBhIHNpbmdsZSBzdGF0dXNcbiAgICAvLyBUaGlzIGlzIHJlcXVpcmVkIHNvIHRoYXQgd2UgY2FuIHNldHVwIHJlcXVpcmVkIHN0YXR1cyBjaGVja3NcbiAgICAvLyBhbmQgaWYgd2UgZXZlciBjaGFuZ2UgdGhlIHRlc3QgbWF0cml4LCB3ZSBkb24ndCBuZWVkIHRvIHVwZGF0ZVxuICAgIC8vIHRoZSBzdGF0dXMgY2hlY2sgY29uZmlndXJhdGlvbi5cbiAgICBydW5UZXN0c1dvcmtmbG93LmFkZEpvYignaW50ZWcnLCB7XG4gICAgICBwZXJtaXNzaW9uczoge30sXG4gICAgICBydW5zT246IFtwcm9wcy50ZXN0UnVuc09uXSxcbiAgICAgIG5lZWRzOiBbSk9CX1BSRVBBUkUsIEpPQl9JTlRFR19NQVRSSVhdLFxuICAgICAgaWY6ICdhbHdheXMoKScsXG4gICAgICBzdGVwczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ0ludGVnIHRlc3QgcmVzdWx0JyxcbiAgICAgICAgICBydW46IGBlY2hvIFxcJHt7IG5lZWRzLiR7Sk9CX0lOVEVHX01BVFJJWH0ucmVzdWx0IH19YCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIC8vIERvbid0IGZhaWwgdGhlIGpvYiBpZiB0aGUgdGVzdCB3YXMgc3VjY2Vzc2Z1bCBvciBpbnRlbnRpb25hbGx5IHNraXBwZWRcbiAgICAgICAgICBpZjogYFxcJHt7ICEoY29udGFpbnMoZnJvbUpTT04oJ1tcInN1Y2Nlc3NcIiwgXCJza2lwcGVkXCJdJyksIG5lZWRzLiR7Sk9CX1BSRVBBUkV9LnJlc3VsdCkgJiYgY29udGFpbnMoZnJvbUpTT04oJ1tcInN1Y2Nlc3NcIiwgXCJza2lwcGVkXCJdJyksIG5lZWRzLiR7Sk9CX0lOVEVHX01BVFJJWH0ucmVzdWx0KSkgfX1gLFxuICAgICAgICAgIG5hbWU6ICdTZXQgc3RhdHVzIGJhc2VkIG9uIG1hdHJpeCBqb2InLFxuICAgICAgICAgIHJ1bjogJ2V4aXQgMScsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG59XG4iXX0=