@pipeline-builder/pipeline-manager 3.4.70 → 3.4.72
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +43 -2
- package/dist/agent/ai.d.ts +55 -0
- package/dist/agent/ai.d.ts.map +1 -0
- package/dist/agent/ai.js +130 -0
- package/dist/agent/bootstrap.d.ts +54 -0
- package/dist/agent/bootstrap.d.ts.map +1 -0
- package/dist/agent/bootstrap.js +76 -0
- package/dist/agent/executor.d.ts +27 -0
- package/dist/agent/executor.d.ts.map +1 -0
- package/dist/agent/executor.js +57 -0
- package/dist/agent/health.d.ts +22 -0
- package/dist/agent/health.d.ts.map +1 -0
- package/dist/agent/health.js +55 -0
- package/dist/agent/post-steps.d.ts +55 -0
- package/dist/agent/post-steps.d.ts.map +1 -0
- package/dist/agent/post-steps.js +73 -0
- package/dist/agent/prereqs.d.ts +25 -0
- package/dist/agent/prereqs.d.ts.map +1 -0
- package/dist/agent/prereqs.js +100 -0
- package/dist/agent/targets.d.ts +122 -0
- package/dist/agent/targets.d.ts.map +1 -0
- package/dist/agent/targets.js +180 -0
- package/dist/agent/troubleshoot.d.ts +30 -0
- package/dist/agent/troubleshoot.d.ts.map +1 -0
- package/dist/agent/troubleshoot.js +87 -0
- package/dist/boilerplate.js +8 -13
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +123 -118
- package/dist/commands/audit-stacks.js +22 -24
- package/dist/commands/audit-tokens.js +25 -27
- package/dist/commands/bootstrap.js +29 -37
- package/dist/commands/create-pipeline.js +55 -92
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +58 -62
- package/dist/commands/get-pipeline.js +24 -28
- package/dist/commands/get-plugin.js +24 -28
- package/dist/commands/list-pipelines.js +30 -31
- package/dist/commands/list-plugins.js +32 -33
- package/dist/commands/login.js +44 -49
- package/dist/commands/org-export.js +22 -60
- package/dist/commands/provision.d.ts +13 -0
- package/dist/commands/provision.d.ts.map +1 -0
- package/dist/commands/provision.js +489 -0
- package/dist/commands/register.js +29 -30
- package/dist/commands/setup-events.d.ts.map +1 -1
- package/dist/commands/setup-events.js +42 -77
- package/dist/commands/status.js +20 -25
- package/dist/commands/store-token.js +44 -82
- package/dist/commands/synth.d.ts.map +1 -1
- package/dist/commands/synth.js +36 -35
- package/dist/commands/upload-plugin.js +59 -96
- package/dist/commands/validate-templates.d.ts.map +1 -1
- package/dist/commands/validate-templates.js +23 -29
- package/dist/commands/version.js +42 -47
- package/dist/config/cli.constants.d.ts.map +1 -1
- package/dist/config/cli.constants.js +24 -31
- package/dist/types/config.js +2 -3
- package/dist/types/error.js +3 -7
- package/dist/types/index.d.ts +4 -4
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +5 -21
- package/dist/types/pipeline.js +2 -3
- package/dist/types/plugin.js +2 -3
- package/dist/utils/api-client.d.ts +1 -1
- package/dist/utils/api-client.d.ts.map +1 -1
- package/dist/utils/api-client.js +23 -28
- package/dist/utils/audit-log.js +16 -22
- package/dist/utils/auth-guard.js +2 -5
- package/dist/utils/aws-secrets.js +17 -23
- package/dist/utils/banner.js +16 -23
- package/dist/utils/cdk-utils.js +14 -24
- package/dist/utils/command-utils.d.ts +1 -1
- package/dist/utils/command-utils.d.ts.map +1 -1
- package/dist/utils/command-utils.js +32 -44
- package/dist/utils/config-loader.d.ts +1 -1
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/config-loader.js +24 -58
- package/dist/utils/error-handler.d.ts +1 -1
- package/dist/utils/error-handler.d.ts.map +1 -1
- package/dist/utils/error-handler.js +16 -24
- package/dist/utils/list-command-utils.js +15 -20
- package/dist/utils/output-utils.d.ts +1 -1
- package/dist/utils/output-utils.d.ts.map +1 -1
- package/dist/utils/output-utils.js +35 -55
- package/dist/utils/plugin-resolver.d.ts +1 -1
- package/dist/utils/plugin-resolver.d.ts.map +1 -1
- package/dist/utils/plugin-resolver.js +6 -8
- package/dist/utils/rate-limiter.js +11 -19
- package/dist/utils/registry.js +16 -22
- package/package.json +26 -17
package/dist/cli.js
CHANGED
|
@@ -1,41 +1,40 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";
|
|
3
2
|
// Copyright 2026 Pipeline Builder Contributors
|
|
4
3
|
// SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
4
|
+
import { realpathSync } from 'node:fs';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
import { program } from 'commander';
|
|
7
|
+
import { auditStacks } from './commands/audit-stacks.js';
|
|
8
|
+
import { auditTokens } from './commands/audit-tokens.js';
|
|
9
|
+
import { bootstrap } from './commands/bootstrap.js';
|
|
10
|
+
import { createPipeline } from './commands/create-pipeline.js';
|
|
11
|
+
import { deploy } from './commands/deploy.js';
|
|
12
|
+
import { getPipeline } from './commands/get-pipeline.js';
|
|
13
|
+
import { getPlugin } from './commands/get-plugin.js';
|
|
14
|
+
import { listPipelines } from './commands/list-pipelines.js';
|
|
15
|
+
import { listPlugins } from './commands/list-plugins.js';
|
|
16
|
+
import { login } from './commands/login.js';
|
|
17
|
+
import { orgExport } from './commands/org-export.js';
|
|
18
|
+
import { provision } from './commands/provision.js';
|
|
19
|
+
import { register } from './commands/register.js';
|
|
20
|
+
import { setupEvents } from './commands/setup-events.js';
|
|
21
|
+
import { status } from './commands/status.js';
|
|
22
|
+
import { storeToken } from './commands/store-token.js';
|
|
23
|
+
import { synth } from './commands/synth.js';
|
|
24
|
+
import { uploadPlugin } from './commands/upload-plugin.js';
|
|
25
|
+
import { validateTemplatesCommand } from './commands/validate-templates.js';
|
|
26
|
+
import { version } from './commands/version.js';
|
|
27
|
+
import { APP_NAME, APP_DESCRIPTION, APP_VERSION, ENV_VARS, isDebugMode, generateExecutionId, } from './config/cli.constants.js';
|
|
28
|
+
import { banner, miniBanner } from './utils/banner.js';
|
|
29
|
+
import { ERROR_CODES, handleError } from './utils/error-handler.js';
|
|
30
|
+
import { printInfo, printError, printWarning, printDebug, printSection } from './utils/output-utils.js';
|
|
32
31
|
/**
|
|
33
32
|
* Check environment and display warnings
|
|
34
33
|
*/
|
|
35
34
|
function checkEnvironment() {
|
|
36
35
|
const warnings = [];
|
|
37
36
|
// Check for required environment variables
|
|
38
|
-
if (!process.env[
|
|
37
|
+
if (!process.env[ENV_VARS.PLATFORM_TOKEN]) {
|
|
39
38
|
warnings.push('PLATFORM_TOKEN environment variable is not set');
|
|
40
39
|
warnings.push('Authentication will fail for API operations');
|
|
41
40
|
}
|
|
@@ -47,9 +46,9 @@ function checkEnvironment() {
|
|
|
47
46
|
}
|
|
48
47
|
// Display warnings
|
|
49
48
|
if (warnings.length > 0) {
|
|
50
|
-
|
|
49
|
+
printSection('Environment Warnings');
|
|
51
50
|
warnings.forEach(warning => {
|
|
52
|
-
|
|
51
|
+
printWarning(warning);
|
|
53
52
|
});
|
|
54
53
|
console.log('');
|
|
55
54
|
}
|
|
@@ -60,11 +59,11 @@ function checkEnvironment() {
|
|
|
60
59
|
function displayStartupInfo(options) {
|
|
61
60
|
if (options.quiet)
|
|
62
61
|
return;
|
|
63
|
-
const executionId =
|
|
62
|
+
const executionId = generateExecutionId();
|
|
64
63
|
if (options.debug || options.verbose) {
|
|
65
|
-
|
|
66
|
-
name:
|
|
67
|
-
version:
|
|
64
|
+
printDebug('CLI Configuration', {
|
|
65
|
+
name: APP_NAME,
|
|
66
|
+
version: APP_VERSION,
|
|
68
67
|
executionId,
|
|
69
68
|
node: process.version,
|
|
70
69
|
platform: process.platform,
|
|
@@ -72,14 +71,14 @@ function displayStartupInfo(options) {
|
|
|
72
71
|
cwd: process.cwd(),
|
|
73
72
|
env: {
|
|
74
73
|
debug: process.env.DEBUG,
|
|
75
|
-
token: process.env[
|
|
76
|
-
url: process.env[
|
|
74
|
+
token: process.env[ENV_VARS.PLATFORM_TOKEN] ? 'set' : 'not set',
|
|
75
|
+
url: process.env[ENV_VARS.PLATFORM_BASE_URL] || 'default',
|
|
77
76
|
},
|
|
78
77
|
});
|
|
79
78
|
}
|
|
80
79
|
else {
|
|
81
|
-
|
|
82
|
-
version:
|
|
80
|
+
printDebug('Starting CLI', {
|
|
81
|
+
version: APP_VERSION,
|
|
83
82
|
executionId,
|
|
84
83
|
});
|
|
85
84
|
}
|
|
@@ -88,75 +87,76 @@ function displayStartupInfo(options) {
|
|
|
88
87
|
* Register all CLI commands
|
|
89
88
|
*/
|
|
90
89
|
function registerCommands() {
|
|
91
|
-
|
|
90
|
+
printDebug('Registering commands');
|
|
92
91
|
// Configure program
|
|
93
|
-
|
|
94
|
-
.name(
|
|
95
|
-
.description(
|
|
96
|
-
.version(
|
|
92
|
+
program
|
|
93
|
+
.name(APP_NAME)
|
|
94
|
+
.description(APP_DESCRIPTION)
|
|
95
|
+
.version(APP_VERSION, '-v, --version', 'Show CLI version')
|
|
97
96
|
.option('--debug', 'Enable debug output with stack traces', false)
|
|
98
97
|
.option('--verbose', 'Show detailed information', false)
|
|
99
98
|
.option('--quiet', 'Minimal output (errors only)', false)
|
|
100
99
|
.option('--no-color', 'Disable colored output', false)
|
|
101
100
|
.addHelpText('after', `
|
|
102
|
-
Environment Variables ${
|
|
103
|
-
${
|
|
104
|
-
${
|
|
105
|
-
${
|
|
106
|
-
${
|
|
101
|
+
Environment Variables ${ENV_VARS.PLATFORM_TOKEN} Authentication token (required)
|
|
102
|
+
${ENV_VARS.PLATFORM_BASE_URL} API base URL (optional)
|
|
103
|
+
${ENV_VARS.CLI_CONFIG_PATH} Config file path (optional)
|
|
104
|
+
${ENV_VARS.TLS_REJECT_UNAUTHORIZED} Disable SSL verification if '0'
|
|
105
|
+
${ENV_VARS.DEBUG} Enable debug mode if 'true'
|
|
107
106
|
|
|
108
|
-
Examples $ ${
|
|
109
|
-
$ ${
|
|
110
|
-
$ ${
|
|
111
|
-
$ ${
|
|
112
|
-
$ ${
|
|
113
|
-
$ ${
|
|
107
|
+
Examples $ ${APP_NAME} version
|
|
108
|
+
$ ${APP_NAME} list-pipelines --project my-app
|
|
109
|
+
$ ${APP_NAME} get-pipeline --id pipe-123 --format json
|
|
110
|
+
$ ${APP_NAME} store-token --days 30 --region us-east-1
|
|
111
|
+
$ ${APP_NAME} bootstrap --account 123456789012 --region us-east-1
|
|
112
|
+
$ ${APP_NAME} deploy --id pipe-123 --profile production
|
|
114
113
|
|
|
115
114
|
`);
|
|
116
115
|
// Version command (special handling)
|
|
117
|
-
|
|
116
|
+
version(program);
|
|
118
117
|
// Authentication commands
|
|
119
|
-
|
|
120
|
-
|
|
118
|
+
printDebug('Registering authentication commands');
|
|
119
|
+
login(program); // Login and obtain PLATFORM_TOKEN (also supports --refresh)
|
|
121
120
|
// Query commands
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
121
|
+
printDebug('Registering query commands');
|
|
122
|
+
getPlugin(program); // Single plugin by ID
|
|
123
|
+
listPlugins(program); // Multiple plugins with filters
|
|
124
|
+
getPipeline(program); // Single pipeline by ID
|
|
125
|
+
listPipelines(program); // Multiple pipelines with filters
|
|
127
126
|
// Create/Upload commands
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
127
|
+
printDebug('Registering create/upload commands');
|
|
128
|
+
createPipeline(program); // Create pipeline configuration
|
|
129
|
+
uploadPlugin(program); // Upload and deploy plugin
|
|
131
130
|
// Status command
|
|
132
|
-
|
|
133
|
-
|
|
131
|
+
printDebug('Registering status command');
|
|
132
|
+
status(program); // Show environment and connectivity status
|
|
134
133
|
// Org admin commands
|
|
135
|
-
|
|
136
|
-
|
|
134
|
+
printDebug('Registering org admin commands');
|
|
135
|
+
orgExport(program); // GDPR portability export â sysadmin (any org) or org admin (own org)
|
|
137
136
|
// Deployment commands
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
137
|
+
printDebug('Registering deployment commands');
|
|
138
|
+
storeToken(program); // Generate JWT token and store in Secrets Manager
|
|
139
|
+
setupEvents(program); // Deploy EventBridge event ingestion infrastructure
|
|
140
|
+
bootstrap(program); // Bootstrap CDK toolkit stack
|
|
141
|
+
deploy(program); // Deploy pipeline with CDK (--app prints boilerplate path)
|
|
142
|
+
register(program); // Re-register a deployed pipeline ARN + drain pending intents from prior failed deploys
|
|
143
|
+
provision(program); // AI-assisted advisor to deploy the PLATFORM (local/minikube/EC2/Fargate) — read-only
|
|
144
144
|
// Operator audit commands (cron-friendly: exit 1 on findings)
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
145
|
+
printDebug('Registering audit commands');
|
|
146
|
+
auditTokens(program); // Scan Secrets Manager for expiring platform tokens
|
|
147
|
+
auditStacks(program); // Diff CFN stacks vs pipeline_registry to find drift
|
|
148
|
+
synth(program); // Run CDK synthesis
|
|
149
|
+
validateTemplatesCommand(program); // Validate {{... }} templates in a pipeline or plugin
|
|
150
150
|
// Shell completions
|
|
151
|
-
|
|
152
|
-
|
|
151
|
+
printDebug('Registering completions command');
|
|
152
|
+
program
|
|
153
153
|
.command('completions')
|
|
154
154
|
.description('Generate shell completions (bash, zsh, fish)')
|
|
155
155
|
.argument('<shell>', 'Shell type: bash, zsh, or fish')
|
|
156
156
|
.action((shell) => {
|
|
157
157
|
// Pull command names from commander's registered list so completions never
|
|
158
158
|
// drift from the actual CLI surface. Sorted for stable output.
|
|
159
|
-
const commands =
|
|
159
|
+
const commands = program.commands.map(c => c.name()).sort().join(' ');
|
|
160
160
|
switch (shell) {
|
|
161
161
|
case 'bash':
|
|
162
162
|
console.log(`# pipeline-manager bash completions
|
|
@@ -184,7 +184,7 @@ complete -c pipeline-manager -n '__fish_use_subcommand' -a '${commands}'`);
|
|
|
184
184
|
process.exit(1);
|
|
185
185
|
}
|
|
186
186
|
});
|
|
187
|
-
|
|
187
|
+
printDebug('All commands registered successfully');
|
|
188
188
|
}
|
|
189
189
|
/**
|
|
190
190
|
* Handle program errors
|
|
@@ -193,12 +193,12 @@ function setupErrorHandlers() {
|
|
|
193
193
|
// Handle uncaught exceptions
|
|
194
194
|
process.on('uncaughtException', (error) => {
|
|
195
195
|
console.error(''); // Empty line
|
|
196
|
-
|
|
196
|
+
printError('Uncaught exception', {
|
|
197
197
|
error: error.message,
|
|
198
198
|
name: error.name,
|
|
199
199
|
});
|
|
200
|
-
|
|
201
|
-
debug:
|
|
200
|
+
handleError(error, ERROR_CODES.GENERAL, {
|
|
201
|
+
debug: isDebugMode(program.opts()),
|
|
202
202
|
exit: true,
|
|
203
203
|
context: {
|
|
204
204
|
type: 'uncaughtException',
|
|
@@ -208,12 +208,12 @@ function setupErrorHandlers() {
|
|
|
208
208
|
// Handle unhandled promise rejections
|
|
209
209
|
process.on('unhandledRejection', (reason) => {
|
|
210
210
|
console.error(''); // Empty line
|
|
211
|
-
|
|
211
|
+
printError('Unhandled promise rejection', {
|
|
212
212
|
reason: reason instanceof Error ? reason.message : String(reason),
|
|
213
213
|
});
|
|
214
214
|
const error = reason instanceof Error ? reason : new Error(String(reason));
|
|
215
|
-
|
|
216
|
-
debug:
|
|
215
|
+
handleError(error, ERROR_CODES.GENERAL, {
|
|
216
|
+
debug: isDebugMode(program.opts()),
|
|
217
217
|
exit: true,
|
|
218
218
|
context: {
|
|
219
219
|
type: 'unhandledRejection',
|
|
@@ -223,14 +223,14 @@ function setupErrorHandlers() {
|
|
|
223
223
|
// Handle SIGINT (Ctrl+C)
|
|
224
224
|
process.on('SIGINT', () => {
|
|
225
225
|
console.log(''); // Empty line
|
|
226
|
-
|
|
226
|
+
printWarning('Process interrupted by user (SIGINT)');
|
|
227
227
|
console.log(''); // Empty line
|
|
228
228
|
process.exit(130); // Standard exit code for SIGINT
|
|
229
229
|
});
|
|
230
230
|
// Handle SIGTERM
|
|
231
231
|
process.on('SIGTERM', () => {
|
|
232
232
|
console.log(''); // Empty line
|
|
233
|
-
|
|
233
|
+
printWarning('Process terminated (SIGTERM)');
|
|
234
234
|
console.log(''); // Empty line
|
|
235
235
|
process.exit(143); // Standard exit code for SIGTERM
|
|
236
236
|
});
|
|
@@ -240,7 +240,7 @@ function setupErrorHandlers() {
|
|
|
240
240
|
*
|
|
241
241
|
* @param options - CLI initialization options
|
|
242
242
|
*/
|
|
243
|
-
function initializeCli(options = {}) {
|
|
243
|
+
export function initializeCli(options = {}) {
|
|
244
244
|
const { showBanner = true, minimalBanner = false, debug = false, verbose = false, quiet = false, noColor = false, } = options;
|
|
245
245
|
// Handle color output
|
|
246
246
|
if (noColor) {
|
|
@@ -249,10 +249,10 @@ function initializeCli(options = {}) {
|
|
|
249
249
|
// Display banner
|
|
250
250
|
if (showBanner && !quiet) {
|
|
251
251
|
if (minimalBanner) {
|
|
252
|
-
|
|
252
|
+
miniBanner();
|
|
253
253
|
}
|
|
254
254
|
else {
|
|
255
|
-
|
|
255
|
+
banner({
|
|
256
256
|
minimal: false,
|
|
257
257
|
showDescription: true,
|
|
258
258
|
showTimestamp: debug || verbose,
|
|
@@ -271,14 +271,14 @@ function initializeCli(options = {}) {
|
|
|
271
271
|
// Register commands
|
|
272
272
|
try {
|
|
273
273
|
registerCommands();
|
|
274
|
-
|
|
274
|
+
printDebug('CLI initialization complete');
|
|
275
275
|
}
|
|
276
276
|
catch (error) {
|
|
277
|
-
|
|
277
|
+
printError('CLI initialization failed', {
|
|
278
278
|
error: error instanceof Error ? error.message : String(error),
|
|
279
279
|
});
|
|
280
|
-
|
|
281
|
-
debug: debug ||
|
|
280
|
+
handleError(error, ERROR_CODES.CONFIGURATION, {
|
|
281
|
+
debug: debug || isDebugMode(),
|
|
282
282
|
exit: true,
|
|
283
283
|
context: {
|
|
284
284
|
stage: 'initialization',
|
|
@@ -291,36 +291,36 @@ function initializeCli(options = {}) {
|
|
|
291
291
|
*/
|
|
292
292
|
function parseArguments() {
|
|
293
293
|
try {
|
|
294
|
-
|
|
294
|
+
program.parse(process.argv);
|
|
295
295
|
// Show help if no command provided
|
|
296
296
|
const args = process.argv.slice(2);
|
|
297
297
|
if (args.length === 0) {
|
|
298
|
-
|
|
298
|
+
printInfo('No command specified - displaying help');
|
|
299
299
|
console.log(''); // Empty line
|
|
300
|
-
|
|
300
|
+
program.outputHelp();
|
|
301
301
|
process.exit(0);
|
|
302
302
|
}
|
|
303
303
|
// Check if command exists
|
|
304
304
|
const command = args[0];
|
|
305
305
|
if (command && !command.startsWith('-')) {
|
|
306
|
-
const commandExists =
|
|
306
|
+
const commandExists = program.commands.some(cmd => cmd.name() === command);
|
|
307
307
|
if (!commandExists) {
|
|
308
308
|
console.log(''); // Empty line
|
|
309
|
-
|
|
309
|
+
printError(`Unknown command: ${command}`);
|
|
310
310
|
console.log(''); // Empty line
|
|
311
|
-
|
|
312
|
-
|
|
311
|
+
printInfo('Available commands:');
|
|
312
|
+
program.commands.forEach(cmd => {
|
|
313
313
|
console.log(` • ${cmd.name()} - ${cmd.description()}`);
|
|
314
314
|
});
|
|
315
315
|
console.log(''); // Empty line
|
|
316
316
|
process.exit(1);
|
|
317
317
|
}
|
|
318
318
|
}
|
|
319
|
-
|
|
319
|
+
printDebug('Command line arguments parsed successfully');
|
|
320
320
|
}
|
|
321
321
|
catch (error) {
|
|
322
|
-
|
|
323
|
-
debug:
|
|
322
|
+
handleError(error, ERROR_CODES.GENERAL, {
|
|
323
|
+
debug: isDebugMode(program.opts()),
|
|
324
324
|
exit: true,
|
|
325
325
|
context: {
|
|
326
326
|
stage: 'argument-parsing',
|
|
@@ -346,23 +346,23 @@ function parseArguments() {
|
|
|
346
346
|
* main({ debug: true, verbose: true });
|
|
347
347
|
* ```
|
|
348
348
|
*/
|
|
349
|
-
function main(options = {}) {
|
|
349
|
+
export function main(options = {}) {
|
|
350
350
|
try {
|
|
351
351
|
// Initialize CLI
|
|
352
352
|
initializeCli(options);
|
|
353
353
|
// Parse arguments and execute command
|
|
354
354
|
parseArguments();
|
|
355
355
|
// If we reach here, command completed successfully
|
|
356
|
-
|
|
356
|
+
printDebug('CLI execution completed successfully');
|
|
357
357
|
}
|
|
358
358
|
catch (error) {
|
|
359
359
|
// Final catch-all error handler
|
|
360
360
|
console.error(''); // Empty line
|
|
361
|
-
|
|
361
|
+
printError('Fatal CLI error', {
|
|
362
362
|
error: error instanceof Error ? error.message : String(error),
|
|
363
363
|
});
|
|
364
|
-
|
|
365
|
-
debug:
|
|
364
|
+
handleError(error, ERROR_CODES.GENERAL, {
|
|
365
|
+
debug: isDebugMode(options),
|
|
366
366
|
exit: true,
|
|
367
367
|
context: {
|
|
368
368
|
stage: 'main',
|
|
@@ -372,9 +372,14 @@ function main(options = {}) {
|
|
|
372
372
|
}
|
|
373
373
|
}
|
|
374
374
|
/**
|
|
375
|
-
* Run CLI if executed directly
|
|
375
|
+
* Run CLI if executed directly. ESM has no `require.main`; compare the invoked
|
|
376
|
+
* script to this module's path, resolving symlinks on both sides so the `bin`
|
|
377
|
+
* symlink (node_modules/.bin/pipeline-manager → dist/cli.js) still matches.
|
|
376
378
|
*/
|
|
377
|
-
|
|
379
|
+
const invokedScript = process.argv[1];
|
|
380
|
+
const isMainModule = invokedScript !== undefined
|
|
381
|
+
&& realpathSync(invokedScript) === realpathSync(fileURLToPath(import.meta.url));
|
|
382
|
+
if (isMainModule) {
|
|
378
383
|
// Parse CLI options from environment or command line
|
|
379
384
|
const options = {
|
|
380
385
|
debug: process.env.DEBUG === 'true',
|
|
@@ -384,4 +389,4 @@ if (require.main === module) {
|
|
|
384
389
|
};
|
|
385
390
|
main(options);
|
|
386
391
|
}
|
|
387
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLCtDQUErQztBQUMvQyxzQ0FBc0M7O0FBc1R0QyxzQ0F5REM7QUFrRUQsb0JBMEJDO0FBemNELHlDQUFvQztBQUNwQywwREFBc0Q7QUFDdEQsMERBQXNEO0FBQ3RELG9EQUFpRDtBQUNqRCxnRUFBNEQ7QUFDNUQsOENBQTJDO0FBQzNDLDBEQUFzRDtBQUN0RCxzREFBa0Q7QUFDbEQsOERBQTBEO0FBQzFELDBEQUFzRDtBQUN0RCw0Q0FBeUM7QUFDekMsc0RBQWtEO0FBQ2xELGtEQUErQztBQUMvQywwREFBc0Q7QUFDdEQsOENBQTJDO0FBQzNDLHdEQUFvRDtBQUNwRCw0Q0FBeUM7QUFDekMsNERBQXdEO0FBQ3hELHNFQUF5RTtBQUN6RSxnREFBNkM7QUFDN0MsMERBT2dDO0FBQ2hDLDJDQUFvRDtBQUNwRCx5REFBaUU7QUFDakUsdURBQXFHO0FBMkNyRzs7R0FFRztBQUNILFNBQVMsZ0JBQWdCO0lBQ3ZCLE1BQU0sUUFBUSxHQUFhLEVBQUUsQ0FBQztJQUU5QiwyQ0FBMkM7SUFDM0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0JBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1FBQzFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZ0RBQWdELENBQUMsQ0FBQztRQUNoRSxRQUFRLENBQUMsSUFBSSxDQUFDLDZDQUE2QyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELHFCQUFxQjtJQUNyQixNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO0lBQ3BDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDN0UsSUFBSSxZQUFZ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QUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUMzQyxPQUFPLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssR0FBRztLQUM3RSxDQUFDO0lBRUYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG4vLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgcHJvZ3JhbSB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBhdWRpdFN0YWNrcyB9IGZyb20gJy4vY29tbWFuZHMvYXVkaXQtc3RhY2tzJztcbmltcG9ydCB7IGF1ZGl0VG9rZW5zIH0gZnJvbSAnLi9jb21tYW5kcy9hdWRpdC10b2tlbnMnO1xuaW1wb3J0IHsgYm9vdHN0cmFwIH0gZnJvbSAnLi9jb21tYW5kcy9ib290c3RyYXAnO1xuaW1wb3J0IHsgY3JlYXRlUGlwZWxpbmUgfSBmcm9tICcuL2NvbW1hbmRzL2NyZWF0ZS1waXBlbGluZSc7XG5pbXBvcnQgeyBkZXBsb3kgfSBmcm9tICcuL2NvbW1hbmRzL2RlcGxveSc7XG5pbXBvcnQgeyBnZXRQaXBlbGluZSB9IGZyb20gJy4vY29tbWFuZHMvZ2V0LXBpcGVsaW5lJztcbmltcG9ydCB7IGdldFBsdWdpbiB9IGZyb20gJy4vY29tbWFuZHMvZ2V0LXBsdWdpbic7XG5pbXBvcnQgeyBsaXN0UGlwZWxpbmVzIH0gZnJvbSAnLi9jb21tYW5kcy9saXN0LXBpcGVsaW5lcyc7XG5pbXBvcnQgeyBsaXN0UGx1Z2lucyB9IGZyb20gJy4vY29tbWFuZHMvbGlzdC1wbHVnaW5zJztcbmltcG9ydCB7IGxvZ2luIH0gZnJvbSAnLi9jb21tYW5kcy9sb2dpbic7XG5pbXBvcnQgeyBvcmdFeHBvcnQgfSBmcm9tICcuL2NvbW1hbmRzL29yZy1leHBvcnQnO1xuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tICcuL2NvbW1hbmRzL3JlZ2lzdGVyJztcbmltcG9ydCB7IHNldHVwRXZlbnRzIH0gZnJvbSAnLi9jb21tYW5kcy9zZXR1cC1ldmVudHMnO1xuaW1wb3J0IHsgc3RhdHVzIH0gZnJvbSAnLi9jb21tYW5kcy9zdGF0dXMnO1xuaW1wb3J0IHsgc3RvcmVUb2tlbiB9IGZyb20gJy4vY29tbWFuZHMvc3RvcmUtdG9rZW4nO1xuaW1wb3J0IHsgc3ludGggfSBmcm9tICcuL2NvbW1hbmRzL3N5bnRoJztcbmltcG9ydCB7IHVwbG9hZFBsdWdpbiB9IGZyb20gJy4vY29tbWFuZHMvdXBsb2FkLXBsdWdpbic7XG5pbXBvcnQgeyB2YWxpZGF0ZVRlbXBsYXRlc0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3ZhbGlkYXRlLXRlbXBsYXRlcyc7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi9jb21tYW5kcy92ZXJzaW9uJztcbmltcG9ydCB7XG4gIEFQUF9OQU1FLFxuICBBUFBfREVTQ1JJUFRJT04sXG4gIEFQUF9WRVJTSU9OLFxuICBFTlZfVkFSUyxcbiAgaXNEZWJ1Z01vZGUsXG4gIGdlbmVyYXRlRXhlY3V0aW9uSWQsXG59IGZyb20gJy4vY29uZmlnL2NsaS5jb25zdGFudHMnO1xuaW1wb3J0IHsgYmFubmVyLCBtaW5pQmFubmVyIH0gZnJvbSAnLi91dGlscy9iYW5uZXInO1xuaW1wb3J0IHsgRVJST1JfQ09ERVMsIGhhbmRsZUVycm9yIH0gZnJvbSAnLi91dGlscy9lcnJvci1oYW5kbGVyJztcbmltcG9ydCB7IHByaW50SW5mbywgcHJpbnRFcnJvciwgcHJpbnRXYXJuaW5nLCBwcmludERlYnVnLCBwcmludFNlY3Rpb24gfSBmcm9tICcuL3V0aWxzL291dHB1dC11dGlscyc7XG5cbi8qKlxuICogQ0xJIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAqL1xuaW50ZXJmYWNlIENsaU9wdGlvbnMge1xuICAvKipcbiAgICogU2hvdyBiYW5uZXIgb24gc3RhcnR1cFxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBzaG93QmFubmVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTWluaW1hbCBiYW5uZXIgKG5vIEFTQ0lJIGFydClcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIG1pbmltYWxCYW5uZXI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEZWJ1ZyBtb2RlXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBkZWJ1Zz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFZlcmJvc2Ugb3V0cHV0XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICB2ZXJib3NlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUXVpZXQgbW9kZSAobWluaW1hbCBvdXRwdXQpXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBxdWlldD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE5vIGNvbG9yIG91dHB1dFxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgbm9Db2xvcj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ2hlY2sgZW52aXJvbm1lbnQgYW5kIGRpc3BsYXkgd2FybmluZ3NcbiAqL1xuZnVuY3Rpb24gY2hlY2tFbnZpcm9ubWVudCgpOiB2b2lkIHtcbiAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICBpZiAoIXByb2Nlc3MuZW52W0VOVl9WQVJTLlBMQVRGT1JNX1RPS0VOXSkge1xuICAgIHdhcm5pbmdzLnB1c2goJ1BMQVRGT1JNX1RPS0VOIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBzZXQnKTtcbiAgICB3YXJuaW5ncy5wdXNoKCdBdXRoZW50aWNhdGlvbiB3aWxsIGZhaWwgZm9yIEFQSSBvcGVyYXRpb25zJyk7XG4gIH1cblxuICAvLyBDaGVjayBOb2RlIHZlcnNpb25cbiAgY29uc3Qgbm9kZVZlcnNpb24gPSBwcm9jZXNzLnZlcnNpb247XG4gIGNvbnN0IG1ham9yVmVyc2lvbiA9IHBhcnNlSW50KG5vZGVWZXJzaW9uLnNsaWNlKDEpLnNwbGl0KCcuJylbMF0gfHwgJzAnLCAxMCk7XG4gIGlmIChtYWpvclZlcnNpb24gPCAxOCkge1xuICAgIHdhcm5pbmdzLnB1c2goYE5vZGUuanMgJHtub2RlVmVyc2lvbn0gZGV0ZWN0ZWQgLSB2ZXJzaW9uIDE4KyByZWNvbW1lbmRlZGApO1xuICB9XG5cbiAgLy8gRGlzcGxheSB3YXJuaW5nc1xuICBpZiAod2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgIHByaW50U2VjdGlvbignRW52aXJvbm1lbnQgV2FybmluZ3MnKTtcbiAgICB3YXJuaW5ncy5mb3JFYWNoKHdhcm5pbmcgPT4ge1xuICAgICAgcHJpbnRXYXJuaW5nKHdhcm5pbmcpO1xuICAgIH0pO1xuICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgfVxufVxuXG4vKipcbiAqIERpc3BsYXkgc3RhcnR1cCBpbmZvcm1hdGlvblxuICovXG5mdW5jdGlvbiBkaXNwbGF5U3RhcnR1cEluZm8ob3B0aW9uczogQ2xpT3B0aW9ucyk6IHZvaWQge1xuICBpZiAob3B0aW9ucy5xdWlldCkgcmV0dXJuO1xuXG4gIGNvbnN0IGV4ZWN1dGlvbklkID0gZ2VuZXJhdGVFeGVjdXRpb25JZCgpO1xuXG4gIGlmIChvcHRpb25zLmRlYnVnIHx8IG9wdGlvbnMudmVyYm9zZSkge1xuICAgIHByaW50RGVidWcoJ0NMSSBDb25maWd1cmF0aW9uJywge1xuICAgICAgbmFtZTogQVBQX05BTUUsXG4gICAgICB2ZXJzaW9uOiBBUFBfVkVSU0lPTixcbiAgICAgIGV4ZWN1dGlvbklkLFxuICAgICAgbm9kZTogcHJvY2Vzcy52ZXJzaW9uLFxuICAgICAgcGxhdGZvcm06IHByb2Nlc3MucGxhdGZvcm0sXG4gICAgICBhcmNoOiBwcm9jZXNzLmFyY2gsXG4gICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgICBlbnY6IHtcbiAgICAgICAgZGVidWc6IHByb2Nlc3MuZW52LkRFQlVHLFxuICAgICAgICB0b2tlbjogcHJvY2Vzcy5lbnZbRU5WX1ZBUlMuUExBVEZPUk1fVE9LRU5dID8gJ3NldCc6ICdub3Qgc2V0JyxcbiAgICAgICAgdXJsOiBwcm9jZXNzLmVudltFTlZfVkFSUy5QTEFURk9STV9CQVNFX1VSTF0gfHwgJ2RlZmF1bHQnLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBwcmludERlYnVnKCdTdGFydGluZyBDTEknLCB7XG4gICAgICB2ZXJzaW9uOiBBUFBfVkVSU0lPTixcbiAgICAgIGV4ZWN1dGlvbklkLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYWxsIENMSSBjb21tYW5kc1xuICovXG5mdW5jdGlvbiByZWdpc3RlckNvbW1hbmRzKCk6IHZvaWQge1xuICBwcmludERlYnVnKCdSZWdpc3RlcmluZyBjb21tYW5kcycpO1xuXG4gIC8vIENvbmZpZ3VyZSBwcm9ncmFtXG4gIHByb2dyYW1cbiAgICAubmFtZShBUFBfTkFNRSlcbiAgICAuZGVzY3JpcHRpb24oQVBQX0RFU0NSSVBUSU9OKVxuICAgIC52ZXJzaW9uKEFQUF9WRVJTSU9OLCAnLXYsIC0tdmVyc2lvbicsICdTaG93IENMSSB2ZXJzaW9uJylcbiAgICAub3B0aW9uKCctLWRlYnVnJywgJ0VuYWJsZSBkZWJ1ZyBvdXRwdXQgd2l0aCBzdGFjayB0cmFjZXMnLCBmYWxzZSlcbiAgICAub3B0aW9uKCctLXZlcmJvc2UnLCAnU2hvdyBkZXRhaWxlZCBpbmZvcm1hdGlvbicsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tcXVpZXQnLCAnTWluaW1hbCBvdXRwdXQgKGVycm9ycyBvbmx5KScsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tbm8tY29sb3InLCAnRGlzYWJsZSBjb2xvcmVkIG91dHB1dCcsIGZhbHNlKVxuICAgIC5hZGRIZWxwVGV4dCgnYWZ0ZXInLCBgXG5FbnZpcm9ubWVudCBWYXJpYWJsZXMgICR7RU5WX1ZBUlMuUExBVEZPUk1fVE9LRU59IEF1dGhlbnRpY2F0aW9uIHRva2VuIChyZXF1aXJlZClcbiAgJHtFTlZfVkFSUy5QTEFURk9STV9CQVNFX1VSTH0gQVBJIGJhc2UgVVJMIChvcHRpb25hbClcbiAgJHtFTlZfVkFSUy5DTElfQ09ORklHX1BBVEh9IENvbmZpZyBmaWxlIHBhdGggKG9wdGlvbmFsKVxuICAke0VOVl9WQVJTLlRMU19SRUpFQ1RfVU5BVVRIT1JJWkVEfSBEaXNhYmxlIFNTTCB2ZXJpZmljYXRpb24gaWYgJzAnXG4gICR7RU5WX1ZBUlMuREVCVUd9IEVuYWJsZSBkZWJ1ZyBtb2RlIGlmICd0cnVlJ1xuXG5FeGFtcGxlcyAgJCAke0FQUF9OQU1FfSB2ZXJzaW9uXG4gICQgJHtBUFBfTkFNRX0gbGlzdC1waXBlbGluZXMgLS1wcm9qZWN0IG15LWFwcFxuICAkICR7QVBQX05BTUV9IGdldC1waXBlbGluZSAtLWlkIHBpcGUtMTIzIC0tZm9ybWF0IGpzb25cbiAgJCAke0FQUF9OQU1FfSBzdG9yZS10b2tlbiAtLWRheXMgMzAgLS1yZWdpb24gdXMtZWFzdC0xXG4gICQgJHtBUFBfTkFNRX0gYm9vdHN0cmFwIC0tYWNjb3VudCAxMjM0NTY3ODkwMTIgLS1yZWdpb24gdXMtZWFzdC0xXG4gICQgJHtBUFBfTkFNRX0gZGVwbG95IC0taWQgcGlwZS0xMjMgLS1wcm9maWxlIHByb2R1Y3Rpb25cblxuYCk7XG5cbiAgLy8gVmVyc2lvbiBjb21tYW5kIChzcGVjaWFsIGhhbmRsaW5nKVxuICB2ZXJzaW9uKHByb2dyYW0pO1xuXG4gIC8vIEF1dGhlbnRpY2F0aW9uIGNvbW1hbmRzXG4gIHByaW50RGVidWcoJ1JlZ2lzdGVyaW5nIGF1dGhlbnRpY2F0aW9uIGNvbW1hbmRzJyk7XG4gIGxvZ2luKHByb2dyYW0pOyAvLyBMb2dpbiBhbmQgb2J0YWluIFBMQVRGT1JNX1RPS0VOIChhbHNvIHN1cHBvcnRzIC0tcmVmcmVzaClcblxuICAvLyBRdWVyeSBjb21tYW5kc1xuICBwcmludERlYnVnKCdSZWdpc3RlcmluZyBxdWVyeSBjb21tYW5kcycpO1xuICBnZXRQbHVnaW4ocHJvZ3JhbSk7IC8vIFNpbmdsZSBwbHVnaW4gYnkgSURcbiAgbGlzdFBsdWdpbnMocHJvZ3JhbSk7IC8vIE11bHRpcGxlIHBsdWdpbnMgd2l0aCBmaWx0ZXJzXG4gIGdldFBpcGVsaW5lKHByb2dyYW0pOyAvLyBTaW5nbGUgcGlwZWxpbmUgYnkgSURcbiAgbGlzdFBpcGVsaW5lcyhwcm9ncmFtKTsgLy8gTXVsdGlwbGUgcGlwZWxpbmVzIHdpdGggZmlsdGVyc1xuXG4gIC8vIENyZWF0ZS9VcGxvYWQgY29tbWFuZHNcbiAgcHJpbnREZWJ1ZygnUmVnaXN0ZXJpbmcgY3JlYXRlL3VwbG9hZCBjb21tYW5kcycpO1xuICBjcmVhdGVQaXBlbGluZShwcm9ncmFtKTsgLy8gQ3JlYXRlIHBpcGVsaW5lIGNvbmZpZ3VyYXRpb25cbiAgdXBsb2FkUGx1Z2luKHByb2dyYW0pOyAvLyBVcGxvYWQgYW5kIGRlcGxveSBwbHVnaW5cblxuICAvLyBTdGF0dXMgY29tbWFuZFxuICBwcmludERlYnVnKCdSZWdpc3RlcmluZyBzdGF0dXMgY29tbWFuZCcpO1xuICBzdGF0dXMocHJvZ3JhbSk7IC8vIFNob3cgZW52aXJvbm1lbnQgYW5kIGNvbm5lY3Rpdml0eSBzdGF0dXNcblxuICAvLyBPcmcgYWRtaW4gY29tbWFuZHNcbiAgcHJpbnREZWJ1ZygnUmVnaXN0ZXJpbmcgb3JnIGFkbWluIGNvbW1hbmRzJyk7XG4gIG9yZ0V4cG9ydChwcm9ncmFtKTsgLy8gR0RQUiBwb3J0YWJpbGl0eSBleHBvcnQgw6LCgMKUIHN5c2FkbWluIChhbnkgb3JnKSBvciBvcmcgYWRtaW4gKG93biBvcmcpXG5cbiAgLy8gRGVwbG95bWVudCBjb21tYW5kc1xuICBwcmludERlYnVnKCdSZWdpc3RlcmluZyBkZXBsb3ltZW50IGNvbW1hbmRzJyk7XG4gIHN0b3JlVG9rZW4ocHJvZ3JhbSk7IC8vIEdlbmVyYXRlIEpXVCB0b2tlbiBhbmQgc3RvcmUgaW4gU2VjcmV0cyBNYW5hZ2VyXG4gIHNldHVwRXZlbnRzKHByb2dyYW0pOyAvLyBEZXBsb3kgRXZlbnRCcmlkZ2UgZXZlbnQgaW5nZXN0aW9uIGluZnJhc3RydWN0dXJlXG4gIGJvb3RzdHJhcChwcm9ncmFtKTsgLy8gQm9vdHN0cmFwIENESyB0b29sa2l0IHN0YWNrXG4gIGRlcGxveShwcm9ncmFtKTsgLy8gRGVwbG95IHBpcGVsaW5lIHdpdGggQ0RLICgtLWFwcCBwcmludHMgYm9pbGVycGxhdGUgcGF0aClcbiAgcmVnaXN0ZXIocHJvZ3JhbSk7IC8vIFJlLXJlZ2lzdGVyIGEgZGVwbG95ZWQgcGlwZWxpbmUgQVJOICsgZHJhaW4gcGVuZGluZyBpbnRlbnRzIGZyb20gcHJpb3IgZmFpbGVkIGRlcGxveXNcblxuICAvLyBPcGVyYXRvciBhdWRpdCBjb21tYW5kcyAoY3Jvbi1mcmllbmRseTogZXhpdCAxIG9uIGZpbmRpbmdzKVxuICBwcmludERlYnVnKCdSZWdpc3RlcmluZyBhdWRpdCBjb21tYW5kcycpO1xuICBhdWRpdFRva2Vucyhwcm9ncmFtKTsgLy8gU2NhbiBTZWNyZXRzIE1hbmFnZXIgZm9yIGV4cGlyaW5nIHBsYXRmb3JtIHRva2Vuc1xuICBhdWRpdFN0YWNrcyhwcm9ncmFtKTsgLy8gRGlmZiBDRk4gc3RhY2tzIHZzIHBpcGVsaW5lX3JlZ2lzdHJ5IHRvIGZpbmQgZHJpZnRcbiAgc3ludGgocHJvZ3JhbSk7IC8vIFJ1biBDREsgc3ludGhlc2lzXG4gIHZhbGlkYXRlVGVtcGxhdGVzQ29tbWFuZChwcm9ncmFtKTsgLy8gVmFsaWRhdGUge3suLi4gfX0gdGVtcGxhdGVzIGluIGEgcGlwZWxpbmUgb3IgcGx1Z2luXG5cbiAgLy8gU2hlbGwgY29tcGxldGlvbnNcbiAgcHJpbnREZWJ1ZygnUmVnaXN0ZXJpbmcgY29tcGxldGlvbnMgY29tbWFuZCcpO1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoJ2NvbXBsZXRpb25zJylcbiAgICAuZGVzY3JpcHRpb24oJ0dlbmVyYXRlIHNoZWxsIGNvbXBsZXRpb25zIChiYXNoLCB6c2gsIGZpc2gpJylcbiAgICAuYXJndW1lbnQoJzxzaGVsbD4nLCAnU2hlbGwgdHlwZTogYmFzaCwgenNoLCBvciBmaXNoJylcbiAgICAuYWN0aW9uKChzaGVsbDogc3RyaW5nKSA9PiB7XG4gICAgICAvLyBQdWxsIGNvbW1hbmQgbmFtZXMgZnJvbSBjb21tYW5kZXIncyByZWdpc3RlcmVkIGxpc3Qgc28gY29tcGxldGlvbnMgbmV2ZXJcbiAgICAgIC8vIGRyaWZ0IGZyb20gdGhlIGFjdHVhbCBDTEkgc3VyZmFjZS4gU29ydGVkIGZvciBzdGFibGUgb3V0cHV0LlxuICAgICAgY29uc3QgY29tbWFuZHMgPSBwcm9ncmFtLmNvbW1hbmRzLm1hcChjID0+IGMubmFtZSgpKS5zb3J0KCkuam9pbignICcpO1xuICAgICAgc3dpdGNoIChzaGVsbCkge1xuICAgICAgICBjYXNlICdiYXNoJzpcbiAgICAgICAgICBjb25zb2xlLmxvZyhgIyBwaXBlbGluZS1tYW5hZ2VyIGJhc2ggY29tcGxldGlvbnNcbl9waXBlbGluZV9tYW5hZ2VyX2NvbXBsZXRpb25zKCkge1xuICBsb2NhbCBjdXI9XCJcXCR7Q09NUF9XT1JEU1tDT01QX0NXT1JEXX1cIlxuICBsb2NhbCBjb21tYW5kcz1cIiR7Y29tbWFuZHN9XCJcbiAgQ09NUFJFUExZPSgkKGNvbXBnZW4gLVcgXCJcXCR7Y29tbWFuZHN9XCIgLS0gXCJcXCR7Y3VyfVwiKSlcbn1cbmNvbXBsZXRlIC1GIF9waXBlbGluZV9tYW5hZ2VyX2NvbXBsZXRpb25zIHBpcGVsaW5lLW1hbmFnZXJgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnenNoJzpcbiAgICAgICAgICBjb25zb2xlLmxvZyhgIyBwaXBlbGluZS1tYW5hZ2VyIHpzaCBjb21wbGV0aW9uc1xuX3BpcGVsaW5lX21hbmFnZXIoKSB7XG4gIGxvY2FsIGNvbW1hbmRzPSgke2NvbW1hbmRzfSlcbiAgX2Rlc2NyaWJlICdjb21tYW5kJyBjb21tYW5kc1xufVxuY29tcGRlZiBfcGlwZWxpbmVfbWFuYWdlciBwaXBlbGluZS1tYW5hZ2VyYCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2Zpc2gnOlxuICAgICAgICAgIGNvbnNvbGUubG9nKGAjIHBpcGVsaW5lLW1hbmFnZXIgZmlzaCBjb21wbGV0aW9uc1xuY29tcGxldGUgLWMgcGlwZWxpbmUtbWFuYWdlciAtbiAnX19maXNoX3VzZV9zdWJjb21tYW5kJyAtYSAnJHtjb21tYW5kc30nYCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgVW5rbm93biBzaGVsbDogJHtzaGVsbH0uIFVzZSBiYXNoLCB6c2gsIG9yIGZpc2guYCk7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIHByaW50RGVidWcoJ0FsbCBjb21tYW5kcyByZWdpc3RlcmVkIHN1Y2Nlc3NmdWxseScpO1xufVxuXG4vKipcbiAqIEhhbmRsZSBwcm9ncmFtIGVycm9yc1xuICovXG5mdW5jdGlvbiBzZXR1cEVycm9ySGFuZGxlcnMoKTogdm9pZCB7XG4gIC8vIEhhbmRsZSB1bmNhdWdodCBleGNlcHRpb25zXG4gIHByb2Nlc3Mub24oJ3VuY2F1Z2h0RXhjZXB0aW9uJywgKGVycm9yOiBFcnJvcikgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgcHJpbnRFcnJvcignVW5jYXVnaHQgZXhjZXB0aW9uJywge1xuICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2UsXG4gICAgICBuYW1lOiBlcnJvci5uYW1lLFxuICAgIH0pO1xuXG4gICAgaGFuZGxlRXJyb3IoZXJyb3IsIEVSUk9SX0NPREVTLkdFTkVSQUwsIHtcbiAgICAgIGRlYnVnOiBpc0RlYnVnTW9kZShwcm9ncmFtLm9wdHMoKSksXG4gICAgICBleGl0OiB0cnVlLFxuICAgICAgY29udGV4dDoge1xuICAgICAgICB0eXBlOiAndW5jYXVnaHRFeGNlcHRpb24nLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gSGFuZGxlIHVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbnNcbiAgcHJvY2Vzcy5vbigndW5oYW5kbGVkUmVqZWN0aW9uJywgKHJlYXNvbjogdW5rbm93bikgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgcHJpbnRFcnJvcignVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uJywge1xuICAgICAgcmVhc29uOiByZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IHJlYXNvbi5tZXNzYWdlOiBTdHJpbmcocmVhc29uKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGVycm9yID0gcmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyByZWFzb246IG5ldyBFcnJvcihTdHJpbmcocmVhc29uKSk7XG5cbiAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuR0VORVJBTCwge1xuICAgICAgZGVidWc6IGlzRGVidWdNb2RlKHByb2dyYW0ub3B0cygpKSxcbiAgICAgIGV4aXQ6IHRydWUsXG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIHR5cGU6ICd1bmhhbmRsZWRSZWplY3Rpb24nLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gSGFuZGxlIFNJR0lOVCAoQ3RybCtDKVxuICBwcm9jZXNzLm9uKCdTSUdJTlQnLCAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgcHJpbnRXYXJuaW5nKCdQcm9jZXNzIGludGVycnVwdGVkIGJ5IHVzZXIgKFNJR0lOVCknKTtcbiAgICBjb25zb2xlLmxvZygnJyk7IC8vIEVtcHR5IGxpbmVcbiAgICBwcm9jZXNzLmV4aXQoMTMwKTsgLy8gU3RhbmRhcmQgZXhpdCBjb2RlIGZvciBTSUdJTlRcbiAgfSk7XG5cbiAgLy8gSGFuZGxlIFNJR1RFUk1cbiAgcHJvY2Vzcy5vbignU0lHVEVSTScsICgpID0+IHtcbiAgICBjb25zb2xlLmxvZygnJyk7IC8vIEVtcHR5IGxpbmVcbiAgICBwcmludFdhcm5pbmcoJ1Byb2Nlc3MgdGVybWluYXRlZCAoU0lHVEVSTSknKTtcbiAgICBjb25zb2xlLmxvZygnJyk7IC8vIEVtcHR5IGxpbmVcbiAgICBwcm9jZXNzLmV4aXQoMTQzKTsgLy8gU3RhbmRhcmQgZXhpdCBjb2RlIGZvciBTSUdURVJNXG4gIH0pO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgQ0xJIHdpdGggb3B0aW9uc1xuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ0xJIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemVDbGkob3B0aW9uczogQ2xpT3B0aW9ucyA9IHt9KTogdm9pZCB7XG4gIGNvbnN0IHtcbiAgICBzaG93QmFubmVyID0gdHJ1ZSxcbiAgICBtaW5pbWFsQmFubmVyID0gZmFsc2UsXG4gICAgZGVidWcgPSBmYWxzZSxcbiAgICB2ZXJib3NlID0gZmFsc2UsXG4gICAgcXVpZXQgPSBmYWxzZSxcbiAgICBub0NvbG9yID0gZmFsc2UsXG4gIH0gPSBvcHRpb25zO1xuXG4gIC8vIEhhbmRsZSBjb2xvciBvdXRwdXRcbiAgaWYgKG5vQ29sb3IpIHtcbiAgICBwcm9jZXNzLmVudi5OT19DT0xPUiA9ICcxJztcbiAgfVxuXG4gIC8vIERpc3BsYXkgYmFubmVyXG4gIGlmIChzaG93QmFubmVyICYmICFxdWlldCkge1xuICAgIGlmIChtaW5pbWFsQmFubmVyKSB7XG4gICAgICBtaW5pQmFubmVyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJhbm5lcih7XG4gICAgICAgIG1pbmltYWw6IGZhbHNlLFxuICAgICAgICBzaG93RGVzY3JpcHRpb246IHRydWUsXG4gICAgICAgIHNob3dUaW1lc3RhbXA6IGRlYnVnIHx8IHZlcmJvc2UsXG4gICAgICAgIHNob3dFeGVjdXRpb25JZDogZGVidWcsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBEaXNwbGF5IHN0YXJ0dXAgaW5mb1xuICBkaXNwbGF5U3RhcnR1cEluZm8oeyBkZWJ1ZywgdmVyYm9zZSwgcXVpZXQgfSk7XG5cbiAgLy8gQ2hlY2sgZW52aXJvbm1lbnRcbiAgaWYgKCFxdWlldCkge1xuICAgIGNoZWNrRW52aXJvbm1lbnQoKTtcbiAgfVxuXG4gIC8vIFNldHVwIGVycm9yIGhhbmRsZXJzXG4gIHNldHVwRXJyb3JIYW5kbGVycygpO1xuXG4gIC8vIFJlZ2lzdGVyIGNvbW1hbmRzXG4gIHRyeSB7XG4gICAgcmVnaXN0ZXJDb21tYW5kcygpO1xuICAgIHByaW50RGVidWcoJ0NMSSBpbml0aWFsaXphdGlvbiBjb21wbGV0ZScpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHByaW50RXJyb3IoJ0NMSSBpbml0aWFsaXphdGlvbiBmYWlsZWQnLCB7XG4gICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2U6IFN0cmluZyhlcnJvciksXG4gICAgfSk7XG5cbiAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuQ09ORklHVVJBVElPTiwge1xuICAgICAgZGVidWc6IGRlYnVnIHx8IGlzRGVidWdNb2RlKCksXG4gICAgICBleGl0OiB0cnVlLFxuICAgICAgY29udGV4dDoge1xuICAgICAgICBzdGFnZTogJ2luaXRpYWxpemF0aW9uJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQXJndW1lbnRzKCk6IHZvaWQge1xuICB0cnkge1xuICAgIHByb2dyYW0ucGFyc2UocHJvY2Vzcy5hcmd2KTtcblxuICAgIC8vIFNob3cgaGVscCBpZiBubyBjb21tYW5kIHByb3ZpZGVkXG4gICAgY29uc3QgYXJncyA9IHByb2Nlc3MuYXJndi5zbGljZSgyKTtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgIHByaW50SW5mbygnTm8gY29tbWFuZCBzcGVjaWZpZWQgLSBkaXNwbGF5aW5nIGhlbHAnKTtcbiAgICAgIGNvbnNvbGUubG9nKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgICAgcHJvZ3JhbS5vdXRwdXRIZWxwKCk7XG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgY29tbWFuZCBleGlzdHNcbiAgICBjb25zdCBjb21tYW5kID0gYXJnc1swXTtcbiAgICBpZiAoY29tbWFuZCAmJiAhY29tbWFuZC5zdGFydHNXaXRoKCctJykpIHtcbiAgICAgIGNvbnN0IGNvbW1hbmRFeGlzdHMgPSBwcm9ncmFtLmNvbW1hbmRzLnNvbWUoY21kID0+IGNtZC5uYW1lKCkgPT09IGNvbW1hbmQpO1xuXG4gICAgICBpZiAoIWNvbW1hbmRFeGlzdHMpIHtcbiAgICAgICAgY29uc29sZS5sb2coJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgICAgIHByaW50RXJyb3IoYFVua25vd24gY29tbWFuZDogJHtjb21tYW5kfWApO1xuICAgICAgICBjb25zb2xlLmxvZygnJyk7IC8vIEVtcHR5IGxpbmVcbiAgICAgICAgcHJpbnRJbmZvKCdBdmFpbGFibGUgY29tbWFuZHM6Jyk7XG4gICAgICAgIHByb2dyYW0uY29tbWFuZHMuZm9yRWFjaChjbWQgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAg4oCiICR7Y21kLm5hbWUoKX0gLSAke2NtZC5kZXNjcmlwdGlvbigpfWApO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc29sZS5sb2coJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcmludERlYnVnKCdDb21tYW5kIGxpbmUgYXJndW1lbnRzIHBhcnNlZCBzdWNjZXNzZnVsbHknKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuR0VORVJBTCwge1xuICAgICAgZGVidWc6IGlzRGVidWdNb2RlKHByb2dyYW0ub3B0cygpKSxcbiAgICAgIGV4aXQ6IHRydWUsXG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIHN0YWdlOiAnYXJndW1lbnQtcGFyc2luZycsXG4gICAgICAgIGFyZ3Y6IHByb2Nlc3MuYXJndixcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBNYWluIENMSSBlbnRyeSBwb2ludFxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ0xJIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gU3RhbmRhcmQgaW5pdGlhbGl6YXRpb25cbiAqIG1haW4oKTtcbiAqXG4gKiAvLyBNaW5pbWFsIG1vZGVcbiAqIG1haW4oeyBtaW5pbWFsQmFubmVyOiB0cnVlLCBxdWlldDogdHJ1ZSB9KTtcbiAqXG4gKiAvLyBEZWJ1ZyBtb2RlXG4gKiBtYWluKHsgZGVidWc6IHRydWUsIHZlcmJvc2U6IHRydWUgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1haW4ob3B0aW9uczogQ2xpT3B0aW9ucyA9IHt9KTogdm9pZCB7XG4gIHRyeSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBDTElcbiAgICBpbml0aWFsaXplQ2xpKG9wdGlvbnMpO1xuXG4gICAgLy8gUGFyc2UgYXJndW1lbnRzIGFuZCBleGVjdXRlIGNvbW1hbmRcbiAgICBwYXJzZUFyZ3VtZW50cygpO1xuXG4gICAgLy8gSWYgd2UgcmVhY2ggaGVyZSwgY29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5XG4gICAgcHJpbnREZWJ1ZygnQ0xJIGV4ZWN1dGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gRmluYWwgY2F0Y2gtYWxsIGVycm9yIGhhbmRsZXJcbiAgICBjb25zb2xlLmVycm9yKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgIHByaW50RXJyb3IoJ0ZhdGFsIENMSSBlcnJvcicsIHtcbiAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZTogU3RyaW5nKGVycm9yKSxcbiAgICB9KTtcblxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBFUlJPUl9DT0RFUy5HRU5FUkFMLCB7XG4gICAgICBkZWJ1ZzogaXNEZWJ1Z01vZGUob3B0aW9ucyksXG4gICAgICBleGl0OiB0cnVlLFxuICAgICAgY29udGV4dDoge1xuICAgICAgICBzdGFnZTogJ21haW4nLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFJ1biBDTEkgaWYgZXhlY3V0ZWQgZGlyZWN0bHlcbiAqL1xuaWYgKHJlcXVpcmUubWFpbiA9PT0gbW9kdWxlKSB7XG4gIC8vIFBhcnNlIENMSSBvcHRpb25zIGZyb20gZW52aXJvbm1lbnQgb3IgY29tbWFuZCBsaW5lXG4gIGNvbnN0IG9wdGlvbnM6IENsaU9wdGlvbnMgPSB7XG4gICAgZGVidWc6IHByb2Nlc3MuZW52LkRFQlVHID09PSAndHJ1ZScsXG4gICAgcXVpZXQ6IHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1xdWlldCcpLFxuICAgIHZlcmJvc2U6IHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS12ZXJib3NlJyksXG4gICAgbm9Db2xvcjogcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLW5vLWNvbG9yJykgfHwgcHJvY2Vzcy5lbnYuTk9fQ09MT1IgPT09ICcxJyxcbiAgfTtcblxuICBtYWluKG9wdGlvbnMpO1xufSJdfQ==
|
|
392
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDL0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QyxPQUFP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LE9BQU8sQ0FBQyxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG4vLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgcmVhbHBhdGhTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnO1xuaW1wb3J0IHsgcHJvZ3JhbSB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBhdWRpdFN0YWNrcyB9IGZyb20gJy4vY29tbWFuZHMvYXVkaXQtc3RhY2tzLmpzJztcbmltcG9ydCB7IGF1ZGl0VG9rZW5zIH0gZnJvbSAnLi9jb21tYW5kcy9hdWRpdC10b2tlbnMuanMnO1xuaW1wb3J0IHsgYm9vdHN0cmFwIH0gZnJvbSAnLi9jb21tYW5kcy9ib290c3RyYXAuanMnO1xuaW1wb3J0IHsgY3JlYXRlUGlwZWxpbmUgfSBmcm9tICcuL2NvbW1hbmRzL2NyZWF0ZS1waXBlbGluZS5qcyc7XG5pbXBvcnQgeyBkZXBsb3kgfSBmcm9tICcuL2NvbW1hbmRzL2RlcGxveS5qcyc7XG5pbXBvcnQgeyBnZXRQaXBlbGluZSB9IGZyb20gJy4vY29tbWFuZHMvZ2V0LXBpcGVsaW5lLmpzJztcbmltcG9ydCB7IGdldFBsdWdpbiB9IGZyb20gJy4vY29tbWFuZHMvZ2V0LXBsdWdpbi5qcyc7XG5pbXBvcnQgeyBsaXN0UGlwZWxpbmVzIH0gZnJvbSAnLi9jb21tYW5kcy9saXN0LXBpcGVsaW5lcy5qcyc7XG5pbXBvcnQgeyBsaXN0UGx1Z2lucyB9IGZyb20gJy4vY29tbWFuZHMvbGlzdC1wbHVnaW5zLmpzJztcbmltcG9ydCB7IGxvZ2luIH0gZnJvbSAnLi9jb21tYW5kcy9sb2dpbi5qcyc7XG5pbXBvcnQgeyBvcmdFeHBvcnQgfSBmcm9tICcuL2NvbW1hbmRzL29yZy1leHBvcnQuanMnO1xuaW1wb3J0IHsgcHJvdmlzaW9uIH0gZnJvbSAnLi9jb21tYW5kcy9wcm92aXNpb24uanMnO1xuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tICcuL2NvbW1hbmRzL3JlZ2lzdGVyLmpzJztcbmltcG9ydCB7IHNldHVwRXZlbnRzIH0gZnJvbSAnLi9jb21tYW5kcy9zZXR1cC1ldmVudHMuanMnO1xuaW1wb3J0IHsgc3RhdHVzIH0gZnJvbSAnLi9jb21tYW5kcy9zdGF0dXMuanMnO1xuaW1wb3J0IHsgc3RvcmVUb2tlbiB9IGZyb20gJy4vY29tbWFuZHMvc3RvcmUtdG9rZW4uanMnO1xuaW1wb3J0IHsgc3ludGggfSBmcm9tICcuL2NvbW1hbmRzL3N5bnRoLmpzJztcbmltcG9ydCB7IHVwbG9hZFBsdWdpbiB9IGZyb20gJy4vY29tbWFuZHMvdXBsb2FkLXBsdWdpbi5qcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZVRlbXBsYXRlc0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3ZhbGlkYXRlLXRlbXBsYXRlcy5qcyc7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi9jb21tYW5kcy92ZXJzaW9uLmpzJztcbmltcG9ydCB7XG4gIEFQUF9OQU1FLFxuICBBUFBfREVTQ1JJUFRJT04sXG4gIEFQUF9WRVJTSU9OLFxuICBFTlZfVkFSUyxcbiAgaXNEZWJ1Z01vZGUsXG4gIGdlbmVyYXRlRXhlY3V0aW9uSWQsXG59IGZyb20gJy4vY29uZmlnL2NsaS5jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgYmFubmVyLCBtaW5pQmFubmVyIH0gZnJvbSAnLi91dGlscy9iYW5uZXIuanMnO1xuaW1wb3J0IHsgRVJST1JfQ09ERVMsIGhhbmRsZUVycm9yIH0gZnJvbSAnLi91dGlscy9lcnJvci1oYW5kbGVyLmpzJztcbmltcG9ydCB7IHByaW50SW5mbywgcHJpbnRFcnJvciwgcHJpbnRXYXJuaW5nLCBwcmludERlYnVnLCBwcmludFNlY3Rpb24gfSBmcm9tICcuL3V0aWxzL291dHB1dC11dGlscy5qcyc7XG5cbi8qKlxuICogQ0xJIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAqL1xuaW50ZXJmYWNlIENsaU9wdGlvbnMge1xuICAvKipcbiAgICogU2hvdyBiYW5uZXIgb24gc3RhcnR1cFxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBzaG93QmFubmVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTWluaW1hbCBiYW5uZXIgKG5vIEFTQ0lJIGFydClcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIG1pbmltYWxCYW5uZXI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEZWJ1ZyBtb2RlXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBkZWJ1Zz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFZlcmJvc2Ugb3V0cHV0XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICB2ZXJib3NlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUXVpZXQgbW9kZSAobWluaW1hbCBvdXRwdXQpXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBxdWlldD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE5vIGNvbG9yIG91dHB1dFxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgbm9Db2xvcj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ2hlY2sgZW52aXJvbm1lbnQgYW5kIGRpc3BsYXkgd2FybmluZ3NcbiAqL1xuZnVuY3Rpb24gY2hlY2tFbnZpcm9ubWVudCgpOiB2b2lkIHtcbiAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICBpZiAoIXByb2Nlc3MuZW52W0VOVl9WQVJTLlBMQVRGT1JNX1RPS0VOXSkge1xuICAgIHdhcm5pbmdzLnB1c2goJ1BMQVRGT1JNX1RPS0VOIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBzZXQnKTtcbiAgICB3YXJuaW5ncy5wdXNoKCdBdXRoZW50aWNhdGlvbiB3aWxsIGZhaWwgZm9yIEFQSSBvcGVyYXRpb25zJyk7XG4gIH1cblxuICAvLyBDaGVjayBOb2RlIHZlcnNpb25cbiAgY29uc3Qgbm9kZVZlcnNpb24gPSBwcm9jZXNzLnZlcnNpb247XG4gIGNvbnN0IG1ham9yVmVyc2lvbiA9IHBhcnNlSW50KG5vZGVWZXJzaW9uLnNsaWNlKDEpLnNwbGl0KCcuJylbMF0gfHwgJzAnLCAxMCk7XG4gIGlmIChtYWpvclZlcnNpb24gPCAxOCkge1xuICAgIHdhcm5pbmdzLnB1c2goYE5vZGUuanMgJHtub2RlVmVyc2lvbn0gZGV0ZWN0ZWQgLSB2ZXJzaW9uIDE4KyByZWNvbW1lbmRlZGApO1xuICB9XG5cbiAgLy8gRGlzcGxheSB3YXJuaW5nc1xuICBpZiAod2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgIHByaW50U2VjdGlvbignRW52aXJvbm1lbnQgV2FybmluZ3MnKTtcbiAgICB3YXJuaW5ncy5mb3JFYWNoKHdhcm5pbmcgPT4ge1xuICAgICAgcHJpbnRXYXJuaW5nKHdhcm5pbmcpO1xuICAgIH0pO1xuICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgfVxufVxuXG4vKipcbiAqIERpc3BsYXkgc3RhcnR1cCBpbmZvcm1hdGlvblxuICovXG5mdW5jdGlvbiBkaXNwbGF5U3RhcnR1cEluZm8ob3B0aW9uczogQ2xpT3B0aW9ucyk6IHZvaWQge1xuICBpZiAob3B0aW9ucy5xdWlldCkgcmV0dXJuO1xuXG4gIGNvbnN0IGV4ZWN1dGlvbklkID0gZ2VuZXJhdGVFeGVjdXRpb25JZCgpO1xuXG4gIGlmIChvcHRpb25zLmRlYnVnIHx8IG9wdGlvbnMudmVyYm9zZSkge1xuICAgIHByaW50RGVidWcoJ0NMSSBDb25maWd1cmF0aW9uJywge1xuICAgICAgbmFtZTogQVBQX05BTUUsXG4gICAgICB2ZXJzaW9uOiBBUFBfVkVSU0lPTixcbiAgICAgIGV4ZWN1dGlvbklkLFxuICAgICAgbm9kZTogcHJvY2Vzcy52ZXJzaW9uLFxuICAgICAgcGxhdGZvcm06IHByb2Nlc3MucGxhdGZvcm0sXG4gICAgICBhcmNoOiBwcm9jZXNzLmFyY2gsXG4gICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgICBlbnY6IHtcbiAgICAgICAgZGVidWc6IHByb2Nlc3MuZW52LkRFQlVHLFxuICAgICAgICB0b2tlbjogcHJvY2Vzcy5lbnZbRU5WX1ZBUlMuUExBVEZPUk1fVE9LRU5dID8gJ3NldCc6ICdub3Qgc2V0JyxcbiAgICAgICAgdXJsOiBwcm9jZXNzLmVudltFTlZfVkFSUy5QTEFURk9STV9CQVNFX1VSTF0gfHwgJ2RlZmF1bHQnLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBwcmludERlYnVnKCdTdGFydGluZyBDTEknLCB7XG4gICAgICB2ZXJzaW9uOiBBUFBfVkVSU0lPTixcbiAgICAgIGV4ZWN1dGlvbklkLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYWxsIENMSSBjb21tYW5kc1xuICovXG5mdW5jdGlvbiByZWdpc3RlckNvbW1hbmRzKCk6IHZvaWQge1xuICBwcmludERlYnVnKCdSZWdpc3RlcmluZyBjb21tYW5kcycpO1xuXG4gIC8vIENvbmZpZ3VyZSBwcm9ncmFtXG4gIHByb2dyYW1cbiAgICAubmFtZShBUFBfTkFNRSlcbiAgICAuZGVzY3JpcHRpb24oQVBQX0RFU0NSSVBUSU9OKVxuICAgIC52ZXJzaW9uKEFQUF9WRVJTSU9OLCAnLXYsIC0tdmVyc2lvbicsICdTaG93IENMSSB2ZXJzaW9uJylcbiAgICAub3B0aW9uKCctLWRlYnVnJywgJ0VuYWJsZSBkZWJ1ZyBvdXRwdXQgd2l0aCBzdGFjayB0cmFjZXMnLCBmYWxzZSlcbiAgICAub3B0aW9uKCctLXZlcmJvc2UnLCAnU2hvdyBkZXRhaWxlZCBpbmZvcm1hdGlvbicsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tcXVpZXQnLCAnTWluaW1hbCBvdXRwdXQgKGVycm9ycyBvbmx5KScsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tbm8tY29sb3InLCAnRGlzYWJsZSBjb2xvcmVkIG91dHB1dCcsIGZhbHNlKVxuICAgIC5hZGRIZWxwVGV4dCgnYWZ0ZXInLCBgXG5FbnZpcm9ubWVudCBWYXJpYWJsZXMgICR7RU5WX1ZBUlMuUExBVEZPUk1fVE9LRU59IEF1dGhlbnRpY2F0aW9uIHRva2VuIChyZXF1aXJlZClcbiAgJHtFTlZfVkFSUy5QTEFURk9STV9CQVNFX1VSTH0gQVBJIGJhc2UgVVJMIChvcHRpb25hbClcbiAgJHtFTlZfVkFSUy5DTElfQ09ORklHX1BBVEh9IENvbmZpZyBmaWxlIHBhdGggKG9wdGlvbmFsKVxuICAke0VOVl9WQVJTLlRMU19SRUpFQ1RfVU5BVVRIT1JJWkVEfSBEaXNhYmxlIFNTTCB2ZXJpZmljYXRpb24gaWYgJzAnXG4gICR7RU5WX1ZBUlMuREVCVUd9IEVuYWJsZSBkZWJ1ZyBtb2RlIGlmICd0cnVlJ1xuXG5FeGFtcGxlcyAgJCAke0FQUF9OQU1FfSB2ZXJzaW9uXG4gICQgJHtBUFBfTkFNRX0gbGlzdC1waXBlbGluZXMgLS1wcm9qZWN0IG15LWFwcFxuICAkICR7QVBQX05BTUV9IGdldC1waXBlbGluZSAtLWlkIHBpcGUtMTIzIC0tZm9ybWF0IGpzb25cbiAgJCAke0FQUF9OQU1FfSBzdG9yZS10b2tlbiAtLWRheXMgMzAgLS1yZWdpb24gdXMtZWFzdC0xXG4gICQgJHtBUFBfTkFNRX0gYm9vdHN0cmFwIC0tYWNjb3VudCAxMjM0NTY3ODkwMTIgLS1yZWdpb24gdXMtZWFzdC0xXG4gICQgJHtBUFBfTkFNRX0gZGVwbG95IC0taWQgcGlwZS0xMjMgLS1wcm9maWxlIHByb2R1Y3Rpb25cblxuYCk7XG5cbiAgLy8gVmVyc2lvbiBjb21tYW5kIChzcGVjaWFsIGhhbmRsaW5nKVxuICB2ZXJzaW9uKHByb2dyYW0pO1xuXG4gIC8vIEF1dGhlbnRpY2F0aW9uIGNvbW1hbmRzXG4gIHByaW50RGVidWcoJ1JlZ2lzdGVyaW5nIGF1dGhlbnRpY2F0aW9uIGNvbW1hbmRzJyk7XG4gIGxvZ2luKHByb2dyYW0pOyAvLyBMb2dpbiBhbmQgb2J0YWluIFBMQVRGT1JNX1RPS0VOIChhbHNvIHN1cHBvcnRzIC0tcmVmcmVzaClcblxuICAvLyBRdWVyeSBjb21tYW5kc1xuICBwcmludERlYnVnKCdSZWdpc3RlcmluZyBxdWVyeSBjb21tYW5kcycpO1xuICBnZXRQbHVnaW4ocHJvZ3JhbSk7IC8vIFNpbmdsZSBwbHVnaW4gYnkgSURcbiAgbGlzdFBsdWdpbnMocHJvZ3JhbSk7IC8vIE11bHRpcGxlIHBsdWdpbnMgd2l0aCBmaWx0ZXJzXG4gIGdldFBpcGVsaW5lKHByb2dyYW0pOyAvLyBTaW5nbGUgcGlwZWxpbmUgYnkgSURcbiAgbGlzdFBpcGVsaW5lcyhwcm9ncmFtKTsgLy8gTXVsdGlwbGUgcGlwZWxpbmVzIHdpdGggZmlsdGVyc1xuXG4gIC8vIENyZWF0ZS9VcGxvYWQgY29tbWFuZHNcbiAgcHJpbnREZWJ1ZygnUmVnaXN0ZXJpbmcgY3JlYXRlL3VwbG9hZCBjb21tYW5kcycpO1xuICBjcmVhdGVQaXBlbGluZShwcm9ncmFtKTsgLy8gQ3JlYXRlIHBpcGVsaW5lIGNvbmZpZ3VyYXRpb25cbiAgdXBsb2FkUGx1Z2luKHByb2dyYW0pOyAvLyBVcGxvYWQgYW5kIGRlcGxveSBwbHVnaW5cblxuICAvLyBTdGF0dXMgY29tbWFuZFxuICBwcmludERlYnVnKCdSZWdpc3RlcmluZyBzdGF0dXMgY29tbWFuZCcpO1xuICBzdGF0dXMocHJvZ3JhbSk7IC8vIFNob3cgZW52aXJvbm1lbnQgYW5kIGNvbm5lY3Rpdml0eSBzdGF0dXNcblxuICAvLyBPcmcgYWRtaW4gY29tbWFuZHNcbiAgcHJpbnREZWJ1ZygnUmVnaXN0ZXJpbmcgb3JnIGFkbWluIGNvbW1hbmRzJyk7XG4gIG9yZ0V4cG9ydChwcm9ncmFtKTsgLy8gR0RQUiBwb3J0YWJpbGl0eSBleHBvcnQgw6LCgMKUIHN5c2FkbWluIChhbnkgb3JnKSBvciBvcmcgYWRtaW4gKG93biBvcmcpXG5cbiAgLy8gRGVwbG95bWVudCBjb21tYW5kc1xuICBwcmludERlYnVnKCdSZWdpc3RlcmluZyBkZXBsb3ltZW50IGNvbW1hbmRzJyk7XG4gIHN0b3JlVG9rZW4ocHJvZ3JhbSk7IC8vIEdlbmVyYXRlIEpXVCB0b2tlbiBhbmQgc3RvcmUgaW4gU2VjcmV0cyBNYW5hZ2VyXG4gIHNldHVwRXZlbnRzKHByb2dyYW0pOyAvLyBEZXBsb3kgRXZlbnRCcmlkZ2UgZXZlbnQgaW5nZXN0aW9uIGluZnJhc3RydWN0dXJlXG4gIGJvb3RzdHJhcChwcm9ncmFtKTsgLy8gQm9vdHN0cmFwIENESyB0b29sa2l0IHN0YWNrXG4gIGRlcGxveShwcm9ncmFtKTsgLy8gRGVwbG95IHBpcGVsaW5lIHdpdGggQ0RLICgtLWFwcCBwcmludHMgYm9pbGVycGxhdGUgcGF0aClcbiAgcmVnaXN0ZXIocHJvZ3JhbSk7IC8vIFJlLXJlZ2lzdGVyIGEgZGVwbG95ZWQgcGlwZWxpbmUgQVJOICsgZHJhaW4gcGVuZGluZyBpbnRlbnRzIGZyb20gcHJpb3IgZmFpbGVkIGRlcGxveXNcbiAgcHJvdmlzaW9uKHByb2dyYW0pOyAvLyBBSS1hc3Npc3RlZCBhZHZpc29yIHRvIGRlcGxveSB0aGUgUExBVEZPUk0gKGxvY2FsL21pbmlrdWJlL0VDMi9GYXJnYXRlKSDigJQgcmVhZC1vbmx5XG5cbiAgLy8gT3BlcmF0b3IgYXVkaXQgY29tbWFuZHMgKGNyb24tZnJpZW5kbHk6IGV4aXQgMSBvbiBmaW5kaW5ncylcbiAgcHJpbnREZWJ1ZygnUmVnaXN0ZXJpbmcgYXVkaXQgY29tbWFuZHMnKTtcbiAgYXVkaXRUb2tlbnMocHJvZ3JhbSk7IC8vIFNjYW4gU2VjcmV0cyBNYW5hZ2VyIGZvciBleHBpcmluZyBwbGF0Zm9ybSB0b2tlbnNcbiAgYXVkaXRTdGFja3MocHJvZ3JhbSk7IC8vIERpZmYgQ0ZOIHN0YWNrcyB2cyBwaXBlbGluZV9yZWdpc3RyeSB0byBmaW5kIGRyaWZ0XG4gIHN5bnRoKHByb2dyYW0pOyAvLyBSdW4gQ0RLIHN5bnRoZXNpc1xuICB2YWxpZGF0ZVRlbXBsYXRlc0NvbW1hbmQocHJvZ3JhbSk7IC8vIFZhbGlkYXRlIHt7Li4uIH19IHRlbXBsYXRlcyBpbiBhIHBpcGVsaW5lIG9yIHBsdWdpblxuXG4gIC8vIFNoZWxsIGNvbXBsZXRpb25zXG4gIHByaW50RGVidWcoJ1JlZ2lzdGVyaW5nIGNvbXBsZXRpb25zIGNvbW1hbmQnKTtcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKCdjb21wbGV0aW9ucycpXG4gICAgLmRlc2NyaXB0aW9uKCdHZW5lcmF0ZSBzaGVsbCBjb21wbGV0aW9ucyAoYmFzaCwgenNoLCBmaXNoKScpXG4gICAgLmFyZ3VtZW50KCc8c2hlbGw+JywgJ1NoZWxsIHR5cGU6IGJhc2gsIHpzaCwgb3IgZmlzaCcpXG4gICAgLmFjdGlvbigoc2hlbGw6IHN0cmluZykgPT4ge1xuICAgICAgLy8gUHVsbCBjb21tYW5kIG5hbWVzIGZyb20gY29tbWFuZGVyJ3MgcmVnaXN0ZXJlZCBsaXN0IHNvIGNvbXBsZXRpb25zIG5ldmVyXG4gICAgICAvLyBkcmlmdCBmcm9tIHRoZSBhY3R1YWwgQ0xJIHN1cmZhY2UuIFNvcnRlZCBmb3Igc3RhYmxlIG91dHB1dC5cbiAgICAgIGNvbnN0IGNvbW1hbmRzID0gcHJvZ3JhbS5jb21tYW5kcy5tYXAoYyA9PiBjLm5hbWUoKSkuc29ydCgpLmpvaW4oJyAnKTtcbiAgICAgIHN3aXRjaCAoc2hlbGwpIHtcbiAgICAgICAgY2FzZSAnYmFzaCc6XG4gICAgICAgICAgY29uc29sZS5sb2coYCMgcGlwZWxpbmUtbWFuYWdlciBiYXNoIGNvbXBsZXRpb25zXG5fcGlwZWxpbmVfbWFuYWdlcl9jb21wbGV0aW9ucygpIHtcbiAgbG9jYWwgY3VyPVwiXFwke0NPTVBfV09SRFNbQ09NUF9DV09SRF19XCJcbiAgbG9jYWwgY29tbWFuZHM9XCIke2NvbW1hbmRzfVwiXG4gIENPTVBSRVBMWT0oJChjb21wZ2VuIC1XIFwiXFwke2NvbW1hbmRzfVwiIC0tIFwiXFwke2N1cn1cIikpXG59XG5jb21wbGV0ZSAtRiBfcGlwZWxpbmVfbWFuYWdlcl9jb21wbGV0aW9ucyBwaXBlbGluZS1tYW5hZ2VyYCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3pzaCc6XG4gICAgICAgICAgY29uc29sZS5sb2coYCMgcGlwZWxpbmUtbWFuYWdlciB6c2ggY29tcGxldGlvbnNcbl9waXBlbGluZV9tYW5hZ2VyKCkge1xuICBsb2NhbCBjb21tYW5kcz0oJHtjb21tYW5kc30pXG4gIF9kZXNjcmliZSAnY29tbWFuZCcgY29tbWFuZHNcbn1cbmNvbXBkZWYgX3BpcGVsaW5lX21hbmFnZXIgcGlwZWxpbmUtbWFuYWdlcmApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdmaXNoJzpcbiAgICAgICAgICBjb25zb2xlLmxvZyhgIyBwaXBlbGluZS1tYW5hZ2VyIGZpc2ggY29tcGxldGlvbnNcbmNvbXBsZXRlIC1jIHBpcGVsaW5lLW1hbmFnZXIgLW4gJ19fZmlzaF91c2Vfc3ViY29tbWFuZCcgLWEgJyR7Y29tbWFuZHN9J2ApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFVua25vd24gc2hlbGw6ICR7c2hlbGx9LiBVc2UgYmFzaCwgenNoLCBvciBmaXNoLmApO1xuICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICBwcmludERlYnVnKCdBbGwgY29tbWFuZHMgcmVnaXN0ZXJlZCBzdWNjZXNzZnVsbHknKTtcbn1cblxuLyoqXG4gKiBIYW5kbGUgcHJvZ3JhbSBlcnJvcnNcbiAqL1xuZnVuY3Rpb24gc2V0dXBFcnJvckhhbmRsZXJzKCk6IHZvaWQge1xuICAvLyBIYW5kbGUgdW5jYXVnaHQgZXhjZXB0aW9uc1xuICBwcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIChlcnJvcjogRXJyb3IpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgIHByaW50RXJyb3IoJ1VuY2F1Z2h0IGV4Y2VwdGlvbicsIHtcbiAgICAgIGVycm9yOiBlcnJvci5tZXNzYWdlLFxuICAgICAgbmFtZTogZXJyb3IubmFtZSxcbiAgICB9KTtcblxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBFUlJPUl9DT0RFUy5HRU5FUkFMLCB7XG4gICAgICBkZWJ1ZzogaXNEZWJ1Z01vZGUocHJvZ3JhbS5vcHRzKCkpLFxuICAgICAgZXhpdDogdHJ1ZSxcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgdHlwZTogJ3VuY2F1Z2h0RXhjZXB0aW9uJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIEhhbmRsZSB1bmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb25zXG4gIHByb2Nlc3Mub24oJ3VuaGFuZGxlZFJlamVjdGlvbicsIChyZWFzb246IHVua25vd24pID0+IHtcbiAgICBjb25zb2xlLmVycm9yKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgIHByaW50RXJyb3IoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHtcbiAgICAgIHJlYXNvbjogcmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyByZWFzb24ubWVzc2FnZTogU3RyaW5nKHJlYXNvbiksXG4gICAgfSk7XG5cbiAgICBjb25zdCBlcnJvciA9IHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yID8gcmVhc29uOiBuZXcgRXJyb3IoU3RyaW5nKHJlYXNvbikpO1xuXG4gICAgaGFuZGxlRXJyb3IoZXJyb3IsIEVSUk9SX0NPREVTLkdFTkVSQUwsIHtcbiAgICAgIGRlYnVnOiBpc0RlYnVnTW9kZShwcm9ncmFtLm9wdHMoKSksXG4gICAgICBleGl0OiB0cnVlLFxuICAgICAgY29udGV4dDoge1xuICAgICAgICB0eXBlOiAndW5oYW5kbGVkUmVqZWN0aW9uJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIEhhbmRsZSBTSUdJTlQgKEN0cmwrQylcbiAgcHJvY2Vzcy5vbignU0lHSU5UJywgKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgIHByaW50V2FybmluZygnUHJvY2VzcyBpbnRlcnJ1cHRlZCBieSB1c2VyIChTSUdJTlQpJyk7XG4gICAgY29uc29sZS5sb2coJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgcHJvY2Vzcy5leGl0KDEzMCk7IC8vIFN0YW5kYXJkIGV4aXQgY29kZSBmb3IgU0lHSU5UXG4gIH0pO1xuXG4gIC8vIEhhbmRsZSBTSUdURVJNXG4gIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgcHJpbnRXYXJuaW5nKCdQcm9jZXNzIHRlcm1pbmF0ZWQgKFNJR1RFUk0pJyk7XG4gICAgY29uc29sZS5sb2coJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgcHJvY2Vzcy5leGl0KDE0Myk7IC8vIFN0YW5kYXJkIGV4aXQgY29kZSBmb3IgU0lHVEVSTVxuICB9KTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIENMSSB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENMSSBpbml0aWFsaXphdGlvbiBvcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplQ2xpKG9wdGlvbnM6IENsaU9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICBjb25zdCB7XG4gICAgc2hvd0Jhbm5lciA9IHRydWUsXG4gICAgbWluaW1hbEJhbm5lciA9IGZhbHNlLFxuICAgIGRlYnVnID0gZmFsc2UsXG4gICAgdmVyYm9zZSA9IGZhbHNlLFxuICAgIHF1aWV0ID0gZmFsc2UsXG4gICAgbm9Db2xvciA9IGZhbHNlLFxuICB9ID0gb3B0aW9ucztcblxuICAvLyBIYW5kbGUgY29sb3Igb3V0cHV0XG4gIGlmIChub0NvbG9yKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9fQ09MT1IgPSAnMSc7XG4gIH1cblxuICAvLyBEaXNwbGF5IGJhbm5lclxuICBpZiAoc2hvd0Jhbm5lciAmJiAhcXVpZXQpIHtcbiAgICBpZiAobWluaW1hbEJhbm5lcikge1xuICAgICAgbWluaUJhbm5lcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBiYW5uZXIoe1xuICAgICAgICBtaW5pbWFsOiBmYWxzZSxcbiAgICAgICAgc2hvd0Rlc2NyaXB0aW9uOiB0cnVlLFxuICAgICAgICBzaG93VGltZXN0YW1wOiBkZWJ1ZyB8fCB2ZXJib3NlLFxuICAgICAgICBzaG93RXhlY3V0aW9uSWQ6IGRlYnVnLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gRGlzcGxheSBzdGFydHVwIGluZm9cbiAgZGlzcGxheVN0YXJ0dXBJbmZvKHsgZGVidWcsIHZlcmJvc2UsIHF1aWV0IH0pO1xuXG4gIC8vIENoZWNrIGVudmlyb25tZW50XG4gIGlmICghcXVpZXQpIHtcbiAgICBjaGVja0Vudmlyb25tZW50KCk7XG4gIH1cblxuICAvLyBTZXR1cCBlcnJvciBoYW5kbGVyc1xuICBzZXR1cEVycm9ySGFuZGxlcnMoKTtcblxuICAvLyBSZWdpc3RlciBjb21tYW5kc1xuICB0cnkge1xuICAgIHJlZ2lzdGVyQ29tbWFuZHMoKTtcbiAgICBwcmludERlYnVnKCdDTEkgaW5pdGlhbGl6YXRpb24gY29tcGxldGUnKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBwcmludEVycm9yKCdDTEkgaW5pdGlhbGl6YXRpb24gZmFpbGVkJywge1xuICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlOiBTdHJpbmcoZXJyb3IpLFxuICAgIH0pO1xuXG4gICAgaGFuZGxlRXJyb3IoZXJyb3IsIEVSUk9SX0NPREVTLkNPTkZJR1VSQVRJT04sIHtcbiAgICAgIGRlYnVnOiBkZWJ1ZyB8fCBpc0RlYnVnTW9kZSgpLFxuICAgICAgZXhpdDogdHJ1ZSxcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgc3RhZ2U6ICdpbml0aWFsaXphdGlvbicsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUGFyc2UgY29tbWFuZCBsaW5lIGFyZ3VtZW50c1xuICovXG5mdW5jdGlvbiBwYXJzZUFyZ3VtZW50cygpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBwcm9ncmFtLnBhcnNlKHByb2Nlc3MuYXJndik7XG5cbiAgICAvLyBTaG93IGhlbHAgaWYgbm8gY29tbWFuZCBwcm92aWRlZFxuICAgIGNvbnN0IGFyZ3MgPSBwcm9jZXNzLmFyZ3Yuc2xpY2UoMik7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBwcmludEluZm8oJ05vIGNvbW1hbmQgc3BlY2lmaWVkIC0gZGlzcGxheWluZyBoZWxwJyk7XG4gICAgICBjb25zb2xlLmxvZygnJyk7IC8vIEVtcHR5IGxpbmVcbiAgICAgIHByb2dyYW0ub3V0cHV0SGVscCgpO1xuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGNvbW1hbmQgZXhpc3RzXG4gICAgY29uc3QgY29tbWFuZCA9IGFyZ3NbMF07XG4gICAgaWYgKGNvbW1hbmQgJiYgIWNvbW1hbmQuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICBjb25zdCBjb21tYW5kRXhpc3RzID0gcHJvZ3JhbS5jb21tYW5kcy5zb21lKGNtZCA9PiBjbWQubmFtZSgpID09PSBjb21tYW5kKTtcblxuICAgICAgaWYgKCFjb21tYW5kRXhpc3RzKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgICAgICBwcmludEVycm9yKGBVbmtub3duIGNvbW1hbmQ6ICR7Y29tbWFuZH1gKTtcbiAgICAgICAgY29uc29sZS5sb2coJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgICAgIHByaW50SW5mbygnQXZhaWxhYmxlIGNvbW1hbmRzOicpO1xuICAgICAgICBwcm9ncmFtLmNvbW1hbmRzLmZvckVhY2goY21kID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgIOKAoiAke2NtZC5uYW1lKCl9IC0gJHtjbWQuZGVzY3JpcHRpb24oKX1gKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpbnREZWJ1ZygnQ29tbWFuZCBsaW5lIGFyZ3VtZW50cyBwYXJzZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaGFuZGxlRXJyb3IoZXJyb3IsIEVSUk9SX0NPREVTLkdFTkVSQUwsIHtcbiAgICAgIGRlYnVnOiBpc0RlYnVnTW9kZShwcm9ncmFtLm9wdHMoKSksXG4gICAgICBleGl0OiB0cnVlLFxuICAgICAgY29udGV4dDoge1xuICAgICAgICBzdGFnZTogJ2FyZ3VtZW50LXBhcnNpbmcnLFxuICAgICAgICBhcmd2OiBwcm9jZXNzLmFyZ3YsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogTWFpbiBDTEkgZW50cnkgcG9pbnRcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENMSSBpbml0aWFsaXphdGlvbiBvcHRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIFN0YW5kYXJkIGluaXRpYWxpemF0aW9uXG4gKiBtYWluKCk7XG4gKlxuICogLy8gTWluaW1hbCBtb2RlXG4gKiBtYWluKHsgbWluaW1hbEJhbm5lcjogdHJ1ZSwgcXVpZXQ6IHRydWUgfSk7XG4gKlxuICogLy8gRGVidWcgbW9kZVxuICogbWFpbih7IGRlYnVnOiB0cnVlLCB2ZXJib3NlOiB0cnVlIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWluKG9wdGlvbnM6IENsaU9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICB0cnkge1xuICAgIC8vIEluaXRpYWxpemUgQ0xJXG4gICAgaW5pdGlhbGl6ZUNsaShvcHRpb25zKTtcblxuICAgIC8vIFBhcnNlIGFyZ3VtZW50cyBhbmQgZXhlY3V0ZSBjb21tYW5kXG4gICAgcGFyc2VBcmd1bWVudHMoKTtcblxuICAgIC8vIElmIHdlIHJlYWNoIGhlcmUsIGNvbW1hbmQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseVxuICAgIHByaW50RGVidWcoJ0NMSSBleGVjdXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseScpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIEZpbmFsIGNhdGNoLWFsbCBlcnJvciBoYW5kbGVyXG4gICAgY29uc29sZS5lcnJvcignJyk7IC8vIEVtcHR5IGxpbmVcbiAgICBwcmludEVycm9yKCdGYXRhbCBDTEkgZXJyb3InLCB7XG4gICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2U6IFN0cmluZyhlcnJvciksXG4gICAgfSk7XG5cbiAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuR0VORVJBTCwge1xuICAgICAgZGVidWc6IGlzRGVidWdNb2RlKG9wdGlvbnMpLFxuICAgICAgZXhpdDogdHJ1ZSxcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgc3RhZ2U6ICdtYWluJyxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSdW4gQ0xJIGlmIGV4ZWN1dGVkIGRpcmVjdGx5LiBFU00gaGFzIG5vIGByZXF1aXJlLm1haW5gOyBjb21wYXJlIHRoZSBpbnZva2VkXG4gKiBzY3JpcHQgdG8gdGhpcyBtb2R1bGUncyBwYXRoLCByZXNvbHZpbmcgc3ltbGlua3Mgb24gYm90aCBzaWRlcyBzbyB0aGUgYGJpbmBcbiAqIHN5bWxpbmsgKG5vZGVfbW9kdWxlcy8uYmluL3BpcGVsaW5lLW1hbmFnZXIg4oaSIGRpc3QvY2xpLmpzKSBzdGlsbCBtYXRjaGVzLlxuICovXG5jb25zdCBpbnZva2VkU2NyaXB0ID0gcHJvY2Vzcy5hcmd2WzFdO1xuY29uc3QgaXNNYWluTW9kdWxlID0gaW52b2tlZFNjcmlwdCAhPT0gdW5kZWZpbmVkXG4gICYmIHJlYWxwYXRoU3luYyhpbnZva2VkU2NyaXB0KSA9PT0gcmVhbHBhdGhTeW5jKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG5pZiAoaXNNYWluTW9kdWxlKSB7XG4gIC8vIFBhcnNlIENMSSBvcHRpb25zIGZyb20gZW52aXJvbm1lbnQgb3IgY29tbWFuZCBsaW5lXG4gIGNvbnN0IG9wdGlvbnM6IENsaU9wdGlvbnMgPSB7XG4gICAgZGVidWc6IHByb2Nlc3MuZW52LkRFQlVHID09PSAndHJ1ZScsXG4gICAgcXVpZXQ6IHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1xdWlldCcpLFxuICAgIHZlcmJvc2U6IHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS12ZXJib3NlJyksXG4gICAgbm9Db2xvcjogcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLW5vLWNvbG9yJykgfHwgcHJvY2Vzcy5lbnYuTk9fQ09MT1IgPT09ICcxJyxcbiAgfTtcblxuICBtYWluKG9wdGlvbnMpO1xufSJdfQ==
|