@pipeline-builder/pipeline-manager 4.1.14 → 4.1.16

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.
Files changed (92) hide show
  1. package/config.yml +16 -37
  2. package/dist/boilerplate.js +10 -2
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +97 -79
  5. package/dist/commands/audit-stacks.js +3 -3
  6. package/dist/commands/create-pat.d.ts +2 -3
  7. package/dist/commands/create-pat.d.ts.map +1 -1
  8. package/dist/commands/create-pat.js +3 -4
  9. package/dist/commands/create-pipeline.d.ts.map +1 -1
  10. package/dist/commands/create-pipeline.js +198 -190
  11. package/dist/commands/list-pipelines.js +2 -2
  12. package/dist/commands/list-plugins.js +2 -2
  13. package/dist/commands/login.d.ts +2 -2
  14. package/dist/commands/login.js +3 -3
  15. package/dist/commands/new-plugin.d.ts +48 -5
  16. package/dist/commands/new-plugin.d.ts.map +1 -1
  17. package/dist/commands/new-plugin.js +261 -95
  18. package/dist/commands/plugin-lifecycle.d.ts +29 -0
  19. package/dist/commands/plugin-lifecycle.d.ts.map +1 -0
  20. package/dist/commands/plugin-lifecycle.js +147 -0
  21. package/dist/commands/provision.d.ts +42 -2
  22. package/dist/commands/provision.d.ts.map +1 -1
  23. package/dist/commands/provision.js +184 -147
  24. package/dist/commands/publish-plugin.d.ts +62 -0
  25. package/dist/commands/publish-plugin.d.ts.map +1 -0
  26. package/dist/commands/publish-plugin.js +224 -0
  27. package/dist/commands/redrive-events.d.ts +1 -1
  28. package/dist/commands/redrive-events.js +2 -2
  29. package/dist/commands/store-token.d.ts +46 -1
  30. package/dist/commands/store-token.d.ts.map +1 -1
  31. package/dist/commands/store-token.js +127 -102
  32. package/dist/commands/test-plugin.d.ts +72 -0
  33. package/dist/commands/test-plugin.d.ts.map +1 -0
  34. package/dist/commands/test-plugin.js +285 -0
  35. package/dist/commands/upload-plugin.d.ts +6 -7
  36. package/dist/commands/upload-plugin.d.ts.map +1 -1
  37. package/dist/commands/upload-plugin.js +127 -189
  38. package/dist/commands/validate-plugin.d.ts +37 -4
  39. package/dist/commands/validate-plugin.d.ts.map +1 -1
  40. package/dist/commands/validate-plugin.js +129 -144
  41. package/dist/commands/validate-templates.d.ts.map +1 -1
  42. package/dist/commands/validate-templates.js +8 -9
  43. package/dist/config/plugin-catalog-assets.d.ts +13 -0
  44. package/dist/config/plugin-catalog-assets.d.ts.map +1 -0
  45. package/dist/config/plugin-catalog-assets.js +21 -0
  46. package/dist/config.yml +16 -37
  47. package/dist/lambda/token-renew-handler.d.ts.map +1 -1
  48. package/dist/lambda/token-renew-handler.js +109 -154
  49. package/dist/types/config.d.ts +2 -6
  50. package/dist/types/config.d.ts.map +1 -1
  51. package/dist/types/config.js +1 -1
  52. package/dist/types/plugin.d.ts +21 -0
  53. package/dist/types/plugin.d.ts.map +1 -1
  54. package/dist/types/plugin.js +1 -1
  55. package/dist/utils/aws-env.d.ts +1 -2
  56. package/dist/utils/aws-env.d.ts.map +1 -1
  57. package/dist/utils/aws-env.js +2 -3
  58. package/dist/utils/catalog-prompt.d.ts +26 -0
  59. package/dist/utils/catalog-prompt.d.ts.map +1 -0
  60. package/dist/utils/catalog-prompt.js +113 -0
  61. package/dist/utils/command-utils.d.ts.map +1 -1
  62. package/dist/utils/command-utils.js +14 -3
  63. package/dist/utils/config-loader.d.ts.map +1 -1
  64. package/dist/utils/config-loader.js +4 -6
  65. package/dist/utils/credential-store.d.ts +16 -0
  66. package/dist/utils/credential-store.d.ts.map +1 -1
  67. package/dist/utils/credential-store.js +57 -2
  68. package/dist/utils/deploy-runner.d.ts.map +1 -1
  69. package/dist/utils/deploy-runner.js +7 -2
  70. package/dist/utils/pipeline-config.d.ts +1 -2
  71. package/dist/utils/pipeline-config.d.ts.map +1 -1
  72. package/dist/utils/pipeline-config.js +1 -1
  73. package/dist/utils/plugin-docker.d.ts +44 -0
  74. package/dist/utils/plugin-docker.d.ts.map +1 -0
  75. package/dist/utils/plugin-docker.js +71 -0
  76. package/dist/utils/plugin-package.d.ts +40 -0
  77. package/dist/utils/plugin-package.d.ts.map +1 -0
  78. package/dist/utils/plugin-package.js +159 -0
  79. package/dist/utils/plugin-resolver.d.ts.map +1 -1
  80. package/dist/utils/plugin-resolver.js +43 -29
  81. package/dist/utils/plugin-scan.d.ts +22 -0
  82. package/dist/utils/plugin-scan.d.ts.map +1 -0
  83. package/dist/utils/plugin-scan.js +52 -0
  84. package/dist/utils/plugin-zip.d.ts +15 -0
  85. package/dist/utils/plugin-zip.d.ts.map +1 -0
  86. package/dist/utils/plugin-zip.js +96 -0
  87. package/dist/utils/registry.d.ts +15 -0
  88. package/dist/utils/registry.d.ts.map +1 -1
  89. package/dist/utils/registry.js +17 -2
  90. package/dist/utils/service-account.d.ts.map +1 -1
  91. package/dist/utils/service-account.js +9 -10
  92. package/package.json +45 -8
@@ -16,6 +16,198 @@ import { fetchPipelineProps } from '../utils/pipeline-config.js';
16
16
  import { extractSingleResponse } from '../utils/response-utils.js';
17
17
  import { relaxTlsForCli } from '../utils/tls.js';
18
18
  const { bold, cyan, dim, green } = pico;
19
+ /** Validate the props file (exists, size cap) and parse it as a JSON object. */
20
+ function readPropsFile(file) {
21
+ console.log('');
22
+ printSection('File Validation');
23
+ if (!fs.existsSync(file)) {
24
+ printError('Properties file not found', { path: file });
25
+ throw new ValidationError(`File not found: ${file}`, 'file');
26
+ }
27
+ const fileExt = path.extname(file).toLowerCase();
28
+ if (fileExt !== '.json') {
29
+ printWarning('File extension is not .json', { extension: fileExt });
30
+ }
31
+ const fileStats = fs.statSync(file);
32
+ if (fileStats.size > FILE_SIZE_LIMITS.PIPELINE_PROPS) {
33
+ printError('Properties file is too large', {
34
+ size: formatFileSize(fileStats.size),
35
+ limit: formatFileSize(FILE_SIZE_LIMITS.PIPELINE_PROPS),
36
+ });
37
+ throw new ValidationError('Properties file exceeds size limit', 'file');
38
+ }
39
+ printSuccess('File validation passed');
40
+ printKeyValue({
41
+ 'File Path': file,
42
+ 'File Size': formatFileSize(fileStats.size),
43
+ 'Extension': fileExt,
44
+ });
45
+ console.log('');
46
+ printInfo('Reading pipeline properties...');
47
+ let props;
48
+ try {
49
+ props = JSON.parse(fs.readFileSync(file, 'utf-8'));
50
+ }
51
+ catch (error) {
52
+ printError('Invalid JSON in properties file', {
53
+ error: errorMessage(error),
54
+ hint: 'Ensure the file contains valid JSON syntax',
55
+ });
56
+ throw new ValidationError('Properties file must contain valid JSON', 'file');
57
+ }
58
+ if (typeof props !== 'object' || props === null) {
59
+ printError('Invalid properties format', {
60
+ type: typeof props,
61
+ hint: 'Properties must be a JSON object',
62
+ });
63
+ throw new ValidationError('Properties must be a valid object', 'file');
64
+ }
65
+ const propCount = Object.keys(props).length;
66
+ printSuccess('Properties parsed successfully');
67
+ printKeyValue({
68
+ 'Total Keys': propCount.toString(),
69
+ 'Sample Keys': Object.keys(props).slice(0, 5).join(', ') + (propCount > 5 ? '...' : ''),
70
+ });
71
+ if (propCount === 0) {
72
+ printWarning('Properties object is empty - pipeline will have no configuration');
73
+ }
74
+ return props;
75
+ }
76
+ /**
77
+ * Build the create request. Project & organization prefer the CLI flags and
78
+ * fall back to values embedded in the props file (builderProps).
79
+ */
80
+ function buildCreatePayload(options, props) {
81
+ const resolvedProject = options.project ?? props.project;
82
+ const resolvedOrganization = options.organization ?? props.organization;
83
+ if (!resolvedProject) {
84
+ printError('Project is required', {
85
+ hint: 'Provide -p/--project flag or include "project" in the props file',
86
+ });
87
+ throw new ValidationError('Project is required', 'project');
88
+ }
89
+ if (!resolvedOrganization) {
90
+ printError('Organization is required', {
91
+ hint: 'Provide -o/--organization flag or include "organization" in the props file',
92
+ });
93
+ throw new ValidationError('Organization is required', 'organization');
94
+ }
95
+ // Resolve pipelineName with the shared default (mirrors pipeline-core's
96
+ // pipeline-configuration.ts) so create + registry + CDK all agree.
97
+ const resolvedPipelineName = options.name
98
+ ?? props.pipelineName
99
+ ?? defaultPipelineName(resolvedOrganization, resolvedProject);
100
+ const payload = {
101
+ project: resolvedProject,
102
+ organization: resolvedOrganization,
103
+ pipelineName: resolvedPipelineName,
104
+ props,
105
+ };
106
+ if (options.visibility)
107
+ payload.visibility = options.visibility;
108
+ if (options.default !== undefined)
109
+ payload.isDefault = options.default;
110
+ if (options.active !== undefined)
111
+ payload.isActive = options.active;
112
+ return payload;
113
+ }
114
+ /** Print the request that would be sent, for `--dry-run`. */
115
+ function printDryRun(options, payload) {
116
+ console.log('');
117
+ printSection('Dry Run - Request Preview');
118
+ console.log(JSON.stringify(payload, null, 2));
119
+ console.log('');
120
+ printSuccess('✓ Validation complete - no pipeline created (dry run mode)');
121
+ console.log('');
122
+ if (options.deploy) {
123
+ printInfo('With --deploy, the pipeline would be deployed via CDK after creation', {
124
+ profile: options.profile || '(default)',
125
+ region: options.region || '(default)',
126
+ requireApproval: options.requireApproval,
127
+ });
128
+ }
129
+ printInfo('To create the pipeline, run the command without --dry-run');
130
+ }
131
+ /** Print the created pipeline and save it to `./output/pipeline-<id>.json`. */
132
+ function reportCreatedPipeline(pipeline, executionId, requestDuration, startTime) {
133
+ console.log('');
134
+ printSection('✓ Pipeline Created Successfully');
135
+ printKeyValue({
136
+ 'Pipeline ID': green(bold(pipeline.id)),
137
+ 'Project': pipeline.project,
138
+ 'Organization': pipeline.organization,
139
+ 'Name': pipeline.pipelineName || '(not set)',
140
+ 'Visibility': pipeline.visibility || 'org',
141
+ 'Default': pipeline.isDefault ? 'Yes' : 'No',
142
+ 'Active': pipeline.isActive ? 'Yes' : 'No',
143
+ 'Properties': pipeline.props ? `${Object.keys(pipeline.props).length} keys` : '(not returned)',
144
+ });
145
+ if (pipeline.createdAt) {
146
+ console.log('');
147
+ printKeyValue({ 'Created At': pipeline.createdAt });
148
+ }
149
+ console.log('');
150
+ printKeyValue({
151
+ 'Execution ID': executionId,
152
+ 'Request Duration': formatDuration(requestDuration),
153
+ 'Total Duration': formatDuration(Date.now() - startTime),
154
+ });
155
+ const outputDir = './output';
156
+ ensureOutputDirectory(outputDir);
157
+ const outputFile = path.join(outputDir, `pipeline-${pipeline.id}.json`);
158
+ fs.writeFileSync(outputFile, JSON.stringify(pipeline, null, 2));
159
+ console.log('');
160
+ printSuccess('Pipeline details saved to file');
161
+ printKeyValue({
162
+ 'Output File': outputFile,
163
+ 'File Size': formatFileSize(fs.statSync(outputFile).size),
164
+ });
165
+ }
166
+ /**
167
+ * `--deploy`: run the same CDK deploy + ARN registration as `pipeline deploy
168
+ * --id`. The record already exists and is authoritative: if the deploy fails it
169
+ * is KEPT and the exact retry is surfaced rather than rolled back (never
170
+ * false-green).
171
+ */
172
+ async function deployCreatedPipeline(options, pipelineId, executionId, debug) {
173
+ console.log('');
174
+ printSection('Deploying Pipeline');
175
+ try {
176
+ // Deploy touches the AWS SDK + the CDK synth subprocess; relax TLS the
177
+ // same way `deploy` does (refused in production by relaxTlsForCli).
178
+ relaxTlsForCli(options.verifySsl, printWarning);
179
+ // The async client adds --store-tokens (Secrets Manager) support and
180
+ // backs BOTH the props fetch and the registry callback.
181
+ const deployClient = await createAuthenticatedClientAsync(options);
182
+ const deployConfig = deployClient.getConfig();
183
+ // Re-fetch the just-created pipeline so plugins are resolved and the
184
+ // registry host is baked EXACTLY as `deploy --id` does — no drift.
185
+ const fetched = await fetchPipelineProps(deployClient, pipelineId);
186
+ await runDeploy({
187
+ pipeline: fetched.pipeline,
188
+ propsWithIds: fetched.propsWithIds,
189
+ profile: options.profile,
190
+ region: options.region,
191
+ requireApproval: options.requireApproval,
192
+ output: options.output,
193
+ debug,
194
+ executionId,
195
+ platformClient: deployClient,
196
+ platformPipelineUrl: deployConfig.api.pipelineUrl,
197
+ platformBaseUrl: deployConfig.api.baseUrl,
198
+ });
199
+ }
200
+ catch (deployError) {
201
+ printError('Pipeline was created but the deploy failed', {
202
+ pipelineId,
203
+ error: errorMessage(deployError),
204
+ retry: `pipeline-manager pipeline deploy --id ${pipelineId}`,
205
+ });
206
+ // Re-throw so the process exits non-zero. The record is intentionally
207
+ // retained — re-run the deploy with the command above.
208
+ throw deployError;
209
+ }
210
+ }
19
211
  /**
20
212
  * Registers the `create-pipeline` command with the CLI program.
21
213
  *
@@ -65,119 +257,10 @@ export function createPipeline(program) {
65
257
  });
66
258
  // Security warning for SSL verification disabled
67
259
  printSslWarning(options.verifySsl);
68
- console.log('');
69
- printSection('File Validation');
70
- // Validate file exists
71
- if (!fs.existsSync(options.file)) {
72
- printError('Properties file not found', { path: options.file });
73
- throw new ValidationError(`File not found: ${options.file}`, 'file');
74
- }
75
- // Check file extension
76
- const fileExt = path.extname(options.file).toLowerCase();
77
- if (fileExt !== '.json') {
78
- printWarning('File extension is not .json', { extension: fileExt });
79
- }
80
- const fileStats = fs.statSync(options.file);
81
- // Check file size
82
- if (fileStats.size > FILE_SIZE_LIMITS.PIPELINE_PROPS) {
83
- printError('Properties file is too large', {
84
- size: formatFileSize(fileStats.size),
85
- limit: formatFileSize(FILE_SIZE_LIMITS.PIPELINE_PROPS),
86
- });
87
- throw new ValidationError('Properties file exceeds size limit', 'file');
88
- }
89
- printSuccess('File validation passed');
90
- printKeyValue({
91
- 'File Path': options.file,
92
- 'File Size': formatFileSize(fileStats.size),
93
- 'Extension': fileExt,
94
- });
95
- // Read and parse properties file
96
- console.log('');
97
- printInfo('Reading pipeline properties...');
98
- const fileContent = fs.readFileSync(options.file, 'utf-8');
99
- let props;
100
- try {
101
- props = JSON.parse(fileContent);
102
- }
103
- catch (error) {
104
- printError('Invalid JSON in properties file', {
105
- error: errorMessage(error),
106
- hint: 'Ensure the file contains valid JSON syntax',
107
- });
108
- throw new ValidationError('Properties file must contain valid JSON', 'file');
109
- }
110
- // Validate properties structure
111
- if (typeof props !== 'object' || props === null) {
112
- printError('Invalid properties format', {
113
- type: typeof props,
114
- hint: 'Properties must be a JSON object',
115
- });
116
- throw new ValidationError('Properties must be a valid object', 'file');
117
- }
118
- const propCount = Object.keys(props).length;
119
- printSuccess('Properties parsed successfully');
120
- printKeyValue({
121
- 'Total Keys': propCount.toString(),
122
- 'Sample Keys': Object.keys(props).slice(0, 5).join(', ') + (propCount > 5 ? '...' : ''),
123
- });
124
- // Validate properties content
125
- if (propCount === 0) {
126
- printWarning('Properties object is empty - pipeline will have no configuration');
127
- }
128
- // Resolve project & organization: prefer CLI flags, fall back to
129
- // values embedded inside the props file (builderProps).
130
- const resolvedProject = options.project ?? props.project;
131
- const resolvedOrganization = options.organization ?? props.organization;
132
- if (!resolvedProject) {
133
- printError('Project is required', {
134
- hint: 'Provide -p/--project flag or include "project" in the props file',
135
- });
136
- throw new ValidationError('Project is required', 'project');
137
- }
138
- if (!resolvedOrganization) {
139
- printError('Organization is required', {
140
- hint: 'Provide -o/--organization flag or include "organization" in the props file',
141
- });
142
- throw new ValidationError('Organization is required', 'organization');
143
- }
144
- // Resolve pipelineName with the shared default (mirrors pipeline-core's
145
- // pipeline-configuration.ts) so create + registry + CDK all agree.
146
- const resolvedPipelineName = options.name
147
- ?? props.pipelineName
148
- ?? defaultPipelineName(resolvedOrganization, resolvedProject);
149
- const payload = {
150
- project: resolvedProject,
151
- organization: resolvedOrganization,
152
- pipelineName: resolvedPipelineName,
153
- props,
154
- };
155
- // Add optional fields only if provided
156
- if (options.visibility) {
157
- payload.visibility = options.visibility;
158
- }
159
- if (options.default !== undefined) {
160
- payload.isDefault = options.default;
161
- }
162
- if (options.active !== undefined) {
163
- payload.isActive = options.active;
164
- }
165
- // Dry run mode
260
+ const props = readPropsFile(options.file);
261
+ const payload = buildCreatePayload(options, props);
166
262
  if (options.dryRun) {
167
- console.log('');
168
- printSection('Dry Run - Request Preview');
169
- console.log(JSON.stringify(payload, null, 2));
170
- console.log('');
171
- printSuccess('✓ Validation complete - no pipeline created (dry run mode)');
172
- console.log('');
173
- if (options.deploy) {
174
- printInfo('With --deploy, the pipeline would be deployed via CDK after creation', {
175
- profile: options.profile || '(default)',
176
- region: options.region || '(default)',
177
- requireApproval: options.requireApproval,
178
- });
179
- }
180
- printInfo('To create the pipeline, run the command without --dry-run');
263
+ printDryRun(options, payload);
181
264
  return;
182
265
  }
183
266
  // Create authenticated API client
@@ -206,84 +289,9 @@ export function createPipeline(program) {
206
289
  });
207
290
  throw new Error('Pipeline creation failed - no valid pipeline data received');
208
291
  }
209
- console.log('');
210
- printSection('✓ Pipeline Created Successfully');
211
- // Display created pipeline info
212
- printKeyValue({
213
- 'Pipeline ID': green(bold(pipeline.id)),
214
- 'Project': pipeline.project,
215
- 'Organization': pipeline.organization,
216
- 'Name': pipeline.pipelineName || '(not set)',
217
- 'Visibility': pipeline.visibility || 'org',
218
- 'Default': pipeline.isDefault ? 'Yes' : 'No',
219
- 'Active': pipeline.isActive ? 'Yes' : 'No',
220
- 'Properties': pipeline.props ? `${Object.keys(pipeline.props).length} keys` : '(not returned)',
221
- });
222
- if (pipeline.createdAt) {
223
- console.log('');
224
- printKeyValue({
225
- 'Created At': pipeline.createdAt,
226
- });
227
- }
228
- // Performance metrics
229
- console.log('');
230
- printKeyValue({
231
- 'Execution ID': executionId,
232
- 'Request Duration': formatDuration(requestDuration),
233
- 'Total Duration': formatDuration(Date.now() - startTime),
234
- });
235
- // Save pipeline info to file
236
- const outputDir = './output';
237
- ensureOutputDirectory(outputDir);
238
- const outputFile = path.join(outputDir, `pipeline-${pipeline.id}.json`);
239
- fs.writeFileSync(outputFile, JSON.stringify(pipeline, null, 2));
240
- console.log('');
241
- printSuccess('Pipeline details saved to file');
242
- printKeyValue({
243
- 'Output File': outputFile,
244
- 'File Size': formatFileSize(fs.statSync(outputFile).size),
245
- });
246
- // ── Optional deploy (--deploy) ──
247
- // The record now exists and is authoritative. If the deploy fails we KEEP
248
- // it and surface the exact retry rather than rolling back (never false-green).
292
+ reportCreatedPipeline(pipeline, executionId, requestDuration, startTime);
249
293
  if (options.deploy) {
250
- console.log('');
251
- printSection('Deploying Pipeline');
252
- try {
253
- // Deploy touches the AWS SDK + the CDK synth subprocess; relax TLS the
254
- // same way `deploy` does (refused in production by relaxTlsForCli).
255
- relaxTlsForCli(options.verifySsl, printWarning);
256
- // The async client adds --store-tokens (Secrets Manager) support and
257
- // backs BOTH the props fetch and the registry callback.
258
- const deployClient = await createAuthenticatedClientAsync(options);
259
- const deployConfig = deployClient.getConfig();
260
- // Re-fetch the just-created pipeline so plugins are resolved and the
261
- // registry host is baked EXACTLY as `deploy --id` does — no drift.
262
- const fetched = await fetchPipelineProps(deployClient, pipeline.id);
263
- await runDeploy({
264
- pipeline: fetched.pipeline,
265
- propsWithIds: fetched.propsWithIds,
266
- profile: options.profile,
267
- region: options.region,
268
- requireApproval: options.requireApproval,
269
- output: options.output,
270
- debug: program.opts().debug,
271
- executionId,
272
- platformClient: deployClient,
273
- platformPipelineUrl: deployConfig.api.pipelineUrl,
274
- platformBaseUrl: deployConfig.api.baseUrl,
275
- });
276
- }
277
- catch (deployError) {
278
- printError('Pipeline was created but the deploy failed', {
279
- pipelineId: pipeline.id,
280
- error: errorMessage(deployError),
281
- retry: `pipeline-manager pipeline deploy --id ${pipeline.id}`,
282
- });
283
- // Re-throw so the process exits non-zero. The record is intentionally
284
- // retained — re-run the deploy with the command above.
285
- throw deployError;
286
- }
294
+ await deployCreatedPipeline(options, pipeline.id, executionId, program.opts().debug);
287
295
  }
288
296
  // Next steps
289
297
  console.log('');
@@ -313,4 +321,4 @@ export function createPipeline(program) {
313
321
  }
314
322
  });
315
323
  }
316
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXBpcGVsaW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL2NyZWF0ZS1waXBlbGluZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sR0FBRyxNQUFNLEtBQUssQ0FBQztBQUN0QixPQUFPLElBQUksTUFBTSxZQUFZLENBQUM7QUFDOUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuSCxPQUFPLEVBQStGLE1BQU0sbUJBQW1CLENBQUM7QUFDaEksT0FBTyxFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSx5QkFBeUIsRUFBRSw4QkFBOEIsRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNoTSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdEYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDakosT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7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QU8sRUFBRSxPQUFPLENBQUMsT0FBTztvQkFDeEIsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZO29CQUNsQyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7b0JBQ2xCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztvQkFDNUIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO2lCQUN2QjthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGVycm9yTWVzc2FnZSB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IG9yYSBmcm9tICdvcmEnO1xuaW1wb3J0IHBpY28gZnJvbSAncGljb2NvbG9ycyc7XG5pbXBvcnQgeyBmb3JtYXREdXJhdGlvbiwgZm9ybWF0RmlsZVNpemUsIEZJTEVfU0laRV9MSU1JVFMsIGRlZmF1bHRQaXBlbGluZU5hbWUgfSBmcm9tICcuLi9jb25maWcvY2xpLmNvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyB0eXBlIFBpcGVsaW5lLCB0eXBlIFBpcGVsaW5lUmVzcG9uc2UsIHR5cGUgQ3JlYXRlUGlwZWxpbmVSZXF1ZXN0LCB0eXBlIFBsYXRmb3JtRGVwbG95Q29uZmlnIH0gZnJvbSAnLi4vdHlwZXMvaW5kZXguanMnO1xuaW1wb3J0IHsgcHJpbnRDb21tYW5kSGVhZGVyLCBwcmludFNzbFdhcm5pbmcsIGNyZWF0ZUF1dGhlbnRpY2F0ZWRDbGllbnQsIGNyZWF0ZUF1dGhlbnRpY2F0ZWRDbGllbnRBc3luYywgd2l0aFNzbE9wdGlvbnMsIHdpdGhQcm9maWxlT3B0aW9uLCB3aXRoUmVnaW9uT3B0aW9uIH0gZnJvbSAnLi4vdXRpbHMvY29tbWFuZC11dGlscy5qcyc7XG5pbXBvcnQgeyBydW5EZXBsb3kgfSBmcm9tICcuLi91dGlscy9kZXBsb3ktcnVubmVyLmpzJztcbmltcG9ydCB7IEVSUk9SX0NPREVTLCBoYW5kbGVFcnJvciwgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZXJyb3ItaGFuZGxlci5qcyc7XG5pbXBvcnQgeyBlbnN1cmVPdXRwdXREaXJlY3RvcnksIHByaW50RXJyb3IsIHByaW50SW5mbywgcHJpbnRLZXlWYWx1ZSwgcHJpbnRTZWN0aW9uLCBwcmludFN1Y2Nlc3MsIHByaW50V2FybmluZyB9IGZyb20gJy4uL3V0aWxzL291dHB1dC11dGlscy5qcyc7XG5pbXBvcnQgeyBmZXRjaFBpcGVsaW5lUHJvcHMgfSBmcm9tICcuLi91dGlscy9waXBlbGluZS1jb25maWcuanMnO1xuaW1wb3J0IHsgZXh0cmFjdFNpbmdsZVJlc3BvbnNlIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UtdXRpbHMuanMnO1xuaW1wb3J0IHsgcmVsYXhUbHNGb3JDbGkgfSBmcm9tICcuLi91dGlscy90bHMuanMnO1xuXG5jb25zdCB7IGJvbGQsIGN5YW4sIGRpbSwgZ3JlZW4gfSA9IHBpY287XG5cbi8qKlxuICogUmVnaXN0ZXJzIHRoZSBgY3JlYXRlLXBpcGVsaW5lYCBjb21tYW5kIHdpdGggdGhlIENMSSBwcm9ncmFtLlxuICpcbiAqIEFjY2VwdHMgYSBwaXBlbGluZSBwcm9wZXJ0aWVzIEpTT04gZmlsZSwgdmFsaWRhdGVzIGl0LCByZXNvbHZlc1xuICogcHJvamVjdC9vcmdhbml6YXRpb24gZnJvbSBDTEkgZmxhZ3Mgb3IgdGhlIHByb3BzIGZpbGUsIGFuZFxuICogY3JlYXRlcyB0aGUgcGlwZWxpbmUgdmlhIHRoZSBwbGF0Zm9ybSBBUEkuXG4gKlxuICogQHBhcmFtIHByb2dyYW0gLSBUaGUgcm9vdCBDb21tYW5kZXIgcHJvZ3JhbSBpbnN0YW5jZSB0byBhdHRhY2ggdGhlIGNvbW1hbmQgdG8uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQaXBlbGluZShwcm9ncmFtOiBDb21tYW5kKTogdm9pZCB7XG4gIHdpdGhTc2xPcHRpb25zKFxuICAgIHdpdGhSZWdpb25PcHRpb24oXG4gICAgICB3aXRoUHJvZmlsZU9wdGlvbihwcm9ncmFtXG4gICAgICAgIC5jb21tYW5kKCdjcmVhdGUnKVxuICAgICAgICAuZGVzY3JpcHRpb24oJ0NyZWF0ZSBhIG5ldyBwaXBlbGluZSDigJQgYW5kIG9wdGlvbmFsbHkgZGVwbG95IGl0IHdpdGggLS1kZXBsb3knKVxuICAgICAgICAucmVxdWlyZWRPcHRpb24oJy1mLCAtLWZpbGUgPGZpbGU+JywgJ1BhdGggdG8gcGlwZWxpbmUgcHJvcGVydGllcyBKU09OIGZpbGUnKVxuICAgICAgICAub3B0aW9uKCctcCwgLS1wcm9qZWN0IDxwcm9qZWN0PicsICdQcm9qZWN0IG5hbWUgKGZhbGxzIGJhY2sgdG8gdmFsdWUgaW4gcHJvcHMgZmlsZSknKVxuICAgICAgICAub3B0aW9uKCctbywgLS1vcmdhbml6YXRpb24gPG9yZ2FuaXphdGlvbj4nLCAnT3JnYW5pemF0aW9uIG5hbWUgKGZhbGxzIGJhY2sgdG8gdmFsdWUgaW4gcHJvcHMgZmlsZSknKVxuICAgICAgICAub3B0aW9uKCctbiwgLS1uYW1lIDxuYW1lPicsICdQaXBlbGluZSBuYW1lJylcbiAgICAgICAgLm9wdGlvbignLWEsIC0tdmlzaWJpbGl0eSA8cnVuZz4nLCAnU2hhcmluZyBydW5nIChwcml2YXRlfG9yZ3xwdWJsaWMpLiBQaXBlbGluZXMgZGVmYXVsdCB0byBvcmcg4oCUIGEgdGVhbSBhc3NldCBpcyB2aXNpYmxlIHRvIHRoZSB0ZWFtLicsICdvcmcnKVxuICAgICAgICAub3B0aW9uKCctLWRlZmF1bHQnLCAnU2V0IGFzIGRlZmF1bHQgcGlwZWxpbmUnLCBmYWxzZSlcbiAgICAgICAgLm9wdGlvbignLS1hY3RpdmUnLCAnU2V0IHBpcGVsaW5lIGFzIGFjdGl2ZScsIHRydWUpXG4gICAgICAgIC5vcHRpb24oJy0tbm8tYWN0aXZlJywgJ0NyZWF0ZSB0aGUgcGlwZWxpbmUgYXMgaW5hY3RpdmUnKVxuICAgICAgICAvLyAtLWRlcGxveTogYWZ0ZXIgY3JlYXRpbmcgdGhlIHJlY29yZCwgcnVuIHRoZSBzYW1lIENESyBkZXBsb3kgKyBBUk5cbiAgICAgICAgLy8gcmVnaXN0cmF0aW9uIGFzIGBwaXBlbGluZSBkZXBsb3kgLS1pZGAgKHNoYXJlZCBydW5EZXBsb3kpLiBUaGUgZmxhZ3NcbiAgICAgICAgLy8gYmVsb3cgYXBwbHkgb25seSB3aXRoIC0tZGVwbG95LlxuICAgICAgICAub3B0aW9uKCctLWRlcGxveScsICdEZXBsb3kgdGhlIHBpcGVsaW5lIHdpdGggQVdTIENESyBpbW1lZGlhdGVseSBhZnRlciBjcmVhdGluZyBpdCcsIGZhbHNlKVxuICAgICAgICAub3B0aW9uKCctLXJlcXVpcmUtYXBwcm92YWwgPGFwcHJvdmFsPicsICdEZXBsb3kgYXBwcm92YWwgbGV2ZWw6IG5ldmVyfGFueS1jaGFuZ2V8YnJvYWRlbmluZyAod2l0aCAtLWRlcGxveSknLCAnbmV2ZXInKVxuICAgICAgICAub3B0aW9uKCctLW91dHB1dCA8ZGlyPicsICdDREsgb3V0cHV0IGRpcmVjdG9yeSAod2l0aCAtLWRlcGxveSknLCAnY2RrLm91dCcpXG4gICAgICAgIC5vcHRpb24oJy0tc3RvcmUtdG9rZW5zJywgJ0RlcGxveSBhdXRoIHZpYSBBV1MgU2VjcmV0cyBNYW5hZ2VyIHRva2VuICh3aXRoIC0tZGVwbG95OyByZXF1aXJlcyBQTEFURk9STV9TRUNSRVRfTkFNRSknLCBmYWxzZSkpLFxuICAgICksXG4gIClcbiAgICAub3B0aW9uKCctLWRyeS1ydW4nLCAnVmFsaWRhdGUgaW5wdXRzIHdpdGhvdXQgY3JlYXRpbmcgcGlwZWxpbmUnLCBmYWxzZSlcbiAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICBjb25zdCBleGVjdXRpb25JZCA9IHByaW50Q29tbWFuZEhlYWRlcignQ3JlYXRlIFBpcGVsaW5lJywgJ0NyZWF0aW5nIFBpcGVsaW5lJyk7XG4gICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICB0cnkge1xuXG4gICAgICAgIC8vIERpc3BsYXkgcGFyYW1ldGVyc1xuICAgICAgICBwcmludEluZm8oJ0NvbmZpZ3VyYXRpb24nKTtcbiAgICAgICAgcHJpbnRLZXlWYWx1ZSh7XG4gICAgICAgICAgJ1Byb2plY3QnOiBvcHRpb25zLnByb2plY3QgfHwgJyhmcm9tIHByb3BzIGZpbGUpJyxcbiAgICAgICAgICAnT3JnYW5pemF0aW9uJzogb3B0aW9ucy5vcmdhbml6YXRpb24gfHwgJyhmcm9tIHByb3BzIGZpbGUpJyxcbiAgICAgICAgICAnTmFtZSc6IG9wdGlvbnMubmFtZSB8fCAnKG5vdCBzZXQpJyxcbiAgICAgICAgICAnVmlzaWJpbGl0eSc6IG9wdGlvbnMudmlzaWJpbGl0eSxcbiAgICAgICAgICAnRGVmYXVsdCBQaXBlbGluZSc6IG9wdGlvbnMuZGVmYXVsdCA/ICdZZXMnIDogJ05vJyxcbiAgICAgICAgICAnQWN0aXZlJzogb3B0aW9ucy5hY3RpdmUgPyAnWWVzJyA6ICdObycsXG4gICAgICAgICAgJ0RlcGxveSBBZnRlciBDcmVhdGUnOiBvcHRpb25zLmRlcGxveSA/IGBZZXMgKHByb2ZpbGU6ICR7b3B0aW9ucy5wcm9maWxlIHx8ICdkZWZhdWx0J30pYCA6ICdObycsXG4gICAgICAgICAgJ1Byb3BlcnRpZXMgRmlsZSc6IG9wdGlvbnMuZmlsZSxcbiAgICAgICAgICAnU1NMIFZlcmlmaWNhdGlvbic6IG9wdGlvbnMudmVyaWZ5U3NsID09PSBmYWxzZSA/ICdEaXNhYmxlZCcgOiAnRW5hYmxlZCcsXG4gICAgICAgICAgJ0RyeSBSdW4nOiBvcHRpb25zLmRyeVJ1biA/ICdZZXMnIDogJ05vJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU2VjdXJpdHkgd2FybmluZyBmb3IgU1NMIHZlcmlmaWNhdGlvbiBkaXNhYmxlZFxuICAgICAgICBwcmludFNzbFdhcm5pbmcob3B0aW9ucy52ZXJpZnlTc2wpO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgcHJpbnRTZWN0aW9uKCdGaWxlIFZhbGlkYXRpb24nKTtcblxuICAgICAgICAvLyBWYWxpZGF0ZSBmaWxlIGV4aXN0c1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMob3B0aW9ucy5maWxlKSkge1xuICAgICAgICAgIHByaW50RXJyb3IoJ1Byb3BlcnRpZXMgZmlsZSBub3QgZm91bmQnLCB7IHBhdGg6IG9wdGlvbnMuZmlsZSB9KTtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBGaWxlIG5vdCBmb3VuZDogJHtvcHRpb25zLmZpbGV9YCwgJ2ZpbGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGZpbGUgZXh0ZW5zaW9uXG4gICAgICAgIGNvbnN0IGZpbGVFeHQgPSBwYXRoLmV4dG5hbWUob3B0aW9ucy5maWxlKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoZmlsZUV4dCAhPT0gJy5qc29uJykge1xuICAgICAgICAgIHByaW50V2FybmluZygnRmlsZSBleHRlbnNpb24gaXMgbm90IC5qc29uJywgeyBleHRlbnNpb246IGZpbGVFeHQgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWxlU3RhdHMgPSBmcy5zdGF0U3luYyhvcHRpb25zLmZpbGUpO1xuXG4gICAgICAgIC8vIENoZWNrIGZpbGUgc2l6ZVxuICAgICAgICBpZiAoZmlsZVN0YXRzLnNpemUgPiBGSUxFX1NJWkVfTElNSVRTLlBJUEVMSU5FX1BST1BTKSB7XG4gICAgICAgICAgcHJpbnRFcnJvcignUHJvcGVydGllcyBmaWxlIGlzIHRvbyBsYXJnZScsIHtcbiAgICAgICAgICAgIHNpemU6IGZvcm1hdEZpbGVTaXplKGZpbGVTdGF0cy5zaXplKSxcbiAgICAgICAgICAgIGxpbWl0OiBmb3JtYXRGaWxlU2l6ZShGSUxFX1NJWkVfTElNSVRTLlBJUEVMSU5FX1BST1BTKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdQcm9wZXJ0aWVzIGZpbGUgZXhjZWVkcyBzaXplIGxpbWl0JywgJ2ZpbGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByaW50U3VjY2VzcygnRmlsZSB2YWxpZGF0aW9uIHBhc3NlZCcpO1xuICAgICAgICBwcmludEtleVZhbHVlKHtcbiAgICAgICAgICAnRmlsZSBQYXRoJzogb3B0aW9ucy5maWxlLFxuICAgICAgICAgICdGaWxlIFNpemUnOiBmb3JtYXRGaWxlU2l6ZShmaWxlU3RhdHMuc2l6ZSksXG4gICAgICAgICAgJ0V4dGVuc2lvbic6IGZpbGVFeHQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlYWQgYW5kIHBhcnNlIHByb3BlcnRpZXMgZmlsZVxuICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgIHByaW50SW5mbygnUmVhZGluZyBwaXBlbGluZSBwcm9wZXJ0aWVzLi4uJyk7XG5cbiAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMob3B0aW9ucy5maWxlLCAndXRmLTgnKTtcblxuICAgICAgICBsZXQgcHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHByb3BzID0gSlNPTi5wYXJzZShmaWxlQ29udGVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgcHJpbnRFcnJvcignSW52YWxpZCBKU09OIGluIHByb3BlcnRpZXMgZmlsZScsIHtcbiAgICAgICAgICAgIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyb3IpLFxuICAgICAgICAgICAgaGludDogJ0Vuc3VyZSB0aGUgZmlsZSBjb250YWlucyB2YWxpZCBKU09OIHN5bnRheCcsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcignUHJvcGVydGllcyBmaWxlIG11c3QgY29udGFpbiB2YWxpZCBKU09OJywgJ2ZpbGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIHByb3BlcnRpZXMgc3RydWN0dXJlXG4gICAgICAgIGlmICh0eXBlb2YgcHJvcHMgIT09ICdvYmplY3QnIHx8IHByb3BzID09PSBudWxsKSB7XG4gICAgICAgICAgcHJpbnRFcnJvcignSW52YWxpZCBwcm9wZXJ0aWVzIGZvcm1hdCcsIHtcbiAgICAgICAgICAgIHR5cGU6IHR5cGVvZiBwcm9wcyxcbiAgICAgICAgICAgIGhpbnQ6ICdQcm9wZXJ0aWVzIG11c3QgYmUgYSBKU09OIG9iamVjdCcsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcignUHJvcGVydGllcyBtdXN0IGJlIGEgdmFsaWQgb2JqZWN0JywgJ2ZpbGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByb3BDb3VudCA9IE9iamVjdC5rZXlzKHByb3BzKS5sZW5ndGg7XG5cbiAgICAgICAgcHJpbnRTdWNjZXNzKCdQcm9wZXJ0aWVzIHBhcnNlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgcHJpbnRLZXlWYWx1ZSh7XG4gICAgICAgICAgJ1RvdGFsIEtleXMnOiBwcm9wQ291bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAnU2FtcGxlIEtleXMnOiBPYmplY3Qua2V5cyhwcm9wcykuc2xpY2UoMCwgNSkuam9pbignLCAnKSArIChwcm9wQ291bnQgPiA1ID8gJy4uLicgOiAnJyksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHByb3BlcnRpZXMgY29udGVudFxuICAgICAgICBpZiAocHJvcENvdW50ID09PSAwKSB7XG4gICAgICAgICAgcHJpbnRXYXJuaW5nKCdQcm9wZXJ0aWVzIG9iamVjdCBpcyBlbXB0eSAtIHBpcGVsaW5lIHdpbGwgaGF2ZSBubyBjb25maWd1cmF0aW9uJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXNvbHZlIHByb2plY3QgJiBvcmdhbml6YXRpb246IHByZWZlciBDTEkgZmxhZ3MsIGZhbGwgYmFjayB0b1xuICAgICAgICAvLyB2YWx1ZXMgZW1iZWRkZWQgaW5zaWRlIHRoZSBwcm9wcyBmaWxlIChidWlsZGVyUHJvcHMpLlxuICAgICAgICBjb25zdCByZXNvbHZlZFByb2plY3QgPSBvcHRpb25zLnByb2plY3QgPz8gKHByb3BzLnByb2plY3QgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKTtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRPcmdhbml6YXRpb24gPSBvcHRpb25zLm9yZ2FuaXphdGlvbiA/PyAocHJvcHMub3JnYW5pemF0aW9uIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG5cbiAgICAgICAgaWYgKCFyZXNvbHZlZFByb2plY3QpIHtcbiAgICAgICAgICBwcmludEVycm9yKCdQcm9qZWN0IGlzIHJlcXVpcmVkJywge1xuICAgICAgICAgICAgaGludDogJ1Byb3ZpZGUgLXAvLS1wcm9qZWN0IGZsYWcgb3IgaW5jbHVkZSBcInByb2plY3RcIiBpbiB0aGUgcHJvcHMgZmlsZScsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcignUHJvamVjdCBpcyByZXF1aXJlZCcsICdwcm9qZWN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyZXNvbHZlZE9yZ2FuaXphdGlvbikge1xuICAgICAgICAgIHByaW50RXJyb3IoJ09yZ2FuaXphdGlvbiBpcyByZXF1aXJlZCcsIHtcbiAgICAgICAgICAgIGhpbnQ6ICdQcm92aWRlIC1vLy0tb3JnYW5pemF0aW9uIGZsYWcgb3IgaW5jbHVkZSBcIm9yZ2FuaXphdGlvblwiIGluIHRoZSBwcm9wcyBmaWxlJyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdPcmdhbml6YXRpb24gaXMgcmVxdWlyZWQnLCAnb3JnYW5pemF0aW9uJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXNvbHZlIHBpcGVsaW5lTmFtZSB3aXRoIHRoZSBzaGFyZWQgZGVmYXVsdCAobWlycm9ycyBwaXBlbGluZS1jb3JlJ3NcbiAgICAgICAgLy8gcGlwZWxpbmUtY29uZmlndXJhdGlvbi50cykgc28gY3JlYXRlICsgcmVnaXN0cnkgKyBDREsgYWxsIGFncmVlLlxuICAgICAgICBjb25zdCByZXNvbHZlZFBpcGVsaW5lTmFtZSA9IG9wdGlvbnMubmFtZVxuICAgICAgICAgID8/IChwcm9wcy5waXBlbGluZU5hbWUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKVxuICAgICAgICAgID8/IGRlZmF1bHRQaXBlbGluZU5hbWUocmVzb2x2ZWRPcmdhbml6YXRpb24sIHJlc29sdmVkUHJvamVjdCk7XG5cbiAgICAgICAgY29uc3QgcGF5bG9hZDogQ3JlYXRlUGlwZWxpbmVSZXF1ZXN0ID0ge1xuICAgICAgICAgIHByb2plY3Q6IHJlc29sdmVkUHJvamVjdCxcbiAgICAgICAgICBvcmdhbml6YXRpb246IHJlc29sdmVkT3JnYW5pemF0aW9uLFxuICAgICAgICAgIHBpcGVsaW5lTmFtZTogcmVzb2x2ZWRQaXBlbGluZU5hbWUsXG4gICAgICAgICAgcHJvcHMsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gQWRkIG9wdGlvbmFsIGZpZWxkcyBvbmx5IGlmIHByb3ZpZGVkXG4gICAgICAgIGlmIChvcHRpb25zLnZpc2liaWxpdHkpIHtcbiAgICAgICAgICBwYXlsb2FkLnZpc2liaWxpdHkgPSBvcHRpb25zLnZpc2liaWxpdHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuZGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcGF5bG9hZC5pc0RlZmF1bHQgPSBvcHRpb25zLmRlZmF1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuYWN0aXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwYXlsb2FkLmlzQWN0aXZlID0gb3B0aW9ucy5hY3RpdmU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEcnkgcnVuIG1vZGVcbiAgICAgICAgaWYgKG9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICAgIHByaW50U2VjdGlvbignRHJ5IFJ1biAtIFJlcXVlc3QgUHJldmlldycpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHBheWxvYWQsIG51bGwsIDIpKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgICAgcHJpbnRTdWNjZXNzKCfinJMgVmFsaWRhdGlvbiBjb21wbGV0ZSAtIG5vIHBpcGVsaW5lIGNyZWF0ZWQgKGRyeSBydW4gbW9kZSknKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgICAgaWYgKG9wdGlvbnMuZGVwbG95KSB7XG4gICAgICAgICAgICBwcmludEluZm8oJ1dpdGggLS1kZXBsb3ksIHRoZSBwaXBlbGluZSB3b3VsZCBiZSBkZXBsb3llZCB2aWEgQ0RLIGFmdGVyIGNyZWF0aW9uJywge1xuICAgICAgICAgICAgICBwcm9maWxlOiBvcHRpb25zLnByb2ZpbGUgfHwgJyhkZWZhdWx0KScsXG4gICAgICAgICAgICAgIHJlZ2lvbjogb3B0aW9ucy5yZWdpb24gfHwgJyhkZWZhdWx0KScsXG4gICAgICAgICAgICAgIHJlcXVpcmVBcHByb3ZhbDogb3B0aW9ucy5yZXF1aXJlQXBwcm92YWwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcHJpbnRJbmZvKCdUbyBjcmVhdGUgdGhlIHBpcGVsaW5lLCBydW4gdGhlIGNvbW1hbmQgd2l0aG91dCAtLWRyeS1ydW4nKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgYXV0aGVudGljYXRlZCBBUEkgY2xpZW50XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IGNyZWF0ZUF1dGhlbnRpY2F0ZWRDbGllbnQob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGNsaWVudC5nZXRDb25maWcoKTtcblxuICAgICAgICAvLyBDcmVhdGUgcGlwZWxpbmVcbiAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICBwcmludFNlY3Rpb24oJ0NyZWF0aW5nIFBpcGVsaW5lJyk7XG5cbiAgICAgICAgY29uc3Qgc3Bpbm5lciA9IG9yYSgnQ3JlYXRpbmcgcGlwZWxpbmUuLi4nKS5zdGFydCgpO1xuICAgICAgICBsZXQgcmF3UmVzcG9uc2U6IFBpcGVsaW5lUmVzcG9uc2U7XG4gICAgICAgIGxldCByZXF1ZXN0RHVyYXRpb246IG51bWJlcjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0U3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIHJhd1Jlc3BvbnNlID0gYXdhaXQgY2xpZW50LnBvc3Q8UGlwZWxpbmVSZXNwb25zZT4oXG4gICAgICAgICAgICBjb25maWcuYXBpLnBpcGVsaW5lVXJsLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlcXVlc3REdXJhdGlvbiA9IERhdGUubm93KCkgLSByZXF1ZXN0U3RhcnQ7XG4gICAgICAgICAgc3Bpbm5lci5zdWNjZWVkKCdQaXBlbGluZSBjcmVhdGVkJyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgc3Bpbm5lci5mYWlsKCdQaXBlbGluZSBjcmVhdGlvbiBmYWlsZWQnKTtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBpcGVsaW5lID0gZXh0cmFjdFNpbmdsZVJlc3BvbnNlPFBpcGVsaW5lPihyYXdSZXNwb25zZSwgJ3BpcGVsaW5lJywgJ2lkJyk7XG5cbiAgICAgICAgaWYgKCFwaXBlbGluZT8uaWQpIHtcbiAgICAgICAgICBwcmludEVycm9yKCdJbnZhbGlkIHBpcGVsaW5lIHJlc3BvbnNlJywge1xuICAgICAgICAgICAgcmVzcG9uc2VLZXlzOiByYXdSZXNwb25zZSA/IE9iamVjdC5rZXlzKHJhd1Jlc3BvbnNlKSA6ICcobnVsbCknLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGlwZWxpbmUgY3JlYXRpb24gZmFpbGVkIC0gbm8gdmFsaWQgcGlwZWxpbmUgZGF0YSByZWNlaXZlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICBwcmludFNlY3Rpb24oJ+KckyBQaXBlbGluZSBDcmVhdGVkIFN1Y2Nlc3NmdWxseScpO1xuXG4gICAgICAgIC8vIERpc3BsYXkgY3JlYXRlZCBwaXBlbGluZSBpbmZvXG4gICAgICAgIHByaW50S2V5VmFsdWUoe1xuICAgICAgICAgICdQaXBlbGluZSBJRCc6IGdyZWVuKGJvbGQocGlwZWxpbmUuaWQpKSxcbiAgICAgICAgICAnUHJvamVjdCc6IHBpcGVsaW5lLnByb2plY3QsXG4gICAgICAgICAgJ09yZ2FuaXphdGlvbic6IHBpcGVsaW5lLm9yZ2FuaXphdGlvbixcbiAgICAgICAgICAnTmFtZSc6IHBpcGVsaW5lLnBpcGVsaW5lTmFtZSB8fCAnKG5vdCBzZXQpJyxcbiAgICAgICAgICAnVmlzaWJpbGl0eSc6IHBpcGVsaW5lLnZpc2liaWxpdHkgfHwgJ29yZycsXG4gICAgICAgICAgJ0RlZmF1bHQnOiBwaXBlbGluZS5pc0RlZmF1bHQgPyAnWWVzJyA6ICdObycsXG4gICAgICAgICAgJ0FjdGl2ZSc6IHBpcGVsaW5lLmlzQWN0aXZlID8gJ1llcycgOiAnTm8nLFxuICAgICAgICAgICdQcm9wZXJ0aWVzJzogcGlwZWxpbmUucHJvcHMgPyBgJHtPYmplY3Qua2V5cyhwaXBlbGluZS5wcm9wcykubGVuZ3RofSBrZXlzYCA6ICcobm90IHJldHVybmVkKScsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChwaXBlbGluZS5jcmVhdGVkQXQpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgICAgcHJpbnRLZXlWYWx1ZSh7XG4gICAgICAgICAgICAnQ3JlYXRlZCBBdCc6IHBpcGVsaW5lLmNyZWF0ZWRBdCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBlcmZvcm1hbmNlIG1ldHJpY3NcbiAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICBwcmludEtleVZhbHVlKHtcbiAgICAgICAgICAnRXhlY3V0aW9uIElEJzogZXhlY3V0aW9uSWQsXG4gICAgICAgICAgJ1JlcXVlc3QgRHVyYXRpb24nOiBmb3JtYXREdXJhdGlvbihyZXF1ZXN0RHVyYXRpb24pLFxuICAgICAgICAgICdUb3RhbCBEdXJhdGlvbic6IGZvcm1hdER1cmF0aW9uKERhdGUubm93KCkgLSBzdGFydFRpbWUpLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTYXZlIHBpcGVsaW5lIGluZm8gdG8gZmlsZVxuICAgICAgICBjb25zdCBvdXRwdXREaXIgPSAnLi9vdXRwdXQnO1xuICAgICAgICBlbnN1cmVPdXRwdXREaXJlY3Rvcnkob3V0cHV0RGlyKTtcblxuICAgICAgICBjb25zdCBvdXRwdXRGaWxlID0gcGF0aC5qb2luKG91dHB1dERpciwgYHBpcGVsaW5lLSR7cGlwZWxpbmUuaWR9Lmpzb25gKTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhvdXRwdXRGaWxlLCBKU09OLnN0cmluZ2lmeShwaXBlbGluZSwgbnVsbCwgMikpO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgcHJpbnRTdWNjZXNzKCdQaXBlbGluZSBkZXRhaWxzIHNhdmVkIHRvIGZpbGUnKTtcbiAgICAgICAgcHJpbnRLZXlWYWx1ZSh7XG4gICAgICAgICAgJ091dHB1dCBGaWxlJzogb3V0cHV0RmlsZSxcbiAgICAgICAgICAnRmlsZSBTaXplJzogZm9ybWF0RmlsZVNpemUoZnMuc3RhdFN5bmMob3V0cHV0RmlsZSkuc2l6ZSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIOKUgOKUgCBPcHRpb25hbCBkZXBsb3kgKC0tZGVwbG95KSDilIDilIBcbiAgICAgICAgLy8gVGhlIHJlY29yZCBub3cgZXhpc3RzIGFuZCBpcyBhdXRob3JpdGF0aXZlLiBJZiB0aGUgZGVwbG95IGZhaWxzIHdlIEtFRVBcbiAgICAgICAgLy8gaXQgYW5kIHN1cmZhY2UgdGhlIGV4YWN0IHJldHJ5IHJhdGhlciB0aGFuIHJvbGxpbmcgYmFjayAobmV2ZXIgZmFsc2UtZ3JlZW4pLlxuICAgICAgICBpZiAob3B0aW9ucy5kZXBsb3kpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgICAgcHJpbnRTZWN0aW9uKCdEZXBsb3lpbmcgUGlwZWxpbmUnKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gRGVwbG95IHRvdWNoZXMgdGhlIEFXUyBTREsgKyB0aGUgQ0RLIHN5bnRoIHN1YnByb2Nlc3M7IHJlbGF4IFRMUyB0aGVcbiAgICAgICAgICAgIC8vIHNhbWUgd2F5IGBkZXBsb3lgIGRvZXMgKHJlZnVzZWQgaW4gcHJvZHVjdGlvbiBieSByZWxheFRsc0ZvckNsaSkuXG4gICAgICAgICAgICByZWxheFRsc0ZvckNsaShvcHRpb25zLnZlcmlmeVNzbCwgcHJpbnRXYXJuaW5nKTtcbiAgICAgICAgICAgIC8vIFRoZSBhc3luYyBjbGllbnQgYWRkcyAtLXN0b3JlLXRva2VucyAoU2VjcmV0cyBNYW5hZ2VyKSBzdXBwb3J0IGFuZFxuICAgICAgICAgICAgLy8gYmFja3MgQk9USCB0aGUgcHJvcHMgZmV0Y2ggYW5kIHRoZSByZWdpc3RyeSBjYWxsYmFjay5cbiAgICAgICAgICAgIGNvbnN0IGRlcGxveUNsaWVudCA9IGF3YWl0IGNyZWF0ZUF1dGhlbnRpY2F0ZWRDbGllbnRBc3luYyhvcHRpb25zKTtcbiAgICAgICAgICAgIGNvbnN0IGRlcGxveUNvbmZpZyA9IGRlcGxveUNsaWVudC5nZXRDb25maWcoKSBhcyBQbGF0Zm9ybURlcGxveUNvbmZpZztcbiAgICAgICAgICAgIC8vIFJlLWZldGNoIHRoZSBqdXN0LWNyZWF0ZWQgcGlwZWxpbmUgc28gcGx1Z2lucyBhcmUgcmVzb2x2ZWQgYW5kIHRoZVxuICAgICAgICAgICAgLy8gcmVnaXN0cnkgaG9zdCBpcyBiYWtlZCBFWEFDVExZIGFzIGBkZXBsb3kgLS1pZGAgZG9lcyDigJQgbm8gZHJpZnQuXG4gICAgICAgICAgICBjb25zdCBmZXRjaGVkID0gYXdhaXQgZmV0Y2hQaXBlbGluZVByb3BzKGRlcGxveUNsaWVudCwgcGlwZWxpbmUuaWQpO1xuICAgICAgICAgICAgYXdhaXQgcnVuRGVwbG95KHtcbiAgICAgICAgICAgICAgcGlwZWxpbmU6IGZldGNoZWQucGlwZWxpbmUsXG4gICAgICAgICAgICAgIHByb3BzV2l0aElkczogZmV0Y2hlZC5wcm9wc1dpdGhJZHMsXG4gICAgICAgICAgICAgIHByb2ZpbGU6IG9wdGlvbnMucHJvZmlsZSxcbiAgICAgICAgICAgICAgcmVnaW9uOiBvcHRpb25zLnJlZ2lvbixcbiAgICAgICAgICAgICAgcmVxdWlyZUFwcHJvdmFsOiBvcHRpb25zLnJlcXVpcmVBcHByb3ZhbCxcbiAgICAgICAgICAgICAgb3V0cHV0OiBvcHRpb25zLm91dHB1dCxcbiAgICAgICAgICAgICAgZGVidWc6IHByb2dyYW0ub3B0cygpLmRlYnVnLFxuICAgICAgICAgICAgICBleGVjdXRpb25JZCxcbiAgICAgICAgICAgICAgcGxhdGZvcm1DbGllbnQ6IGRlcGxveUNsaWVudCxcbiAgICAgICAgICAgICAgcGxhdGZvcm1QaXBlbGluZVVybDogZGVwbG95Q29uZmlnLmFwaS5waXBlbGluZVVybCxcbiAgICAgICAgICAgICAgcGxhdGZvcm1CYXNlVXJsOiBkZXBsb3lDb25maWcuYXBpLmJhc2VVcmwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoIChkZXBsb3lFcnJvcikge1xuICAgICAgICAgICAgcHJpbnRFcnJvcignUGlwZWxpbmUgd2FzIGNyZWF0ZWQgYnV0IHRoZSBkZXBsb3kgZmFpbGVkJywge1xuICAgICAgICAgICAgICBwaXBlbGluZUlkOiBwaXBlbGluZS5pZCxcbiAgICAgICAgICAgICAgZXJyb3I6IGVycm9yTWVzc2FnZShkZXBsb3lFcnJvciksXG4gICAgICAgICAgICAgIHJldHJ5OiBgcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSBkZXBsb3kgLS1pZCAke3BpcGVsaW5lLmlkfWAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIFJlLXRocm93IHNvIHRoZSBwcm9jZXNzIGV4aXRzIG5vbi16ZXJvLiBUaGUgcmVjb3JkIGlzIGludGVudGlvbmFsbHlcbiAgICAgICAgICAgIC8vIHJldGFpbmVkIOKAlCByZS1ydW4gdGhlIGRlcGxveSB3aXRoIHRoZSBjb21tYW5kIGFib3ZlLlxuICAgICAgICAgICAgdGhyb3cgZGVwbG95RXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTmV4dCBzdGVwc1xuICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgIHByaW50U2VjdGlvbignTmV4dCBTdGVwcycpO1xuICAgICAgICBjb25zb2xlLmxvZyhkaW0oJ1lvdSBjYW4gbm93OicpKTtcbiAgICAgICAgaWYgKCFvcHRpb25zLmRlcGxveSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgICR7Y3lhbign4oCiJyl9IERlcGxveTogJHtib2xkKGBkZXBsb3kgLS1pZCAke3BpcGVsaW5lLmlkfWApfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGAgICR7Y3lhbign4oCiJyl9IFZpZXc6ICR7Ym9sZChgZ2V0LXBpcGVsaW5lIC0taWQgJHtwaXBlbGluZS5pZH1gKX1gKTtcbiAgICAgICAgY29uc29sZS5sb2coYCAgJHtjeWFuKCfigKInKX0gQVBJOiAke2NvbmZpZy5hcGkuYmFzZVVybH0ke2NvbmZpZy5hcGkucGlwZWxpbmVVcmx9LyR7cGlwZWxpbmUuaWR9YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTtcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZXJyb3IsIEVSUk9SX0NPREVTLkFQSV9SRVFVRVNULCB7XG4gICAgICAgICAgZGVidWc6IHByb2dyYW0ub3B0cygpLmRlYnVnLFxuICAgICAgICAgIGV4aXQ6IHRydWUsXG4gICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgY29tbWFuZDogJ2NyZWF0ZS1waXBlbGluZScsXG4gICAgICAgICAgICBleGVjdXRpb25JZCxcbiAgICAgICAgICAgIHByb2plY3Q6IG9wdGlvbnMucHJvamVjdCxcbiAgICAgICAgICAgIG9yZ2FuaXphdGlvbjogb3B0aW9ucy5vcmdhbml6YXRpb24sXG4gICAgICAgICAgICBmaWxlOiBvcHRpb25zLmZpbGUsXG4gICAgICAgICAgICB2ZXJpZnlTc2w6IG9wdGlvbnMudmVyaWZ5U3NsLFxuICAgICAgICAgICAgZHJ5UnVuOiBvcHRpb25zLmRyeVJ1bixcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbn0iXX0=
324
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXBpcGVsaW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL2NyZWF0ZS1waXBlbGluZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sR0FBRyxNQUFNLEtBQUssQ0FBQztBQUN0QixPQUFPLElBQUksTUFBTSxZQUFZLENBQUM7QUFDOUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuSCxPQUFPLEVBQStGLE1BQU0sbUJBQW1CLENBQUM7QUFDaEksT0FBTyxFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSx5QkFBeUIsRUFBRSw4QkFBOEIsRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNoTSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdEYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDakosT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7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QUFDLEtBQUssRUFBRSxXQUFXLENBQUMsV0FBVyxFQUFFO2dCQUMxQyxLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUs7Z0JBQzNCLElBQUksRUFBRSxJQUFJO2dCQUNWLE9BQU8sRUFBRTtvQkFDUCxPQUFPLEVBQUUsaUJBQWlCO29CQUMxQixXQUFXO29CQUNYLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztvQkFDeEIsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZO29CQUNsQyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7b0JBQ2xCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztvQkFDNUIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO2lCQUN2QjthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGVycm9yTWVzc2FnZSB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IG9yYSBmcm9tICdvcmEnO1xuaW1wb3J0IHBpY28gZnJvbSAncGljb2NvbG9ycyc7XG5pbXBvcnQgeyBmb3JtYXREdXJhdGlvbiwgZm9ybWF0RmlsZVNpemUsIEZJTEVfU0laRV9MSU1JVFMsIGRlZmF1bHRQaXBlbGluZU5hbWUgfSBmcm9tICcuLi9jb25maWcvY2xpLmNvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyB0eXBlIFBpcGVsaW5lLCB0eXBlIFBpcGVsaW5lUmVzcG9uc2UsIHR5cGUgQ3JlYXRlUGlwZWxpbmVSZXF1ZXN0LCB0eXBlIFBsYXRmb3JtRGVwbG95Q29uZmlnIH0gZnJvbSAnLi4vdHlwZXMvaW5kZXguanMnO1xuaW1wb3J0IHsgcHJpbnRDb21tYW5kSGVhZGVyLCBwcmludFNzbFdhcm5pbmcsIGNyZWF0ZUF1dGhlbnRpY2F0ZWRDbGllbnQsIGNyZWF0ZUF1dGhlbnRpY2F0ZWRDbGllbnRBc3luYywgd2l0aFNzbE9wdGlvbnMsIHdpdGhQcm9maWxlT3B0aW9uLCB3aXRoUmVnaW9uT3B0aW9uIH0gZnJvbSAnLi4vdXRpbHMvY29tbWFuZC11dGlscy5qcyc7XG5pbXBvcnQgeyBydW5EZXBsb3kgfSBmcm9tICcuLi91dGlscy9kZXBsb3ktcnVubmVyLmpzJztcbmltcG9ydCB7IEVSUk9SX0NPREVTLCBoYW5kbGVFcnJvciwgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZXJyb3ItaGFuZGxlci5qcyc7XG5pbXBvcnQgeyBlbnN1cmVPdXRwdXREaXJlY3RvcnksIHByaW50RXJyb3IsIHByaW50SW5mbywgcHJpbnRLZXlWYWx1ZSwgcHJpbnRTZWN0aW9uLCBwcmludFN1Y2Nlc3MsIHByaW50V2FybmluZyB9IGZyb20gJy4uL3V0aWxzL291dHB1dC11dGlscy5qcyc7XG5pbXBvcnQgeyBmZXRjaFBpcGVsaW5lUHJvcHMgfSBmcm9tICcuLi91dGlscy9waXBlbGluZS1jb25maWcuanMnO1xuaW1wb3J0IHsgZXh0cmFjdFNpbmdsZVJlc3BvbnNlIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UtdXRpbHMuanMnO1xuaW1wb3J0IHsgcmVsYXhUbHNGb3JDbGkgfSBmcm9tICcuLi91dGlscy90bHMuanMnO1xuXG5jb25zdCB7IGJvbGQsIGN5YW4sIGRpbSwgZ3JlZW4gfSA9IHBpY287XG5cbi8qKiBQYXJzZWQgYHBpcGVsaW5lIGNyZWF0ZWAgZmxhZ3MuICovXG5pbnRlcmZhY2UgQ3JlYXRlUGlwZWxpbmVPcHRpb25zIHtcbiAgZmlsZTogc3RyaW5nO1xuICBwcm9qZWN0Pzogc3RyaW5nO1xuICBvcmdhbml6YXRpb24/OiBzdHJpbmc7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHZpc2liaWxpdHk/OiBDcmVhdGVQaXBlbGluZVJlcXVlc3RbJ3Zpc2liaWxpdHknXTtcbiAgZGVmYXVsdD86IGJvb2xlYW47XG4gIGFjdGl2ZT86IGJvb2xlYW47XG4gIGRlcGxveT86IGJvb2xlYW47XG4gIHJlcXVpcmVBcHByb3ZhbDogc3RyaW5nO1xuICBvdXRwdXQ6IHN0cmluZztcbiAgcHJvZmlsZT86IHN0cmluZztcbiAgcmVnaW9uPzogc3RyaW5nO1xuICB2ZXJpZnlTc2w/OiBib29sZWFuO1xuICBkcnlSdW4/OiBib29sZWFuO1xuICBzdG9yZVRva2Vucz86IGJvb2xlYW47XG59XG5cbi8qKiBWYWxpZGF0ZSB0aGUgcHJvcHMgZmlsZSAoZXhpc3RzLCBzaXplIGNhcCkgYW5kIHBhcnNlIGl0IGFzIGEgSlNPTiBvYmplY3QuICovXG5mdW5jdGlvbiByZWFkUHJvcHNGaWxlKGZpbGU6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc29sZS5sb2coJycpO1xuICBwcmludFNlY3Rpb24oJ0ZpbGUgVmFsaWRhdGlvbicpO1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhmaWxlKSkge1xuICAgIHByaW50RXJyb3IoJ1Byb3BlcnRpZXMgZmlsZSBub3QgZm91bmQnLCB7IHBhdGg6IGZpbGUgfSk7XG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZX1gLCAnZmlsZScpO1xuICB9XG5cbiAgY29uc3QgZmlsZUV4dCA9IHBhdGguZXh0bmFtZShmaWxlKS50b0xvd2VyQ2FzZSgpO1xuICBpZiAoZmlsZUV4dCAhPT0gJy5qc29uJykge1xuICAgIHByaW50V2FybmluZygnRmlsZSBleHRlbnNpb24gaXMgbm90IC5qc29uJywgeyBleHRlbnNpb246IGZpbGVFeHQgfSk7XG4gIH1cblxuICBjb25zdCBmaWxlU3RhdHMgPSBmcy5zdGF0U3luYyhmaWxlKTtcbiAgaWYgKGZpbGVTdGF0cy5zaXplID4gRklMRV9TSVpFX0xJTUlUUy5QSVBFTElORV9QUk9QUykge1xuICAgIHByaW50RXJyb3IoJ1Byb3BlcnRpZXMgZmlsZSBpcyB0b28gbGFyZ2UnLCB7XG4gICAgICBzaXplOiBmb3JtYXRGaWxlU2l6ZShmaWxlU3RhdHMuc2l6ZSksXG4gICAgICBsaW1pdDogZm9ybWF0RmlsZVNpemUoRklMRV9TSVpFX0xJTUlUUy5QSVBFTElORV9QUk9QUyksXG4gICAgfSk7XG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcignUHJvcGVydGllcyBmaWxlIGV4Y2VlZHMgc2l6ZSBsaW1pdCcsICdmaWxlJyk7XG4gIH1cblxuICBwcmludFN1Y2Nlc3MoJ0ZpbGUgdmFsaWRhdGlvbiBwYXNzZWQnKTtcbiAgcHJpbnRLZXlWYWx1ZSh7XG4gICAgJ0ZpbGUgUGF0aCc6IGZpbGUsXG4gICAgJ0ZpbGUgU2l6ZSc6IGZvcm1hdEZpbGVTaXplKGZpbGVTdGF0cy5zaXplKSxcbiAgICAnRXh0ZW5zaW9uJzogZmlsZUV4dCxcbiAgfSk7XG5cbiAgY29uc29sZS5sb2coJycpO1xuICBwcmludEluZm8oJ1JlYWRpbmcgcGlwZWxpbmUgcHJvcGVydGllcy4uLicpO1xuXG4gIGxldCBwcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHRyeSB7XG4gICAgcHJvcHMgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhmaWxlLCAndXRmLTgnKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcHJpbnRFcnJvcignSW52YWxpZCBKU09OIGluIHByb3BlcnRpZXMgZmlsZScsIHtcbiAgICAgIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyb3IpLFxuICAgICAgaGludDogJ0Vuc3VyZSB0aGUgZmlsZSBjb250YWlucyB2YWxpZCBKU09OIHN5bnRheCcsXG4gICAgfSk7XG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcignUHJvcGVydGllcyBmaWxlIG11c3QgY29udGFpbiB2YWxpZCBKU09OJywgJ2ZpbGUnKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgcHJvcHMgIT09ICdvYmplY3QnIHx8IHByb3BzID09PSBudWxsKSB7XG4gICAgcHJpbnRFcnJvcignSW52YWxpZCBwcm9wZXJ0aWVzIGZvcm1hdCcsIHtcbiAgICAgIHR5cGU6IHR5cGVvZiBwcm9wcyxcbiAgICAgIGhpbnQ6ICdQcm9wZXJ0aWVzIG11c3QgYmUgYSBKU09OIG9iamVjdCcsXG4gICAgfSk7XG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcignUHJvcGVydGllcyBtdXN0IGJlIGEgdmFsaWQgb2JqZWN0JywgJ2ZpbGUnKTtcbiAgfVxuXG4gIGNvbnN0IHByb3BDb3VudCA9IE9iamVjdC5rZXlzKHByb3BzKS5sZW5ndGg7XG4gIHByaW50U3VjY2VzcygnUHJvcGVydGllcyBwYXJzZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gIHByaW50S2V5VmFsdWUoe1xuICAgICdUb3RhbCBLZXlzJzogcHJvcENvdW50LnRvU3RyaW5nKCksXG4gICAgJ1NhbXBsZSBLZXlzJzogT2JqZWN0LmtleXMocHJvcHMpLnNsaWNlKDAsIDUpLmpvaW4oJywgJykgKyAocHJvcENvdW50ID4gNSA/ICcuLi4nIDogJycpLFxuICB9KTtcbiAgaWYgKHByb3BDb3VudCA9PT0gMCkge1xuICAgIHByaW50V2FybmluZygnUHJvcGVydGllcyBvYmplY3QgaXMgZW1wdHkgLSBwaXBlbGluZSB3aWxsIGhhdmUgbm8gY29uZmlndXJhdGlvbicpO1xuICB9XG4gIHJldHVybiBwcm9wcztcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgY3JlYXRlIHJlcXVlc3QuIFByb2plY3QgJiBvcmdhbml6YXRpb24gcHJlZmVyIHRoZSBDTEkgZmxhZ3MgYW5kXG4gKiBmYWxsIGJhY2sgdG8gdmFsdWVzIGVtYmVkZGVkIGluIHRoZSBwcm9wcyBmaWxlIChidWlsZGVyUHJvcHMpLlxuICovXG5mdW5jdGlvbiBidWlsZENyZWF0ZVBheWxvYWQob3B0aW9uczogQ3JlYXRlUGlwZWxpbmVPcHRpb25zLCBwcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBDcmVhdGVQaXBlbGluZVJlcXVlc3Qge1xuICBjb25zdCByZXNvbHZlZFByb2plY3QgPSBvcHRpb25zLnByb2plY3QgPz8gKHByb3BzLnByb2plY3QgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKTtcbiAgY29uc3QgcmVzb2x2ZWRPcmdhbml6YXRpb24gPSBvcHRpb25zLm9yZ2FuaXphdGlvbiA/PyAocHJvcHMub3JnYW5pemF0aW9uIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG5cbiAgaWYgKCFyZXNvbHZlZFByb2plY3QpIHtcbiAgICBwcmludEVycm9yKCdQcm9qZWN0IGlzIHJlcXVpcmVkJywge1xuICAgICAgaGludDogJ1Byb3ZpZGUgLXAvLS1wcm9qZWN0IGZsYWcgb3IgaW5jbHVkZSBcInByb2plY3RcIiBpbiB0aGUgcHJvcHMgZmlsZScsXG4gICAgfSk7XG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcignUHJvamVjdCBpcyByZXF1aXJlZCcsICdwcm9qZWN0Jyk7XG4gIH1cbiAgaWYgKCFyZXNvbHZlZE9yZ2FuaXphdGlvbikge1xuICAgIHByaW50RXJyb3IoJ09yZ2FuaXphdGlvbiBpcyByZXF1aXJlZCcsIHtcbiAgICAgIGhpbnQ6ICdQcm92aWRlIC1vLy0tb3JnYW5pemF0aW9uIGZsYWcgb3IgaW5jbHVkZSBcIm9yZ2FuaXphdGlvblwiIGluIHRoZSBwcm9wcyBmaWxlJyxcbiAgICB9KTtcbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdPcmdhbml6YXRpb24gaXMgcmVxdWlyZWQnLCAnb3JnYW5pemF0aW9uJyk7XG4gIH1cblxuICAvLyBSZXNvbHZlIHBpcGVsaW5lTmFtZSB3aXRoIHRoZSBzaGFyZWQgZGVmYXVsdCAobWlycm9ycyBwaXBlbGluZS1jb3JlJ3NcbiAgLy8gcGlwZWxpbmUtY29uZmlndXJhdGlvbi50cykgc28gY3JlYXRlICsgcmVnaXN0cnkgKyBDREsgYWxsIGFncmVlLlxuICBjb25zdCByZXNvbHZlZFBpcGVsaW5lTmFtZSA9IG9wdGlvbnMubmFtZVxuICAgID8/IChwcm9wcy5waXBlbGluZU5hbWUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKVxuICAgID8/IGRlZmF1bHRQaXBlbGluZU5hbWUocmVzb2x2ZWRPcmdhbml6YXRpb24sIHJlc29sdmVkUHJvamVjdCk7XG5cbiAgY29uc3QgcGF5bG9hZDogQ3JlYXRlUGlwZWxpbmVSZXF1ZXN0ID0ge1xuICAgIHByb2plY3Q6IHJlc29sdmVkUHJvamVjdCxcbiAgICBvcmdhbml6YXRpb246IHJlc29sdmVkT3JnYW5pemF0aW9uLFxuICAgIHBpcGVsaW5lTmFtZTogcmVzb2x2ZWRQaXBlbGluZU5hbWUsXG4gICAgcHJvcHMsXG4gIH07XG4gIGlmIChvcHRpb25zLnZpc2liaWxpdHkpIHBheWxvYWQudmlzaWJpbGl0eSA9IG9wdGlvbnMudmlzaWJpbGl0eTtcbiAgaWYgKG9wdGlvbnMuZGVmYXVsdCAhPT0gdW5kZWZpbmVkKSBwYXlsb2FkLmlzRGVmYXVsdCA9IG9wdGlvbnMuZGVmYXVsdDtcbiAgaWYgKG9wdGlvbnMuYWN0aXZlICE9PSB1bmRlZmluZWQpIHBheWxvYWQuaXNBY3RpdmUgPSBvcHRpb25zLmFjdGl2ZTtcbiAgcmV0dXJuIHBheWxvYWQ7XG59XG5cbi8qKiBQcmludCB0aGUgcmVxdWVzdCB0aGF0IHdvdWxkIGJlIHNlbnQsIGZvciBgLS1kcnktcnVuYC4gKi9cbmZ1bmN0aW9uIHByaW50RHJ5UnVuKG9wdGlvbnM6IENyZWF0ZVBpcGVsaW5lT3B0aW9ucywgcGF5bG9hZDogQ3JlYXRlUGlwZWxpbmVSZXF1ZXN0KTogdm9pZCB7XG4gIGNvbnNvbGUubG9nKCcnKTtcbiAgcHJpbnRTZWN0aW9uKCdEcnkgUnVuIC0gUmVxdWVzdCBQcmV2aWV3Jyk7XG4gIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHBheWxvYWQsIG51bGwsIDIpKTtcbiAgY29uc29sZS5sb2coJycpO1xuICBwcmludFN1Y2Nlc3MoJ+KckyBWYWxpZGF0aW9uIGNvbXBsZXRlIC0gbm8gcGlwZWxpbmUgY3JlYXRlZCAoZHJ5IHJ1biBtb2RlKScpO1xuICBjb25zb2xlLmxvZygnJyk7XG4gIGlmIChvcHRpb25zLmRlcGxveSkge1xuICAgIHByaW50SW5mbygnV2l0aCAtLWRlcGxveSwgdGhlIHBpcGVsaW5lIHdvdWxkIGJlIGRlcGxveWVkIHZpYSBDREsgYWZ0ZXIgY3JlYXRpb24nLCB7XG4gICAgICBwcm9maWxlOiBvcHRpb25zLnByb2ZpbGUgfHwgJyhkZWZhdWx0KScsXG4gICAgICByZWdpb246IG9wdGlvbnMucmVnaW9uIHx8ICcoZGVmYXVsdCknLFxuICAgICAgcmVxdWlyZUFwcHJvdmFsOiBvcHRpb25zLnJlcXVpcmVBcHByb3ZhbCxcbiAgICB9KTtcbiAgfVxuICBwcmludEluZm8oJ1RvIGNyZWF0ZSB0aGUgcGlwZWxpbmUsIHJ1biB0aGUgY29tbWFuZCB3aXRob3V0IC0tZHJ5LXJ1bicpO1xufVxuXG4vKiogUHJpbnQgdGhlIGNyZWF0ZWQgcGlwZWxpbmUgYW5kIHNhdmUgaXQgdG8gYC4vb3V0cHV0L3BpcGVsaW5lLTxpZD4uanNvbmAuICovXG5mdW5jdGlvbiByZXBvcnRDcmVhdGVkUGlwZWxpbmUocGlwZWxpbmU6IFBpcGVsaW5lLCBleGVjdXRpb25JZDogc3RyaW5nLCByZXF1ZXN0RHVyYXRpb246IG51bWJlciwgc3RhcnRUaW1lOiBudW1iZXIpOiB2b2lkIHtcbiAgY29uc29sZS5sb2coJycpO1xuICBwcmludFNlY3Rpb24oJ+KckyBQaXBlbGluZSBDcmVhdGVkIFN1Y2Nlc3NmdWxseScpO1xuICBwcmludEtleVZhbHVlKHtcbiAgICAnUGlwZWxpbmUgSUQnOiBncmVlbihib2xkKHBpcGVsaW5lLmlkKSksXG4gICAgJ1Byb2plY3QnOiBwaXBlbGluZS5wcm9qZWN0LFxuICAgICdPcmdhbml6YXRpb24nOiBwaXBlbGluZS5vcmdhbml6YXRpb24sXG4gICAgJ05hbWUnOiBwaXBlbGluZS5waXBlbGluZU5hbWUgfHwgJyhub3Qgc2V0KScsXG4gICAgJ1Zpc2liaWxpdHknOiBwaXBlbGluZS52aXNpYmlsaXR5IHx8ICdvcmcnLFxuICAgICdEZWZhdWx0JzogcGlwZWxpbmUuaXNEZWZhdWx0ID8gJ1llcycgOiAnTm8nLFxuICAgICdBY3RpdmUnOiBwaXBlbGluZS5pc0FjdGl2ZSA/ICdZZXMnIDogJ05vJyxcbiAgICAnUHJvcGVydGllcyc6IHBpcGVsaW5lLnByb3BzID8gYCR7T2JqZWN0LmtleXMocGlwZWxpbmUucHJvcHMpLmxlbmd0aH0ga2V5c2AgOiAnKG5vdCByZXR1cm5lZCknLFxuICB9KTtcblxuICBpZiAocGlwZWxpbmUuY3JlYXRlZEF0KSB7XG4gICAgY29uc29sZS5sb2coJycpO1xuICAgIHByaW50S2V5VmFsdWUoeyAnQ3JlYXRlZCBBdCc6IHBpcGVsaW5lLmNyZWF0ZWRBdCB9KTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKCcnKTtcbiAgcHJpbnRLZXlWYWx1ZSh7XG4gICAgJ0V4ZWN1dGlvbiBJRCc6IGV4ZWN1dGlvbklkLFxuICAgICdSZXF1ZXN0IER1cmF0aW9uJzogZm9ybWF0RHVyYXRpb24ocmVxdWVzdER1cmF0aW9uKSxcbiAgICAnVG90YWwgRHVyYXRpb24nOiBmb3JtYXREdXJhdGlvbihEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSxcbiAgfSk7XG5cbiAgY29uc3Qgb3V0cHV0RGlyID0gJy4vb3V0cHV0JztcbiAgZW5zdXJlT3V0cHV0RGlyZWN0b3J5KG91dHB1dERpcik7XG4gIGNvbnN0IG91dHB1dEZpbGUgPSBwYXRoLmpvaW4ob3V0cHV0RGlyLCBgcGlwZWxpbmUtJHtwaXBlbGluZS5pZH0uanNvbmApO1xuICBmcy53cml0ZUZpbGVTeW5jKG91dHB1dEZpbGUsIEpTT04uc3RyaW5naWZ5KHBpcGVsaW5lLCBudWxsLCAyKSk7XG5cbiAgY29uc29sZS5sb2coJycpO1xuICBwcmludFN1Y2Nlc3MoJ1BpcGVsaW5lIGRldGFpbHMgc2F2ZWQgdG8gZmlsZScpO1xuICBwcmludEtleVZhbHVlKHtcbiAgICAnT3V0cHV0IEZpbGUnOiBvdXRwdXRGaWxlLFxuICAgICdGaWxlIFNpemUnOiBmb3JtYXRGaWxlU2l6ZShmcy5zdGF0U3luYyhvdXRwdXRGaWxlKS5zaXplKSxcbiAgfSk7XG59XG5cbi8qKlxuICogYC0tZGVwbG95YDogcnVuIHRoZSBzYW1lIENESyBkZXBsb3kgKyBBUk4gcmVnaXN0cmF0aW9uIGFzIGBwaXBlbGluZSBkZXBsb3lcbiAqIC0taWRgLiBUaGUgcmVjb3JkIGFscmVhZHkgZXhpc3RzIGFuZCBpcyBhdXRob3JpdGF0aXZlOiBpZiB0aGUgZGVwbG95IGZhaWxzIGl0XG4gKiBpcyBLRVBUIGFuZCB0aGUgZXhhY3QgcmV0cnkgaXMgc3VyZmFjZWQgcmF0aGVyIHRoYW4gcm9sbGVkIGJhY2sgKG5ldmVyXG4gKiBmYWxzZS1ncmVlbikuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlcGxveUNyZWF0ZWRQaXBlbGluZShcbiAgb3B0aW9uczogQ3JlYXRlUGlwZWxpbmVPcHRpb25zLFxuICBwaXBlbGluZUlkOiBzdHJpbmcsXG4gIGV4ZWN1dGlvbklkOiBzdHJpbmcsXG4gIGRlYnVnOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnNvbGUubG9nKCcnKTtcbiAgcHJpbnRTZWN0aW9uKCdEZXBsb3lpbmcgUGlwZWxpbmUnKTtcbiAgdHJ5IHtcbiAgICAvLyBEZXBsb3kgdG91Y2hlcyB0aGUgQVdTIFNESyArIHRoZSBDREsgc3ludGggc3VicHJvY2VzczsgcmVsYXggVExTIHRoZVxuICAgIC8vIHNhbWUgd2F5IGBkZXBsb3lgIGRvZXMgKHJlZnVzZWQgaW4gcHJvZHVjdGlvbiBieSByZWxheFRsc0ZvckNsaSkuXG4gICAgcmVsYXhUbHNGb3JDbGkob3B0aW9ucy52ZXJpZnlTc2wsIHByaW50V2FybmluZyk7XG4gICAgLy8gVGhlIGFzeW5jIGNsaWVudCBhZGRzIC0tc3RvcmUtdG9rZW5zIChTZWNyZXRzIE1hbmFnZXIpIHN1cHBvcnQgYW5kXG4gICAgLy8gYmFja3MgQk9USCB0aGUgcHJvcHMgZmV0Y2ggYW5kIHRoZSByZWdpc3RyeSBjYWxsYmFjay5cbiAgICBjb25zdCBkZXBsb3lDbGllbnQgPSBhd2FpdCBjcmVhdGVBdXRoZW50aWNhdGVkQ2xpZW50QXN5bmMob3B0aW9ucyk7XG4gICAgY29uc3QgZGVwbG95Q29uZmlnID0gZGVwbG95Q2xpZW50LmdldENvbmZpZygpIGFzIFBsYXRmb3JtRGVwbG95Q29uZmlnO1xuICAgIC8vIFJlLWZldGNoIHRoZSBqdXN0LWNyZWF0ZWQgcGlwZWxpbmUgc28gcGx1Z2lucyBhcmUgcmVzb2x2ZWQgYW5kIHRoZVxuICAgIC8vIHJlZ2lzdHJ5IGhvc3QgaXMgYmFrZWQgRVhBQ1RMWSBhcyBgZGVwbG95IC0taWRgIGRvZXMg4oCUIG5vIGRyaWZ0LlxuICAgIGNvbnN0IGZldGNoZWQgPSBhd2FpdCBmZXRjaFBpcGVsaW5lUHJvcHMoZGVwbG95Q2xpZW50LCBwaXBlbGluZUlkKTtcbiAgICBhd2FpdCBydW5EZXBsb3koe1xuICAgICAgcGlwZWxpbmU6IGZldGNoZWQucGlwZWxpbmUsXG4gICAgICBwcm9wc1dpdGhJZHM6IGZldGNoZWQucHJvcHNXaXRoSWRzLFxuICAgICAgcHJvZmlsZTogb3B0aW9ucy5wcm9maWxlLFxuICAgICAgcmVnaW9uOiBvcHRpb25zLnJlZ2lvbixcbiAgICAgIHJlcXVpcmVBcHByb3ZhbDogb3B0aW9ucy5yZXF1aXJlQXBwcm92YWwsXG4gICAgICBvdXRwdXQ6IG9wdGlvbnMub3V0cHV0LFxuICAgICAgZGVidWcsXG4gICAgICBleGVjdXRpb25JZCxcbiAgICAgIHBsYXRmb3JtQ2xpZW50OiBkZXBsb3lDbGllbnQsXG4gICAgICBwbGF0Zm9ybVBpcGVsaW5lVXJsOiBkZXBsb3lDb25maWcuYXBpLnBpcGVsaW5lVXJsLFxuICAgICAgcGxhdGZvcm1CYXNlVXJsOiBkZXBsb3lDb25maWcuYXBpLmJhc2VVcmwsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGRlcGxveUVycm9yKSB7XG4gICAgcHJpbnRFcnJvcignUGlwZWxpbmUgd2FzIGNyZWF0ZWQgYnV0IHRoZSBkZXBsb3kgZmFpbGVkJywge1xuICAgICAgcGlwZWxpbmVJZCxcbiAgICAgIGVycm9yOiBlcnJvck1lc3NhZ2UoZGVwbG95RXJyb3IpLFxuICAgICAgcmV0cnk6IGBwaXBlbGluZS1tYW5hZ2VyIHBpcGVsaW5lIGRlcGxveSAtLWlkICR7cGlwZWxpbmVJZH1gLFxuICAgIH0pO1xuICAgIC8vIFJlLXRocm93IHNvIHRoZSBwcm9jZXNzIGV4aXRzIG5vbi16ZXJvLiBUaGUgcmVjb3JkIGlzIGludGVudGlvbmFsbHlcbiAgICAvLyByZXRhaW5lZCDigJQgcmUtcnVuIHRoZSBkZXBsb3kgd2l0aCB0aGUgY29tbWFuZCBhYm92ZS5cbiAgICB0aHJvdyBkZXBsb3lFcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVycyB0aGUgYGNyZWF0ZS1waXBlbGluZWAgY29tbWFuZCB3aXRoIHRoZSBDTEkgcHJvZ3JhbS5cbiAqXG4gKiBBY2NlcHRzIGEgcGlwZWxpbmUgcHJvcGVydGllcyBKU09OIGZpbGUsIHZhbGlkYXRlcyBpdCwgcmVzb2x2ZXNcbiAqIHByb2plY3Qvb3JnYW5pemF0aW9uIGZyb20gQ0xJIGZsYWdzIG9yIHRoZSBwcm9wcyBmaWxlLCBhbmRcbiAqIGNyZWF0ZXMgdGhlIHBpcGVsaW5lIHZpYSB0aGUgcGxhdGZvcm0gQVBJLlxuICpcbiAqIEBwYXJhbSBwcm9ncmFtIC0gVGhlIHJvb3QgQ29tbWFuZGVyIHByb2dyYW0gaW5zdGFuY2UgdG8gYXR0YWNoIHRoZSBjb21tYW5kIHRvLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGlwZWxpbmUocHJvZ3JhbTogQ29tbWFuZCk6IHZvaWQge1xuICB3aXRoU3NsT3B0aW9ucyhcbiAgICB3aXRoUmVnaW9uT3B0aW9uKFxuICAgICAgd2l0aFByb2ZpbGVPcHRpb24ocHJvZ3JhbVxuICAgICAgICAuY29tbWFuZCgnY3JlYXRlJylcbiAgICAgICAgLmRlc2NyaXB0aW9uKCdDcmVhdGUgYSBuZXcgcGlwZWxpbmUg4oCUIGFuZCBvcHRpb25hbGx5IGRlcGxveSBpdCB3aXRoIC0tZGVwbG95JylcbiAgICAgICAgLnJlcXVpcmVkT3B0aW9uKCctZiwgLS1maWxlIDxmaWxlPicsICdQYXRoIHRvIHBpcGVsaW5lIHByb3BlcnRpZXMgSlNPTiBmaWxlJylcbiAgICAgICAgLm9wdGlvbignLXAsIC0tcHJvamVjdCA8cHJvamVjdD4nLCAnUHJvamVjdCBuYW1lIChmYWxscyBiYWNrIHRvIHZhbHVlIGluIHByb3BzIGZpbGUpJylcbiAgICAgICAgLm9wdGlvbignLW8sIC0tb3JnYW5pemF0aW9uIDxvcmdhbml6YXRpb24+JywgJ09yZ2FuaXphdGlvbiBuYW1lIChmYWxscyBiYWNrIHRvIHZhbHVlIGluIHByb3BzIGZpbGUpJylcbiAgICAgICAgLm9wdGlvbignLW4sIC0tbmFtZSA8bmFtZT4nLCAnUGlwZWxpbmUgbmFtZScpXG4gICAgICAgIC5vcHRpb24oJy1hLCAtLXZpc2liaWxpdHkgPHJ1bmc+JywgJ1NoYXJpbmcgcnVuZyAocHJpdmF0ZXxvcmd8cHVibGljKS4gUGlwZWxpbmVzIGRlZmF1bHQgdG8gb3JnIOKAlCBhIHRlYW0gYXNzZXQgaXMgdmlzaWJsZSB0byB0aGUgdGVhbS4nLCAnb3JnJylcbiAgICAgICAgLm9wdGlvbignLS1kZWZhdWx0JywgJ1NldCBhcyBkZWZhdWx0IHBpcGVsaW5lJywgZmFsc2UpXG4gICAgICAgIC5vcHRpb24oJy0tYWN0aXZlJywgJ1NldCBwaXBlbGluZSBhcyBhY3RpdmUnLCB0cnVlKVxuICAgICAgICAub3B0aW9uKCctLW5vLWFjdGl2ZScsICdDcmVhdGUgdGhlIHBpcGVsaW5lIGFzIGluYWN0aXZlJylcbiAgICAgICAgLy8gLS1kZXBsb3k6IGFmdGVyIGNyZWF0aW5nIHRoZSByZWNvcmQsIHJ1biB0aGUgc2FtZSBDREsgZGVwbG95ICsgQVJOXG4gICAgICAgIC8vIHJlZ2lzdHJhdGlvbiBhcyBgcGlwZWxpbmUgZGVwbG95IC0taWRgIChzaGFyZWQgcnVuRGVwbG95KS4gVGhlIGZsYWdzXG4gICAgICAgIC8vIGJlbG93IGFwcGx5IG9ubHkgd2l0aCAtLWRlcGxveS5cbiAgICAgICAgLm9wdGlvbignLS1kZXBsb3knLCAnRGVwbG95IHRoZSBwaXBlbGluZSB3aXRoIEFXUyBDREsgaW1tZWRpYXRlbHkgYWZ0ZXIgY3JlYXRpbmcgaXQnLCBmYWxzZSlcbiAgICAgICAgLm9wdGlvbignLS1yZXF1aXJlLWFwcHJvdmFsIDxhcHByb3ZhbD4nLCAnRGVwbG95IGFwcHJvdmFsIGxldmVsOiBuZXZlcnxhbnktY2hhbmdlfGJyb2FkZW5pbmcgKHdpdGggLS1kZXBsb3kpJywgJ25ldmVyJylcbiAgICAgICAgLm9wdGlvbignLS1vdXRwdXQgPGRpcj4nLCAnQ0RLIG91dHB1dCBkaXJlY3RvcnkgKHdpdGggLS1kZXBsb3kpJywgJ2Nkay5vdXQnKVxuICAgICAgICAub3B0aW9uKCctLXN0b3JlLXRva2VucycsICdEZXBsb3kgYXV0aCB2aWEgQVdTIFNlY3JldHMgTWFuYWdlciB0b2tlbiAod2l0aCAtLWRlcGxveTsgcmVxdWlyZXMgUExBVEZPUk1fU0VDUkVUX05BTUUpJywgZmFsc2UpKSxcbiAgICApLFxuICApXG4gICAgLm9wdGlvbignLS1kcnktcnVuJywgJ1ZhbGlkYXRlIGlucHV0cyB3aXRob3V0IGNyZWF0aW5nIHBpcGVsaW5lJywgZmFsc2UpXG4gICAgLmFjdGlvbihhc3luYyAob3B0aW9uczogQ3JlYXRlUGlwZWxpbmVPcHRpb25zKSA9PiB7XG4gICAgICBjb25zdCBleGVjdXRpb25JZCA9IHByaW50Q29tbWFuZEhlYWRlcignQ3JlYXRlIFBpcGVsaW5lJywgJ0NyZWF0aW5nIFBpcGVsaW5lJyk7XG4gICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICB0cnkge1xuXG4gICAgICAgIC8vIERpc3BsYXkgcGFyYW1ldGVyc1xuICAgICAgICBwcmludEluZm8oJ0NvbmZpZ3VyYXRpb24nKTtcbiAgICAgICAgcHJpbnRLZXlWYWx1ZSh7XG4gICAgICAgICAgJ1Byb2plY3QnOiBvcHRpb25zLnByb2plY3QgfHwgJyhmcm9tIHByb3BzIGZpbGUpJyxcbiAgICAgICAgICAnT3JnYW5pemF0aW9uJzogb3B0aW9ucy5vcmdhbml6YXRpb24gfHwgJyhmcm9tIHByb3BzIGZpbGUpJyxcbiAgICAgICAgICAnTmFtZSc6IG9wdGlvbnMubmFtZSB8fCAnKG5vdCBzZXQpJyxcbiAgICAgICAgICAnVmlzaWJpbGl0eSc6IG9wdGlvbnMudmlzaWJpbGl0eSxcbiAgICAgICAgICAnRGVmYXVsdCBQaXBlbGluZSc6IG9wdGlvbnMuZGVmYXVsdCA/ICdZZXMnIDogJ05vJyxcbiAgICAgICAgICAnQWN0aXZlJzogb3B0aW9ucy5hY3RpdmUgPyAnWWVzJyA6ICdObycsXG4gICAgICAgICAgJ0RlcGxveSBBZnRlciBDcmVhdGUnOiBvcHRpb25zLmRlcGxveSA/IGBZZXMgKHByb2ZpbGU6ICR7b3B0aW9ucy5wcm9maWxlIHx8ICdkZWZhdWx0J30pYCA6ICdObycsXG4gICAgICAgICAgJ1Byb3BlcnRpZXMgRmlsZSc6IG9wdGlvbnMuZmlsZSxcbiAgICAgICAgICAnU1NMIFZlcmlmaWNhdGlvbic6IG9wdGlvbnMudmVyaWZ5U3NsID09PSBmYWxzZSA/ICdEaXNhYmxlZCcgOiAnRW5hYmxlZCcsXG4gICAgICAgICAgJ0RyeSBSdW4nOiBvcHRpb25zLmRyeVJ1biA/ICdZZXMnIDogJ05vJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU2VjdXJpdHkgd2FybmluZyBmb3IgU1NMIHZlcmlmaWNhdGlvbiBkaXNhYmxlZFxuICAgICAgICBwcmludFNzbFdhcm5pbmcob3B0aW9ucy52ZXJpZnlTc2wpO1xuXG4gICAgICAgIGNvbnN0IHByb3BzID0gcmVhZFByb3BzRmlsZShvcHRpb25zLmZpbGUpO1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gYnVpbGRDcmVhdGVQYXlsb2FkKG9wdGlvbnMsIHByb3BzKTtcblxuICAgICAgICBpZiAob3B0aW9ucy5kcnlSdW4pIHtcbiAgICAgICAgICBwcmludERyeVJ1bihvcHRpb25zLCBwYXlsb2FkKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgYXV0aGVudGljYXRlZCBBUEkgY2xpZW50XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IGNyZWF0ZUF1dGhlbnRpY2F0ZWRDbGllbnQob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGNsaWVudC5nZXRDb25maWcoKTtcblxuICAgICAgICAvLyBDcmVhdGUgcGlwZWxpbmVcbiAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICBwcmludFNlY3Rpb24oJ0NyZWF0aW5nIFBpcGVsaW5lJyk7XG5cbiAgICAgICAgY29uc3Qgc3Bpbm5lciA9IG9yYSgnQ3JlYXRpbmcgcGlwZWxpbmUuLi4nKS5zdGFydCgpO1xuICAgICAgICBsZXQgcmF3UmVzcG9uc2U6IFBpcGVsaW5lUmVzcG9uc2U7XG4gICAgICAgIGxldCByZXF1ZXN0RHVyYXRpb246IG51bWJlcjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0U3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIHJhd1Jlc3BvbnNlID0gYXdhaXQgY2xpZW50LnBvc3Q8UGlwZWxpbmVSZXNwb25zZT4oXG4gICAgICAgICAgICBjb25maWcuYXBpLnBpcGVsaW5lVXJsLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlcXVlc3REdXJhdGlvbiA9IERhdGUubm93KCkgLSByZXF1ZXN0U3RhcnQ7XG4gICAgICAgICAgc3Bpbm5lci5zdWNjZWVkKCdQaXBlbGluZSBjcmVhdGVkJyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgc3Bpbm5lci5mYWlsKCdQaXBlbGluZSBjcmVhdGlvbiBmYWlsZWQnKTtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBpcGVsaW5lID0gZXh0cmFjdFNpbmdsZVJlc3BvbnNlPFBpcGVsaW5lPihyYXdSZXNwb25zZSwgJ3BpcGVsaW5lJywgJ2lkJyk7XG5cbiAgICAgICAgaWYgKCFwaXBlbGluZT8uaWQpIHtcbiAgICAgICAgICBwcmludEVycm9yKCdJbnZhbGlkIHBpcGVsaW5lIHJlc3BvbnNlJywge1xuICAgICAgICAgICAgcmVzcG9uc2VLZXlzOiByYXdSZXNwb25zZSA/IE9iamVjdC5rZXlzKHJhd1Jlc3BvbnNlKSA6ICcobnVsbCknLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGlwZWxpbmUgY3JlYXRpb24gZmFpbGVkIC0gbm8gdmFsaWQgcGlwZWxpbmUgZGF0YSByZWNlaXZlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVwb3J0Q3JlYXRlZFBpcGVsaW5lKHBpcGVsaW5lLCBleGVjdXRpb25JZCwgcmVxdWVzdER1cmF0aW9uLCBzdGFydFRpbWUpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmRlcGxveSkge1xuICAgICAgICAgIGF3YWl0IGRlcGxveUNyZWF0ZWRQaXBlbGluZShvcHRpb25zLCBwaXBlbGluZS5pZCwgZXhlY3V0aW9uSWQsIHByb2dyYW0ub3B0cygpLmRlYnVnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5leHQgc3RlcHNcbiAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICBwcmludFNlY3Rpb24oJ05leHQgU3RlcHMnKTtcbiAgICAgICAgY29uc29sZS5sb2coZGltKCdZb3UgY2FuIG5vdzonKSk7XG4gICAgICAgIGlmICghb3B0aW9ucy5kZXBsb3kpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICAke2N5YW4oJ+KAoicpfSBEZXBsb3k6ICR7Ym9sZChgZGVwbG95IC0taWQgJHtwaXBlbGluZS5pZH1gKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgICAke2N5YW4oJ+KAoicpfSBWaWV3OiAke2JvbGQoYGdldC1waXBlbGluZSAtLWlkICR7cGlwZWxpbmUuaWR9YCl9YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGAgICR7Y3lhbign4oCiJyl9IEFQSTogJHtjb25maWcuYXBpLmJhc2VVcmx9JHtjb25maWcuYXBpLnBpcGVsaW5lVXJsfS8ke3BpcGVsaW5lLmlkfWApO1xuICAgICAgICBjb25zb2xlLmxvZygnJyk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZUVycm9yKGVycm9yLCBFUlJPUl9DT0RFUy5BUElfUkVRVUVTVCwge1xuICAgICAgICAgIGRlYnVnOiBwcm9ncmFtLm9wdHMoKS5kZWJ1ZyxcbiAgICAgICAgICBleGl0OiB0cnVlLFxuICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgIGNvbW1hbmQ6ICdjcmVhdGUtcGlwZWxpbmUnLFxuICAgICAgICAgICAgZXhlY3V0aW9uSWQsXG4gICAgICAgICAgICBwcm9qZWN0OiBvcHRpb25zLnByb2plY3QsXG4gICAgICAgICAgICBvcmdhbml6YXRpb246IG9wdGlvbnMub3JnYW5pemF0aW9uLFxuICAgICAgICAgICAgZmlsZTogb3B0aW9ucy5maWxlLFxuICAgICAgICAgICAgdmVyaWZ5U3NsOiBvcHRpb25zLnZlcmlmeVNzbCxcbiAgICAgICAgICAgIGRyeVJ1bjogb3B0aW9ucy5kcnlSdW4sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG59Il19
@@ -46,7 +46,7 @@ export function listPipelines(program) {
46
46
  .action((options) => runListEntity(program, options, {
47
47
  labelPlural: 'Pipelines',
48
48
  responseKey: 'pipelines',
49
- listUrl: (config) => config.api.pipelineListUrl,
49
+ listUrl: (config) => config.api.pipelineUrl,
50
50
  commandName: 'list-pipelines',
51
51
  buildFilters: (options, base) => {
52
52
  const filters = { ...base };
@@ -96,4 +96,4 @@ export function listPipelines(program) {
96
96
  })),
97
97
  }));
98
98
  }
99
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1waXBlbGluZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvbGlzdC1waXBlbGluZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFpQixNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRCxPQUFPLEVBQTJCLE1BQU0sZ0NBQWdDLENBQUM7QUFnQnpFOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxPQUFnQjtJQUM1QyxjQUFjLENBQUMsT0FBTztTQUNuQixPQUFPLENBQUMsTUFBTSxDQUFDO1NBQ2YsV0FBVyxDQUFDLDRDQUE0QyxDQUFDO1FBRTFELHdCQUF3QjtTQUN2QixNQUFNLENBQUMsV0FBVyxFQUFFLDBEQUEwRCxDQUFDO1NBQy9FLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSw2Q0FBNkMsQ0FBQztTQUM1RSxNQUFNLENBQUMsd0JBQXdCLEVBQUUsdUNBQXVDLENBQUM7U0FDekUsTUFBTSxDQUFDLHVCQUF1QixFQUFFLHNDQUFzQyxDQUFDO1NBQ3ZFLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxvQ0FBb0MsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7U0FDNUYsTUFBTSxDQUFDLG1CQUFtQixFQUFFLDJCQUEyQixFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FB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QUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFO1lBQ3JGLG1CQUFtQixFQUFFLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRTtTQUN4RixDQUFDO1FBQ0YsSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNoRixJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUU7WUFDVixTQUFTLEVBQUUsQ0FBQyxDQUFDLE9BQU87WUFDcEIsY0FBYyxFQUFFLENBQUMsQ0FBQyxZQUFZO1lBQzlCLE1BQU0sRUFBRSxDQUFDLENBQUMsWUFBWSxJQUFJLEtBQUs7WUFDL0IsWUFBWSxFQUFFLENBQUMsQ0FBQyxVQUFVLElBQUksU0FBUztZQUN2QyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQ3JDLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDbkMsWUFBWSxFQUFFLENBQUMsQ0FBQyxTQUFTLElBQUksS0FBSztTQUNuQyxDQUFDLENBQUM7S0FDSixDQUFDLENBQUMsQ0FBQztBQUNSLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBydW5MaXN0RW50aXR5IH0gZnJvbSAnLi9lbnRpdHktbGlzdC5qcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZUJvb2xlYW4gfSBmcm9tICcuLi9jb25maWcvY2xpLmNvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyB0eXBlIFBpcGVsaW5lIH0gZnJvbSAnLi4vdHlwZXMvaW5kZXguanMnO1xuaW1wb3J0IHsgd2l0aFNzbE9wdGlvbnMgfSBmcm9tICcuLi91dGlscy9jb21tYW5kLXV0aWxzLmpzJztcbmltcG9ydCB7IHR5cGUgQ29tbW9uRmlsdGVyUGFyYW1zIH0gZnJvbSAnLi4vdXRpbHMvbGlzdC1jb21tYW5kLXV0aWxzLmpzJztcblxuLyoqXG4gKiBRdWVyeSBwYXJhbWV0ZXJzIGZvciB0aGUgcGlwZWxpbmUgbGlzdCBBUEkgZW5kcG9pbnQuXG4gKiBDb21iaW5lcyBjb21tb24gZmlsdGVycyAocGFnaW5hdGlvbiwgc29ydCwgYWNjZXNzKSB3aXRoIHBpcGVsaW5lLXNwZWNpZmljIGZpbHRlcnMuXG4gKi9cbmludGVyZmFjZSBQaXBlbGluZUZpbHRlclBhcmFtcyBleHRlbmRzIENvbW1vbkZpbHRlclBhcmFtcyB7XG4gIHZpc2liaWxpdHk/OiBzdHJpbmc7XG4gIGlzRGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLy8gUGlwZWxpbmUtc3BlY2lmaWMgZmlsdGVyc1xuICBwcm9qZWN0Pzogc3RyaW5nO1xuICBvcmdhbml6YXRpb24/OiBzdHJpbmc7XG4gIHBpcGVsaW5lTmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIGBsaXN0LXBpcGVsaW5lc2AgY29tbWFuZCB3aXRoIHRoZSBDTEkgcHJvZ3JhbS5cbiAqXG4gKiBRdWVyaWVzIHBpcGVsaW5lcyB3aXRoIGZpbHRlcnMgZm9yIHByb2plY3QsIG9yZ2FuaXphdGlvbiwgbmFtZSxcbiAqIGFjY2VzcyBtb2RpZmllciwgYWN0aXZlL2RlZmF1bHQgc3RhdHVzLCBwbHVzIHBhZ2luYXRpb24gYW5kIHNvcnRpbmcuXG4gKlxuICogQHBhcmFtIHByb2dyYW0gLSBUaGUgcm9vdCBDb21tYW5kZXIgcHJvZ3JhbSBpbnN0YW5jZSB0byBhdHRhY2ggdGhlIGNvbW1hbmQgdG8uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGJhc2hcbiAqIGNsaSBwaXBlbGluZSBsaXN0XG4gKiBjbGkgcGlwZWxpbmUgbGlzdCAtLXByb2plY3QgbXktYXBwIC0taXMtYWN0aXZlIHRydWVcbiAqIGNsaSBwaXBlbGluZSBsaXN0IC0tb3JnYW5pemF0aW9uIG15LW9yZ1xuICogY2xpIHBpcGVsaW5lIGxpc3QgLS1saW1pdCA1MCAtLW9mZnNldCAxMDAgLS1zb3J0IFwicGlwZWxpbmVOYW1lOmFzY1wiXG4gKiBjbGkgcGlwZWxpbmUgbGlzdCAtLWZvcm1hdCBqc29uIC0tb3V0cHV0IHBpcGVsaW5lcy5qc29uXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RQaXBlbGluZXMocHJvZ3JhbTogQ29tbWFuZCk6IHZvaWQge1xuICB3aXRoU3NsT3B0aW9ucyhwcm9ncmFtXG4gICAgLmNvbW1hbmQoJ2xpc3QnKVxuICAgIC5kZXNjcmlwdGlvbignUXVlcnkgcGlwZWxpbmVzIHdpdGggY29tcHJlaGVuc2l2ZSBmaWx0ZXJzJylcblxuICAgIC8vIENvbW1vbiBmaWx0ZXIgb3B0aW9uc1xuICAgIC5vcHRpb24oJy0taWQgPGlkPicsICdGaWx0ZXIgYnkgcGlwZWxpbmUgSUQgKGNhbiBzcGVjaWZ5IG11bHRpcGxlIHdpdGggY29tbWFzKScpXG4gICAgLm9wdGlvbignLS12aXNpYmlsaXR5IDxydW5nPicsICdGaWx0ZXIgYnkgc2hhcmluZyBydW5nIChwcml2YXRlL29yZy9wdWJsaWMpJylcbiAgICAub3B0aW9uKCctLWlzLWRlZmF1bHQgPGJvb2xlYW4+JywgJ0ZpbHRlciBieSBkZWZhdWx0IHN0YXR1cyAodHJ1ZS9mYWxzZSknKVxuICAgIC5vcHRpb24oJy0taXMtYWN0aXZlIDxib29sZWFuPicsICdGaWx0ZXIgYnkgYWN0aXZlIHN0YXR1cyAodHJ1ZS9mYWxzZSknKVxuICAgIC5vcHRpb24oJy0tbGltaXQgPG51bWJlcj4nLCAnTWF4aW11bSBudW1iZXIgb2YgcmVzdWx0cyAoMS0xMDAwKScsICh2KSA9PiBwYXJzZUludCh2LCAxMCksIDUwKVxuICAgIC5vcHRpb24oJy0tb2Zmc2V0IDxudW1iZXI+JywgJ051bWJlciBvZiByZXN1bHRzIHRvIHNraXAnLCAodikgPT4gcGFyc2VJbnQodiwgMTApLCAwKVxuICAgIC5vcHRpb24oJy0tc29ydCA8c29ydD4nLCAnU29ydCBmb3JtYXQ6IGZpZWxkOmRpcmVjdGlvbiAoZS5nLiwgcGlwZWxpbmVOYW1lOmFzYywgY3JlYXRlZEF0OmRlc2MpJylcblxuICAgIC8vIFBpcGVsaW5lLXNwZWNpZmljIGZpbHRlciBvcHRpb25zXG4gICAgLm9wdGlvbignLS1wcm9qZWN0IDxwcm9qZWN0PicsICdGaWx0ZXIgYnkgZXhhY3QgcHJvamVjdCBuYW1lJylcbiAgICAub3B0aW9uKCctLW9yZ2FuaXphdGlvbiA8b3JnYW5pemF0aW9uPicsICdGaWx0ZXIgYnkgZXhhY3Qgb3JnYW5pemF0aW9uIG5hbWUnKVxuICAgIC5vcHRpb24oJy0tcGlwZWxpbmUtbmFtZSA8bmFtZT4nLCAnRmlsdGVyIGJ5IGV4YWN0IHBpcGVsaW5lIG5hbWUnKVxuXG4gICAgLy8gT3V0cHV0IG9wdGlvbnNcbiAgICAub3B0aW9uKCctZiwgLS1mb3JtYXQgPGZvcm1hdD4nLCAnT3V0cHV0IGZvcm1hdCAoanNvbiwgeWFtbCwgdGFibGUsIGNzdiknLCAndGFibGUnKVxuICAgIC5vcHRpb24oJy1vLCAtLW91dHB1dCA8ZmlsZT4nLCAnU2F2ZSBvdXRwdXQgdG8gZmlsZScpXG4gICAgLm9wdGlvbignLS1zaG93LXByb3BzJywgJ0luY2x1ZGUgcGlwZWxpbmUgcHJvcGVydGllcyBpbiBvdXRwdXQgKGpzb24veWFtbCBvbmx5KScsIGZhbHNlKSlcblxuICAgIC5hY3Rpb24oKG9wdGlvbnMpID0+IHJ1bkxpc3RFbnRpdHk8UGlwZWxpbmUsIFBpcGVsaW5lRmlsdGVyUGFyYW1zPihwcm9ncmFtLCBvcHRpb25zLCB7XG4gICAgICBsYWJlbFBsdXJhbDogJ1BpcGVsaW5lcycsXG4gICAgICByZXNwb25zZUtleTogJ3BpcGVsaW5lcycsXG4gICAgICBsaXN0VXJsOiAoY29uZmlnKSA9PiBjb25maWcuYXBpLnBpcGVsaW5lTGlzdFVybCxcbiAgICAgIGNvbW1hbmROYW1lOiAnbGlzdC1waXBlbGluZXMnLFxuICAgICAgYnVpbGRGaWx0ZXJzOiAob3B0aW9ucywgYmFzZSkgPT4ge1xuICAgICAgICBjb25zdCBmaWx0ZXJzOiBQaXBlbGluZUZpbHRlclBhcmFtcyA9IHsgLi4uYmFzZSB9O1xuICAgICAgICBpZiAob3B0aW9ucy52aXNpYmlsaXR5KSBmaWx0ZXJzLnZpc2liaWxpdHkgPSBvcHRpb25zLnZpc2liaWxpdHkgYXMgc3RyaW5nO1xuICAgICAgICBpZiAob3B0aW9ucy5pc0RlZmF1bHQgIT09IHVuZGVmaW5lZCkgZmlsdGVycy5pc0RlZmF1bHQgPSB2YWxpZGF0ZUJvb2xlYW4ob3B0aW9ucy5pc0RlZmF1bHQgYXMgc3RyaW5nLCAnaXMtZGVmYXVsdCcpO1xuICAgICAgICBpZiAob3B0aW9ucy5wcm9qZWN0KSBmaWx0ZXJzLnByb2plY3QgPSBvcHRpb25zLnByb2plY3QgYXMgc3RyaW5nO1xuICAgICAgICBpZiAob3B0aW9ucy5vcmdhbml6YXRpb24pIGZpbHRlcnMub3JnYW5pemF0aW9uID0gb3B0aW9ucy5vcmdhbml6YXRpb24gYXMgc3RyaW5nO1xuICAgICAgICBpZiAob3B0aW9ucy5waXBlbGluZU5hbWUpIGZpbHRlcnMucGlwZWxpbmVOYW1lID0gb3B0aW9ucy5waXBlbGluZU5hbWUgYXMgc3RyaW5nO1xuICAgICAgICByZXR1cm4gZmlsdGVycztcbiAgICAgIH0sXG4gICAgICBhY3RpdmVGaWx0ZXJzOiAoZmlsdGVycykgPT4ge1xuICAgICAgICBjb25zdCBhY3RpdmU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgICAgIGlmIChmaWx0ZXJzLmlkKSBhY3RpdmUuSUQgPSBmaWx0ZXJzLmlkO1xuICAgICAgICBpZiAoZmlsdGVycy52aXNpYmlsaXR5KSBhY3RpdmUuVmlzaWJpbGl0eSA9IGZpbHRlcnMudmlzaWJpbGl0eTtcbiAgICAgICAgaWYgKGZpbHRlcnMuaXNEZWZhdWx0ICE9PSB1bmRlZmluZWQpIGFjdGl2ZVsnSXMgRGVmYXVsdCddID0gZmlsdGVycy5pc0RlZmF1bHQ7XG4gICAgICAgIGlmIChmaWx0ZXJzLmlzQWN0aXZlICE9PSB1bmRlZmluZWQpIGFjdGl2ZVsnSXMgQWN0aXZlJ10gPSBmaWx0ZXJzLmlzQWN0aXZlO1xuICAgICAgICBpZiAoZmlsdGVycy5wcm9qZWN0KSBhY3RpdmUuUHJvamVjdCA9IGZpbHRlcnMucHJvamVjdDtcbiAgICAgICAgaWYgKGZpbHRlcnMub3JnYW5pemF0aW9uKSBhY3RpdmUuT3JnYW5pemF0aW9uID0gZmlsdGVycy5vcmdhbml6YXRpb247XG4gICAgICAgIGlmIChmaWx0ZXJzLnBpcGVsaW5lTmFtZSkgYWN0aXZlWydQaXBlbGluZSBOYW1lJ10gPSBmaWx0ZXJzLnBpcGVsaW5lTmFtZTtcbiAgICAgICAgcmV0dXJuIGFjdGl2ZTtcbiAgICAgIH0sXG4gICAgICBzdGF0aXN0aWNzOiAocGlwZWxpbmVzKSA9PiAoe1xuICAgICAgICAnQWN0aXZlIFBpcGVsaW5lcyc6IGAke3BpcGVsaW5lcy5maWx0ZXIocCA9PiBwLmlzQWN0aXZlKS5sZW5ndGh9LyR7cGlwZWxpbmVzLmxlbmd0aH1gLFxuICAgICAgICAnRGVmYXVsdCBQaXBlbGluZXMnOiBgJHtwaXBlbGluZXMuZmlsdGVyKHAgPT4gcC5pc0RlZmF1bHQpLmxlbmd0aH0vJHtwaXBlbGluZXMubGVuZ3RofWAsXG4gICAgICB9KSxcbiAgICAgIHJvd3M6IChwaXBlbGluZXMsIG9wdGlvbnMpID0+IG9wdGlvbnMuc2hvd1Byb3BzID8gcGlwZWxpbmVzIDogcGlwZWxpbmVzLm1hcChwID0+ICh7XG4gICAgICAgICdJRCc6IHAuaWQsXG4gICAgICAgICdQcm9qZWN0JzogcC5wcm9qZWN0LFxuICAgICAgICAnT3JnYW5pemF0aW9uJzogcC5vcmdhbml6YXRpb24sXG4gICAgICAgICdOYW1lJzogcC5waXBlbGluZU5hbWUgfHwgJ04vQScsXG4gICAgICAgICdWaXNpYmlsaXR5JzogcC52aXNpYmlsaXR5IHx8ICdwcml2YXRlJyxcbiAgICAgICAgJ0RlZmF1bHQnOiBwLmlzRGVmYXVsdCA/ICdZZXMnIDogJ05vJyxcbiAgICAgICAgJ0FjdGl2ZSc6IHAuaXNBY3RpdmUgPyAnWWVzJyA6ICdObycsXG4gICAgICAgICdDcmVhdGVkIEF0JzogcC5jcmVhdGVkQXQgfHwgJ04vQScsXG4gICAgICB9KSksXG4gICAgfSkpO1xufVxuIl19
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1waXBlbGluZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvbGlzdC1waXBlbGluZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFpQixNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRCxPQUFPLEVBQTJCLE1BQU0sZ0NBQWdDLENBQUM7QUFnQnpFOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxPQUFnQjtJQUM1QyxjQUFjLENBQUMsT0FBTztTQUNuQixPQUFPLENBQUMsTUFBTSxDQUFDO1NBQ2YsV0FBVyxDQUFDLDRDQUE0QyxDQUFDO1FBRTFELHdCQUF3QjtTQUN2QixNQUFNLENBQUMsV0FBVyxFQUFFLDBEQUEwRCxDQUFDO1NBQy9FLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSw2Q0FBNkMsQ0FBQztTQUM1RSxNQUFNLENBQUMsd0JBQXdCLEVBQUUsdUNBQXVDLENBQUM7U0FDekUsTUFBTSxDQUFDLHVCQUF1QixFQUFFLHNDQUFzQyxDQUFDO1NBQ3ZFLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxvQ0FBb0MsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7U0FDNUYsTUFBTSxDQUFDLG1CQUFtQixFQUFFLDJCQUEyQixFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FB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QUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFO1lBQ3JGLG1CQUFtQixFQUFFLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRTtTQUN4RixDQUFDO1FBQ0YsSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNoRixJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUU7WUFDVixTQUFTLEVBQUUsQ0FBQyxDQUFDLE9BQU87WUFDcEIsY0FBYyxFQUFFLENBQUMsQ0FBQyxZQUFZO1lBQzlCLE1BQU0sRUFBRSxDQUFDLENBQUMsWUFBWSxJQUFJLEtBQUs7WUFDL0IsWUFBWSxFQUFFLENBQUMsQ0FBQyxVQUFVLElBQUksU0FBUztZQUN2QyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQ3JDLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDbkMsWUFBWSxFQUFFLENBQUMsQ0FBQyxTQUFTLElBQUksS0FBSztTQUNuQyxDQUFDLENBQUM7S0FDSixDQUFDLENBQUMsQ0FBQztBQUNSLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBydW5MaXN0RW50aXR5IH0gZnJvbSAnLi9lbnRpdHktbGlzdC5qcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZUJvb2xlYW4gfSBmcm9tICcuLi9jb25maWcvY2xpLmNvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyB0eXBlIFBpcGVsaW5lIH0gZnJvbSAnLi4vdHlwZXMvaW5kZXguanMnO1xuaW1wb3J0IHsgd2l0aFNzbE9wdGlvbnMgfSBmcm9tICcuLi91dGlscy9jb21tYW5kLXV0aWxzLmpzJztcbmltcG9ydCB7IHR5cGUgQ29tbW9uRmlsdGVyUGFyYW1zIH0gZnJvbSAnLi4vdXRpbHMvbGlzdC1jb21tYW5kLXV0aWxzLmpzJztcblxuLyoqXG4gKiBRdWVyeSBwYXJhbWV0ZXJzIGZvciB0aGUgcGlwZWxpbmUgbGlzdCBBUEkgZW5kcG9pbnQuXG4gKiBDb21iaW5lcyBjb21tb24gZmlsdGVycyAocGFnaW5hdGlvbiwgc29ydCwgYWNjZXNzKSB3aXRoIHBpcGVsaW5lLXNwZWNpZmljIGZpbHRlcnMuXG4gKi9cbmludGVyZmFjZSBQaXBlbGluZUZpbHRlclBhcmFtcyBleHRlbmRzIENvbW1vbkZpbHRlclBhcmFtcyB7XG4gIHZpc2liaWxpdHk/OiBzdHJpbmc7XG4gIGlzRGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLy8gUGlwZWxpbmUtc3BlY2lmaWMgZmlsdGVyc1xuICBwcm9qZWN0Pzogc3RyaW5nO1xuICBvcmdhbml6YXRpb24/OiBzdHJpbmc7XG4gIHBpcGVsaW5lTmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIGBsaXN0LXBpcGVsaW5lc2AgY29tbWFuZCB3aXRoIHRoZSBDTEkgcHJvZ3JhbS5cbiAqXG4gKiBRdWVyaWVzIHBpcGVsaW5lcyB3aXRoIGZpbHRlcnMgZm9yIHByb2plY3QsIG9yZ2FuaXphdGlvbiwgbmFtZSxcbiAqIGFjY2VzcyBtb2RpZmllciwgYWN0aXZlL2RlZmF1bHQgc3RhdHVzLCBwbHVzIHBhZ2luYXRpb24gYW5kIHNvcnRpbmcuXG4gKlxuICogQHBhcmFtIHByb2dyYW0gLSBUaGUgcm9vdCBDb21tYW5kZXIgcHJvZ3JhbSBpbnN0YW5jZSB0byBhdHRhY2ggdGhlIGNvbW1hbmQgdG8uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGJhc2hcbiAqIGNsaSBwaXBlbGluZSBsaXN0XG4gKiBjbGkgcGlwZWxpbmUgbGlzdCAtLXByb2plY3QgbXktYXBwIC0taXMtYWN0aXZlIHRydWVcbiAqIGNsaSBwaXBlbGluZSBsaXN0IC0tb3JnYW5pemF0aW9uIG15LW9yZ1xuICogY2xpIHBpcGVsaW5lIGxpc3QgLS1saW1pdCA1MCAtLW9mZnNldCAxMDAgLS1zb3J0IFwicGlwZWxpbmVOYW1lOmFzY1wiXG4gKiBjbGkgcGlwZWxpbmUgbGlzdCAtLWZvcm1hdCBqc29uIC0tb3V0cHV0IHBpcGVsaW5lcy5qc29uXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RQaXBlbGluZXMocHJvZ3JhbTogQ29tbWFuZCk6IHZvaWQge1xuICB3aXRoU3NsT3B0aW9ucyhwcm9ncmFtXG4gICAgLmNvbW1hbmQoJ2xpc3QnKVxuICAgIC5kZXNjcmlwdGlvbignUXVlcnkgcGlwZWxpbmVzIHdpdGggY29tcHJlaGVuc2l2ZSBmaWx0ZXJzJylcblxuICAgIC8vIENvbW1vbiBmaWx0ZXIgb3B0aW9uc1xuICAgIC5vcHRpb24oJy0taWQgPGlkPicsICdGaWx0ZXIgYnkgcGlwZWxpbmUgSUQgKGNhbiBzcGVjaWZ5IG11bHRpcGxlIHdpdGggY29tbWFzKScpXG4gICAgLm9wdGlvbignLS12aXNpYmlsaXR5IDxydW5nPicsICdGaWx0ZXIgYnkgc2hhcmluZyBydW5nIChwcml2YXRlL29yZy9wdWJsaWMpJylcbiAgICAub3B0aW9uKCctLWlzLWRlZmF1bHQgPGJvb2xlYW4+JywgJ0ZpbHRlciBieSBkZWZhdWx0IHN0YXR1cyAodHJ1ZS9mYWxzZSknKVxuICAgIC5vcHRpb24oJy0taXMtYWN0aXZlIDxib29sZWFuPicsICdGaWx0ZXIgYnkgYWN0aXZlIHN0YXR1cyAodHJ1ZS9mYWxzZSknKVxuICAgIC5vcHRpb24oJy0tbGltaXQgPG51bWJlcj4nLCAnTWF4aW11bSBudW1iZXIgb2YgcmVzdWx0cyAoMS0xMDAwKScsICh2KSA9PiBwYXJzZUludCh2LCAxMCksIDUwKVxuICAgIC5vcHRpb24oJy0tb2Zmc2V0IDxudW1iZXI+JywgJ051bWJlciBvZiByZXN1bHRzIHRvIHNraXAnLCAodikgPT4gcGFyc2VJbnQodiwgMTApLCAwKVxuICAgIC5vcHRpb24oJy0tc29ydCA8c29ydD4nLCAnU29ydCBmb3JtYXQ6IGZpZWxkOmRpcmVjdGlvbiAoZS5nLiwgcGlwZWxpbmVOYW1lOmFzYywgY3JlYXRlZEF0OmRlc2MpJylcblxuICAgIC8vIFBpcGVsaW5lLXNwZWNpZmljIGZpbHRlciBvcHRpb25zXG4gICAgLm9wdGlvbignLS1wcm9qZWN0IDxwcm9qZWN0PicsICdGaWx0ZXIgYnkgZXhhY3QgcHJvamVjdCBuYW1lJylcbiAgICAub3B0aW9uKCctLW9yZ2FuaXphdGlvbiA8b3JnYW5pemF0aW9uPicsICdGaWx0ZXIgYnkgZXhhY3Qgb3JnYW5pemF0aW9uIG5hbWUnKVxuICAgIC5vcHRpb24oJy0tcGlwZWxpbmUtbmFtZSA8bmFtZT4nLCAnRmlsdGVyIGJ5IGV4YWN0IHBpcGVsaW5lIG5hbWUnKVxuXG4gICAgLy8gT3V0cHV0IG9wdGlvbnNcbiAgICAub3B0aW9uKCctZiwgLS1mb3JtYXQgPGZvcm1hdD4nLCAnT3V0cHV0IGZvcm1hdCAoanNvbiwgeWFtbCwgdGFibGUsIGNzdiknLCAndGFibGUnKVxuICAgIC5vcHRpb24oJy1vLCAtLW91dHB1dCA8ZmlsZT4nLCAnU2F2ZSBvdXRwdXQgdG8gZmlsZScpXG4gICAgLm9wdGlvbignLS1zaG93LXByb3BzJywgJ0luY2x1ZGUgcGlwZWxpbmUgcHJvcGVydGllcyBpbiBvdXRwdXQgKGpzb24veWFtbCBvbmx5KScsIGZhbHNlKSlcblxuICAgIC5hY3Rpb24oKG9wdGlvbnMpID0+IHJ1bkxpc3RFbnRpdHk8UGlwZWxpbmUsIFBpcGVsaW5lRmlsdGVyUGFyYW1zPihwcm9ncmFtLCBvcHRpb25zLCB7XG4gICAgICBsYWJlbFBsdXJhbDogJ1BpcGVsaW5lcycsXG4gICAgICByZXNwb25zZUtleTogJ3BpcGVsaW5lcycsXG4gICAgICBsaXN0VXJsOiAoY29uZmlnKSA9PiBjb25maWcuYXBpLnBpcGVsaW5lVXJsLFxuICAgICAgY29tbWFuZE5hbWU6ICdsaXN0LXBpcGVsaW5lcycsXG4gICAgICBidWlsZEZpbHRlcnM6IChvcHRpb25zLCBiYXNlKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlcnM6IFBpcGVsaW5lRmlsdGVyUGFyYW1zID0geyAuLi5iYXNlIH07XG4gICAgICAgIGlmIChvcHRpb25zLnZpc2liaWxpdHkpIGZpbHRlcnMudmlzaWJpbGl0eSA9IG9wdGlvbnMudmlzaWJpbGl0eSBhcyBzdHJpbmc7XG4gICAgICAgIGlmIChvcHRpb25zLmlzRGVmYXVsdCAhPT0gdW5kZWZpbmVkKSBmaWx0ZXJzLmlzRGVmYXVsdCA9IHZhbGlkYXRlQm9vbGVhbihvcHRpb25zLmlzRGVmYXVsdCBhcyBzdHJpbmcsICdpcy1kZWZhdWx0Jyk7XG4gICAgICAgIGlmIChvcHRpb25zLnByb2plY3QpIGZpbHRlcnMucHJvamVjdCA9IG9wdGlvbnMucHJvamVjdCBhcyBzdHJpbmc7XG4gICAgICAgIGlmIChvcHRpb25zLm9yZ2FuaXphdGlvbikgZmlsdGVycy5vcmdhbml6YXRpb24gPSBvcHRpb25zLm9yZ2FuaXphdGlvbiBhcyBzdHJpbmc7XG4gICAgICAgIGlmIChvcHRpb25zLnBpcGVsaW5lTmFtZSkgZmlsdGVycy5waXBlbGluZU5hbWUgPSBvcHRpb25zLnBpcGVsaW5lTmFtZSBhcyBzdHJpbmc7XG4gICAgICAgIHJldHVybiBmaWx0ZXJzO1xuICAgICAgfSxcbiAgICAgIGFjdGl2ZUZpbHRlcnM6IChmaWx0ZXJzKSA9PiB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAgICAgaWYgKGZpbHRlcnMuaWQpIGFjdGl2ZS5JRCA9IGZpbHRlcnMuaWQ7XG4gICAgICAgIGlmIChmaWx0ZXJzLnZpc2liaWxpdHkpIGFjdGl2ZS5WaXNpYmlsaXR5ID0gZmlsdGVycy52aXNpYmlsaXR5O1xuICAgICAgICBpZiAoZmlsdGVycy5pc0RlZmF1bHQgIT09IHVuZGVmaW5lZCkgYWN0aXZlWydJcyBEZWZhdWx0J10gPSBmaWx0ZXJzLmlzRGVmYXVsdDtcbiAgICAgICAgaWYgKGZpbHRlcnMuaXNBY3RpdmUgIT09IHVuZGVmaW5lZCkgYWN0aXZlWydJcyBBY3RpdmUnXSA9IGZpbHRlcnMuaXNBY3RpdmU7XG4gICAgICAgIGlmIChmaWx0ZXJzLnByb2plY3QpIGFjdGl2ZS5Qcm9qZWN0ID0gZmlsdGVycy5wcm9qZWN0O1xuICAgICAgICBpZiAoZmlsdGVycy5vcmdhbml6YXRpb24pIGFjdGl2ZS5Pcmdhbml6YXRpb24gPSBmaWx0ZXJzLm9yZ2FuaXphdGlvbjtcbiAgICAgICAgaWYgKGZpbHRlcnMucGlwZWxpbmVOYW1lKSBhY3RpdmVbJ1BpcGVsaW5lIE5hbWUnXSA9IGZpbHRlcnMucGlwZWxpbmVOYW1lO1xuICAgICAgICByZXR1cm4gYWN0aXZlO1xuICAgICAgfSxcbiAgICAgIHN0YXRpc3RpY3M6IChwaXBlbGluZXMpID0+ICh7XG4gICAgICAgICdBY3RpdmUgUGlwZWxpbmVzJzogYCR7cGlwZWxpbmVzLmZpbHRlcihwID0+IHAuaXNBY3RpdmUpLmxlbmd0aH0vJHtwaXBlbGluZXMubGVuZ3RofWAsXG4gICAgICAgICdEZWZhdWx0IFBpcGVsaW5lcyc6IGAke3BpcGVsaW5lcy5maWx0ZXIocCA9PiBwLmlzRGVmYXVsdCkubGVuZ3RofS8ke3BpcGVsaW5lcy5sZW5ndGh9YCxcbiAgICAgIH0pLFxuICAgICAgcm93czogKHBpcGVsaW5lcywgb3B0aW9ucykgPT4gb3B0aW9ucy5zaG93UHJvcHMgPyBwaXBlbGluZXMgOiBwaXBlbGluZXMubWFwKHAgPT4gKHtcbiAgICAgICAgJ0lEJzogcC5pZCxcbiAgICAgICAgJ1Byb2plY3QnOiBwLnByb2plY3QsXG4gICAgICAgICdPcmdhbml6YXRpb24nOiBwLm9yZ2FuaXphdGlvbixcbiAgICAgICAgJ05hbWUnOiBwLnBpcGVsaW5lTmFtZSB8fCAnTi9BJyxcbiAgICAgICAgJ1Zpc2liaWxpdHknOiBwLnZpc2liaWxpdHkgfHwgJ3ByaXZhdGUnLFxuICAgICAgICAnRGVmYXVsdCc6IHAuaXNEZWZhdWx0ID8gJ1llcycgOiAnTm8nLFxuICAgICAgICAnQWN0aXZlJzogcC5pc0FjdGl2ZSA/ICdZZXMnIDogJ05vJyxcbiAgICAgICAgJ0NyZWF0ZWQgQXQnOiBwLmNyZWF0ZWRBdCB8fCAnTi9BJyxcbiAgICAgIH0pKSxcbiAgICB9KSk7XG59XG4iXX0=