@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,171 +4,136 @@ 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 { credentialStorePath, saveSession } from '../utils/credential-store.js';
10
+ import { DeviceAuthError, openInBrowser, pollForDeviceToken, requestDeviceCode } from '../utils/device-auth.js';
9
11
  import { ERROR_CODES, handleError } from '../utils/error-handler.js';
10
- import { printDebug, printError, printInfo, printSuccess, printWarning } from '../utils/output-utils.js';
11
- import { checkAuthRateLimit, recordAuthFailure, recordAuthSuccess } from '../utils/rate-limiter.js';
12
- const { green } = pico;
12
+ import { printError, printInfo, printSuccess } from '../utils/output-utils.js';
13
+ const { bold, cyan, dim, green } = pico;
13
14
  /**
14
15
  * Registers the `login` command with the CLI program.
15
16
  *
16
- * Authenticates against the platform API and prints an export statement
17
- * for `PLATFORM_TOKEN` on success. Does NOT require `PLATFORM_TOKEN`
18
- * to be set beforehand (unlike other commands).
17
+ * Signs in with the OAuth 2.0 device authorization grant (RFC 8628): the CLI
18
+ * shows a short code, the person approves it in a browser, and the CLI receives
19
+ * an ordinary session. There is no password flag and no way to hand the CLI a
20
+ * refresh token — both used to end up in shell history, `ps` output and CI logs,
21
+ * and both skipped the SSO / step-up / MFA the browser already enforces.
22
+ *
23
+ * The session is written to the credential store (`~/.pipeline-manager/
24
+ * credentials.json`, owner-only), so subsequent commands authenticate with no
25
+ * environment variable at all. `PLATFORM_TOKEN` still wins when it is set, which
26
+ * is what CI uses — an access key from `auth pat`.
19
27
  *
20
28
  * @param program - The root Commander program instance to attach the command to.
21
29
  *
22
30
  * @example
23
31
  * ```bash
24
- * pipeline-manager auth login --identifier admin@example.com --password secret
25
- * pipeline-manager auth login -u admin@example.com -p secret
26
- * pipeline-manager auth login -u admin@example.com -p secret --url https://myhost:8443
27
- * eval $(pipeline-manager auth login -u admin@example.com -p secret --quiet)
28
- * pipeline-manager auth login --refresh <refresh-token>
32
+ * pipeline-manager auth login
33
+ * pipeline-manager auth login --url https://platform.example.com --org <orgId>
34
+ * pipeline-manager auth login --no-browser # print the URL instead of opening it
35
+ * eval $(pipeline-manager auth login --quiet) # also export PLATFORM_TOKEN
29
36
  * ```
30
37
  */
31
38
  export function login(program) {
32
39
  withSslOptions(program
33
40
  .command('login')
34
- .description('Authenticate with the platform and obtain a PLATFORM_TOKEN')
35
- .option('-u, --identifier <identifier>', 'Username or email')
36
- .option('-p, --password <password>', 'Password')
37
- .option('--refresh <refreshToken>', 'Use a refresh token instead of login credentials')
38
- .option('--org <orgId>', 'Switch to a specific organization after login')
41
+ .description('Sign in through your browser and store the session (device authorization)')
42
+ .option('--org <orgId>', 'Switch to a specific organization after signing in')
43
+ .option('--no-browser', 'Never open a browser — print the verification URL instead')
39
44
  .option('--url <url>', 'Platform base URL', process.env.PLATFORM_BASE_URL || 'https://localhost:8443'))
40
45
  .option('--quiet', 'Only print the export statement (useful for eval)')
41
46
  .action(async (options) => {
42
- const isRefresh = !!options.refresh;
43
47
  const quiet = options.quiet ?? false;
44
- const executionId = printCommandHeader(isRefresh ? 'Token Refresh' : 'Login', isRefresh ? 'Token Refresh' : 'Platform Authentication', { quiet });
45
- // SECURITY: login/refresh POST plaintext passwords and JWTs. Never send them
46
- // over an unverified TLS connection in production — a MITM would harvest them.
47
- // In non-production, --no-verify-ssl is still honored (self-signed dev platforms).
48
+ const executionId = printCommandHeader('Login', 'Platform Authentication', { quiet });
49
+ // SECURITY: the poll returns session tokens — bearer credentials. Never
50
+ // fetch them over an unverified TLS connection in production.
48
51
  assertCredentialTlsAllowed(options.verifySsl);
49
- // Credentials may come from flags OR the PLATFORM_IDENTIFIER/PLATFORM_PASSWORD
50
- // env vars (so the password need not appear in shell history / `ps`).
51
- const { identifier, password } = resolveCredentials(options);
52
- let loginSucceeded = false;
53
52
  try {
54
- // Validate required options
55
- if (!isRefresh && (!identifier || !password)) {
56
- printError('Login requires --identifier and --password (or PLATFORM_IDENTIFIER/PLATFORM_PASSWORD env), or --refresh <token>');
57
- process.exit(ERROR_CODES.AUTHENTICATION);
58
- }
59
- if (!isRefresh && options.password) {
60
- printWarning('Passing --password on the command line can expose it via shell history; prefer the PLATFORM_PASSWORD env var.');
61
- }
62
- // Rate limiting — prevent brute force (login only)
63
- if (!isRefresh) {
64
- const rateLimitMsg = checkAuthRateLimit(identifier, options.url);
65
- if (rateLimitMsg) {
66
- printError(rateLimitMsg);
67
- process.exit(ERROR_CODES.AUTHENTICATION);
68
- }
69
- }
70
- if (!quiet) {
71
- printInfo(isRefresh ? 'Refreshing access token' : 'Authenticating', {
72
- ...(identifier ? { identifier } : {}),
73
- url: options.url,
74
- verifySsl: options.verifySsl,
75
- });
76
- }
77
- const httpsAgent = credentialHttpsAgent(options.verifySsl);
78
- let token;
79
- if (isRefresh) {
80
- const refreshUrl = `${options.url}/api/auth/refresh`;
81
- printDebug('POST', { url: refreshUrl });
82
- const response = await axios.post(refreshUrl, { refreshToken: options.refresh }, {
83
- headers: { 'Content-Type': 'application/json' },
84
- httpsAgent,
85
- timeout: TIMEOUTS.HTTP_REQUEST,
86
- });
87
- token = response.data?.data?.accessToken;
88
- }
89
- else {
90
- // identifier/password validated non-null above (the `!isRefresh` guard).
91
- token = await postLogin({
92
- url: options.url,
93
- identifier: identifier,
94
- password: password,
95
- httpsAgent,
96
- timeout: TIMEOUTS.HTTP_REQUEST,
97
- });
98
- }
99
- if (!token) {
100
- if (!isRefresh)
101
- recordAuthFailure(identifier, options.url);
102
- printError(`${isRefresh ? 'Token refresh' : 'Login'} failed: no access token in response`);
103
- process.exit(ERROR_CODES.AUTHENTICATION);
104
- }
105
- if (!isRefresh)
106
- recordAuthSuccess(identifier, options.url);
107
- // Past this point authentication has already succeeded — a later failure
108
- // (e.g. the --org switch below) must NOT be recorded as an auth failure,
109
- // or a valid-credential user would accrue toward brute-force lockout.
110
- loginSucceeded = true;
111
- // Switch to a specific organization if --org is provided
53
+ const transport = {
54
+ url: options.url,
55
+ httpsAgent: credentialHttpsAgent(options.verifySsl),
56
+ timeout: TIMEOUTS.HTTP_REQUEST,
57
+ };
58
+ if (!quiet)
59
+ printInfo('Starting browser sign-in', { url: options.url, verifySsl: options.verifySsl });
60
+ const code = await requestDeviceCode(transport);
61
+ const approvalUrl = code.verification_uri_complete || code.verification_uri;
62
+ // `--no-browser` sets options.browser to false (commander's --no- pair).
63
+ const opened = options.browser !== false && openInBrowser(approvalUrl);
64
+ // The prompt goes to STDERR under `--quiet`: stdout is captured by
65
+ // `eval $(…)`, so printing the code there would swallow the one thing
66
+ // the user has to read before anything can proceed.
67
+ const say = quiet ? console.error : console.log;
68
+ say('');
69
+ say(` Your code: ${bold(cyan(code.user_code))}`);
70
+ say(` Approve at: ${green(approvalUrl)}`);
71
+ say('');
72
+ say(dim(opened
73
+ ? ' Opening your browser… approve the code there, then come back.'
74
+ : ' Open that URL in a browser, check the code matches, and approve.'));
75
+ if (!quiet)
76
+ printInfo('Waiting for approval…');
77
+ const session = await pollForDeviceToken(transport, code);
78
+ let accessToken = session.access_token;
79
+ let refreshToken = session.refresh_token;
80
+ let expiresIn = session.expires_in;
81
+ // Switching re-issues (and rotates) the session, so the store has to take
82
+ // the NEW pair — keeping the old refresh token would strand the session.
112
83
  if (options.org) {
113
- if (!quiet) {
84
+ if (!quiet)
114
85
  printInfo('Switching to organization', { orgId: options.org });
115
- }
116
- token = await switchOrganization({
86
+ const switched = await switchOrganization({
117
87
  url: options.url,
118
88
  orgId: options.org,
119
- accessToken: token,
120
- httpsAgent,
89
+ accessToken,
90
+ httpsAgent: transport.httpsAgent,
121
91
  timeout: TIMEOUTS.HTTP_REQUEST,
122
92
  quiet,
123
93
  });
94
+ accessToken = switched.accessToken;
95
+ refreshToken = switched.refreshToken ?? refreshToken;
96
+ expiresIn = switched.expiresIn ?? expiresIn;
124
97
  }
125
- if (!quiet) {
126
- console.log('');
127
- printSuccess(isRefresh ? 'Token refreshed successfully' : 'Login successful');
128
- console.log('');
129
- }
130
- console.log(`export PLATFORM_TOKEN=${token}`);
131
- if (!quiet) {
132
- console.log('');
133
- printInfo('Tip: Run the following to set the token in your shell:');
134
- const orgFlag = options.org ? ` --org ${options.org}` : '';
135
- if (isRefresh) {
136
- console.log(green(` eval $(pipeline-manager auth login --refresh '<refresh-token>'${orgFlag} --quiet)`));
137
- }
138
- else {
139
- console.log(green(` eval $(pipeline-manager auth login -u ${identifier} -p '***'${orgFlag} --quiet)`));
140
- }
98
+ saveSession(options.url, {
99
+ accessToken,
100
+ ...(refreshToken ? { refreshToken } : {}),
101
+ expiresAt: Date.now() + expiresIn * 1000,
102
+ ...(options.org ? { organizationId: options.org } : {}),
103
+ });
104
+ if (quiet) {
105
+ console.log(`export PLATFORM_TOKEN=${accessToken}`);
106
+ return;
141
107
  }
108
+ console.log('');
109
+ printSuccess('Signed in');
110
+ console.log('');
111
+ printInfo('The session is stored for this platform — other commands pick it up automatically.', {
112
+ store: credentialStorePath(),
113
+ });
114
+ console.log('');
115
+ printInfo('Tip: to export it into this shell instead:');
116
+ console.log(green(` eval $(pipeline-manager auth login${options.org ? ` --org ${options.org}` : ''} --quiet)`));
117
+ console.log('');
118
+ printInfo('Sign this device out again from Settings → Sessions and devices.');
142
119
  }
143
120
  catch (error) {
144
- // Key the failure to (identifier, url) like the check/success/no-token
145
- // paths — a bad-password 401 throws to here, so keying it to the shared
146
- // default bucket meant brute-force attempts never accrued toward lockout.
147
- // Skip when login already succeeded (a failed post-login --org switch is
148
- // not an authentication failure).
149
- if (!isRefresh && !loginSucceeded)
150
- recordAuthFailure(identifier, options.url);
151
- // Provide a clear failure message for auth errors
121
+ if (error instanceof DeviceAuthError) {
122
+ printError(`Login failed: ${error.message}`, { reason: error.code });
123
+ process.exit(ERROR_CODES.AUTHENTICATION);
124
+ }
152
125
  if (axios.isAxiosError(error)) {
153
126
  const status = error.response?.status;
154
127
  const message = error.response?.data?.message;
155
- printError(`${isRefresh ? 'Token refresh' : 'Login'} failed`, {
156
- status: status ?? 'no response',
157
- ...(message ? { message } : {}),
158
- });
128
+ printError('Login failed', { status: status ?? 'no response', ...(message ? { message } : {}) });
159
129
  process.exit(ERROR_CODES.AUTHENTICATION);
160
130
  }
161
131
  handleError(error, ERROR_CODES.AUTHENTICATION, {
162
132
  debug: program.opts().debug,
163
133
  exit: true,
164
- context: {
165
- command: 'login',
166
- executionId,
167
- identifier: options.identifier,
168
- url: options.url,
169
- },
134
+ context: { command: 'login', executionId, url: options.url },
170
135
  });
171
136
  }
172
137
  });
173
138
  }
174
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvbG9naW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLElBQUksTUFBTSxZQUFZLENBQUM7QUFDOUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RELE9BQU8sRUFBRSwwQkFBMEIsRUFBcUIsb0JBQW9CLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEssT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVwRyxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBRXZCOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sVUFBVSxLQUFLLENBQUMsT0FBZ0I7SUFDcEMsY0FBYyxDQUFDLE9BQU87U0FDbkIsT0FBTyxDQUFDLE9BQU8sQ0FBQztTQUNoQixXQUFXLENBQUMsNERBQTRELENBQUM7U0FDekUsTUFBTSxDQUFDLCtCQUErQixFQUFFLG1CQUFtQixDQUFDO1NBQzVELE1BQU0sQ0FBQywyQkFBMkIsRUFBRSxVQUFVLENBQUM7U0FDL0MsTUFBTSxD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Q0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgcGljbyBmcm9tICdwaWNvY29sb3JzJztcbmltcG9ydCB7IFRJTUVPVVRTIH0gZnJvbSAnLi4vY29uZmlnL2NsaS5jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgYXNzZXJ0Q3JlZGVudGlhbFRsc0FsbG93ZWQsIHR5cGUgQXV0aFJlc3BvbnNlLCBjcmVkZW50aWFsSHR0cHNBZ2VudCwgcG9zdExvZ2luLCByZXNvbHZlQ3JlZGVudGlhbHMsIHN3aXRjaE9yZ2FuaXphdGlvbiB9IGZyb20gJy4uL3V0aWxzL2F1dGgtdXRpbHMuanMnO1xuaW1wb3J0IHsgcHJpbnRDb21tYW5kSGVhZGVyLCB3aXRoU3NsT3B0aW9ucyB9IGZyb20gJy4uL3V0aWxzL2NvbW1hbmQtdXRpbHMuanMnO1xuaW1wb3J0IHsgRVJST1JfQ09ERVMsIGhhbmRsZUVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZXJyb3ItaGFuZGxlci5qcyc7XG5pbXBvcnQgeyBwcmludERlYnVnLCBwcmludEVycm9yLCBwcmludEluZm8sIHByaW50U3VjY2VzcywgcHJpbnRXYXJuaW5nIH0gZnJvbSAnLi4vdXRpbHMvb3V0cHV0LXV0aWxzLmpzJztcbmltcG9ydCB7IGNoZWNrQXV0aFJhdGVMaW1pdCwgcmVjb3JkQXV0aEZhaWx1cmUsIHJlY29yZEF1dGhTdWNjZXNzIH0gZnJvbSAnLi4vdXRpbHMvcmF0ZS1saW1pdGVyLmpzJztcblxuY29uc3QgeyBncmVlbiB9ID0gcGljbztcblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIGBsb2dpbmAgY29tbWFuZCB3aXRoIHRoZSBDTEkgcHJvZ3JhbS5cbiAqXG4gKiBBdXRoZW50aWNhdGVzIGFnYWluc3QgdGhlIHBsYXRmb3JtIEFQSSBhbmQgcHJpbnRzIGFuIGV4cG9ydCBzdGF0ZW1lbnRcbiAqIGZvciBgUExBVEZPUk1fVE9LRU5gIG9uIHN1Y2Nlc3MuICBEb2VzIE5PVCByZXF1aXJlIGBQTEFURk9STV9UT0tFTmBcbiAqIHRvIGJlIHNldCBiZWZvcmVoYW5kICh1bmxpa2Ugb3RoZXIgY29tbWFuZHMpLlxuICpcbiAqIEBwYXJhbSBwcm9ncmFtIC0gVGhlIHJvb3QgQ29tbWFuZGVyIHByb2dyYW0gaW5zdGFuY2UgdG8gYXR0YWNoIHRoZSBjb21tYW5kIHRvLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBiYXNoXG4gKiBwaXBlbGluZS1tYW5hZ2VyIGF1dGggbG9naW4gLS1pZGVudGlmaWVyIGFkbWluQGV4YW1wbGUuY29tIC0tcGFzc3dvcmQgc2VjcmV0XG4gKiBwaXBlbGluZS1tYW5hZ2VyIGF1dGggbG9naW4gLXUgYWRtaW5AZXhhbXBsZS5jb20gLXAgc2VjcmV0XG4gKiBwaXBlbGluZS1tYW5hZ2VyIGF1dGggbG9naW4gLXUgYWRtaW5AZXhhbXBsZS5jb20gLXAgc2VjcmV0IC0tdXJsIGh0dHBzOi8vbXlob3N0Ojg0NDNcbiAqIGV2YWwgJChwaXBlbGluZS1tYW5hZ2VyIGF1dGggbG9naW4gLXUgYWRtaW5AZXhhbXBsZS5jb20gLXAgc2VjcmV0IC0tcXVpZXQpXG4gKiBwaXBlbGluZS1tYW5hZ2VyIGF1dGggbG9naW4gLS1yZWZyZXNoIDxyZWZyZXNoLXRva2VuPlxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2dpbihwcm9ncmFtOiBDb21tYW5kKTogdm9pZCB7XG4gIHdpdGhTc2xPcHRpb25zKHByb2dyYW1cbiAgICAuY29tbWFuZCgnbG9naW4nKVxuICAgIC5kZXNjcmlwdGlvbignQXV0aGVudGljYXRlIHdpdGggdGhlIHBsYXRmb3JtIGFuZCBvYnRhaW4gYSBQTEFURk9STV9UT0tFTicpXG4gICAgLm9wdGlvbignLXUsIC0taWRlbnRpZmllciA8aWRlbnRpZmllcj4nLCAnVXNlcm5hbWUgb3IgZW1haWwnKVxuICAgIC5vcHRpb24oJy1wLCAtLXBhc3N3b3JkIDxwYXNzd29yZD4nLCAnUGFzc3dvcmQnKVxuICAgIC5vcHRpb24oJy0tcmVmcmVzaCA8cmVmcmVzaFRva2VuPicsICdVc2UgYSByZWZyZXNoIHRva2VuIGluc3RlYWQgb2YgbG9naW4gY3JlZGVudGlhbHMnKVxuICAgIC5vcHRpb24oJy0tb3JnIDxvcmdJZD4nLCAnU3dpdGNoIHRvIGEgc3BlY2lmaWMgb3JnYW5pemF0aW9uIGFmdGVyIGxvZ2luJylcbiAgICAub3B0aW9uKCctLXVybCA8dXJsPicsICdQbGF0Zm9ybSBiYXNlIFVSTCcsIHByb2Nlc3MuZW52LlBMQVRGT1JNX0JBU0VfVVJMIHx8ICdodHRwczovL2xvY2FsaG9zdDo4NDQzJykpXG4gICAgLm9wdGlvbignLS1xdWlldCcsICdPbmx5IHByaW50IHRoZSBleHBvcnQgc3RhdGVtZW50ICh1c2VmdWwgZm9yIGV2YWwpJylcbiAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICBjb25zdCBpc1JlZnJlc2ggPSAhIW9wdGlvbnMucmVmcmVzaDtcbiAgICAgIGNvbnN0IHF1aWV0ID0gb3B0aW9ucy5xdWlldCA/PyBmYWxzZTtcbiAgICAgIGNvbnN0IGV4ZWN1dGlvbklkID0gcHJpbnRDb21tYW5kSGVhZGVyKFxuICAgICAgICBpc1JlZnJlc2ggPyAnVG9rZW4gUmVmcmVzaCcgOiAnTG9naW4nLFxuICAgICAgICBpc1JlZnJlc2ggPyAnVG9rZW4gUmVmcmVzaCcgOiAnUGxhdGZvcm0gQXV0aGVudGljYXRpb24nLFxuICAgICAgICB7IHF1aWV0IH0sXG4gICAgICApO1xuXG4gICAgICAvLyBTRUNVUklUWTogbG9naW4vcmVmcmVzaCBQT1NUIHBsYWludGV4dCBwYXNzd29yZHMgYW5kIEpXVHMuIE5ldmVyIHNlbmQgdGhlbVxuICAgICAgLy8gb3ZlciBhbiB1bnZlcmlmaWVkIFRMUyBjb25uZWN0aW9uIGluIHByb2R1Y3Rpb24g4oCUIGEgTUlUTSB3b3VsZCBoYXJ2ZXN0IHRoZW0uXG4gICAgICAvLyBJbiBub24tcHJvZHVjdGlvbiwgLS1uby12ZXJpZnktc3NsIGlzIHN0aWxsIGhvbm9yZWQgKHNlbGYtc2lnbmVkIGRldiBwbGF0Zm9ybXMpLlxuICAgICAgYXNzZXJ0Q3JlZGVudGlhbFRsc0FsbG93ZWQob3B0aW9ucy52ZXJpZnlTc2wpO1xuXG4gICAgICAvLyBDcmVkZW50aWFscyBtYXkgY29tZSBmcm9tIGZsYWdzIE9SIHRoZSBQTEFURk9STV9JREVOVElGSUVSL1BMQVRGT1JNX1BBU1NXT1JEXG4gICAgICAvLyBlbnYgdmFycyAoc28gdGhlIHBhc3N3b3JkIG5lZWQgbm90IGFwcGVhciBpbiBzaGVsbCBoaXN0b3J5IC8gYHBzYCkuXG4gICAgICBjb25zdCB7IGlkZW50aWZpZXIsIHBhc3N3b3JkIH0gPSByZXNvbHZlQ3JlZGVudGlhbHMob3B0aW9ucyk7XG5cbiAgICAgIGxldCBsb2dpblN1Y2NlZWRlZCA9IGZhbHNlO1xuICAgICAgdHJ5IHtcblxuICAgICAgICAvLyBWYWxpZGF0ZSByZXF1aXJlZCBvcHRpb25zXG4gICAgICAgIGlmICghaXNSZWZyZXNoICYmICghaWRlbnRpZmllciB8fCAhcGFzc3dvcmQpKSB7XG4gICAgICAgICAgcHJpbnRFcnJvcignTG9naW4gcmVxdWlyZXMgLS1pZGVudGlmaWVyIGFuZCAtLXBhc3N3b3JkIChvciBQTEFURk9STV9JREVOVElGSUVSL1BMQVRGT1JNX1BBU1NXT1JEIGVudiksIG9yIC0tcmVmcmVzaCA8dG9rZW4+Jyk7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0KEVSUk9SX0NPREVTLkFVVEhFTlRJQ0FUSU9OKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzUmVmcmVzaCAmJiBvcHRpb25zLnBhc3N3b3JkKSB7XG4gICAgICAgICAgcHJpbnRXYXJuaW5nKCdQYXNzaW5nIC0tcGFzc3dvcmQgb24gdGhlIGNvbW1hbmQgbGluZSBjYW4gZXhwb3NlIGl0IHZpYSBzaGVsbCBoaXN0b3J5OyBwcmVmZXIgdGhlIFBMQVRGT1JNX1BBU1NXT1JEIGVudiB2YXIuJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSYXRlIGxpbWl0aW5nIOKAlCBwcmV2ZW50IGJydXRlIGZvcmNlIChsb2dpbiBvbmx5KVxuICAgICAgICBpZiAoIWlzUmVmcmVzaCkge1xuICAgICAgICAgIGNvbnN0IHJhdGVMaW1pdE1zZyA9IGNoZWNrQXV0aFJhdGVMaW1pdChpZGVudGlmaWVyLCBvcHRpb25zLnVybCk7XG4gICAgICAgICAgaWYgKHJhdGVMaW1pdE1zZykge1xuICAgICAgICAgICAgcHJpbnRFcnJvcihyYXRlTGltaXRNc2cpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KEVSUk9SX0NPREVTLkFVVEhFTlRJQ0FUSU9OKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXF1aWV0KSB7XG4gICAgICAgICAgcHJpbnRJbmZvKGlzUmVmcmVzaCA/ICdSZWZyZXNoaW5nIGFjY2VzcyB0b2tlbicgOiAnQXV0aGVudGljYXRpbmcnLCB7XG4gICAgICAgICAgICAuLi4oaWRlbnRpZmllciA/IHsgaWRlbnRpZmllciB9IDoge30pLFxuICAgICAgICAgICAgdXJsOiBvcHRpb25zLnVybCxcbiAgICAgICAgICAgIHZlcmlmeVNzbDogb3B0aW9ucy52ZXJpZnlTc2wsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodHRwc0FnZW50ID0gY3JlZGVudGlhbEh0dHBzQWdlbnQob3B0aW9ucy52ZXJpZnlTc2wpO1xuXG4gICAgICAgIGxldCB0b2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChpc1JlZnJlc2gpIHtcbiAgICAgICAgICBjb25zdCByZWZyZXNoVXJsID0gYCR7b3B0aW9ucy51cmx9L2FwaS9hdXRoL3JlZnJlc2hgO1xuICAgICAgICAgIHByaW50RGVidWcoJ1BPU1QnLCB7IHVybDogcmVmcmVzaFVybCB9KTtcblxuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3MucG9zdDxBdXRoUmVzcG9uc2U+KFxuICAgICAgICAgICAgcmVmcmVzaFVybCxcbiAgICAgICAgICAgIHsgcmVmcmVzaFRva2VuOiBvcHRpb25zLnJlZnJlc2ggfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgICAgIGh0dHBzQWdlbnQsXG4gICAgICAgICAgICAgIHRpbWVvdXQ6IFRJTUVPVVRTLkhUVFBfUkVRVUVTVCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHRva2VuID0gcmVzcG9uc2UuZGF0YT8uZGF0YT8uYWNjZXNzVG9rZW47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gaWRlbnRpZmllci9wYXNzd29yZCB2YWxpZGF0ZWQgbm9uLW51bGwgYWJvdmUgKHRoZSBgIWlzUmVmcmVzaGAgZ3VhcmQpLlxuICAgICAgICAgIHRva2VuID0gYXdhaXQgcG9zdExvZ2luKHtcbiAgICAgICAgICAgIHVybDogb3B0aW9ucy51cmwsXG4gICAgICAgICAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyISxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCEsXG4gICAgICAgICAgICBodHRwc0FnZW50LFxuICAgICAgICAgICAgdGltZW91dDogVElNRU9VVFMuSFRUUF9SRVFVRVNULFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICAgIGlmICghaXNSZWZyZXNoKSByZWNvcmRBdXRoRmFpbHVyZShpZGVudGlmaWVyLCBvcHRpb25zLnVybCk7XG4gICAgICAgICAgcHJpbnRFcnJvcihgJHtpc1JlZnJlc2ggPyAnVG9rZW4gcmVmcmVzaCcgOiAnTG9naW4nfSBmYWlsZWQ6IG5vIGFjY2VzcyB0b2tlbiBpbiByZXNwb25zZWApO1xuICAgICAgICAgIHByb2Nlc3MuZXhpdChFUlJPUl9DT0RFUy5BVVRIRU5USUNBVElPTik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzUmVmcmVzaCkgcmVjb3JkQXV0aFN1Y2Nlc3MoaWRlbnRpZmllciwgb3B0aW9ucy51cmwpO1xuICAgICAgICAvLyBQYXN0IHRoaXMgcG9pbnQgYXV0aGVudGljYXRpb24gaGFzIGFscmVhZHkgc3VjY2VlZGVkIOKAlCBhIGxhdGVyIGZhaWx1cmVcbiAgICAgICAgLy8gKGUuZy4gdGhlIC0tb3JnIHN3aXRjaCBiZWxvdykgbXVzdCBOT1QgYmUgcmVjb3JkZWQgYXMgYW4gYXV0aCBmYWlsdXJlLFxuICAgICAgICAvLyBvciBhIHZhbGlkLWNyZWRlbnRpYWwgdXNlciB3b3VsZCBhY2NydWUgdG93YXJkIGJydXRlLWZvcmNlIGxvY2tvdXQuXG4gICAgICAgIGxvZ2luU3VjY2VlZGVkID0gdHJ1ZTtcblxuICAgICAgICAvLyBTd2l0Y2ggdG8gYSBzcGVjaWZpYyBvcmdhbml6YXRpb24gaWYgLS1vcmcgaXMgcHJvdmlkZWRcbiAgICAgICAgaWYgKG9wdGlvbnMub3JnKSB7XG4gICAgICAgICAgaWYgKCFxdWlldCkge1xuICAgICAgICAgICAgcHJpbnRJbmZvKCdTd2l0Y2hpbmcgdG8gb3JnYW5pemF0aW9uJywgeyBvcmdJZDogb3B0aW9ucy5vcmcgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdG9rZW4gPSBhd2FpdCBzd2l0Y2hPcmdhbml6YXRpb24oe1xuICAgICAgICAgICAgdXJsOiBvcHRpb25zLnVybCxcbiAgICAgICAgICAgIG9yZ0lkOiBvcHRpb25zLm9yZyxcbiAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiB0b2tlbixcbiAgICAgICAgICAgIGh0dHBzQWdlbnQsXG4gICAgICAgICAgICB0aW1lb3V0OiBUSU1FT1VUUy5IVFRQX1JFUVVFU1QsXG4gICAgICAgICAgICBxdWlldCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcXVpZXQpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgICAgcHJpbnRTdWNjZXNzKGlzUmVmcmVzaCA/ICdUb2tlbiByZWZyZXNoZWQgc3VjY2Vzc2Z1bGx5JyA6ICdMb2dpbiBzdWNjZXNzZnVsJyk7XG4gICAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coYGV4cG9ydCBQTEFURk9STV9UT0tFTj0ke3Rva2VufWApO1xuXG4gICAgICAgIGlmICghcXVpZXQpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgICAgcHJpbnRJbmZvKCdUaXA6IFJ1biB0aGUgZm9sbG93aW5nIHRvIHNldCB0aGUgdG9rZW4gaW4geW91ciBzaGVsbDonKTtcbiAgICAgICAgICBjb25zdCBvcmdGbGFnID0gb3B0aW9ucy5vcmcgPyBgIC0tb3JnICR7b3B0aW9ucy5vcmd9YCA6ICcnO1xuICAgICAgICAgIGlmIChpc1JlZnJlc2gpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGdyZWVuKGAgIGV2YWwgJChwaXBlbGluZS1tYW5hZ2VyIGF1dGggbG9naW4gLS1yZWZyZXNoICc8cmVmcmVzaC10b2tlbj4nJHtvcmdGbGFnfSAtLXF1aWV0KWApKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZ3JlZW4oYCAgZXZhbCAkKHBpcGVsaW5lLW1hbmFnZXIgYXV0aCBsb2dpbiAtdSAke2lkZW50aWZpZXJ9IC1wICcqKionJHtvcmdGbGFnfSAtLXF1aWV0KWApKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIEtleSB0aGUgZmFpbHVyZSB0byAoaWRlbnRpZmllciwgdXJsKSBsaWtlIHRoZSBjaGVjay9zdWNjZXNzL25vLXRva2VuXG4gICAgICAgIC8vIHBhdGhzIOKAlCBhIGJhZC1wYXNzd29yZCA0MDEgdGhyb3dzIHRvIGhlcmUsIHNvIGtleWluZyBpdCB0byB0aGUgc2hhcmVkXG4gICAgICAgIC8vIGRlZmF1bHQgYnVja2V0IG1lYW50IGJydXRlLWZvcmNlIGF0dGVtcHRzIG5ldmVyIGFjY3J1ZWQgdG93YXJkIGxvY2tvdXQuXG4gICAgICAgIC8vIFNraXAgd2hlbiBsb2dpbiBhbHJlYWR5IHN1Y2NlZWRlZCAoYSBmYWlsZWQgcG9zdC1sb2dpbiAtLW9yZyBzd2l0Y2ggaXNcbiAgICAgICAgLy8gbm90IGFuIGF1dGhlbnRpY2F0aW9uIGZhaWx1cmUpLlxuICAgICAgICBpZiAoIWlzUmVmcmVzaCAmJiAhbG9naW5TdWNjZWVkZWQpIHJlY29yZEF1dGhGYWlsdXJlKGlkZW50aWZpZXIsIG9wdGlvbnMudXJsKTtcbiAgICAgICAgLy8gUHJvdmlkZSBhIGNsZWFyIGZhaWx1cmUgbWVzc2FnZSBmb3IgYXV0aCBlcnJvcnNcbiAgICAgICAgaWYgKGF4aW9zLmlzQXhpb3NFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICBjb25zdCBzdGF0dXMgPSBlcnJvci5yZXNwb25zZT8uc3RhdHVzO1xuICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAoZXJyb3IucmVzcG9uc2U/LmRhdGEgYXMgeyBtZXNzYWdlPzogc3RyaW5nIH0pPy5tZXNzYWdlO1xuXG4gICAgICAgICAgcHJpbnRFcnJvcihgJHtpc1JlZnJlc2ggPyAnVG9rZW4gcmVmcmVzaCcgOiAnTG9naW4nfSBmYWlsZWRgLCB7XG4gICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyA/PyAnbm8gcmVzcG9uc2UnLFxuICAgICAgICAgICAgLi4uKG1lc3NhZ2UgPyB7IG1lc3NhZ2UgfSA6IHt9KSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXQoRVJST1JfQ09ERVMuQVVUSEVOVElDQVRJT04pO1xuICAgICAgICB9XG5cbiAgICAgICAgaGFuZGxlRXJyb3IoZXJyb3IsIEVSUk9SX0NPREVTLkFVVEhFTlRJQ0FUSU9OLCB7XG4gICAgICAgICAgZGVidWc6IHByb2dyYW0ub3B0cygpLmRlYnVnLFxuICAgICAgICAgIGV4aXQ6IHRydWUsXG4gICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgY29tbWFuZDogJ2xvZ2luJyxcbiAgICAgICAgICAgIGV4ZWN1dGlvbklkLFxuICAgICAgICAgICAgaWRlbnRpZmllcjogb3B0aW9ucy5pZGVudGlmaWVyLFxuICAgICAgICAgICAgdXJsOiBvcHRpb25zLnVybCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbn1cbiJdfQ==
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvbG9naW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLElBQUksTUFBTSxZQUFZLENBQUM7QUFDOUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMvRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDaEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoSCxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRS9FLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFFeEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBQ0gsTUFBTSxVQUFVLEtBQUssQ0FBQyxPQUFnQjtJQUNwQyxjQUFjLENBQUMsT0FBTztTQUNuQixPQUFPLENBQUMsT0FBTyxDQUFDO1NBQ2hCLFdBQVcsQ0FBQywyRUFBMkUsQ0FBQztTQUN4RixNQUFNLENBQUMsZUFBZSxFQUFFLG9EQUFvRCxD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QUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLO2dCQUMzQixJQUFJLEVBQUUsSUFBSTtnQkFDVixPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRTthQUM3RCxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCBwaWNvIGZyb20gJ3BpY29jb2xvcnMnO1xuaW1wb3J0IHsgVElNRU9VVFMgfSBmcm9tICcuLi9jb25maWcvY2xpLmNvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBhc3NlcnRDcmVkZW50aWFsVGxzQWxsb3dlZCwgY3JlZGVudGlhbEh0dHBzQWdlbnQsIHN3aXRjaE9yZ2FuaXphdGlvbiB9IGZyb20gJy4uL3V0aWxzL2F1dGgtdXRpbHMuanMnO1xuaW1wb3J0IHsgcHJpbnRDb21tYW5kSGVhZGVyLCB3aXRoU3NsT3B0aW9ucyB9IGZyb20gJy4uL3V0aWxzL2NvbW1hbmQtdXRpbHMuanMnO1xuaW1wb3J0IHsgY3JlZGVudGlhbFN0b3JlUGF0aCwgc2F2ZVNlc3Npb24gfSBmcm9tICcuLi91dGlscy9jcmVkZW50aWFsLXN0b3JlLmpzJztcbmltcG9ydCB7IERldmljZUF1dGhFcnJvciwgb3BlbkluQnJvd3NlciwgcG9sbEZvckRldmljZVRva2VuLCByZXF1ZXN0RGV2aWNlQ29kZSB9IGZyb20gJy4uL3V0aWxzL2RldmljZS1hdXRoLmpzJztcbmltcG9ydCB7IEVSUk9SX0NPREVTLCBoYW5kbGVFcnJvciB9IGZyb20gJy4uL3V0aWxzL2Vycm9yLWhhbmRsZXIuanMnO1xuaW1wb3J0IHsgcHJpbnRFcnJvciwgcHJpbnRJbmZvLCBwcmludFN1Y2Nlc3MgfSBmcm9tICcuLi91dGlscy9vdXRwdXQtdXRpbHMuanMnO1xuXG5jb25zdCB7IGJvbGQsIGN5YW4sIGRpbSwgZ3JlZW4gfSA9IHBpY287XG5cbi8qKlxuICogUmVnaXN0ZXJzIHRoZSBgbG9naW5gIGNvbW1hbmQgd2l0aCB0aGUgQ0xJIHByb2dyYW0uXG4gKlxuICogU2lnbnMgaW4gd2l0aCB0aGUgT0F1dGggMi4wIGRldmljZSBhdXRob3JpemF0aW9uIGdyYW50IChSRkMgODYyOCk6IHRoZSBDTElcbiAqIHNob3dzIGEgc2hvcnQgY29kZSwgdGhlIHBlcnNvbiBhcHByb3ZlcyBpdCBpbiBhIGJyb3dzZXIsIGFuZCB0aGUgQ0xJIHJlY2VpdmVzXG4gKiBhbiBvcmRpbmFyeSBzZXNzaW9uLiBUaGVyZSBpcyBubyBwYXNzd29yZCBmbGFnIGFuZCBubyB3YXkgdG8gaGFuZCB0aGUgQ0xJIGFcbiAqIHJlZnJlc2ggdG9rZW4g4oCUIGJvdGggdXNlZCB0byBlbmQgdXAgaW4gc2hlbGwgaGlzdG9yeSwgYHBzYCBvdXRwdXQgYW5kIENJIGxvZ3MsXG4gKiBhbmQgYm90aCBza2lwcGVkIHRoZSBTU08gLyBzdGVwLXVwIC8gTUZBIHRoZSBicm93c2VyIGFscmVhZHkgZW5mb3JjZXMuXG4gKlxuICogVGhlIHNlc3Npb24gaXMgd3JpdHRlbiB0byB0aGUgY3JlZGVudGlhbCBzdG9yZSAoYH4vLnBpcGVsaW5lLW1hbmFnZXIvXG4gKiBjcmVkZW50aWFscy5qc29uYCwgb3duZXItb25seSksIHNvIHN1YnNlcXVlbnQgY29tbWFuZHMgYXV0aGVudGljYXRlIHdpdGggbm9cbiAqIGVudmlyb25tZW50IHZhcmlhYmxlIGF0IGFsbC4gYFBMQVRGT1JNX1RPS0VOYCBzdGlsbCB3aW5zIHdoZW4gaXQgaXMgc2V0LCB3aGljaFxuICogaXMgd2hhdCBDSSB1c2VzIOKAlCBhbiBhY2Nlc3Mga2V5IGZyb20gYGF1dGggcGF0YC5cbiAqXG4gKiBAcGFyYW0gcHJvZ3JhbSAtIFRoZSByb290IENvbW1hbmRlciBwcm9ncmFtIGluc3RhbmNlIHRvIGF0dGFjaCB0aGUgY29tbWFuZCB0by5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgYmFzaFxuICogcGlwZWxpbmUtbWFuYWdlciBhdXRoIGxvZ2luXG4gKiBwaXBlbGluZS1tYW5hZ2VyIGF1dGggbG9naW4gLS11cmwgaHR0cHM6Ly9wbGF0Zm9ybS5leGFtcGxlLmNvbSAtLW9yZyA8b3JnSWQ+XG4gKiBwaXBlbGluZS1tYW5hZ2VyIGF1dGggbG9naW4gLS1uby1icm93c2VyICAgICAgIyBwcmludCB0aGUgVVJMIGluc3RlYWQgb2Ygb3BlbmluZyBpdFxuICogZXZhbCAkKHBpcGVsaW5lLW1hbmFnZXIgYXV0aCBsb2dpbiAtLXF1aWV0KSAgICMgYWxzbyBleHBvcnQgUExBVEZPUk1fVE9LRU5cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9naW4ocHJvZ3JhbTogQ29tbWFuZCk6IHZvaWQge1xuICB3aXRoU3NsT3B0aW9ucyhwcm9ncmFtXG4gICAgLmNvbW1hbmQoJ2xvZ2luJylcbiAgICAuZGVzY3JpcHRpb24oJ1NpZ24gaW4gdGhyb3VnaCB5b3VyIGJyb3dzZXIgYW5kIHN0b3JlIHRoZSBzZXNzaW9uIChkZXZpY2UgYXV0aG9yaXphdGlvbiknKVxuICAgIC5vcHRpb24oJy0tb3JnIDxvcmdJZD4nLCAnU3dpdGNoIHRvIGEgc3BlY2lmaWMgb3JnYW5pemF0aW9uIGFmdGVyIHNpZ25pbmcgaW4nKVxuICAgIC5vcHRpb24oJy0tbm8tYnJvd3NlcicsICdOZXZlciBvcGVuIGEgYnJvd3NlciDigJQgcHJpbnQgdGhlIHZlcmlmaWNhdGlvbiBVUkwgaW5zdGVhZCcpXG4gICAgLm9wdGlvbignLS11cmwgPHVybD4nLCAnUGxhdGZvcm0gYmFzZSBVUkwnLCBwcm9jZXNzLmVudi5QTEFURk9STV9CQVNFX1VSTCB8fCAnaHR0cHM6Ly9sb2NhbGhvc3Q6ODQ0MycpKVxuICAgIC5vcHRpb24oJy0tcXVpZXQnLCAnT25seSBwcmludCB0aGUgZXhwb3J0IHN0YXRlbWVudCAodXNlZnVsIGZvciBldmFsKScpXG4gICAgLmFjdGlvbihhc3luYyAob3B0aW9ucykgPT4ge1xuICAgICAgY29uc3QgcXVpZXQgPSBvcHRpb25zLnF1aWV0ID8/IGZhbHNlO1xuICAgICAgY29uc3QgZXhlY3V0aW9uSWQgPSBwcmludENvbW1hbmRIZWFkZXIoJ0xvZ2luJywgJ1BsYXRmb3JtIEF1dGhlbnRpY2F0aW9uJywgeyBxdWlldCB9KTtcblxuICAgICAgLy8gU0VDVVJJVFk6IHRoZSBwb2xsIHJldHVybnMgc2Vzc2lvbiB0b2tlbnMg4oCUIGJlYXJlciBjcmVkZW50aWFscy4gTmV2ZXJcbiAgICAgIC8vIGZldGNoIHRoZW0gb3ZlciBhbiB1bnZlcmlmaWVkIFRMUyBjb25uZWN0aW9uIGluIHByb2R1Y3Rpb24uXG4gICAgICBhc3NlcnRDcmVkZW50aWFsVGxzQWxsb3dlZChvcHRpb25zLnZlcmlmeVNzbCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRyYW5zcG9ydCA9IHtcbiAgICAgICAgICB1cmw6IG9wdGlvbnMudXJsLFxuICAgICAgICAgIGh0dHBzQWdlbnQ6IGNyZWRlbnRpYWxIdHRwc0FnZW50KG9wdGlvbnMudmVyaWZ5U3NsKSxcbiAgICAgICAgICB0aW1lb3V0OiBUSU1FT1VUUy5IVFRQX1JFUVVFU1QsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCFxdWlldCkgcHJpbnRJbmZvKCdTdGFydGluZyBicm93c2VyIHNpZ24taW4nLCB7IHVybDogb3B0aW9ucy51cmwsIHZlcmlmeVNzbDogb3B0aW9ucy52ZXJpZnlTc2wgfSk7XG5cbiAgICAgICAgY29uc3QgY29kZSA9IGF3YWl0IHJlcXVlc3REZXZpY2VDb2RlKHRyYW5zcG9ydCk7XG4gICAgICAgIGNvbnN0IGFwcHJvdmFsVXJsID0gY29kZS52ZXJpZmljYXRpb25fdXJpX2NvbXBsZXRlIHx8IGNvZGUudmVyaWZpY2F0aW9uX3VyaTtcbiAgICAgICAgLy8gYC0tbm8tYnJvd3NlcmAgc2V0cyBvcHRpb25zLmJyb3dzZXIgdG8gZmFsc2UgKGNvbW1hbmRlcidzIC0tbm8tIHBhaXIpLlxuICAgICAgICBjb25zdCBvcGVuZWQgPSBvcHRpb25zLmJyb3dzZXIgIT09IGZhbHNlICYmIG9wZW5JbkJyb3dzZXIoYXBwcm92YWxVcmwpO1xuXG4gICAgICAgIC8vIFRoZSBwcm9tcHQgZ29lcyB0byBTVERFUlIgdW5kZXIgYC0tcXVpZXRgOiBzdGRvdXQgaXMgY2FwdHVyZWQgYnlcbiAgICAgICAgLy8gYGV2YWwgJCjigKYpYCwgc28gcHJpbnRpbmcgdGhlIGNvZGUgdGhlcmUgd291bGQgc3dhbGxvdyB0aGUgb25lIHRoaW5nXG4gICAgICAgIC8vIHRoZSB1c2VyIGhhcyB0byByZWFkIGJlZm9yZSBhbnl0aGluZyBjYW4gcHJvY2VlZC5cbiAgICAgICAgY29uc3Qgc2F5ID0gcXVpZXQgPyBjb25zb2xlLmVycm9yIDogY29uc29sZS5sb2c7XG4gICAgICAgIHNheSgnJyk7XG4gICAgICAgIHNheShgICBZb3VyIGNvZGU6ICAke2JvbGQoY3lhbihjb2RlLnVzZXJfY29kZSkpfWApO1xuICAgICAgICBzYXkoYCAgQXBwcm92ZSBhdDogJHtncmVlbihhcHByb3ZhbFVybCl9YCk7XG4gICAgICAgIHNheSgnJyk7XG4gICAgICAgIHNheShkaW0ob3BlbmVkXG4gICAgICAgICAgPyAnICBPcGVuaW5nIHlvdXIgYnJvd3NlcuKApiBhcHByb3ZlIHRoZSBjb2RlIHRoZXJlLCB0aGVuIGNvbWUgYmFjay4nXG4gICAgICAgICAgOiAnICBPcGVuIHRoYXQgVVJMIGluIGEgYnJvd3NlciwgY2hlY2sgdGhlIGNvZGUgbWF0Y2hlcywgYW5kIGFwcHJvdmUuJykpO1xuICAgICAgICBpZiAoIXF1aWV0KSBwcmludEluZm8oJ1dhaXRpbmcgZm9yIGFwcHJvdmFs4oCmJyk7XG5cbiAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHBvbGxGb3JEZXZpY2VUb2tlbih0cmFuc3BvcnQsIGNvZGUpO1xuXG4gICAgICAgIGxldCBhY2Nlc3NUb2tlbiA9IHNlc3Npb24uYWNjZXNzX3Rva2VuO1xuICAgICAgICBsZXQgcmVmcmVzaFRva2VuID0gc2Vzc2lvbi5yZWZyZXNoX3Rva2VuO1xuICAgICAgICBsZXQgZXhwaXJlc0luID0gc2Vzc2lvbi5leHBpcmVzX2luO1xuXG4gICAgICAgIC8vIFN3aXRjaGluZyByZS1pc3N1ZXMgKGFuZCByb3RhdGVzKSB0aGUgc2Vzc2lvbiwgc28gdGhlIHN0b3JlIGhhcyB0byB0YWtlXG4gICAgICAgIC8vIHRoZSBORVcgcGFpciDigJQga2VlcGluZyB0aGUgb2xkIHJlZnJlc2ggdG9rZW4gd291bGQgc3RyYW5kIHRoZSBzZXNzaW9uLlxuICAgICAgICBpZiAob3B0aW9ucy5vcmcpIHtcbiAgICAgICAgICBpZiAoIXF1aWV0KSBwcmludEluZm8oJ1N3aXRjaGluZyB0byBvcmdhbml6YXRpb24nLCB7IG9yZ0lkOiBvcHRpb25zLm9yZyB9KTtcbiAgICAgICAgICBjb25zdCBzd2l0Y2hlZCA9IGF3YWl0IHN3aXRjaE9yZ2FuaXphdGlvbih7XG4gICAgICAgICAgICB1cmw6IG9wdGlvbnMudXJsLFxuICAgICAgICAgICAgb3JnSWQ6IG9wdGlvbnMub3JnLFxuICAgICAgICAgICAgYWNjZXNzVG9rZW4sXG4gICAgICAgICAgICBodHRwc0FnZW50OiB0cmFuc3BvcnQuaHR0cHNBZ2VudCxcbiAgICAgICAgICAgIHRpbWVvdXQ6IFRJTUVPVVRTLkhUVFBfUkVRVUVTVCxcbiAgICAgICAgICAgIHF1aWV0LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGFjY2Vzc1Rva2VuID0gc3dpdGNoZWQuYWNjZXNzVG9rZW47XG4gICAgICAgICAgcmVmcmVzaFRva2VuID0gc3dpdGNoZWQucmVmcmVzaFRva2VuID8/IHJlZnJlc2hUb2tlbjtcbiAgICAgICAgICBleHBpcmVzSW4gPSBzd2l0Y2hlZC5leHBpcmVzSW4gPz8gZXhwaXJlc0luO1xuICAgICAgICB9XG5cbiAgICAgICAgc2F2ZVNlc3Npb24ob3B0aW9ucy51cmwsIHtcbiAgICAgICAgICBhY2Nlc3NUb2tlbixcbiAgICAgICAgICAuLi4ocmVmcmVzaFRva2VuID8geyByZWZyZXNoVG9rZW4gfSA6IHt9KSxcbiAgICAgICAgICBleHBpcmVzQXQ6IERhdGUubm93KCkgKyBleHBpcmVzSW4gKiAxMDAwLFxuICAgICAgICAgIC4uLihvcHRpb25zLm9yZyA/IHsgb3JnYW5pemF0aW9uSWQ6IG9wdGlvbnMub3JnIH0gOiB7fSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChxdWlldCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBleHBvcnQgUExBVEZPUk1fVE9LRU49JHthY2Nlc3NUb2tlbn1gKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgIHByaW50U3VjY2VzcygnU2lnbmVkIGluJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgcHJpbnRJbmZvKCdUaGUgc2Vzc2lvbiBpcyBzdG9yZWQgZm9yIHRoaXMgcGxhdGZvcm0g4oCUIG90aGVyIGNvbW1hbmRzIHBpY2sgaXQgdXAgYXV0b21hdGljYWxseS4nLCB7XG4gICAgICAgICAgc3RvcmU6IGNyZWRlbnRpYWxTdG9yZVBhdGgoKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgcHJpbnRJbmZvKCdUaXA6IHRvIGV4cG9ydCBpdCBpbnRvIHRoaXMgc2hlbGwgaW5zdGVhZDonKTtcbiAgICAgICAgY29uc29sZS5sb2coZ3JlZW4oYCAgZXZhbCAkKHBpcGVsaW5lLW1hbmFnZXIgYXV0aCBsb2dpbiR7b3B0aW9ucy5vcmcgPyBgIC0tb3JnICR7b3B0aW9ucy5vcmd9YCA6ICcnfSAtLXF1aWV0KWApKTtcbiAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICBwcmludEluZm8oJ1NpZ24gdGhpcyBkZXZpY2Ugb3V0IGFnYWluIGZyb20gU2V0dGluZ3Mg4oaSIFNlc3Npb25zIGFuZCBkZXZpY2VzLicpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRGV2aWNlQXV0aEVycm9yKSB7XG4gICAgICAgICAgcHJpbnRFcnJvcihgTG9naW4gZmFpbGVkOiAke2Vycm9yLm1lc3NhZ2V9YCwgeyByZWFzb246IGVycm9yLmNvZGUgfSk7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0KEVSUk9SX0NPREVTLkFVVEhFTlRJQ0FUSU9OKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXhpb3MuaXNBeGlvc0Vycm9yKGVycm9yKSkge1xuICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IGVycm9yLnJlc3BvbnNlPy5zdGF0dXM7XG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9IChlcnJvci5yZXNwb25zZT8uZGF0YSBhcyB7IG1lc3NhZ2U/OiBzdHJpbmcgfSk/Lm1lc3NhZ2U7XG4gICAgICAgICAgcHJpbnRFcnJvcignTG9naW4gZmFpbGVkJywgeyBzdGF0dXM6IHN0YXR1cyA/PyAnbm8gcmVzcG9uc2UnLCAuLi4obWVzc2FnZSA/IHsgbWVzc2FnZSB9IDoge30pIH0pO1xuICAgICAgICAgIHByb2Nlc3MuZXhpdChFUlJPUl9DT0RFUy5BVVRIRU5USUNBVElPTik7XG4gICAgICAgIH1cblxuICAgICAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuQVVUSEVOVElDQVRJT04sIHtcbiAgICAgICAgICBkZWJ1ZzogcHJvZ3JhbS5vcHRzKCkuZGVidWcsXG4gICAgICAgICAgZXhpdDogdHJ1ZSxcbiAgICAgICAgICBjb250ZXh0OiB7IGNvbW1hbmQ6ICdsb2dpbicsIGV4ZWN1dGlvbklkLCB1cmw6IG9wdGlvbnMudXJsIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xufVxuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"setup-events.d.ts","sourceRoot":"","sources":["../../src/commands/setup-events.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4JlD"}
1
+ {"version":3,"file":"setup-events.d.ts","sourceRoot":"","sources":["../../src/commands/setup-events.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6JlD"}
@@ -39,7 +39,7 @@ export function setupEvents(program) {
39
39
  .option('--package-version <version>', 'pipeline-events package version (default: latest)')
40
40
  .option('-u, --identifier <identifier>', 'Username or email to mint a token when PLATFORM_TOKEN is unset (for deriving the secret name)')
41
41
  .option('-p, --password <password>', 'Login password (used with --identifier)')))
42
- .option('--scoped-ingest', 'Point the ingestion Lambda at the dedicated least-privilege reporting-ingest secret (provision it first: `store-token --scope reporting:ingest --schedule`). The reporting service always requires the `reporting:ingest` scope on POST /reports/events.')
42
+ .option('--scoped-ingest', 'Point the ingestion Lambda at the dedicated least-privilege reporting-ingest secret — the service-account key provisioned by `store-token --scope reporting:ingest --schedule`. The reporting service always requires the `reporting:ingest` scope on POST /reports/events, so without that secret the Lambda 403s.')
43
43
  .option('--with-dora', 'Enable DORA lead-time enrichment in the ingestion Lambda: it resolves commit timestamps in-account (CodeCommit / the org github-token secret / CodeConnections). Off by default — extra SCM/secret cost. Enable only for orgs with the advanced_reporting add-on; re-run setup-events to toggle after purchase.')
44
44
  .action(async (options) => {
45
45
  const executionId = printCommandHeader('Setup Event Ingestion');
@@ -59,9 +59,10 @@ export function setupEvents(program) {
59
59
  // minted) when PLATFORM_SECRET_NAME isn't set — matching store-token, which
60
60
  // WROTE the secret at the same derived path. Logs in with
61
61
  // --email/--password or PLATFORM_IDENTIFIER/PLATFORM_PASSWORD if no token yet.
62
- // With --scoped-ingest, point at the dedicated reporting-ingest secret
63
- // (a least-privilege machine credential) instead of the shared platform
64
- // token — provision it with `store-token --scope reporting:ingest`.
62
+ // With --scoped-ingest, point at the dedicated reporting-ingest secret —
63
+ // a service-account key scoped to exactly `reporting:ingest` and nothing
64
+ // else — instead of the org's full-privilege platform credential. Provision
65
+ // it with `store-token --scope reporting:ingest`.
65
66
  let secretName = await resolvePlatformSecretName(options);
66
67
  if (options.scopedIngest) {
67
68
  secretName = secretName.replace(/\/platform$/, '/reporting-ingest');
@@ -165,4 +166,4 @@ export function setupEvents(program) {
165
166
  }
166
167
  });
167
168
  }
168
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXAtZXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3NldHVwLWV2ZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0MsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN6QyxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUN6QixPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDN0YsT0FBTyxFQUFFLFlBQVksRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BHLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckUsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM1RyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUV4RSwwREFBMEQ7QUFDMUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENB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QUNoQixjQUFjLEVBQUUsV0FBVztnQkFDM0IsUUFBUSxFQUFFLFNBQVMsQ0FBQyxpQkFBaUIsSUFBSSxXQUFXO2dCQUNwRCxhQUFhLEVBQUUsU0FBUyxDQUFDLGFBQWEsSUFBSSxtQkFBbUI7Z0JBQzdELG1CQUFtQixFQUFFLFNBQVMsQ0FBQyxrQkFBa0IsSUFBSSxtQkFBbUI7Z0JBQ3hFLGtCQUFrQixFQUFFLFNBQVMsQ0FBQyxhQUFhLElBQUksbUJBQW1CO2dCQUNsRSxRQUFRLEVBQUUsWUFBWTthQUN2QixDQUFDLENBQUM7WUFFSCxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2hCLFlBQVksQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1FBRXpELENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsV0FBVyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsV0FBVyxFQUFFO2dCQUMxQyxLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUs7Z0JBQzNCLElBQUksRUFBRSxJQUFJO2dCQUNWLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUU7YUFDckUsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBleGVjRmlsZVN5bmMgfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IENsb3VkRm9ybWF0aW9uQ2xpZW50LCBEZXNjcmliZVN0YWNrc0NvbW1hbmQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHsgTGFtYmRhQ2xpZW50LCBVcGRhdGVGdW5jdGlvbkNvZGVDb21tYW5kIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWxhbWJkYSc7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7IEVWRU5UU19TVEFDS19OQU1FIH0gZnJvbSAnLi4vY29uZmlnL2NsaS5jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgYXBwbHlBd3NQcm9maWxlLCByZXNvbHZlQXdzUmVnaW9uIH0gZnJvbSAnLi4vdXRpbHMvYXdzLWVudi5qcyc7XG5pbXBvcnQgeyBwcmludENvbW1hbmRIZWFkZXIsIHdpdGhQcm9maWxlT3B0aW9uLCB3aXRoUmVnaW9uT3B0aW9uIH0gZnJvbSAnLi4vdXRpbHMvY29tbWFuZC11dGlscy5qcyc7XG5pbXBvcnQgeyBFUlJPUl9DT0RFUywgaGFuZGxlRXJyb3IgfSBmcm9tICcuLi91dGlscy9lcnJvci1oYW5kbGVyLmpzJztcbmltcG9ydCB7IHByaW50RXJyb3IsIHByaW50SW5mbywgcHJpbnRLZXlWYWx1ZSwgcHJpbnRTZWN0aW9uLCBwcmludFN1Y2Nlc3MgfSBmcm9tICcuLi91dGlscy9vdXRwdXQtdXRpbHMuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZVBsYXRmb3JtU2VjcmV0TmFtZSB9IGZyb20gJy4uL3V0aWxzL3BsYXRmb3JtLXNlY3JldC5qcyc7XG5cbi8vIEVTTSBoYXMgbm8gX19kaXJuYW1lOyBkZXJpdmUgaXQgZnJvbSB0aGlzIG1vZHVsZSdzIFVSTC5cbmNvbnN0IF9fZGlybmFtZSA9IHBhdGguZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuXG5jb25zdCBTVEFDS19OQU1FID0gRVZFTlRTX1NUQUNLX05BTUU7XG4vLyBFeGlzdGluZyBDRk4tbWFuYWdlZCBMYW1iZGEgZnVuY3Rpb24gbmFtZSDigJQgZG8gTk9UIHJlbmFtZSB3aXRob3V0IGEgbWlncmF0aW9uIHBsYW5cbmNvbnN0IExBTUJEQV9OQU1FID0gJ3BpcGVsaW5lLWJ1aWxkZXItZXZlbnQtaW5nZXN0aW9uJztcbmNvbnN0IFBBQ0tBR0VfTkFNRSA9ICdAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1ldmVudHMnO1xuXG4vKipcbiAqIFJlZ2lzdGVycyB0aGUgYHNldHVwLWV2ZW50c2AgY29tbWFuZCB3aXRoIHRoZSBDTEkgcHJvZ3JhbS5cbiAqXG4gKiBEZXBsb3lzIEV2ZW50QnJpZGdlIOKGkiBTUVMg4oaSIExhbWJkYSBpbmZyYXN0cnVjdHVyZSBmb3IgcGlwZWxpbmUgcmVwb3J0aW5nLlxuICpcbiAqIDEuIERlcGxveXMgQ2xvdWRGb3JtYXRpb24gc3RhY2sgKHJ1bGUgKyBxdWV1ZSArIExhbWJkYSBzaGVsbCArIElBTSlcbiAqIDIuIERvd25sb2FkcyBAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1ldmVudHMgZnJvbSBucG0gcmVnaXN0cnlcbiAqIDMuIFVwbG9hZHMgaGFuZGxlciBjb2RlIGRpcmVjdGx5IHRvIExhbWJkYSAobm8gUzMgbmVlZGVkKVxuICpcbiAqIFVzZXMgUExBVEZPUk1fQkFTRV9VUkwgZnJvbSBlbnZpcm9ubWVudCAoc2FtZSBhcyBhbGwgb3RoZXIgY29tbWFuZHMpLlxuICogSWRlbXBvdGVudCDigJQgcnVubmluZyBhZ2FpbiB1cGRhdGVzIHRoZSBzdGFjayBhbmQgY29kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldHVwRXZlbnRzKHByb2dyYW06IENvbW1hbmQpOiB2b2lkIHtcbiAgd2l0aFByb2ZpbGVPcHRpb24oXG4gICAgd2l0aFJlZ2lvbk9wdGlvbihwcm9ncmFtXG4gICAgICAuY29tbWFuZCgnc2V0dXAtZXZlbnRzJylcbiAgICAgIC5kZXNjcmlwdGlvbignRGVwbG95IEV2ZW50QnJpZGdlIGV2ZW50IGluZ2VzdGlvbiBpbmZyYXN0cnVjdHVyZSBmb3IgcGlwZWxpbmUgcmVwb3J0aW5nJylcbiAgICAgIC5vcHRpb24oJy0tcGFja2FnZS12ZXJzaW9uIDx2ZXJzaW9uPicsICdwaXBlbGluZS1ldmVudHMgcGFja2FnZSB2ZXJzaW9uIChkZWZhdWx0OiBsYXRlc3QpJylcbiAgICAgIC5vcHRpb24oJy11LCAtLWlkZW50aWZpZXIgPGlkZW50aWZpZXI+JywgJ1VzZXJuYW1lIG9yIGVtYWlsIHRvIG1pbnQgYSB0b2tlbiB3aGVuIFBMQVRGT1JNX1RPS0VOIGlzIHVuc2V0IChmb3IgZGVyaXZpbmcgdGhlIHNlY3JldCBuYW1lKScpXG4gICAgICAub3B0aW9uKCctcCwgLS1wYXNzd29yZCA8cGFzc3dvcmQ+JywgJ0xvZ2luIHBhc3N3b3JkICh1c2VkIHdpdGggLS1pZGVudGlmaWVyKScpKSxcbiAgKVxuICAgIC5vcHRpb24oJy0tc2NvcGVkLWluZ2VzdCcsICdQb2ludCB0aGUgaW5nZXN0aW9uIExhbWJkYSBhdCB0aGUgZGVkaWNhdGVkIGxlYXN0LXByaXZpbGVnZSByZXBvcnRpbmctaW5nZXN0IHNlY3JldCAocHJvdmlzaW9uIGl0IGZpcnN0OiBgc3RvcmUtdG9rZW4gLS1zY29wZSByZXBvcnRpbmc6aW5nZXN0IC0tc2NoZWR1bGVgKS4gVGhlIHJlcG9ydGluZyBzZXJ2aWNlIGFsd2F5cyByZXF1aXJlcyB0aGUgYHJlcG9ydGluZzppbmdlc3RgIHNjb3BlIG9uIFBPU1QgL3JlcG9ydHMvZXZlbnRzLicpXG4gICAgLm9wdGlvbignLS13aXRoLWRvcmEnLCAnRW5hYmxlIERPUkEgbGVhZC10aW1lIGVucmljaG1lbnQgaW4gdGhlIGluZ2VzdGlvbiBMYW1iZGE6IGl0IHJlc29sdmVzIGNvbW1pdCB0aW1lc3RhbXBzIGluLWFjY291bnQgKENvZGVDb21taXQgLyB0aGUgb3JnIGdpdGh1Yi10b2tlbiBzZWNyZXQgLyBDb2RlQ29ubmVjdGlvbnMpLiBPZmYgYnkgZGVmYXVsdCDigJQgZXh0cmEgU0NNL3NlY3JldCBjb3N0LiBFbmFibGUgb25seSBmb3Igb3JncyB3aXRoIHRoZSBhZHZhbmNlZF9yZXBvcnRpbmcgYWRkLW9uOyByZS1ydW4gc2V0dXAtZXZlbnRzIHRvIHRvZ2dsZSBhZnRlciBwdXJjaGFzZS4nKVxuICAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgIGNvbnN0IGV4ZWN1dGlvbklkID0gcHJpbnRDb21tYW5kSGVhZGVyKCdTZXR1cCBFdmVudCBJbmdlc3Rpb24nKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVnaW9uID0gcmVzb2x2ZUF3c1JlZ2lvbihvcHRpb25zLnJlZ2lvbik7XG4gICAgICAgIC8vIEhvbm9yIC0tcHJvZmlsZSBmb3IgdGhlIFNESyBMYW1iZGEvQ2xvdWRGb3JtYXRpb24gY2xpZW50cyBiZWxvdy4gVGhlXG4gICAgICAgIC8vIGBjbG91ZGZvcm1hdGlvbiBkZXBsb3lgIENMSSBjYWxsIGFscmVhZHkgZ2V0cyAtLXByb2ZpbGU7IHdpdGhvdXQgdGhpcyB0aGVcbiAgICAgICAgLy8gU0RLIGNsaWVudHMgaGl0IHRoZSBERUZBVUxUIGFjY291bnQg4oaSIGRlcGxveSBhbmQgY29kZS11cGRhdGUvb3V0cHV0c1xuICAgICAgICAvLyB0YXJnZXQgZGlmZmVyZW50IGFjY291bnRzIChzaWxlbnQgc3BsaXQtYnJhaW4pLlxuICAgICAgICBhcHBseUF3c1Byb2ZpbGUob3B0aW9ucy5wcm9maWxlKTtcblxuICAgICAgICBjb25zdCBwbGF0Zm9ybVVybCA9IHByb2Nlc3MuZW52LlBMQVRGT1JNX0JBU0VfVVJMO1xuICAgICAgICBpZiAoIXBsYXRmb3JtVXJsKSB7XG4gICAgICAgICAgcHJpbnRFcnJvcignUExBVEZPUk1fQkFTRV9VUkwgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgcmVxdWlyZWQnKTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BMQVRGT1JNX0JBU0VfVVJMIG5vdCBzZXQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlcml2ZSB0aGUgc2VjcmV0IHBhdGggZnJvbSB0aGUgcGxhdGZvcm0gdG9rZW4gKHRoZSBvbmUgaW5pdC1wbGF0Zm9ybS5zaFxuICAgICAgICAvLyBtaW50ZWQpIHdoZW4gUExBVEZPUk1fU0VDUkVUX05BTUUgaXNuJ3Qgc2V0IOKAlCBtYXRjaGluZyBzdG9yZS10b2tlbiwgd2hpY2hcbiAgICAgICAgLy8gV1JPVEUgdGhlIHNlY3JldCBhdCB0aGUgc2FtZSBkZXJpdmVkIHBhdGguIExvZ3MgaW4gd2l0aFxuICAgICAgICAvLyAtLWVtYWlsLy0tcGFzc3dvcmQgb3IgUExBVEZPUk1fSURFTlRJRklFUi9QTEFURk9STV9QQVNTV09SRCBpZiBubyB0b2tlbiB5ZXQuXG4gICAgICAgIC8vIFdpdGggLS1zY29wZWQtaW5nZXN0LCBwb2ludCBhdCB0aGUgZGVkaWNhdGVkIHJlcG9ydGluZy1pbmdlc3Qgc2VjcmV0XG4gICAgICAgIC8vIChhIGxlYXN0LXByaXZpbGVnZSBtYWNoaW5lIGNyZWRlbnRpYWwpIGluc3RlYWQgb2YgdGhlIHNoYXJlZCBwbGF0Zm9ybVxuICAgICAgICAvLyB0b2tlbiDigJQgcHJvdmlzaW9uIGl0IHdpdGggYHN0b3JlLXRva2VuIC0tc2NvcGUgcmVwb3J0aW5nOmluZ2VzdGAuXG4gICAgICAgIGxldCBzZWNyZXROYW1lID0gYXdhaXQgcmVzb2x2ZVBsYXRmb3JtU2VjcmV0TmFtZShvcHRpb25zKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuc2NvcGVkSW5nZXN0KSB7XG4gICAgICAgICAgc2VjcmV0TmFtZSA9IHNlY3JldE5hbWUucmVwbGFjZSgvXFwvcGxhdGZvcm0kLywgJy9yZXBvcnRpbmctaW5nZXN0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBwcmludEluZm8oJ1BhcmFtZXRlcnMnLCB7XG4gICAgICAgICAgc3RhY2s6IFNUQUNLX05BTUUsXG4gICAgICAgICAgcmVnaW9uLFxuICAgICAgICAgIHBsYXRmb3JtVXJsLFxuICAgICAgICAgIHNlY3JldE5hbWUsXG4gICAgICAgICAgcGFja2FnZVZlcnNpb246IG9wdGlvbnMucGFja2FnZVZlcnNpb24gfHwgJ2xhdGVzdCcsXG4gICAgICAgICAgZG9yYTogb3B0aW9ucy53aXRoRG9yYSA/ICdlbmFibGVkIChjb21taXQgZW5yaWNobWVudCknIDogJ2Rpc2FibGVkJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU3RlcCAxOiBEZXBsb3kgQ2xvdWRGb3JtYXRpb24gKGluZnJhIG9ubHkg4oCUIExhbWJkYSBnZXRzIHBsYWNlaG9sZGVyIGNvZGUpXG4gICAgICAgIHByaW50U2VjdGlvbignRGVwbG95IEluZnJhc3RydWN0dXJlJyk7XG5cbiAgICAgICAgY29uc3QgdGVtcGxhdGVQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL3RlbXBsYXRlcy9ldmVudHMtc3RhY2suanNvbicpO1xuXG4gICAgICAgIGNvbnN0IGNmbkFyZ3MgPSBbXG4gICAgICAgICAgJ2Nsb3VkZm9ybWF0aW9uJywgJ2RlcGxveScsXG4gICAgICAgICAgJy0tc3RhY2stbmFtZScsIFNUQUNLX05BTUUsXG4gICAgICAgICAgJy0tdGVtcGxhdGUtZmlsZScsIHRlbXBsYXRlUGF0aCxcbiAgICAgICAgICAnLS1wYXJhbWV0ZXItb3ZlcnJpZGVzJyxcbiAgICAgICAgICBgUGxhdGZvcm1CYXNlVXJsPSR7cGxhdGZvcm1Vcmx9YCxcbiAgICAgICAgICBgUGxhdGZvcm1TZWNyZXROYW1lPSR7c2VjcmV0TmFtZX1gLFxuICAgICAgICAgIGBEb3JhRW5hYmxlZD0ke29wdGlvbnMud2l0aERvcmEgPyAndHJ1ZScgOiAnZmFsc2UnfWAsXG4gICAgICAgICAgJy0tY2FwYWJpbGl0aWVzJywgJ0NBUEFCSUxJVFlfTkFNRURfSUFNJyxcbiAgICAgICAgICAnLS1uby1mYWlsLW9uLWVtcHR5LWNoYW5nZXNldCcsXG4gICAgICAgICAgJy0tcmVnaW9uJywgcmVnaW9uLFxuICAgICAgICBdO1xuICAgICAgICBpZiAob3B0aW9ucy5wcm9maWxlKSBjZm5BcmdzLnB1c2goJy0tcHJvZmlsZScsIG9wdGlvbnMucHJvZmlsZSk7XG5cbiAgICAgICAgZXhlY0ZpbGVTeW5jKCdhd3MnLCBjZm5BcmdzLCB7IHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG5cbiAgICAgICAgcHJpbnRTdWNjZXNzKCdJbmZyYXN0cnVjdHVyZSBkZXBsb3llZCcpO1xuXG4gICAgICAgIC8vIFN0ZXAgMjogRG93bmxvYWQgaGFuZGxlciBmcm9tIHJlZ2lzdHJ5IGFuZCB1cGxvYWQgdG8gTGFtYmRhXG4gICAgICAgIHByaW50U2VjdGlvbignRGVwbG95IExhbWJkYSBDb2RlJyk7XG5cbiAgICAgICAgY29uc3QgdG1wRGlyID0gZnMubWtkdGVtcFN5bmMocGF0aC5qb2luKG9zLnRtcGRpcigpLCAnZXZlbnQtaW5nZXN0aW9uLScpKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHZlcnNpb25TcGVjID0gb3B0aW9ucy5wYWNrYWdlVmVyc2lvbiA/IGAke1BBQ0tBR0VfTkFNRX1AJHtvcHRpb25zLnBhY2thZ2VWZXJzaW9ufWAgOiBQQUNLQUdFX05BTUU7XG4gICAgICAgICAgcHJpbnRJbmZvKCdJbnN0YWxsaW5nIGZyb20gcmVnaXN0cnknLCB7IHBhY2thZ2U6IHZlcnNpb25TcGVjIH0pO1xuXG4gICAgICAgICAgLy8gSXNvbGF0ZSB0aGUgbnBtIGNhY2hlIGluc2lkZSB0aGUgdGVtcCBkaXIgc28gdGhlIGRlcGxveSBuZXZlciBkZXBlbmRzIG9uXG4gICAgICAgICAgLy8gKG9yIHRyaXBzIG92ZXIpIGEgbWlzY29uZmlndXJlZCBzaGFyZWQgfi8ubnBtIGNhY2hlIOKAlCBlLmcuIEVBQ0NFUy9FRVhJU1RcbiAgICAgICAgICAvLyBsZWZ0IGJlaGluZCBieSBhIHByaW9yIGBzdWRvIG5wbWAgcnVuLiBNaXJyb3JzIHRoZSB0b2tlbi1yZW5ldyBoYW5kbGVyLlxuICAgICAgICAgIGV4ZWNGaWxlU3luYygnbnBtJywgWydpbnN0YWxsJywgJy0tcHJlZml4JywgdG1wRGlyLCAnLS1uby1hdWRpdCcsICctLW5vLWZ1bmQnLCB2ZXJzaW9uU3BlY10sIHtcbiAgICAgICAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICAgICAgICBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIG5wbV9jb25maWdfY2FjaGU6IHBhdGguam9pbih0bXBEaXIsICcubnBtLWNhY2hlJykgfSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IGhhbmRsZXJTcmMgPSBwYXRoLmpvaW4odG1wRGlyLCAnbm9kZV9tb2R1bGVzJywgUEFDS0FHRV9OQU1FLCAnbGliJywgJ2luZGV4LmpzJyk7XG4gICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGhhbmRsZXJTcmMpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhhbmRsZXIgbm90IGZvdW5kIGF0ICR7aGFuZGxlclNyY30uIEVuc3VyZSB0aGUgcGFja2FnZSBpcyBwdWJsaXNoZWQuYCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gR2V0IHZlcnNpb24gZnJvbSBpbnN0YWxsZWQgcGFja2FnZVxuICAgICAgICAgIGNvbnN0IHBrZ0pzb25QYXRoID0gcGF0aC5qb2luKHRtcERpciwgJ25vZGVfbW9kdWxlcycsIFBBQ0tBR0VfTkFNRSwgJ3BhY2thZ2UuanNvbicpO1xuICAgICAgICAgIGNvbnN0IHBrZ0pzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwa2dKc29uUGF0aCwgJ3V0Zi04JykpO1xuICAgICAgICAgIGNvbnN0IHZlcnNpb24gPSBwa2dKc29uLnZlcnNpb24gfHwgJ3Vua25vd24nO1xuXG4gICAgICAgICAgLy8gcGlwZWxpbmUtZXZlbnRzIGlzIEVTTSAoXCJ0eXBlXCI6XCJtb2R1bGVcIiksIHNvIHRoZSBMYW1iZGEgZW50cnkgbXVzdCBiZVxuICAgICAgICAgIC8vIGluZGV4Lm1qcy4gQSBwbGFpbiBpbmRleC5qcyB3aXRoIG5vIHBhY2thZ2UuanNvbiBpbiB0aGUgemlwIGlzIGxvYWRlZCBhc1xuICAgICAgICAgIC8vIENvbW1vbkpTIGJ5IG5vZGVqczI0LnggYW5kIGZhaWxzIGF0IGluaXQgd2l0aCBcIkNhbm5vdCB1c2UgaW1wb3J0IHN0YXRlbWVudFxuICAgICAgICAgIC8vIG91dHNpZGUgYSBtb2R1bGVcIi4gVGhlIC5tanMgZXh0ZW5zaW9uIGZvcmNlcyBFU007IEhhbmRsZXIgc3RheXNcbiAgICAgICAgICAvLyBpbmRleC5oYW5kbGVyICh0aGUgcnVudGltZSByZXNvbHZlcyB0aGUgLm1qcyBmaWxlKS4gbGliL2luZGV4LmpzIGlzIGFcbiAgICAgICAgICAvLyBzZWxmLWNvbnRhaW5lZCBidW5kbGUgKG5vIHJlbGF0aXZlIGltcG9ydHMpLCBzbyB0aGUgc2luZ2xlIGZpbGUgc3VmZmljZXMuXG4gICAgICAgICAgY29uc3QgbWpzUGF0aCA9IHBhdGguam9pbih0bXBEaXIsICdpbmRleC5tanMnKTtcbiAgICAgICAgICBmcy5jb3B5RmlsZVN5bmMoaGFuZGxlclNyYywgbWpzUGF0aCk7XG4gICAgICAgICAgY29uc3QgemlwUGF0aCA9IHBhdGguam9pbih0bXBEaXIsICdpbmRleC56aXAnKTtcbiAgICAgICAgICBleGVjRmlsZVN5bmMoJ3ppcCcsIFsnLWonLCB6aXBQYXRoLCAnaW5kZXgubWpzJ10sIHsgY3dkOiB0bXBEaXIsIHN0ZGlvOiAncGlwZScgfSk7XG5cbiAgICAgICAgICAvLyBVcGxvYWQgZGlyZWN0bHkgdG8gTGFtYmRhIHZpYSBTREsgKG5vIFMzIG5lZWRlZClcbiAgICAgICAgICBwcmludEluZm8oJ1VwbG9hZGluZyBjb2RlIHRvIExhbWJkYScsIHsgZnVuY3Rpb246IExBTUJEQV9OQU1FLCB2ZXJzaW9uIH0pO1xuXG4gICAgICAgICAgY29uc3QgbGFtYmRhQ2xpZW50ID0gbmV3IExhbWJkYUNsaWVudCh7IHJlZ2lvbiB9KTtcbiAgICAgICAgICBhd2FpdCBsYW1iZGFDbGllbnQuc2VuZChuZXcgVXBkYXRlRnVuY3Rpb25Db2RlQ29tbWFuZCh7XG4gICAgICAgICAgICBGdW5jdGlvbk5hbWU6IExBTUJEQV9OQU1FLFxuICAgICAgICAgICAgWmlwRmlsZTogZnMucmVhZEZpbGVTeW5jKHppcFBhdGgpLFxuICAgICAgICAgIH0pKTtcblxuICAgICAgICAgIHByaW50U3VjY2VzcyhgTGFtYmRhIGNvZGUgZGVwbG95ZWQgKCR7UEFDS0FHRV9OQU1FfUAke3ZlcnNpb259KWApO1xuXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgZnMucm1TeW5jKHRtcERpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RlcCAzOiBTaG93IG91dHB1dHMgdmlhIFNES1xuICAgICAgICBjb25zdCBjZm5DbGllbnQgPSBuZXcgQ2xvdWRGb3JtYXRpb25DbGllbnQoeyByZWdpb24gfSk7XG4gICAgICAgIGNvbnN0IGRlc2NyaWJlUmVzdWx0ID0gYXdhaXQgY2ZuQ2xpZW50LnNlbmQobmV3IERlc2NyaWJlU3RhY2tzQ29tbWFuZCh7IFN0YWNrTmFtZTogU1RBQ0tfTkFNRSB9KSk7XG4gICAgICAgIGNvbnN0IG91dHB1dHMgPSBkZXNjcmliZVJlc3VsdC5TdGFja3M/LlswXT8uT3V0cHV0cyA/PyBbXTtcbiAgICAgICAgY29uc3Qgb3V0cHV0TWFwID0gT2JqZWN0LmZyb21FbnRyaWVzKG91dHB1dHMubWFwKG8gPT4gW28uT3V0cHV0S2V5ID8/ICcnLCBvLk91dHB1dFZhbHVlID8/ICcnXSkpO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgcHJpbnRTZWN0aW9uKCdFdmVudCBJbmdlc3Rpb24gUmVhZHknKTtcblxuICAgICAgICBwcmludEtleVZhbHVlKHtcbiAgICAgICAgICAnU3RhY2snOiBTVEFDS19OQU1FLFxuICAgICAgICAgICdSZWdpb24nOiByZWdpb24sXG4gICAgICAgICAgJ1BsYXRmb3JtIFVSTCc6IHBsYXRmb3JtVXJsLFxuICAgICAgICAgICdMYW1iZGEnOiBvdXRwdXRNYXAuTGFtYmRhRnVuY3Rpb25Bcm4gfHwgTEFNQkRBX05BTUUsXG4gICAgICAgICAgJ0V2ZW50IFF1ZXVlJzogb3V0cHV0TWFwLkV2ZW50UXVldWVVcmwgfHwgJyhzZWUgQVdTIGNvbnNvbGUpJyxcbiAgICAgICAgICAnRGVhZCBMZXR0ZXIgUXVldWUnOiBvdXRwdXRNYXAuRGVhZExldHRlclF1ZXVlVXJsIHx8ICcoc2VlIEFXUyBjb25zb2xlKScsXG4gICAgICAgICAgJ0V2ZW50QnJpZGdlIFJ1bGUnOiBvdXRwdXRNYXAuRXZlbnRSdWxlTmFtZSB8fCAnKHNlZSBBV1MgY29uc29sZSknLFxuICAgICAgICAgICdTdGF0dXMnOiAn4pyTIERlcGxveWVkJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICBwcmludFN1Y2Nlc3MoJ0V2ZW50QnJpZGdlIGV2ZW50IGluZ2VzdGlvbiBpcyBhY3RpdmUuJyk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZUVycm9yKGVycm9yLCBFUlJPUl9DT0RFUy5BUElfUkVRVUVTVCwge1xuICAgICAgICAgIGRlYnVnOiBwcm9ncmFtLm9wdHMoKS5kZWJ1ZyxcbiAgICAgICAgICBleGl0OiB0cnVlLFxuICAgICAgICAgIGNvbnRleHQ6IHsgY29tbWFuZDogJ3NldHVwLWV2ZW50cycsIGV4ZWN1dGlvbklkLCBzdGFjazogU1RBQ0tfTkFNRSB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbn1cbiJdfQ==
169
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXAtZXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3NldHVwLWV2ZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0MsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN6QyxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUN6QixPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDN0YsT0FBTyxFQUFFLFlBQVksRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BHLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckUsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM1RyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUV4RSwwREFBMEQ7QUFDMUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENB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LEVBQUUsTUFBTTtnQkFDaEIsY0FBYyxFQUFFLFdBQVc7Z0JBQzNCLFFBQVEsRUFBRSxTQUFTLENBQUMsaUJBQWlCLElBQUksV0FBVztnQkFDcEQsYUFBYSxFQUFFLFNBQVMsQ0FBQyxhQUFhLElBQUksbUJBQW1CO2dCQUM3RCxtQkFBbUIsRUFBRSxTQUFTLENBQUMsa0JBQWtCLElBQUksbUJBQW1CO2dCQUN4RSxrQkFBa0IsRUFBRSxTQUFTLENBQUMsYUFBYSxJQUFJLG1CQUFtQjtnQkFDbEUsUUFBUSxFQUFFLFlBQVk7YUFDdkIsQ0FBQyxDQUFDO1lBRUgsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNoQixZQUFZLENBQUMsd0NBQXdDLENBQUMsQ0FBQztRQUV6RCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLFdBQVcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLFdBQVcsRUFBRTtnQkFDMUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLO2dCQUMzQixJQUFJLEVBQUUsSUFBSTtnQkFDVixPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO2FBQ3JFLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgZXhlY0ZpbGVTeW5jIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBDbG91ZEZvcm1hdGlvbkNsaWVudCwgRGVzY3JpYmVTdGFja3NDb21tYW5kIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWNsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB7IExhbWJkYUNsaWVudCwgVXBkYXRlRnVuY3Rpb25Db2RlQ29tbWFuZCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1sYW1iZGEnO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBFVkVOVFNfU1RBQ0tfTkFNRSB9IGZyb20gJy4uL2NvbmZpZy9jbGkuY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IGFwcGx5QXdzUHJvZmlsZSwgcmVzb2x2ZUF3c1JlZ2lvbiB9IGZyb20gJy4uL3V0aWxzL2F3cy1lbnYuanMnO1xuaW1wb3J0IHsgcHJpbnRDb21tYW5kSGVhZGVyLCB3aXRoUHJvZmlsZU9wdGlvbiwgd2l0aFJlZ2lvbk9wdGlvbiB9IGZyb20gJy4uL3V0aWxzL2NvbW1hbmQtdXRpbHMuanMnO1xuaW1wb3J0IHsgRVJST1JfQ09ERVMsIGhhbmRsZUVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZXJyb3ItaGFuZGxlci5qcyc7XG5pbXBvcnQgeyBwcmludEVycm9yLCBwcmludEluZm8sIHByaW50S2V5VmFsdWUsIHByaW50U2VjdGlvbiwgcHJpbnRTdWNjZXNzIH0gZnJvbSAnLi4vdXRpbHMvb3V0cHV0LXV0aWxzLmpzJztcbmltcG9ydCB7IHJlc29sdmVQbGF0Zm9ybVNlY3JldE5hbWUgfSBmcm9tICcuLi91dGlscy9wbGF0Zm9ybS1zZWNyZXQuanMnO1xuXG4vLyBFU00gaGFzIG5vIF9fZGlybmFtZTsgZGVyaXZlIGl0IGZyb20gdGhpcyBtb2R1bGUncyBVUkwuXG5jb25zdCBfX2Rpcm5hbWUgPSBwYXRoLmRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcblxuY29uc3QgU1RBQ0tfTkFNRSA9IEVWRU5UU19TVEFDS19OQU1FO1xuLy8gRXhpc3RpbmcgQ0ZOLW1hbmFnZWQgTGFtYmRhIGZ1bmN0aW9uIG5hbWUg4oCUIGRvIE5PVCByZW5hbWUgd2l0aG91dCBhIG1pZ3JhdGlvbiBwbGFuXG5jb25zdCBMQU1CREFfTkFNRSA9ICdwaXBlbGluZS1idWlsZGVyLWV2ZW50LWluZ2VzdGlvbic7XG5jb25zdCBQQUNLQUdFX05BTUUgPSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZXZlbnRzJztcblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIGBzZXR1cC1ldmVudHNgIGNvbW1hbmQgd2l0aCB0aGUgQ0xJIHByb2dyYW0uXG4gKlxuICogRGVwbG95cyBFdmVudEJyaWRnZSDihpIgU1FTIOKGkiBMYW1iZGEgaW5mcmFzdHJ1Y3R1cmUgZm9yIHBpcGVsaW5lIHJlcG9ydGluZy5cbiAqXG4gKiAxLiBEZXBsb3lzIENsb3VkRm9ybWF0aW9uIHN0YWNrIChydWxlICsgcXVldWUgKyBMYW1iZGEgc2hlbGwgKyBJQU0pXG4gKiAyLiBEb3dubG9hZHMgQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZXZlbnRzIGZyb20gbnBtIHJlZ2lzdHJ5XG4gKiAzLiBVcGxvYWRzIGhhbmRsZXIgY29kZSBkaXJlY3RseSB0byBMYW1iZGEgKG5vIFMzIG5lZWRlZClcbiAqXG4gKiBVc2VzIFBMQVRGT1JNX0JBU0VfVVJMIGZyb20gZW52aXJvbm1lbnQgKHNhbWUgYXMgYWxsIG90aGVyIGNvbW1hbmRzKS5cbiAqIElkZW1wb3RlbnQg4oCUIHJ1bm5pbmcgYWdhaW4gdXBkYXRlcyB0aGUgc3RhY2sgYW5kIGNvZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cEV2ZW50cyhwcm9ncmFtOiBDb21tYW5kKTogdm9pZCB7XG4gIHdpdGhQcm9maWxlT3B0aW9uKFxuICAgIHdpdGhSZWdpb25PcHRpb24ocHJvZ3JhbVxuICAgICAgLmNvbW1hbmQoJ3NldHVwLWV2ZW50cycpXG4gICAgICAuZGVzY3JpcHRpb24oJ0RlcGxveSBFdmVudEJyaWRnZSBldmVudCBpbmdlc3Rpb24gaW5mcmFzdHJ1Y3R1cmUgZm9yIHBpcGVsaW5lIHJlcG9ydGluZycpXG4gICAgICAub3B0aW9uKCctLXBhY2thZ2UtdmVyc2lvbiA8dmVyc2lvbj4nLCAncGlwZWxpbmUtZXZlbnRzIHBhY2thZ2UgdmVyc2lvbiAoZGVmYXVsdDogbGF0ZXN0KScpXG4gICAgICAub3B0aW9uKCctdSwgLS1pZGVudGlmaWVyIDxpZGVudGlmaWVyPicsICdVc2VybmFtZSBvciBlbWFpbCB0byBtaW50IGEgdG9rZW4gd2hlbiBQTEFURk9STV9UT0tFTiBpcyB1bnNldCAoZm9yIGRlcml2aW5nIHRoZSBzZWNyZXQgbmFtZSknKVxuICAgICAgLm9wdGlvbignLXAsIC0tcGFzc3dvcmQgPHBhc3N3b3JkPicsICdMb2dpbiBwYXNzd29yZCAodXNlZCB3aXRoIC0taWRlbnRpZmllciknKSksXG4gIClcbiAgICAub3B0aW9uKCctLXNjb3BlZC1pbmdlc3QnLCAnUG9pbnQgdGhlIGluZ2VzdGlvbiBMYW1iZGEgYXQgdGhlIGRlZGljYXRlZCBsZWFzdC1wcml2aWxlZ2UgcmVwb3J0aW5nLWluZ2VzdCBzZWNyZXQg4oCUIHRoZSBzZXJ2aWNlLWFjY291bnQga2V5IHByb3Zpc2lvbmVkIGJ5IGBzdG9yZS10b2tlbiAtLXNjb3BlIHJlcG9ydGluZzppbmdlc3QgLS1zY2hlZHVsZWAuIFRoZSByZXBvcnRpbmcgc2VydmljZSBhbHdheXMgcmVxdWlyZXMgdGhlIGByZXBvcnRpbmc6aW5nZXN0YCBzY29wZSBvbiBQT1NUIC9yZXBvcnRzL2V2ZW50cywgc28gd2l0aG91dCB0aGF0IHNlY3JldCB0aGUgTGFtYmRhIDQwM3MuJylcbiAgICAub3B0aW9uKCctLXdpdGgtZG9yYScsICdFbmFibGUgRE9SQSBsZWFkLXRpbWUgZW5yaWNobWVudCBpbiB0aGUgaW5nZXN0aW9uIExhbWJkYTogaXQgcmVzb2x2ZXMgY29tbWl0IHRpbWVzdGFtcHMgaW4tYWNjb3VudCAoQ29kZUNvbW1pdCAvIHRoZSBvcmcgZ2l0aHViLXRva2VuIHNlY3JldCAvIENvZGVDb25uZWN0aW9ucykuIE9mZiBieSBkZWZhdWx0IOKAlCBleHRyYSBTQ00vc2VjcmV0IGNvc3QuIEVuYWJsZSBvbmx5IGZvciBvcmdzIHdpdGggdGhlIGFkdmFuY2VkX3JlcG9ydGluZyBhZGQtb247IHJlLXJ1biBzZXR1cC1ldmVudHMgdG8gdG9nZ2xlIGFmdGVyIHB1cmNoYXNlLicpXG4gICAgLmFjdGlvbihhc3luYyAob3B0aW9ucykgPT4ge1xuICAgICAgY29uc3QgZXhlY3V0aW9uSWQgPSBwcmludENvbW1hbmRIZWFkZXIoJ1NldHVwIEV2ZW50IEluZ2VzdGlvbicpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWdpb24gPSByZXNvbHZlQXdzUmVnaW9uKG9wdGlvbnMucmVnaW9uKTtcbiAgICAgICAgLy8gSG9ub3IgLS1wcm9maWxlIGZvciB0aGUgU0RLIExhbWJkYS9DbG91ZEZvcm1hdGlvbiBjbGllbnRzIGJlbG93LiBUaGVcbiAgICAgICAgLy8gYGNsb3VkZm9ybWF0aW9uIGRlcGxveWAgQ0xJIGNhbGwgYWxyZWFkeSBnZXRzIC0tcHJvZmlsZTsgd2l0aG91dCB0aGlzIHRoZVxuICAgICAgICAvLyBTREsgY2xpZW50cyBoaXQgdGhlIERFRkFVTFQgYWNjb3VudCDihpIgZGVwbG95IGFuZCBjb2RlLXVwZGF0ZS9vdXRwdXRzXG4gICAgICAgIC8vIHRhcmdldCBkaWZmZXJlbnQgYWNjb3VudHMgKHNpbGVudCBzcGxpdC1icmFpbikuXG4gICAgICAgIGFwcGx5QXdzUHJvZmlsZShvcHRpb25zLnByb2ZpbGUpO1xuXG4gICAgICAgIGNvbnN0IHBsYXRmb3JtVXJsID0gcHJvY2Vzcy5lbnYuUExBVEZPUk1fQkFTRV9VUkw7XG4gICAgICAgIGlmICghcGxhdGZvcm1VcmwpIHtcbiAgICAgICAgICBwcmludEVycm9yKCdQTEFURk9STV9CQVNFX1VSTCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyByZXF1aXJlZCcpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUExBVEZPUk1fQkFTRV9VUkwgbm90IHNldCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVyaXZlIHRoZSBzZWNyZXQgcGF0aCBmcm9tIHRoZSBwbGF0Zm9ybSB0b2tlbiAodGhlIG9uZSBpbml0LXBsYXRmb3JtLnNoXG4gICAgICAgIC8vIG1pbnRlZCkgd2hlbiBQTEFURk9STV9TRUNSRVRfTkFNRSBpc24ndCBzZXQg4oCUIG1hdGNoaW5nIHN0b3JlLXRva2VuLCB3aGljaFxuICAgICAgICAvLyBXUk9URSB0aGUgc2VjcmV0IGF0IHRoZSBzYW1lIGRlcml2ZWQgcGF0aC4gTG9ncyBpbiB3aXRoXG4gICAgICAgIC8vIC0tZW1haWwvLS1wYXNzd29yZCBvciBQTEFURk9STV9JREVOVElGSUVSL1BMQVRGT1JNX1BBU1NXT1JEIGlmIG5vIHRva2VuIHlldC5cbiAgICAgICAgLy8gV2l0aCAtLXNjb3BlZC1pbmdlc3QsIHBvaW50IGF0IHRoZSBkZWRpY2F0ZWQgcmVwb3J0aW5nLWluZ2VzdCBzZWNyZXQg4oCUXG4gICAgICAgIC8vIGEgc2VydmljZS1hY2NvdW50IGtleSBzY29wZWQgdG8gZXhhY3RseSBgcmVwb3J0aW5nOmluZ2VzdGAgYW5kIG5vdGhpbmdcbiAgICAgICAgLy8gZWxzZSDigJQgaW5zdGVhZCBvZiB0aGUgb3JnJ3MgZnVsbC1wcml2aWxlZ2UgcGxhdGZvcm0gY3JlZGVudGlhbC4gUHJvdmlzaW9uXG4gICAgICAgIC8vIGl0IHdpdGggYHN0b3JlLXRva2VuIC0tc2NvcGUgcmVwb3J0aW5nOmluZ2VzdGAuXG4gICAgICAgIGxldCBzZWNyZXROYW1lID0gYXdhaXQgcmVzb2x2ZVBsYXRmb3JtU2VjcmV0TmFtZShvcHRpb25zKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuc2NvcGVkSW5nZXN0KSB7XG4gICAgICAgICAgc2VjcmV0TmFtZSA9IHNlY3JldE5hbWUucmVwbGFjZSgvXFwvcGxhdGZvcm0kLywgJy9yZXBvcnRpbmctaW5nZXN0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBwcmludEluZm8oJ1BhcmFtZXRlcnMnLCB7XG4gICAgICAgICAgc3RhY2s6IFNUQUNLX05BTUUsXG4gICAgICAgICAgcmVnaW9uLFxuICAgICAgICAgIHBsYXRmb3JtVXJsLFxuICAgICAgICAgIHNlY3JldE5hbWUsXG4gICAgICAgICAgcGFja2FnZVZlcnNpb246IG9wdGlvbnMucGFja2FnZVZlcnNpb24gfHwgJ2xhdGVzdCcsXG4gICAgICAgICAgZG9yYTogb3B0aW9ucy53aXRoRG9yYSA/ICdlbmFibGVkIChjb21taXQgZW5yaWNobWVudCknIDogJ2Rpc2FibGVkJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU3RlcCAxOiBEZXBsb3kgQ2xvdWRGb3JtYXRpb24gKGluZnJhIG9ubHkg4oCUIExhbWJkYSBnZXRzIHBsYWNlaG9sZGVyIGNvZGUpXG4gICAgICAgIHByaW50U2VjdGlvbignRGVwbG95IEluZnJhc3RydWN0dXJlJyk7XG5cbiAgICAgICAgY29uc3QgdGVtcGxhdGVQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL3RlbXBsYXRlcy9ldmVudHMtc3RhY2suanNvbicpO1xuXG4gICAgICAgIGNvbnN0IGNmbkFyZ3MgPSBbXG4gICAgICAgICAgJ2Nsb3VkZm9ybWF0aW9uJywgJ2RlcGxveScsXG4gICAgICAgICAgJy0tc3RhY2stbmFtZScsIFNUQUNLX05BTUUsXG4gICAgICAgICAgJy0tdGVtcGxhdGUtZmlsZScsIHRlbXBsYXRlUGF0aCxcbiAgICAgICAgICAnLS1wYXJhbWV0ZXItb3ZlcnJpZGVzJyxcbiAgICAgICAgICBgUGxhdGZvcm1CYXNlVXJsPSR7cGxhdGZvcm1Vcmx9YCxcbiAgICAgICAgICBgUGxhdGZvcm1TZWNyZXROYW1lPSR7c2VjcmV0TmFtZX1gLFxuICAgICAgICAgIGBEb3JhRW5hYmxlZD0ke29wdGlvbnMud2l0aERvcmEgPyAndHJ1ZScgOiAnZmFsc2UnfWAsXG4gICAgICAgICAgJy0tY2FwYWJpbGl0aWVzJywgJ0NBUEFCSUxJVFlfTkFNRURfSUFNJyxcbiAgICAgICAgICAnLS1uby1mYWlsLW9uLWVtcHR5LWNoYW5nZXNldCcsXG4gICAgICAgICAgJy0tcmVnaW9uJywgcmVnaW9uLFxuICAgICAgICBdO1xuICAgICAgICBpZiAob3B0aW9ucy5wcm9maWxlKSBjZm5BcmdzLnB1c2goJy0tcHJvZmlsZScsIG9wdGlvbnMucHJvZmlsZSk7XG5cbiAgICAgICAgZXhlY0ZpbGVTeW5jKCdhd3MnLCBjZm5BcmdzLCB7IHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG5cbiAgICAgICAgcHJpbnRTdWNjZXNzKCdJbmZyYXN0cnVjdHVyZSBkZXBsb3llZCcpO1xuXG4gICAgICAgIC8vIFN0ZXAgMjogRG93bmxvYWQgaGFuZGxlciBmcm9tIHJlZ2lzdHJ5IGFuZCB1cGxvYWQgdG8gTGFtYmRhXG4gICAgICAgIHByaW50U2VjdGlvbignRGVwbG95IExhbWJkYSBDb2RlJyk7XG5cbiAgICAgICAgY29uc3QgdG1wRGlyID0gZnMubWtkdGVtcFN5bmMocGF0aC5qb2luKG9zLnRtcGRpcigpLCAnZXZlbnQtaW5nZXN0aW9uLScpKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHZlcnNpb25TcGVjID0gb3B0aW9ucy5wYWNrYWdlVmVyc2lvbiA/IGAke1BBQ0tBR0VfTkFNRX1AJHtvcHRpb25zLnBhY2thZ2VWZXJzaW9ufWAgOiBQQUNLQUdFX05BTUU7XG4gICAgICAgICAgcHJpbnRJbmZvKCdJbnN0YWxsaW5nIGZyb20gcmVnaXN0cnknLCB7IHBhY2thZ2U6IHZlcnNpb25TcGVjIH0pO1xuXG4gICAgICAgICAgLy8gSXNvbGF0ZSB0aGUgbnBtIGNhY2hlIGluc2lkZSB0aGUgdGVtcCBkaXIgc28gdGhlIGRlcGxveSBuZXZlciBkZXBlbmRzIG9uXG4gICAgICAgICAgLy8gKG9yIHRyaXBzIG92ZXIpIGEgbWlzY29uZmlndXJlZCBzaGFyZWQgfi8ubnBtIGNhY2hlIOKAlCBlLmcuIEVBQ0NFUy9FRVhJU1RcbiAgICAgICAgICAvLyBsZWZ0IGJlaGluZCBieSBhIHByaW9yIGBzdWRvIG5wbWAgcnVuLiBNaXJyb3JzIHRoZSB0b2tlbi1yZW5ldyBoYW5kbGVyLlxuICAgICAgICAgIGV4ZWNGaWxlU3luYygnbnBtJywgWydpbnN0YWxsJywgJy0tcHJlZml4JywgdG1wRGlyLCAnLS1uby1hdWRpdCcsICctLW5vLWZ1bmQnLCB2ZXJzaW9uU3BlY10sIHtcbiAgICAgICAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICAgICAgICBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIG5wbV9jb25maWdfY2FjaGU6IHBhdGguam9pbih0bXBEaXIsICcubnBtLWNhY2hlJykgfSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IGhhbmRsZXJTcmMgPSBwYXRoLmpvaW4odG1wRGlyLCAnbm9kZV9tb2R1bGVzJywgUEFDS0FHRV9OQU1FLCAnbGliJywgJ2luZGV4LmpzJyk7XG4gICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGhhbmRsZXJTcmMpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhhbmRsZXIgbm90IGZvdW5kIGF0ICR7aGFuZGxlclNyY30uIEVuc3VyZSB0aGUgcGFja2FnZSBpcyBwdWJsaXNoZWQuYCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gR2V0IHZlcnNpb24gZnJvbSBpbnN0YWxsZWQgcGFja2FnZVxuICAgICAgICAgIGNvbnN0IHBrZ0pzb25QYXRoID0gcGF0aC5qb2luKHRtcERpciwgJ25vZGVfbW9kdWxlcycsIFBBQ0tBR0VfTkFNRSwgJ3BhY2thZ2UuanNvbicpO1xuICAgICAgICAgIGNvbnN0IHBrZ0pzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwa2dKc29uUGF0aCwgJ3V0Zi04JykpO1xuICAgICAgICAgIGNvbnN0IHZlcnNpb24gPSBwa2dKc29uLnZlcnNpb24gfHwgJ3Vua25vd24nO1xuXG4gICAgICAgICAgLy8gcGlwZWxpbmUtZXZlbnRzIGlzIEVTTSAoXCJ0eXBlXCI6XCJtb2R1bGVcIiksIHNvIHRoZSBMYW1iZGEgZW50cnkgbXVzdCBiZVxuICAgICAgICAgIC8vIGluZGV4Lm1qcy4gQSBwbGFpbiBpbmRleC5qcyB3aXRoIG5vIHBhY2thZ2UuanNvbiBpbiB0aGUgemlwIGlzIGxvYWRlZCBhc1xuICAgICAgICAgIC8vIENvbW1vbkpTIGJ5IG5vZGVqczI0LnggYW5kIGZhaWxzIGF0IGluaXQgd2l0aCBcIkNhbm5vdCB1c2UgaW1wb3J0IHN0YXRlbWVudFxuICAgICAgICAgIC8vIG91dHNpZGUgYSBtb2R1bGVcIi4gVGhlIC5tanMgZXh0ZW5zaW9uIGZvcmNlcyBFU007IEhhbmRsZXIgc3RheXNcbiAgICAgICAgICAvLyBpbmRleC5oYW5kbGVyICh0aGUgcnVudGltZSByZXNvbHZlcyB0aGUgLm1qcyBmaWxlKS4gbGliL2luZGV4LmpzIGlzIGFcbiAgICAgICAgICAvLyBzZWxmLWNvbnRhaW5lZCBidW5kbGUgKG5vIHJlbGF0aXZlIGltcG9ydHMpLCBzbyB0aGUgc2luZ2xlIGZpbGUgc3VmZmljZXMuXG4gICAgICAgICAgY29uc3QgbWpzUGF0aCA9IHBhdGguam9pbih0bXBEaXIsICdpbmRleC5tanMnKTtcbiAgICAgICAgICBmcy5jb3B5RmlsZVN5bmMoaGFuZGxlclNyYywgbWpzUGF0aCk7XG4gICAgICAgICAgY29uc3QgemlwUGF0aCA9IHBhdGguam9pbih0bXBEaXIsICdpbmRleC56aXAnKTtcbiAgICAgICAgICBleGVjRmlsZVN5bmMoJ3ppcCcsIFsnLWonLCB6aXBQYXRoLCAnaW5kZXgubWpzJ10sIHsgY3dkOiB0bXBEaXIsIHN0ZGlvOiAncGlwZScgfSk7XG5cbiAgICAgICAgICAvLyBVcGxvYWQgZGlyZWN0bHkgdG8gTGFtYmRhIHZpYSBTREsgKG5vIFMzIG5lZWRlZClcbiAgICAgICAgICBwcmludEluZm8oJ1VwbG9hZGluZyBjb2RlIHRvIExhbWJkYScsIHsgZnVuY3Rpb246IExBTUJEQV9OQU1FLCB2ZXJzaW9uIH0pO1xuXG4gICAgICAgICAgY29uc3QgbGFtYmRhQ2xpZW50ID0gbmV3IExhbWJkYUNsaWVudCh7IHJlZ2lvbiB9KTtcbiAgICAgICAgICBhd2FpdCBsYW1iZGFDbGllbnQuc2VuZChuZXcgVXBkYXRlRnVuY3Rpb25Db2RlQ29tbWFuZCh7XG4gICAgICAgICAgICBGdW5jdGlvbk5hbWU6IExBTUJEQV9OQU1FLFxuICAgICAgICAgICAgWmlwRmlsZTogZnMucmVhZEZpbGVTeW5jKHppcFBhdGgpLFxuICAgICAgICAgIH0pKTtcblxuICAgICAgICAgIHByaW50U3VjY2VzcyhgTGFtYmRhIGNvZGUgZGVwbG95ZWQgKCR7UEFDS0FHRV9OQU1FfUAke3ZlcnNpb259KWApO1xuXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgZnMucm1TeW5jKHRtcERpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RlcCAzOiBTaG93IG91dHB1dHMgdmlhIFNES1xuICAgICAgICBjb25zdCBjZm5DbGllbnQgPSBuZXcgQ2xvdWRGb3JtYXRpb25DbGllbnQoeyByZWdpb24gfSk7XG4gICAgICAgIGNvbnN0IGRlc2NyaWJlUmVzdWx0ID0gYXdhaXQgY2ZuQ2xpZW50LnNlbmQobmV3IERlc2NyaWJlU3RhY2tzQ29tbWFuZCh7IFN0YWNrTmFtZTogU1RBQ0tfTkFNRSB9KSk7XG4gICAgICAgIGNvbnN0IG91dHB1dHMgPSBkZXNjcmliZVJlc3VsdC5TdGFja3M/LlswXT8uT3V0cHV0cyA/PyBbXTtcbiAgICAgICAgY29uc3Qgb3V0cHV0TWFwID0gT2JqZWN0LmZyb21FbnRyaWVzKG91dHB1dHMubWFwKG8gPT4gW28uT3V0cHV0S2V5ID8/ICcnLCBvLk91dHB1dFZhbHVlID8/ICcnXSkpO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgcHJpbnRTZWN0aW9uKCdFdmVudCBJbmdlc3Rpb24gUmVhZHknKTtcblxuICAgICAgICBwcmludEtleVZhbHVlKHtcbiAgICAgICAgICAnU3RhY2snOiBTVEFDS19OQU1FLFxuICAgICAgICAgICdSZWdpb24nOiByZWdpb24sXG4gICAgICAgICAgJ1BsYXRmb3JtIFVSTCc6IHBsYXRmb3JtVXJsLFxuICAgICAgICAgICdMYW1iZGEnOiBvdXRwdXRNYXAuTGFtYmRhRnVuY3Rpb25Bcm4gfHwgTEFNQkRBX05BTUUsXG4gICAgICAgICAgJ0V2ZW50IFF1ZXVlJzogb3V0cHV0TWFwLkV2ZW50UXVldWVVcmwgfHwgJyhzZWUgQVdTIGNvbnNvbGUpJyxcbiAgICAgICAgICAnRGVhZCBMZXR0ZXIgUXVldWUnOiBvdXRwdXRNYXAuRGVhZExldHRlclF1ZXVlVXJsIHx8ICcoc2VlIEFXUyBjb25zb2xlKScsXG4gICAgICAgICAgJ0V2ZW50QnJpZGdlIFJ1bGUnOiBvdXRwdXRNYXAuRXZlbnRSdWxlTmFtZSB8fCAnKHNlZSBBV1MgY29uc29sZSknLFxuICAgICAgICAgICdTdGF0dXMnOiAn4pyTIERlcGxveWVkJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICBwcmludFN1Y2Nlc3MoJ0V2ZW50QnJpZGdlIGV2ZW50IGluZ2VzdGlvbiBpcyBhY3RpdmUuJyk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZUVycm9yKGVycm9yLCBFUlJPUl9DT0RFUy5BUElfUkVRVUVTVCwge1xuICAgICAgICAgIGRlYnVnOiBwcm9ncmFtLm9wdHMoKS5kZWJ1ZyxcbiAgICAgICAgICBleGl0OiB0cnVlLFxuICAgICAgICAgIGNvbnRleHQ6IHsgY29tbWFuZDogJ3NldHVwLWV2ZW50cycsIGV4ZWN1dGlvbklkLCBzdGFjazogU1RBQ0tfTkFNRSB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiE7C"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqE7C"}
@@ -1,5 +1,6 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
+ import { isOpaqueApiKey } from '@pipeline-builder/api-core';
3
4
  import axios from 'axios';
4
5
  import { Command } from 'commander';
5
6
  import { ENV_VARS, TIMEOUTS } from '../config/cli.constants.js';
@@ -49,10 +50,15 @@ export function status(program) {
49
50
  results['Platform Health'] = 'unreachable';
50
51
  }
51
52
  // 5. Decode token expiry (shared decoder — same base64url + exp logic
52
- // used by audit-tokens / api-client).
53
+ // used by audit-tokens / api-client). An ACCESS KEY carries no claims at
54
+ // all, so there is nothing local to read: its expiry lives on its record
55
+ // and is shown on the keys page.
53
56
  if (token) {
54
57
  const payload = decodeTokenPayload(token);
55
- if (!payload) {
58
+ if (isOpaqueApiKey(token)) {
59
+ results['Token Expires'] = 'n/a (access key — see Dashboard → API Tokens)';
60
+ }
61
+ else if (!payload) {
56
62
  results['Token Expires'] = 'unable to decode';
57
63
  }
58
64
  else if (typeof payload.exp === 'number') {
@@ -78,4 +84,4 @@ export function status(program) {
78
84
  }
79
85
  });
80
86
  }
81
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3N0YXR1cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDL0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRW5EOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLE9BQWdCO0lBQ3JDLE9BQU87U0FDSixPQUFPLENBQUMsUUFBUSxDQUFDO1NBQ2pCLFdBQVcsQ0FBQywwQ0FBMEMsQ0FBQztTQUN2RCxNQUFNLENBQUMsUUFBUSxFQUFFLHVCQUF1QixFQUFFLEtBQUssQ0FBQztTQUNoRCxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO1FBQ3hCLE1BQU0sV0FBVyxHQUFHLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFFckYsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLEdBQTJCLEVBQUUsQ0FBQztZQUUz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Q0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBFTlZfVkFSUywgVElNRU9VVFMgfSBmcm9tICcuLi9jb25maWcvY2xpLmNvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBkZWNvZGVUb2tlblBheWxvYWQgfSBmcm9tICcuLi91dGlscy9hdXRoLWd1YXJkLmpzJztcbmltcG9ydCB7IGNoZWNrQ2RrQXZhaWxhYmxlIH0gZnJvbSAnLi4vdXRpbHMvY2RrLXV0aWxzLmpzJztcbmltcG9ydCB7IHByaW50Q29tbWFuZEhlYWRlciB9IGZyb20gJy4uL3V0aWxzL2NvbW1hbmQtdXRpbHMuanMnO1xuaW1wb3J0IHsgRVJST1JfQ09ERVMsIGhhbmRsZUVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZXJyb3ItaGFuZGxlci5qcyc7XG5pbXBvcnQgeyBwcmludEtleVZhbHVlLCBwcmludFNlY3Rpb24gfSBmcm9tICcuLi91dGlscy9vdXRwdXQtdXRpbHMuanMnO1xuaW1wb3J0IHsgaHR0cHNBZ2VudEZvclVybCB9IGZyb20gJy4uL3V0aWxzL3Rscy5qcyc7XG5cbi8qKlxuICogUmVnaXN0ZXJzIHRoZSBgc3RhdHVzYCBjb21tYW5kIHdpdGggdGhlIENMSSBwcm9ncmFtLlxuICpcbiAqIENoZWNrcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIENESyBhdmFpbGFiaWxpdHksIHBsYXRmb3JtIGNvbm5lY3Rpdml0eSxcbiAqIGFuZCB0b2tlbiBleHBpcnkgdG8gZ2l2ZSBhIHF1aWNrIG92ZXJ2aWV3IG9mIHRoZSBjdXJyZW50IHNldHVwLlxuICpcbiAqIEBwYXJhbSBwcm9ncmFtIC0gVGhlIHJvb3QgQ29tbWFuZGVyIHByb2dyYW0gaW5zdGFuY2UgdG8gYXR0YWNoIHRoZSBjb21tYW5kIHRvLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhdHVzKHByb2dyYW06IENvbW1hbmQpOiB2b2lkIHtcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKCdzdGF0dXMnKVxuICAgIC5kZXNjcmlwdGlvbignU2hvdyBlbnZpcm9ubWVudCBhbmQgY29ubmVjdGl2aXR5IHN0YXR1cycpXG4gICAgLm9wdGlvbignLS1qc29uJywgJ091dHB1dCByZXN1bHQgYXMgSlNPTicsIGZhbHNlKVxuICAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgIGNvbnN0IGV4ZWN1dGlvbklkID0gcHJpbnRDb21tYW5kSGVhZGVyKCdTdGF0dXMnLCB1bmRlZmluZWQsIHsgcXVpZXQ6IG9wdGlvbnMuanNvbiB9KTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgICAgIC8vIDEuIENoZWNrIFBMQVRGT1JNX1RPS0VOXG4gICAgICAgIGNvbnN0IHRva2VuID0gcHJvY2Vzcy5lbnZbRU5WX1ZBUlMuUExBVEZPUk1fVE9LRU5dO1xuICAgICAgICByZXN1bHRzLlBMQVRGT1JNX1RPS0VOID0gdG9rZW4gPyAnc2V0JyA6ICdub3Qgc2V0JztcblxuICAgICAgICAvLyAyLiBDaGVjayBQTEFURk9STV9TRUNSRVRfTkFNRVxuICAgICAgICBjb25zdCBzZWNyZXROYW1lID0gcHJvY2Vzcy5lbnYuUExBVEZPUk1fU0VDUkVUX05BTUU7XG4gICAgICAgIHJlc3VsdHMuUExBVEZPUk1fU0VDUkVUX05BTUUgPSBzZWNyZXROYW1lIHx8ICdub3Qgc2V0JztcblxuICAgICAgICAvLyAzLiBDaGVjayBDREsgYXZhaWxhYmlsaXR5XG4gICAgICAgIHJlc3VsdHNbJ0NESyBBdmFpbGFibGUnXSA9IGNoZWNrQ2RrQXZhaWxhYmxlKCkgPyAneWVzJyA6ICdubyc7XG5cbiAgICAgICAgLy8gNC4gQ2hlY2sgcGxhdGZvcm0gaGVhbHRoXG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBwcm9jZXNzLmVudltFTlZfVkFSUy5QTEFURk9STV9CQVNFX1VSTF0gfHwgJ2h0dHBzOi8vbG9jYWxob3N0Ojg0NDMnO1xuICAgICAgICByZXN1bHRzLlBMQVRGT1JNX0JBU0VfVVJMID0gYmFzZVVybDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFNraXAgY2VydCB2ZXJpZmljYXRpb24gb25seSBmb3IgbG9jYWwvc2VsZi1zaWduZWQgaG9zdHM7IHZlcmlmeSByZWFsIGRvbWFpbnMuXG4gICAgICAgICAgYXdhaXQgYXhpb3MuZ2V0KGAke2Jhc2VVcmx9L2hlYWx0aGAsIHtcbiAgICAgICAgICAgIHRpbWVvdXQ6IFRJTUVPVVRTLkhFQUxUSF9DSEVDSyxcbiAgICAgICAgICAgIGh0dHBzQWdlbnQ6IGh0dHBzQWdlbnRGb3JVcmwoYmFzZVVybCksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzdWx0c1snUGxhdGZvcm0gSGVhbHRoJ10gPSAncmVhY2hhYmxlJztcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmVzdWx0c1snUGxhdGZvcm0gSGVhbHRoJ10gPSAndW5yZWFjaGFibGUnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gNS4gRGVjb2RlIHRva2VuIGV4cGlyeSAoc2hhcmVkIGRlY29kZXIg4oCUIHNhbWUgYmFzZTY0dXJsICsgZXhwIGxvZ2ljXG4gICAgICAgIC8vIHVzZWQgYnkgYXVkaXQtdG9rZW5zIC8gYXBpLWNsaWVudCkuXG4gICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBkZWNvZGVUb2tlblBheWxvYWQodG9rZW4pO1xuICAgICAgICAgIGlmICghcGF5bG9hZCkge1xuICAgICAgICAgICAgcmVzdWx0c1snVG9rZW4gRXhwaXJlcyddID0gJ3VuYWJsZSB0byBkZWNvZGUnO1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBheWxvYWQuZXhwID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgY29uc3QgZXhwaXJlc0F0ID0gbmV3IERhdGUocGF5bG9hZC5leHAgKiAxMDAwKTtcbiAgICAgICAgICAgIHJlc3VsdHNbJ1Rva2VuIEV4cGlyZXMnXSA9IGV4cGlyZXNBdC50b0lTT1N0cmluZygpO1xuICAgICAgICAgICAgcmVzdWx0c1snVG9rZW4gRXhwaXJlZCddID0gZXhwaXJlc0F0LmdldFRpbWUoKSA8IERhdGUubm93KCkgPyAneWVzJyA6ICdubyc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuanNvbikge1xuICAgICAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHsgc3VjY2VzczogdHJ1ZSwgZXhlY3V0aW9uSWQsIC4uLnJlc3VsdHMgfSwgbnVsbCwgMikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByaW50U2VjdGlvbignRW52aXJvbm1lbnQgU3RhdHVzJyk7XG4gICAgICAgICAgcHJpbnRLZXlWYWx1ZShyZXN1bHRzKTtcbiAgICAgICAgfVxuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuR0VORVJBTCwge1xuICAgICAgICAgIGRlYnVnOiBwcm9ncmFtLm9wdHMoKS5kZWJ1ZyxcbiAgICAgICAgICBleGl0OiB0cnVlLFxuICAgICAgICAgIGNvbnRleHQ6IHsgY29tbWFuZDogJ3N0YXR1cycsIGV4ZWN1dGlvbklkIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xufVxuIl19
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3N0YXR1cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckUsT0FBTyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVuRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FBQyxPQUFnQjtJQUNyQyxPQUFPO1NBQ0osT0FBTyxDQUFDLFFBQVEsQ0FBQztTQUNqQixXQUFXLENBQUMsMENBQTBDLENBQUM7U0FDdkQsTUFBTSxDQUFDLFFBQVEsRUFBRSx1QkFBdUIsRUFBRSxLQUFLLENBQUM7U0FDaEQsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtRQUN4QixNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXJGLElB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LE9BQU8sRUFBRTtnQkFDdEMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLO2dCQUMzQixJQUFJLEVBQUUsSUFBSTtnQkFDVixPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRTthQUM1QyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGlzT3BhcXVlQXBpS2V5IH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHsgRU5WX1ZBUlMsIFRJTUVPVVRTIH0gZnJvbSAnLi4vY29uZmlnL2NsaS5jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgZGVjb2RlVG9rZW5QYXlsb2FkIH0gZnJvbSAnLi4vdXRpbHMvYXV0aC1ndWFyZC5qcyc7XG5pbXBvcnQgeyBjaGVja0Nka0F2YWlsYWJsZSB9IGZyb20gJy4uL3V0aWxzL2Nkay11dGlscy5qcyc7XG5pbXBvcnQgeyBwcmludENvbW1hbmRIZWFkZXIgfSBmcm9tICcuLi91dGlscy9jb21tYW5kLXV0aWxzLmpzJztcbmltcG9ydCB7IEVSUk9SX0NPREVTLCBoYW5kbGVFcnJvciB9IGZyb20gJy4uL3V0aWxzL2Vycm9yLWhhbmRsZXIuanMnO1xuaW1wb3J0IHsgcHJpbnRLZXlWYWx1ZSwgcHJpbnRTZWN0aW9uIH0gZnJvbSAnLi4vdXRpbHMvb3V0cHV0LXV0aWxzLmpzJztcbmltcG9ydCB7IGh0dHBzQWdlbnRGb3JVcmwgfSBmcm9tICcuLi91dGlscy90bHMuanMnO1xuXG4vKipcbiAqIFJlZ2lzdGVycyB0aGUgYHN0YXR1c2AgY29tbWFuZCB3aXRoIHRoZSBDTEkgcHJvZ3JhbS5cbiAqXG4gKiBDaGVja3MgZW52aXJvbm1lbnQgdmFyaWFibGVzLCBDREsgYXZhaWxhYmlsaXR5LCBwbGF0Zm9ybSBjb25uZWN0aXZpdHksXG4gKiBhbmQgdG9rZW4gZXhwaXJ5IHRvIGdpdmUgYSBxdWljayBvdmVydmlldyBvZiB0aGUgY3VycmVudCBzZXR1cC5cbiAqXG4gKiBAcGFyYW0gcHJvZ3JhbSAtIFRoZSByb290IENvbW1hbmRlciBwcm9ncmFtIGluc3RhbmNlIHRvIGF0dGFjaCB0aGUgY29tbWFuZCB0by5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXR1cyhwcm9ncmFtOiBDb21tYW5kKTogdm9pZCB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZCgnc3RhdHVzJylcbiAgICAuZGVzY3JpcHRpb24oJ1Nob3cgZW52aXJvbm1lbnQgYW5kIGNvbm5lY3Rpdml0eSBzdGF0dXMnKVxuICAgIC5vcHRpb24oJy0tanNvbicsICdPdXRwdXQgcmVzdWx0IGFzIEpTT04nLCBmYWxzZSlcbiAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICBjb25zdCBleGVjdXRpb25JZCA9IHByaW50Q29tbWFuZEhlYWRlcignU3RhdHVzJywgdW5kZWZpbmVkLCB7IHF1aWV0OiBvcHRpb25zLmpzb24gfSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgICAgICAvLyAxLiBDaGVjayBQTEFURk9STV9UT0tFTlxuICAgICAgICBjb25zdCB0b2tlbiA9IHByb2Nlc3MuZW52W0VOVl9WQVJTLlBMQVRGT1JNX1RPS0VOXTtcbiAgICAgICAgcmVzdWx0cy5QTEFURk9STV9UT0tFTiA9IHRva2VuID8gJ3NldCcgOiAnbm90IHNldCc7XG5cbiAgICAgICAgLy8gMi4gQ2hlY2sgUExBVEZPUk1fU0VDUkVUX05BTUVcbiAgICAgICAgY29uc3Qgc2VjcmV0TmFtZSA9IHByb2Nlc3MuZW52LlBMQVRGT1JNX1NFQ1JFVF9OQU1FO1xuICAgICAgICByZXN1bHRzLlBMQVRGT1JNX1NFQ1JFVF9OQU1FID0gc2VjcmV0TmFtZSB8fCAnbm90IHNldCc7XG5cbiAgICAgICAgLy8gMy4gQ2hlY2sgQ0RLIGF2YWlsYWJpbGl0eVxuICAgICAgICByZXN1bHRzWydDREsgQXZhaWxhYmxlJ10gPSBjaGVja0Nka0F2YWlsYWJsZSgpID8gJ3llcycgOiAnbm8nO1xuXG4gICAgICAgIC8vIDQuIENoZWNrIHBsYXRmb3JtIGhlYWx0aFxuICAgICAgICBjb25zdCBiYXNlVXJsID0gcHJvY2Vzcy5lbnZbRU5WX1ZBUlMuUExBVEZPUk1fQkFTRV9VUkxdIHx8ICdodHRwczovL2xvY2FsaG9zdDo4NDQzJztcbiAgICAgICAgcmVzdWx0cy5QTEFURk9STV9CQVNFX1VSTCA9IGJhc2VVcmw7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBTa2lwIGNlcnQgdmVyaWZpY2F0aW9uIG9ubHkgZm9yIGxvY2FsL3NlbGYtc2lnbmVkIGhvc3RzOyB2ZXJpZnkgcmVhbCBkb21haW5zLlxuICAgICAgICAgIGF3YWl0IGF4aW9zLmdldChgJHtiYXNlVXJsfS9oZWFsdGhgLCB7XG4gICAgICAgICAgICB0aW1lb3V0OiBUSU1FT1VUUy5IRUFMVEhfQ0hFQ0ssXG4gICAgICAgICAgICBodHRwc0FnZW50OiBodHRwc0FnZW50Rm9yVXJsKGJhc2VVcmwpLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlc3VsdHNbJ1BsYXRmb3JtIEhlYWx0aCddID0gJ3JlYWNoYWJsZSc7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJlc3VsdHNbJ1BsYXRmb3JtIEhlYWx0aCddID0gJ3VucmVhY2hhYmxlJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDUuIERlY29kZSB0b2tlbiBleHBpcnkgKHNoYXJlZCBkZWNvZGVyIOKAlCBzYW1lIGJhc2U2NHVybCArIGV4cCBsb2dpY1xuICAgICAgICAvLyB1c2VkIGJ5IGF1ZGl0LXRva2VucyAvIGFwaS1jbGllbnQpLiBBbiBBQ0NFU1MgS0VZIGNhcnJpZXMgbm8gY2xhaW1zIGF0XG4gICAgICAgIC8vIGFsbCwgc28gdGhlcmUgaXMgbm90aGluZyBsb2NhbCB0byByZWFkOiBpdHMgZXhwaXJ5IGxpdmVzIG9uIGl0cyByZWNvcmRcbiAgICAgICAgLy8gYW5kIGlzIHNob3duIG9uIHRoZSBrZXlzIHBhZ2UuXG4gICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBkZWNvZGVUb2tlblBheWxvYWQodG9rZW4pO1xuICAgICAgICAgIGlmIChpc09wYXF1ZUFwaUtleSh0b2tlbikpIHtcbiAgICAgICAgICAgIHJlc3VsdHNbJ1Rva2VuIEV4cGlyZXMnXSA9ICduL2EgKGFjY2VzcyBrZXkg4oCUIHNlZSBEYXNoYm9hcmQg4oaSIEFQSSBUb2tlbnMpJztcbiAgICAgICAgICB9IGVsc2UgaWYgKCFwYXlsb2FkKSB7XG4gICAgICAgICAgICByZXN1bHRzWydUb2tlbiBFeHBpcmVzJ10gPSAndW5hYmxlIHRvIGRlY29kZSc7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcGF5bG9hZC5leHAgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBjb25zdCBleHBpcmVzQXQgPSBuZXcgRGF0ZShwYXlsb2FkLmV4cCAqIDEwMDApO1xuICAgICAgICAgICAgcmVzdWx0c1snVG9rZW4gRXhwaXJlcyddID0gZXhwaXJlc0F0LnRvSVNPU3RyaW5nKCk7XG4gICAgICAgICAgICByZXN1bHRzWydUb2tlbiBFeHBpcmVkJ10gPSBleHBpcmVzQXQuZ2V0VGltZSgpIDwgRGF0ZS5ub3coKSA/ICd5ZXMnIDogJ25vJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5qc29uKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoeyBzdWNjZXNzOiB0cnVlLCBleGVjdXRpb25JZCwgLi4ucmVzdWx0cyB9LCBudWxsLCAyKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJpbnRTZWN0aW9uKCdFbnZpcm9ubWVudCBTdGF0dXMnKTtcbiAgICAgICAgICBwcmludEtleVZhbHVlKHJlc3VsdHMpO1xuICAgICAgICB9XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZUVycm9yKGVycm9yLCBFUlJPUl9DT0RFUy5HRU5FUkFMLCB7XG4gICAgICAgICAgZGVidWc6IHByb2dyYW0ub3B0cygpLmRlYnVnLFxuICAgICAgICAgIGV4aXQ6IHRydWUsXG4gICAgICAgICAgY29udGV4dDogeyBjb21tYW5kOiAnc3RhdHVzJywgZXhlY3V0aW9uSWQgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG59XG4iXX0=
@@ -2,24 +2,29 @@ import { Command } from 'commander';
2
2
  /**
3
3
  * Registers the `store-token` command with the CLI program.
4
4
  *
5
- * Generates a long-lived JWT token via the platform API and stores it
6
- * in AWS Secrets Manager for use by the synth/deploy --store-tokens flag.
5
+ * Provisions the org's machine identity — a SERVICE ACCOUNT and one `pb_sa_…`
6
+ * key — and stores the key in AWS Secrets Manager for CDK deployments,
7
+ * CodeBuild's registry credentials, the plugin-lookup Lambda and the event
8
+ * ingestion Lambda (#12 / #N2). Nothing stored is tied to a person's session any
9
+ * more: the account outlives its creator, takes no seat, and every audit row it
10
+ * produces names the account.
7
11
  *
8
- * Requires PLATFORM_TOKEN to be set, or use --email/--password to login inline.
12
+ * Because creating an account and issuing its key are step-up gated, this needs
13
+ * the operator's password — `--password`, or the `PLATFORM_PASSWORD` env var
14
+ * (preferred: it keeps the password out of shell history and plan output).
9
15
  *
10
16
  * By default it ONLY writes the secret. Pass --schedule to also deploy the daily
11
- * token-renewal stack (a Lambda that auto-renews this token before it expires).
17
+ * KEY ROTATION stack (a Lambda that replaces the key before it expires).
12
18
  *
13
19
  * @example
14
20
  * ```bash
15
- * pipeline-manager infra store-token --region us-east-1
16
- * pipeline-manager infra store-token --days 90 --region us-east-1
17
- * pipeline-manager infra store-token --schedule --region us-east-1 # + daily auto-renewal
18
- * pipeline-manager infra store-token --schedule --cron '0 3 * * *' # custom renewal time
19
- * pipeline-manager infra store-token --days 7 --no-verify-ssl
20
- * PLATFORM_SECRET_NAME=my-custom-secret pipeline-manager infra store-token # override the derived name
21
+ * PLATFORM_PASSWORD=*** pipeline-manager infra store-token --region us-east-1
22
+ * PLATFORM_PASSWORD=*** pipeline-manager infra store-token --days 90 --region us-east-1
23
+ * PLATFORM_PASSWORD=*** pipeline-manager infra store-token --schedule --region us-east-1 # + daily rotation
24
+ * PLATFORM_PASSWORD=*** pipeline-manager infra store-token --scope reporting:ingest --schedule
25
+ * PLATFORM_PASSWORD=*** pipeline-manager infra store-token --scope registry:push --schedule
21
26
  * pipeline-manager infra store-token --dry-run
22
- * pipeline-manager infra store-token -e admin -p '***' --region us-east-1
27
+ * pipeline-manager infra store-token -u admin -p '***' --region us-east-1
23
28
  * ```
24
29
  */
25
30
  export declare function storeToken(program: Command): void;
@@ -1 +1 @@
1
- {"version":3,"file":"store-token.d.ts","sourceRoot":"","sources":["../../src/commands/store-token.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyGpC;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmNjD"}
1
+ {"version":3,"file":"store-token.d.ts","sourceRoot":"","sources":["../../src/commands/store-token.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmJpC;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4PjD"}