@pipeline-builder/pipeline-manager 4.1.15 → 4.1.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/config.yml +16 -37
  2. package/dist/boilerplate.js +10 -2
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +97 -79
  5. package/dist/commands/audit-stacks.js +3 -3
  6. package/dist/commands/create-pat.d.ts +2 -3
  7. package/dist/commands/create-pat.d.ts.map +1 -1
  8. package/dist/commands/create-pat.js +3 -4
  9. package/dist/commands/create-pipeline.d.ts.map +1 -1
  10. package/dist/commands/create-pipeline.js +198 -190
  11. package/dist/commands/list-pipelines.js +2 -2
  12. package/dist/commands/list-plugins.js +2 -2
  13. package/dist/commands/login.d.ts +2 -2
  14. package/dist/commands/login.js +3 -3
  15. package/dist/commands/new-plugin.d.ts +48 -5
  16. package/dist/commands/new-plugin.d.ts.map +1 -1
  17. package/dist/commands/new-plugin.js +261 -95
  18. package/dist/commands/plugin-lifecycle.d.ts +29 -0
  19. package/dist/commands/plugin-lifecycle.d.ts.map +1 -0
  20. package/dist/commands/plugin-lifecycle.js +147 -0
  21. package/dist/commands/provision.d.ts +42 -2
  22. package/dist/commands/provision.d.ts.map +1 -1
  23. package/dist/commands/provision.js +184 -147
  24. package/dist/commands/publish-plugin.d.ts +62 -0
  25. package/dist/commands/publish-plugin.d.ts.map +1 -0
  26. package/dist/commands/publish-plugin.js +224 -0
  27. package/dist/commands/redrive-events.d.ts +1 -1
  28. package/dist/commands/redrive-events.js +2 -2
  29. package/dist/commands/store-token.d.ts +46 -1
  30. package/dist/commands/store-token.d.ts.map +1 -1
  31. package/dist/commands/store-token.js +127 -102
  32. package/dist/commands/test-plugin.d.ts +72 -0
  33. package/dist/commands/test-plugin.d.ts.map +1 -0
  34. package/dist/commands/test-plugin.js +285 -0
  35. package/dist/commands/upload-plugin.d.ts +6 -7
  36. package/dist/commands/upload-plugin.d.ts.map +1 -1
  37. package/dist/commands/upload-plugin.js +127 -189
  38. package/dist/commands/validate-plugin.d.ts +37 -4
  39. package/dist/commands/validate-plugin.d.ts.map +1 -1
  40. package/dist/commands/validate-plugin.js +129 -144
  41. package/dist/commands/validate-templates.d.ts.map +1 -1
  42. package/dist/commands/validate-templates.js +8 -9
  43. package/dist/config/plugin-catalog-assets.d.ts +13 -0
  44. package/dist/config/plugin-catalog-assets.d.ts.map +1 -0
  45. package/dist/config/plugin-catalog-assets.js +21 -0
  46. package/dist/config.yml +16 -37
  47. package/dist/lambda/token-renew-handler.d.ts.map +1 -1
  48. package/dist/lambda/token-renew-handler.js +109 -154
  49. package/dist/types/config.d.ts +2 -6
  50. package/dist/types/config.d.ts.map +1 -1
  51. package/dist/types/config.js +1 -1
  52. package/dist/types/plugin.d.ts +21 -0
  53. package/dist/types/plugin.d.ts.map +1 -1
  54. package/dist/types/plugin.js +1 -1
  55. package/dist/utils/aws-env.d.ts +1 -2
  56. package/dist/utils/aws-env.d.ts.map +1 -1
  57. package/dist/utils/aws-env.js +2 -3
  58. package/dist/utils/catalog-prompt.d.ts +26 -0
  59. package/dist/utils/catalog-prompt.d.ts.map +1 -0
  60. package/dist/utils/catalog-prompt.js +113 -0
  61. package/dist/utils/command-utils.d.ts.map +1 -1
  62. package/dist/utils/command-utils.js +14 -3
  63. package/dist/utils/config-loader.d.ts.map +1 -1
  64. package/dist/utils/config-loader.js +4 -6
  65. package/dist/utils/credential-store.d.ts +16 -0
  66. package/dist/utils/credential-store.d.ts.map +1 -1
  67. package/dist/utils/credential-store.js +57 -2
  68. package/dist/utils/deploy-runner.d.ts.map +1 -1
  69. package/dist/utils/deploy-runner.js +7 -2
  70. package/dist/utils/pipeline-config.d.ts +1 -2
  71. package/dist/utils/pipeline-config.d.ts.map +1 -1
  72. package/dist/utils/pipeline-config.js +1 -1
  73. package/dist/utils/plugin-docker.d.ts +44 -0
  74. package/dist/utils/plugin-docker.d.ts.map +1 -0
  75. package/dist/utils/plugin-docker.js +71 -0
  76. package/dist/utils/plugin-package.d.ts +40 -0
  77. package/dist/utils/plugin-package.d.ts.map +1 -0
  78. package/dist/utils/plugin-package.js +159 -0
  79. package/dist/utils/plugin-resolver.d.ts.map +1 -1
  80. package/dist/utils/plugin-resolver.js +43 -29
  81. package/dist/utils/plugin-scan.d.ts +22 -0
  82. package/dist/utils/plugin-scan.d.ts.map +1 -0
  83. package/dist/utils/plugin-scan.js +52 -0
  84. package/dist/utils/plugin-zip.d.ts +15 -0
  85. package/dist/utils/plugin-zip.d.ts.map +1 -0
  86. package/dist/utils/plugin-zip.js +96 -0
  87. package/dist/utils/registry.d.ts +15 -0
  88. package/dist/utils/registry.d.ts.map +1 -1
  89. package/dist/utils/registry.js +17 -2
  90. package/dist/utils/service-account.d.ts.map +1 -1
  91. package/dist/utils/service-account.js +9 -10
  92. package/package.json +45 -8
@@ -1,15 +1,16 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  import { ErrorCode, errorMessage } from '@pipeline-builder/api-core';
4
+ import { pluginArtifactAlias, pluginLookupFilter, unwrapLookup } from '@pipeline-builder/pipeline-core';
4
5
  import { ApiClient } from './api-client.js';
5
6
  import { printWarning } from './output-utils.js';
6
7
  /**
7
- * Cache key matching `PluginLookup.normalize()`: explicit alias when set,
8
- * otherwise `${name}-alias`. Must stay in sync with the consumers in
9
- * pipeline-core/plugin-lookup.ts and pipeline-builder.ts that read this map.
8
+ * Cache key matching `PluginLookup.normalize()`: the explicit alias when set,
9
+ * otherwise `[<publisher>-]<name>-alias` — pipeline-core's
10
+ * `pluginArtifactAlias`, the one rule every consumer of this map uses.
10
11
  */
11
12
  function cacheKey(ref) {
12
- return ref.alias || `${ref.name}-alias`;
13
+ return pluginArtifactAlias(ref);
13
14
  }
14
15
  /**
15
16
  * Walk the pipeline props tree to collect every plugin reference. Plugins
@@ -29,7 +30,8 @@ function collectPluginRefs(props) {
29
30
  const key = cacheKey(r);
30
31
  // The name the lookup will TARGET — an explicit `filter.name` wins (see
31
32
  // below), so two refs that resolve to the same plugin are not a collision.
32
- const target = r.filter?.name ?? r.name;
33
+ const name = r.filter?.name ?? r.name;
34
+ const target = r.publisher ? `${r.publisher}/${name}` : name;
33
35
  const holder = seen.get(key);
34
36
  if (holder !== undefined) {
35
37
  // One alias can only ever mean one plugin. Deduplicating on the alias
@@ -56,10 +58,24 @@ function collectPluginRefs(props) {
56
58
  }
57
59
  return refs;
58
60
  }
59
- /** The plugin service's 409 `IMAGE_VERIFICATION_FAILED` answer from `/plugins/lookup`. */
60
- function isImageVerificationFailure(err) {
61
+ /**
62
+ * Lookup refusals that must STOP the synth rather than fall back to
63
+ * deploy-time resolution: an image whose signature doesn't verify, and a
64
+ * listing the org can't use (not installed, blocked by its policy, yanked or
65
+ * suspended). Falling back would quietly turn
66
+ * each into an unresolved step that fails at run time instead of now.
67
+ */
68
+ const FATAL_LOOKUP_CODES = [
69
+ ErrorCode.IMAGE_VERIFICATION_FAILED,
70
+ ErrorCode.PLUGIN_NOT_INSTALLED,
71
+ ErrorCode.PLUGIN_BLOCKED_BY_POLICY,
72
+ ErrorCode.PLUGIN_UNAVAILABLE,
73
+ ];
74
+ /** The error code of a plugin service answer, when it is one of {@link FATAL_LOOKUP_CODES}. */
75
+ function fatalLookupCode(err) {
61
76
  const data = err?.response?.data;
62
- return !!data && typeof data === 'object' && data.code === ErrorCode.IMAGE_VERIFICATION_FAILED;
77
+ const code = data && typeof data === 'object' ? data.code : undefined;
78
+ return typeof code === 'string' && FATAL_LOOKUP_CODES.includes(code) ? code : null;
63
79
  }
64
80
  /**
65
81
  * Pre-resolve plugins by calling the same `POST /api/plugins/lookup` endpoint
@@ -83,6 +99,7 @@ export async function resolvePluginsForProps(client, props) {
83
99
  const resolved = {};
84
100
  await Promise.all(refs.map(async (ref) => {
85
101
  const key = cacheKey(ref);
102
+ const label = ref.publisher ? `${ref.publisher}/${ref.name}` : ref.name;
86
103
  // The plugin NAME lives on the ref (a sibling of `filter`), NOT inside the
87
104
  // filter object — but the lookup matches on the filter. A filter without
88
105
  // `name` (e.g. `{version, visibility, isActive, isDefault}`) matches ANY
@@ -90,38 +107,35 @@ export async function resolvePluginsForProps(client, props) {
90
107
  // (seen: `dockerfile-multi-provider`). That made the synth and every step
91
108
  // resolve to the WRONG plugin. So when the filter omits `name`, fall back to
92
109
  // the ref's plugin name; an explicit filter `name` still takes precedence.
93
- const filter = { name: ref.name, ...(ref.filter ?? { isActive: true, isDefault: true }) };
110
+ // Shared with the pipeline service's contract check (same filter, same plugin).
111
+ const filter = pluginLookupFilter(ref);
94
112
  try {
95
113
  const res = await client.post('/api/plugins/lookup', { filter });
96
- // Unwrap the plugin record from whatever envelope the response middleware
97
- // applied. The platform's standard success envelope is
98
- // `{ success, statusCode, data: { plugin: Plugin } }` (note the DOUBLE
99
- // nesting: data.plugin), but tolerate `{ data: Plugin }`, `{ plugin }`,
100
- // and a bare Plugin too. Only stopping at `res.data` (which is
101
- // `{ plugin: ... }`) made `.name` undefined → every lookup fell back to
102
- // deploy-time resolution even though the catalog had the plugin.
103
- const data = res.data;
104
- const plugin = data?.plugin // { data: { plugin } }
105
- ?? res.plugin // { plugin }
106
- ?? data // { data: Plugin }
107
- ?? res; // bare Plugin
108
- if (plugin && typeof plugin === 'object' && plugin.name) {
114
+ const { plugin, warnings } = unwrapLookup(res);
115
+ for (const warning of warnings) {
116
+ printWarning(`Plugin "${label}": ${warning}`);
117
+ }
118
+ if (plugin) {
109
119
  resolved[key] = plugin;
110
120
  }
111
121
  else {
112
- printWarning(`Plugin "${ref.name}" lookup returned no record — falling back to deploy-time resolution`);
122
+ printWarning(`Plugin "${label}" lookup returned no record — falling back to deploy-time resolution`);
113
123
  }
114
124
  }
115
125
  catch (err) {
116
- // A plugin whose image signature doesn't verify is NOT an outage to ride
117
- // out: falling back would quietly turn it into an unresolved step. Stop.
118
- if (isImageVerificationFailure(err)) {
119
- throw new Error(`Plugin "${ref.name}" image failed signature verification: ${errorMessage(err)}`);
126
+ // A plugin whose image signature doesn't verify, or a listing the org
127
+ // can't use, is NOT an outage to ride out: falling back would quietly
128
+ // turn it into an unresolved step. Stop.
129
+ const fatal = fatalLookupCode(err);
130
+ if (fatal === ErrorCode.IMAGE_VERIFICATION_FAILED) {
131
+ throw new Error(`Plugin "${label}" image failed signature verification: ${errorMessage(err)}`);
120
132
  }
133
+ if (fatal)
134
+ throw new Error(`Plugin "${label}" can't be used (${fatal}): ${errorMessage(err)}`);
121
135
  const msg = errorMessage(err);
122
- printWarning(`Plugin "${ref.name}" pre-resolution failed (${msg}) — falling back to deploy-time resolution`);
136
+ printWarning(`Plugin "${label}" pre-resolution failed (${msg}) — falling back to deploy-time resolution`);
123
137
  }
124
138
  }));
125
139
  return resolved;
126
140
  }
127
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXJlc29sdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3BsdWdpbi1yZXNvbHZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDckUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQVNqRDs7OztHQUlHO0FBQ0gsU0FBUyxRQUFRLENBQUMsR0FBYztJQUM5QixPQUFPLEdBQUcsQ0FBQyxLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUM7QUFDMUMsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxLQUE4QjtJQUN2RCxNQUFNLElBQUksR0FBZ0IsRUFBRSxDQUFDO0lBQzdCLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBRXZDLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBWSxFQUFRLEVBQUU7UUFDbEMsSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1lBQUUsT0FBTztRQUM1QyxNQUFNLENBQUMsR0FBRyxHQUFnQixDQUFDO1FBQzNCLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUFFLE9BQU87UUFDcEIsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLHdFQUF3RTtRQUN4RSwyRUFBMkU7UUFDM0UsTUFBTSxNQUFNLEdBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUEyQixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDaEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QixJQUFJ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QixHQUFHLENBQUMsQ0FBQyxjQUFjO1lBQ3hCLElBQUksTUFBTSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSyxNQUE0QixDQUFDLElBQUksRUFBRSxDQUFDO2dCQUMvRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO1lBQ3pCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixZQUFZLENBQUMsV0FBVyxHQUFHLENBQUMsSUFBSSxzRUFBc0UsQ0FBQyxDQUFDO1lBQzFHLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLHlFQUF5RTtZQUN6RSx5RUFBeUU7WUFDekUsSUFBSSwwQkFBMEIsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLFdBQVcsR0FBRyxDQUFDLElBQUksMENBQTBDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDcEcsQ0FBQztZQUNELE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QixZQUFZLENBQUMsV0FBVyxHQUFHLENBQUMsSUFBSSw0QkFBNEIsR0FBRyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQy9HLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRUosT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBFcnJvckNvZGUsIGVycm9yTWVzc2FnZSB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IEFwaUNsaWVudCB9IGZyb20gJy4vYXBpLWNsaWVudC5qcyc7XG5pbXBvcnQgeyBwcmludFdhcm5pbmcgfSBmcm9tICcuL291dHB1dC11dGlscy5qcyc7XG5cbi8qKiBNaW5pbWFsIHBsdWdpbiByZWZlcmVuY2Ugc2hhcGUg4oCUIG1hdGNoZXMgUGx1Z2luT3B0aW9ucyBmcm9tIHBpcGVsaW5lLWNvcmUuICovXG5pbnRlcmZhY2UgUGx1Z2luUmVmIHtcbiAgbmFtZTogc3RyaW5nO1xuICBhbGlhcz86IHN0cmluZztcbiAgZmlsdGVyPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKlxuICogQ2FjaGUga2V5IG1hdGNoaW5nIGBQbHVnaW5Mb29rdXAubm9ybWFsaXplKClgOiBleHBsaWNpdCBhbGlhcyB3aGVuIHNldCxcbiAqIG90aGVyd2lzZSBgJHtuYW1lfS1hbGlhc2AuIE11c3Qgc3RheSBpbiBzeW5jIHdpdGggdGhlIGNvbnN1bWVycyBpblxuICogcGlwZWxpbmUtY29yZS9wbHVnaW4tbG9va3VwLnRzIGFuZCBwaXBlbGluZS1idWlsZGVyLnRzIHRoYXQgcmVhZCB0aGlzIG1hcC5cbiAqL1xuZnVuY3Rpb24gY2FjaGVLZXkocmVmOiBQbHVnaW5SZWYpOiBzdHJpbmcge1xuICByZXR1cm4gcmVmLmFsaWFzIHx8IGAke3JlZi5uYW1lfS1hbGlhc2A7XG59XG5cbi8qKlxuICogV2FsayB0aGUgcGlwZWxpbmUgcHJvcHMgdHJlZSB0byBjb2xsZWN0IGV2ZXJ5IHBsdWdpbiByZWZlcmVuY2UuIFBsdWdpbnNcbiAqIGFwcGVhciBhdCBgc3ludGgucGx1Z2luYCBhbmQgYXQgYHN0YWdlc1tdLnN0ZXBzW10ucGx1Z2luYC4gRW50cmllcyBhcmVcbiAqIGRlLWR1cGxpY2F0ZWQgYnkgYGNhY2hlS2V5KClgIOKAlCB0aGUgc2FtZSBrZXkgYFBsdWdpbkxvb2t1cC5wbHVnaW4oKWAgdXNlcyxcbiAqIHNvIHRoZSByZXNvbHZlZC1wbHVnaW5zIG1hcCBsb29rdXBzIG1hdGNoIGRvd25zdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RQbHVnaW5SZWZzKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFBsdWdpblJlZltdIHtcbiAgY29uc3QgcmVmczogUGx1Z2luUmVmW10gPSBbXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgY29uc3QgcHVzaCA9IChyYXc6IHVua25vd24pOiB2b2lkID0+IHtcbiAgICBpZiAoIXJhdyB8fCB0eXBlb2YgcmF3ICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuICAgIGNvbnN0IHIgPSByYXcgYXMgUGx1Z2luUmVmO1xuICAgIGlmICghci5uYW1lKSByZXR1cm47XG4gICAgY29uc3Qga2V5ID0gY2FjaGVLZXkocik7XG4gICAgLy8gVGhlIG5hbWUgdGhlIGxvb2t1cCB3aWxsIFRBUkdFVCDigJQgYW4gZXhwbGljaXQgYGZpbHRlci5uYW1lYCB3aW5zIChzZWVcbiAgICAvLyBiZWxvdyksIHNvIHR3byByZWZzIHRoYXQgcmVzb2x2ZSB0byB0aGUgc2FtZSBwbHVnaW4gYXJlIG5vdCBhIGNvbGxpc2lvbi5cbiAgICBjb25zdCB0YXJnZXQgPSAoci5maWx0ZXI/Lm5hbWUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSA/PyByLm5hbWU7XG4gICAgY29uc3QgaG9sZGVyID0gc2Vlbi5nZXQoa2V5KTtcbiAgICBpZiAoaG9sZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIE9uZSBhbGlhcyBjYW4gb25seSBldmVyIG1lYW4gb25lIHBsdWdpbi4gRGVkdXBsaWNhdGluZyBvbiB0aGUgYWxpYXNcbiAgICAgIC8vIGFsb25lIGtlcHQgdGhlIEZJUlNUIHBsdWdpbiBhbmQgc2lsZW50bHkgZHJvcHBlZCB0aGUgc2Vjb25kLCBzbyBhIHN0ZXBcbiAgICAgIC8vIGRlY2xhcmluZyBgeyBuYW1lOiAnbWF2ZW4tYnVpbGQnLCBhbGlhczogJ2J1aWxkJyB9YCBhZnRlciBhbm90aGVyXG4gICAgICAvLyBkZWNsYXJpbmcgYHsgbmFtZTogJ25vZGVqcy1idWlsZCcsIGFsaWFzOiAnYnVpbGQnIH1gIHJhbiBub2RlanMtYnVpbGQnc1xuICAgICAgLy8gaW1hZ2UgYW5kIGNvbW1hbmRzIOKAlCBubyBlcnJvciwganVzdCB0aGUgd3JvbmcgYnVpbGQuXG4gICAgICBpZiAoaG9sZGVyICE9PSB0YXJnZXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBQbHVnaW4gYWxpYXMgXCIke2tleX1cIiBpcyB1c2VkIGZvciB0d28gZGlmZmVyZW50IHBsdWdpbnMgKFwiJHtob2xkZXJ9XCIgYW5kIFwiJHt0YXJnZXR9XCIpLiBgXG4gICAgICAgICAgKyAnR2l2ZSBlYWNoIHBsdWdpbiBpdHMgb3duIGFsaWFzLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNlZW4uc2V0KGtleSwgdGFyZ2V0KTtcbiAgICByZWZzLnB1c2gocik7XG4gIH07XG5cbiAgY29uc3Qgc3ludGggPSBwcm9wcy5zeW50aCBhcyB7IHBsdWdpbj86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgcHVzaChzeW50aD8ucGx1Z2luKTtcblxuICBjb25zdCBzdGFnZXMgPSBwcm9wcy5zdGFnZXMgYXMgQXJyYXk8eyBzdGVwcz86IEFycmF5PHsgcGx1Z2luPzogdW5rbm93biB9PiB9PiB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBzdGFnZSBvZiBzdGFnZXMgPz8gW10pIHtcbiAgICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RhZ2Uuc3RlcHMgPz8gW10pIHtcbiAgICAgIHB1c2goc3RlcC5wbHVnaW4pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWZzO1xufVxuXG4vKiogVGhlIHBsdWdpbiBzZXJ2aWNlJ3MgNDA5IGBJTUFHRV9WRVJJRklDQVRJT05fRkFJTEVEYCBhbnN3ZXIgZnJvbSBgL3BsdWdpbnMvbG9va3VwYC4gKi9cbmZ1bmN0aW9uIGlzSW1hZ2VWZXJpZmljYXRpb25GYWlsdXJlKGVycjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBjb25zdCBkYXRhID0gKGVyciBhcyB7IHJlc3BvbnNlPzogeyBkYXRhPzogdW5rbm93biB9IH0gfCB1bmRlZmluZWQpPy5yZXNwb25zZT8uZGF0YTtcbiAgcmV0dXJuICEhZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgKGRhdGEgYXMgeyBjb2RlPzogdW5rbm93biB9KS5jb2RlID09PSBFcnJvckNvZGUuSU1BR0VfVkVSSUZJQ0FUSU9OX0ZBSUxFRDtcbn1cblxuLyoqXG4gKiBQcmUtcmVzb2x2ZSBwbHVnaW5zIGJ5IGNhbGxpbmcgdGhlIHNhbWUgYFBPU1QgL2FwaS9wbHVnaW5zL2xvb2t1cGAgZW5kcG9pbnRcbiAqIHRoZSBkZXBsb3ktdGltZSBjdXN0b20gcmVzb3VyY2UgTGFtYmRhIHVzZXMuIFJldHVybmluZyB0aGUgZnVsbCBQbHVnaW5cbiAqIHJlY29yZCBhdCBzeW50aCB0aW1lIGlzIHdoYXQgYWxsb3dzIHRoZSByZXN1bHRpbmcgQ0ZOIHRlbXBsYXRlIHRvIHNoaXBcbiAqIHdpdGggcmVhbCBDb2RlQnVpbGQgaW1hZ2UgVVJJcyAoYDxob3N0Pi88bnM+LzxuYW1lPjo8dmVyc2lvbj5gKSByYXRoZXIgdGhhblxuICogdGhlIGBhd3MvY29kZWJ1aWxkL3N0YW5kYXJkOjcuMGAgZmFsbGJhY2sgdGhhdCB0aGUgc3ludGgtdGltZSB0b2tlbiBwYXRoXG4gKiBmb3JjZXMuXG4gKlxuICogRmFpbHVyZXMgYXJlIG5vbi1mYXRhbDogYSBtaXNzaW5nIHBsdWdpbiBvciB1bnJlYWNoYWJsZSBBUEkgbG9ncyBhIHdhcm5pbmdcbiAqIGFuZCBmYWxscyB0aHJvdWdoIHRvIHRoZSBkZXBsb3ktdGltZSBjdXN0b20gcmVzb3VyY2UgcGF0aCBzbyBwYXJ0aWFsXG4gKiBwbGF0Zm9ybSBvdXRhZ2VzIGRvbid0IGJsb2NrIHN5bnRoL2RlcGxveS4gVGhlIGV4Y2VwdGlvbiBpcyBhbiBpbWFnZSB0aGF0XG4gKiBmYWlscyBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIOKAlCB0aGF0IGFib3J0cyB0aGUgc3ludGguXG4gKlxuICogS2V5ZWQgYnkgYGFsaWFzIHx8IG5hbWVgIHRvIG1hdGNoIGBQbHVnaW5Mb29rdXAucGx1Z2luKClgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVBsdWdpbnNGb3JQcm9wcyhcbiAgY2xpZW50OiBBcGlDbGllbnQsXG4gIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgcmVmcyA9IGNvbGxlY3RQbHVnaW5SZWZzKHByb3BzKTtcbiAgaWYgKHJlZnMubGVuZ3RoID09PSAwKSByZXR1cm4ge307XG5cbiAgY29uc3QgcmVzb2x2ZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwocmVmcy5tYXAoYXN5bmMgKHJlZikgPT4ge1xuICAgIGNvbnN0IGtleSA9IGNhY2hlS2V5KHJlZik7XG4gICAgLy8gVGhlIHBsdWdpbiBOQU1FIGxpdmVzIG9uIHRoZSByZWYgKGEgc2libGluZyBvZiBgZmlsdGVyYCksIE5PVCBpbnNpZGUgdGhlXG4gICAgLy8gZmlsdGVyIG9iamVjdCDigJQgYnV0IHRoZSBsb29rdXAgbWF0Y2hlcyBvbiB0aGUgZmlsdGVyLiBBIGZpbHRlciB3aXRob3V0XG4gICAgLy8gYG5hbWVgIChlLmcuIGB7dmVyc2lvbiwgdmlzaWJpbGl0eSwgaXNBY3RpdmUsIGlzRGVmYXVsdH1gKSBtYXRjaGVzIEFOWVxuICAgIC8vIHBsdWdpbiB3aXRoIHRob3NlIGF0dHJpYnV0ZXMsIGFuZCB0aGUgZW5kcG9pbnQgcmV0dXJucyBhbiBhcmJpdHJhcnkgb25lXG4gICAgLy8gKHNlZW46IGBkb2NrZXJmaWxlLW11bHRpLXByb3ZpZGVyYCkuIFRoYXQgbWFkZSB0aGUgc3ludGggYW5kIGV2ZXJ5IHN0ZXBcbiAgICAvLyByZXNvbHZlIHRvIHRoZSBXUk9ORyBwbHVnaW4uIFNvIHdoZW4gdGhlIGZpbHRlciBvbWl0cyBgbmFtZWAsIGZhbGwgYmFjayB0b1xuICAgIC8vIHRoZSByZWYncyBwbHVnaW4gbmFtZTsgYW4gZXhwbGljaXQgZmlsdGVyIGBuYW1lYCBzdGlsbCB0YWtlcyBwcmVjZWRlbmNlLlxuICAgIGNvbnN0IGZpbHRlciA9IHsgbmFtZTogcmVmLm5hbWUsIC4uLihyZWYuZmlsdGVyID8/IHsgaXNBY3RpdmU6IHRydWUsIGlzRGVmYXVsdDogdHJ1ZSB9KSB9O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBjbGllbnQucG9zdDx1bmtub3duPignL2FwaS9wbHVnaW5zL2xvb2t1cCcsIHsgZmlsdGVyIH0pO1xuICAgICAgLy8gVW53cmFwIHRoZSBwbHVnaW4gcmVjb3JkIGZyb20gd2hhdGV2ZXIgZW52ZWxvcGUgdGhlIHJlc3BvbnNlIG1pZGRsZXdhcmVcbiAgICAgIC8vIGFwcGxpZWQuIFRoZSBwbGF0Zm9ybSdzIHN0YW5kYXJkIHN1Y2Nlc3MgZW52ZWxvcGUgaXNcbiAgICAgIC8vIGB7IHN1Y2Nlc3MsIHN0YXR1c0NvZGUsIGRhdGE6IHsgcGx1Z2luOiBQbHVnaW4gfSB9YCAobm90ZSB0aGUgRE9VQkxFXG4gICAgICAvLyBuZXN0aW5nOiBkYXRhLnBsdWdpbiksIGJ1dCB0b2xlcmF0ZSBgeyBkYXRhOiBQbHVnaW4gfWAsIGB7IHBsdWdpbiB9YCxcbiAgICAgIC8vIGFuZCBhIGJhcmUgUGx1Z2luIHRvby4gT25seSBzdG9wcGluZyBhdCBgcmVzLmRhdGFgICh3aGljaCBpc1xuICAgICAgLy8gYHsgcGx1Z2luOiAuLi4gfWApIG1hZGUgYC5uYW1lYCB1bmRlZmluZWQg4oaSIGV2ZXJ5IGxvb2t1cCBmZWxsIGJhY2sgdG9cbiAgICAgIC8vIGRlcGxveS10aW1lIHJlc29sdXRpb24gZXZlbiB0aG91Z2ggdGhlIGNhdGFsb2cgaGFkIHRoZSBwbHVnaW4uXG4gICAgICBjb25zdCBkYXRhID0gKHJlcyBhcyB7IGRhdGE/OiB1bmtub3duIH0pLmRhdGE7XG4gICAgICBjb25zdCBwbHVnaW4gPVxuICAgICAgICAoZGF0YSBhcyB7IHBsdWdpbj86IHVua25vd24gfSB8IHVuZGVmaW5lZCk/LnBsdWdpbiAvLyB7IGRhdGE6IHsgcGx1Z2luIH0gfVxuICAgICAgICA/PyAocmVzIGFzIHsgcGx1Z2luPzogdW5rbm93biB9KS5wbHVnaW4gLy8geyBwbHVnaW4gfVxuICAgICAgICA/PyBkYXRhIC8vIHsgZGF0YTogUGx1Z2luIH1cbiAgICAgICAgPz8gcmVzOyAvLyBiYXJlIFBsdWdpblxuICAgICAgaWYgKHBsdWdpbiAmJiB0eXBlb2YgcGx1Z2luID09PSAnb2JqZWN0JyAmJiAocGx1Z2luIGFzIHsgbmFtZT86IHN0cmluZyB9KS5uYW1lKSB7XG4gICAgICAgIHJlc29sdmVkW2tleV0gPSBwbHVnaW47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcmludFdhcm5pbmcoYFBsdWdpbiBcIiR7cmVmLm5hbWV9XCIgbG9va3VwIHJldHVybmVkIG5vIHJlY29yZCDigJQgZmFsbGluZyBiYWNrIHRvIGRlcGxveS10aW1lIHJlc29sdXRpb25gKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIEEgcGx1Z2luIHdob3NlIGltYWdlIHNpZ25hdHVyZSBkb2Vzbid0IHZlcmlmeSBpcyBOT1QgYW4gb3V0YWdlIHRvIHJpZGVcbiAgICAgIC8vIG91dDogZmFsbGluZyBiYWNrIHdvdWxkIHF1aWV0bHkgdHVybiBpdCBpbnRvIGFuIHVucmVzb2x2ZWQgc3RlcC4gU3RvcC5cbiAgICAgIGlmIChpc0ltYWdlVmVyaWZpY2F0aW9uRmFpbHVyZShlcnIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUGx1Z2luIFwiJHtyZWYubmFtZX1cIiBpbWFnZSBmYWlsZWQgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbjogJHtlcnJvck1lc3NhZ2UoZXJyKX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1zZyA9IGVycm9yTWVzc2FnZShlcnIpO1xuICAgICAgcHJpbnRXYXJuaW5nKGBQbHVnaW4gXCIke3JlZi5uYW1lfVwiIHByZS1yZXNvbHV0aW9uIGZhaWxlZCAoJHttc2d9KSDigJQgZmFsbGluZyBiYWNrIHRvIGRlcGxveS10aW1lIHJlc29sdXRpb25gKTtcbiAgICB9XG4gIH0pKTtcblxuICByZXR1cm4gcmVzb2x2ZWQ7XG59XG4iXX0=
141
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXJlc29sdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3BsdWdpbi1yZXNvbHZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDckUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFXakQ7Ozs7R0FJRztBQUNILFNBQVMsUUFBUSxDQUFDLEdBQWM7SUFDOUIsT0FBTyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGlCQUFpQixDQUFDLEtBQThCO0lBQ3ZELE1BQU0sSUFBSSxHQUFnQixFQUFFLENBQUM7SUFDN0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFFdkMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFZLEVBQVEsRUFBRTtRQUNsQyxJQUFJLENBQUMsR0FBRyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7WUFBRSxPQUFPO1FBQzVDLE1BQU0sQ0FBQyxHQUFHLEdBQWdCLENBQUM7UUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUNwQixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEIsd0VBQXdFO1FBQ3hFLDJFQUEyRTtRQUMzRSxNQUFNLElBQUksR0FBSSxDQUFDLENBQUMsTUFBTSxFQUFFLElBQTJCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQztRQUM5RCxNQUFNLE1BQU0sR0FBRyxD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R0FBRyxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QixZQUFZLENBQUMsV0FBVyxLQUFLLDRCQUE0QixHQUFHLDRDQUE0QyxDQUFDLENBQUM7UUFDNUcsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFSixPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IEVycm9yQ29kZSwgZXJyb3JNZXNzYWdlIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgcGx1Z2luQXJ0aWZhY3RBbGlhcywgcGx1Z2luTG9va3VwRmlsdGVyLCB1bndyYXBMb29rdXAgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1jb3JlJztcbmltcG9ydCB7IEFwaUNsaWVudCB9IGZyb20gJy4vYXBpLWNsaWVudC5qcyc7XG5pbXBvcnQgeyBwcmludFdhcm5pbmcgfSBmcm9tICcuL291dHB1dC11dGlscy5qcyc7XG5cbi8qKiBNaW5pbWFsIHBsdWdpbiByZWZlcmVuY2Ugc2hhcGUg4oCUIG1hdGNoZXMgUGx1Z2luT3B0aW9ucyBmcm9tIHBpcGVsaW5lLWNvcmUuICovXG5pbnRlcmZhY2UgUGx1Z2luUmVmIHtcbiAgbmFtZTogc3RyaW5nO1xuICAvKiogUHVibGlzaGVyIGhhbmRsZSBvZiBhbiBpbnN0YWxsZWQgbGlzdGluZy4gKi9cbiAgcHVibGlzaGVyPzogc3RyaW5nO1xuICBhbGlhcz86IHN0cmluZztcbiAgZmlsdGVyPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKlxuICogQ2FjaGUga2V5IG1hdGNoaW5nIGBQbHVnaW5Mb29rdXAubm9ybWFsaXplKClgOiB0aGUgZXhwbGljaXQgYWxpYXMgd2hlbiBzZXQsXG4gKiBvdGhlcndpc2UgYFs8cHVibGlzaGVyPi1dPG5hbWU+LWFsaWFzYCDigJQgcGlwZWxpbmUtY29yZSdzXG4gKiBgcGx1Z2luQXJ0aWZhY3RBbGlhc2AsIHRoZSBvbmUgcnVsZSBldmVyeSBjb25zdW1lciBvZiB0aGlzIG1hcCB1c2VzLlxuICovXG5mdW5jdGlvbiBjYWNoZUtleShyZWY6IFBsdWdpblJlZik6IHN0cmluZyB7XG4gIHJldHVybiBwbHVnaW5BcnRpZmFjdEFsaWFzKHJlZik7XG59XG5cbi8qKlxuICogV2FsayB0aGUgcGlwZWxpbmUgcHJvcHMgdHJlZSB0byBjb2xsZWN0IGV2ZXJ5IHBsdWdpbiByZWZlcmVuY2UuIFBsdWdpbnNcbiAqIGFwcGVhciBhdCBgc3ludGgucGx1Z2luYCBhbmQgYXQgYHN0YWdlc1tdLnN0ZXBzW10ucGx1Z2luYC4gRW50cmllcyBhcmVcbiAqIGRlLWR1cGxpY2F0ZWQgYnkgYGNhY2hlS2V5KClgIOKAlCB0aGUgc2FtZSBrZXkgYFBsdWdpbkxvb2t1cC5wbHVnaW4oKWAgdXNlcyxcbiAqIHNvIHRoZSByZXNvbHZlZC1wbHVnaW5zIG1hcCBsb29rdXBzIG1hdGNoIGRvd25zdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RQbHVnaW5SZWZzKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFBsdWdpblJlZltdIHtcbiAgY29uc3QgcmVmczogUGx1Z2luUmVmW10gPSBbXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgY29uc3QgcHVzaCA9IChyYXc6IHVua25vd24pOiB2b2lkID0+IHtcbiAgICBpZiAoIXJhdyB8fCB0eXBlb2YgcmF3ICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuICAgIGNvbnN0IHIgPSByYXcgYXMgUGx1Z2luUmVmO1xuICAgIGlmICghci5uYW1lKSByZXR1cm47XG4gICAgY29uc3Qga2V5ID0gY2FjaGVLZXkocik7XG4gICAgLy8gVGhlIG5hbWUgdGhlIGxvb2t1cCB3aWxsIFRBUkdFVCDigJQgYW4gZXhwbGljaXQgYGZpbHRlci5uYW1lYCB3aW5zIChzZWVcbiAgICAvLyBiZWxvdyksIHNvIHR3byByZWZzIHRoYXQgcmVzb2x2ZSB0byB0aGUgc2FtZSBwbHVnaW4gYXJlIG5vdCBhIGNvbGxpc2lvbi5cbiAgICBjb25zdCBuYW1lID0gKHIuZmlsdGVyPy5uYW1lIGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgPz8gci5uYW1lO1xuICAgIGNvbnN0IHRhcmdldCA9IHIucHVibGlzaGVyID8gYCR7ci5wdWJsaXNoZXJ9LyR7bmFtZX1gIDogbmFtZTtcbiAgICBjb25zdCBob2xkZXIgPSBzZWVuLmdldChrZXkpO1xuICAgIGlmIChob2xkZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gT25lIGFsaWFzIGNhbiBvbmx5IGV2ZXIgbWVhbiBvbmUgcGx1Z2luLiBEZWR1cGxpY2F0aW5nIG9uIHRoZSBhbGlhc1xuICAgICAgLy8gYWxvbmUga2VwdCB0aGUgRklSU1QgcGx1Z2luIGFuZCBzaWxlbnRseSBkcm9wcGVkIHRoZSBzZWNvbmQsIHNvIGEgc3RlcFxuICAgICAgLy8gZGVjbGFyaW5nIGB7IG5hbWU6ICdtYXZlbi1idWlsZCcsIGFsaWFzOiAnYnVpbGQnIH1gIGFmdGVyIGFub3RoZXJcbiAgICAgIC8vIGRlY2xhcmluZyBgeyBuYW1lOiAnbm9kZWpzLWJ1aWxkJywgYWxpYXM6ICdidWlsZCcgfWAgcmFuIG5vZGVqcy1idWlsZCdzXG4gICAgICAvLyBpbWFnZSBhbmQgY29tbWFuZHMg4oCUIG5vIGVycm9yLCBqdXN0IHRoZSB3cm9uZyBidWlsZC5cbiAgICAgIGlmIChob2xkZXIgIT09IHRhcmdldCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFBsdWdpbiBhbGlhcyBcIiR7a2V5fVwiIGlzIHVzZWQgZm9yIHR3byBkaWZmZXJlbnQgcGx1Z2lucyAoXCIke2hvbGRlcn1cIiBhbmQgXCIke3RhcmdldH1cIikuIGBcbiAgICAgICAgICArICdHaXZlIGVhY2ggcGx1Z2luIGl0cyBvd24gYWxpYXMuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2Vlbi5zZXQoa2V5LCB0YXJnZXQpO1xuICAgIHJlZnMucHVzaChyKTtcbiAgfTtcblxuICBjb25zdCBzeW50aCA9IHByb3BzLnN5bnRoIGFzIHsgcGx1Z2luPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICBwdXNoKHN5bnRoPy5wbHVnaW4pO1xuXG4gIGNvbnN0IHN0YWdlcyA9IHByb3BzLnN0YWdlcyBhcyBBcnJheTx7IHN0ZXBzPzogQXJyYXk8eyBwbHVnaW4/OiB1bmtub3duIH0+IH0+IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IHN0YWdlIG9mIHN0YWdlcyA/PyBbXSkge1xuICAgIGZvciAoY29uc3Qgc3RlcCBvZiBzdGFnZS5zdGVwcyA/PyBbXSkge1xuICAgICAgcHVzaChzdGVwLnBsdWdpbik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlZnM7XG59XG5cbi8qKlxuICogTG9va3VwIHJlZnVzYWxzIHRoYXQgbXVzdCBTVE9QIHRoZSBzeW50aCByYXRoZXIgdGhhbiBmYWxsIGJhY2sgdG9cbiAqIGRlcGxveS10aW1lIHJlc29sdXRpb246IGFuIGltYWdlIHdob3NlIHNpZ25hdHVyZSBkb2Vzbid0IHZlcmlmeSwgYW5kIGFcbiAqIGxpc3RpbmcgdGhlIG9yZyBjYW4ndCB1c2UgKG5vdCBpbnN0YWxsZWQsIGJsb2NrZWQgYnkgaXRzIHBvbGljeSwgeWFua2VkIG9yXG4gKiBzdXNwZW5kZWQpLiBGYWxsaW5nIGJhY2sgd291bGQgcXVpZXRseSB0dXJuXG4gKiBlYWNoIGludG8gYW4gdW5yZXNvbHZlZCBzdGVwIHRoYXQgZmFpbHMgYXQgcnVuIHRpbWUgaW5zdGVhZCBvZiBub3cuXG4gKi9cbmNvbnN0IEZBVEFMX0xPT0tVUF9DT0RFUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gIEVycm9yQ29kZS5JTUFHRV9WRVJJRklDQVRJT05fRkFJTEVELFxuICBFcnJvckNvZGUuUExVR0lOX05PVF9JTlNUQUxMRUQsXG4gIEVycm9yQ29kZS5QTFVHSU5fQkxPQ0tFRF9CWV9QT0xJQ1ksXG4gIEVycm9yQ29kZS5QTFVHSU5fVU5BVkFJTEFCTEUsXG5dO1xuXG4vKiogVGhlIGVycm9yIGNvZGUgb2YgYSBwbHVnaW4gc2VydmljZSBhbnN3ZXIsIHdoZW4gaXQgaXMgb25lIG9mIHtAbGluayBGQVRBTF9MT09LVVBfQ09ERVN9LiAqL1xuZnVuY3Rpb24gZmF0YWxMb29rdXBDb2RlKGVycjogdW5rbm93bik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBkYXRhID0gKGVyciBhcyB7IHJlc3BvbnNlPzogeyBkYXRhPzogdW5rbm93biB9IH0gfCB1bmRlZmluZWQpPy5yZXNwb25zZT8uZGF0YTtcbiAgY29uc3QgY29kZSA9IGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gKGRhdGEgYXMgeyBjb2RlPzogdW5rbm93biB9KS5jb2RlIDogdW5kZWZpbmVkO1xuICByZXR1cm4gdHlwZW9mIGNvZGUgPT09ICdzdHJpbmcnICYmIEZBVEFMX0xPT0tVUF9DT0RFUy5pbmNsdWRlcyhjb2RlKSA/IGNvZGUgOiBudWxsO1xufVxuXG4vKipcbiAqIFByZS1yZXNvbHZlIHBsdWdpbnMgYnkgY2FsbGluZyB0aGUgc2FtZSBgUE9TVCAvYXBpL3BsdWdpbnMvbG9va3VwYCBlbmRwb2ludFxuICogdGhlIGRlcGxveS10aW1lIGN1c3RvbSByZXNvdXJjZSBMYW1iZGEgdXNlcy4gUmV0dXJuaW5nIHRoZSBmdWxsIFBsdWdpblxuICogcmVjb3JkIGF0IHN5bnRoIHRpbWUgaXMgd2hhdCBhbGxvd3MgdGhlIHJlc3VsdGluZyBDRk4gdGVtcGxhdGUgdG8gc2hpcFxuICogd2l0aCByZWFsIENvZGVCdWlsZCBpbWFnZSBVUklzIChgPGhvc3Q+Lzxucz4vPG5hbWU+Ojx2ZXJzaW9uPmApIHJhdGhlciB0aGFuXG4gKiB0aGUgYGF3cy9jb2RlYnVpbGQvc3RhbmRhcmQ6Ny4wYCBmYWxsYmFjayB0aGF0IHRoZSBzeW50aC10aW1lIHRva2VuIHBhdGhcbiAqIGZvcmNlcy5cbiAqXG4gKiBGYWlsdXJlcyBhcmUgbm9uLWZhdGFsOiBhIG1pc3NpbmcgcGx1Z2luIG9yIHVucmVhY2hhYmxlIEFQSSBsb2dzIGEgd2FybmluZ1xuICogYW5kIGZhbGxzIHRocm91Z2ggdG8gdGhlIGRlcGxveS10aW1lIGN1c3RvbSByZXNvdXJjZSBwYXRoIHNvIHBhcnRpYWxcbiAqIHBsYXRmb3JtIG91dGFnZXMgZG9uJ3QgYmxvY2sgc3ludGgvZGVwbG95LiBUaGUgZXhjZXB0aW9uIGlzIGFuIGltYWdlIHRoYXRcbiAqIGZhaWxzIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24g4oCUIHRoYXQgYWJvcnRzIHRoZSBzeW50aC5cbiAqXG4gKiBLZXllZCBieSBgYWxpYXMgfHwgbmFtZWAgdG8gbWF0Y2ggYFBsdWdpbkxvb2t1cC5wbHVnaW4oKWAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlUGx1Z2luc0ZvclByb3BzKFxuICBjbGllbnQ6IEFwaUNsaWVudCxcbiAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBjb25zdCByZWZzID0gY29sbGVjdFBsdWdpblJlZnMocHJvcHMpO1xuICBpZiAocmVmcy5sZW5ndGggPT09IDApIHJldHVybiB7fTtcblxuICBjb25zdCByZXNvbHZlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICBhd2FpdCBQcm9taXNlLmFsbChyZWZzLm1hcChhc3luYyAocmVmKSA9PiB7XG4gICAgY29uc3Qga2V5ID0gY2FjaGVLZXkocmVmKTtcbiAgICBjb25zdCBsYWJlbCA9IHJlZi5wdWJsaXNoZXIgPyBgJHtyZWYucHVibGlzaGVyfS8ke3JlZi5uYW1lfWAgOiByZWYubmFtZTtcbiAgICAvLyBUaGUgcGx1Z2luIE5BTUUgbGl2ZXMgb24gdGhlIHJlZiAoYSBzaWJsaW5nIG9mIGBmaWx0ZXJgKSwgTk9UIGluc2lkZSB0aGVcbiAgICAvLyBmaWx0ZXIgb2JqZWN0IOKAlCBidXQgdGhlIGxvb2t1cCBtYXRjaGVzIG9uIHRoZSBmaWx0ZXIuIEEgZmlsdGVyIHdpdGhvdXRcbiAgICAvLyBgbmFtZWAgKGUuZy4gYHt2ZXJzaW9uLCB2aXNpYmlsaXR5LCBpc0FjdGl2ZSwgaXNEZWZhdWx0fWApIG1hdGNoZXMgQU5ZXG4gICAgLy8gcGx1Z2luIHdpdGggdGhvc2UgYXR0cmlidXRlcywgYW5kIHRoZSBlbmRwb2ludCByZXR1cm5zIGFuIGFyYml0cmFyeSBvbmVcbiAgICAvLyAoc2VlbjogYGRvY2tlcmZpbGUtbXVsdGktcHJvdmlkZXJgKS4gVGhhdCBtYWRlIHRoZSBzeW50aCBhbmQgZXZlcnkgc3RlcFxuICAgIC8vIHJlc29sdmUgdG8gdGhlIFdST05HIHBsdWdpbi4gU28gd2hlbiB0aGUgZmlsdGVyIG9taXRzIGBuYW1lYCwgZmFsbCBiYWNrIHRvXG4gICAgLy8gdGhlIHJlZidzIHBsdWdpbiBuYW1lOyBhbiBleHBsaWNpdCBmaWx0ZXIgYG5hbWVgIHN0aWxsIHRha2VzIHByZWNlZGVuY2UuXG4gICAgLy8gU2hhcmVkIHdpdGggdGhlIHBpcGVsaW5lIHNlcnZpY2UncyBjb250cmFjdCBjaGVjayAoc2FtZSBmaWx0ZXIsIHNhbWUgcGx1Z2luKS5cbiAgICBjb25zdCBmaWx0ZXIgPSBwbHVnaW5Mb29rdXBGaWx0ZXIocmVmKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgY2xpZW50LnBvc3Q8dW5rbm93bj4oJy9hcGkvcGx1Z2lucy9sb29rdXAnLCB7IGZpbHRlciB9KTtcbiAgICAgIGNvbnN0IHsgcGx1Z2luLCB3YXJuaW5ncyB9ID0gdW53cmFwTG9va3VwKHJlcyk7XG4gICAgICBmb3IgKGNvbnN0IHdhcm5pbmcgb2Ygd2FybmluZ3MpIHtcbiAgICAgICAgcHJpbnRXYXJuaW5nKGBQbHVnaW4gXCIke2xhYmVsfVwiOiAke3dhcm5pbmd9YCk7XG4gICAgICB9XG4gICAgICBpZiAocGx1Z2luKSB7XG4gICAgICAgIHJlc29sdmVkW2tleV0gPSBwbHVnaW47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcmludFdhcm5pbmcoYFBsdWdpbiBcIiR7bGFiZWx9XCIgbG9va3VwIHJldHVybmVkIG5vIHJlY29yZCDigJQgZmFsbGluZyBiYWNrIHRvIGRlcGxveS10aW1lIHJlc29sdXRpb25gKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIEEgcGx1Z2luIHdob3NlIGltYWdlIHNpZ25hdHVyZSBkb2Vzbid0IHZlcmlmeSwgb3IgYSBsaXN0aW5nIHRoZSBvcmdcbiAgICAgIC8vIGNhbid0IHVzZSwgaXMgTk9UIGFuIG91dGFnZSB0byByaWRlIG91dDogZmFsbGluZyBiYWNrIHdvdWxkIHF1aWV0bHlcbiAgICAgIC8vIHR1cm4gaXQgaW50byBhbiB1bnJlc29sdmVkIHN0ZXAuIFN0b3AuXG4gICAgICBjb25zdCBmYXRhbCA9IGZhdGFsTG9va3VwQ29kZShlcnIpO1xuICAgICAgaWYgKGZhdGFsID09PSBFcnJvckNvZGUuSU1BR0VfVkVSSUZJQ0FUSU9OX0ZBSUxFRCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiBcIiR7bGFiZWx9XCIgaW1hZ2UgZmFpbGVkIHNpZ25hdHVyZSB2ZXJpZmljYXRpb246ICR7ZXJyb3JNZXNzYWdlKGVycil9YCk7XG4gICAgICB9XG4gICAgICBpZiAoZmF0YWwpIHRocm93IG5ldyBFcnJvcihgUGx1Z2luIFwiJHtsYWJlbH1cIiBjYW4ndCBiZSB1c2VkICgke2ZhdGFsfSk6ICR7ZXJyb3JNZXNzYWdlKGVycil9YCk7XG4gICAgICBjb25zdCBtc2cgPSBlcnJvck1lc3NhZ2UoZXJyKTtcbiAgICAgIHByaW50V2FybmluZyhgUGx1Z2luIFwiJHtsYWJlbH1cIiBwcmUtcmVzb2x1dGlvbiBmYWlsZWQgKCR7bXNnfSkg4oCUIGZhbGxpbmcgYmFjayB0byBkZXBsb3ktdGltZSByZXNvbHV0aW9uYCk7XG4gICAgfVxuICB9KSk7XG5cbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuIl19
@@ -0,0 +1,22 @@
1
+ import { type Exec } from './plugin-docker.js';
2
+ export declare const SEVERITIES: readonly ['Critical', 'High', 'Medium', 'Low', 'Negligible', 'Unknown'];
3
+ export type SeverityCounts = Record<typeof SEVERITIES[number], number>;
4
+ export type ScanPreview = {
5
+ status: 'scanned';
6
+ counts: SeverityCounts;
7
+ critical: string[];
8
+ } | {
9
+ status: 'unavailable';
10
+ reason: string;
11
+ } | {
12
+ status: 'failed';
13
+ reason: string;
14
+ };
15
+ /** Count grype JSON matches by severity; list the critical ones (`CVE in package@version`). */
16
+ export declare function summarizeGrype(json: string): {
17
+ counts: SeverityCounts;
18
+ critical: string[];
19
+ };
20
+ /** SBOM (syft) + scan (grype) of a local image. Never throws. */
21
+ export declare function scanPreview(exec: Exec, image: string): ScanPreview;
22
+ //# sourceMappingURL=plugin-scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-scan.d.ts","sourceRoot":"","sources":["../../src/utils/plugin-scan.ts"],"names":[],"mappings":"AAaA,OAAO,EAAW,KAAK,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAExD,eAAO,MAAM,UAAU,YAAI,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,CAAU,CAAC;AAClG,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;AAEvE,MAAM,MAAM,WAAW,GACnB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,GACjE;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC,+FAA+F;AAC/F,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAU3F;AAED,iEAAiE;AACjE,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,CAkBlE"}
@@ -0,0 +1,52 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * The local SCAN PREVIEW before `plugin publish`: syft builds an SBOM of the
5
+ * plugin image, grype scans that SBOM — the same pair the platform runs over
6
+ * the signed SBOM after upload. A critical finding fails the publish gate
7
+ * there, so it fails here first.
8
+ */
9
+ import fs from 'fs';
10
+ import os from 'os';
11
+ import path from 'path';
12
+ import { hasTool } from './plugin-docker.js';
13
+ export const SEVERITIES = ['Critical', 'High', 'Medium', 'Low', 'Negligible', 'Unknown'];
14
+ /** Count grype JSON matches by severity; list the critical ones (`CVE in package@version`). */
15
+ export function summarizeGrype(json) {
16
+ const counts = Object.fromEntries(SEVERITIES.map(s => [s, 0]));
17
+ const critical = [];
18
+ const doc = JSON.parse(json);
19
+ for (const m of doc.matches ?? []) {
20
+ const sev = SEVERITIES.includes(m.vulnerability?.severity ?? '') ? m.vulnerability.severity : 'Unknown';
21
+ counts[sev] += 1;
22
+ if (sev === 'Critical')
23
+ critical.push(`${m.vulnerability?.id ?? '?'} in ${m.artifact?.name ?? '?'}@${m.artifact?.version ?? '?'}`);
24
+ }
25
+ return { counts, critical };
26
+ }
27
+ /** SBOM (syft) + scan (grype) of a local image. Never throws. */
28
+ export function scanPreview(exec, image) {
29
+ const missing = ['syft', 'grype'].filter(t => !hasTool(exec, t, ['version']));
30
+ if (missing.length)
31
+ return { status: 'unavailable', reason: `${missing.join(' and ')} not installed` };
32
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'pipeline-manager-scan-'));
33
+ try {
34
+ const sbom = path.join(dir, 'sbom.spdx.json');
35
+ const s = exec('syft', ['scan', `docker:${image}`, '-o', `spdx-json=${sbom}`, '-q']);
36
+ if (s.error || s.status !== 0)
37
+ return { status: 'failed', reason: `syft could not build the SBOM: ${(s.stderr || s.error?.message || '').trim()}` };
38
+ const g = exec('grype', [`sbom:${sbom}`, '-o', 'json', '-q']);
39
+ if (g.error || g.status !== 0)
40
+ return { status: 'failed', reason: `grype could not scan the SBOM: ${(g.stderr || g.error?.message || '').trim()}` };
41
+ try {
42
+ return { status: 'scanned', ...summarizeGrype(g.stdout) };
43
+ }
44
+ catch {
45
+ return { status: 'failed', reason: 'grype output was not JSON' };
46
+ }
47
+ }
48
+ finally {
49
+ fs.rmSync(dir, { recursive: true, force: true });
50
+ }
51
+ }
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXNjYW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvcGx1Z2luLXNjYW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQixPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxPQUFPLEVBQWEsTUFBTSxvQkFBb0IsQ0FBQztBQUV4RCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLFNBQVMsQ0FBVSxDQUFDO0FBUWxHLCtGQUErRjtBQUMvRixNQUFNLFVBQVUsY0FBYyxDQUFDLElBQVk7SUFDekMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBbUIsQ0FBQztJQUNqRixNQUFNLFFBQVEsR0FBYSxFQUFFLENBQUM7SUFDOUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQWdJLENBQUM7SUFDNUosS0FBSyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sR0FBRyxHQUFJLFVBQWdDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYyxDQUFDLFFBQXFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUM3SixNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pCLElBQUksR0FBRyxLQUFLLFVBQVU7WUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLE9BQU8sSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3JJLENBQUM7SUFDRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDO0FBQzlCLENBQUM7QUFFRCxpRUFBaUU7QUFDakUsTUFBTSxVQUFVLFdBQVcsQ0FBQyxJQUFVLEVBQUUsS0FBYTtJQUNuRCxNQUFNLE9BQU8sR0FBRyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlFLElBQUksT0FBTyxDQUFDLE1BQU07UUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQ3ZHLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsd0JBQXdCLENBQUMsQ0FBQyxDQUFDO0lBQzdFLElBQUksQ0FBQztRQUNILE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDOUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxVQUFVLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxhQUFhLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDckYsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxrQ0FBa0MsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUNwSixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxrQ0FBa0MsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUNwSixJQUFJLENBQUM7WUFDSCxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUM1RCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLDJCQUEyQixFQUFFLENBQUM7UUFDbkUsQ0FBQztJQUNILENBQUM7WUFBUyxDQUFDO1FBQ1QsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ25ELENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogVGhlIGxvY2FsIFNDQU4gUFJFVklFVyBiZWZvcmUgYHBsdWdpbiBwdWJsaXNoYDogc3lmdCBidWlsZHMgYW4gU0JPTSBvZiB0aGVcbiAqIHBsdWdpbiBpbWFnZSwgZ3J5cGUgc2NhbnMgdGhhdCBTQk9NIOKAlCB0aGUgc2FtZSBwYWlyIHRoZSBwbGF0Zm9ybSBydW5zIG92ZXJcbiAqIHRoZSBzaWduZWQgU0JPTSBhZnRlciB1cGxvYWQuIEEgY3JpdGljYWwgZmluZGluZyBmYWlscyB0aGUgcHVibGlzaCBnYXRlXG4gKiB0aGVyZSwgc28gaXQgZmFpbHMgaGVyZSBmaXJzdC5cbiAqL1xuXG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgaGFzVG9vbCwgdHlwZSBFeGVjIH0gZnJvbSAnLi9wbHVnaW4tZG9ja2VyLmpzJztcblxuZXhwb3J0IGNvbnN0IFNFVkVSSVRJRVMgPSBbJ0NyaXRpY2FsJywgJ0hpZ2gnLCAnTWVkaXVtJywgJ0xvdycsICdOZWdsaWdpYmxlJywgJ1Vua25vd24nXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFNldmVyaXR5Q291bnRzID0gUmVjb3JkPHR5cGVvZiBTRVZFUklUSUVTW251bWJlcl0sIG51bWJlcj47XG5cbmV4cG9ydCB0eXBlIFNjYW5QcmV2aWV3ID1cbiAgfCB7IHN0YXR1czogJ3NjYW5uZWQnOyBjb3VudHM6IFNldmVyaXR5Q291bnRzOyBjcml0aWNhbDogc3RyaW5nW10gfVxuICB8IHsgc3RhdHVzOiAndW5hdmFpbGFibGUnOyByZWFzb246IHN0cmluZyB9XG4gIHwgeyBzdGF0dXM6ICdmYWlsZWQnOyByZWFzb246IHN0cmluZyB9O1xuXG4vKiogQ291bnQgZ3J5cGUgSlNPTiBtYXRjaGVzIGJ5IHNldmVyaXR5OyBsaXN0IHRoZSBjcml0aWNhbCBvbmVzIChgQ1ZFIGluIHBhY2thZ2VAdmVyc2lvbmApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1bW1hcml6ZUdyeXBlKGpzb246IHN0cmluZyk6IHsgY291bnRzOiBTZXZlcml0eUNvdW50czsgY3JpdGljYWw6IHN0cmluZ1tdIH0ge1xuICBjb25zdCBjb3VudHMgPSBPYmplY3QuZnJvbUVudHJpZXMoU0VWRVJJVElFUy5tYXAocyA9PiBbcywgMF0pKSBhcyBTZXZlcml0eUNvdW50cztcbiAgY29uc3QgY3JpdGljYWw6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGRvYyA9IEpTT04ucGFyc2UoanNvbikgYXMgeyBtYXRjaGVzPzogQXJyYXk8eyB2dWxuZXJhYmlsaXR5PzogeyBpZD86IHN0cmluZzsgc2V2ZXJpdHk/OiBzdHJpbmcgfTsgYXJ0aWZhY3Q/OiB7IG5hbWU/OiBzdHJpbmc7IHZlcnNpb24/OiBzdHJpbmcgfSB9PiB9O1xuICBmb3IgKGNvbnN0IG0gb2YgZG9jLm1hdGNoZXMgPz8gW10pIHtcbiAgICBjb25zdCBzZXYgPSAoU0VWRVJJVElFUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXMobS52dWxuZXJhYmlsaXR5Py5zZXZlcml0eSA/PyAnJykgPyBtLnZ1bG5lcmFiaWxpdHkhLnNldmVyaXR5IGFzIHR5cGVvZiBTRVZFUklUSUVTW251bWJlcl0gOiAnVW5rbm93bic7XG4gICAgY291bnRzW3Nldl0gKz0gMTtcbiAgICBpZiAoc2V2ID09PSAnQ3JpdGljYWwnKSBjcml0aWNhbC5wdXNoKGAke20udnVsbmVyYWJpbGl0eT8uaWQgPz8gJz8nfSBpbiAke20uYXJ0aWZhY3Q/Lm5hbWUgPz8gJz8nfUAke20uYXJ0aWZhY3Q/LnZlcnNpb24gPz8gJz8nfWApO1xuICB9XG4gIHJldHVybiB7IGNvdW50cywgY3JpdGljYWwgfTtcbn1cblxuLyoqIFNCT00gKHN5ZnQpICsgc2NhbiAoZ3J5cGUpIG9mIGEgbG9jYWwgaW1hZ2UuIE5ldmVyIHRocm93cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY2FuUHJldmlldyhleGVjOiBFeGVjLCBpbWFnZTogc3RyaW5nKTogU2NhblByZXZpZXcge1xuICBjb25zdCBtaXNzaW5nID0gWydzeWZ0JywgJ2dyeXBlJ10uZmlsdGVyKHQgPT4gIWhhc1Rvb2woZXhlYywgdCwgWyd2ZXJzaW9uJ10pKTtcbiAgaWYgKG1pc3NpbmcubGVuZ3RoKSByZXR1cm4geyBzdGF0dXM6ICd1bmF2YWlsYWJsZScsIHJlYXNvbjogYCR7bWlzc2luZy5qb2luKCcgYW5kICcpfSBub3QgaW5zdGFsbGVkYCB9O1xuICBjb25zdCBkaXIgPSBmcy5ta2R0ZW1wU3luYyhwYXRoLmpvaW4ob3MudG1wZGlyKCksICdwaXBlbGluZS1tYW5hZ2VyLXNjYW4tJykpO1xuICB0cnkge1xuICAgIGNvbnN0IHNib20gPSBwYXRoLmpvaW4oZGlyLCAnc2JvbS5zcGR4Lmpzb24nKTtcbiAgICBjb25zdCBzID0gZXhlYygnc3lmdCcsIFsnc2NhbicsIGBkb2NrZXI6JHtpbWFnZX1gLCAnLW8nLCBgc3BkeC1qc29uPSR7c2JvbX1gLCAnLXEnXSk7XG4gICAgaWYgKHMuZXJyb3IgfHwgcy5zdGF0dXMgIT09IDApIHJldHVybiB7IHN0YXR1czogJ2ZhaWxlZCcsIHJlYXNvbjogYHN5ZnQgY291bGQgbm90IGJ1aWxkIHRoZSBTQk9NOiAkeyhzLnN0ZGVyciB8fCBzLmVycm9yPy5tZXNzYWdlIHx8ICcnKS50cmltKCl9YCB9O1xuICAgIGNvbnN0IGcgPSBleGVjKCdncnlwZScsIFtgc2JvbToke3Nib219YCwgJy1vJywgJ2pzb24nLCAnLXEnXSk7XG4gICAgaWYgKGcuZXJyb3IgfHwgZy5zdGF0dXMgIT09IDApIHJldHVybiB7IHN0YXR1czogJ2ZhaWxlZCcsIHJlYXNvbjogYGdyeXBlIGNvdWxkIG5vdCBzY2FuIHRoZSBTQk9NOiAkeyhnLnN0ZGVyciB8fCBnLmVycm9yPy5tZXNzYWdlIHx8ICcnKS50cmltKCl9YCB9O1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyBzdGF0dXM6ICdzY2FubmVkJywgLi4uc3VtbWFyaXplR3J5cGUoZy5zdGRvdXQpIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4geyBzdGF0dXM6ICdmYWlsZWQnLCByZWFzb246ICdncnlwZSBvdXRwdXQgd2FzIG5vdCBKU09OJyB9O1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBmcy5ybVN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,15 @@
1
+ export interface ZipEntry {
2
+ /** Forward-slash path relative to the zip root. */
3
+ name: string;
4
+ data: Buffer;
5
+ }
6
+ /**
7
+ * The files a plugin zip carries, sorted. `image.tar` rides along only for a
8
+ * `prebuilt` plugin (the server builds `build_image` plugins itself).
9
+ */
10
+ export declare function collectPluginFiles(dir: string, opts: {
11
+ includeImageTar: boolean;
12
+ }): ZipEntry[];
13
+ /** Write `entries` as a ZIP archive. */
14
+ export declare function writeZip(entries: ZipEntry[]): Buffer;
15
+ //# sourceMappingURL=plugin-zip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-zip.d.ts","sourceRoot":"","sources":["../../src/utils/plugin-zip.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,QAAQ;IACvB,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,eAAe,EAAE,OAAO,CAAA;CAAE,GAAG,QAAQ,EAAE,CAiB9F;AAMD,wCAAwC;AACxC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,CAqDpD"}
@@ -0,0 +1,96 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * Package a local plugin directory as the zip the upload API takes (the
5
+ * directory IS the zip root). A small, dependency-free ZIP writer: DEFLATE
6
+ * entries, regular files only — symlinks and anything outside the directory
7
+ * are refused, which the server would refuse anyway.
8
+ */
9
+ import fs from 'fs';
10
+ import path from 'path';
11
+ import zlib from 'zlib';
12
+ /** Never packaged: build outputs and VCS/editor state. */
13
+ const EXCLUDED = new Set(['.git', '.DS_Store', 'node_modules', 'plugin.zip']);
14
+ /**
15
+ * The files a plugin zip carries, sorted. `image.tar` rides along only for a
16
+ * `prebuilt` plugin (the server builds `build_image` plugins itself).
17
+ */
18
+ export function collectPluginFiles(dir, opts) {
19
+ const root = path.resolve(dir);
20
+ const entries = [];
21
+ const walk = (abs) => {
22
+ for (const name of fs.readdirSync(abs).sort()) {
23
+ if (EXCLUDED.has(name))
24
+ continue;
25
+ const full = path.join(abs, name);
26
+ const rel = path.relative(root, full).split(path.sep).join('/');
27
+ if (rel === 'image.tar' && !opts.includeImageTar)
28
+ continue;
29
+ const st = fs.lstatSync(full);
30
+ if (st.isSymbolicLink())
31
+ throw new Error(`Refusing to package a symlink: ${rel}`);
32
+ if (st.isDirectory())
33
+ walk(full);
34
+ else if (st.isFile())
35
+ entries.push({ name: rel, data: fs.readFileSync(full) });
36
+ }
37
+ };
38
+ walk(root);
39
+ return entries;
40
+ }
41
+ /** DOS date/time for the zip headers (fixed, so a package is reproducible). */
42
+ const DOS_TIME = 0;
43
+ const DOS_DATE = 33; // 1980-01-01: (0 years << 9) | (month 1 << 5) | day 1
44
+ /** Write `entries` as a ZIP archive. */
45
+ export function writeZip(entries) {
46
+ const locals = [];
47
+ const centrals = [];
48
+ let offset = 0;
49
+ for (const entry of entries) {
50
+ const name = Buffer.from(entry.name, 'utf-8');
51
+ const compressed = zlib.deflateRawSync(entry.data);
52
+ const crc = zlib.crc32(entry.data);
53
+ const local = Buffer.alloc(30);
54
+ local.writeUInt32LE(0x04034b50, 0);
55
+ local.writeUInt16LE(20, 4); // version needed
56
+ local.writeUInt16LE(0x0800, 6); // UTF-8 names
57
+ local.writeUInt16LE(8, 8); // deflate
58
+ local.writeUInt16LE(DOS_TIME, 10);
59
+ local.writeUInt16LE(DOS_DATE, 12);
60
+ local.writeUInt32LE(crc, 14);
61
+ local.writeUInt32LE(compressed.length, 18);
62
+ local.writeUInt32LE(entry.data.length, 22);
63
+ local.writeUInt16LE(name.length, 26);
64
+ local.writeUInt16LE(0, 28);
65
+ locals.push(local, name, compressed);
66
+ const central = Buffer.alloc(46);
67
+ central.writeUInt32LE(0x02014b50, 0);
68
+ central.writeUInt16LE(0x0314, 4); // made by: Unix (3), spec 2.0 (20)
69
+ central.writeUInt16LE(20, 6);
70
+ central.writeUInt16LE(0x0800, 8);
71
+ central.writeUInt16LE(8, 10);
72
+ central.writeUInt16LE(DOS_TIME, 12);
73
+ central.writeUInt16LE(DOS_DATE, 14);
74
+ central.writeUInt32LE(crc, 16);
75
+ central.writeUInt32LE(compressed.length, 20);
76
+ central.writeUInt32LE(entry.data.length, 24);
77
+ central.writeUInt16LE(name.length, 28);
78
+ central.writeUInt16LE(0, 30); // extra
79
+ central.writeUInt16LE(0, 32); // comment
80
+ central.writeUInt16LE(0, 34); // disk
81
+ central.writeUInt16LE(0, 36); // internal attrs
82
+ central.writeUInt32LE(0o100644 * 0x10000, 38); // external attrs: regular file, -rw-r--r--
83
+ central.writeUInt32LE(offset, 42);
84
+ centrals.push(central, name);
85
+ offset += local.length + name.length + compressed.length;
86
+ }
87
+ const centralSize = centrals.reduce((n, b) => n + b.length, 0);
88
+ const end = Buffer.alloc(22);
89
+ end.writeUInt32LE(0x06054b50, 0);
90
+ end.writeUInt16LE(entries.length, 8);
91
+ end.writeUInt16LE(entries.length, 10);
92
+ end.writeUInt32LE(centralSize, 12);
93
+ end.writeUInt32LE(offset, 16);
94
+ return Buffer.concat([...locals, ...centrals, end]);
95
+ }
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLXppcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9wbHVnaW4temlwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7O0dBS0c7QUFFSCxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUV4QiwwREFBMEQ7QUFDMUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0FBUTlFOzs7R0FHRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxHQUFXLEVBQUUsSUFBa0M7SUFDaEYsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQixNQUFNLE9BQU8sR0FBZSxFQUFFLENBQUM7SUFDL0IsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFXLEVBQVEsRUFBRTtRQUNqQyxLQUFLLE1BQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUM5QyxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO2dCQUFFLFNBQVM7WUFDakMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEUsSUFBSSxHQUFHLEtBQUssV0FBVyxJQUFJLENBQUMs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QUFFLENBQUMsQ0FBQztRQUNsQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUU3QixNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7SUFDM0QsQ0FBQztJQUNELE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMvRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzdCLEdBQUcsQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pDLEdBQUcsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyQyxHQUFHLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdEMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbkMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDOUIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLEVBQUUsR0FBRyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogUGFja2FnZSBhIGxvY2FsIHBsdWdpbiBkaXJlY3RvcnkgYXMgdGhlIHppcCB0aGUgdXBsb2FkIEFQSSB0YWtlcyAodGhlXG4gKiBkaXJlY3RvcnkgSVMgdGhlIHppcCByb290KS4gQSBzbWFsbCwgZGVwZW5kZW5jeS1mcmVlIFpJUCB3cml0ZXI6IERFRkxBVEVcbiAqIGVudHJpZXMsIHJlZ3VsYXIgZmlsZXMgb25seSDigJQgc3ltbGlua3MgYW5kIGFueXRoaW5nIG91dHNpZGUgdGhlIGRpcmVjdG9yeVxuICogYXJlIHJlZnVzZWQsIHdoaWNoIHRoZSBzZXJ2ZXIgd291bGQgcmVmdXNlIGFueXdheS5cbiAqL1xuXG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgemxpYiBmcm9tICd6bGliJztcblxuLyoqIE5ldmVyIHBhY2thZ2VkOiBidWlsZCBvdXRwdXRzIGFuZCBWQ1MvZWRpdG9yIHN0YXRlLiAqL1xuY29uc3QgRVhDTFVERUQgPSBuZXcgU2V0KFsnLmdpdCcsICcuRFNfU3RvcmUnLCAnbm9kZV9tb2R1bGVzJywgJ3BsdWdpbi56aXAnXSk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgWmlwRW50cnkge1xuICAvKiogRm9yd2FyZC1zbGFzaCBwYXRoIHJlbGF0aXZlIHRvIHRoZSB6aXAgcm9vdC4gKi9cbiAgbmFtZTogc3RyaW5nO1xuICBkYXRhOiBCdWZmZXI7XG59XG5cbi8qKlxuICogVGhlIGZpbGVzIGEgcGx1Z2luIHppcCBjYXJyaWVzLCBzb3J0ZWQuIGBpbWFnZS50YXJgIHJpZGVzIGFsb25nIG9ubHkgZm9yIGFcbiAqIGBwcmVidWlsdGAgcGx1Z2luICh0aGUgc2VydmVyIGJ1aWxkcyBgYnVpbGRfaW1hZ2VgIHBsdWdpbnMgaXRzZWxmKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RQbHVnaW5GaWxlcyhkaXI6IHN0cmluZywgb3B0czogeyBpbmNsdWRlSW1hZ2VUYXI6IGJvb2xlYW4gfSk6IFppcEVudHJ5W10ge1xuICBjb25zdCByb290ID0gcGF0aC5yZXNvbHZlKGRpcik7XG4gIGNvbnN0IGVudHJpZXM6IFppcEVudHJ5W10gPSBbXTtcbiAgY29uc3Qgd2FsayA9IChhYnM6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBmcy5yZWFkZGlyU3luYyhhYnMpLnNvcnQoKSkge1xuICAgICAgaWYgKEVYQ0xVREVELmhhcyhuYW1lKSkgY29udGludWU7XG4gICAgICBjb25zdCBmdWxsID0gcGF0aC5qb2luKGFicywgbmFtZSk7XG4gICAgICBjb25zdCByZWwgPSBwYXRoLnJlbGF0aXZlKHJvb3QsIGZ1bGwpLnNwbGl0KHBhdGguc2VwKS5qb2luKCcvJyk7XG4gICAgICBpZiAocmVsID09PSAnaW1hZ2UudGFyJyAmJiAhb3B0cy5pbmNsdWRlSW1hZ2VUYXIpIGNvbnRpbnVlO1xuICAgICAgY29uc3Qgc3QgPSBmcy5sc3RhdFN5bmMoZnVsbCk7XG4gICAgICBpZiAoc3QuaXNTeW1ib2xpY0xpbmsoKSkgdGhyb3cgbmV3IEVycm9yKGBSZWZ1c2luZyB0byBwYWNrYWdlIGEgc3ltbGluazogJHtyZWx9YCk7XG4gICAgICBpZiAoc3QuaXNEaXJlY3RvcnkoKSkgd2FsayhmdWxsKTtcbiAgICAgIGVsc2UgaWYgKHN0LmlzRmlsZSgpKSBlbnRyaWVzLnB1c2goeyBuYW1lOiByZWwsIGRhdGE6IGZzLnJlYWRGaWxlU3luYyhmdWxsKSB9KTtcbiAgICB9XG4gIH07XG4gIHdhbGsocm9vdCk7XG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG4vKiogRE9TIGRhdGUvdGltZSBmb3IgdGhlIHppcCBoZWFkZXJzIChmaXhlZCwgc28gYSBwYWNrYWdlIGlzIHJlcHJvZHVjaWJsZSkuICovXG5jb25zdCBET1NfVElNRSA9IDA7XG5jb25zdCBET1NfREFURSA9IDMzOyAvLyAxOTgwLTAxLTAxOiAoMCB5ZWFycyA8PCA5KSB8IChtb250aCAxIDw8IDUpIHwgZGF5IDFcblxuLyoqIFdyaXRlIGBlbnRyaWVzYCBhcyBhIFpJUCBhcmNoaXZlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlWmlwKGVudHJpZXM6IFppcEVudHJ5W10pOiBCdWZmZXIge1xuICBjb25zdCBsb2NhbHM6IEJ1ZmZlcltdID0gW107XG4gIGNvbnN0IGNlbnRyYWxzOiBCdWZmZXJbXSA9IFtdO1xuICBsZXQgb2Zmc2V0ID0gMDtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3QgbmFtZSA9IEJ1ZmZlci5mcm9tKGVudHJ5Lm5hbWUsICd1dGYtOCcpO1xuICAgIGNvbnN0IGNvbXByZXNzZWQgPSB6bGliLmRlZmxhdGVSYXdTeW5jKGVudHJ5LmRhdGEpO1xuICAgIGNvbnN0IGNyYyA9IHpsaWIuY3JjMzIoZW50cnkuZGF0YSk7XG5cbiAgICBjb25zdCBsb2NhbCA9IEJ1ZmZlci5hbGxvYygzMCk7XG4gICAgbG9jYWwud3JpdGVVSW50MzJMRSgweDA0MDM0YjUwLCAwKTtcbiAgICBsb2NhbC53cml0ZVVJbnQxNkxFKDIwLCA0KTsgLy8gdmVyc2lvbiBuZWVkZWRcbiAgICBsb2NhbC53cml0ZVVJbnQxNkxFKDB4MDgwMCwgNik7IC8vIFVURi04IG5hbWVzXG4gICAgbG9jYWwud3JpdGVVSW50MTZMRSg4LCA4KTsgLy8gZGVmbGF0ZVxuICAgIGxvY2FsLndyaXRlVUludDE2TEUoRE9TX1RJTUUsIDEwKTtcbiAgICBsb2NhbC53cml0ZVVJbnQxNkxFKERPU19EQVRFLCAxMik7XG4gICAgbG9jYWwud3JpdGVVSW50MzJMRShjcmMsIDE0KTtcbiAgICBsb2NhbC53cml0ZVVJbnQzMkxFKGNvbXByZXNzZWQubGVuZ3RoLCAxOCk7XG4gICAgbG9jYWwud3JpdGVVSW50MzJMRShlbnRyeS5kYXRhLmxlbmd0aCwgMjIpO1xuICAgIGxvY2FsLndyaXRlVUludDE2TEUobmFtZS5sZW5ndGgsIDI2KTtcbiAgICBsb2NhbC53cml0ZVVJbnQxNkxFKDAsIDI4KTtcbiAgICBsb2NhbHMucHVzaChsb2NhbCwgbmFtZSwgY29tcHJlc3NlZCk7XG5cbiAgICBjb25zdCBjZW50cmFsID0gQnVmZmVyLmFsbG9jKDQ2KTtcbiAgICBjZW50cmFsLndyaXRlVUludDMyTEUoMHgwMjAxNGI1MCwgMCk7XG4gICAgY2VudHJhbC53cml0ZVVJbnQxNkxFKDB4MDMxNCwgNCk7IC8vIG1hZGUgYnk6IFVuaXggKDMpLCBzcGVjIDIuMCAoMjApXG4gICAgY2VudHJhbC53cml0ZVVJbnQxNkxFKDIwLCA2KTtcbiAgICBjZW50cmFsLndyaXRlVUludDE2TEUoMHgwODAwLCA4KTtcbiAgICBjZW50cmFsLndyaXRlVUludDE2TEUoOCwgMTApO1xuICAgIGNlbnRyYWwud3JpdGVVSW50MTZMRShET1NfVElNRSwgMTIpO1xuICAgIGNlbnRyYWwud3JpdGVVSW50MTZMRShET1NfREFURSwgMTQpO1xuICAgIGNlbnRyYWwud3JpdGVVSW50MzJMRShjcmMsIDE2KTtcbiAgICBjZW50cmFsLndyaXRlVUludDMyTEUoY29tcHJlc3NlZC5sZW5ndGgsIDIwKTtcbiAgICBjZW50cmFsLndyaXRlVUludDMyTEUoZW50cnkuZGF0YS5sZW5ndGgsIDI0KTtcbiAgICBjZW50cmFsLndyaXRlVUludDE2TEUobmFtZS5sZW5ndGgsIDI4KTtcbiAgICBjZW50cmFsLndyaXRlVUludDE2TEUoMCwgMzApOyAvLyBleHRyYVxuICAgIGNlbnRyYWwud3JpdGVVSW50MTZMRSgwLCAzMik7IC8vIGNvbW1lbnRcbiAgICBjZW50cmFsLndyaXRlVUludDE2TEUoMCwgMzQpOyAvLyBkaXNrXG4gICAgY2VudHJhbC53cml0ZVVJbnQxNkxFKDAsIDM2KTsgLy8gaW50ZXJuYWwgYXR0cnNcbiAgICBjZW50cmFsLndyaXRlVUludDMyTEUoMG8xMDA2NDQgKiAweDEwMDAwLCAzOCk7IC8vIGV4dGVybmFsIGF0dHJzOiByZWd1bGFyIGZpbGUsIC1ydy1yLS1yLS1cbiAgICBjZW50cmFsLndyaXRlVUludDMyTEUob2Zmc2V0LCA0Mik7XG4gICAgY2VudHJhbHMucHVzaChjZW50cmFsLCBuYW1lKTtcblxuICAgIG9mZnNldCArPSBsb2NhbC5sZW5ndGggKyBuYW1lLmxlbmd0aCArIGNvbXByZXNzZWQubGVuZ3RoO1xuICB9XG4gIGNvbnN0IGNlbnRyYWxTaXplID0gY2VudHJhbHMucmVkdWNlKChuLCBiKSA9PiBuICsgYi5sZW5ndGgsIDApO1xuICBjb25zdCBlbmQgPSBCdWZmZXIuYWxsb2MoMjIpO1xuICBlbmQud3JpdGVVSW50MzJMRSgweDA2MDU0YjUwLCAwKTtcbiAgZW5kLndyaXRlVUludDE2TEUoZW50cmllcy5sZW5ndGgsIDgpO1xuICBlbmQud3JpdGVVSW50MTZMRShlbnRyaWVzLmxlbmd0aCwgMTApO1xuICBlbmQud3JpdGVVSW50MzJMRShjZW50cmFsU2l6ZSwgMTIpO1xuICBlbmQud3JpdGVVSW50MzJMRShvZmZzZXQsIDE2KTtcbiAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoWy4uLmxvY2FscywgLi4uY2VudHJhbHMsIGVuZF0pO1xufVxuIl19
@@ -1,3 +1,4 @@
1
+ import { type StepManifestEntry } from '@pipeline-builder/pipeline-core';
1
2
  /**
2
3
  * Helpers for registering a deployed pipeline ARN with the platform.
3
4
  *
@@ -54,6 +55,13 @@ export interface RegistryPayload {
54
55
  project: string;
55
56
  organization: string;
56
57
  stackName: string;
58
+ /**
59
+ * Which plugin each CodePipeline action runs, as the synth recorded it.
60
+ * Present only on a registration that follows a deploy; the platform then
61
+ * replaces the pipeline's step manifest with it. Absent (a manual `pipeline
62
+ * register`) leaves the stored manifest untouched.
63
+ */
64
+ steps?: StepManifestEntry[];
57
65
  }
58
66
  /** Pipeline fields needed to construct a RegistryPayload. */
59
67
  export interface PipelineForRegistry {
@@ -70,6 +78,13 @@ export interface PipelineForRegistry {
70
78
  * pipelineId + display metadata.
71
79
  */
72
80
  export declare function buildRegistryPayload(pipeline: PipelineForRegistry, regionOverride?: string): Promise<RegistryPayload>;
81
+ /**
82
+ * Read the step manifest the synth app wrote into the cloud assembly
83
+ * (`<output>/pb-step-manifest.json`). Returns undefined when there is none or
84
+ * it is unreadable — registration then proceeds without it and the platform
85
+ * keeps the previous manifest, so a telemetry gap never blocks a deploy.
86
+ */
87
+ export declare function readStepManifest(outputDir: string): Promise<StepManifestEntry[] | undefined>;
73
88
  /**
74
89
  * Persist a registration intent for later retry.
75
90
  *
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/utils/registry.ts"],"names":[],"mappings":"AAWA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAGpD;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAMtG;AAED,2DAA2D;AAC3D,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,6DAA6D;AAC7D,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAKD;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,mBAAmB,EAC7B,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,eAAe,CAAC,CAgB1B;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAKlF;AAED,wDAAwD;AACxD,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ1E;AAED,oFAAoF;AACpF,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAqBrE"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/utils/registry.ts"],"names":[],"mappings":"AAMA,OAAO,EAA4C,KAAK,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAKnH;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAGpD;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAMtG;AAED,2DAA2D;AAC3D,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC7B;AAED,6DAA6D;AAC7D,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAKD;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,mBAAmB,EAC7B,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,eAAe,CAAC,CAgB1B;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,GAAG,SAAS,CAAC,CAOlG;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAKlF;AAED,wDAAwD;AACxD,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ1E;AAED,oFAAoF;AACpF,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAqBrE"}
@@ -3,7 +3,7 @@
3
3
  import { promises as fs } from 'fs';
4
4
  import { homedir } from 'os';
5
5
  import { join } from 'path';
6
- import { parsePlatformBaseUrl } from '@pipeline-builder/pipeline-core';
6
+ import { parsePlatformBaseUrl, STEP_MANIFEST_FILE } from '@pipeline-builder/pipeline-core';
7
7
  import { resolveAwsRegion } from './aws-env.js';
8
8
  import { printInfo } from './output-utils.js';
9
9
  import { defaultPipelineName } from '../config/cli.constants.js';
@@ -85,6 +85,21 @@ export async function buildRegistryPayload(pipeline, regionOverride) {
85
85
  stackName,
86
86
  };
87
87
  }
88
+ /**
89
+ * Read the step manifest the synth app wrote into the cloud assembly
90
+ * (`<output>/pb-step-manifest.json`). Returns undefined when there is none or
91
+ * it is unreadable — registration then proceeds without it and the platform
92
+ * keeps the previous manifest, so a telemetry gap never blocks a deploy.
93
+ */
94
+ export async function readStepManifest(outputDir) {
95
+ try {
96
+ const parsed = JSON.parse(await fs.readFile(join(outputDir, STEP_MANIFEST_FILE), 'utf8'));
97
+ return Array.isArray(parsed) ? parsed : undefined;
98
+ }
99
+ catch {
100
+ return undefined;
101
+ }
102
+ }
88
103
  /**
89
104
  * Persist a registration intent for later retry.
90
105
  *
@@ -137,4 +152,4 @@ export async function readPendingIntents() {
137
152
  }
138
153
  return intents;
139
154
  }
140
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsUUFBUSxJQUFJLEVBQUUsRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDdkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVqRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUVIOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLDJCQUEyQixDQUN6QyxPQUEyQjtJQUUzQixNQUFNLE1BQU0sR0FBRyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QyxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDL0UsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxLQUE4QixFQUFFLE9BQTJCO0lBQzlGLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0I7UUFBRSxPQUFPLENBQUMsb0JBQW9CO0lBQ3RFLE1BQU0sUUFBUSxHQUFHLDJCQUEyQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3RELElBQUksQ0FBQyxR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UztRQUN0QyxJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3hFLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQW9CLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1Asc0VBQXNFO1lBQ3RFLCtDQUErQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBob21lZGlyIH0gZnJvbSAnb3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgcGFyc2VQbGF0Zm9ybUJhc2VVcmwgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1jb3JlJztcbmltcG9ydCB7IHJlc29sdmVBd3NSZWdpb24gfSBmcm9tICcuL2F3cy1lbnYuanMnO1xuaW1wb3J0IHsgcHJpbnRJbmZvIH0gZnJvbSAnLi9vdXRwdXQtdXRpbHMuanMnO1xuaW1wb3J0IHsgZGVmYXVsdFBpcGVsaW5lTmFtZSB9IGZyb20gJy4uL2NvbmZpZy9jbGkuY29uc3RhbnRzLmpzJztcblxuLyoqXG4gKiBIZWxwZXJzIGZvciByZWdpc3RlcmluZyBhIGRlcGxveWVkIHBpcGVsaW5lIEFSTiB3aXRoIHRoZSBwbGF0Zm9ybS5cbiAqXG4gKiBUaGUgcmVnaXN0cnkgdGFibGUgbWFwcyBkZXBsb3llZCBDb2RlUGlwZWxpbmUgQVJOcyBiYWNrIHRvIHBpcGVsaW5lIHJlY29yZHNcbiAqIGFuZCBvcmdzLiBJdCdzIGhvdyB0aGUgZGFzaGJvYXJkJ3MgXCJEZXBsb3llZCBwaXBlbGluZXNcIiBwYW5lbCBhbmQgdGhlIGV2ZW50XG4gKiByZXBvcnRpbmcgTGFtYmRhIHJlc29sdmUgaW5jb21pbmcgZXZlbnRzIHRvIGEgcGlwZWxpbmUgZGVmaW5pdGlvbi5cbiAqXG4gKiBUd28gZmFpbHVyZSBtb2RlcyBhcmUgaGFuZGxlZCBoZXJlOlxuICpcbiAqICAgMS4gUGxhdGZvcm0gdW5yZWFjaGFibGUgYXQgZGVwbG95IHRpbWUuIFRoZSBDREsgc3RhY2sgbGFuZHMgaW4gQVdTIGJ1dCB0aGVcbiAqICAgICAgcmVnaXN0cnkgUE9TVCBmYWlscy4gV2l0aG91dCByZXRyeSB0aGUgZGVwbG95IGNvbW1hbmQgd291bGQgaGF2ZSB0b1xuICogICAgICByZS1ydW4gY2RrLWRlcGxveSAoc2xvdywgc29tZXRpbWVzIGJsb2NrZWQgYnkgc3RhY2sgc3RhdGUpIGp1c3QgdG9cbiAqICAgICAgcmVjb3JkIHRoZSBBUk4uIEluc3RlYWQsIHdlIHdyaXRlIGEgcGVuZGluZyBpbnRlbnQgdG8gYSBsb2NhbCBmaWxlO1xuICogICAgICBgcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSByZWdpc3RlcmAgZHJhaW5zIHRoZW0uXG4gKlxuICogICAyLiBVc2VyIGV4cGxpY2l0bHkgaW52b2tlcyBgcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSByZWdpc3RlciAtLWlkIDxwaXBlbGluZUlkPmBcbiAqICAgICAgYWZ0ZXIgYSBzdWNjZXNzZnVsIGRlcGxveSB0aGF0IGRpZG4ndCByZWdpc3Rlci4gU2FtZSBwYXRoOiByZWJ1aWxkc1xuICogICAgICB0aGUgQVJOIGZyb20gU1RTLCBQT1NUcyB0byB0aGUgcGxhdGZvcm0uXG4gKlxuICogUGVuZGluZyBpbnRlbnRzIHN0b3JlIE9OTFkgdGhlIHJlZ2lzdHJhdGlvbiBwYXlsb2FkIOKAlCBuZXZlciB0b2tlbnMgb3IgVVJMcy5cbiAqIEF1dGggaXMgc3VwcGxpZWQgYnkgd2hpY2hldmVyIGNvbW1hbmQgZHJhaW5zIHRoZSBpbnRlbnQgKGRlcGxveSBvciByZWdpc3RlciksXG4gKiBzbyBhIHN0YWxlIGludGVudCBmaWxlIGlzIG5ldmVyIGFuIGF1dGhlbnRpY2F0aW9uIHJpc2suXG4gKi9cblxuLyoqXG4gKiBQbGF0Zm9ybS1zb3VyY2VkIHJlZ2lzdHJ5IHB1bGwgdGFyZ2V0IGZvciB0aGUgQ0RLIHN5bnRoLCBkZXJpdmVkIGZyb20gdGhlXG4gKiBwbGF0Zm9ybSBiYXNlIFVSTCB0aGUgQ0xJIGRlcGxveXMgYWdhaW5zdCAodGhlIHNhbWUgaG9zdCB0aGF0IHNlcnZlcyB0aGVcbiAqIHJlZ2lzdHJ5IGAvdjIvYCBkYXRhIHBhdGggdmlhIG5naW54KS4gUmV1c2VzIHBpcGVsaW5lLWNvcmUnc1xuICogYHBhcnNlUGxhdGZvcm1CYXNlVXJsYCBzbyBob3N0L3BvcnQgcGFyc2luZyBzdGF5cyBpZGVudGljYWwgb24gYm90aCBzaWRlcy5cbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgZm9yIGFuIHVucGFyc2VhYmxlL2Fic2VudCBVUkwuIChPbmx5IHRoZSBwdWxsIGhvc3QvcG9ydFxuICogYXJlIHJldHVybmVkIOKAlCBgcmVnaXN0cnkuaHR0cGAgZGVzY3JpYmVzIHRoZSBpbi1jbHVzdGVyIHB1c2ggaG9wLCB3aGljaCB0aGVcbiAqIHN5bnRoIG5ldmVyIHJlYWRzLCBzbyBkZXJpdmluZyBpdCBmcm9tIHRoZSBwdWJsaWMgVVJMIHdvdWxkIGJlIG1pc2xlYWRpbmcuKVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0cnlPdmVycmlkZUZyb21CYXNlVXJsKFxuICBiYXNlVXJsOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiB7IHB1bGxIb3N0OiBzdHJpbmc7IHB1bGxQb3J0OiBudW1iZXIgfSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlUGxhdGZvcm1CYXNlVXJsKGJhc2VVcmwpO1xuICByZXR1cm4gcGFyc2VkID8geyBwdWxsSG9zdDogcGFyc2VkLmhvc3QsIHB1bGxQb3J0OiBwYXJzZWQucG9ydCB9IDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEJha2UgdGhlIHBsYXRmb3JtLWRlcml2ZWQgcmVnaXN0cnkgcHVsbCB0YXJnZXQgaW50byB0aGUgc3ludGggcHJvcHNcbiAqIChgQnVpbGRlclByb3BzLnJlZ2lzdHJ5YCkgc28gdGhlIENvZGVCdWlsZCBpbWFnZSBVUklzIHVzZSBhIGhvc3QgQVdTIENvZGVCdWlsZFxuICogY2FuIHJlc29sdmUg4oCUIG5vdCB0aGUgaW4tY2x1c3RlciBgcmVnaXN0cnk6NTAwMGAgZGVmYXVsdC4gU2hhcmVkIGJ5IHRoZVxuICogYGRlcGxveWAgYW5kIGBzeW50aGAgY29tbWFuZHMuXG4gKlxuICogQW4gZXhwbGljaXQgYElNQUdFX1JFR0lTVFJZX1BVTExfSE9TVGAgaW4gdGhlIHN5bnRoIGVudiB0YWtlcyBwcmVjZWRlbmNlLCBzb1xuICogdGhpcyBpcyBhIG5vLW9wIHdoZW4gaXQgaXMgc2V0ICh0aGUgc3ludGgncyBgbG9hZFJlZ2lzdHJ5Q29uZmlnYCBhbHJlYWR5XG4gKiBob25vcnMgaXQpLiBBbHNvIGEgbm8tb3AgZm9yIGFuIHVucGFyc2VhYmxlL2Fic2VudCBiYXNlIFVSTC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJha2VQbGF0Zm9ybVJlZ2lzdHJ5KHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgYmFzZVVybDogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmIChwcm9jZXNzLmVudi5JTUFHRV9SRUdJU1RSWV9QVUxMX0hPU1QpIHJldHVybjsgLy8gZXhwbGljaXQgZW52IHdpbnNcbiAgY29uc3Qgb3ZlcnJpZGUgPSByZWdpc3RyeU92ZXJyaWRlRnJvbUJhc2VVcmwoYmFzZVVybCk7XG4gIGlmICghb3ZlcnJpZGUpIHJldHVybjtcbiAgcHJvcHMucmVnaXN0cnkgPSBvdmVycmlkZTtcbiAgcHJpbnRJbmZvKCdSZWdpc3RyeSBwdWxsIHRhcmdldCcsIHsgaG9zdDogb3ZlcnJpZGUucHVsbEhvc3QsIHBvcnQ6IG92ZXJyaWRlLnB1bGxQb3J0IH0pO1xufVxuXG4vKiogU2hhcGUgb2YgdGhlIGJvZHkgUE9TVGVkIHRvIC9hcGkvcGlwZWxpbmVzL3JlZ2lzdHJ5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RyeVBheWxvYWQge1xuICBwaXBlbGluZUlkOiBzdHJpbmc7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIHBpcGVsaW5lTmFtZTogc3RyaW5nO1xuICByZWdpb246IHN0cmluZztcbiAgcHJvamVjdDogc3RyaW5nO1xuICBvcmdhbml6YXRpb246IHN0cmluZztcbiAgc3RhY2tOYW1lOiBzdHJpbmc7XG59XG5cbi8qKiBQaXBlbGluZSBmaWVsZHMgbmVlZGVkIHRvIGNvbnN0cnVjdCBhIFJlZ2lzdHJ5UGF5bG9hZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVGb3JSZWdpc3RyeSB7XG4gIGlkOiBzdHJpbmc7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIHBpcGVsaW5lTmFtZT86IHN0cmluZztcbiAgcHJvamVjdDogc3RyaW5nO1xuICBvcmdhbml6YXRpb246IHN0cmluZztcbn1cblxuLyoqIFdoZXJlIHBlbmRpbmcgcmVnaXN0cmF0aW9uIGludGVudHMgYXJlIHBlcnNpc3RlZCBiZXR3ZWVuIENMSSBpbnZvY2F0aW9ucy4gKi9cbmNvbnN0IFBFTkRJTkdfSU5URU5UU19ESVIgPSBqb2luKGhvbWVkaXIoKSwgJy5waXBlbGluZS1tYW5hZ2VyJywgJ3BlbmRpbmctcmVnaXN0cmF0aW9ucycpO1xuXG4vKipcbiAqIEJ1aWxkIGEgUmVnaXN0cnlQYXlsb2FkIGZyb20gdGhlIHBsYXRmb3JtJ3MgcGlwZWxpbmUgbWV0YWRhdGEuIE5vIEFXUyBjYWxsc1xuICogYW5kIG5vIEFSTi9hY2NvdW50OiB0aGUgZXZlbnRzIExhbWJkYSBhdHRyaWJ1dGVzIGV2ZW50cyB2aWEgdGhlIHBpcGVsaW5lJ3NcbiAqIGBwYi5waXBlbGluZS1pZGAgdGFnICg9IHBpcGVsaW5lSWQpLCBzbyB0aGUgcmVnaXN0cnkgb25seSBuZWVkcyB0aGUgc3RhYmxlXG4gKiBwaXBlbGluZUlkICsgZGlzcGxheSBtZXRhZGF0YS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkUmVnaXN0cnlQYXlsb2FkKFxuICBwaXBlbGluZTogUGlwZWxpbmVGb3JSZWdpc3RyeSxcbiAgcmVnaW9uT3ZlcnJpZGU/OiBzdHJpbmcsXG4pOiBQcm9taXNlPFJlZ2lzdHJ5UGF5bG9hZD4ge1xuICBjb25zdCByZWdpb24gPSByZXNvbHZlQXdzUmVnaW9uKHJlZ2lvbk92ZXJyaWRlKTtcblxuICBjb25zdCBwaXBlbGluZU5hbWUgPSBwaXBlbGluZS5waXBlbGluZU5hbWVcbiAgICB8fCBkZWZhdWx0UGlwZWxpbmVOYW1lKHBpcGVsaW5lLm9yZ2FuaXphdGlvbiwgcGlwZWxpbmUucHJvamVjdCk7XG4gIGNvbnN0IHN0YWNrTmFtZSA9IGAke3BpcGVsaW5lLnByb2plY3R9LSR7cGlwZWxpbmUub3JnYW5pemF0aW9ufWAudG9Mb3dlckNhc2UoKTtcblxuICByZXR1cm4ge1xuICAgIHBpcGVsaW5lSWQ6IHBpcGVsaW5lLmlkLFxuICAgIG9yZ0lkOiBwaXBlbGluZS5vcmdJZCxcbiAgICBwaXBlbGluZU5hbWUsXG4gICAgcmVnaW9uLFxuICAgIHByb2plY3Q6IHBpcGVsaW5lLnByb2plY3QsXG4gICAgb3JnYW5pemF0aW9uOiBwaXBlbGluZS5vcmdhbml6YXRpb24sXG4gICAgc3RhY2tOYW1lLFxuICB9O1xufVxuXG4vKipcbiAqIFBlcnNpc3QgYSByZWdpc3RyYXRpb24gaW50ZW50IGZvciBsYXRlciByZXRyeS5cbiAqXG4gKiBJbnRlbnQgZmlsZXMgYXJlIGtleWVkIGJ5IHBpcGVsaW5lSWQgc28gcmUtcnVubmluZyBkZXBsb3kgb24gdGhlIHNhbWVcbiAqIHBpcGVsaW5lIG92ZXJ3cml0ZXMgcmF0aGVyIHRoYW4gYWNjdW11bGF0ZXMuIFdlIGRlbGliZXJhdGVseSBzdG9yZSB0aGVcbiAqIHBheWxvYWQgcGxhaW4gKG5vdCB0aGUgZnVsbCBwaXBlbGluZSBkb2MsIG5vdCBhdXRoKSBzbyBhIHN0YWxlIGZpbGUgaXNcbiAqIHNhZmUgdG8gbGVhdmUgYXJvdW5kIGluZGVmaW5pdGVseS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlUGVuZGluZ0ludGVudChwYXlsb2FkOiBSZWdpc3RyeVBheWxvYWQpOiBQcm9taXNlPHN0cmluZz4ge1xuICBhd2FpdCBmcy5ta2RpcihQRU5ESU5HX0lOVEVOVFNfRElSLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgcGF0aCA9IGpvaW4oUEVORElOR19JTlRFTlRTX0RJUiwgYCR7cGF5bG9hZC5waXBlbGluZUlkfS5qc29uYCk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoLCBKU09OLnN0cmluZ2lmeShwYXlsb2FkLCBudWxsLCAyKSwgJ3V0ZjgnKTtcbiAgcmV0dXJuIHBhdGg7XG59XG5cbi8qKiBSZW1vdmUgYSBwZW5kaW5nIGludGVudCBhZnRlciBhIHN1Y2Nlc3NmdWwgZHJhaW4uICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xlYXJQZW5kaW5nSW50ZW50KHBpcGVsaW5lSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYXRoID0gam9pbihQRU5ESU5HX0lOVEVOVFNfRElSLCBgJHtwaXBlbGluZUlkfS5qc29uYCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMudW5saW5rKHBhdGgpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBFTk9FTlQgaXMgZmluZSDigJQgYWxyZWFkeSBjbGVhcmVkLiBBbnl0aGluZyBlbHNlIGlzIGEgcmVhbCBwcm9ibGVtLlxuICAgIGlmICgoZXJyIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSAhPT0gJ0VOT0VOVCcpIHRocm93IGVycjtcbiAgfVxufVxuXG4vKiogUmVhZCBhbGwgcGVuZGluZyBpbnRlbnRzIGN1cnJlbnRseSBvbiBkaXNrLiBFbXB0eSBhcnJheSBpZiBkaXIgZG9lc24ndCBleGlzdC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkUGVuZGluZ0ludGVudHMoKTogUHJvbWlzZTxSZWdpc3RyeVBheWxvYWRbXT4ge1xuICBsZXQgZW50cmllczogc3RyaW5nW107XG4gIHRyeSB7XG4gICAgZW50cmllcyA9IGF3YWl0IGZzLnJlYWRkaXIoUEVORElOR19JTlRFTlRTX0RJUik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICgoZXJyIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVybiBbXTtcbiAgICB0aHJvdyBlcnI7XG4gIH1cblxuICBjb25zdCBpbnRlbnRzOiBSZWdpc3RyeVBheWxvYWRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZW50cmllcykge1xuICAgIGlmICghZmlsZS5lbmRzV2l0aCgnLmpzb24nKSkgY29udGludWU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCBmcy5yZWFkRmlsZShqb2luKFBFTkRJTkdfSU5URU5UU19ESVIsIGZpbGUpLCAndXRmOCcpO1xuICAgICAgaW50ZW50cy5wdXNoKEpTT04ucGFyc2UodGV4dCkgYXMgUmVnaXN0cnlQYXlsb2FkKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFNraXAgdW5yZWFkYWJsZSAvIG1hbGZvcm1lZCBmaWxlcyDigJQgdGhleSdsbCBuZWVkIG1hbnVhbCBjbGVhbnVwIGJ1dFxuICAgICAgLy8gc2hvdWxkbid0IGJsb2NrIHZhbGlkIGludGVudHMgZnJvbSBkcmFpbmluZy5cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGludGVudHM7XG59XG4iXX0=
155
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsUUFBUSxJQUFJLEVBQUUsRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGtCQUFrQixFQUEwQixNQUFNLGlDQUFpQyxDQUFDO0FBQ25ILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFakU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFFSDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSwyQkFBMkIsQ0FDekMsT0FBMkI7SUFFM0IsTUFBTSxNQUFNLEdBQUcsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0MsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQy9FLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsS0FBOEIsRUFBRSxPQUEyQjtJQUM5RixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0JBQXdCO1FBQUUsT0FBTyxDQUFDLG9CQUFvQjtJQUN0RSxNQUFNLFFBQVEsR0FBRywyQkFBMkIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0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LEtBQUssVUFBVSxrQkFBa0I7SUFDdEMsSUFBSSxPQUFpQixDQUFDO0lBQ3RCLElBQUksQ0FBQztRQUNILE9BQU8sR0FBRyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUssR0FBNkIsQ0FBQyxJQUFJLEtBQUssUUFBUTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ2hFLE1BQU0sR0FBRyxDQUFDO0lBQ1osQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFzQixFQUFFLENBQUM7SUFDdEMsS0FBSyxNQUFNLElBQUksSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFBRSxTQUFTO1FBQ3RDLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDeEUsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBb0IsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxzRUFBc0U7WUFDdEUsK0NBQStDO1FBQ2pELENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ2ZzJztcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdvcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBwYXJzZVBsYXRmb3JtQmFzZVVybCwgU1RFUF9NQU5JRkVTVF9GSUxFLCB0eXBlIFN0ZXBNYW5pZmVzdEVudHJ5IH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtY29yZSc7XG5pbXBvcnQgeyByZXNvbHZlQXdzUmVnaW9uIH0gZnJvbSAnLi9hd3MtZW52LmpzJztcbmltcG9ydCB7IHByaW50SW5mbyB9IGZyb20gJy4vb3V0cHV0LXV0aWxzLmpzJztcbmltcG9ydCB7IGRlZmF1bHRQaXBlbGluZU5hbWUgfSBmcm9tICcuLi9jb25maWcvY2xpLmNvbnN0YW50cy5qcyc7XG5cbi8qKlxuICogSGVscGVycyBmb3IgcmVnaXN0ZXJpbmcgYSBkZXBsb3llZCBwaXBlbGluZSBBUk4gd2l0aCB0aGUgcGxhdGZvcm0uXG4gKlxuICogVGhlIHJlZ2lzdHJ5IHRhYmxlIG1hcHMgZGVwbG95ZWQgQ29kZVBpcGVsaW5lIEFSTnMgYmFjayB0byBwaXBlbGluZSByZWNvcmRzXG4gKiBhbmQgb3Jncy4gSXQncyBob3cgdGhlIGRhc2hib2FyZCdzIFwiRGVwbG95ZWQgcGlwZWxpbmVzXCIgcGFuZWwgYW5kIHRoZSBldmVudFxuICogcmVwb3J0aW5nIExhbWJkYSByZXNvbHZlIGluY29taW5nIGV2ZW50cyB0byBhIHBpcGVsaW5lIGRlZmluaXRpb24uXG4gKlxuICogVHdvIGZhaWx1cmUgbW9kZXMgYXJlIGhhbmRsZWQgaGVyZTpcbiAqXG4gKiAgIDEuIFBsYXRmb3JtIHVucmVhY2hhYmxlIGF0IGRlcGxveSB0aW1lLiBUaGUgQ0RLIHN0YWNrIGxhbmRzIGluIEFXUyBidXQgdGhlXG4gKiAgICAgIHJlZ2lzdHJ5IFBPU1QgZmFpbHMuIFdpdGhvdXQgcmV0cnkgdGhlIGRlcGxveSBjb21tYW5kIHdvdWxkIGhhdmUgdG9cbiAqICAgICAgcmUtcnVuIGNkay1kZXBsb3kgKHNsb3csIHNvbWV0aW1lcyBibG9ja2VkIGJ5IHN0YWNrIHN0YXRlKSBqdXN0IHRvXG4gKiAgICAgIHJlY29yZCB0aGUgQVJOLiBJbnN0ZWFkLCB3ZSB3cml0ZSBhIHBlbmRpbmcgaW50ZW50IHRvIGEgbG9jYWwgZmlsZTtcbiAqICAgICAgYHBpcGVsaW5lLW1hbmFnZXIgcGlwZWxpbmUgcmVnaXN0ZXJgIGRyYWlucyB0aGVtLlxuICpcbiAqICAgMi4gVXNlciBleHBsaWNpdGx5IGludm9rZXMgYHBpcGVsaW5lLW1hbmFnZXIgcGlwZWxpbmUgcmVnaXN0ZXIgLS1pZCA8cGlwZWxpbmVJZD5gXG4gKiAgICAgIGFmdGVyIGEgc3VjY2Vzc2Z1bCBkZXBsb3kgdGhhdCBkaWRuJ3QgcmVnaXN0ZXIuIFNhbWUgcGF0aDogcmVidWlsZHNcbiAqICAgICAgdGhlIEFSTiBmcm9tIFNUUywgUE9TVHMgdG8gdGhlIHBsYXRmb3JtLlxuICpcbiAqIFBlbmRpbmcgaW50ZW50cyBzdG9yZSBPTkxZIHRoZSByZWdpc3RyYXRpb24gcGF5bG9hZCDigJQgbmV2ZXIgdG9rZW5zIG9yIFVSTHMuXG4gKiBBdXRoIGlzIHN1cHBsaWVkIGJ5IHdoaWNoZXZlciBjb21tYW5kIGRyYWlucyB0aGUgaW50ZW50IChkZXBsb3kgb3IgcmVnaXN0ZXIpLFxuICogc28gYSBzdGFsZSBpbnRlbnQgZmlsZSBpcyBuZXZlciBhbiBhdXRoZW50aWNhdGlvbiByaXNrLlxuICovXG5cbi8qKlxuICogUGxhdGZvcm0tc291cmNlZCByZWdpc3RyeSBwdWxsIHRhcmdldCBmb3IgdGhlIENESyBzeW50aCwgZGVyaXZlZCBmcm9tIHRoZVxuICogcGxhdGZvcm0gYmFzZSBVUkwgdGhlIENMSSBkZXBsb3lzIGFnYWluc3QgKHRoZSBzYW1lIGhvc3QgdGhhdCBzZXJ2ZXMgdGhlXG4gKiByZWdpc3RyeSBgL3YyL2AgZGF0YSBwYXRoIHZpYSBuZ2lueCkuIFJldXNlcyBwaXBlbGluZS1jb3JlJ3NcbiAqIGBwYXJzZVBsYXRmb3JtQmFzZVVybGAgc28gaG9zdC9wb3J0IHBhcnNpbmcgc3RheXMgaWRlbnRpY2FsIG9uIGJvdGggc2lkZXMuXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIGZvciBhbiB1bnBhcnNlYWJsZS9hYnNlbnQgVVJMLiAoT25seSB0aGUgcHVsbCBob3N0L3BvcnRcbiAqIGFyZSByZXR1cm5lZCDigJQgYHJlZ2lzdHJ5Lmh0dHBgIGRlc2NyaWJlcyB0aGUgaW4tY2x1c3RlciBwdXNoIGhvcCwgd2hpY2ggdGhlXG4gKiBzeW50aCBuZXZlciByZWFkcywgc28gZGVyaXZpbmcgaXQgZnJvbSB0aGUgcHVibGljIFVSTCB3b3VsZCBiZSBtaXNsZWFkaW5nLilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdHJ5T3ZlcnJpZGVGcm9tQmFzZVVybChcbiAgYmFzZVVybDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogeyBwdWxsSG9zdDogc3RyaW5nOyBwdWxsUG9ydDogbnVtYmVyIH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZVBsYXRmb3JtQmFzZVVybChiYXNlVXJsKTtcbiAgcmV0dXJuIHBhcnNlZCA/IHsgcHVsbEhvc3Q6IHBhcnNlZC5ob3N0LCBwdWxsUG9ydDogcGFyc2VkLnBvcnQgfSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBCYWtlIHRoZSBwbGF0Zm9ybS1kZXJpdmVkIHJlZ2lzdHJ5IHB1bGwgdGFyZ2V0IGludG8gdGhlIHN5bnRoIHByb3BzXG4gKiAoYEJ1aWxkZXJQcm9wcy5yZWdpc3RyeWApIHNvIHRoZSBDb2RlQnVpbGQgaW1hZ2UgVVJJcyB1c2UgYSBob3N0IEFXUyBDb2RlQnVpbGRcbiAqIGNhbiByZXNvbHZlIOKAlCBub3QgdGhlIGluLWNsdXN0ZXIgYHJlZ2lzdHJ5OjUwMDBgIGRlZmF1bHQuIFNoYXJlZCBieSB0aGVcbiAqIGBkZXBsb3lgIGFuZCBgc3ludGhgIGNvbW1hbmRzLlxuICpcbiAqIEFuIGV4cGxpY2l0IGBJTUFHRV9SRUdJU1RSWV9QVUxMX0hPU1RgIGluIHRoZSBzeW50aCBlbnYgdGFrZXMgcHJlY2VkZW5jZSwgc29cbiAqIHRoaXMgaXMgYSBuby1vcCB3aGVuIGl0IGlzIHNldCAodGhlIHN5bnRoJ3MgYGxvYWRSZWdpc3RyeUNvbmZpZ2AgYWxyZWFkeVxuICogaG9ub3JzIGl0KS4gQWxzbyBhIG5vLW9wIGZvciBhbiB1bnBhcnNlYWJsZS9hYnNlbnQgYmFzZSBVUkwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYWtlUGxhdGZvcm1SZWdpc3RyeShwcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGJhc2VVcmw6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBpZiAocHJvY2Vzcy5lbnYuSU1BR0VfUkVHSVNUUllfUFVMTF9IT1NUKSByZXR1cm47IC8vIGV4cGxpY2l0IGVudiB3aW5zXG4gIGNvbnN0IG92ZXJyaWRlID0gcmVnaXN0cnlPdmVycmlkZUZyb21CYXNlVXJsKGJhc2VVcmwpO1xuICBpZiAoIW92ZXJyaWRlKSByZXR1cm47XG4gIHByb3BzLnJlZ2lzdHJ5ID0gb3ZlcnJpZGU7XG4gIHByaW50SW5mbygnUmVnaXN0cnkgcHVsbCB0YXJnZXQnLCB7IGhvc3Q6IG92ZXJyaWRlLnB1bGxIb3N0LCBwb3J0OiBvdmVycmlkZS5wdWxsUG9ydCB9KTtcbn1cblxuLyoqIFNoYXBlIG9mIHRoZSBib2R5IFBPU1RlZCB0byAvYXBpL3BpcGVsaW5lcy9yZWdpc3RyeS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0cnlQYXlsb2FkIHtcbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICBvcmdJZDogc3RyaW5nO1xuICBwaXBlbGluZU5hbWU6IHN0cmluZztcbiAgcmVnaW9uOiBzdHJpbmc7XG4gIHByb2plY3Q6IHN0cmluZztcbiAgb3JnYW5pemF0aW9uOiBzdHJpbmc7XG4gIHN0YWNrTmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogV2hpY2ggcGx1Z2luIGVhY2ggQ29kZVBpcGVsaW5lIGFjdGlvbiBydW5zLCBhcyB0aGUgc3ludGggcmVjb3JkZWQgaXQuXG4gICAqIFByZXNlbnQgb25seSBvbiBhIHJlZ2lzdHJhdGlvbiB0aGF0IGZvbGxvd3MgYSBkZXBsb3k7IHRoZSBwbGF0Zm9ybSB0aGVuXG4gICAqIHJlcGxhY2VzIHRoZSBwaXBlbGluZSdzIHN0ZXAgbWFuaWZlc3Qgd2l0aCBpdC4gQWJzZW50IChhIG1hbnVhbCBgcGlwZWxpbmVcbiAgICogcmVnaXN0ZXJgKSBsZWF2ZXMgdGhlIHN0b3JlZCBtYW5pZmVzdCB1bnRvdWNoZWQuXG4gICAqL1xuICBzdGVwcz86IFN0ZXBNYW5pZmVzdEVudHJ5W107XG59XG5cbi8qKiBQaXBlbGluZSBmaWVsZHMgbmVlZGVkIHRvIGNvbnN0cnVjdCBhIFJlZ2lzdHJ5UGF5bG9hZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVGb3JSZWdpc3RyeSB7XG4gIGlkOiBzdHJpbmc7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIHBpcGVsaW5lTmFtZT86IHN0cmluZztcbiAgcHJvamVjdDogc3RyaW5nO1xuICBvcmdhbml6YXRpb246IHN0cmluZztcbn1cblxuLyoqIFdoZXJlIHBlbmRpbmcgcmVnaXN0cmF0aW9uIGludGVudHMgYXJlIHBlcnNpc3RlZCBiZXR3ZWVuIENMSSBpbnZvY2F0aW9ucy4gKi9cbmNvbnN0IFBFTkRJTkdfSU5URU5UU19ESVIgPSBqb2luKGhvbWVkaXIoKSwgJy5waXBlbGluZS1tYW5hZ2VyJywgJ3BlbmRpbmctcmVnaXN0cmF0aW9ucycpO1xuXG4vKipcbiAqIEJ1aWxkIGEgUmVnaXN0cnlQYXlsb2FkIGZyb20gdGhlIHBsYXRmb3JtJ3MgcGlwZWxpbmUgbWV0YWRhdGEuIE5vIEFXUyBjYWxsc1xuICogYW5kIG5vIEFSTi9hY2NvdW50OiB0aGUgZXZlbnRzIExhbWJkYSBhdHRyaWJ1dGVzIGV2ZW50cyB2aWEgdGhlIHBpcGVsaW5lJ3NcbiAqIGBwYi5waXBlbGluZS1pZGAgdGFnICg9IHBpcGVsaW5lSWQpLCBzbyB0aGUgcmVnaXN0cnkgb25seSBuZWVkcyB0aGUgc3RhYmxlXG4gKiBwaXBlbGluZUlkICsgZGlzcGxheSBtZXRhZGF0YS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkUmVnaXN0cnlQYXlsb2FkKFxuICBwaXBlbGluZTogUGlwZWxpbmVGb3JSZWdpc3RyeSxcbiAgcmVnaW9uT3ZlcnJpZGU/OiBzdHJpbmcsXG4pOiBQcm9taXNlPFJlZ2lzdHJ5UGF5bG9hZD4ge1xuICBjb25zdCByZWdpb24gPSByZXNvbHZlQXdzUmVnaW9uKHJlZ2lvbk92ZXJyaWRlKTtcblxuICBjb25zdCBwaXBlbGluZU5hbWUgPSBwaXBlbGluZS5waXBlbGluZU5hbWVcbiAgICB8fCBkZWZhdWx0UGlwZWxpbmVOYW1lKHBpcGVsaW5lLm9yZ2FuaXphdGlvbiwgcGlwZWxpbmUucHJvamVjdCk7XG4gIGNvbnN0IHN0YWNrTmFtZSA9IGAke3BpcGVsaW5lLnByb2plY3R9LSR7cGlwZWxpbmUub3JnYW5pemF0aW9ufWAudG9Mb3dlckNhc2UoKTtcblxuICByZXR1cm4ge1xuICAgIHBpcGVsaW5lSWQ6IHBpcGVsaW5lLmlkLFxuICAgIG9yZ0lkOiBwaXBlbGluZS5vcmdJZCxcbiAgICBwaXBlbGluZU5hbWUsXG4gICAgcmVnaW9uLFxuICAgIHByb2plY3Q6IHBpcGVsaW5lLnByb2plY3QsXG4gICAgb3JnYW5pemF0aW9uOiBwaXBlbGluZS5vcmdhbml6YXRpb24sXG4gICAgc3RhY2tOYW1lLFxuICB9O1xufVxuXG4vKipcbiAqIFJlYWQgdGhlIHN0ZXAgbWFuaWZlc3QgdGhlIHN5bnRoIGFwcCB3cm90ZSBpbnRvIHRoZSBjbG91ZCBhc3NlbWJseVxuICogKGA8b3V0cHV0Pi9wYi1zdGVwLW1hbmlmZXN0Lmpzb25gKS4gUmV0dXJucyB1bmRlZmluZWQgd2hlbiB0aGVyZSBpcyBub25lIG9yXG4gKiBpdCBpcyB1bnJlYWRhYmxlIOKAlCByZWdpc3RyYXRpb24gdGhlbiBwcm9jZWVkcyB3aXRob3V0IGl0IGFuZCB0aGUgcGxhdGZvcm1cbiAqIGtlZXBzIHRoZSBwcmV2aW91cyBtYW5pZmVzdCwgc28gYSB0ZWxlbWV0cnkgZ2FwIG5ldmVyIGJsb2NrcyBhIGRlcGxveS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRTdGVwTWFuaWZlc3Qob3V0cHV0RGlyOiBzdHJpbmcpOiBQcm9taXNlPFN0ZXBNYW5pZmVzdEVudHJ5W10gfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQ6IHVua25vd24gPSBKU09OLnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKGpvaW4ob3V0cHV0RGlyLCBTVEVQX01BTklGRVNUX0ZJTEUpLCAndXRmOCcpKTtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShwYXJzZWQpID8gcGFyc2VkIGFzIFN0ZXBNYW5pZmVzdEVudHJ5W10gOiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBQZXJzaXN0IGEgcmVnaXN0cmF0aW9uIGludGVudCBmb3IgbGF0ZXIgcmV0cnkuXG4gKlxuICogSW50ZW50IGZpbGVzIGFyZSBrZXllZCBieSBwaXBlbGluZUlkIHNvIHJlLXJ1bm5pbmcgZGVwbG95IG9uIHRoZSBzYW1lXG4gKiBwaXBlbGluZSBvdmVyd3JpdGVzIHJhdGhlciB0aGFuIGFjY3VtdWxhdGVzLiBXZSBkZWxpYmVyYXRlbHkgc3RvcmUgdGhlXG4gKiBwYXlsb2FkIHBsYWluIChub3QgdGhlIGZ1bGwgcGlwZWxpbmUgZG9jLCBub3QgYXV0aCkgc28gYSBzdGFsZSBmaWxlIGlzXG4gKiBzYWZlIHRvIGxlYXZlIGFyb3VuZCBpbmRlZmluaXRlbHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZVBlbmRpbmdJbnRlbnQocGF5bG9hZDogUmVnaXN0cnlQYXlsb2FkKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgYXdhaXQgZnMubWtkaXIoUEVORElOR19JTlRFTlRTX0RJUiwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IHBhdGggPSBqb2luKFBFTkRJTkdfSU5URU5UU19ESVIsIGAke3BheWxvYWQucGlwZWxpbmVJZH0uanNvbmApO1xuICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aCwgSlNPTi5zdHJpbmdpZnkocGF5bG9hZCwgbnVsbCwgMiksICd1dGY4Jyk7XG4gIHJldHVybiBwYXRoO1xufVxuXG4vKiogUmVtb3ZlIGEgcGVuZGluZyBpbnRlbnQgYWZ0ZXIgYSBzdWNjZXNzZnVsIGRyYWluLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsZWFyUGVuZGluZ0ludGVudChwaXBlbGluZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGF0aCA9IGpvaW4oUEVORElOR19JTlRFTlRTX0RJUiwgYCR7cGlwZWxpbmVJZH0uanNvbmApO1xuICB0cnkge1xuICAgIGF3YWl0IGZzLnVubGluayhwYXRoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gRU5PRU5UIGlzIGZpbmUg4oCUIGFscmVhZHkgY2xlYXJlZC4gQW55dGhpbmcgZWxzZSBpcyBhIHJlYWwgcHJvYmxlbS5cbiAgICBpZiAoKGVyciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgIT09ICdFTk9FTlQnKSB0aHJvdyBlcnI7XG4gIH1cbn1cblxuLyoqIFJlYWQgYWxsIHBlbmRpbmcgaW50ZW50cyBjdXJyZW50bHkgb24gZGlzay4gRW1wdHkgYXJyYXkgaWYgZGlyIGRvZXNuJ3QgZXhpc3QuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFBlbmRpbmdJbnRlbnRzKCk6IFByb21pc2U8UmVnaXN0cnlQYXlsb2FkW10+IHtcbiAgbGV0IGVudHJpZXM6IHN0cmluZ1tdO1xuICB0cnkge1xuICAgIGVudHJpZXMgPSBhd2FpdCBmcy5yZWFkZGlyKFBFTkRJTkdfSU5URU5UU19ESVIpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoKGVyciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gW107XG4gICAgdGhyb3cgZXJyO1xuICB9XG5cbiAgY29uc3QgaW50ZW50czogUmVnaXN0cnlQYXlsb2FkW10gPSBbXTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGVudHJpZXMpIHtcbiAgICBpZiAoIWZpbGUuZW5kc1dpdGgoJy5qc29uJykpIGNvbnRpbnVlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgZnMucmVhZEZpbGUoam9pbihQRU5ESU5HX0lOVEVOVFNfRElSLCBmaWxlKSwgJ3V0ZjgnKTtcbiAgICAgIGludGVudHMucHVzaChKU09OLnBhcnNlKHRleHQpIGFzIFJlZ2lzdHJ5UGF5bG9hZCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBTa2lwIHVucmVhZGFibGUgLyBtYWxmb3JtZWQgZmlsZXMg4oCUIHRoZXknbGwgbmVlZCBtYW51YWwgY2xlYW51cCBidXRcbiAgICAgIC8vIHNob3VsZG4ndCBibG9jayB2YWxpZCBpbnRlbnRzIGZyb20gZHJhaW5pbmcuXG4gICAgfVxuICB9XG4gIHJldHVybiBpbnRlbnRzO1xufVxuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"service-account.d.ts","sourceRoot":"","sources":["../../src/utils/service-account.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAMjD,yCAAyC;AACzC,MAAM,WAAW,mBAAmB;IAClC,8DAA8D;IAC9D,MAAM,EAAE,SAAS,CAAC;IAClB,oFAAoF;IACpF,QAAQ,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IACxB,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,gBAAgB,EAAE,MAAM,CAAC;IACzB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,iFAAiF;AACjF,MAAM,WAAW,cAAc;IAC7B,mFAAmF;IACnF,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAiDD,iDAAiD;AACjD,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAO9E;AA0DD,qFAAqF;AACrF,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAKf;AAyCD;;;;;;;GAOG;AACH,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC,CAanG"}
1
+ {"version":3,"file":"service-account.d.ts","sourceRoot":"","sources":["../../src/utils/service-account.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAMjD,yCAAyC;AACzC,MAAM,WAAW,mBAAmB;IAClC,8DAA8D;IAC9D,MAAM,EAAE,SAAS,CAAC;IAClB,oFAAoF;IACpF,QAAQ,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IACxB,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,gBAAgB,EAAE,MAAM,CAAC;IACzB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,iFAAiF;AACjF,MAAM,WAAW,cAAc;IAC7B,mFAAmF;IACnF,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAiDD,iDAAiD;AACjD,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAO9E;AA0DD,qFAAqF;AACrF,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAKf;AAyCD;;;;;;;GAOG;AACH,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC,CAanG"}