@pipeline-builder/pipeline-manager 4.1.3 → 4.1.5

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 (52) hide show
  1. package/README.md +2 -1
  2. package/dist/agent/env-file.d.ts +1 -1
  3. package/dist/agent/env-file.js +2 -2
  4. package/dist/agent/post-steps.d.ts.map +1 -1
  5. package/dist/agent/post-steps.js +38 -18
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +19 -9
  8. package/dist/commands/audit-tokens.d.ts.map +1 -1
  9. package/dist/commands/audit-tokens.js +32 -21
  10. package/dist/commands/create-pat.d.ts +20 -13
  11. package/dist/commands/create-pat.d.ts.map +1 -1
  12. package/dist/commands/create-pat.js +93 -98
  13. package/dist/commands/login.d.ts +14 -8
  14. package/dist/commands/login.d.ts.map +1 -1
  15. package/dist/commands/login.js +89 -124
  16. package/dist/commands/setup-events.d.ts.map +1 -1
  17. package/dist/commands/setup-events.js +6 -5
  18. package/dist/commands/status.d.ts.map +1 -1
  19. package/dist/commands/status.js +9 -3
  20. package/dist/commands/store-token.d.ts +16 -11
  21. package/dist/commands/store-token.d.ts.map +1 -1
  22. package/dist/commands/store-token.js +213 -131
  23. package/dist/lambda/token-renew-handler.d.ts.map +1 -1
  24. package/dist/lambda/token-renew-handler.js +134 -97
  25. package/dist/templates/events-stack.json +1 -1
  26. package/dist/templates/token-renew-stack.json +9 -10
  27. package/dist/utils/auth-utils.d.ts +21 -38
  28. package/dist/utils/auth-utils.d.ts.map +1 -1
  29. package/dist/utils/auth-utils.js +20 -33
  30. package/dist/utils/command-utils.d.ts +8 -6
  31. package/dist/utils/command-utils.d.ts.map +1 -1
  32. package/dist/utils/command-utils.js +71 -15
  33. package/dist/utils/config-loader.d.ts +2 -1
  34. package/dist/utils/config-loader.d.ts.map +1 -1
  35. package/dist/utils/config-loader.js +18 -8
  36. package/dist/utils/credential-store.d.ts +23 -0
  37. package/dist/utils/credential-store.d.ts.map +1 -0
  38. package/dist/utils/credential-store.js +92 -0
  39. package/dist/utils/device-auth.d.ts +59 -0
  40. package/dist/utils/device-auth.d.ts.map +1 -0
  41. package/dist/utils/device-auth.js +139 -0
  42. package/dist/utils/pipeline-config.js +2 -2
  43. package/dist/utils/platform-secret.d.ts +19 -1
  44. package/dist/utils/platform-secret.d.ts.map +1 -1
  45. package/dist/utils/platform-secret.js +26 -4
  46. package/dist/utils/service-account.d.ts +73 -0
  47. package/dist/utils/service-account.d.ts.map +1 -0
  48. package/dist/utils/service-account.js +158 -0
  49. package/package.json +4 -4
  50. package/dist/utils/rate-limiter.d.ts +0 -15
  51. package/dist/utils/rate-limiter.d.ts.map +0 -1
  52. package/dist/utils/rate-limiter.js +0 -164
@@ -4,68 +4,71 @@ import axios from 'axios';
4
4
  import { Command } from 'commander';
5
5
  import pico from 'picocolors';
6
6
  import { TIMEOUTS } from '../config/cli.constants.js';
7
- import { assertCredentialTlsAllowed, credentialHttpsAgent, postLogin, resolveCredentials, switchOrganization } from '../utils/auth-utils.js';
7
+ import { assertCredentialTlsAllowed, credentialHttpsAgent, switchOrganization } from '../utils/auth-utils.js';
8
8
  import { printCommandHeader, withSslOptions } from '../utils/command-utils.js';
9
+ import { DeviceAuthError, openInBrowser, pollForDeviceToken, requestDeviceCode } from '../utils/device-auth.js';
9
10
  import { ERROR_CODES, handleError } from '../utils/error-handler.js';
10
- import { printDebug, printError, printInfo, printKeyValue, printSuccess, printWarning } from '../utils/output-utils.js';
11
- import { checkAuthRateLimit, recordAuthFailure, recordAuthSuccess } from '../utils/rate-limiter.js';
12
- const { bold, green, yellow } = pico;
11
+ import { printDebug, printError, printInfo, printKeyValue, printSuccess } from '../utils/output-utils.js';
12
+ const { bold, cyan, dim, green, yellow } = pico;
13
13
  const MAX_EXPIRES_DAYS = 365;
14
14
  /**
15
- * Registers the `create-pat` command with the CLI program.
15
+ * Registers the `pat` command with the CLI program.
16
16
  *
17
- * Mints a named Personal Access Token — a durable, individually-revocable API
18
- * credential — for CI/automation. Unlike `login` (which returns a short-lived
19
- * session token), a PAT is the right long-lived credential for scripts.
17
+ * Mints a named ACCESS KEY (`pb_pat_…`) — a durable, individually-revocable API
18
+ * credential — for CI/automation. Unlike a session, a key is the right
19
+ * long-lived credential for scripts.
20
20
  *
21
- * The platform gates PAT creation behind step-up re-authentication, so this
22
- * command chains three calls: login (→ access token), step-up with the same
23
- * password (→ step-up token), then POST /user/pats. The PAT binds to the user's
24
- * active org; pass `--org` to switch first (persists as the active org).
21
+ * The key is OPAQUE: it carries no claims, and each service trades it at
22
+ * platform's /auth/token/exchange for a 5-minute token, so revoking it takes
23
+ * effect everywhere within five minutes.
25
24
  *
26
- * The raw token is printed ONCE. `--quiet` prints only `export PLATFORM_TOKEN=…`
27
- * so it can be `eval`'d — the PAT is itself a valid Bearer credential.
25
+ * Creating one is step-up gated server-side, which used to mean the CLI had to
26
+ * hold a password (it POSTed it twice — sign-in, then step-up). It no longer
27
+ * has one: the device flow asks for the step-up IN THE BROWSER, where the
28
+ * account's real factors live, and the approved poll returns both the session
29
+ * and a short-lived step-up token. The key binds to the user's active org; pass
30
+ * `--org` to switch first (which persists as the active org).
31
+ *
32
+ * The raw key is printed ONCE — only its hash is stored, so it can never be read
33
+ * back. `--quiet` prints only `export PLATFORM_TOKEN=…` so it can be `eval`'d;
34
+ * the key is itself a valid Bearer credential.
28
35
  *
29
36
  * @param program - The root Commander program instance to attach the command to.
30
37
  *
31
38
  * @example
32
39
  * ```bash
33
- * PLATFORM_PASSWORD=secret pipeline-manager auth pat --name ci-deploy -u ci@example.com
34
- * pipeline-manager auth pat --name ci --expires-days 30 -u ci@example.com -p secret
35
- * eval $(PLATFORM_PASSWORD=secret pipeline-manager auth pat --name ci -u ci@example.com --quiet)
40
+ * pipeline-manager auth pat --name ci-deploy
41
+ * pipeline-manager auth pat --name ci --expires-days 30 --org <orgId>
42
+ * eval $(pipeline-manager auth pat --name ci --quiet)
36
43
  * ```
37
44
  */
38
45
  export function createPat(program) {
39
46
  withSslOptions(program
40
47
  .command('pat')
41
- .description('Create a named Personal Access Token (long-lived CLI/automation credential)')
42
- .requiredOption('--name <name>', 'Human-readable token name (e.g. ci-deploy)')
43
- .option('--expires-days <days>', `Token lifetime in days (1-${MAX_EXPIRES_DAYS})`, '90')
44
- .option('--scope <scope>', 'Optional token scope')
45
- .option('-u, --identifier <identifier>', 'Username or email')
46
- .option('-p, --password <password>', 'Password (prefer PLATFORM_PASSWORD env)')
47
- .option('--org <orgId>', 'Bind the token to a specific organization (switches active org)')
48
+ .description('Create a named access key (long-lived, opaque CLI/automation credential)')
49
+ .requiredOption('--name <name>', 'Human-readable key name (e.g. ci-deploy)')
50
+ .option('--expires-days <days>', `Key lifetime in days (1-${MAX_EXPIRES_DAYS})`, '90')
51
+ .option('--scope <scope>', 'Optional capability scope (least-privilege key)')
52
+ .option('--org <orgId>', 'Bind the key to a specific organization (switches active org)')
53
+ .option('--no-browser', 'Never open a browser — print the verification URL instead')
48
54
  .option('--url <url>', 'Platform base URL', process.env.PLATFORM_BASE_URL || 'https://localhost:8443'))
49
55
  .option('--quiet', 'Only print the export statement (useful for eval)')
50
56
  .action(async (options) => {
51
- // SECURITY: this POSTs a plaintext password (login + step-up). Never send it
52
- // over an unverified TLS connection in production — a MITM would harvest it.
53
- // Mirrors the guard in `login`. Non-production still honors --no-verify-ssl.
57
+ // SECURITY: the poll returns a session AND a step-up token, and the response
58
+ // below carries the raw key. None of that may cross an unverified connection
59
+ // in production. Mirrors the guard in `login`.
54
60
  assertCredentialTlsAllowed(options.verifySsl);
55
- // Credentials from flags OR PLATFORM_IDENTIFIER/PLATFORM_PASSWORD env (so the
56
- // password need not appear in shell history / `ps`).
57
- const { identifier, password } = resolveCredentials(options);
58
61
  const quiet = options.quiet ?? false;
59
- const executionId = printCommandHeader('Create Personal Access Token', 'Create Personal Access Token', { quiet });
62
+ const executionId = printCommandHeader('Create Access Key', 'Create Access Key', { quiet });
60
63
  try {
61
64
  // Validate name.
62
65
  const name = typeof options.name === 'string' ? options.name.trim() : '';
63
66
  if (!name) {
64
- printError('Token name is required (--name)');
67
+ printError('Key name is required (--name)');
65
68
  process.exit(ERROR_CODES.VALIDATION);
66
69
  }
67
70
  if (name.length > 100) {
68
- printError('Token name must be 100 characters or fewer');
71
+ printError('Key name must be 100 characters or fewer');
69
72
  process.exit(ERROR_CODES.VALIDATION);
70
73
  }
71
74
  // Validate expiry → seconds.
@@ -75,68 +78,55 @@ export function createPat(program) {
75
78
  process.exit(ERROR_CODES.VALIDATION);
76
79
  }
77
80
  const expiresIn = days * 86400;
78
- // Credentials required — step-up needs a password, so --refresh can't work here.
79
- if (!identifier || !password) {
80
- printError('create-pat requires --identifier and --password (or PLATFORM_IDENTIFIER/PLATFORM_PASSWORD env)');
81
- process.exit(ERROR_CODES.AUTHENTICATION);
82
- }
83
- if (options.password) {
84
- printWarning('Passing --password on the command line can expose it via shell history; prefer the PLATFORM_PASSWORD env var.');
85
- }
86
- // Rate limiting — prevent brute force (keyed to identifier + url, like login).
87
- const rateLimitMsg = checkAuthRateLimit(identifier, options.url);
88
- if (rateLimitMsg) {
89
- printError(rateLimitMsg);
90
- process.exit(ERROR_CODES.AUTHENTICATION);
91
- }
92
- if (!quiet) {
93
- printInfo('Authenticating', { identifier, url: options.url, verifySsl: options.verifySsl });
94
- }
95
81
  const httpsAgent = credentialHttpsAgent(options.verifySsl);
96
82
  const timeout = TIMEOUTS.HTTP_REQUEST;
97
- // 1) Login → session access token.
98
- let accessToken;
99
- try {
100
- accessToken = await postLogin({ url: options.url, identifier, password, httpsAgent, timeout });
101
- }
102
- catch (error) {
103
- recordAuthFailure(identifier, options.url);
104
- throw error;
105
- }
106
- if (!accessToken) {
107
- recordAuthFailure(identifier, options.url);
108
- printError('Login failed: no access token in response');
83
+ const transport = { url: options.url, httpsAgent, timeout };
84
+ // 1) Device sign-in, asking for the step-up the create call needs.
85
+ if (!quiet)
86
+ printInfo('Starting browser sign-in', { url: options.url, verifySsl: options.verifySsl });
87
+ const code = await requestDeviceCode(transport, { stepUp: true });
88
+ const approvalUrl = code.verification_uri_complete || code.verification_uri;
89
+ const opened = options.browser !== false && openInBrowser(approvalUrl);
90
+ // The prompt goes to STDERR under `--quiet`: stdout is captured by
91
+ // `eval $(…)`, so printing the code there would swallow the one thing
92
+ // the user has to read before anything can proceed.
93
+ const say = quiet ? console.error : console.log;
94
+ say('');
95
+ say(` Your code: ${bold(cyan(code.user_code))}`);
96
+ say(` Approve at: ${green(approvalUrl)}`);
97
+ say('');
98
+ say(dim(opened
99
+ ? ' Opening your browser… approve the code there, then come back.'
100
+ : ' Open that URL in a browser, check the code matches, and approve.'));
101
+ if (!quiet)
102
+ printInfo('Waiting for approval…');
103
+ const session = await pollForDeviceToken(transport, code);
104
+ let accessToken = session.access_token;
105
+ const stepUpToken = session.step_up_token;
106
+ if (!stepUpToken) {
107
+ printError('The approval did not return a step-up confirmation — approve the code promptly and try again.');
109
108
  process.exit(ERROR_CODES.AUTHENTICATION);
110
109
  }
111
- recordAuthSuccess(identifier, options.url);
112
- // 2) Optionally bind to a specific org (persists as the active org, which the
113
- // PAT inherits).
110
+ // 2) Optionally bind to a specific org (persists as the active org, which
111
+ // the key inherits). Rotates the session, but the step-up token is
112
+ // bound to the user, not the session, so it survives the switch.
114
113
  if (options.org) {
115
114
  if (!quiet)
116
115
  printInfo('Switching to organization', { orgId: options.org });
117
- accessToken = await switchOrganization({
116
+ accessToken = (await switchOrganization({
118
117
  url: options.url,
119
118
  orgId: options.org,
120
119
  accessToken,
121
120
  httpsAgent,
122
121
  timeout,
123
122
  quiet,
124
- });
125
- }
126
- // 3) Step-up — re-verify the password to unlock the gated create call.
127
- // The returned token is short-lived (~60s), so we use it immediately.
128
- const stepUpUrl = `${options.url}/api/auth/step-up`;
129
- printDebug('POST', { url: stepUpUrl });
130
- const stepUpRes = await axios.post(stepUpUrl, { password }, { headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${accessToken}` }, httpsAgent, timeout });
131
- const stepUpToken = stepUpRes.data?.data?.stepUpToken;
132
- if (!stepUpToken) {
133
- printError('Step-up verification failed: no step-up token in response');
134
- process.exit(ERROR_CODES.AUTHENTICATION);
123
+ })).accessToken;
135
124
  }
136
- // 4) Create the PAT.
137
- const patUrl = `${options.url}/api/user/pats`;
138
- printDebug('POST', { url: patUrl });
139
- const patRes = await axios.post(patUrl, { name, expiresIn, ...(options.scope ? { scope: options.scope } : {}) }, {
125
+ // 3) Create the access key. The step-up token is short-lived (~60s) and
126
+ // single-use, so it is spent immediately.
127
+ const keyUrl = `${options.url}/api/user/keys`;
128
+ printDebug('POST', { url: keyUrl });
129
+ const keyRes = await axios.post(keyUrl, { name, expiresIn, ...(options.scope ? { scope: options.scope } : {}) }, {
140
130
  headers: {
141
131
  'Content-Type': 'application/json',
142
132
  'Authorization': `Bearer ${accessToken}`,
@@ -145,39 +135,44 @@ export function createPat(program) {
145
135
  httpsAgent,
146
136
  timeout,
147
137
  });
148
- const token = patRes.data?.data?.token;
149
- const pat = patRes.data?.data?.pat;
150
- if (!token) {
151
- printError('Create token failed: no token in response');
138
+ const key = keyRes.data?.data?.key;
139
+ const meta = keyRes.data?.data?.accessKey;
140
+ if (!key) {
141
+ printError('Create key failed: no key in response');
152
142
  process.exit(ERROR_CODES.API_REQUEST);
153
143
  }
154
- // Quiet mode: emit only the export line (the PAT is a valid Bearer token).
144
+ // Quiet mode: emit only the export line (the key is a valid Bearer credential).
155
145
  if (quiet) {
156
- console.log(`export PLATFORM_TOKEN=${token}`);
146
+ console.log(`export PLATFORM_TOKEN=${key}`);
157
147
  return;
158
148
  }
159
149
  console.log('');
160
- printSuccess('Personal access token created');
150
+ printSuccess('Access key created');
161
151
  console.log('');
162
152
  printKeyValue({
163
- 'Name': pat?.name ?? name,
164
- 'Token ID (jti)': pat?.jti ?? '(unknown)',
165
- 'Expires': pat?.expiresAt ?? `${days} day(s)`,
166
- ...(pat?.scope ? { Scope: pat.scope } : {}),
153
+ 'Name': meta?.name ?? name,
154
+ 'Key ID': meta?.id ?? '(unknown)',
155
+ 'Key': meta?.display ?? '(unknown)',
156
+ 'Expires': meta?.expiresAt ?? `${days} day(s)`,
157
+ ...(meta?.scope ? { Scope: meta.scope } : {}),
167
158
  });
168
159
  console.log('');
169
- console.log(yellow(bold('Copy your token now — it will not be shown again:')));
170
- console.log(green(token));
160
+ console.log(yellow(bold('Copy your key now — only its hash is stored, so it will not be shown again:')));
161
+ console.log(green(key));
171
162
  console.log('');
172
163
  printInfo('Tip: use it as PLATFORM_TOKEN for subsequent commands:');
173
164
  console.log(green(' export PLATFORM_TOKEN=<token>'));
174
- console.log(green(` # or: eval $(pipeline-manager auth pat --name ${name} -u ${identifier} --quiet)`));
165
+ console.log(green(` # or: eval $(pipeline-manager auth pat --name ${name} --quiet)`));
175
166
  }
176
167
  catch (error) {
168
+ if (error instanceof DeviceAuthError) {
169
+ printError(`Create key failed: ${error.message}`, { reason: error.code });
170
+ process.exit(ERROR_CODES.AUTHENTICATION);
171
+ }
177
172
  if (axios.isAxiosError(error)) {
178
173
  const status = error.response?.status;
179
174
  const message = error.response?.data?.message;
180
- printError('Create token failed', {
175
+ printError('Create key failed', {
181
176
  status: status ?? 'no response',
182
177
  ...(message ? { message } : {}),
183
178
  });
@@ -186,9 +181,9 @@ export function createPat(program) {
186
181
  handleError(error, ERROR_CODES.API_REQUEST, {
187
182
  debug: program.opts().debug,
188
183
  exit: true,
189
- context: { command: 'create-pat', executionId, identifier: options.identifier, url: options.url },
184
+ context: { command: 'create-pat', executionId, url: options.url },
190
185
  });
191
186
  }
192
187
  });
193
188
  }
194
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXBhdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9jcmVhdGUtcGF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEMsT0FBTyxJQUFJLE1BQU0sWUFBWSxDQUFDO0FBQzlCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0ksT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDeEgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFcEcsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBaUJyQyxNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQztBQUU3Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLE9BQWdCO0lBQ3hDLGNBQWMsQ0FBQyxPQUFPO1NBQ25CLE9BQU8sQ0FBQyxLQUFLLENBQUM7U0FDZCxXQUFXLENBQUMsNkVBQTZFLENBQUM7U0FDMUYsY0FBYyxD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LENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztpQkFDaEMsQ0FBQyxDQUFDO2dCQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzNDLENBQUM7WUFDRCxXQUFXLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxXQUFXLEVBQUU7Z0JBQzFDLEtBQUssRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSztnQkFDM0IsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUU7YUFDbEcsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgcGljbyBmcm9tICdwaWNvY29sb3JzJztcbmltcG9ydCB7IFRJTUVPVVRTIH0gZnJvbSAnLi4vY29uZmlnL2NsaS5jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgYXNzZXJ0Q3JlZGVudGlhbFRsc0FsbG93ZWQsIGNyZWRlbnRpYWxIdHRwc0FnZW50LCBwb3N0TG9naW4sIHJlc29sdmVDcmVkZW50aWFscywgc3dpdGNoT3JnYW5pemF0aW9uIH0gZnJvbSAnLi4vdXRpbHMvYXV0aC11dGlscy5qcyc7XG5pbXBvcnQgeyBwcmludENvbW1hbmRIZWFkZXIsIHdpdGhTc2xPcHRpb25zIH0gZnJvbSAnLi4vdXRpbHMvY29tbWFuZC11dGlscy5qcyc7XG5pbXBvcnQgeyBFUlJPUl9DT0RFUywgaGFuZGxlRXJyb3IgfSBmcm9tICcuLi91dGlscy9lcnJvci1oYW5kbGVyLmpzJztcbmltcG9ydCB7IHByaW50RGVidWcsIHByaW50RXJyb3IsIHByaW50SW5mbywgcHJpbnRLZXlWYWx1ZSwgcHJpbnRTdWNjZXNzLCBwcmludFdhcm5pbmcgfSBmcm9tICcuLi91dGlscy9vdXRwdXQtdXRpbHMuanMnO1xuaW1wb3J0IHsgY2hlY2tBdXRoUmF0ZUxpbWl0LCByZWNvcmRBdXRoRmFpbHVyZSwgcmVjb3JkQXV0aFN1Y2Nlc3MgfSBmcm9tICcuLi91dGlscy9yYXRlLWxpbWl0ZXIuanMnO1xuXG5jb25zdCB7IGJvbGQsIGdyZWVuLCB5ZWxsb3cgfSA9IHBpY287XG5cbi8qKiBTdGVwLXVwIHJlc3BvbnNlIOKAlCBhIHNob3J0LWxpdmVkICg2MHMpIEpXVCBib3VuZCB0byB0aGUgdXNlcidzIHN1Yi4gKi9cbmludGVyZmFjZSBTdGVwVXBSZXNwb25zZSB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIGRhdGE6IHsgc3RlcFVwVG9rZW46IHN0cmluZyB9O1xufVxuXG4vKiogQ3JlYXRlLVBBVCByZXNwb25zZSDigJQgdGhlIHJhdyB0b2tlbiBpcyByZXR1cm5lZCBleGFjdGx5IG9uY2UuICovXG5pbnRlcmZhY2UgQ3JlYXRlUGF0UmVzcG9uc2Uge1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBkYXRhOiB7XG4gICAgdG9rZW46IHN0cmluZztcbiAgICBwYXQ6IHsganRpOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgZXhwaXJlc0F0OiBzdHJpbmc7IHNjb3BlPzogc3RyaW5nIHwgbnVsbCB9O1xuICB9O1xufVxuXG5jb25zdCBNQVhfRVhQSVJFU19EQVlTID0gMzY1O1xuXG4vKipcbiAqIFJlZ2lzdGVycyB0aGUgYGNyZWF0ZS1wYXRgIGNvbW1hbmQgd2l0aCB0aGUgQ0xJIHByb2dyYW0uXG4gKlxuICogTWludHMgYSBuYW1lZCBQZXJzb25hbCBBY2Nlc3MgVG9rZW4g4oCUIGEgZHVyYWJsZSwgaW5kaXZpZHVhbGx5LXJldm9jYWJsZSBBUElcbiAqIGNyZWRlbnRpYWwg4oCUIGZvciBDSS9hdXRvbWF0aW9uLiBVbmxpa2UgYGxvZ2luYCAod2hpY2ggcmV0dXJucyBhIHNob3J0LWxpdmVkXG4gKiBzZXNzaW9uIHRva2VuKSwgYSBQQVQgaXMgdGhlIHJpZ2h0IGxvbmctbGl2ZWQgY3JlZGVudGlhbCBmb3Igc2NyaXB0cy5cbiAqXG4gKiBUaGUgcGxhdGZvcm0gZ2F0ZXMgUEFUIGNyZWF0aW9uIGJlaGluZCBzdGVwLXVwIHJlLWF1dGhlbnRpY2F0aW9uLCBzbyB0aGlzXG4gKiBjb21tYW5kIGNoYWlucyB0aHJlZSBjYWxsczogbG9naW4gKOKGkiBhY2Nlc3MgdG9rZW4pLCBzdGVwLXVwIHdpdGggdGhlIHNhbWVcbiAqIHBhc3N3b3JkICjihpIgc3RlcC11cCB0b2tlbiksIHRoZW4gUE9TVCAvdXNlci9wYXRzLiBUaGUgUEFUIGJpbmRzIHRvIHRoZSB1c2VyJ3NcbiAqIGFjdGl2ZSBvcmc7IHBhc3MgYC0tb3JnYCB0byBzd2l0Y2ggZmlyc3QgKHBlcnNpc3RzIGFzIHRoZSBhY3RpdmUgb3JnKS5cbiAqXG4gKiBUaGUgcmF3IHRva2VuIGlzIHByaW50ZWQgT05DRS4gYC0tcXVpZXRgIHByaW50cyBvbmx5IGBleHBvcnQgUExBVEZPUk1fVE9LRU494oCmYFxuICogc28gaXQgY2FuIGJlIGBldmFsYCdkIOKAlCB0aGUgUEFUIGlzIGl0c2VsZiBhIHZhbGlkIEJlYXJlciBjcmVkZW50aWFsLlxuICpcbiAqIEBwYXJhbSBwcm9ncmFtIC0gVGhlIHJvb3QgQ29tbWFuZGVyIHByb2dyYW0gaW5zdGFuY2UgdG8gYXR0YWNoIHRoZSBjb21tYW5kIHRvLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBiYXNoXG4gKiBQTEFURk9STV9QQVNTV09SRD1zZWNyZXQgcGlwZWxpbmUtbWFuYWdlciBhdXRoIHBhdCAtLW5hbWUgY2ktZGVwbG95IC11IGNpQGV4YW1wbGUuY29tXG4gKiBwaXBlbGluZS1tYW5hZ2VyIGF1dGggcGF0IC0tbmFtZSBjaSAtLWV4cGlyZXMtZGF5cyAzMCAtdSBjaUBleGFtcGxlLmNvbSAtcCBzZWNyZXRcbiAqIGV2YWwgJChQTEFURk9STV9QQVNTV09SRD1zZWNyZXQgcGlwZWxpbmUtbWFuYWdlciBhdXRoIHBhdCAtLW5hbWUgY2kgLXUgY2lAZXhhbXBsZS5jb20gLS1xdWlldClcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGF0KHByb2dyYW06IENvbW1hbmQpOiB2b2lkIHtcbiAgd2l0aFNzbE9wdGlvbnMocHJvZ3JhbVxuICAgIC5jb21tYW5kKCdwYXQnKVxuICAgIC5kZXNjcmlwdGlvbignQ3JlYXRlIGEgbmFtZWQgUGVyc29uYWwgQWNjZXNzIFRva2VuIChsb25nLWxpdmVkIENMSS9hdXRvbWF0aW9uIGNyZWRlbnRpYWwpJylcbiAgICAucmVxdWlyZWRPcHRpb24oJy0tbmFtZSA8bmFtZT4nLCAnSHVtYW4tcmVhZGFibGUgdG9rZW4gbmFtZSAoZS5nLiBjaS1kZXBsb3kpJylcbiAgICAub3B0aW9uKCctLWV4cGlyZXMtZGF5cyA8ZGF5cz4nLCBgVG9rZW4gbGlmZXRpbWUgaW4gZGF5cyAoMS0ke01BWF9FWFBJUkVTX0RBWVN9KWAsICc5MCcpXG4gICAgLm9wdGlvbignLS1zY29wZSA8c2NvcGU+JywgJ09wdGlvbmFsIHRva2VuIHNjb3BlJylcbiAgICAub3B0aW9uKCctdSwgLS1pZGVudGlmaWVyIDxpZGVudGlmaWVyPicsICdVc2VybmFtZSBvciBlbWFpbCcpXG4gICAgLm9wdGlvbignLXAsIC0tcGFzc3dvcmQgPHBhc3N3b3JkPicsICdQYXNzd29yZCAocHJlZmVyIFBMQVRGT1JNX1BBU1NXT1JEIGVudiknKVxuICAgIC5vcHRpb24oJy0tb3JnIDxvcmdJZD4nLCAnQmluZCB0aGUgdG9rZW4gdG8gYSBzcGVjaWZpYyBvcmdhbml6YXRpb24gKHN3aXRjaGVzIGFjdGl2ZSBvcmcpJylcbiAgICAub3B0aW9uKCctLXVybCA8dXJsPicsICdQbGF0Zm9ybSBiYXNlIFVSTCcsIHByb2Nlc3MuZW52LlBMQVRGT1JNX0JBU0VfVVJMIHx8ICdodHRwczovL2xvY2FsaG9zdDo4NDQzJykpXG4gICAgLm9wdGlvbignLS1xdWlldCcsICdPbmx5IHByaW50IHRoZSBleHBvcnQgc3RhdGVtZW50ICh1c2VmdWwgZm9yIGV2YWwpJylcbiAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICAvLyBTRUNVUklUWTogdGhpcyBQT1NUcyBhIHBsYWludGV4dCBwYXNzd29yZCAobG9naW4gKyBzdGVwLXVwKS4gTmV2ZXIgc2VuZCBpdFxuICAgICAgLy8gb3ZlciBhbiB1bnZlcmlmaWVkIFRMUyBjb25uZWN0aW9uIGluIHByb2R1Y3Rpb24g4oCUIGEgTUlUTSB3b3VsZCBoYXJ2ZXN0IGl0LlxuICAgICAgLy8gTWlycm9ycyB0aGUgZ3VhcmQgaW4gYGxvZ2luYC4gTm9uLXByb2R1Y3Rpb24gc3RpbGwgaG9ub3JzIC0tbm8tdmVyaWZ5LXNzbC5cbiAgICAgIGFzc2VydENyZWRlbnRpYWxUbHNBbGxvd2VkKG9wdGlvbnMudmVyaWZ5U3NsKTtcblxuICAgICAgLy8gQ3JlZGVudGlhbHMgZnJvbSBmbGFncyBPUiBQTEFURk9STV9JREVOVElGSUVSL1BMQVRGT1JNX1BBU1NXT1JEIGVudiAoc28gdGhlXG4gICAgICAvLyBwYXNzd29yZCBuZWVkIG5vdCBhcHBlYXIgaW4gc2hlbGwgaGlzdG9yeSAvIGBwc2ApLlxuICAgICAgY29uc3QgeyBpZGVudGlmaWVyLCBwYXNzd29yZCB9ID0gcmVzb2x2ZUNyZWRlbnRpYWxzKG9wdGlvbnMpO1xuICAgICAgY29uc3QgcXVpZXQgPSBvcHRpb25zLnF1aWV0ID8/IGZhbHNlO1xuICAgICAgY29uc3QgZXhlY3V0aW9uSWQgPSBwcmludENvbW1hbmRIZWFkZXIoXG4gICAgICAgICdDcmVhdGUgUGVyc29uYWwgQWNjZXNzIFRva2VuJyxcbiAgICAgICAgJ0NyZWF0ZSBQZXJzb25hbCBBY2Nlc3MgVG9rZW4nLFxuICAgICAgICB7IHF1aWV0IH0sXG4gICAgICApO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBWYWxpZGF0ZSBuYW1lLlxuICAgICAgICBjb25zdCBuYW1lID0gdHlwZW9mIG9wdGlvbnMubmFtZSA9PT0gJ3N0cmluZycgPyBvcHRpb25zLm5hbWUudHJpbSgpIDogJyc7XG4gICAgICAgIGlmICghbmFtZSkge1xuICAgICAgICAgIHByaW50RXJyb3IoJ1Rva2VuIG5hbWUgaXMgcmVxdWlyZWQgKC0tbmFtZSknKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXQoRVJST1JfQ09ERVMuVkFMSURBVElPTik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUubGVuZ3RoID4gMTAwKSB7XG4gICAgICAgICAgcHJpbnRFcnJvcignVG9rZW4gbmFtZSBtdXN0IGJlIDEwMCBjaGFyYWN0ZXJzIG9yIGZld2VyJyk7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0KEVSUk9SX0NPREVTLlZBTElEQVRJT04pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZXhwaXJ5IOKGkiBzZWNvbmRzLlxuICAgICAgICBjb25zdCBkYXlzID0gTWF0aC5mbG9vcihOdW1iZXIob3B0aW9ucy5leHBpcmVzRGF5cykpO1xuICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShkYXlzKSB8fCBkYXlzIDwgMSB8fCBkYXlzID4gTUFYX0VYUElSRVNfREFZUykge1xuICAgICAgICAgIHByaW50RXJyb3IoYC0tZXhwaXJlcy1kYXlzIG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kICR7TUFYX0VYUElSRVNfREFZU31gKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXQoRVJST1JfQ09ERVMuVkFMSURBVElPTik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXhwaXJlc0luID0gZGF5cyAqIDg2NDAwO1xuXG4gICAgICAgIC8vIENyZWRlbnRpYWxzIHJlcXVpcmVkIOKAlCBzdGVwLXVwIG5lZWRzIGEgcGFzc3dvcmQsIHNvIC0tcmVmcmVzaCBjYW4ndCB3b3JrIGhlcmUuXG4gICAgICAgIGlmICghaWRlbnRpZmllciB8fCAhcGFzc3dvcmQpIHtcbiAgICAgICAgICBwcmludEVycm9yKCdjcmVhdGUtcGF0IHJlcXVpcmVzIC0taWRlbnRpZmllciBhbmQgLS1wYXNzd29yZCAob3IgUExBVEZPUk1fSURFTlRJRklFUi9QTEFURk9STV9QQVNTV09SRCBlbnYpJyk7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0KEVSUk9SX0NPREVTLkFVVEhFTlRJQ0FUSU9OKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5wYXNzd29yZCkge1xuICAgICAgICAgIHByaW50V2FybmluZygnUGFzc2luZyAtLXBhc3N3b3JkIG9uIHRoZSBjb21tYW5kIGxpbmUgY2FuIGV4cG9zZSBpdCB2aWEgc2hlbGwgaGlzdG9yeTsgcHJlZmVyIHRoZSBQTEFURk9STV9QQVNTV09SRCBlbnYgdmFyLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmF0ZSBsaW1pdGluZyDigJQgcHJldmVudCBicnV0ZSBmb3JjZSAoa2V5ZWQgdG8gaWRlbnRpZmllciArIHVybCwgbGlrZSBsb2dpbikuXG4gICAgICAgIGNvbnN0IHJhdGVMaW1pdE1zZyA9IGNoZWNrQXV0aFJhdGVMaW1pdChpZGVudGlmaWVyLCBvcHRpb25zLnVybCk7XG4gICAgICAgIGlmIChyYXRlTGltaXRNc2cpIHtcbiAgICAgICAgICBwcmludEVycm9yKHJhdGVMaW1pdE1zZyk7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0KEVSUk9SX0NPREVTLkFVVEhFTlRJQ0FUSU9OKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcXVpZXQpIHtcbiAgICAgICAgICBwcmludEluZm8oJ0F1dGhlbnRpY2F0aW5nJywgeyBpZGVudGlmaWVyLCB1cmw6IG9wdGlvbnMudXJsLCB2ZXJpZnlTc2w6IG9wdGlvbnMudmVyaWZ5U3NsIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaHR0cHNBZ2VudCA9IGNyZWRlbnRpYWxIdHRwc0FnZW50KG9wdGlvbnMudmVyaWZ5U3NsKTtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IFRJTUVPVVRTLkhUVFBfUkVRVUVTVDtcblxuICAgICAgICAvLyAxKSBMb2dpbiDihpIgc2Vzc2lvbiBhY2Nlc3MgdG9rZW4uXG4gICAgICAgIGxldCBhY2Nlc3NUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGFjY2Vzc1Rva2VuID0gYXdhaXQgcG9zdExvZ2luKHsgdXJsOiBvcHRpb25zLnVybCwgaWRlbnRpZmllciwgcGFzc3dvcmQsIGh0dHBzQWdlbnQsIHRpbWVvdXQgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgcmVjb3JkQXV0aEZhaWx1cmUoaWRlbnRpZmllciwgb3B0aW9ucy51cmwpO1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICByZWNvcmRBdXRoRmFpbHVyZShpZGVudGlmaWVyLCBvcHRpb25zLnVybCk7XG4gICAgICAgICAgcHJpbnRFcnJvcignTG9naW4gZmFpbGVkOiBubyBhY2Nlc3MgdG9rZW4gaW4gcmVzcG9uc2UnKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXQoRVJST1JfQ09ERVMuQVVUSEVOVElDQVRJT04pO1xuICAgICAgICB9XG4gICAgICAgIHJlY29yZEF1dGhTdWNjZXNzKGlkZW50aWZpZXIsIG9wdGlvbnMudXJsKTtcblxuICAgICAgICAvLyAyKSBPcHRpb25hbGx5IGJpbmQgdG8gYSBzcGVjaWZpYyBvcmcgKHBlcnNpc3RzIGFzIHRoZSBhY3RpdmUgb3JnLCB3aGljaCB0aGVcbiAgICAgICAgLy8gICAgUEFUIGluaGVyaXRzKS5cbiAgICAgICAgaWYgKG9wdGlvbnMub3JnKSB7XG4gICAgICAgICAgaWYgKCFxdWlldCkgcHJpbnRJbmZvKCdTd2l0Y2hpbmcgdG8gb3JnYW5pemF0aW9uJywgeyBvcmdJZDogb3B0aW9ucy5vcmcgfSk7XG4gICAgICAgICAgYWNjZXNzVG9rZW4gPSBhd2FpdCBzd2l0Y2hPcmdhbml6YXRpb24oe1xuICAgICAgICAgICAgdXJsOiBvcHRpb25zLnVybCxcbiAgICAgICAgICAgIG9yZ0lkOiBvcHRpb25zLm9yZyxcbiAgICAgICAgICAgIGFjY2Vzc1Rva2VuLFxuICAgICAgICAgICAgaHR0cHNBZ2VudCxcbiAgICAgICAgICAgIHRpbWVvdXQsXG4gICAgICAgICAgICBxdWlldCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDMpIFN0ZXAtdXAg4oCUIHJlLXZlcmlmeSB0aGUgcGFzc3dvcmQgdG8gdW5sb2NrIHRoZSBnYXRlZCBjcmVhdGUgY2FsbC5cbiAgICAgICAgLy8gICAgVGhlIHJldHVybmVkIHRva2VuIGlzIHNob3J0LWxpdmVkICh+NjBzKSwgc28gd2UgdXNlIGl0IGltbWVkaWF0ZWx5LlxuICAgICAgICBjb25zdCBzdGVwVXBVcmwgPSBgJHtvcHRpb25zLnVybH0vYXBpL2F1dGgvc3RlcC11cGA7XG4gICAgICAgIHByaW50RGVidWcoJ1BPU1QnLCB7IHVybDogc3RlcFVwVXJsIH0pO1xuICAgICAgICBjb25zdCBzdGVwVXBSZXMgPSBhd2FpdCBheGlvcy5wb3N0PFN0ZXBVcFJlc3BvbnNlPihcbiAgICAgICAgICBzdGVwVXBVcmwsXG4gICAgICAgICAgeyBwYXNzd29yZCB9LFxuICAgICAgICAgIHsgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHthY2Nlc3NUb2tlbn1gIH0sIGh0dHBzQWdlbnQsIHRpbWVvdXQgfSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgc3RlcFVwVG9rZW4gPSBzdGVwVXBSZXMuZGF0YT8uZGF0YT8uc3RlcFVwVG9rZW47XG4gICAgICAgIGlmICghc3RlcFVwVG9rZW4pIHtcbiAgICAgICAgICBwcmludEVycm9yKCdTdGVwLXVwIHZlcmlmaWNhdGlvbiBmYWlsZWQ6IG5vIHN0ZXAtdXAgdG9rZW4gaW4gcmVzcG9uc2UnKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXQoRVJST1JfQ09ERVMuQVVUSEVOVElDQVRJT04pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gNCkgQ3JlYXRlIHRoZSBQQVQuXG4gICAgICAgIGNvbnN0IHBhdFVybCA9IGAke29wdGlvbnMudXJsfS9hcGkvdXNlci9wYXRzYDtcbiAgICAgICAgcHJpbnREZWJ1ZygnUE9TVCcsIHsgdXJsOiBwYXRVcmwgfSk7XG4gICAgICAgIGNvbnN0IHBhdFJlcyA9IGF3YWl0IGF4aW9zLnBvc3Q8Q3JlYXRlUGF0UmVzcG9uc2U+KFxuICAgICAgICAgIHBhdFVybCxcbiAgICAgICAgICB7IG5hbWUsIGV4cGlyZXNJbiwgLi4uKG9wdGlvbnMuc2NvcGUgPyB7IHNjb3BlOiBvcHRpb25zLnNjb3BlIH0gOiB7fSkgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke2FjY2Vzc1Rva2VufWAsXG4gICAgICAgICAgICAgICdYLVN0ZXAtVXAtVG9rZW4nOiBzdGVwVXBUb2tlbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBodHRwc0FnZW50LFxuICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHRva2VuID0gcGF0UmVzLmRhdGE/LmRhdGE/LnRva2VuO1xuICAgICAgICBjb25zdCBwYXQgPSBwYXRSZXMuZGF0YT8uZGF0YT8ucGF0O1xuICAgICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgICAgcHJpbnRFcnJvcignQ3JlYXRlIHRva2VuIGZhaWxlZDogbm8gdG9rZW4gaW4gcmVzcG9uc2UnKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXQoRVJST1JfQ09ERVMuQVBJX1JFUVVFU1QpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUXVpZXQgbW9kZTogZW1pdCBvbmx5IHRoZSBleHBvcnQgbGluZSAodGhlIFBBVCBpcyBhIHZhbGlkIEJlYXJlciB0b2tlbikuXG4gICAgICAgIGlmIChxdWlldCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBleHBvcnQgUExBVEZPUk1fVE9LRU49JHt0b2tlbn1gKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgIHByaW50U3VjY2VzcygnUGVyc29uYWwgYWNjZXNzIHRva2VuIGNyZWF0ZWQnKTtcbiAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICBwcmludEtleVZhbHVlKHtcbiAgICAgICAgICAnTmFtZSc6IHBhdD8ubmFtZSA/PyBuYW1lLFxuICAgICAgICAgICdUb2tlbiBJRCAoanRpKSc6IHBhdD8uanRpID8/ICcodW5rbm93biknLFxuICAgICAgICAgICdFeHBpcmVzJzogcGF0Py5leHBpcmVzQXQgPz8gYCR7ZGF5c30gZGF5KHMpYCxcbiAgICAgICAgICAuLi4ocGF0Py5zY29wZSA/IHsgU2NvcGU6IHBhdC5zY29wZSB9IDoge30pLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICBjb25zb2xlLmxvZyh5ZWxsb3coYm9sZCgnQ29weSB5b3VyIHRva2VuIG5vdyDigJQgaXQgd2lsbCBub3QgYmUgc2hvd24gYWdhaW46JykpKTtcbiAgICAgICAgY29uc29sZS5sb2coZ3JlZW4odG9rZW4pKTtcbiAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICBwcmludEluZm8oJ1RpcDogdXNlIGl0IGFzIFBMQVRGT1JNX1RPS0VOIGZvciBzdWJzZXF1ZW50IGNvbW1hbmRzOicpO1xuICAgICAgICBjb25zb2xlLmxvZyhncmVlbignICBleHBvcnQgUExBVEZPUk1fVE9LRU49PHRva2VuPicpKTtcbiAgICAgICAgY29uc29sZS5sb2coZ3JlZW4oYCAgIyBvcjogIGV2YWwgJChwaXBlbGluZS1tYW5hZ2VyIGF1dGggcGF0IC0tbmFtZSAke25hbWV9IC11ICR7aWRlbnRpZmllcn0gLS1xdWlldClgKSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoYXhpb3MuaXNBeGlvc0Vycm9yKGVycm9yKSkge1xuICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IGVycm9yLnJlc3BvbnNlPy5zdGF0dXM7XG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9IChlcnJvci5yZXNwb25zZT8uZGF0YSBhcyB7IG1lc3NhZ2U/OiBzdHJpbmcgfSk/Lm1lc3NhZ2U7XG4gICAgICAgICAgcHJpbnRFcnJvcignQ3JlYXRlIHRva2VuIGZhaWxlZCcsIHtcbiAgICAgICAgICAgIHN0YXR1czogc3RhdHVzID8/ICdubyByZXNwb25zZScsXG4gICAgICAgICAgICAuLi4obWVzc2FnZSA/IHsgbWVzc2FnZSB9IDoge30pLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHByb2Nlc3MuZXhpdChFUlJPUl9DT0RFUy5BVVRIRU5USUNBVElPTik7XG4gICAgICAgIH1cbiAgICAgICAgaGFuZGxlRXJyb3IoZXJyb3IsIEVSUk9SX0NPREVTLkFQSV9SRVFVRVNULCB7XG4gICAgICAgICAgZGVidWc6IHByb2dyYW0ub3B0cygpLmRlYnVnLFxuICAgICAgICAgIGV4aXQ6IHRydWUsXG4gICAgICAgICAgY29udGV4dDogeyBjb21tYW5kOiAnY3JlYXRlLXBhdCcsIGV4ZWN1dGlvbklkLCBpZGVudGlmaWVyOiBvcHRpb25zLmlkZW50aWZpZXIsIHVybDogb3B0aW9ucy51cmwgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG59XG4iXX0=
189
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXBhdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9jcmVhdGUtcGF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEMsT0FBTyxJQUFJLE1BQU0sWUFBWSxDQUFDO0FBQzlCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsb0JBQW9CLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDL0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoSCxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFMUcsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFZaEQsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7QUFFN0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThCRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsT0FBZ0I7SUFDeEMsY0FBYyxDQUFDLE9BQU87U0FDbkIsT0FBTyxDQUFDLEtBQUssQ0FBQztTQUNkLFdBQVcsQ0FBQywwRUFBMEUsQ0FBQztTQUN2RixjQUFj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RSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRTthQUNsRSxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCBwaWNvIGZyb20gJ3BpY29jb2xvcnMnO1xuaW1wb3J0IHsgVElNRU9VVFMgfSBmcm9tICcuLi9jb25maWcvY2xpLmNvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBhc3NlcnRDcmVkZW50aWFsVGxzQWxsb3dlZCwgY3JlZGVudGlhbEh0dHBzQWdlbnQsIHN3aXRjaE9yZ2FuaXphdGlvbiB9IGZyb20gJy4uL3V0aWxzL2F1dGgtdXRpbHMuanMnO1xuaW1wb3J0IHsgcHJpbnRDb21tYW5kSGVhZGVyLCB3aXRoU3NsT3B0aW9ucyB9IGZyb20gJy4uL3V0aWxzL2NvbW1hbmQtdXRpbHMuanMnO1xuaW1wb3J0IHsgRGV2aWNlQXV0aEVycm9yLCBvcGVuSW5Ccm93c2VyLCBwb2xsRm9yRGV2aWNlVG9rZW4sIHJlcXVlc3REZXZpY2VDb2RlIH0gZnJvbSAnLi4vdXRpbHMvZGV2aWNlLWF1dGguanMnO1xuaW1wb3J0IHsgRVJST1JfQ09ERVMsIGhhbmRsZUVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZXJyb3ItaGFuZGxlci5qcyc7XG5pbXBvcnQgeyBwcmludERlYnVnLCBwcmludEVycm9yLCBwcmludEluZm8sIHByaW50S2V5VmFsdWUsIHByaW50U3VjY2VzcyB9IGZyb20gJy4uL3V0aWxzL291dHB1dC11dGlscy5qcyc7XG5cbmNvbnN0IHsgYm9sZCwgY3lhbiwgZGltLCBncmVlbiwgeWVsbG93IH0gPSBwaWNvO1xuXG4vKiogQ3JlYXRlLWtleSByZXNwb25zZSDigJQgdGhlIHJhdyBrZXkgaXMgcmV0dXJuZWQgZXhhY3RseSBvbmNlLiAqL1xuaW50ZXJmYWNlIENyZWF0ZUFjY2Vzc0tleVJlc3BvbnNlIHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgZGF0YToge1xuICAgIC8qKiBUaGUgb3BhcXVlIGtleSAoYHBiX3BhdF/igKZgKS4gT25seSBpdHMgaGFzaCBpcyBzdG9yZWQgc2VydmVyLXNpZGUuICovXG4gICAga2V5OiBzdHJpbmc7XG4gICAgYWNjZXNzS2V5OiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgZGlzcGxheTogc3RyaW5nOyBleHBpcmVzQXQ6IHN0cmluZzsgc2NvcGU/OiBzdHJpbmcgfCBudWxsIH07XG4gIH07XG59XG5cbmNvbnN0IE1BWF9FWFBJUkVTX0RBWVMgPSAzNjU7XG5cbi8qKlxuICogUmVnaXN0ZXJzIHRoZSBgcGF0YCBjb21tYW5kIHdpdGggdGhlIENMSSBwcm9ncmFtLlxuICpcbiAqIE1pbnRzIGEgbmFtZWQgQUNDRVNTIEtFWSAoYHBiX3BhdF/igKZgKSDigJQgYSBkdXJhYmxlLCBpbmRpdmlkdWFsbHktcmV2b2NhYmxlIEFQSVxuICogY3JlZGVudGlhbCDigJQgZm9yIENJL2F1dG9tYXRpb24uIFVubGlrZSBhIHNlc3Npb24sIGEga2V5IGlzIHRoZSByaWdodFxuICogbG9uZy1saXZlZCBjcmVkZW50aWFsIGZvciBzY3JpcHRzLlxuICpcbiAqIFRoZSBrZXkgaXMgT1BBUVVFOiBpdCBjYXJyaWVzIG5vIGNsYWltcywgYW5kIGVhY2ggc2VydmljZSB0cmFkZXMgaXQgYXRcbiAqIHBsYXRmb3JtJ3MgL2F1dGgvdG9rZW4vZXhjaGFuZ2UgZm9yIGEgNS1taW51dGUgdG9rZW4sIHNvIHJldm9raW5nIGl0IHRha2VzXG4gKiBlZmZlY3QgZXZlcnl3aGVyZSB3aXRoaW4gZml2ZSBtaW51dGVzLlxuICpcbiAqIENyZWF0aW5nIG9uZSBpcyBzdGVwLXVwIGdhdGVkIHNlcnZlci1zaWRlLCB3aGljaCB1c2VkIHRvIG1lYW4gdGhlIENMSSBoYWQgdG9cbiAqIGhvbGQgYSBwYXNzd29yZCAoaXQgUE9TVGVkIGl0IHR3aWNlIOKAlCBzaWduLWluLCB0aGVuIHN0ZXAtdXApLiBJdCBubyBsb25nZXJcbiAqIGhhcyBvbmU6IHRoZSBkZXZpY2UgZmxvdyBhc2tzIGZvciB0aGUgc3RlcC11cCBJTiBUSEUgQlJPV1NFUiwgd2hlcmUgdGhlXG4gKiBhY2NvdW50J3MgcmVhbCBmYWN0b3JzIGxpdmUsIGFuZCB0aGUgYXBwcm92ZWQgcG9sbCByZXR1cm5zIGJvdGggdGhlIHNlc3Npb25cbiAqIGFuZCBhIHNob3J0LWxpdmVkIHN0ZXAtdXAgdG9rZW4uIFRoZSBrZXkgYmluZHMgdG8gdGhlIHVzZXIncyBhY3RpdmUgb3JnOyBwYXNzXG4gKiBgLS1vcmdgIHRvIHN3aXRjaCBmaXJzdCAod2hpY2ggcGVyc2lzdHMgYXMgdGhlIGFjdGl2ZSBvcmcpLlxuICpcbiAqIFRoZSByYXcga2V5IGlzIHByaW50ZWQgT05DRSDigJQgb25seSBpdHMgaGFzaCBpcyBzdG9yZWQsIHNvIGl0IGNhbiBuZXZlciBiZSByZWFkXG4gKiBiYWNrLiBgLS1xdWlldGAgcHJpbnRzIG9ubHkgYGV4cG9ydCBQTEFURk9STV9UT0tFTj3igKZgIHNvIGl0IGNhbiBiZSBgZXZhbGAnZDtcbiAqIHRoZSBrZXkgaXMgaXRzZWxmIGEgdmFsaWQgQmVhcmVyIGNyZWRlbnRpYWwuXG4gKlxuICogQHBhcmFtIHByb2dyYW0gLSBUaGUgcm9vdCBDb21tYW5kZXIgcHJvZ3JhbSBpbnN0YW5jZSB0byBhdHRhY2ggdGhlIGNvbW1hbmQgdG8uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGJhc2hcbiAqIHBpcGVsaW5lLW1hbmFnZXIgYXV0aCBwYXQgLS1uYW1lIGNpLWRlcGxveVxuICogcGlwZWxpbmUtbWFuYWdlciBhdXRoIHBhdCAtLW5hbWUgY2kgLS1leHBpcmVzLWRheXMgMzAgLS1vcmcgPG9yZ0lkPlxuICogZXZhbCAkKHBpcGVsaW5lLW1hbmFnZXIgYXV0aCBwYXQgLS1uYW1lIGNpIC0tcXVpZXQpXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBhdChwcm9ncmFtOiBDb21tYW5kKTogdm9pZCB7XG4gIHdpdGhTc2xPcHRpb25zKHByb2dyYW1cbiAgICAuY29tbWFuZCgncGF0JylcbiAgICAuZGVzY3JpcHRpb24oJ0NyZWF0ZSBhIG5hbWVkIGFjY2VzcyBrZXkgKGxvbmctbGl2ZWQsIG9wYXF1ZSBDTEkvYXV0b21hdGlvbiBjcmVkZW50aWFsKScpXG4gICAgLnJlcXVpcmVkT3B0aW9uKCctLW5hbWUgPG5hbWU+JywgJ0h1bWFuLXJlYWRhYmxlIGtleSBuYW1lIChlLmcuIGNpLWRlcGxveSknKVxuICAgIC5vcHRpb24oJy0tZXhwaXJlcy1kYXlzIDxkYXlzPicsIGBLZXkgbGlmZXRpbWUgaW4gZGF5cyAoMS0ke01BWF9FWFBJUkVTX0RBWVN9KWAsICc5MCcpXG4gICAgLm9wdGlvbignLS1zY29wZSA8c2NvcGU+JywgJ09wdGlvbmFsIGNhcGFiaWxpdHkgc2NvcGUgKGxlYXN0LXByaXZpbGVnZSBrZXkpJylcbiAgICAub3B0aW9uKCctLW9yZyA8b3JnSWQ+JywgJ0JpbmQgdGhlIGtleSB0byBhIHNwZWNpZmljIG9yZ2FuaXphdGlvbiAoc3dpdGNoZXMgYWN0aXZlIG9yZyknKVxuICAgIC5vcHRpb24oJy0tbm8tYnJvd3NlcicsICdOZXZlciBvcGVuIGEgYnJvd3NlciDigJQgcHJpbnQgdGhlIHZlcmlmaWNhdGlvbiBVUkwgaW5zdGVhZCcpXG4gICAgLm9wdGlvbignLS11cmwgPHVybD4nLCAnUGxhdGZvcm0gYmFzZSBVUkwnLCBwcm9jZXNzLmVudi5QTEFURk9STV9CQVNFX1VSTCB8fCAnaHR0cHM6Ly9sb2NhbGhvc3Q6ODQ0MycpKVxuICAgIC5vcHRpb24oJy0tcXVpZXQnLCAnT25seSBwcmludCB0aGUgZXhwb3J0IHN0YXRlbWVudCAodXNlZnVsIGZvciBldmFsKScpXG4gICAgLmFjdGlvbihhc3luYyAob3B0aW9ucykgPT4ge1xuICAgICAgLy8gU0VDVVJJVFk6IHRoZSBwb2xsIHJldHVybnMgYSBzZXNzaW9uIEFORCBhIHN0ZXAtdXAgdG9rZW4sIGFuZCB0aGUgcmVzcG9uc2VcbiAgICAgIC8vIGJlbG93IGNhcnJpZXMgdGhlIHJhdyBrZXkuIE5vbmUgb2YgdGhhdCBtYXkgY3Jvc3MgYW4gdW52ZXJpZmllZCBjb25uZWN0aW9uXG4gICAgICAvLyBpbiBwcm9kdWN0aW9uLiBNaXJyb3JzIHRoZSBndWFyZCBpbiBgbG9naW5gLlxuICAgICAgYXNzZXJ0Q3JlZGVudGlhbFRsc0FsbG93ZWQob3B0aW9ucy52ZXJpZnlTc2wpO1xuXG4gICAgICBjb25zdCBxdWlldCA9IG9wdGlvbnMucXVpZXQgPz8gZmFsc2U7XG4gICAgICBjb25zdCBleGVjdXRpb25JZCA9IHByaW50Q29tbWFuZEhlYWRlcignQ3JlYXRlIEFjY2VzcyBLZXknLCAnQ3JlYXRlIEFjY2VzcyBLZXknLCB7IHF1aWV0IH0pO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBWYWxpZGF0ZSBuYW1lLlxuICAgICAgICBjb25zdCBuYW1lID0gdHlwZW9mIG9wdGlvbnMubmFtZSA9PT0gJ3N0cmluZycgPyBvcHRpb25zLm5hbWUudHJpbSgpIDogJyc7XG4gICAgICAgIGlmICghbmFtZSkge1xuICAgICAgICAgIHByaW50RXJyb3IoJ0tleSBuYW1lIGlzIHJlcXVpcmVkICgtLW5hbWUpJyk7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0KEVSUk9SX0NPREVTLlZBTElEQVRJT04pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lLmxlbmd0aCA+IDEwMCkge1xuICAgICAgICAgIHByaW50RXJyb3IoJ0tleSBuYW1lIG11c3QgYmUgMTAwIGNoYXJhY3RlcnMgb3IgZmV3ZXInKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXQoRVJST1JfQ09ERVMuVkFMSURBVElPTik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGF0ZSBleHBpcnkg4oaSIHNlY29uZHMuXG4gICAgICAgIGNvbnN0IGRheXMgPSBNYXRoLmZsb29yKE51bWJlcihvcHRpb25zLmV4cGlyZXNEYXlzKSk7XG4gICAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKGRheXMpIHx8IGRheXMgPCAxIHx8IGRheXMgPiBNQVhfRVhQSVJFU19EQVlTKSB7XG4gICAgICAgICAgcHJpbnRFcnJvcihgLS1leHBpcmVzLWRheXMgbXVzdCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgJHtNQVhfRVhQSVJFU19EQVlTfWApO1xuICAgICAgICAgIHByb2Nlc3MuZXhpdChFUlJPUl9DT0RFUy5WQUxJREFUSU9OKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleHBpcmVzSW4gPSBkYXlzICogODY0MDA7XG5cbiAgICAgICAgY29uc3QgaHR0cHNBZ2VudCA9IGNyZWRlbnRpYWxIdHRwc0FnZW50KG9wdGlvbnMudmVyaWZ5U3NsKTtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IFRJTUVPVVRTLkhUVFBfUkVRVUVTVDtcbiAgICAgICAgY29uc3QgdHJhbnNwb3J0ID0geyB1cmw6IG9wdGlvbnMudXJsLCBodHRwc0FnZW50LCB0aW1lb3V0IH07XG5cbiAgICAgICAgLy8gMSkgRGV2aWNlIHNpZ24taW4sIGFza2luZyBmb3IgdGhlIHN0ZXAtdXAgdGhlIGNyZWF0ZSBjYWxsIG5lZWRzLlxuICAgICAgICBpZiAoIXF1aWV0KSBwcmludEluZm8oJ1N0YXJ0aW5nIGJyb3dzZXIgc2lnbi1pbicsIHsgdXJsOiBvcHRpb25zLnVybCwgdmVyaWZ5U3NsOiBvcHRpb25zLnZlcmlmeVNzbCB9KTtcbiAgICAgICAgY29uc3QgY29kZSA9IGF3YWl0IHJlcXVlc3REZXZpY2VDb2RlKHRyYW5zcG9ydCwgeyBzdGVwVXA6IHRydWUgfSk7XG4gICAgICAgIGNvbnN0IGFwcHJvdmFsVXJsID0gY29kZS52ZXJpZmljYXRpb25fdXJpX2NvbXBsZXRlIHx8IGNvZGUudmVyaWZpY2F0aW9uX3VyaTtcbiAgICAgICAgY29uc3Qgb3BlbmVkID0gb3B0aW9ucy5icm93c2VyICE9PSBmYWxzZSAmJiBvcGVuSW5Ccm93c2VyKGFwcHJvdmFsVXJsKTtcblxuICAgICAgICAvLyBUaGUgcHJvbXB0IGdvZXMgdG8gU1RERVJSIHVuZGVyIGAtLXF1aWV0YDogc3Rkb3V0IGlzIGNhcHR1cmVkIGJ5XG4gICAgICAgIC8vIGBldmFsICQo4oCmKWAsIHNvIHByaW50aW5nIHRoZSBjb2RlIHRoZXJlIHdvdWxkIHN3YWxsb3cgdGhlIG9uZSB0aGluZ1xuICAgICAgICAvLyB0aGUgdXNlciBoYXMgdG8gcmVhZCBiZWZvcmUgYW55dGhpbmcgY2FuIHByb2NlZWQuXG4gICAgICAgIGNvbnN0IHNheSA9IHF1aWV0ID8gY29uc29sZS5lcnJvciA6IGNvbnNvbGUubG9nO1xuICAgICAgICBzYXkoJycpO1xuICAgICAgICBzYXkoYCAgWW91ciBjb2RlOiAgJHtib2xkKGN5YW4oY29kZS51c2VyX2NvZGUpKX1gKTtcbiAgICAgICAgc2F5KGAgIEFwcHJvdmUgYXQ6ICR7Z3JlZW4oYXBwcm92YWxVcmwpfWApO1xuICAgICAgICBzYXkoJycpO1xuICAgICAgICBzYXkoZGltKG9wZW5lZFxuICAgICAgICAgID8gJyAgT3BlbmluZyB5b3VyIGJyb3dzZXLigKYgYXBwcm92ZSB0aGUgY29kZSB0aGVyZSwgdGhlbiBjb21lIGJhY2suJ1xuICAgICAgICAgIDogJyAgT3BlbiB0aGF0IFVSTCBpbiBhIGJyb3dzZXIsIGNoZWNrIHRoZSBjb2RlIG1hdGNoZXMsIGFuZCBhcHByb3ZlLicpKTtcbiAgICAgICAgaWYgKCFxdWlldCkgcHJpbnRJbmZvKCdXYWl0aW5nIGZvciBhcHByb3ZhbOKApicpO1xuXG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCBwb2xsRm9yRGV2aWNlVG9rZW4odHJhbnNwb3J0LCBjb2RlKTtcbiAgICAgICAgbGV0IGFjY2Vzc1Rva2VuID0gc2Vzc2lvbi5hY2Nlc3NfdG9rZW47XG4gICAgICAgIGNvbnN0IHN0ZXBVcFRva2VuID0gc2Vzc2lvbi5zdGVwX3VwX3Rva2VuO1xuICAgICAgICBpZiAoIXN0ZXBVcFRva2VuKSB7XG4gICAgICAgICAgcHJpbnRFcnJvcignVGhlIGFwcHJvdmFsIGRpZCBub3QgcmV0dXJuIGEgc3RlcC11cCBjb25maXJtYXRpb24g4oCUIGFwcHJvdmUgdGhlIGNvZGUgcHJvbXB0bHkgYW5kIHRyeSBhZ2Fpbi4nKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXQoRVJST1JfQ09ERVMuQVVUSEVOVElDQVRJT04pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMikgT3B0aW9uYWxseSBiaW5kIHRvIGEgc3BlY2lmaWMgb3JnIChwZXJzaXN0cyBhcyB0aGUgYWN0aXZlIG9yZywgd2hpY2hcbiAgICAgICAgLy8gICAgdGhlIGtleSBpbmhlcml0cykuIFJvdGF0ZXMgdGhlIHNlc3Npb24sIGJ1dCB0aGUgc3RlcC11cCB0b2tlbiBpc1xuICAgICAgICAvLyAgICBib3VuZCB0byB0aGUgdXNlciwgbm90IHRoZSBzZXNzaW9uLCBzbyBpdCBzdXJ2aXZlcyB0aGUgc3dpdGNoLlxuICAgICAgICBpZiAob3B0aW9ucy5vcmcpIHtcbiAgICAgICAgICBpZiAoIXF1aWV0KSBwcmludEluZm8oJ1N3aXRjaGluZyB0byBvcmdhbml6YXRpb24nLCB7IG9yZ0lkOiBvcHRpb25zLm9yZyB9KTtcbiAgICAgICAgICBhY2Nlc3NUb2tlbiA9IChhd2FpdCBzd2l0Y2hPcmdhbml6YXRpb24oe1xuICAgICAgICAgICAgdXJsOiBvcHRpb25zLnVybCxcbiAgICAgICAgICAgIG9yZ0lkOiBvcHRpb25zLm9yZyxcbiAgICAgICAgICAgIGFjY2Vzc1Rva2VuLFxuICAgICAgICAgICAgaHR0cHNBZ2VudCxcbiAgICAgICAgICAgIHRpbWVvdXQsXG4gICAgICAgICAgICBxdWlldCxcbiAgICAgICAgICB9KSkuYWNjZXNzVG9rZW47XG4gICAgICAgIH1cblxuICAgICAgICAvLyAzKSBDcmVhdGUgdGhlIGFjY2VzcyBrZXkuIFRoZSBzdGVwLXVwIHRva2VuIGlzIHNob3J0LWxpdmVkICh+NjBzKSBhbmRcbiAgICAgICAgLy8gICAgc2luZ2xlLXVzZSwgc28gaXQgaXMgc3BlbnQgaW1tZWRpYXRlbHkuXG4gICAgICAgIGNvbnN0IGtleVVybCA9IGAke29wdGlvbnMudXJsfS9hcGkvdXNlci9rZXlzYDtcbiAgICAgICAgcHJpbnREZWJ1ZygnUE9TVCcsIHsgdXJsOiBrZXlVcmwgfSk7XG4gICAgICAgIGNvbnN0IGtleVJlcyA9IGF3YWl0IGF4aW9zLnBvc3Q8Q3JlYXRlQWNjZXNzS2V5UmVzcG9uc2U+KFxuICAgICAgICAgIGtleVVybCxcbiAgICAgICAgICB7IG5hbWUsIGV4cGlyZXNJbiwgLi4uKG9wdGlvbnMuc2NvcGUgPyB7IHNjb3BlOiBvcHRpb25zLnNjb3BlIH0gOiB7fSkgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke2FjY2Vzc1Rva2VufWAsXG4gICAgICAgICAgICAgICdYLVN0ZXAtVXAtVG9rZW4nOiBzdGVwVXBUb2tlbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBodHRwc0FnZW50LFxuICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGtleSA9IGtleVJlcy5kYXRhPy5kYXRhPy5rZXk7XG4gICAgICAgIGNvbnN0IG1ldGEgPSBrZXlSZXMuZGF0YT8uZGF0YT8uYWNjZXNzS2V5O1xuICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgIHByaW50RXJyb3IoJ0NyZWF0ZSBrZXkgZmFpbGVkOiBubyBrZXkgaW4gcmVzcG9uc2UnKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXQoRVJST1JfQ09ERVMuQVBJX1JFUVVFU1QpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUXVpZXQgbW9kZTogZW1pdCBvbmx5IHRoZSBleHBvcnQgbGluZSAodGhlIGtleSBpcyBhIHZhbGlkIEJlYXJlciBjcmVkZW50aWFsKS5cbiAgICAgICAgaWYgKHF1aWV0KSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYGV4cG9ydCBQTEFURk9STV9UT0tFTj0ke2tleX1gKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgIHByaW50U3VjY2VzcygnQWNjZXNzIGtleSBjcmVhdGVkJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgcHJpbnRLZXlWYWx1ZSh7XG4gICAgICAgICAgJ05hbWUnOiBtZXRhPy5uYW1lID8/IG5hbWUsXG4gICAgICAgICAgJ0tleSBJRCc6IG1ldGE/LmlkID8/ICcodW5rbm93biknLFxuICAgICAgICAgICdLZXknOiBtZXRhPy5kaXNwbGF5ID8/ICcodW5rbm93biknLFxuICAgICAgICAgICdFeHBpcmVzJzogbWV0YT8uZXhwaXJlc0F0ID8/IGAke2RheXN9IGRheShzKWAsXG4gICAgICAgICAgLi4uKG1ldGE/LnNjb3BlID8geyBTY29wZTogbWV0YS5zY29wZSB9IDoge30pLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICBjb25zb2xlLmxvZyh5ZWxsb3coYm9sZCgnQ29weSB5b3VyIGtleSBub3cg4oCUIG9ubHkgaXRzIGhhc2ggaXMgc3RvcmVkLCBzbyBpdCB3aWxsIG5vdCBiZSBzaG93biBhZ2FpbjonKSkpO1xuICAgICAgICBjb25zb2xlLmxvZyhncmVlbihrZXkpKTtcbiAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICBwcmludEluZm8oJ1RpcDogdXNlIGl0IGFzIFBMQVRGT1JNX1RPS0VOIGZvciBzdWJzZXF1ZW50IGNvbW1hbmRzOicpO1xuICAgICAgICBjb25zb2xlLmxvZyhncmVlbignICBleHBvcnQgUExBVEZPUk1fVE9LRU49PHRva2VuPicpKTtcbiAgICAgICAgY29uc29sZS5sb2coZ3JlZW4oYCAgIyBvcjogIGV2YWwgJChwaXBlbGluZS1tYW5hZ2VyIGF1dGggcGF0IC0tbmFtZSAke25hbWV9IC0tcXVpZXQpYCkpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRGV2aWNlQXV0aEVycm9yKSB7XG4gICAgICAgICAgcHJpbnRFcnJvcihgQ3JlYXRlIGtleSBmYWlsZWQ6ICR7ZXJyb3IubWVzc2FnZX1gLCB7IHJlYXNvbjogZXJyb3IuY29kZSB9KTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXQoRVJST1JfQ09ERVMuQVVUSEVOVElDQVRJT04pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChheGlvcy5pc0F4aW9zRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgY29uc3Qgc3RhdHVzID0gZXJyb3IucmVzcG9uc2U/LnN0YXR1cztcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gKGVycm9yLnJlc3BvbnNlPy5kYXRhIGFzIHsgbWVzc2FnZT86IHN0cmluZyB9KT8ubWVzc2FnZTtcbiAgICAgICAgICBwcmludEVycm9yKCdDcmVhdGUga2V5IGZhaWxlZCcsIHtcbiAgICAgICAgICAgIHN0YXR1czogc3RhdHVzID8/ICdubyByZXNwb25zZScsXG4gICAgICAgICAgICAuLi4obWVzc2FnZSA/IHsgbWVzc2FnZSB9IDoge30pLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHByb2Nlc3MuZXhpdChFUlJPUl9DT0RFUy5BVVRIRU5USUNBVElPTik7XG4gICAgICAgIH1cbiAgICAgICAgaGFuZGxlRXJyb3IoZXJyb3IsIEVSUk9SX0NPREVTLkFQSV9SRVFVRVNULCB7XG4gICAgICAgICAgZGVidWc6IHByb2dyYW0ub3B0cygpLmRlYnVnLFxuICAgICAgICAgIGV4aXQ6IHRydWUsXG4gICAgICAgICAgY29udGV4dDogeyBjb21tYW5kOiAnY3JlYXRlLXBhdCcsIGV4ZWN1dGlvbklkLCB1cmw6IG9wdGlvbnMudXJsIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xufVxuIl19
@@ -2,19 +2,25 @@ import { Command } from 'commander';
2
2
  /**
3
3
  * Registers the `login` command with the CLI program.
4
4
  *
5
- * Authenticates against the platform API and prints an export statement
6
- * for `PLATFORM_TOKEN` on success. Does NOT require `PLATFORM_TOKEN`
7
- * to be set beforehand (unlike other commands).
5
+ * Signs in with the OAuth 2.0 device authorization grant (RFC 8628): the CLI
6
+ * shows a short code, the person approves it in a browser, and the CLI receives
7
+ * an ordinary session. There is no password flag and no way to hand the CLI a
8
+ * refresh token — both used to end up in shell history, `ps` output and CI logs,
9
+ * and both skipped the SSO / step-up / MFA the browser already enforces.
10
+ *
11
+ * The session is written to the credential store (`~/.pipeline-manager/
12
+ * credentials.json`, owner-only), so subsequent commands authenticate with no
13
+ * environment variable at all. `PLATFORM_TOKEN` still wins when it is set, which
14
+ * is what CI uses — an access key from `auth pat`.
8
15
  *
9
16
  * @param program - The root Commander program instance to attach the command to.
10
17
  *
11
18
  * @example
12
19
  * ```bash
13
- * pipeline-manager auth login --identifier admin@example.com --password secret
14
- * pipeline-manager auth login -u admin@example.com -p secret
15
- * pipeline-manager auth login -u admin@example.com -p secret --url https://myhost:8443
16
- * eval $(pipeline-manager auth login -u admin@example.com -p secret --quiet)
17
- * pipeline-manager auth login --refresh <refresh-token>
20
+ * pipeline-manager auth login
21
+ * pipeline-manager auth login --url https://platform.example.com --org <orgId>
22
+ * pipeline-manager auth login --no-browser # print the URL instead of opening it
23
+ * eval $(pipeline-manager auth login --quiet) # also export PLATFORM_TOKEN
18
24
  * ```
19
25
  */
20
26
  export declare function login(program: Command): void;
@@ -1 +1 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoK5C"}
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4G5C"}