@pipeline-builder/api-core 4.1.12 → 4.1.14

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 (187) hide show
  1. package/README.md +3 -2
  2. package/lib/constants/index.d.ts +0 -1
  3. package/lib/constants/index.js +1 -2
  4. package/lib/errors/app-errors.d.ts +8 -3
  5. package/lib/errors/app-errors.js +10 -5
  6. package/lib/helpers/access-helpers.d.ts +4 -6
  7. package/lib/helpers/access-helpers.js +6 -8
  8. package/lib/helpers/index.d.ts +3 -3
  9. package/lib/helpers/index.js +4 -4
  10. package/lib/helpers/org-hierarchy-http.d.ts +11 -10
  11. package/lib/helpers/org-hierarchy-http.js +24 -35
  12. package/lib/helpers/org-hierarchy.d.ts +37 -3
  13. package/lib/helpers/org-hierarchy.js +45 -4
  14. package/lib/helpers/restore-helpers.d.ts +44 -24
  15. package/lib/helpers/restore-helpers.js +41 -52
  16. package/lib/helpers/sse-helpers.d.ts +29 -7
  17. package/lib/helpers/sse-helpers.js +36 -9
  18. package/lib/index.d.ts +16 -14
  19. package/lib/index.js +17 -15
  20. package/lib/middleware/assurance.d.ts +116 -0
  21. package/lib/middleware/assurance.js +176 -0
  22. package/lib/middleware/auth.d.ts +5 -427
  23. package/lib/middleware/auth.js +36 -789
  24. package/lib/middleware/ecosystem-guard.d.ts +47 -0
  25. package/lib/middleware/ecosystem-guard.js +60 -0
  26. package/lib/middleware/index.d.ts +11 -4
  27. package/lib/middleware/index.js +12 -5
  28. package/lib/middleware/jwt-verify.d.ts +52 -0
  29. package/lib/middleware/jwt-verify.js +105 -0
  30. package/lib/middleware/permission-gates.d.ts +133 -0
  31. package/lib/middleware/permission-gates.js +260 -0
  32. package/lib/middleware/revocation.d.ts +96 -0
  33. package/lib/middleware/revocation.js +162 -0
  34. package/lib/middleware/route-table.d.ts +11 -0
  35. package/lib/middleware/route-table.js +4 -1
  36. package/lib/middleware/service-tokens.d.ts +83 -0
  37. package/lib/middleware/service-tokens.js +158 -0
  38. package/lib/middleware/step-up.d.ts +2 -2
  39. package/lib/middleware/step-up.js +8 -7
  40. package/lib/middleware/system-org.d.ts +20 -0
  41. package/lib/middleware/system-org.js +25 -0
  42. package/lib/openapi/routes/plugin-routes.js +133 -10
  43. package/lib/openapi/schema-registry.js +2 -5
  44. package/lib/routes/index.d.ts +1 -1
  45. package/lib/routes/index.js +2 -2
  46. package/lib/services/api-key-exchange.js +7 -5
  47. package/lib/services/audit-spool.d.ts +34 -10
  48. package/lib/services/audit-spool.js +75 -34
  49. package/lib/services/cache-service.d.ts +7 -0
  50. package/lib/services/cache-service.js +1 -1
  51. package/lib/services/circuit-breaker.d.ts +14 -1
  52. package/lib/services/circuit-breaker.js +36 -10
  53. package/lib/services/compliance-client.d.ts +10 -2
  54. package/lib/services/compliance-client.js +17 -10
  55. package/lib/services/compliance-event-subscriber.js +6 -6
  56. package/lib/services/durable-event-bus.js +8 -11
  57. package/lib/services/ecosystem-notify-client.d.ts +32 -0
  58. package/lib/services/ecosystem-notify-client.js +71 -0
  59. package/lib/services/env-redis.d.ts +4 -1
  60. package/lib/services/env-redis.js +32 -3
  61. package/lib/services/http-client.d.ts +19 -0
  62. package/lib/services/http-client.js +98 -19
  63. package/lib/services/index.d.ts +25 -24
  64. package/lib/services/index.js +25 -22
  65. package/lib/services/jwks-cache.js +5 -4
  66. package/lib/services/leader-lock.d.ts +22 -5
  67. package/lib/services/leader-lock.js +61 -6
  68. package/lib/services/quota.d.ts +9 -4
  69. package/lib/services/quota.js +34 -40
  70. package/lib/services/remote-audit-client.d.ts +28 -32
  71. package/lib/services/remote-audit-client.js +166 -49
  72. package/lib/services/retry-forever.js +5 -11
  73. package/lib/services/retry-strategy.d.ts +1 -1
  74. package/lib/services/retry-strategy.js +5 -4
  75. package/lib/services/scheduler.d.ts +8 -3
  76. package/lib/services/scheduler.js +17 -5
  77. package/lib/services/service-boot.d.ts +14 -13
  78. package/lib/services/service-boot.js +18 -15
  79. package/lib/services/service-keys.d.ts +1 -1
  80. package/lib/services/service-keys.js +12 -18
  81. package/lib/services/sse-ticket-store.d.ts +9 -1
  82. package/lib/services/sse-ticket-store.js +24 -9
  83. package/lib/services/system-notification.d.ts +27 -0
  84. package/lib/services/system-notification.js +50 -0
  85. package/lib/services/token-revocation.d.ts +50 -1
  86. package/lib/services/token-revocation.js +103 -3
  87. package/lib/types/audit-events.d.ts +6 -6
  88. package/lib/types/audit-events.js +1 -1
  89. package/lib/types/common.d.ts +32 -13
  90. package/lib/types/common.js +2 -1
  91. package/lib/types/ecosystem-notifications.d.ts +142 -0
  92. package/lib/types/ecosystem-notifications.js +210 -0
  93. package/lib/types/ecosystem.d.ts +77 -0
  94. package/lib/types/ecosystem.js +119 -0
  95. package/lib/types/error-codes.d.ts +81 -0
  96. package/lib/types/error-codes.js +108 -1
  97. package/lib/types/feature-flags.d.ts +21 -1
  98. package/lib/types/feature-flags.js +36 -2
  99. package/lib/types/index.d.ts +14 -9
  100. package/lib/types/index.js +15 -10
  101. package/lib/types/permissions.d.ts +46 -8
  102. package/lib/types/permissions.js +75 -12
  103. package/lib/types/plugin-catalog.d.ts +35 -0
  104. package/lib/types/plugin-catalog.js +39 -0
  105. package/lib/types/plugin-health.d.ts +102 -0
  106. package/lib/types/plugin-health.js +184 -0
  107. package/lib/types/quota-tiers.d.ts +15 -0
  108. package/lib/types/quota-tiers.js +23 -3
  109. package/lib/types/wire-vocabulary.d.ts +102 -0
  110. package/lib/types/wire-vocabulary.js +94 -0
  111. package/lib/utils/alias-resolver.js +2 -2
  112. package/lib/utils/audit.d.ts +5 -2
  113. package/lib/utils/audit.js +6 -3
  114. package/lib/utils/compliance-attributes.js +3 -4
  115. package/lib/utils/concurrency.d.ts +7 -0
  116. package/lib/utils/concurrency.js +13 -1
  117. package/lib/utils/env.d.ts +3 -4
  118. package/lib/utils/env.js +4 -5
  119. package/lib/utils/identity.d.ts +13 -4
  120. package/lib/utils/identity.js +18 -10
  121. package/lib/utils/index.d.ts +13 -10
  122. package/lib/utils/index.js +13 -10
  123. package/lib/utils/jwk.d.ts +4 -0
  124. package/lib/utils/jwk.js +13 -1
  125. package/lib/utils/logger.d.ts +1 -1
  126. package/lib/utils/logger.js +1 -1
  127. package/lib/utils/object.d.ts +11 -0
  128. package/lib/utils/object.js +24 -1
  129. package/lib/utils/params.d.ts +8 -22
  130. package/lib/utils/params.js +15 -43
  131. package/lib/utils/plugin-compliance.d.ts +98 -0
  132. package/lib/utils/plugin-compliance.js +78 -0
  133. package/lib/utils/proof-of-work.d.ts +69 -0
  134. package/lib/utils/proof-of-work.js +139 -0
  135. package/lib/utils/response.d.ts +16 -6
  136. package/lib/utils/response.js +18 -15
  137. package/lib/utils/retention.d.ts +17 -0
  138. package/lib/utils/retention.js +30 -0
  139. package/lib/utils/secret-encryption.d.ts +7 -7
  140. package/lib/utils/secret-encryption.js +9 -10
  141. package/lib/utils/secret-rotation.js +2 -2
  142. package/lib/utils/sensitive-patterns.js +4 -5
  143. package/lib/utils/service-registry.d.ts +15 -0
  144. package/lib/utils/service-registry.js +24 -0
  145. package/lib/utils/ssrf.d.ts +11 -2
  146. package/lib/utils/ssrf.js +112 -33
  147. package/lib/validation/ai-schemas.js +3 -2
  148. package/lib/validation/common-schemas.d.ts +0 -9
  149. package/lib/validation/common-schemas.js +1 -7
  150. package/lib/validation/dockerfile-static.d.ts +26 -0
  151. package/lib/validation/dockerfile-static.js +210 -0
  152. package/lib/validation/index.d.ts +13 -4
  153. package/lib/validation/index.js +14 -5
  154. package/lib/validation/message-schemas.js +6 -4
  155. package/lib/validation/pipeline-schemas.d.ts +8 -2
  156. package/lib/validation/pipeline-schemas.js +30 -4
  157. package/lib/validation/plugin-base-images.d.ts +20 -0
  158. package/lib/validation/plugin-base-images.js +17 -0
  159. package/lib/validation/plugin-catalog-detect.d.ts +86 -0
  160. package/lib/validation/plugin-catalog-detect.js +237 -0
  161. package/lib/validation/plugin-catalog-metadata.d.ts +141 -0
  162. package/lib/validation/plugin-catalog-metadata.js +162 -0
  163. package/lib/validation/plugin-heuristics.d.ts +41 -0
  164. package/lib/validation/plugin-heuristics.js +211 -0
  165. package/lib/validation/plugin-lint.d.ts +18 -0
  166. package/lib/validation/plugin-lint.js +136 -0
  167. package/lib/validation/plugin-name-confusable.d.ts +15 -0
  168. package/lib/validation/plugin-name-confusable.js +81 -0
  169. package/lib/validation/plugin-schemas.d.ts +40 -26
  170. package/lib/validation/plugin-schemas.js +26 -23
  171. package/lib/validation/plugin-spec-schema.d.ts +112 -0
  172. package/lib/validation/plugin-spec-schema.js +163 -0
  173. package/lib/validation/plugin-template-contract.d.ts +64 -0
  174. package/lib/validation/plugin-template-contract.js +113 -0
  175. package/package.json +69 -4
  176. package/lib/testing/mock-api-core.d.ts +0 -150
  177. package/lib/testing/mock-api-core.js +0 -246
  178. package/lib/testing/mock-drizzle.d.ts +0 -6
  179. package/lib/testing/mock-drizzle.js +0 -57
  180. package/lib/testing/route-coverage.d.ts +0 -64
  181. package/lib/testing/route-coverage.js +0 -183
  182. package/lib/testing/service-tokens.d.ts +0 -66
  183. package/lib/testing/service-tokens.js +0 -137
  184. package/lib/testing/tier-mock.d.ts +0 -44
  185. package/lib/testing/tier-mock.js +0 -65
  186. package/lib/testing/user-tokens.d.ts +0 -75
  187. package/lib/testing/user-tokens.js +0 -115
@@ -1,12 +1,13 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  import * as http from 'http';
4
+ import { envInt } from '../utils/env.js';
4
5
  /**
5
6
  * Default retry configuration (env: `HTTP_CLIENT_MAX_RETRIES`, `HTTP_CLIENT_RETRY_DELAY_MS`).
6
7
  */
7
- export const DEFAULT_MAX_RETRIES = parseInt(process.env.HTTP_CLIENT_MAX_RETRIES || '2', 10);
8
- export const DEFAULT_RETRY_DELAY_MS = parseInt(process.env.HTTP_CLIENT_RETRY_DELAY_MS || '200', 10);
9
- export const DEFAULT_MAX_RATE_LIMIT_RETRIES = parseInt(process.env.HTTP_CLIENT_MAX_RATE_LIMIT_RETRIES || '4', 10);
8
+ export const DEFAULT_MAX_RETRIES = envInt('HTTP_CLIENT_MAX_RETRIES', 2, { min: 0 });
9
+ export const DEFAULT_RETRY_DELAY_MS = envInt('HTTP_CLIENT_RETRY_DELAY_MS', 200, { min: 0 });
10
+ export const DEFAULT_MAX_RATE_LIMIT_RETRIES = 4;
10
11
  /** Max Retry-After value we'll honor (60 seconds). */
11
12
  const MAX_RETRY_AFTER_MS = 60_000;
12
13
  /** HTTP status codes considered transient server errors eligible for retry. */
@@ -115,4 +116,4 @@ export function getErrorRetryDecision(attempt, config) {
115
116
  }
116
117
  return { shouldRetry: false, delayMs: 0, reason: 'Max retries exceeded' };
117
118
  }
118
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cnktc3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvcmV0cnktc3RyYXRlZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUU3Qjs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixJQUFJLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM1RixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsSUFBSSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDcEcsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0NBQWtDLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBRWxILHNEQUFzRDtBQUN0RCxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQztBQUVsQywrRUFBK0U7QUFDL0UsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUE4Qi9DOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLE1BQXFDO0lBQ25FLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDOUIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDekQsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUU3Qiw0QkFBNEI7SUFDNUIsTUFBTSxPQUFPLEdBQUcsTUFB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QUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLENBQUM7QUFDckUsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FDbkMsT0FBZSxFQUNmLE1BQW1CO0lBRW5CLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQyxNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2hFLE9BQU87WUFDTCxXQUFXLEVBQUUsSUFBSTtZQUNqQixPQUFPLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQztZQUM1QixNQUFNLEVBQUUsNkJBQTZCO1NBQ3RDLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQztBQUM1RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCAqIGFzIGh0dHAgZnJvbSAnaHR0cCc7XG5cbi8qKlxuICogRGVmYXVsdCByZXRyeSBjb25maWd1cmF0aW9uIChlbnY6IGBIVFRQX0NMSUVOVF9NQVhfUkVUUklFU2AsIGBIVFRQX0NMSUVOVF9SRVRSWV9ERUxBWV9NU2ApLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9NQVhfUkVUUklFUyA9IHBhcnNlSW50KHByb2Nlc3MuZW52LkhUVFBfQ0xJRU5UX01BWF9SRVRSSUVTIHx8ICcyJywgMTApO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkVUUllfREVMQVlfTVMgPSBwYXJzZUludChwcm9jZXNzLmVudi5IVFRQX0NMSUVOVF9SRVRSWV9ERUxBWV9NUyB8fCAnMjAwJywgMTApO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTUFYX1JBVEVfTElNSVRfUkVUUklFUyA9IHBhcnNlSW50KHByb2Nlc3MuZW52LkhUVFBfQ0xJRU5UX01BWF9SQVRFX0xJTUlUX1JFVFJJRVMgfHwgJzQnLCAxMCk7XG5cbi8qKiBNYXggUmV0cnktQWZ0ZXIgdmFsdWUgd2UnbGwgaG9ub3IgKDYwIHNlY29uZHMpLiAqL1xuY29uc3QgTUFYX1JFVFJZX0FGVEVSX01TID0gNjBfMDAwO1xuXG4vKiogSFRUUCBzdGF0dXMgY29kZXMgY29uc2lkZXJlZCB0cmFuc2llbnQgc2VydmVyIGVycm9ycyBlbGlnaWJsZSBmb3IgcmV0cnkuICovXG5jb25zdCBUUkFOU0lFTlRfU1RBVFVTX0NPREVTID0gWzUwMiwgNTAzLCA1MDRdO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHJldHJ5IGJlaGF2aW9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5Q29uZmlnIHtcbiAgLyoqIFJldHJpZXMgQUZURVIgdGhlIGluaXRpYWwgYXR0ZW1wdCAoc28gYDNgIOKHkiB1cCB0byA0IGF0dGVtcHRzKS4gKi9cbiAgbWF4UmV0cmllczogbnVtYmVyO1xuICAvKiogQmFzZSBkZWxheSBiZXR3ZWVuIHJldHJpZXMgaW4gbXMg4oCUIGRvdWJsZXMgZWFjaCBhdHRlbXB0IChkZWZhdWx0OiAyMDApICovXG4gIHJldHJ5RGVsYXlNczogbnVtYmVyO1xuICAvKipcbiAgICogTWF4aW11bSByZXRyeSBhdHRlbXB0cyBzcGVjaWZpY2FsbHkgZm9yIDQyOSByYXRlIGxpbWl0aW5nIChkZWZhdWx0OlxuICAgKiB7QGxpbmsgREVGQVVMVF9NQVhfUkFURV9MSU1JVF9SRVRSSUVTfSkuIEhUVFAtb25seSDigJQgb21pdCBpdCBmb3IgYVxuICAgKiBub24tSFRUUCBjb25zdW1lciBzdWNoIGFzIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHJldHJ5LlxuICAgKi9cbiAgbWF4UmF0ZUxpbWl0UmV0cmllcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgYSByZXRyeSBkZWNpc2lvbjogd2hldGhlciB0byByZXRyeSwgYW5kIGhvdyBsb25nIHRvIHdhaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlEZWNpc2lvbiB7XG4gIC8qKiBXaGV0aGVyIHRoZSByZXF1ZXN0IHNob3VsZCBiZSByZXRyaWVkICovXG4gIHNob3VsZFJldHJ5OiBib29sZWFuO1xuICAvKiogRGVsYXkgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSByZXRyeWluZyAod2l0aCBqaXR0ZXIgYXBwbGllZCkgKi9cbiAgZGVsYXlNczogbnVtYmVyO1xuICAvKiogSHVtYW4tcmVhZGFibGUgcmVhc29uIGZvciB0aGUgcmV0cnkgZGVjaXNpb24gKi9cbiAgcmVhc29uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyc2UgYSBgUmV0cnktQWZ0ZXJgIGhlYWRlciB2YWx1ZSBpbnRvIG1pbGxpc2Vjb25kcy5cbiAqIFN1cHBvcnRzIG51bWVyaWMgc2Vjb25kcyAoZS5nLiBcIjVcIikgYW5kIEhUVFAtZGF0ZSBmb3JtYXQuXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIGZvciBtaXNzaW5nIG9yIGludmFsaWQgdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSZXRyeUFmdGVyKGhlYWRlcjogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBpZiAoIWhlYWRlcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdmFsdWUgPSBBcnJheS5pc0FycmF5KGhlYWRlcikgPyBoZWFkZXJbMF0gOiBoZWFkZXI7XG4gIGlmICghdmFsdWUpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gVHJ5IG51bWVyaWMgc2Vjb25kcyBmaXJzdFxuICBjb25zdCBzZWNvbmRzID0gTnVtYmVyKHZhbHVlKTtcbiAgaWYgKCFpc05hTihzZWNvbmRzKSAmJiBzZWNvbmRzID49IDApIHtcbiAgICByZXR1cm4gTWF0aC5taW4oc2Vjb25kcyAqIDEwMDAsIE1BWF9SRVRSWV9BRlRFUl9NUyk7XG4gIH1cblxuICAvLyBUcnkgSFRUUC1kYXRlXG4gIGNvbnN0IGRhdGUgPSBEYXRlLnBhcnNlKHZhbHVlKTtcbiAgaWYgKCFpc05hTihkYXRlKSkge1xuICAgIGNvbnN0IGRlbGF5TXMgPSBkYXRlIC0gRGF0ZS5ub3coKTtcbiAgICBpZiAoZGVsYXlNcyA+IDApIHJldHVybiBNYXRoLm1pbihkZWxheU1zLCBNQVhfUkVUUllfQUZURVJfTVMpO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBBcHBseSArLy0yNSUgcmFuZG9tIGppdHRlciB0byBhIGRlbGF5IHRvIHByZXZlbnQgdGh1bmRlcmluZyBoZXJkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkSml0dGVyKGRlbGF5OiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBqaXR0ZXIgPSBkZWxheSAqIDAuMjUgKiAoMiAqIE1hdGgucmFuZG9tKCkgLSAxKTsgLy8gLTI1JSB0byArMjUlXG4gIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKGRlbGF5ICsgaml0dGVyKSk7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIGV4cG9uZW50aWFsIGJhY2tvZmYgZGVsYXkgZm9yIGEgZ2l2ZW4gYXR0ZW1wdC5cbiAqXG4gKiBAcGFyYW0gYmFzZURlbGF5IC0gQmFzZSBkZWxheSBpbiBtaWxsaXNlY29uZHNcbiAqIEBwYXJhbSBhdHRlbXB0IC0gWmVyby1iYXNlZCBhdHRlbXB0IG51bWJlclxuICogQHJldHVybnMgRGVsYXkgaW4gbWlsbGlzZWNvbmRzICh3aXRob3V0IGppdHRlcilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZUJhY2tvZmYoYmFzZURlbGF5OiBudW1iZXIsIGF0dGVtcHQ6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBiYXNlRGVsYXkgKiBNYXRoLnBvdygyLCBhdHRlbXB0KTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgd2hldGhlciBhIHN0YXR1cyBjb2RlIHJlcHJlc2VudHMgYSB0cmFuc2llbnQgc2VydmVyIGVycm9yXG4gKiB0aGF0IGlzIGVsaWdpYmxlIGZvciByZXRyeSAoNTAyLCA1MDMsIDUwNCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RyYW5zaWVudFN0YXR1c0NvZGUoc3RhdHVzQ29kZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBUUkFOU0lFTlRfU1RBVFVTX0NPREVTLmluY2x1ZGVzKHN0YXR1c0NvZGUpO1xufVxuXG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIGEgc3RhdHVzIGNvZGUgaW5kaWNhdGVzIHJhdGUgbGltaXRpbmcgKDQyOSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JhdGVMaW1pdGVkKHN0YXR1c0NvZGU6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gc3RhdHVzQ29kZSA9PT0gNDI5O1xufVxuXG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIGEgZmFpbGVkIHJlc3BvbnNlIHNob3VsZCBiZSByZXRyaWVkLCBhbmQgY29tcHV0ZSB0aGUgZGVsYXkuXG4gKlxuICogQHBhcmFtIHN0YXR1c0NvZGUgLSBIVFRQIHN0YXR1cyBjb2RlIG9mIHRoZSByZXNwb25zZVxuICogQHBhcmFtIGhlYWRlcnMgLSBSZXNwb25zZSBoZWFkZXJzICh1c2VkIHRvIHJlYWQgUmV0cnktQWZ0ZXIgZm9yIDQyOSlcbiAqIEBwYXJhbSBhdHRlbXB0IC0gWmVyby1iYXNlZCBhdHRlbXB0IG51bWJlclxuICogQHBhcmFtIGNvbmZpZyAtIFJldHJ5IGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIEEgUmV0cnlEZWNpc2lvbiBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gcmV0cnkgYW5kIHRoZSBkZWxheVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmV0cnlEZWNpc2lvbihcbiAgc3RhdHVzQ29kZTogbnVtYmVyLFxuICBoZWFkZXJzOiBodHRwLkluY29taW5nSHR0cEhlYWRlcnMsXG4gIGF0dGVtcHQ6IG51bWJlcixcbiAgY29uZmlnOiBSZXRyeUNvbmZpZyxcbik6IFJldHJ5RGVjaXNpb24ge1xuICAvLyA0MjkgcmF0ZSBsaW1pdGluZyDigJQgdXNlIFJldHJ5LUFmdGVyIG9yIGxvbmdlciBiYWNrb2ZmICg0eCBiYXNlKVxuICBpZiAoaXNSYXRlTGltaXRlZChzdGF0dXNDb2RlKSAmJiBhdHRlbXB0IDwgKGNvbmZpZy5tYXhSYXRlTGltaXRSZXRyaWVzID8/IERFRkFVTFRfTUFYX1JBVEVfTElNSVRfUkVUUklFUykpIHtcbiAgICBjb25zdCByZXRyeUFmdGVyID0gcGFyc2VSZXRyeUFmdGVyKGhlYWRlcnNbJ3JldHJ5LWFmdGVyJ10pO1xuICAgIGNvbnN0IHJhd0RlbGF5ID0gcmV0cnlBZnRlciA/PyAoY29uZmlnLnJldHJ5RGVsYXlNcyAqIDQgKiBNYXRoLnBvdygyLCBhdHRlbXB0KSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNob3VsZFJldHJ5OiB0cnVlLFxuICAgICAgZGVsYXlNczogYWRkSml0dGVyKHJhd0RlbGF5KSxcbiAgICAgIHJlYXNvbjogJ1JhdGUgbGltaXRlZCAoNDI5KScsXG4gICAgfTtcbiAgfVxuXG4gIC8vIDV4eCB0cmFuc2llbnQgc2VydmVyIGVycm9ycyDigJQgc3RhbmRhcmQgZXhwb25lbnRpYWwgYmFja29mZlxuICBpZiAoaXNUcmFuc2llbnRTdGF0dXNDb2RlKHN0YXR1c0NvZGUpICYmIGF0dGVtcHQgPCBjb25maWcubWF4UmV0cmllcykge1xuICAgIGNvbnN0IHJhd0RlbGF5ID0gY2FsY3VsYXRlQmFja29mZihjb25maWcucmV0cnlEZWxheU1zLCBhdHRlbXB0KTtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvdWxkUmV0cnk6IHRydWUsXG4gICAgICBkZWxheU1zOiBhZGRKaXR0ZXIocmF3RGVsYXkpLFxuICAgICAgcmVhc29uOiBgVHJhbnNpZW50IHNlcnZlciBlcnJvciAoJHtzdGF0dXNDb2RlfSlgLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4geyBzaG91bGRSZXRyeTogZmFsc2UsIGRlbGF5TXM6IDAsIHJlYXNvbjogJ05vdCByZXRyeWFibGUnIH07XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBjb25uZWN0aW9uL3RpbWVvdXQgZXJyb3Igc2hvdWxkIGJlIHJldHJpZWQsIGFuZCBjb21wdXRlIHRoZSBkZWxheS5cbiAqXG4gKiBAcGFyYW0gYXR0ZW1wdCAtIFplcm8tYmFzZWQgYXR0ZW1wdCBudW1iZXJcbiAqIEBwYXJhbSBjb25maWcgLSBSZXRyeSBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBBIFJldHJ5RGVjaXNpb24gaW5kaWNhdGluZyB3aGV0aGVyIHRvIHJldHJ5IGFuZCB0aGUgZGVsYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEVycm9yUmV0cnlEZWNpc2lvbihcbiAgYXR0ZW1wdDogbnVtYmVyLFxuICBjb25maWc6IFJldHJ5Q29uZmlnLFxuKTogUmV0cnlEZWNpc2lvbiB7XG4gIGlmIChhdHRlbXB0IDwgY29uZmlnLm1heFJldHJpZXMpIHtcbiAgICBjb25zdCByYXdEZWxheSA9IGNhbGN1bGF0ZUJhY2tvZmYoY29uZmlnLnJldHJ5RGVsYXlNcywgYXR0ZW1wdCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNob3VsZFJldHJ5OiB0cnVlLFxuICAgICAgZGVsYXlNczogYWRkSml0dGVyKHJhd0RlbGF5KSxcbiAgICAgIHJlYXNvbjogJ0Nvbm5lY3Rpb24gb3IgdGltZW91dCBlcnJvcicsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7IHNob3VsZFJldHJ5OiBmYWxzZSwgZGVsYXlNczogMCwgcmVhc29uOiAnTWF4IHJldHJpZXMgZXhjZWVkZWQnIH07XG59XG4iXX0=
119
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cnktc3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvcmV0cnktc3RyYXRlZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFekM7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLENBQUMseUJBQXlCLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEYsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsTUFBTSxDQUFDLDRCQUE0QixFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzVGLE1BQU0sQ0FBQyxNQUFNLDhCQUE4QixHQUFHLENBQUMsQ0FBQztBQUVoRCxzREFBc0Q7QUFDdEQsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUM7QUFFbEMsK0VBQStFO0FBQy9FLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBOEIvQzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxNQUFxQztJQUNuRSxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzlCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3pELElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFN0IsNEJBQTRCO0lBQzVCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENB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S0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxDQUFDO0FBQ3JFLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQ25DLE9BQWUsRUFDZixNQUFtQjtJQUVuQixJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEMsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNoRSxPQUFPO1lBQ0wsV0FBVyxFQUFFLElBQUk7WUFDakIsT0FBTyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUM7WUFDNUIsTUFBTSxFQUFFLDZCQUE2QjtTQUN0QyxDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLHNCQUFzQixFQUFFLENBQUM7QUFDNUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgKiBhcyBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgZW52SW50IH0gZnJvbSAnLi4vdXRpbHMvZW52LmpzJztcblxuLyoqXG4gKiBEZWZhdWx0IHJldHJ5IGNvbmZpZ3VyYXRpb24gKGVudjogYEhUVFBfQ0xJRU5UX01BWF9SRVRSSUVTYCwgYEhUVFBfQ0xJRU5UX1JFVFJZX0RFTEFZX01TYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01BWF9SRVRSSUVTID0gZW52SW50KCdIVFRQX0NMSUVOVF9NQVhfUkVUUklFUycsIDIsIHsgbWluOiAwIH0pO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkVUUllfREVMQVlfTVMgPSBlbnZJbnQoJ0hUVFBfQ0xJRU5UX1JFVFJZX0RFTEFZX01TJywgMjAwLCB7IG1pbjogMCB9KTtcbmV4cG9ydCBjb25zdCBERUZBVUxUX01BWF9SQVRFX0xJTUlUX1JFVFJJRVMgPSA0O1xuXG4vKiogTWF4IFJldHJ5LUFmdGVyIHZhbHVlIHdlJ2xsIGhvbm9yICg2MCBzZWNvbmRzKS4gKi9cbmNvbnN0IE1BWF9SRVRSWV9BRlRFUl9NUyA9IDYwXzAwMDtcblxuLyoqIEhUVFAgc3RhdHVzIGNvZGVzIGNvbnNpZGVyZWQgdHJhbnNpZW50IHNlcnZlciBlcnJvcnMgZWxpZ2libGUgZm9yIHJldHJ5LiAqL1xuY29uc3QgVFJBTlNJRU5UX1NUQVRVU19DT0RFUyA9IFs1MDIsIDUwMywgNTA0XTtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciByZXRyeSBiZWhhdmlvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXRyeUNvbmZpZyB7XG4gIC8qKiBSZXRyaWVzIEFGVEVSIHRoZSBpbml0aWFsIGF0dGVtcHQgKHNvIGAzYCDih5IgdXAgdG8gNCBhdHRlbXB0cykuICovXG4gIG1heFJldHJpZXM6IG51bWJlcjtcbiAgLyoqIEJhc2UgZGVsYXkgYmV0d2VlbiByZXRyaWVzIGluIG1zIOKAlCBkb3VibGVzIGVhY2ggYXR0ZW1wdCAoZGVmYXVsdDogMjAwKSAqL1xuICByZXRyeURlbGF5TXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIE1heGltdW0gcmV0cnkgYXR0ZW1wdHMgc3BlY2lmaWNhbGx5IGZvciA0MjkgcmF0ZSBsaW1pdGluZyAoZGVmYXVsdDpcbiAgICoge0BsaW5rIERFRkFVTFRfTUFYX1JBVEVfTElNSVRfUkVUUklFU30pLiBIVFRQLW9ubHkg4oCUIG9taXQgaXQgZm9yIGFcbiAgICogbm9uLUhUVFAgY29uc3VtZXIgc3VjaCBhcyB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiByZXRyeS5cbiAgICovXG4gIG1heFJhdGVMaW1pdFJldHJpZXM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGEgcmV0cnkgZGVjaXNpb246IHdoZXRoZXIgdG8gcmV0cnksIGFuZCBob3cgbG9uZyB0byB3YWl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5RGVjaXNpb24ge1xuICAvKiogV2hldGhlciB0aGUgcmVxdWVzdCBzaG91bGQgYmUgcmV0cmllZCAqL1xuICBzaG91bGRSZXRyeTogYm9vbGVhbjtcbiAgLyoqIERlbGF5IGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgcmV0cnlpbmcgKHdpdGggaml0dGVyIGFwcGxpZWQpICovXG4gIGRlbGF5TXM6IG51bWJlcjtcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIHJlYXNvbiBmb3IgdGhlIHJldHJ5IGRlY2lzaW9uICovXG4gIHJlYXNvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcnNlIGEgYFJldHJ5LUFmdGVyYCBoZWFkZXIgdmFsdWUgaW50byBtaWxsaXNlY29uZHMuXG4gKiBTdXBwb3J0cyBudW1lcmljIHNlY29uZHMgKGUuZy4gXCI1XCIpIGFuZCBIVFRQLWRhdGUgZm9ybWF0LlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCBmb3IgbWlzc2luZyBvciBpbnZhbGlkIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmV0cnlBZnRlcihoZWFkZXI6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFoZWFkZXIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHZhbHVlID0gQXJyYXkuaXNBcnJheShoZWFkZXIpID8gaGVhZGVyWzBdIDogaGVhZGVyO1xuICBpZiAoIXZhbHVlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIFRyeSBudW1lcmljIHNlY29uZHMgZmlyc3RcbiAgY29uc3Qgc2Vjb25kcyA9IE51bWJlcih2YWx1ZSk7XG4gIGlmICghaXNOYU4oc2Vjb25kcykgJiYgc2Vjb25kcyA+PSAwKSB7XG4gICAgcmV0dXJuIE1hdGgubWluKHNlY29uZHMgKiAxMDAwLCBNQVhfUkVUUllfQUZURVJfTVMpO1xuICB9XG5cbiAgLy8gVHJ5IEhUVFAtZGF0ZVxuICBjb25zdCBkYXRlID0gRGF0ZS5wYXJzZSh2YWx1ZSk7XG4gIGlmICghaXNOYU4oZGF0ZSkpIHtcbiAgICBjb25zdCBkZWxheU1zID0gZGF0ZSAtIERhdGUubm93KCk7XG4gICAgaWYgKGRlbGF5TXMgPiAwKSByZXR1cm4gTWF0aC5taW4oZGVsYXlNcywgTUFYX1JFVFJZX0FGVEVSX01TKTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQXBwbHkgKy8tMjUlIHJhbmRvbSBqaXR0ZXIgdG8gYSBkZWxheSB0byBwcmV2ZW50IHRodW5kZXJpbmcgaGVyZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEppdHRlcihkZWxheTogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3Qgaml0dGVyID0gZGVsYXkgKiAwLjI1ICogKDIgKiBNYXRoLnJhbmRvbSgpIC0gMSk7IC8vIC0yNSUgdG8gKzI1JVxuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5yb3VuZChkZWxheSArIGppdHRlcikpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBleHBvbmVudGlhbCBiYWNrb2ZmIGRlbGF5IGZvciBhIGdpdmVuIGF0dGVtcHQuXG4gKlxuICogQHBhcmFtIGJhc2VEZWxheSAtIEJhc2UgZGVsYXkgaW4gbWlsbGlzZWNvbmRzXG4gKiBAcGFyYW0gYXR0ZW1wdCAtIFplcm8tYmFzZWQgYXR0ZW1wdCBudW1iZXJcbiAqIEByZXR1cm5zIERlbGF5IGluIG1pbGxpc2Vjb25kcyAod2l0aG91dCBqaXR0ZXIpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVCYWNrb2ZmKGJhc2VEZWxheTogbnVtYmVyLCBhdHRlbXB0OiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gYmFzZURlbGF5ICogTWF0aC5wb3coMiwgYXR0ZW1wdCk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBzdGF0dXMgY29kZSByZXByZXNlbnRzIGEgdHJhbnNpZW50IHNlcnZlciBlcnJvclxuICogdGhhdCBpcyBlbGlnaWJsZSBmb3IgcmV0cnkgKDUwMiwgNTAzLCA1MDQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNUcmFuc2llbnRTdGF0dXNDb2RlKHN0YXR1c0NvZGU6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gVFJBTlNJRU5UX1NUQVRVU19DT0RFUy5pbmNsdWRlcyhzdGF0dXNDb2RlKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgd2hldGhlciBhIHN0YXR1cyBjb2RlIGluZGljYXRlcyByYXRlIGxpbWl0aW5nICg0MjkpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSYXRlTGltaXRlZChzdGF0dXNDb2RlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIHN0YXR1c0NvZGUgPT09IDQyOTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgd2hldGhlciBhIGZhaWxlZCByZXNwb25zZSBzaG91bGQgYmUgcmV0cmllZCwgYW5kIGNvbXB1dGUgdGhlIGRlbGF5LlxuICpcbiAqIEBwYXJhbSBzdGF0dXNDb2RlIC0gSFRUUCBzdGF0dXMgY29kZSBvZiB0aGUgcmVzcG9uc2VcbiAqIEBwYXJhbSBoZWFkZXJzIC0gUmVzcG9uc2UgaGVhZGVycyAodXNlZCB0byByZWFkIFJldHJ5LUFmdGVyIGZvciA0MjkpXG4gKiBAcGFyYW0gYXR0ZW1wdCAtIFplcm8tYmFzZWQgYXR0ZW1wdCBudW1iZXJcbiAqIEBwYXJhbSBjb25maWcgLSBSZXRyeSBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBBIFJldHJ5RGVjaXNpb24gaW5kaWNhdGluZyB3aGV0aGVyIHRvIHJldHJ5IGFuZCB0aGUgZGVsYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJldHJ5RGVjaXNpb24oXG4gIHN0YXR1c0NvZGU6IG51bWJlcixcbiAgaGVhZGVyczogaHR0cC5JbmNvbWluZ0h0dHBIZWFkZXJzLFxuICBhdHRlbXB0OiBudW1iZXIsXG4gIGNvbmZpZzogUmV0cnlDb25maWcsXG4pOiBSZXRyeURlY2lzaW9uIHtcbiAgLy8gNDI5IHJhdGUgbGltaXRpbmcg4oCUIHVzZSBSZXRyeS1BZnRlciBvciBsb25nZXIgYmFja29mZiAoNHggYmFzZSlcbiAgaWYgKGlzUmF0ZUxpbWl0ZWQoc3RhdHVzQ29kZSkgJiYgYXR0ZW1wdCA8IChjb25maWcubWF4UmF0ZUxpbWl0UmV0cmllcyA/PyBERUZBVUxUX01BWF9SQVRFX0xJTUlUX1JFVFJJRVMpKSB7XG4gICAgY29uc3QgcmV0cnlBZnRlciA9IHBhcnNlUmV0cnlBZnRlcihoZWFkZXJzWydyZXRyeS1hZnRlciddKTtcbiAgICBjb25zdCByYXdEZWxheSA9IHJldHJ5QWZ0ZXIgPz8gKGNvbmZpZy5yZXRyeURlbGF5TXMgKiA0ICogTWF0aC5wb3coMiwgYXR0ZW1wdCkpO1xuICAgIHJldHVybiB7XG4gICAgICBzaG91bGRSZXRyeTogdHJ1ZSxcbiAgICAgIGRlbGF5TXM6IGFkZEppdHRlcihyYXdEZWxheSksXG4gICAgICByZWFzb246ICdSYXRlIGxpbWl0ZWQgKDQyOSknLFxuICAgIH07XG4gIH1cblxuICAvLyA1eHggdHJhbnNpZW50IHNlcnZlciBlcnJvcnMg4oCUIHN0YW5kYXJkIGV4cG9uZW50aWFsIGJhY2tvZmZcbiAgaWYgKGlzVHJhbnNpZW50U3RhdHVzQ29kZShzdGF0dXNDb2RlKSAmJiBhdHRlbXB0IDwgY29uZmlnLm1heFJldHJpZXMpIHtcbiAgICBjb25zdCByYXdEZWxheSA9IGNhbGN1bGF0ZUJhY2tvZmYoY29uZmlnLnJldHJ5RGVsYXlNcywgYXR0ZW1wdCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNob3VsZFJldHJ5OiB0cnVlLFxuICAgICAgZGVsYXlNczogYWRkSml0dGVyKHJhd0RlbGF5KSxcbiAgICAgIHJlYXNvbjogYFRyYW5zaWVudCBzZXJ2ZXIgZXJyb3IgKCR7c3RhdHVzQ29kZX0pYCxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHsgc2hvdWxkUmV0cnk6IGZhbHNlLCBkZWxheU1zOiAwLCByZWFzb246ICdOb3QgcmV0cnlhYmxlJyB9O1xufVxuXG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIGEgY29ubmVjdGlvbi90aW1lb3V0IGVycm9yIHNob3VsZCBiZSByZXRyaWVkLCBhbmQgY29tcHV0ZSB0aGUgZGVsYXkuXG4gKlxuICogQHBhcmFtIGF0dGVtcHQgLSBaZXJvLWJhc2VkIGF0dGVtcHQgbnVtYmVyXG4gKiBAcGFyYW0gY29uZmlnIC0gUmV0cnkgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgQSBSZXRyeURlY2lzaW9uIGluZGljYXRpbmcgd2hldGhlciB0byByZXRyeSBhbmQgdGhlIGRlbGF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFcnJvclJldHJ5RGVjaXNpb24oXG4gIGF0dGVtcHQ6IG51bWJlcixcbiAgY29uZmlnOiBSZXRyeUNvbmZpZyxcbik6IFJldHJ5RGVjaXNpb24ge1xuICBpZiAoYXR0ZW1wdCA8IGNvbmZpZy5tYXhSZXRyaWVzKSB7XG4gICAgY29uc3QgcmF3RGVsYXkgPSBjYWxjdWxhdGVCYWNrb2ZmKGNvbmZpZy5yZXRyeURlbGF5TXMsIGF0dGVtcHQpO1xuICAgIHJldHVybiB7XG4gICAgICBzaG91bGRSZXRyeTogdHJ1ZSxcbiAgICAgIGRlbGF5TXM6IGFkZEppdHRlcihyYXdEZWxheSksXG4gICAgICByZWFzb246ICdDb25uZWN0aW9uIG9yIHRpbWVvdXQgZXJyb3InLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4geyBzaG91bGRSZXRyeTogZmFsc2UsIGRlbGF5TXM6IDAsIHJlYXNvbjogJ01heCByZXRyaWVzIGV4Y2VlZGVkJyB9O1xufVxuIl19
@@ -1,10 +1,15 @@
1
1
  import { type LockRedis } from './leader-lock.js';
2
- /** Optional cross-pod single-runner lock for a scheduler's cycle. The redis
3
- * client is resolved per cycle. */
2
+ /**
3
+ * Optional cross-pod single-runner lock for a scheduler's cycle. Without
4
+ * `redis` the scheduler uses the process's shared env-configured lock client
5
+ * (taken on `start`, released on `stop`); when Redis isn't configured the cycle
6
+ * runs on every pod, so the work it wraps must stay safe to run concurrently.
7
+ * A supplied `redis` factory is resolved per cycle (e.g. a BullMQ connection).
8
+ */
4
9
  export interface SchedulerLock {
5
- redis: () => LockRedis;
6
10
  key: string;
7
11
  ttlMs: number;
12
+ redis?: () => LockRedis;
8
13
  }
9
14
  export interface SchedulerOptions {
10
15
  /** Log label (also the logger name). */
@@ -1,6 +1,6 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
- import { withLeaderLock } from './leader-lock.js';
3
+ import { acquireSharedEnvLock, releaseSharedEnvLock, withLeaderLock } from './leader-lock.js';
4
4
  import { createLogger } from '../utils/logger.js';
5
5
  import { errorMessage } from '../utils/response.js';
6
6
  /**
@@ -18,6 +18,9 @@ export function createScheduler(opts) {
18
18
  let startup = null;
19
19
  let stopped = false;
20
20
  let running = false;
21
+ /** The shared env client this scheduler holds a reference on (own-client locks don't). */
22
+ let envLock = null;
23
+ let holdsEnvLock = false;
21
24
  const cycle = async () => {
22
25
  // Same-pod re-entrancy guard: setInterval doesn't await the async cycle, so
23
26
  // a cycle slower than intervalMs would otherwise overlap ITSELF on this pod
@@ -30,8 +33,8 @@ export function createScheduler(opts) {
30
33
  }
31
34
  running = true;
32
35
  try {
33
- if (opts.lock) {
34
- const redis = opts.lock.redis();
36
+ const redis = opts.lock ? (opts.lock.redis ? opts.lock.redis() : envLock) : null;
37
+ if (opts.lock && redis) {
35
38
  const ran = await withLeaderLock(redis, opts.lock.key, opts.lock.ttlMs, opts.run);
36
39
  if (!ran)
37
40
  log.debug('Cycle skipped — another pod holds the lock');
@@ -60,6 +63,10 @@ export function createScheduler(opts) {
60
63
  if (interval || startup)
61
64
  return;
62
65
  stopped = false;
66
+ if (opts.lock && !opts.lock.redis && !holdsEnvLock) {
67
+ envLock = acquireSharedEnvLock();
68
+ holdsEnvLock = true;
69
+ }
63
70
  if (opts.startupDelayMs && opts.startupDelayMs > 0) {
64
71
  startup = setTimeout(() => { startup = null; begin(); }, opts.startupDelayMs);
65
72
  startup.unref();
@@ -67,7 +74,7 @@ export function createScheduler(opts) {
67
74
  else {
68
75
  begin();
69
76
  }
70
- log.info('Scheduler started', { intervalMs: opts.intervalMs, locked: !!opts.lock });
77
+ log.info('Scheduler started', { intervalMs: opts.intervalMs, locked: !!opts.lock && (!!opts.lock.redis || !!envLock) });
71
78
  },
72
79
  stop() {
73
80
  stopped = true;
@@ -79,8 +86,13 @@ export function createScheduler(opts) {
79
86
  clearInterval(interval);
80
87
  interval = null;
81
88
  }
89
+ if (holdsEnvLock) {
90
+ holdsEnvLock = false;
91
+ envLock = null;
92
+ void releaseSharedEnvLock();
93
+ }
82
94
  log.info('Scheduler stopped');
83
95
  },
84
96
  };
85
97
  }
86
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL3NjaGVkdWxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxjQUFjLEVBQWtCLE1BQU0sa0JBQWtCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQWtDcEQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLElBQXNCO0lBQ3BELE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEMsSUFBSSxRQUFRLEdBQTBDLElBQUksQ0FBQztJQUMzRCxJQUFJLE9BQU8sR0FBeUMsSUFBSSxDQUFDO0lBQ3pELElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNwQixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFFcEIsTUFBTSxLQUFLLEdBQUcsS0FBSyxJQUFtQixFQUFFO1FBQ3RDLDRFQUE0RTtRQUM1RSw0RUFBNEU7UUFDNUUsNkVBQTZFO1FBQzdFLDhFQUE4RTtRQUM5RSxxQkFBcUI7UUFDckIsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLEdBQUcsQ0FBQyxLQUFLLENBQUMscUVBQXFFLENBQUMsQ0FBQztZQUNqRixPQUFPO1FBQ1QsQ0FBQztRQUNELE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDZixJQUFJLENBQUM7WUFDSCxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDZCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNoQyxNQUFNLEdBQUcsR0FBRyxNQUFNLGNBQWMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNsRixJQUFJLENBQUMsR0FBRztvQkFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7WUFDcEUsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ25CLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLEdBQUcsQ0FBQyxLQUFLLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwRSxDQUFDO2dCQUFTLENBQUM7WUFDVCxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRixNQUFNLEtBQUssR0FBRyxHQUFTLEVBQUU7UUFDdkIsSUFBSSxPQUFPO1lBQUUsT0FBTyxDQUFDLHlDQUF5QztRQUM5RCxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssS0FBSztZQUFFLEtBQUssS0FBSyxFQUFFLENBQUM7UUFDNUMsUUFBUSxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEtBQUssRUFBRSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM1RCxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDbkIsQ0FBQyxDQUFDO0lBRUYsT0FBTztRQUNMLEtBQUs7WUFDSCxJQUFJLFFBQVEsSUFBSSxPQUFPO2dCQUFFLE9BQU87WUFDaEMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNoQixJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDbkQsT0FBTyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUM5RSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLEtBQUssRUFBRSxDQUFDO1lBQ1YsQ0FBQztZQUNELEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3RGLENBQUM7UUFDRCxJQUFJO1lBQ0YsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNmLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFBQyxDQUFDO1lBQ3ZELElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFBQyxDQUFDO1lBQzNELEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNoQyxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgd2l0aExlYWRlckxvY2ssIHR5cGUgTG9ja1JlZGlzIH0gZnJvbSAnLi9sZWFkZXItbG9jay5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UuanMnO1xuXG4vKiogT3B0aW9uYWwgY3Jvc3MtcG9kIHNpbmdsZS1ydW5uZXIgbG9jayBmb3IgYSBzY2hlZHVsZXIncyBjeWNsZS4gVGhlIHJlZGlzXG4gKiAgY2xpZW50IGlzIHJlc29sdmVkIHBlciBjeWNsZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZWR1bGVyTG9jayB7XG4gIHJlZGlzOiAoKSA9PiBMb2NrUmVkaXM7XG4gIGtleTogc3RyaW5nO1xuICB0dGxNczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVkdWxlck9wdGlvbnMge1xuICAvKiogTG9nIGxhYmVsIChhbHNvIHRoZSBsb2dnZXIgbmFtZSkuICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIEludGVydmFsIGJldHdlZW4gY3ljbGVzIChtcykuICovXG4gIGludGVydmFsTXM6IG51bWJlcjtcbiAgLyoqIFRoZSB3b3JrIHRvIHJ1biBlYWNoIGN5Y2xlLiBFcnJvcnMgYXJlIGNhdWdodCArIGxvZ2dlZCwgbmV2ZXIgdGhyb3duLiAqL1xuICBydW46ICgpID0+IFByb21pc2U8dm9pZD47XG4gIC8qKiBSdW4gYSBjeWNsZSBpbW1lZGlhdGVseSB3aGVuIHN0YXJ0ZWQuIERlZmF1bHQgdHJ1ZS4gKi9cbiAgcnVuT25TdGFydD86IGJvb2xlYW47XG4gIC8qKiBEZWxheSBiZWZvcmUgdGhlIGZpcnN0IGN5Y2xlIChhbmQgYmVmb3JlIHRoZSBpbnRlcnZhbCBiZWdpbnMpLCBtcy5cbiAgICogIERlZmF1bHQgMC4gTGV0cyBhIHNlcnZpY2Ugd2FpdCBmb3IgZGVwZW5kZW5jaWVzIHRvIGNvbWUgdXAuICovXG4gIHN0YXJ0dXBEZWxheU1zPzogbnVtYmVyO1xuICAvKiogV2hlbiBzZXQsIGVhY2ggY3ljbGUgcnVucyBvbmx5IG9uIHRoZSBwb2QgdGhhdCB3aW5zIHRoaXMgbG9jayDigJQgc28gd2l0aFxuICAgKiAgbXVsdGlwbGUgcmVwbGljYXMgb25seSBvbmUgcnVucyBwZXIgd2luZG93LiAqL1xuICBsb2NrPzogU2NoZWR1bGVyTG9jaztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY2hlZHVsZXIge1xuICAvKiogU3RhcnQgdGhlIHRpbWVyLiBJZGVtcG90ZW50IOKAlCByZXBlYXRlZCBjYWxscyBhcmUgbm8tb3BzLiAqL1xuICBzdGFydCgpOiB2b2lkO1xuICAvKiogU3RvcCB0aGUgdGltZXIgKGFuZCBjYW5jZWwgYSBwZW5kaW5nIHN0YXJ0dXAgZGVsYXkpLiBTYWZlIGJlZm9yZSBzdGFydC4gKi9cbiAgc3RvcCgpOiB2b2lkO1xufVxuXG4vKipcbiAqIEEgcGVyaW9kaWMgYmFja2dyb3VuZCBqb2I6IGEgc2luZ2xlIHVucmVmJ2QgYHNldEludGVydmFsYCB3aXRoIHN0YXJ0LW9uY2VcbiAqIHNlbWFudGljcywgZXJyb3IgaXNvbGF0aW9uIChhIHRocm93aW5nIGN5Y2xlIGlzIGxvZ2dlZCwgbmV2ZXIgY3Jhc2hlcyB0aGVcbiAqIGxvb3ApLCBhbiBvcHRpb25hbCBzdGFydHVwIGRlbGF5LCBhbmQgYW4gb3B0aW9uYWwgY3Jvc3MtcG9kIGxlYWRlciBsb2NrLlxuICpcbiAqIFJlcGxhY2VzIHRoZSBoYW5kLXJvbGxlZCB0aW1lci9gdW5yZWZgL2BjYXRjaGAvc3RhcnQtc3RvcCBib2lsZXJwbGF0ZSB0aGF0XG4gKiBlYWNoIHNjaGVkdWxlciAoc2NhbiwgZGlnZXN0LCByZWdpc3RyeSBHQywgYmlsbGluZyBsaWZlY3ljbGUpIHJlcGVhdGVkLCBhbmRcbiAqIG1ha2VzIHRoZSBsZWFkZXIgbG9jayBhdmFpbGFibGUgdG8gYWxsIG9mIHRoZW0gdW5pZm9ybWx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2NoZWR1bGVyKG9wdHM6IFNjaGVkdWxlck9wdGlvbnMpOiBTY2hlZHVsZXIge1xuICBjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIob3B0cy5uYW1lKTtcbiAgbGV0IGludGVydmFsOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcbiAgbGV0IHN0YXJ0dXA6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIGxldCBzdG9wcGVkID0gZmFsc2U7XG4gIGxldCBydW5uaW5nID0gZmFsc2U7XG5cbiAgY29uc3QgY3ljbGUgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgLy8gU2FtZS1wb2QgcmUtZW50cmFuY3kgZ3VhcmQ6IHNldEludGVydmFsIGRvZXNuJ3QgYXdhaXQgdGhlIGFzeW5jIGN5Y2xlLCBzb1xuICAgIC8vIGEgY3ljbGUgc2xvd2VyIHRoYW4gaW50ZXJ2YWxNcyB3b3VsZCBvdGhlcndpc2Ugb3ZlcmxhcCBJVFNFTEYgb24gdGhpcyBwb2RcbiAgICAvLyAoZG91YmxlLXByb2Nlc3NpbmcsIGR1cGxpY2F0ZSBzaWRlIGVmZmVjdHMpLiBUaGUgb3B0aW9uYWwgbGVhZGVyIGxvY2sgb25seVxuICAgIC8vIGd1YXJkcyBDUk9TUy1wb2Qgb3ZlcmxhcDsgdGhpcyBndWFyZHMgc2FtZS1wb2QuIEEgc2tpcHBlZCB0aWNrIGp1c3QgcnVucyBvblxuICAgIC8vIHRoZSBuZXh0IGludGVydmFsLlxuICAgIGlmIChydW5uaW5nKSB7XG4gICAgICBsb2cuZGVidWcoJ0N5Y2xlIHNraXBwZWQg4oCUIHByZXZpb3VzIGN5Y2xlIHN0aWxsIHJ1bm5pbmcgKHNhbWUtcG9kIHJlLWVudHJhbmN5KScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBydW5uaW5nID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgaWYgKG9wdHMubG9jaykge1xuICAgICAgICBjb25zdCByZWRpcyA9IG9wdHMubG9jay5yZWRpcygpO1xuICAgICAgICBjb25zdCByYW4gPSBhd2FpdCB3aXRoTGVhZGVyTG9jayhyZWRpcywgb3B0cy5sb2NrLmtleSwgb3B0cy5sb2NrLnR0bE1zLCBvcHRzLnJ1bik7XG4gICAgICAgIGlmICghcmFuKSBsb2cuZGVidWcoJ0N5Y2xlIHNraXBwZWQg4oCUIGFub3RoZXIgcG9kIGhvbGRzIHRoZSBsb2NrJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBvcHRzLnJ1bigpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLmVycm9yKCdTY2hlZHVsZXIgY3ljbGUgZmFpbGVkJywgeyBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgYmVnaW4gPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHN0b3BwZWQpIHJldHVybjsgLy8gc3RvcCgpIGNhbGxlZCBkdXJpbmcgdGhlIHN0YXJ0dXAgZGVsYXlcbiAgICBpZiAob3B0cy5ydW5PblN0YXJ0ICE9PSBmYWxzZSkgdm9pZCBjeWNsZSgpO1xuICAgIGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gdm9pZCBjeWNsZSgpLCBvcHRzLmludGVydmFsTXMpO1xuICAgIGludGVydmFsLnVucmVmKCk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydCgpOiB2b2lkIHtcbiAgICAgIGlmIChpbnRlcnZhbCB8fCBzdGFydHVwKSByZXR1cm47XG4gICAgICBzdG9wcGVkID0gZmFsc2U7XG4gICAgICBpZiAob3B0cy5zdGFydHVwRGVsYXlNcyAmJiBvcHRzLnN0YXJ0dXBEZWxheU1zID4gMCkge1xuICAgICAgICBzdGFydHVwID0gc2V0VGltZW91dCgoKSA9PiB7IHN0YXJ0dXAgPSBudWxsOyBiZWdpbigpOyB9LCBvcHRzLnN0YXJ0dXBEZWxheU1zKTtcbiAgICAgICAgc3RhcnR1cC51bnJlZigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmVnaW4oKTtcbiAgICAgIH1cbiAgICAgIGxvZy5pbmZvKCdTY2hlZHVsZXIgc3RhcnRlZCcsIHsgaW50ZXJ2YWxNczogb3B0cy5pbnRlcnZhbE1zLCBsb2NrZWQ6ICEhb3B0cy5sb2NrIH0pO1xuICAgIH0sXG4gICAgc3RvcCgpOiB2b2lkIHtcbiAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgaWYgKHN0YXJ0dXApIHsgY2xlYXJUaW1lb3V0KHN0YXJ0dXApOyBzdGFydHVwID0gbnVsbDsgfVxuICAgICAgaWYgKGludGVydmFsKSB7IGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpOyBpbnRlcnZhbCA9IG51bGw7IH1cbiAgICAgIGxvZy5pbmZvKCdTY2hlZHVsZXIgc3RvcHBlZCcpO1xuICAgIH0sXG4gIH07XG59XG4iXX0=
98
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL3NjaGVkdWxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQWtCLE1BQU0sa0JBQWtCLENBQUM7QUFDOUcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQXVDcEQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLElBQXNCO0lBQ3BELE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEMsSUFBSSxRQUFRLEdBQTBDLElBQUksQ0FBQztJQUMzRCxJQUFJLE9BQU8sR0FBeUMsSUFBSSxDQUFDO0lBQ3pELElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNwQixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDcEIsMEZBQTBGO0lBQzFGLElBQUksT0FBTyxHQUFxQixJQUFJLENBQUM7SUFDckMsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBRXpCLE1BQU0sS0FBSyxHQUFHLEtBQUssSUFBbUIsRUFBRTtRQUN0Qyw0RUFBNEU7UUFDNUUsNEVBQTRFO1FBQzVFLDZFQUE2RTtRQUM3RSw4RUFBOEU7UUFDOUUscUJBQXFCO1FBQ3JCLElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixHQUFHLENBQUMsS0FBSyxDQUFDLHFFQUFxRSxDQUFDLENBQUM7WUFDakYsT0FBTztRQUNULENBQUM7UUFDRCxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ2YsSUFBSSxDQUFDO1lBQ0gsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENB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SSxDQUFDO1lBQUMsQ0FBQztZQUMzRCxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNqQixZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUNyQixPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUNmLEtBQUssb0JBQW9CLEVBQUUsQ0FBQztZQUM5QixDQUFDO1lBQ0QsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBhY3F1aXJlU2hhcmVkRW52TG9jaywgcmVsZWFzZVNoYXJlZEVudkxvY2ssIHdpdGhMZWFkZXJMb2NrLCB0eXBlIExvY2tSZWRpcyB9IGZyb20gJy4vbGVhZGVyLWxvY2suanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVycm9yTWVzc2FnZSB9IGZyb20gJy4uL3V0aWxzL3Jlc3BvbnNlLmpzJztcblxuLyoqXG4gKiBPcHRpb25hbCBjcm9zcy1wb2Qgc2luZ2xlLXJ1bm5lciBsb2NrIGZvciBhIHNjaGVkdWxlcidzIGN5Y2xlLiBXaXRob3V0XG4gKiBgcmVkaXNgIHRoZSBzY2hlZHVsZXIgdXNlcyB0aGUgcHJvY2VzcydzIHNoYXJlZCBlbnYtY29uZmlndXJlZCBsb2NrIGNsaWVudFxuICogKHRha2VuIG9uIGBzdGFydGAsIHJlbGVhc2VkIG9uIGBzdG9wYCk7IHdoZW4gUmVkaXMgaXNuJ3QgY29uZmlndXJlZCB0aGUgY3ljbGVcbiAqIHJ1bnMgb24gZXZlcnkgcG9kLCBzbyB0aGUgd29yayBpdCB3cmFwcyBtdXN0IHN0YXkgc2FmZSB0byBydW4gY29uY3VycmVudGx5LlxuICogQSBzdXBwbGllZCBgcmVkaXNgIGZhY3RvcnkgaXMgcmVzb2x2ZWQgcGVyIGN5Y2xlIChlLmcuIGEgQnVsbE1RIGNvbm5lY3Rpb24pLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVkdWxlckxvY2sge1xuICBrZXk6IHN0cmluZztcbiAgdHRsTXM6IG51bWJlcjtcbiAgcmVkaXM/OiAoKSA9PiBMb2NrUmVkaXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZWR1bGVyT3B0aW9ucyB7XG4gIC8qKiBMb2cgbGFiZWwgKGFsc28gdGhlIGxvZ2dlciBuYW1lKS4gKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKiogSW50ZXJ2YWwgYmV0d2VlbiBjeWNsZXMgKG1zKS4gKi9cbiAgaW50ZXJ2YWxNczogbnVtYmVyO1xuICAvKiogVGhlIHdvcmsgdG8gcnVuIGVhY2ggY3ljbGUuIEVycm9ycyBhcmUgY2F1Z2h0ICsgbG9nZ2VkLCBuZXZlciB0aHJvd24uICovXG4gIHJ1bjogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFJ1biBhIGN5Y2xlIGltbWVkaWF0ZWx5IHdoZW4gc3RhcnRlZC4gRGVmYXVsdCB0cnVlLiAqL1xuICBydW5PblN0YXJ0PzogYm9vbGVhbjtcbiAgLyoqIERlbGF5IGJlZm9yZSB0aGUgZmlyc3QgY3ljbGUgKGFuZCBiZWZvcmUgdGhlIGludGVydmFsIGJlZ2lucyksIG1zLlxuICAgKiAgRGVmYXVsdCAwLiBMZXRzIGEgc2VydmljZSB3YWl0IGZvciBkZXBlbmRlbmNpZXMgdG8gY29tZSB1cC4gKi9cbiAgc3RhcnR1cERlbGF5TXM/OiBudW1iZXI7XG4gIC8qKiBXaGVuIHNldCwgZWFjaCBjeWNsZSBydW5zIG9ubHkgb24gdGhlIHBvZCB0aGF0IHdpbnMgdGhpcyBsb2NrIOKAlCBzbyB3aXRoXG4gICAqICBtdWx0aXBsZSByZXBsaWNhcyBvbmx5IG9uZSBydW5zIHBlciB3aW5kb3cuICovXG4gIGxvY2s/OiBTY2hlZHVsZXJMb2NrO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVkdWxlciB7XG4gIC8qKiBTdGFydCB0aGUgdGltZXIuIElkZW1wb3RlbnQg4oCUIHJlcGVhdGVkIGNhbGxzIGFyZSBuby1vcHMuICovXG4gIHN0YXJ0KCk6IHZvaWQ7XG4gIC8qKiBTdG9wIHRoZSB0aW1lciAoYW5kIGNhbmNlbCBhIHBlbmRpbmcgc3RhcnR1cCBkZWxheSkuIFNhZmUgYmVmb3JlIHN0YXJ0LiAqL1xuICBzdG9wKCk6IHZvaWQ7XG59XG5cbi8qKlxuICogQSBwZXJpb2RpYyBiYWNrZ3JvdW5kIGpvYjogYSBzaW5nbGUgdW5yZWYnZCBgc2V0SW50ZXJ2YWxgIHdpdGggc3RhcnQtb25jZVxuICogc2VtYW50aWNzLCBlcnJvciBpc29sYXRpb24gKGEgdGhyb3dpbmcgY3ljbGUgaXMgbG9nZ2VkLCBuZXZlciBjcmFzaGVzIHRoZVxuICogbG9vcCksIGFuIG9wdGlvbmFsIHN0YXJ0dXAgZGVsYXksIGFuZCBhbiBvcHRpb25hbCBjcm9zcy1wb2QgbGVhZGVyIGxvY2suXG4gKlxuICogUmVwbGFjZXMgdGhlIGhhbmQtcm9sbGVkIHRpbWVyL2B1bnJlZmAvYGNhdGNoYC9zdGFydC1zdG9wIGJvaWxlcnBsYXRlIHRoYXRcbiAqIGVhY2ggc2NoZWR1bGVyIChzY2FuLCBkaWdlc3QsIHJlZ2lzdHJ5IEdDLCBiaWxsaW5nIGxpZmVjeWNsZSkgcmVwZWF0ZWQsIGFuZFxuICogbWFrZXMgdGhlIGxlYWRlciBsb2NrIGF2YWlsYWJsZSB0byBhbGwgb2YgdGhlbSB1bmlmb3JtbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTY2hlZHVsZXIob3B0czogU2NoZWR1bGVyT3B0aW9ucyk6IFNjaGVkdWxlciB7XG4gIGNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcihvcHRzLm5hbWUpO1xuICBsZXQgaW50ZXJ2YWw6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IG51bGwgPSBudWxsO1xuICBsZXQgc3RhcnR1cDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgbGV0IHN0b3BwZWQgPSBmYWxzZTtcbiAgbGV0IHJ1bm5pbmcgPSBmYWxzZTtcbiAgLyoqIFRoZSBzaGFyZWQgZW52IGNsaWVudCB0aGlzIHNjaGVkdWxlciBob2xkcyBhIHJlZmVyZW5jZSBvbiAob3duLWNsaWVudCBsb2NrcyBkb24ndCkuICovXG4gIGxldCBlbnZMb2NrOiBMb2NrUmVkaXMgfCBudWxsID0gbnVsbDtcbiAgbGV0IGhvbGRzRW52TG9jayA9IGZhbHNlO1xuXG4gIGNvbnN0IGN5Y2xlID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIC8vIFNhbWUtcG9kIHJlLWVudHJhbmN5IGd1YXJkOiBzZXRJbnRlcnZhbCBkb2Vzbid0IGF3YWl0IHRoZSBhc3luYyBjeWNsZSwgc29cbiAgICAvLyBhIGN5Y2xlIHNsb3dlciB0aGFuIGludGVydmFsTXMgd291bGQgb3RoZXJ3aXNlIG92ZXJsYXAgSVRTRUxGIG9uIHRoaXMgcG9kXG4gICAgLy8gKGRvdWJsZS1wcm9jZXNzaW5nLCBkdXBsaWNhdGUgc2lkZSBlZmZlY3RzKS4gVGhlIG9wdGlvbmFsIGxlYWRlciBsb2NrIG9ubHlcbiAgICAvLyBndWFyZHMgQ1JPU1MtcG9kIG92ZXJsYXA7IHRoaXMgZ3VhcmRzIHNhbWUtcG9kLiBBIHNraXBwZWQgdGljayBqdXN0IHJ1bnMgb25cbiAgICAvLyB0aGUgbmV4dCBpbnRlcnZhbC5cbiAgICBpZiAocnVubmluZykge1xuICAgICAgbG9nLmRlYnVnKCdDeWNsZSBza2lwcGVkIOKAlCBwcmV2aW91cyBjeWNsZSBzdGlsbCBydW5uaW5nIChzYW1lLXBvZCByZS1lbnRyYW5jeSknKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcnVubmluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlZGlzID0gb3B0cy5sb2NrID8gKG9wdHMubG9jay5yZWRpcyA/IG9wdHMubG9jay5yZWRpcygpIDogZW52TG9jaykgOiBudWxsO1xuICAgICAgaWYgKG9wdHMubG9jayAmJiByZWRpcykge1xuICAgICAgICBjb25zdCByYW4gPSBhd2FpdCB3aXRoTGVhZGVyTG9jayhyZWRpcywgb3B0cy5sb2NrLmtleSwgb3B0cy5sb2NrLnR0bE1zLCBvcHRzLnJ1bik7XG4gICAgICAgIGlmICghcmFuKSBsb2cuZGVidWcoJ0N5Y2xlIHNraXBwZWQg4oCUIGFub3RoZXIgcG9kIGhvbGRzIHRoZSBsb2NrJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBvcHRzLnJ1bigpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLmVycm9yKCdTY2hlZHVsZXIgY3ljbGUgZmFpbGVkJywgeyBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgYmVnaW4gPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHN0b3BwZWQpIHJldHVybjsgLy8gc3RvcCgpIGNhbGxlZCBkdXJpbmcgdGhlIHN0YXJ0dXAgZGVsYXlcbiAgICBpZiAob3B0cy5ydW5PblN0YXJ0ICE9PSBmYWxzZSkgdm9pZCBjeWNsZSgpO1xuICAgIGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gdm9pZCBjeWNsZSgpLCBvcHRzLmludGVydmFsTXMpO1xuICAgIGludGVydmFsLnVucmVmKCk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydCgpOiB2b2lkIHtcbiAgICAgIGlmIChpbnRlcnZhbCB8fCBzdGFydHVwKSByZXR1cm47XG4gICAgICBzdG9wcGVkID0gZmFsc2U7XG4gICAgICBpZiAob3B0cy5sb2NrICYmICFvcHRzLmxvY2sucmVkaXMgJiYgIWhvbGRzRW52TG9jaykge1xuICAgICAgICBlbnZMb2NrID0gYWNxdWlyZVNoYXJlZEVudkxvY2soKTtcbiAgICAgICAgaG9sZHNFbnZMb2NrID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRzLnN0YXJ0dXBEZWxheU1zICYmIG9wdHMuc3RhcnR1cERlbGF5TXMgPiAwKSB7XG4gICAgICAgIHN0YXJ0dXAgPSBzZXRUaW1lb3V0KCgpID0+IHsgc3RhcnR1cCA9IG51bGw7IGJlZ2luKCk7IH0sIG9wdHMuc3RhcnR1cERlbGF5TXMpO1xuICAgICAgICBzdGFydHVwLnVucmVmKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiZWdpbigpO1xuICAgICAgfVxuICAgICAgbG9nLmluZm8oJ1NjaGVkdWxlciBzdGFydGVkJywgeyBpbnRlcnZhbE1zOiBvcHRzLmludGVydmFsTXMsIGxvY2tlZDogISFvcHRzLmxvY2sgJiYgKCEhb3B0cy5sb2NrLnJlZGlzIHx8ICEhZW52TG9jaykgfSk7XG4gICAgfSxcbiAgICBzdG9wKCk6IHZvaWQge1xuICAgICAgc3RvcHBlZCA9IHRydWU7XG4gICAgICBpZiAoc3RhcnR1cCkgeyBjbGVhclRpbWVvdXQoc3RhcnR1cCk7IHN0YXJ0dXAgPSBudWxsOyB9XG4gICAgICBpZiAoaW50ZXJ2YWwpIHsgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7IGludGVydmFsID0gbnVsbDsgfVxuICAgICAgaWYgKGhvbGRzRW52TG9jaykge1xuICAgICAgICBob2xkc0VudkxvY2sgPSBmYWxzZTtcbiAgICAgICAgZW52TG9jayA9IG51bGw7XG4gICAgICAgIHZvaWQgcmVsZWFzZVNoYXJlZEVudkxvY2soKTtcbiAgICAgIH1cbiAgICAgIGxvZy5pbmZvKCdTY2hlZHVsZXIgc3RvcHBlZCcpO1xuICAgIH0sXG4gIH07XG59XG4iXX0=
@@ -1,5 +1,4 @@
1
- import type { RemoteAuditClient } from './remote-audit-client.js';
2
- import { type TokenRevocationStore } from '../middleware/auth.js';
1
+ import { type TokenRevocationStore } from '../middleware/revocation.js';
3
2
  /** Per-service overrides for {@link wireServiceSecurity}. */
4
3
  export interface ServiceSecurityOptions {
5
4
  /**
@@ -12,8 +11,11 @@ export interface ServiceSecurityOptions {
12
11
  tokenRevocationStore?: TokenRevocationStore;
13
12
  }
14
13
  /**
15
- * Wire the two boot-security concerns every stateless service sets up
16
- * identically at startup:
14
+ * Wire the boot-security concerns every stateless service sets up identically
15
+ * at startup:
16
+ * 0. bind this process's service identity for `recordAudit` — the ONE place a
17
+ * service names itself for the central audit trail (before this runs,
18
+ * `recordAudit` throws "audit not initialised");
17
19
  * 1. forward denied (non-GET) authorizations to the shared `authz.denied`
18
20
  * audit sink (`wireAuthzDenialAuditor`);
19
21
  * 2. register the env-Redis token-revocation reader (fail-open) so
@@ -24,15 +26,14 @@ export interface ServiceSecurityOptions {
24
26
  *
25
27
  * Collapses the copy-pasted lines in each service's `index.ts` into one call.
26
28
  *
27
- * EVERY stateless service goes through here, plugin included. Plugin used to
28
- * hand-roll these three calls because it needs a different revocation store
29
- * (its pooled BullMQ Redis connection, not the env-Redis one) — which meant the
30
- * next concern added here would have silently skipped it. That override is now
31
- * a parameter, so opting out of the env-Redis store no longer means opting out
32
- * of the wiring.
29
+ * EVERY stateless service goes through here, plugin included. Plugin needs a
30
+ * different revocation store (its pooled BullMQ Redis connection, not the
31
+ * env-Redis one); that override is a parameter, so opting out of the env-Redis
32
+ * store never means opting out of the wiring — a hand-rolled copy would
33
+ * silently skip the next concern added here.
33
34
  *
34
- * @param serviceName short service name minted into the `authz.denied` records
35
- * @param getAuditClient lazy accessor for the service's RemoteAuditClient
35
+ * @param serviceName short service name every `recordAudit` event (and the
36
+ * `authz.denied` records) is attributed to
36
37
  * @param opts per-service overrides — see {@link ServiceSecurityOptions}
37
38
  */
38
- export declare function wireServiceSecurity(serviceName: string, getAuditClient: () => RemoteAuditClient, opts?: ServiceSecurityOptions): void;
39
+ export declare function wireServiceSecurity(serviceName: string, opts?: ServiceSecurityOptions): void;
@@ -1,12 +1,15 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  import { setApiKeyExchangeServiceName } from './api-key-exchange.js';
4
- import { wireAuthzDenialAuditor } from './remote-audit-client.js';
4
+ import { bindAuditService, getBoundAuditClient, wireAuthzDenialAuditor } from './remote-audit-client.js';
5
5
  import { createEnvRedisTokenRevocationStore } from './token-revocation.js';
6
- import { setTokenRevocationStore } from '../middleware/auth.js';
6
+ import { setTokenRevocationStore } from '../middleware/revocation.js';
7
7
  /**
8
- * Wire the two boot-security concerns every stateless service sets up
9
- * identically at startup:
8
+ * Wire the boot-security concerns every stateless service sets up identically
9
+ * at startup:
10
+ * 0. bind this process's service identity for `recordAudit` — the ONE place a
11
+ * service names itself for the central audit trail (before this runs,
12
+ * `recordAudit` throws "audit not initialised");
10
13
  * 1. forward denied (non-GET) authorizations to the shared `authz.denied`
11
14
  * audit sink (`wireAuthzDenialAuditor`);
12
15
  * 2. register the env-Redis token-revocation reader (fail-open) so
@@ -17,20 +20,20 @@ import { setTokenRevocationStore } from '../middleware/auth.js';
17
20
  *
18
21
  * Collapses the copy-pasted lines in each service's `index.ts` into one call.
19
22
  *
20
- * EVERY stateless service goes through here, plugin included. Plugin used to
21
- * hand-roll these three calls because it needs a different revocation store
22
- * (its pooled BullMQ Redis connection, not the env-Redis one) — which meant the
23
- * next concern added here would have silently skipped it. That override is now
24
- * a parameter, so opting out of the env-Redis store no longer means opting out
25
- * of the wiring.
23
+ * EVERY stateless service goes through here, plugin included. Plugin needs a
24
+ * different revocation store (its pooled BullMQ Redis connection, not the
25
+ * env-Redis one); that override is a parameter, so opting out of the env-Redis
26
+ * store never means opting out of the wiring — a hand-rolled copy would
27
+ * silently skip the next concern added here.
26
28
  *
27
- * @param serviceName short service name minted into the `authz.denied` records
28
- * @param getAuditClient lazy accessor for the service's RemoteAuditClient
29
+ * @param serviceName short service name every `recordAudit` event (and the
30
+ * `authz.denied` records) is attributed to
29
31
  * @param opts per-service overrides — see {@link ServiceSecurityOptions}
30
32
  */
31
- export function wireServiceSecurity(serviceName, getAuditClient, opts = {}) {
32
- wireAuthzDenialAuditor(serviceName, getAuditClient);
33
+ export function wireServiceSecurity(serviceName, opts = {}) {
34
+ bindAuditService(serviceName);
35
+ wireAuthzDenialAuditor(serviceName, getBoundAuditClient);
33
36
  setTokenRevocationStore(opts.tokenRevocationStore ?? createEnvRedisTokenRevocationStore());
34
37
  setApiKeyExchangeServiceName(serviceName);
35
38
  }
36
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1ib290LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL3NlcnZpY2UtYm9vdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXJFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzNFLE9BQU8sRUFBRSx1QkFBdUIsRUFBNkIsTUFBTSx1QkFBdUIsQ0FBQztBQWMzRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQ2pDLFdBQW1CLEVBQ25CLGNBQXVDLEVBQ3ZDLElBQUksR0FBMkIsRUFBRTtJQUVqQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDcEQsdUJBQXVCLENBQUMsSUFBSSxDQUFDLG9CQUFvQixJQUFJLGtDQUFrQyxFQUFFLENBQUMsQ0FBQztJQUMzRiw0QkFBNEIsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUM1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IHNldEFwaUtleUV4Y2hhbmdlU2VydmljZU5hbWUgfSBmcm9tICcuL2FwaS1rZXktZXhjaGFuZ2UuanMnO1xuaW1wb3J0IHR5cGUgeyBSZW1vdGVBdWRpdENsaWVudCB9IGZyb20gJy4vcmVtb3RlLWF1ZGl0LWNsaWVudC5qcyc7XG5pbXBvcnQgeyB3aXJlQXV0aHpEZW5pYWxBdWRpdG9yIH0gZnJvbSAnLi9yZW1vdGUtYXVkaXQtY2xpZW50LmpzJztcbmltcG9ydCB7IGNyZWF0ZUVudlJlZGlzVG9rZW5SZXZvY2F0aW9uU3RvcmUgfSBmcm9tICcuL3Rva2VuLXJldm9jYXRpb24uanMnO1xuaW1wb3J0IHsgc2V0VG9rZW5SZXZvY2F0aW9uU3RvcmUsIHR5cGUgVG9rZW5SZXZvY2F0aW9uU3RvcmUgfSBmcm9tICcuLi9taWRkbGV3YXJlL2F1dGguanMnO1xuXG4vKiogUGVyLXNlcnZpY2Ugb3ZlcnJpZGVzIGZvciB7QGxpbmsgd2lyZVNlcnZpY2VTZWN1cml0eX0uICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VTZWN1cml0eU9wdGlvbnMge1xuICAvKipcbiAgICogVG9rZW4tcmV2b2NhdGlvbiByZWFkZXIgdG8gcmVnaXN0ZXIgaW5zdGVhZCBvZiB0aGUgZW52LVJlZGlzIG9uZS4gVGhlXG4gICAqIHBsdWdpbiBzZXJ2aWNlIHBhc3NlcyBhIHN0b3JlIGJ1aWx0IG9uIHRoZSBwb29sZWQgaW9yZWRpcyBjb25uZWN0aW9uIGl0c1xuICAgKiBCdWxsTVEgYnVpbGQgcXVldWUgYW5kIHJlYWRpbmVzcyBwcm9iZSBhbHJlYWR5IHNoYXJlLCBzbyB0aGUgcHJvY2VzcyBob2xkc1xuICAgKiBPTkUgUmVkaXMgY29ubmVjdGlvbiByYXRoZXIgdGhhbiB0d28uIEZhaWwtb3BlbiBlaXRoZXIgd2F5OiBhIG1pc3Mvb3V0YWdlXG4gICAqIHlpZWxkcyBudWxsIGFuZCBhdXRoIGRlZ3JhZGVzIHRvIG5hdHVyYWwgdG9rZW4gZXhwaXJ5LlxuICAgKi9cbiAgdG9rZW5SZXZvY2F0aW9uU3RvcmU/OiBUb2tlblJldm9jYXRpb25TdG9yZTtcbn1cblxuLyoqXG4gKiBXaXJlIHRoZSB0d28gYm9vdC1zZWN1cml0eSBjb25jZXJucyBldmVyeSBzdGF0ZWxlc3Mgc2VydmljZSBzZXRzIHVwXG4gKiBpZGVudGljYWxseSBhdCBzdGFydHVwOlxuICogICAxLiBmb3J3YXJkIGRlbmllZCAobm9uLUdFVCkgYXV0aG9yaXphdGlvbnMgdG8gdGhlIHNoYXJlZCBgYXV0aHouZGVuaWVkYFxuICogICAgICBhdWRpdCBzaW5rIChgd2lyZUF1dGh6RGVuaWFsQXVkaXRvcmApO1xuICogICAyLiByZWdpc3RlciB0aGUgZW52LVJlZGlzIHRva2VuLXJldm9jYXRpb24gcmVhZGVyIChmYWlsLW9wZW4pIHNvXG4gKiAgICAgIGByZXF1aXJlQXV0aGAgY2FuIHJlamVjdCBhIHRva2VuIGJlaGluZCB0aGUgcGxhdGZvcm0tcHVibGlzaGVkXG4gKiAgICAgIGB0b2tlblZlcnNpb25gIChgc2V0VG9rZW5SZXZvY2F0aW9uU3RvcmUoY3JlYXRlRW52UmVkaXNUb2tlblJldm9jYXRpb25TdG9yZSgpKWApO1xuICogICAzLiBuYW1lIHRoaXMgcHJvY2VzcyBpbiB0aGUgYWNjZXNzLWtleSBleGNoYW5nZSBjYWxsJ3Mgb3duIHNlcnZpY2UgdG9rZW4sIHNvXG4gKiAgICAgIHBsYXRmb3JtIGNhbiBhdHRyaWJ1dGUgKGFuZCByYXRlLWxpbWl0KSB0aGUgZXhjaGFuZ2VzIGl0IHBlcmZvcm1zLlxuICpcbiAqIENvbGxhcHNlcyB0aGUgY29weS1wYXN0ZWQgbGluZXMgaW4gZWFjaCBzZXJ2aWNlJ3MgYGluZGV4LnRzYCBpbnRvIG9uZSBjYWxsLlxuICpcbiAqIEVWRVJZIHN0YXRlbGVzcyBzZXJ2aWNlIGdvZXMgdGhyb3VnaCBoZXJlLCBwbHVnaW4gaW5jbHVkZWQuIFBsdWdpbiB1c2VkIHRvXG4gKiBoYW5kLXJvbGwgdGhlc2UgdGhyZWUgY2FsbHMgYmVjYXVzZSBpdCBuZWVkcyBhIGRpZmZlcmVudCByZXZvY2F0aW9uIHN0b3JlXG4gKiAoaXRzIHBvb2xlZCBCdWxsTVEgUmVkaXMgY29ubmVjdGlvbiwgbm90IHRoZSBlbnYtUmVkaXMgb25lKSDigJQgd2hpY2ggbWVhbnQgdGhlXG4gKiBuZXh0IGNvbmNlcm4gYWRkZWQgaGVyZSB3b3VsZCBoYXZlIHNpbGVudGx5IHNraXBwZWQgaXQuIFRoYXQgb3ZlcnJpZGUgaXMgbm93XG4gKiBhIHBhcmFtZXRlciwgc28gb3B0aW5nIG91dCBvZiB0aGUgZW52LVJlZGlzIHN0b3JlIG5vIGxvbmdlciBtZWFucyBvcHRpbmcgb3V0XG4gKiBvZiB0aGUgd2lyaW5nLlxuICpcbiAqIEBwYXJhbSBzZXJ2aWNlTmFtZSBzaG9ydCBzZXJ2aWNlIG5hbWUgbWludGVkIGludG8gdGhlIGBhdXRoei5kZW5pZWRgIHJlY29yZHNcbiAqIEBwYXJhbSBnZXRBdWRpdENsaWVudCBsYXp5IGFjY2Vzc29yIGZvciB0aGUgc2VydmljZSdzIFJlbW90ZUF1ZGl0Q2xpZW50XG4gKiBAcGFyYW0gb3B0cyBwZXItc2VydmljZSBvdmVycmlkZXMg4oCUIHNlZSB7QGxpbmsgU2VydmljZVNlY3VyaXR5T3B0aW9uc31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpcmVTZXJ2aWNlU2VjdXJpdHkoXG4gIHNlcnZpY2VOYW1lOiBzdHJpbmcsXG4gIGdldEF1ZGl0Q2xpZW50OiAoKSA9PiBSZW1vdGVBdWRpdENsaWVudCxcbiAgb3B0czogU2VydmljZVNlY3VyaXR5T3B0aW9ucyA9IHt9LFxuKTogdm9pZCB7XG4gIHdpcmVBdXRoekRlbmlhbEF1ZGl0b3Ioc2VydmljZU5hbWUsIGdldEF1ZGl0Q2xpZW50KTtcbiAgc2V0VG9rZW5SZXZvY2F0aW9uU3RvcmUob3B0cy50b2tlblJldm9jYXRpb25TdG9yZSA/PyBjcmVhdGVFbnZSZWRpc1Rva2VuUmV2b2NhdGlvblN0b3JlKCkpO1xuICBzZXRBcGlLZXlFeGNoYW5nZVNlcnZpY2VOYW1lKHNlcnZpY2VOYW1lKTtcbn1cbiJdfQ==
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1ib290LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL3NlcnZpY2UtYm9vdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxtQkFBbUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pHLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzNFLE9BQU8sRUFBRSx1QkFBdUIsRUFBNkIsTUFBTSw2QkFBNkIsQ0FBQztBQWNqRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsV0FBbUIsRUFDbkIsSUFBSSxHQUEyQixFQUFFO0lBRWpDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzlCLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3pELHVCQUF1QixDQUFDLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxrQ0FBa0MsRUFBRSxDQUFDLENBQUM7SUFDM0YsNEJBQTRCLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBzZXRBcGlLZXlFeGNoYW5nZVNlcnZpY2VOYW1lIH0gZnJvbSAnLi9hcGkta2V5LWV4Y2hhbmdlLmpzJztcbmltcG9ydCB7IGJpbmRBdWRpdFNlcnZpY2UsIGdldEJvdW5kQXVkaXRDbGllbnQsIHdpcmVBdXRoekRlbmlhbEF1ZGl0b3IgfSBmcm9tICcuL3JlbW90ZS1hdWRpdC1jbGllbnQuanMnO1xuaW1wb3J0IHsgY3JlYXRlRW52UmVkaXNUb2tlblJldm9jYXRpb25TdG9yZSB9IGZyb20gJy4vdG9rZW4tcmV2b2NhdGlvbi5qcyc7XG5pbXBvcnQgeyBzZXRUb2tlblJldm9jYXRpb25TdG9yZSwgdHlwZSBUb2tlblJldm9jYXRpb25TdG9yZSB9IGZyb20gJy4uL21pZGRsZXdhcmUvcmV2b2NhdGlvbi5qcyc7XG5cbi8qKiBQZXItc2VydmljZSBvdmVycmlkZXMgZm9yIHtAbGluayB3aXJlU2VydmljZVNlY3VyaXR5fS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZVNlY3VyaXR5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUb2tlbi1yZXZvY2F0aW9uIHJlYWRlciB0byByZWdpc3RlciBpbnN0ZWFkIG9mIHRoZSBlbnYtUmVkaXMgb25lLiBUaGVcbiAgICogcGx1Z2luIHNlcnZpY2UgcGFzc2VzIGEgc3RvcmUgYnVpbHQgb24gdGhlIHBvb2xlZCBpb3JlZGlzIGNvbm5lY3Rpb24gaXRzXG4gICAqIEJ1bGxNUSBidWlsZCBxdWV1ZSBhbmQgcmVhZGluZXNzIHByb2JlIGFscmVhZHkgc2hhcmUsIHNvIHRoZSBwcm9jZXNzIGhvbGRzXG4gICAqIE9ORSBSZWRpcyBjb25uZWN0aW9uIHJhdGhlciB0aGFuIHR3by4gRmFpbC1vcGVuIGVpdGhlciB3YXk6IGEgbWlzcy9vdXRhZ2VcbiAgICogeWllbGRzIG51bGwgYW5kIGF1dGggZGVncmFkZXMgdG8gbmF0dXJhbCB0b2tlbiBleHBpcnkuXG4gICAqL1xuICB0b2tlblJldm9jYXRpb25TdG9yZT86IFRva2VuUmV2b2NhdGlvblN0b3JlO1xufVxuXG4vKipcbiAqIFdpcmUgdGhlIGJvb3Qtc2VjdXJpdHkgY29uY2VybnMgZXZlcnkgc3RhdGVsZXNzIHNlcnZpY2Ugc2V0cyB1cCBpZGVudGljYWxseVxuICogYXQgc3RhcnR1cDpcbiAqICAgMC4gYmluZCB0aGlzIHByb2Nlc3MncyBzZXJ2aWNlIGlkZW50aXR5IGZvciBgcmVjb3JkQXVkaXRgIOKAlCB0aGUgT05FIHBsYWNlIGFcbiAqICAgICAgc2VydmljZSBuYW1lcyBpdHNlbGYgZm9yIHRoZSBjZW50cmFsIGF1ZGl0IHRyYWlsIChiZWZvcmUgdGhpcyBydW5zLFxuICogICAgICBgcmVjb3JkQXVkaXRgIHRocm93cyBcImF1ZGl0IG5vdCBpbml0aWFsaXNlZFwiKTtcbiAqICAgMS4gZm9yd2FyZCBkZW5pZWQgKG5vbi1HRVQpIGF1dGhvcml6YXRpb25zIHRvIHRoZSBzaGFyZWQgYGF1dGh6LmRlbmllZGBcbiAqICAgICAgYXVkaXQgc2luayAoYHdpcmVBdXRoekRlbmlhbEF1ZGl0b3JgKTtcbiAqICAgMi4gcmVnaXN0ZXIgdGhlIGVudi1SZWRpcyB0b2tlbi1yZXZvY2F0aW9uIHJlYWRlciAoZmFpbC1vcGVuKSBzb1xuICogICAgICBgcmVxdWlyZUF1dGhgIGNhbiByZWplY3QgYSB0b2tlbiBiZWhpbmQgdGhlIHBsYXRmb3JtLXB1Ymxpc2hlZFxuICogICAgICBgdG9rZW5WZXJzaW9uYCAoYHNldFRva2VuUmV2b2NhdGlvblN0b3JlKGNyZWF0ZUVudlJlZGlzVG9rZW5SZXZvY2F0aW9uU3RvcmUoKSlgKTtcbiAqICAgMy4gbmFtZSB0aGlzIHByb2Nlc3MgaW4gdGhlIGFjY2Vzcy1rZXkgZXhjaGFuZ2UgY2FsbCdzIG93biBzZXJ2aWNlIHRva2VuLCBzb1xuICogICAgICBwbGF0Zm9ybSBjYW4gYXR0cmlidXRlIChhbmQgcmF0ZS1saW1pdCkgdGhlIGV4Y2hhbmdlcyBpdCBwZXJmb3Jtcy5cbiAqXG4gKiBDb2xsYXBzZXMgdGhlIGNvcHktcGFzdGVkIGxpbmVzIGluIGVhY2ggc2VydmljZSdzIGBpbmRleC50c2AgaW50byBvbmUgY2FsbC5cbiAqXG4gKiBFVkVSWSBzdGF0ZWxlc3Mgc2VydmljZSBnb2VzIHRocm91Z2ggaGVyZSwgcGx1Z2luIGluY2x1ZGVkLiBQbHVnaW4gbmVlZHMgYVxuICogZGlmZmVyZW50IHJldm9jYXRpb24gc3RvcmUgKGl0cyBwb29sZWQgQnVsbE1RIFJlZGlzIGNvbm5lY3Rpb24sIG5vdCB0aGVcbiAqIGVudi1SZWRpcyBvbmUpOyB0aGF0IG92ZXJyaWRlIGlzIGEgcGFyYW1ldGVyLCBzbyBvcHRpbmcgb3V0IG9mIHRoZSBlbnYtUmVkaXNcbiAqIHN0b3JlIG5ldmVyIG1lYW5zIG9wdGluZyBvdXQgb2YgdGhlIHdpcmluZyDigJQgYSBoYW5kLXJvbGxlZCBjb3B5IHdvdWxkXG4gKiBzaWxlbnRseSBza2lwIHRoZSBuZXh0IGNvbmNlcm4gYWRkZWQgaGVyZS5cbiAqXG4gKiBAcGFyYW0gc2VydmljZU5hbWUgc2hvcnQgc2VydmljZSBuYW1lIGV2ZXJ5IGByZWNvcmRBdWRpdGAgZXZlbnQgKGFuZCB0aGVcbiAqICAgYGF1dGh6LmRlbmllZGAgcmVjb3JkcykgaXMgYXR0cmlidXRlZCB0b1xuICogQHBhcmFtIG9wdHMgcGVyLXNlcnZpY2Ugb3ZlcnJpZGVzIOKAlCBzZWUge0BsaW5rIFNlcnZpY2VTZWN1cml0eU9wdGlvbnN9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXJlU2VydmljZVNlY3VyaXR5KFxuICBzZXJ2aWNlTmFtZTogc3RyaW5nLFxuICBvcHRzOiBTZXJ2aWNlU2VjdXJpdHlPcHRpb25zID0ge30sXG4pOiB2b2lkIHtcbiAgYmluZEF1ZGl0U2VydmljZShzZXJ2aWNlTmFtZSk7XG4gIHdpcmVBdXRoekRlbmlhbEF1ZGl0b3Ioc2VydmljZU5hbWUsIGdldEJvdW5kQXVkaXRDbGllbnQpO1xuICBzZXRUb2tlblJldm9jYXRpb25TdG9yZShvcHRzLnRva2VuUmV2b2NhdGlvblN0b3JlID8/IGNyZWF0ZUVudlJlZGlzVG9rZW5SZXZvY2F0aW9uU3RvcmUoKSk7XG4gIHNldEFwaUtleUV4Y2hhbmdlU2VydmljZU5hbWUoc2VydmljZU5hbWUpO1xufVxuIl19
@@ -57,7 +57,7 @@ export declare function signServiceJwt(claims: Record<string, unknown>, options:
57
57
  * The security property this function exists for: the `kid` selects the key
58
58
  * AND names the signer, and the token's `sub` must agree. So `billing` cannot
59
59
  * be impersonated by any other service — not even one that holds a valid key of
60
- * its own — which is what the shared secret could never guarantee.
60
+ * its own — a guarantee no shared secret can give.
61
61
  *
62
62
  * @throws {jwt.JsonWebTokenError} unknown `kid`, wrong algorithm, bad
63
63
  * signature, expired, or a `sub` that disagrees with the signing key.
@@ -1,7 +1,7 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  /**
4
- * Per-service signing keys for INTERNAL service-to-service tokens (#14).
4
+ * Per-service signing keys for INTERNAL service-to-service tokens.
5
5
  *
6
6
  * Before this, every service held one shared `JWT_SECRET`, so any service could
7
7
  * mint a token naming any OTHER service — "billing said so" was unfalsifiable,
@@ -13,7 +13,7 @@
13
13
  *
14
14
  * ## Why public keys are distributed by CONFIG, not by per-service JWKS endpoints
15
15
  *
16
- * The user chain (#5) fetches platform's JWKS over HTTP because there is exactly
16
+ * The user chain fetches platform's JWKS over HTTP because there is exactly
17
17
  * one signer and it is the one service that must be up for anybody to sign in.
18
18
  * The service chain is the opposite shape, and three properties decided it:
19
19
  *
@@ -54,7 +54,7 @@
54
54
  import crypto, {} from 'crypto';
55
55
  import { readFileSync, statSync } from 'fs';
56
56
  import jwt from 'jsonwebtoken';
57
- import { publicJwkFrom, publicKeyFromJwk } from '../utils/jwk.js';
57
+ import { compactJws, encodeJwsSigningInput, publicJwkFrom, publicKeyFromJwk } from '../utils/jwk.js';
58
58
  import { createLogger } from '../utils/logger.js';
59
59
  import { emitCounter } from '../utils/metric-emitter.js';
60
60
  import { errorMessage } from '../utils/response.js';
@@ -131,11 +131,10 @@ export function serviceKeyMode() {
131
131
  * The key `serviceName` must be signed with.
132
132
  *
133
133
  * In `configured` mode there is exactly ONE key — this service's — so a request
134
- * to sign as some OTHER service is a bug and throws. That matters: before #14 a
135
- * service could legitimately mint `service:platform` with the shared secret
136
- * (api/plugin did, for its registry pushes), and under per-service keys such a
137
- * token would be silently unverifiable everywhere. Failing at the mint turns
138
- * that into an immediate, obvious error instead of a runtime 401.
134
+ * to sign as some OTHER service is a bug and throws: such a token would be
135
+ * unverifiable everywhere (its `kid` names this service, its `sub` another).
136
+ * Failing at the mint makes that an immediate, obvious error instead of a
137
+ * runtime 401.
139
138
  */
140
139
  function signingKeyFor(serviceName) {
141
140
  const file = process.env.SERVICE_SIGNING_KEY_FILE;
@@ -254,10 +253,6 @@ export function knownServiceNames() {
254
253
  // ---------------------------------------------------------------------------
255
254
  // Sign / verify
256
255
  // ---------------------------------------------------------------------------
257
- /** base64url of a JSON value, the JWS way (no padding, URL alphabet). */
258
- function b64uJson(value) {
259
- return Buffer.from(JSON.stringify(value), 'utf-8').toString('base64url');
260
- }
261
256
  /**
262
257
  * Sign `claims` as this service's internal token: ES256, `kid` = the signer's
263
258
  * thumbprint, `sub` = `service:<serviceName>`. `iat`/`exp` and the optional
@@ -279,12 +274,12 @@ export function signServiceJwt(claims, options) {
279
274
  ...(options.issuer ? { iss: options.issuer } : {}),
280
275
  ...(options.audience ? { aud: options.audience } : {}),
281
276
  };
282
- const signingInput = `${b64uJson({ alg: SERVICE_TOKEN_ALGORITHM, typ: 'JWT', kid: key.kid })}.${b64uJson(body)}`;
277
+ const signingInput = encodeJwsSigningInput(key.kid, body);
283
278
  const signature = crypto.sign('sha256', Buffer.from(signingInput, 'utf-8'), {
284
279
  key: key.privateKey,
285
280
  dsaEncoding: 'ieee-p1363',
286
281
  });
287
- return `${signingInput}.${signature.toString('base64url')}`;
282
+ return compactJws(signingInput, signature);
288
283
  }
289
284
  /**
290
285
  * Verify an internal service token, SYNCHRONOUSLY, and return its claims.
@@ -292,7 +287,7 @@ export function signServiceJwt(claims, options) {
292
287
  * The security property this function exists for: the `kid` selects the key
293
288
  * AND names the signer, and the token's `sub` must agree. So `billing` cannot
294
289
  * be impersonated by any other service — not even one that holds a valid key of
295
- * its own — which is what the shared secret could never guarantee.
290
+ * its own — a guarantee no shared secret can give.
296
291
  *
297
292
  * @throws {jwt.JsonWebTokenError} unknown `kid`, wrong algorithm, bad
298
293
  * signature, expired, or a `sub` that disagrees with the signing key.
@@ -326,8 +321,7 @@ export function verifyServiceJwt(token, options) {
326
321
  }
327
322
  if (claims.sub !== `${SERVICE_SUBJECT_PREFIX}${entry.serviceName}`) {
328
323
  // A valid signature by the WRONG service: the key belongs to `entry.serviceName`
329
- // but the token speaks for someone else. This is the cross-service forgery
330
- // the shared secret made undetectable.
324
+ // but the token speaks for someone else: a cross-service forgery.
331
325
  emitCounter('service_token_verify_total', { result: 'subject_mismatch', service: entry.serviceName });
332
326
  throw new jwt.JsonWebTokenError(`Service token subject ${String(claims.sub)} was signed by ${entry.serviceName}`);
333
327
  }
@@ -359,4 +353,4 @@ export function _resetServiceKeysForTests() {
359
353
  ephemeralKeys = undefined;
360
354
  ephemeralWarned = false;
361
355
  }
362
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1rZXlzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL3NlcnZpY2Uta2V5cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtERztBQUVILE9BQU8sTUFBTSxFQUFFLEVBQWtCLE1BQU0sUUFBUSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQzVDLE9BQU8sR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUMvQixPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFrQixNQUFNLGlCQUFpQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXBELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUU1Qyx1RUFBdUU7QUFDdkUsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsT0FBTyxDQUFDO0FBRS9DLHVGQUF1RjtBQUN2RixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxVQUFVLENBQUM7QUFFakQsaUZBQWlGO0FBQ2pGLE1BQU0sMEJBQTBCLEdBQUcsT0FBTyxDQUFDLENBQUMsWUFBWTtBQW9CeEQsNkVBQTZFO0FBQzdFLE1BQU0sT0FBTyxlQUFnQixTQUFRLEtBQUs7SUFDeEMsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUM7SUFDaEMsQ0FBQztDQUNGO0FBRUQ7Ozs7O0dBS0c7QUFDSCxN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Qyx5QkFBeUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3BILENBQUM7SUFDRCxXQUFXLENBQUMsNEJBQTRCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUN4RixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSw2QkFBNkI7SUFDM0MsSUFBSSxDQUFDO1FBQ0gsTUFBTSxFQUFFLEdBQUcsZUFBZSxFQUFFLENBQUM7UUFDN0IsT0FBTyxDQUFDLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSx5QkFBeUI7SUFDdkMsUUFBUSxHQUFHLFNBQVMsQ0FBQztJQUNyQixNQUFNLEdBQUcsU0FBUyxDQUFDO0lBQ25CLGFBQWEsR0FBRyxTQUFTLENBQUM7SUFDMUIsZUFBZSxHQUFHLEtBQUssQ0FBQztBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogUGVyLXNlcnZpY2Ugc2lnbmluZyBrZXlzIGZvciBJTlRFUk5BTCBzZXJ2aWNlLXRvLXNlcnZpY2UgdG9rZW5zICgjMTQpLlxuICpcbiAqIEJlZm9yZSB0aGlzLCBldmVyeSBzZXJ2aWNlIGhlbGQgb25lIHNoYXJlZCBgSldUX1NFQ1JFVGAsIHNvIGFueSBzZXJ2aWNlIGNvdWxkXG4gKiBtaW50IGEgdG9rZW4gbmFtaW5nIGFueSBPVEhFUiBzZXJ2aWNlIOKAlCBcImJpbGxpbmcgc2FpZCBzb1wiIHdhcyB1bmZhbHNpZmlhYmxlLFxuICogYW5kIGEgc2luZ2xlIGNvbXByb21pc2VkIHdvcmtsb2FkIGNvdWxkIHNwZWFrIGZvciB0aGUgd2hvbGUgZmxlZXQuIE5vdyBlYWNoXG4gKiBzZXJ2aWNlIHNpZ25zIHdpdGggaXRzIE9XTiBFUzI1NiAoRUMgUC0yNTYpIGtleSBhbmQgY29uc3VtZXJzIHZlcmlmeSBhZ2FpbnN0XG4gKiB0aGUgcHVibGljIGhhbHZlcy4gVGhlIGBraWRgIGlzIGJvdW5kIHRvIHRoZSBzaWduZXIncyBOQU1FLCBzbyBhIHRva2VuIHdob3NlXG4gKiBgc3ViYCBzYXlzIGBzZXJ2aWNlOmJpbGxpbmdgIGJ1dCB3YXMgc2lnbmVkIHdpdGggY29tcGxpYW5jZSdzIGtleSBpcyBhXG4gKiBmb3JnZXJ5LCBub3QgYSB2YWxpZCB0b2tlbiB3aXRoIGEgY29uZnVzaW5nIHN1YmplY3QuXG4gKlxuICogIyMgV2h5IHB1YmxpYyBrZXlzIGFyZSBkaXN0cmlidXRlZCBieSBDT05GSUcsIG5vdCBieSBwZXItc2VydmljZSBKV0tTIGVuZHBvaW50c1xuICpcbiAqIFRoZSB1c2VyIGNoYWluICgjNSkgZmV0Y2hlcyBwbGF0Zm9ybSdzIEpXS1Mgb3ZlciBIVFRQIGJlY2F1c2UgdGhlcmUgaXMgZXhhY3RseVxuICogb25lIHNpZ25lciBhbmQgaXQgaXMgdGhlIG9uZSBzZXJ2aWNlIHRoYXQgbXVzdCBiZSB1cCBmb3IgYW55Ym9keSB0byBzaWduIGluLlxuICogVGhlIHNlcnZpY2UgY2hhaW4gaXMgdGhlIG9wcG9zaXRlIHNoYXBlLCBhbmQgdGhyZWUgcHJvcGVydGllcyBkZWNpZGVkIGl0OlxuICpcbiAqICAxLiAqKmB2ZXJpZnlTZXJ2aWNlUHJpbmNpcGFsYCBtdXN0IHN0YXkgc3luY2hyb25vdXMuKiogVGhlIGdsb2JhbCByYXRlXG4gKiAgICAgbGltaXRlcidzIGBza2lwYCBhbmQgYXBwLWZhY3RvcnkncyBgL3dhcm11cGAgZ3VhcmQgdmVyaWZ5IGEgc2VydmljZSB0b2tlblxuICogICAgIEJFRk9SRSBgcmVxdWlyZUF1dGhgIHJ1bnMsIGluIHN5bmNocm9ub3VzIEV4cHJlc3MgY2FsbGJhY2tzLiBBbiBIVFRQIEpXS1NcbiAqICAgICBmZXRjaCB3b3VsZCBmb3JjZSB0aG9zZSBhc3luYyDigJQgYSBjaGFuZ2UgdGhhdCByZWFjaGVzIGludG8gZXZlcnlcbiAqICAgICBzZXJ2aWNlJ3MgbGltaXRlciB3aXJpbmcuXG4gKiAgMi4gKipObyBhdmFpbGFiaWxpdHkgY291cGxpbmcuKiogV2l0aCBwZXItc2VydmljZSBKV0tTIGVuZHBvaW50cywgdmVyaWZ5aW5nIGFcbiAqICAgICB0b2tlbiBtaW50ZWQgYnkgYGJpbGxpbmdgIG5lZWRzIGBiaWxsaW5nYCB0byBiZSByZWFjaGFibGUg4oCUIHNvIGJpbGxpbmdcbiAqICAgICBiZWluZyBkb3duIHdvdWxkIHN0b3AgcGxhdGZvcm0gZnJvbSBhY2NlcHRpbmcgYmlsbGluZydzIGluLWZsaWdodCBjYWxscyxcbiAqICAgICB0dXJuaW5nIG9uZSBvdXRhZ2UgaW50byBzZXZlcmFsLiBBIG1vdW50ZWQgZmlsZSBoYXMgbm8gc3VjaCBlZGdlLlxuICogIDMuICoqTm8gTsOXTiBhZGRyZXNzIGNvbmZpZy4qKiAxMCBzZXJ2aWNlcyB3b3VsZCBlYWNoIG5lZWQgZXZlcnkgcGVlcidzXG4gKiAgICAgaG9zdC9wb3J0IChhbmQgY29tcG9zZSwgd2hpY2ggaGFzIG5vIG1lc2gsIHdvdWxkIG5lZWQgdGhlbSB0b28pLlxuICpcbiAqIFNvIHRoZSBkZXBsb3kgZ2VuZXJhdGVzIG9uZSBrZXlwYWlyIHBlciBzZXJ2aWNlLCBtb3VudHMgZWFjaCBwcml2YXRlIGtleSBPTkxZXG4gKiBpbnRvIGl0cyBvd24gc2VydmljZSwgYW5kIG1vdW50cyBPTkUgcHVibGljIGJ1bmRsZSAocmVhZC1vbmx5KSBldmVyeXdoZXJlOlxuICpcbiAqICAgYFNFUlZJQ0VfU0lHTklOR19LRVlfRklMRWAgIHRoaXMgc2VydmljZSdzIEVDIFAtMjU2IHByaXZhdGUga2V5IChQS0NTIzggUEVNKVxuICogICBgU0VSVklDRV9LRVlfQlVORExFX0ZJTEVgICAgYHsgXCJzZXJ2aWNlc1wiOiB7IFwiPG5hbWU+XCI6IHsgXCJrZXlzXCI6IFs8andrPuKApl0gfSB9IH1gXG4gKlxuICogUm90YXRpb24gaXMgYnkgYGtpZGAsIGluIHRoZSBzYW1lIHNoYXBlIGFzIHRoZSB1c2VyIGNoYWluOiBhZGQgdGhlIG5ldyBwdWJsaWNcbiAqIGtleSB0byB0aGUgYnVuZGxlICh0aGUgc2VydmljZSBub3cgcHVibGlzaGVzIHR3byksIHJvbGwgdGhlIGJ1bmRsZSBvdXQsIHN3YXBcbiAqIHRoYXQgc2VydmljZSdzIHByaXZhdGUga2V5LCB0aGVuIGRyb3AgdGhlIHJldGlyZWQgcHVibGljIGtleS4gVGhlIGJ1bmRsZSBpc1xuICogcmUtcmVhZCBvbiBhbiBpbnRlcnZhbCBBTkQgb24gYW4gbXRpbWUgY2hhbmdlLCBzbyBhIHJvdGF0aW9uIG5lZWRzIG5vIHJlc3RhcnQuXG4gKiBgZGVwbG95L2Jpbi9zZXJ2aWNlLXNpZ25pbmcta2V5cy5zaGAgZ2VuZXJhdGVzIGFuZCByb3RhdGVzIGJvdGggaGFsdmVzLlxuICpcbiAqICMjIEVwaGVtZXJhbCBtb2RlXG4gKlxuICogV2l0aCBubyBgU0VSVklDRV9TSUdOSU5HX0tFWV9GSUxFYCBjb25maWd1cmVkLCBhIGtleXBhaXIgaXMgZ2VuZXJhdGVkXG4gKiBJTi1QUk9DRVNTIHBlciByZXF1ZXN0ZWQgc2VydmljZSBuYW1lIGFuZCByZWdpc3RlcmVkIGluIHRoZSBpbi1tZW1vcnkgYnVuZGxlLlxuICogVGhhdCBrZWVwcyBzaW5nbGUtcHJvY2VzcyBzdWl0ZXMgYW5kIGxvY2FsIG9uZS1vZmYgc2NyaXB0cyB3b3JraW5nIHdpdGggbm8ga2V5XG4gKiBtYXRlcmlhbCwgYW5kIGl0IGNhbiBuZXZlciB3aWRlbiB0cnVzdDogdGhlIG9ubHkgdmVyaWZpZXIgdGhhdCBhY2NlcHRzIHN1Y2ggYVxuICogdG9rZW4gaXMgdGhlIHByb2Nlc3MgdGhhdCBtaW50ZWQgaXQuIEl0IGlzIGxvZ2dlZCBvbmNlIGF0IHdhcm4gbGV2ZWwsIGFuZFxuICogY291bnRlZCwgYmVjYXVzZSBpbiBhIHJlYWwgZGVwbG95bWVudCBpdCBtZWFucyB0aGlzIHNlcnZpY2UncyBwZWVycyB3aWxsXG4gKiByZWplY3QgZXZlcnl0aGluZyBpdCBzZW5kcy5cbiAqL1xuXG5pbXBvcnQgY3J5cHRvLCB7IHR5cGUgS2V5T2JqZWN0IH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IHJlYWRGaWxlU3luYywgc3RhdFN5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgand0IGZyb20gJ2pzb253ZWJ0b2tlbic7XG5pbXBvcnQgeyBwdWJsaWNKd2tGcm9tLCBwdWJsaWNLZXlGcm9tSndrLCB0eXBlIFB1YmxpY0p3ayB9IGZyb20gJy4uL3V0aWxzL2p3ay5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZW1pdENvdW50ZXIgfSBmcm9tICcuLi91dGlscy9tZXRyaWMtZW1pdHRlci5qcyc7XG5pbXBvcnQgeyBlcnJvck1lc3NhZ2UgfSBmcm9tICcuLi91dGlscy9yZXNwb25zZS5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignc2VydmljZS1rZXlzJyk7XG5cbi8qKiBUaGUgT05MWSBhbGdvcml0aG0gYW4gaW50ZXJuYWwgc2VydmljZSB0b2tlbiBtYXkgYmUgc2lnbmVkIHdpdGguICovXG5leHBvcnQgY29uc3QgU0VSVklDRV9UT0tFTl9BTEdPUklUSE0gPSAnRVMyNTYnO1xuXG4vKiogU3ViamVjdCBwcmVmaXggbmFtaW5nIHRoZSBjYWxsaW5nIHNlcnZpY2Ugb24gYSBzZXJ2aWNlIHRva2VuIChgc2VydmljZTo8bmFtZT5gKS4gKi9cbmV4cG9ydCBjb25zdCBTRVJWSUNFX1NVQkpFQ1RfUFJFRklYID0gJ3NlcnZpY2U6JztcblxuLyoqIEhvdyBsb25nIGEgbG9hZGVkIGJ1bmRsZSBpcyBzZXJ2ZWQgYmVmb3JlIGl0IGlzIHJlLXJlYWQgKHJvdGF0aW9uIHBpY2t1cCkuICovXG5jb25zdCBCVU5ETEVfUkVGUkVTSF9JTlRFUlZBTF9NUyA9IDMwMF8wMDA7IC8vIDUgbWludXRlc1xuXG4vKiogT25lIHNlcnZpY2UncyBwdWJsaXNoZWQgdmVyaWZpY2F0aW9uIGtleXMsIGFzIHRoZXkgYXBwZWFyIGluIHRoZSBidW5kbGUgZmlsZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZUtleUVudHJ5IHtcbiAga2V5czogUHVibGljSndrW107XG59XG5cbi8qKiBUaGUgZG9jdW1lbnQgYFNFUlZJQ0VfS0VZX0JVTkRMRV9GSUxFYCBob2xkczogZXZlcnkgc2VydmljZSdzIHB1YmxpYyBrZXlzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlS2V5QnVuZGxlIHtcbiAgc2VydmljZXM6IFJlY29yZDxzdHJpbmcsIFNlcnZpY2VLZXlFbnRyeT47XG59XG5cbi8qKiBBIHNpZ25pbmcga2V5IHRoaXMgcHJvY2VzcyBob2xkcywgaW4gdGhlIGZvcm1zIHNpZ25pbmcgbmVlZHMuICovXG5pbnRlcmZhY2UgTG9jYWxTaWduaW5nS2V5IHtcbiAgc2VydmljZU5hbWU6IHN0cmluZztcbiAga2lkOiBzdHJpbmc7XG4gIHByaXZhdGVLZXk6IEtleU9iamVjdDtcbiAgcHVibGljSndrOiBQdWJsaWNKd2s7XG59XG5cbi8qKiBUaGUgYnVuZGxlIGNvdWxkIG5vdCBiZSBsb2FkZWQgb3IgZG9lcyBub3Qga25vdyB0aGUga2V5IGEgdG9rZW4gbmFtZXMuICovXG5leHBvcnQgY2xhc3MgU2VydmljZUtleUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnU2VydmljZUtleUVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgcHJvY2VzcydzIHNlcnZpY2UgaWRlbnRpdHkg4oCUIHRoZSBgPG5hbWU+YCBpbiBgc2VydmljZTo8bmFtZT5gIGFuZCB0aGVcbiAqIG5hbWUgaXRzIGtleSBpcyBwdWJsaXNoZWQgdW5kZXIuIGBTRVJWSUNFX05BTUVgIGlzIGFscmVhZHkgc2V0IHBlciBzZXJ2aWNlIGluXG4gKiBldmVyeSBkZXBsb3kgdGFyZ2V0IChjb21wb3NlLCBtaW5pa3ViZSwgZWMyLCBla3MpLCBhbmQgaXMgdGhlIHNhbWUgdmFsdWUgdGhlXG4gKiBhdWRpdCBhbmQgbWV0cmljIGxhYmVscyB1c2UsIHNvIHRoZXJlIGlzIG9uZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIFwid2hvIGFtIElcIi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcnZpY2VJZGVudGl0eSgpOiBzdHJpbmcge1xuICByZXR1cm4gcHJvY2Vzcy5lbnYuU0VSVklDRV9OQU1FIHx8ICdhcGknO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIExvY2FsIHNpZ25pbmcga2V5XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxubGV0IGxvY2FsS2V5OiBMb2NhbFNpZ25pbmdLZXkgfCB1bmRlZmluZWQ7XG5sZXQgZXBoZW1lcmFsS2V5czogTWFwPHN0cmluZywgTG9jYWxTaWduaW5nS2V5PiB8IHVuZGVmaW5lZDtcbmxldCBlcGhlbWVyYWxXYXJuZWQgPSBmYWxzZTtcblxuZnVuY3Rpb24gbG9hZENvbmZpZ3VyZWRTaWduaW5nS2V5KGZpbGU6IHN0cmluZyk6IExvY2FsU2lnbmluZ0tleSB7XG4gIGNvbnN0IHNlcnZpY2VOYW1lID0gc2VydmljZUlkZW50aXR5KCk7XG4gIGxldCBwcml2YXRlS2V5OiBLZXlPYmplY3Q7XG4gIHRyeSB7XG4gICAgcHJpdmF0ZUtleSA9IGNyeXB0by5jcmVhdGVQcml2YXRlS2V5KHJlYWRGaWxlU3luYyhmaWxlLCAndXRmOCcpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgU2VydmljZUtleUVycm9yKGBDb3VsZCBub3QgcmVhZCB0aGUgc2VydmljZSBzaWduaW5nIGtleSBhdCAke2ZpbGV9OiAke2Vycm9yTWVzc2FnZShlcnJvcil9YCk7XG4gIH1cbiAgLy8gcHVibGljSndrRnJvbSByZWplY3RzIGFueXRoaW5nIGJ1dCBhbiBFQyBQLTI1NiBrZXksIHNvIGEgc2VydmljZSBjb25maWd1cmVkXG4gIC8vIHdpdGggKHNheSkgYW4gUlNBIGtleSBmYWlscyBIRVJFIHJhdGhlciB0aGFuIG1pbnRpbmcgdG9rZW5zIG5vYm9keSB2ZXJpZmllcy5cbiAgY29uc3QgcHVibGljSndrID0gcHVibGljSndrRnJvbShjcnlwdG8uY3JlYXRlUHVibGljS2V5KHByaXZhdGVLZXkpKTtcbiAgcmV0dXJuIHsgc2VydmljZU5hbWUsIGtpZDogcHVibGljSndrLmtpZCwgcHJpdmF0ZUtleSwgcHVibGljSndrIH07XG59XG5cbi8qKlxuICogVGhlIGluLXByb2Nlc3Mga2V5IGZvciBgc2VydmljZU5hbWVgIGluIGVwaGVtZXJhbCBtb2RlLCBnZW5lcmF0ZWQgb24gZmlyc3RcbiAqIHVzZSBhbmQgcmVnaXN0ZXJlZCBpbiB0aGUgaW4tbWVtb3J5IGJ1bmRsZSBzbyB0aGlzIHByb2Nlc3MgY2FuIHZlcmlmeSBpdHMgb3duXG4gKiB0b2tlbnMuIEtleWVkIGJ5IE5BTUUgKG5vdCBqdXN0IG9uZSBrZXkpIHNvIGEgc2luZ2xlLXByb2Nlc3Mgc3VpdGUgY2FuIG1pbnRcbiAqIHRva2VucyBmb3Igc2V2ZXJhbCBzZXJ2aWNlcywgYXMgdGhlIHJlYWwgZmxlZXQgZG9lcyBhY3Jvc3MgcHJvY2Vzc2VzLlxuICovXG5mdW5jdGlvbiBlcGhlbWVyYWxTaWduaW5nS2V5KHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBMb2NhbFNpZ25pbmdLZXkge1xuICBlcGhlbWVyYWxLZXlzID8/PSBuZXcgTWFwKCk7XG4gIGNvbnN0IGV4aXN0aW5nID0gZXBoZW1lcmFsS2V5cy5nZXQoc2VydmljZU5hbWUpO1xuICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZztcblxuICBpZiAoIWVwaGVtZXJhbFdhcm5lZCkge1xuICAgIGVwaGVtZXJhbFdhcm5lZCA9IHRydWU7XG4gICAgZW1pdENvdW50ZXIoJ3NlcnZpY2Vfc2lnbmluZ19lcGhlbWVyYWxfa2V5X3RvdGFsJywgeyBzZXJ2aWNlOiBzZXJ2aWNlSWRlbnRpdHkoKSB9KTtcbiAgICBsb2dnZXIud2FybignU0VSVklDRV9TSUdOSU5HX0tFWV9GSUxFIGlzIG5vdCBzZXQg4oCUIG1pbnRpbmcgaW50ZXJuYWwgc2VydmljZSB0b2tlbnMgd2l0aCBhbiBFUEhFTUVSQUwga2V5LiBPbmx5IHRoaXMgcHJvY2VzcyB3aWxsIGFjY2VwdCB0aGVtOyBldmVyeSBwZWVyIHdpbGwgcmVqZWN0IHRoZW0uIFNldCBTRVJWSUNFX1NJR05JTkdfS0VZX0ZJTEUgKyBTRVJWSUNFX0tFWV9CVU5ETEVfRklMRSAoZGVwbG95L2Jpbi9zZXJ2aWNlLXNpZ25pbmcta2V5cy5zaCkuJyk7XG4gIH1cbiAgY29uc3QgeyBwcml2YXRlS2V5LCBwdWJsaWNLZXkgfSA9IGNyeXB0by5nZW5lcmF0ZUtleVBhaXJTeW5jKCdlYycsIHsgbmFtZWRDdXJ2ZTogJ3ByaW1lMjU2djEnIH0pO1xuICBjb25zdCBwdWJsaWNKd2sgPSBwdWJsaWNKd2tGcm9tKHB1YmxpY0tleSk7XG4gIGNvbnN0IGdlbmVyYXRlZDogTG9jYWxTaWduaW5nS2V5ID0geyBzZXJ2aWNlTmFtZSwga2lkOiBwdWJsaWNKd2sua2lkLCBwcml2YXRlS2V5LCBwdWJsaWNKd2sgfTtcbiAgZXBoZW1lcmFsS2V5cy5zZXQoc2VydmljZU5hbWUsIGdlbmVyYXRlZCk7XG4gIHJldHVybiBnZW5lcmF0ZWQ7XG59XG5cbi8qKiBXaGV0aGVyIHRoaXMgcHJvY2VzcyBzaWducyB3aXRoIGEgbW91bnRlZCBrZXkgKGBjb25maWd1cmVkYCkgb3IgYW4gaW4tcHJvY2VzcyBvbmUuICovXG5leHBvcnQgZnVuY3Rpb24gc2VydmljZUtleU1vZGUoKTogJ2NvbmZpZ3VyZWQnIHwgJ2VwaGVtZXJhbCcge1xuICByZXR1cm4gcHJvY2Vzcy5lbnYuU0VSVklDRV9TSUdOSU5HX0tFWV9GSUxFID8gJ2NvbmZpZ3VyZWQnIDogJ2VwaGVtZXJhbCc7XG59XG5cbi8qKlxuICogVGhlIGtleSBgc2VydmljZU5hbWVgIG11c3QgYmUgc2lnbmVkIHdpdGguXG4gKlxuICogSW4gYGNvbmZpZ3VyZWRgIG1vZGUgdGhlcmUgaXMgZXhhY3RseSBPTkUga2V5IOKAlCB0aGlzIHNlcnZpY2UncyDigJQgc28gYSByZXF1ZXN0XG4gKiB0byBzaWduIGFzIHNvbWUgT1RIRVIgc2VydmljZSBpcyBhIGJ1ZyBhbmQgdGhyb3dzLiBUaGF0IG1hdHRlcnM6IGJlZm9yZSAjMTQgYVxuICogc2VydmljZSBjb3VsZCBsZWdpdGltYXRlbHkgbWludCBgc2VydmljZTpwbGF0Zm9ybWAgd2l0aCB0aGUgc2hhcmVkIHNlY3JldFxuICogKGFwaS9wbHVnaW4gZGlkLCBmb3IgaXRzIHJlZ2lzdHJ5IHB1c2hlcyksIGFuZCB1bmRlciBwZXItc2VydmljZSBrZXlzIHN1Y2ggYVxuICogdG9rZW4gd291bGQgYmUgc2lsZW50bHkgdW52ZXJpZmlhYmxlIGV2ZXJ5d2hlcmUuIEZhaWxpbmcgYXQgdGhlIG1pbnQgdHVybnNcbiAqIHRoYXQgaW50byBhbiBpbW1lZGlhdGUsIG9idmlvdXMgZXJyb3IgaW5zdGVhZCBvZiBhIHJ1bnRpbWUgNDAxLlxuICovXG5mdW5jdGlvbiBzaWduaW5nS2V5Rm9yKHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBMb2NhbFNpZ25pbmdLZXkge1xuICBjb25zdCBmaWxlID0gcHJvY2Vzcy5lbnYuU0VSVklDRV9TSUdOSU5HX0tFWV9GSUxFO1xuICBpZiAoIWZpbGUpIHJldHVybiBlcGhlbWVyYWxTaWduaW5nS2V5KHNlcnZpY2VOYW1lKTtcblxuICBpZiAoIWxvY2FsS2V5IHx8IGxvY2FsS2V5LnNlcnZpY2VOYW1lICE9PSBzZXJ2aWNlSWRlbnRpdHkoKSkge1xuICAgIGxvY2FsS2V5ID0gbG9hZENvbmZpZ3VyZWRTaWduaW5nS2V5KGZpbGUpO1xuICB9XG4gIGlmIChzZXJ2aWNlTmFtZSAhPT0gbG9jYWxLZXkuc2VydmljZU5hbWUpIHtcbiAgICB0aHJvdyBuZXcgU2VydmljZUtleUVycm9yKFxuICAgICAgYFRoaXMgcHJvY2VzcyBpcyAnJHtsb2NhbEtleS5zZXJ2aWNlTmFtZX0nIGFuZCBob2xkcyBvbmx5IGl0cyBvd24gc2lnbmluZyBrZXksIHNvIGl0IGNhbm5vdCBtaW50IGEgdG9rZW4gZm9yICcke3NlcnZpY2VOYW1lfScuIGBcbiAgICAgICsgJ05hbWUgdGhlIGNhbGxpbmcgc2VydmljZSBjb3JyZWN0bHksIG9yIGdpdmUgdGhlIGNhbGxlciBpdHMgb3duIGtleS4nLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGxvY2FsS2V5O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFZlcmlmaWNhdGlvbiBidW5kbGVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5pbnRlcmZhY2UgTG9hZGVkQnVuZGxlIHtcbiAgLyoqIGBraWRgIOKGkiB0aGUgc2VydmljZSB0aGF0IHB1Ymxpc2hlZCBpdCwgcGx1cyB0aGUgdmVyaWZpY2F0aW9uIGtleS4gKi9cbiAgYnlLaWQ6IE1hcDxzdHJpbmcsIHsgc2VydmljZU5hbWU6IHN0cmluZzsga2V5OiBLZXlPYmplY3QgfT47XG4gIGxvYWRlZEF0OiBudW1iZXI7XG4gIG10aW1lTXM6IG51bWJlcjtcbn1cblxubGV0IGJ1bmRsZTogTG9hZGVkQnVuZGxlIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBwYXJzZUJ1bmRsZShyYXc6IHN0cmluZywgZmlsZTogc3RyaW5nKTogTWFwPHN0cmluZywgeyBzZXJ2aWNlTmFtZTogc3RyaW5nOyBrZXk6IEtleU9iamVjdCB9PiB7XG4gIGxldCBkb2N1bWVudDogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICBkb2N1bWVudCA9IEpTT04ucGFyc2UocmF3KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgU2VydmljZUtleUVycm9yKGAke2ZpbGV9IGlzIG5vdCB2YWxpZCBKU09OOiAke2Vycm9yTWVzc2FnZShlcnJvcil9YCk7XG4gIH1cbiAgY29uc3Qgc2VydmljZXMgPSAoZG9jdW1lbnQgYXMgUGFydGlhbDxTZXJ2aWNlS2V5QnVuZGxlPik/LnNlcnZpY2VzO1xuICBpZiAoIXNlcnZpY2VzIHx8IHR5cGVvZiBzZXJ2aWNlcyAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgU2VydmljZUtleUVycm9yKGAke2ZpbGV9IGhhcyBubyBcInNlcnZpY2VzXCIgb2JqZWN0YCk7XG4gIH1cbiAgY29uc3QgYnlLaWQgPSBuZXcgTWFwPHN0cmluZywgeyBzZXJ2aWNlTmFtZTogc3RyaW5nOyBrZXk6IEtleU9iamVjdCB9PigpO1xuICBmb3IgKGNvbnN0IFtzZXJ2aWNlTmFtZSwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKHNlcnZpY2VzKSkge1xuICAgIGZvciAoY29uc3QgandrIG9mIGVudHJ5Py5rZXlzID8/IFtdKSB7XG4gICAgICBpZiAoIWp3az8ua2lkKSBjb250aW51ZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGJ5S2lkLnNldChqd2sua2lkLCB7IHNlcnZpY2VOYW1lLCBrZXk6IHB1YmxpY0tleUZyb21Kd2soandrKSB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIE9uZSB1bnVzYWJsZSBlbnRyeSBtdXN0IG5vdCBkaXNjYXJkIHRoZSByZXN0IG9mIHRoZSBidW5kbGUg4oCUIHRoZSBzYW1lXG4gICAgICAgIC8vIHJ1bGUgdGhlIEpXS1MgY2FjaGUgYXBwbGllcyB0byBwbGF0Zm9ybSdzIHB1Ymxpc2hlZCBzZXQuXG4gICAgICAgIGxvZ2dlci53YXJuKCdTa2lwcGluZyB1bnVzYWJsZSBzZXJ2aWNlIGtleScsIHsgc2VydmljZU5hbWUsIGtpZDogandrLmtpZCwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnJvcikgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChieUtpZC5zaXplID09PSAwKSB0aHJvdyBuZXcgU2VydmljZUtleUVycm9yKGAke2ZpbGV9IGNvbnRhaW5lZCBubyB1c2FibGUgc2VydmljZSBrZXlzYCk7XG4gIHJldHVybiBieUtpZDtcbn1cblxuLyoqXG4gKiBUaGUgYGtpZGAg4oaSIHNlcnZpY2UgbWFwLCByZS1yZWFkIHdoZW4gdGhlIHJlZnJlc2ggaW50ZXJ2YWwgaGFzIHBhc3NlZCBvciB0aGVcbiAqIGZpbGUncyBtdGltZSBjaGFuZ2VkIChzbyBhIHJvdGF0aW9uIGlzIHBpY2tlZCB1cCB3aXRob3V0IGEgcmVzdGFydCkuXG4gKlxuICogSW4gZXBoZW1lcmFsIG1vZGUgdGhlIFwiYnVuZGxlXCIgaXMgd2hhdGV2ZXIgdGhpcyBwcm9jZXNzIGdlbmVyYXRlZCBmb3IgaXRzZWxmLlxuICogTmV2ZXIgdGhyb3dzIGZvciBhIG1pc3NpbmcgZmlsZSBpbiB0aGF0IG1vZGUg4oCUIGl0IGp1c3QgaG9sZHMgdGhvc2Uga2V5cy5cbiAqL1xuZnVuY3Rpb24gdmVyaWZpY2F0aW9uS2V5cygpOiBNYXA8c3RyaW5nLCB7IHNlcnZpY2VOYW1lOiBzdHJpbmc7IGtleTogS2V5T2JqZWN0IH0+IHtcbiAgY29uc3QgZmlsZSA9IHByb2Nlc3MuZW52LlNFUlZJQ0VfS0VZX0JVTkRMRV9GSUxFO1xuICBpZiAoIWZpbGUpIHtcbiAgICBjb25zdCBsb2NhbCA9IG5ldyBNYXA8c3RyaW5nLCB7IHNlcnZpY2VOYW1lOiBzdHJpbmc7IGtleTogS2V5T2JqZWN0IH0+KCk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgZXBoZW1lcmFsS2V5cz8udmFsdWVzKCkgPz8gW10pIHtcbiAgICAgIGxvY2FsLnNldChrZXkua2lkLCB7IHNlcnZpY2VOYW1lOiBrZXkuc2VydmljZU5hbWUsIGtleTogY3J5cHRvLmNyZWF0ZVB1YmxpY0tleShrZXkucHJpdmF0ZUtleSkgfSk7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbDtcbiAgfVxuXG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGxldCBtdGltZU1zID0gMDtcbiAgdHJ5IHtcbiAgICBtdGltZU1zID0gc3RhdFN5bmMoZmlsZSkubXRpbWVNcztcbiAgfSBjYXRjaCB7XG4gICAgLy8gVW5yZWFkYWJsZSBub3c6IGtlZXAgc2VydmluZyBhIGJ1bmRsZSBhbHJlYWR5IGluIGhhbmQgKHB1YmxpYyBrZXlzIGRvbid0XG4gICAgLy8gZXhwaXJlLCBhbmQgcmVmdXNpbmcgZXZlcnkgaW50ZXJuYWwgY2FsbCBiZWNhdXNlIGEgbW91bnQgYmxpcHBlZCB3b3VsZCBiZVxuICAgIC8vIGEgc2VsZi1pbmZsaWN0ZWQgb3V0YWdlKS4gV2l0aCBub3RoaW5nIGluIGhhbmQsIGZhaWwgY2xvc2VkIGJlbG93LlxuICAgIGlmIChidW5kbGUpIHJldHVybiBidW5kbGUuYnlLaWQ7XG4gIH1cbiAgaWYgKGJ1bmRsZSAmJiBidW5kbGUubXRpbWVNcyA9PT0gbXRpbWVNcyAmJiBub3cgLSBidW5kbGUubG9hZGVkQXQgPCBCVU5ETEVfUkVGUkVTSF9JTlRFUlZBTF9NUykge1xuICAgIHJldHVybiBidW5kbGUuYnlLaWQ7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGJ5S2lkID0gcGFyc2VCdW5kbGUocmVhZEZpbGVTeW5jKGZpbGUsICd1dGY4JyksIGZpbGUpO1xuICAgIGJ1bmRsZSA9IHsgYnlLaWQsIGxvYWRlZEF0OiBub3csIG10aW1lTXMgfTtcbiAgICByZXR1cm4gYnlLaWQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGJ1bmRsZSkge1xuICAgICAgbG9nZ2VyLndhcm4oJ1NlcnZpY2Uga2V5IGJ1bmRsZSByZWxvYWQgZmFpbGVkOyBjb250aW51aW5nIG9uIHRoZSBsb2FkZWQgY29weScsIHsgZmlsZSwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnJvcikgfSk7XG4gICAgICByZXR1cm4gYnVuZGxlLmJ5S2lkO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvciBpbnN0YW5jZW9mIFNlcnZpY2VLZXlFcnJvciA/IGVycm9yIDogbmV3IFNlcnZpY2VLZXlFcnJvcihTdHJpbmcoZXJyb3IpKTtcbiAgfVxufVxuXG4vKipcbiAqIFdoZXRoZXIgYGtpZGAgYmVsb25ncyB0byBhbiBpbnRlcm5hbCBTRVJWSUNFIGtleS4gVGhpcyBpcyBob3cgYSBiZWFyZXIgdG9rZW5cbiAqIGlzIHJvdXRlZCBiZXR3ZWVuIHRoZSB0d28gRVMyNTYgY2hhaW5zOiBib3RoIHVzZXIgYW5kIHNlcnZpY2UgdG9rZW5zIGFyZVxuICogRVMyNTYgd2l0aCBhIGBraWRgLCBhbmQgYGtpZGAgaXMgYW4gUkZDIDc2MzggdGh1bWJwcmludCwgc28gb3duZXJzaGlwIG9mIHRoZVxuICogaWQg4oCUIG5vdCBhIGNsYWltIGluc2lkZSB0aGUgdG9rZW4g4oCUIGRlY2lkZXMgd2hpY2gga2V5IHNldCBtYXkgdmVyaWZ5IGl0LlxuICogUmV0dXJucyBgZmFsc2VgIChuZXZlciB0aHJvd3MpIHdoZW4gbm8gYnVuZGxlIGNhbiBiZSByZWFkOyB0aGUgdG9rZW4gdGhlblxuICogdGFrZXMgdGhlIHVzZXIgY2hhaW4gYW5kIGlzIHJlamVjdGVkIHRoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTZXJ2aWNlS2lkKGtpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHZlcmlmaWNhdGlvbktleXMoKS5oYXMoa2lkKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKiBFdmVyeSBzZXJ2aWNlIG5hbWUgdGhlIGJ1bmRsZSBwdWJsaXNoZXMgYSBrZXkgZm9yLiBEaWFnbm9zdGljcyBhbmQgdGVzdHMuICovXG5leHBvcnQgZnVuY3Rpb24ga25vd25TZXJ2aWNlTmFtZXMoKTogc3RyaW5nW10ge1xuICB0cnkge1xuICAgIHJldHVybiBbLi4ubmV3IFNldChbLi4udmVyaWZpY2F0aW9uS2V5cygpLnZhbHVlcygpXS5tYXAoKHYpID0+IHYuc2VydmljZU5hbWUpKV0uc29ydCgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTaWduIC8gdmVyaWZ5XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIGJhc2U2NHVybCBvZiBhIEpTT04gdmFsdWUsIHRoZSBKV1Mgd2F5IChubyBwYWRkaW5nLCBVUkwgYWxwaGFiZXQpLiAqL1xuZnVuY3Rpb24gYjY0dUpzb24odmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICByZXR1cm4gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkodmFsdWUpLCAndXRmLTgnKS50b1N0cmluZygnYmFzZTY0dXJsJyk7XG59XG5cbi8qKlxuICogU2lnbiBgY2xhaW1zYCBhcyB0aGlzIHNlcnZpY2UncyBpbnRlcm5hbCB0b2tlbjogRVMyNTYsIGBraWRgID0gdGhlIHNpZ25lcidzXG4gKiB0aHVtYnByaW50LCBgc3ViYCA9IGBzZXJ2aWNlOjxzZXJ2aWNlTmFtZT5gLiBgaWF0YC9gZXhwYCBhbmQgdGhlIG9wdGlvbmFsXG4gKiBpc3N1ZXIvYXVkaWVuY2UgYXJlIHN0YW1wZWQgaGVyZSBzbyB0aGVyZSBpcyBvbmUgcGxhY2UgdGhhdCBkZWNpZGVzIHdoYXQgYVxuICogc2VydmljZSB0b2tlbiBzYXlzLlxuICpcbiAqIEhhbmQtcm9sbGVkIChyYXRoZXIgdGhhbiBgand0LnNpZ25gKSBvbmx5IHNvIHRoZSBoZWFkZXIgY2FycmllcyB0aGUgYGtpZGAgaW5cbiAqIHRoZSBzYW1lIHNoYXBlIHBsYXRmb3JtJ3Mgc2lnbmVyIHByb2R1Y2VzIOKAlCBgY3J5cHRvLnNpZ25gIGlzIHN5bmNocm9ub3VzLCBzb1xuICogdW5saWtlIHRoZSBLTVMgcGF0aCB0aGlzIGNvc3RzIG5vdGhpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWduU2VydmljZUp3dChcbiAgY2xhaW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgb3B0aW9uczogeyBzZXJ2aWNlTmFtZTogc3RyaW5nOyBleHBpcmVzSW5TZWNvbmRzOiBudW1iZXI7IGlzc3Vlcj86IHN0cmluZzsgYXVkaWVuY2U/OiBzdHJpbmcgfSxcbik6IHN0cmluZyB7XG4gIGNvbnN0IGtleSA9IHNpZ25pbmdLZXlGb3Iob3B0aW9ucy5zZXJ2aWNlTmFtZSk7XG4gIGNvbnN0IG5vdyA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuICBjb25zdCBib2R5ID0ge1xuICAgIC4uLmNsYWltcyxcbiAgICBzdWI6IGAke1NFUlZJQ0VfU1VCSkVDVF9QUkVGSVh9JHtvcHRpb25zLnNlcnZpY2VOYW1lfWAsXG4gICAgaWF0OiBub3csXG4gICAgZXhwOiBub3cgKyBvcHRpb25zLmV4cGlyZXNJblNlY29uZHMsXG4gICAgLi4uKG9wdGlvbnMuaXNzdWVyID8geyBpc3M6IG9wdGlvbnMuaXNzdWVyIH0gOiB7fSksXG4gICAgLi4uKG9wdGlvbnMuYXVkaWVuY2UgPyB7IGF1ZDogb3B0aW9ucy5hdWRpZW5jZSB9IDoge30pLFxuICB9O1xuICBjb25zdCBzaWduaW5nSW5wdXQgPSBgJHtiNjR1SnNvbih7IGFsZzogU0VSVklDRV9UT0tFTl9BTEdPUklUSE0sIHR5cDogJ0pXVCcsIGtpZDoga2V5LmtpZCB9KX0uJHtiNjR1SnNvbihib2R5KX1gO1xuICBjb25zdCBzaWduYXR1cmUgPSBjcnlwdG8uc2lnbignc2hhMjU2JywgQnVmZmVyLmZyb20oc2lnbmluZ0lucHV0LCAndXRmLTgnKSwge1xuICAgIGtleToga2V5LnByaXZhdGVLZXksXG4gICAgZHNhRW5jb2Rpbmc6ICdpZWVlLXAxMzYzJyxcbiAgfSk7XG4gIHJldHVybiBgJHtzaWduaW5nSW5wdXR9LiR7c2lnbmF0dXJlLnRvU3RyaW5nKCdiYXNlNjR1cmwnKX1gO1xufVxuXG4vKipcbiAqIFZlcmlmeSBhbiBpbnRlcm5hbCBzZXJ2aWNlIHRva2VuLCBTWU5DSFJPTk9VU0xZLCBhbmQgcmV0dXJuIGl0cyBjbGFpbXMuXG4gKlxuICogVGhlIHNlY3VyaXR5IHByb3BlcnR5IHRoaXMgZnVuY3Rpb24gZXhpc3RzIGZvcjogdGhlIGBraWRgIHNlbGVjdHMgdGhlIGtleVxuICogQU5EIG5hbWVzIHRoZSBzaWduZXIsIGFuZCB0aGUgdG9rZW4ncyBgc3ViYCBtdXN0IGFncmVlLiBTbyBgYmlsbGluZ2AgY2Fubm90XG4gKiBiZSBpbXBlcnNvbmF0ZWQgYnkgYW55IG90aGVyIHNlcnZpY2Ug4oCUIG5vdCBldmVuIG9uZSB0aGF0IGhvbGRzIGEgdmFsaWQga2V5IG9mXG4gKiBpdHMgb3duIOKAlCB3aGljaCBpcyB3aGF0IHRoZSBzaGFyZWQgc2VjcmV0IGNvdWxkIG5ldmVyIGd1YXJhbnRlZS5cbiAqXG4gKiBAdGhyb3dzIHtqd3QuSnNvbldlYlRva2VuRXJyb3J9IHVua25vd24gYGtpZGAsIHdyb25nIGFsZ29yaXRobSwgYmFkXG4gKiAgICAgICAgIHNpZ25hdHVyZSwgZXhwaXJlZCwgb3IgYSBgc3ViYCB0aGF0IGRpc2FncmVlcyB3aXRoIHRoZSBzaWduaW5nIGtleS5cbiAqIEB0aHJvd3Mge1NlcnZpY2VLZXlFcnJvcn0gbm8gdmVyaWZpY2F0aW9uIGJ1bmRsZSBjb3VsZCBiZSByZWFkIGF0IGFsbCDigJQgdGhlXG4gKiAgICAgICAgIHRva2VuJ3MgdmFsaWRpdHkgaXMgVU5LTk9XTiBhbmQgdGhlIGNhbGxlciBtdXN0IG5vdCB0cmVhdCBpdCBhcyB2YWxpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeVNlcnZpY2VKd3Q8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgdG9rZW46IHN0cmluZyxcbiAgb3B0aW9uczogeyBraWQ6IHN0cmluZzsgaXNzdWVyPzogc3RyaW5nOyBhdWRpZW5jZT86IHN0cmluZyB9LFxuKTogVCB7XG4gIGNvbnN0IGVudHJ5ID0gdmVyaWZpY2F0aW9uS2V5cygpLmdldChvcHRpb25zLmtpZCk7XG4gIC8vIEVWRVJZIGVtaXNzaW9uIG9mIHRoaXMgY291bnRlciBjYXJyaWVzIHRoZSBzYW1lIGxhYmVsIEtFWVMuIFRoZSBQcm9tZXRoZXVzXG4gIC8vIGNvdW50ZXIgaXMgcmVnaXN0ZXJlZCBsYXppbHkgd2l0aCB3aGF0ZXZlciBrZXlzIGl0cyBmaXJzdCBlbWlzc2lvbiB1c2VkLFxuICAvLyBhbmQgYW4gaW5jcmVtZW50IHdpdGggYSBkaWZmZXJlbnQgc2V0IHRocm93cyDigJQgd2hpY2ggYGVtaXRDb3VudGVyYFxuICAvLyBzd2FsbG93cy4gU28gd2hlbiB0aGUgZmlyc3QgdG9rZW4gYSBwb2QgdmVyaWZpZWQgd2FzIGJhZCAoYHsgcmVzdWx0IH1gXG4gIC8vIGFsb25lKSwgZXZlcnkgbGF0ZXIgYG9rYCBhbmQgYHN1YmplY3RfbWlzbWF0Y2hgIChgeyByZXN1bHQsIHNlcnZpY2UgfWApIHdhc1xuICAvLyBzaWxlbnRseSBkcm9wcGVkIGZvciB0aGUgbGlmZSBvZiB0aGUgcHJvY2VzczogdGhlIG1ldHJpYyB0aGF0IHRlbGxzIHlvdVxuICAvLyBzZXJ2aWNlLXRvLXNlcnZpY2UgYXV0aCBpcyBoZWFsdGh5IHdlbnQgcXVpZXQgZXhhY3RseSB3aGVuIGl0IG1hdHRlcmVkLlxuICBpZiAoIWVudHJ5KSB7XG4gICAgZW1pdENvdW50ZXIoJ3NlcnZpY2VfdG9rZW5fdmVyaWZ5X3RvdGFsJywgeyByZXN1bHQ6ICd1bmtub3duX2tpZCcsIHNlcnZpY2U6ICd1bmtub3duJyB9KTtcbiAgICB0aHJvdyBuZXcgand0Lkpzb25XZWJUb2tlbkVycm9yKGBObyBwdWJsaXNoZWQgc2VydmljZSBrZXkgZm9yIGtpZCAke29wdGlvbnMua2lkfWApO1xuICB9XG4gIGxldCBjbGFpbXM6IFQgJiB7IHN1Yj86IHVua25vd24gfTtcbiAgdHJ5IHtcbiAgICBjbGFpbXMgPSBqd3QudmVyaWZ5KHRva2VuLCBlbnRyeS5rZXksIHtcbiAgICAgIGFsZ29yaXRobXM6IFtTRVJWSUNFX1RPS0VOX0FMR09SSVRITV0sXG4gICAgICAuLi4ob3B0aW9ucy5pc3N1ZXIgPyB7IGlzc3Vlcjogb3B0aW9ucy5pc3N1ZXIgfSA6IHt9KSxcbiAgICAgIC4uLihvcHRpb25zLmF1ZGllbmNlID8geyBhdWRpZW5jZTogb3B0aW9ucy5hdWRpZW5jZSB9IDoge30pLFxuICAgIH0pIGFzIFQgJiB7IHN1Yj86IHVua25vd24gfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBlbWl0Q291bnRlcignc2VydmljZV90b2tlbl92ZXJpZnlfdG90YWwnLCB7IHJlc3VsdDogJ2ludmFsaWQnLCBzZXJ2aWNlOiBlbnRyeS5zZXJ2aWNlTmFtZSB9KTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuICBpZiAoY2xhaW1zLnN1YiAhPT0gYCR7U0VSVklDRV9TVUJKRUNUX1BSRUZJWH0ke2VudHJ5LnNlcnZpY2VOYW1lfWApIHtcbiAgICAvLyBBIHZhbGlkIHNpZ25hdHVyZSBieSB0aGUgV1JPTkcgc2VydmljZTogdGhlIGtleSBiZWxvbmdzIHRvIGBlbnRyeS5zZXJ2aWNlTmFtZWBcbiAgICAvLyBidXQgdGhlIHRva2VuIHNwZWFrcyBmb3Igc29tZW9uZSBlbHNlLiBUaGlzIGlzIHRoZSBjcm9zcy1zZXJ2aWNlIGZvcmdlcnlcbiAgICAvLyB0aGUgc2hhcmVkIHNlY3JldCBtYWRlIHVuZGV0ZWN0YWJsZS5cbiAgICBlbWl0Q291bnRlcignc2VydmljZV90b2tlbl92ZXJpZnlfdG90YWwnLCB7IHJlc3VsdDogJ3N1YmplY3RfbWlzbWF0Y2gnLCBzZXJ2aWNlOiBlbnRyeS5zZXJ2aWNlTmFtZSB9KTtcbiAgICB0aHJvdyBuZXcgand0Lkpzb25XZWJUb2tlbkVycm9yKGBTZXJ2aWNlIHRva2VuIHN1YmplY3QgJHtTdHJpbmcoY2xhaW1zLnN1Yil9IHdhcyBzaWduZWQgYnkgJHtlbnRyeS5zZXJ2aWNlTmFtZX1gKTtcbiAgfVxuICBlbWl0Q291bnRlcignc2VydmljZV90b2tlbl92ZXJpZnlfdG90YWwnLCB7IHJlc3VsdDogJ29rJywgc2VydmljZTogZW50cnkuc2VydmljZU5hbWUgfSk7XG4gIHJldHVybiBjbGFpbXM7XG59XG5cbi8qKlxuICogVHJ1ZSB3aGlsZSB0aGlzIHNlcnZpY2Ugc3RpbGwgcHVibGlzaGVzIG1vcmUgdGhhbiBvbmUgdmVyaWZpY2F0aW9uIGtleSDigJQgaS5lLlxuICogYSBzaWduaW5nLWtleSByb3RhdGlvbiBpcyBvcGVuIGFuZCB0aGUgcmV0aXJpbmcga2V5IGlzIHN0aWxsIHRydXN0ZWQuIEZlZWRzXG4gKiB0aGUgYHNlY3JldF9yb3RhdGlvbl9wcmV2aW91c19zZXR7c2VjcmV0PVwiU0VSVklDRV9TSUdOSU5HX0tFWVwifWAgZ2F1Z2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JldGlyaW5nU2VydmljZUtleVB1Ymxpc2hlZCgpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBtZSA9IHNlcnZpY2VJZGVudGl0eSgpO1xuICAgIHJldHVybiBbLi4udmVyaWZpY2F0aW9uS2V5cygpLnZhbHVlcygpXS5maWx0ZXIoKHYpID0+IHYuc2VydmljZU5hbWUgPT09IG1lKS5sZW5ndGggPiAxO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBUZXN0IHNlYW06IGRyb3AgdGhlIGxvYWRlZCBzaWduaW5nIGtleSwgdGhlIGJ1bmRsZSBhbmQgYW55IGVwaGVtZXJhbCBrZXlzIHNvXG4gKiB0aGUgbmV4dCBzaWduL3ZlcmlmeSByZS1yZWFkcyB0aGUgZW52aXJvbm1lbnQuIERvbid0IGNhbGwgZnJvbSBwcm9kdWN0aW9uIGNvZGVcbiAqIOKAlCByb3RhdGlvbiBpcyBwaWNrZWQgdXAgYnkgdGhlIHJlZnJlc2ggaW50ZXJ2YWwgYW5kIHRoZSBtdGltZSBjaGVjay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldFNlcnZpY2VLZXlzRm9yVGVzdHMoKTogdm9pZCB7XG4gIGxvY2FsS2V5ID0gdW5kZWZpbmVkO1xuICBidW5kbGUgPSB1bmRlZmluZWQ7XG4gIGVwaGVtZXJhbEtleXMgPSB1bmRlZmluZWQ7XG4gIGVwaGVtZXJhbFdhcm5lZCA9IGZhbHNlO1xufVxuIl19
356
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1rZXlzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL3NlcnZpY2Uta2V5cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtERztBQUVILE9BQU8sTUFBTSxFQUFFLEVBQWtCLE1BQU0sUUFBUSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQzVDLE9BQU8sR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUMvQixPQUFPLEVBQUUsVUFBVSxFQUFFLHFCQUFxQixFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBa0IsTUFBTSxpQkFBaUIsQ0FBQztBQUNySCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVwRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7QUFFNUMsdUVBQXVFO0FBQ3ZFLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLE9BQU8sQ0FBQztBQUUvQyx1RkFBdUY7QUFDdkYsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsVUFBVSxDQUFDO0FBRWpELGlGQUFpRjtBQUNqRixNQUFNLDBCQUEwQixHQUFHLE9BQU8sQ0FBQyxDQUFDLFlBQVk7QUFvQnhELDZFQUE2RTtBQUM3RSxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxLQUFLO0lBQ3hDLFlBQVksT0FBZTtRQUN6QixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLGlCQUFpQixDQUFDO0lBQ2hDLENBQUM7Q0FD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SUFBSSxDQUFDO1FBQ0gsTUFBTSxFQUFFLEdBQUcsZUFBZSxFQUFFLENBQUM7UUFDN0IsT0FBTyxDQUFDLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSx5QkFBeUI7SUFDdkMsUUFBUSxHQUFHLFNBQVMsQ0FBQztJQUNyQixNQUFNLEdBQUcsU0FBUyxDQUFDO0lBQ25CLGFBQWEsR0FBRyxTQUFTLENBQUM7SUFDMUIsZUFBZSxHQUFHLEtBQUssQ0FBQztBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogUGVyLXNlcnZpY2Ugc2lnbmluZyBrZXlzIGZvciBJTlRFUk5BTCBzZXJ2aWNlLXRvLXNlcnZpY2UgdG9rZW5zLlxuICpcbiAqIEJlZm9yZSB0aGlzLCBldmVyeSBzZXJ2aWNlIGhlbGQgb25lIHNoYXJlZCBgSldUX1NFQ1JFVGAsIHNvIGFueSBzZXJ2aWNlIGNvdWxkXG4gKiBtaW50IGEgdG9rZW4gbmFtaW5nIGFueSBPVEhFUiBzZXJ2aWNlIOKAlCBcImJpbGxpbmcgc2FpZCBzb1wiIHdhcyB1bmZhbHNpZmlhYmxlLFxuICogYW5kIGEgc2luZ2xlIGNvbXByb21pc2VkIHdvcmtsb2FkIGNvdWxkIHNwZWFrIGZvciB0aGUgd2hvbGUgZmxlZXQuIE5vdyBlYWNoXG4gKiBzZXJ2aWNlIHNpZ25zIHdpdGggaXRzIE9XTiBFUzI1NiAoRUMgUC0yNTYpIGtleSBhbmQgY29uc3VtZXJzIHZlcmlmeSBhZ2FpbnN0XG4gKiB0aGUgcHVibGljIGhhbHZlcy4gVGhlIGBraWRgIGlzIGJvdW5kIHRvIHRoZSBzaWduZXIncyBOQU1FLCBzbyBhIHRva2VuIHdob3NlXG4gKiBgc3ViYCBzYXlzIGBzZXJ2aWNlOmJpbGxpbmdgIGJ1dCB3YXMgc2lnbmVkIHdpdGggY29tcGxpYW5jZSdzIGtleSBpcyBhXG4gKiBmb3JnZXJ5LCBub3QgYSB2YWxpZCB0b2tlbiB3aXRoIGEgY29uZnVzaW5nIHN1YmplY3QuXG4gKlxuICogIyMgV2h5IHB1YmxpYyBrZXlzIGFyZSBkaXN0cmlidXRlZCBieSBDT05GSUcsIG5vdCBieSBwZXItc2VydmljZSBKV0tTIGVuZHBvaW50c1xuICpcbiAqIFRoZSB1c2VyIGNoYWluIGZldGNoZXMgcGxhdGZvcm0ncyBKV0tTIG92ZXIgSFRUUCBiZWNhdXNlIHRoZXJlIGlzIGV4YWN0bHlcbiAqIG9uZSBzaWduZXIgYW5kIGl0IGlzIHRoZSBvbmUgc2VydmljZSB0aGF0IG11c3QgYmUgdXAgZm9yIGFueWJvZHkgdG8gc2lnbiBpbi5cbiAqIFRoZSBzZXJ2aWNlIGNoYWluIGlzIHRoZSBvcHBvc2l0ZSBzaGFwZSwgYW5kIHRocmVlIHByb3BlcnRpZXMgZGVjaWRlZCBpdDpcbiAqXG4gKiAgMS4gKipgdmVyaWZ5U2VydmljZVByaW5jaXBhbGAgbXVzdCBzdGF5IHN5bmNocm9ub3VzLioqIFRoZSBnbG9iYWwgcmF0ZVxuICogICAgIGxpbWl0ZXIncyBgc2tpcGAgYW5kIGFwcC1mYWN0b3J5J3MgYC93YXJtdXBgIGd1YXJkIHZlcmlmeSBhIHNlcnZpY2UgdG9rZW5cbiAqICAgICBCRUZPUkUgYHJlcXVpcmVBdXRoYCBydW5zLCBpbiBzeW5jaHJvbm91cyBFeHByZXNzIGNhbGxiYWNrcy4gQW4gSFRUUCBKV0tTXG4gKiAgICAgZmV0Y2ggd291bGQgZm9yY2UgdGhvc2UgYXN5bmMg4oCUIGEgY2hhbmdlIHRoYXQgcmVhY2hlcyBpbnRvIGV2ZXJ5XG4gKiAgICAgc2VydmljZSdzIGxpbWl0ZXIgd2lyaW5nLlxuICogIDIuICoqTm8gYXZhaWxhYmlsaXR5IGNvdXBsaW5nLioqIFdpdGggcGVyLXNlcnZpY2UgSldLUyBlbmRwb2ludHMsIHZlcmlmeWluZyBhXG4gKiAgICAgdG9rZW4gbWludGVkIGJ5IGBiaWxsaW5nYCBuZWVkcyBgYmlsbGluZ2AgdG8gYmUgcmVhY2hhYmxlIOKAlCBzbyBiaWxsaW5nXG4gKiAgICAgYmVpbmcgZG93biB3b3VsZCBzdG9wIHBsYXRmb3JtIGZyb20gYWNjZXB0aW5nIGJpbGxpbmcncyBpbi1mbGlnaHQgY2FsbHMsXG4gKiAgICAgdHVybmluZyBvbmUgb3V0YWdlIGludG8gc2V2ZXJhbC4gQSBtb3VudGVkIGZpbGUgaGFzIG5vIHN1Y2ggZWRnZS5cbiAqICAzLiAqKk5vIE7Dl04gYWRkcmVzcyBjb25maWcuKiogMTAgc2VydmljZXMgd291bGQgZWFjaCBuZWVkIGV2ZXJ5IHBlZXInc1xuICogICAgIGhvc3QvcG9ydCAoYW5kIGNvbXBvc2UsIHdoaWNoIGhhcyBubyBtZXNoLCB3b3VsZCBuZWVkIHRoZW0gdG9vKS5cbiAqXG4gKiBTbyB0aGUgZGVwbG95IGdlbmVyYXRlcyBvbmUga2V5cGFpciBwZXIgc2VydmljZSwgbW91bnRzIGVhY2ggcHJpdmF0ZSBrZXkgT05MWVxuICogaW50byBpdHMgb3duIHNlcnZpY2UsIGFuZCBtb3VudHMgT05FIHB1YmxpYyBidW5kbGUgKHJlYWQtb25seSkgZXZlcnl3aGVyZTpcbiAqXG4gKiAgIGBTRVJWSUNFX1NJR05JTkdfS0VZX0ZJTEVgICB0aGlzIHNlcnZpY2UncyBFQyBQLTI1NiBwcml2YXRlIGtleSAoUEtDUyM4IFBFTSlcbiAqICAgYFNFUlZJQ0VfS0VZX0JVTkRMRV9GSUxFYCAgIGB7IFwic2VydmljZXNcIjogeyBcIjxuYW1lPlwiOiB7IFwia2V5c1wiOiBbPGp3az7igKZdIH0gfSB9YFxuICpcbiAqIFJvdGF0aW9uIGlzIGJ5IGBraWRgLCBpbiB0aGUgc2FtZSBzaGFwZSBhcyB0aGUgdXNlciBjaGFpbjogYWRkIHRoZSBuZXcgcHVibGljXG4gKiBrZXkgdG8gdGhlIGJ1bmRsZSAodGhlIHNlcnZpY2Ugbm93IHB1Ymxpc2hlcyB0d28pLCByb2xsIHRoZSBidW5kbGUgb3V0LCBzd2FwXG4gKiB0aGF0IHNlcnZpY2UncyBwcml2YXRlIGtleSwgdGhlbiBkcm9wIHRoZSByZXRpcmVkIHB1YmxpYyBrZXkuIFRoZSBidW5kbGUgaXNcbiAqIHJlLXJlYWQgb24gYW4gaW50ZXJ2YWwgQU5EIG9uIGFuIG10aW1lIGNoYW5nZSwgc28gYSByb3RhdGlvbiBuZWVkcyBubyByZXN0YXJ0LlxuICogYGRlcGxveS9iaW4vc2VydmljZS1zaWduaW5nLWtleXMuc2hgIGdlbmVyYXRlcyBhbmQgcm90YXRlcyBib3RoIGhhbHZlcy5cbiAqXG4gKiAjIyBFcGhlbWVyYWwgbW9kZVxuICpcbiAqIFdpdGggbm8gYFNFUlZJQ0VfU0lHTklOR19LRVlfRklMRWAgY29uZmlndXJlZCwgYSBrZXlwYWlyIGlzIGdlbmVyYXRlZFxuICogSU4tUFJPQ0VTUyBwZXIgcmVxdWVzdGVkIHNlcnZpY2UgbmFtZSBhbmQgcmVnaXN0ZXJlZCBpbiB0aGUgaW4tbWVtb3J5IGJ1bmRsZS5cbiAqIFRoYXQga2VlcHMgc2luZ2xlLXByb2Nlc3Mgc3VpdGVzIGFuZCBsb2NhbCBvbmUtb2ZmIHNjcmlwdHMgd29ya2luZyB3aXRoIG5vIGtleVxuICogbWF0ZXJpYWwsIGFuZCBpdCBjYW4gbmV2ZXIgd2lkZW4gdHJ1c3Q6IHRoZSBvbmx5IHZlcmlmaWVyIHRoYXQgYWNjZXB0cyBzdWNoIGFcbiAqIHRva2VuIGlzIHRoZSBwcm9jZXNzIHRoYXQgbWludGVkIGl0LiBJdCBpcyBsb2dnZWQgb25jZSBhdCB3YXJuIGxldmVsLCBhbmRcbiAqIGNvdW50ZWQsIGJlY2F1c2UgaW4gYSByZWFsIGRlcGxveW1lbnQgaXQgbWVhbnMgdGhpcyBzZXJ2aWNlJ3MgcGVlcnMgd2lsbFxuICogcmVqZWN0IGV2ZXJ5dGhpbmcgaXQgc2VuZHMuXG4gKi9cblxuaW1wb3J0IGNyeXB0bywgeyB0eXBlIEtleU9iamVjdCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyByZWFkRmlsZVN5bmMsIHN0YXRTeW5jIH0gZnJvbSAnZnMnO1xuaW1wb3J0IGp3dCBmcm9tICdqc29ud2VidG9rZW4nO1xuaW1wb3J0IHsgY29tcGFjdEp3cywgZW5jb2RlSndzU2lnbmluZ0lucHV0LCBwdWJsaWNKd2tGcm9tLCBwdWJsaWNLZXlGcm9tSndrLCB0eXBlIFB1YmxpY0p3ayB9IGZyb20gJy4uL3V0aWxzL2p3ay5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZW1pdENvdW50ZXIgfSBmcm9tICcuLi91dGlscy9tZXRyaWMtZW1pdHRlci5qcyc7XG5pbXBvcnQgeyBlcnJvck1lc3NhZ2UgfSBmcm9tICcuLi91dGlscy9yZXNwb25zZS5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignc2VydmljZS1rZXlzJyk7XG5cbi8qKiBUaGUgT05MWSBhbGdvcml0aG0gYW4gaW50ZXJuYWwgc2VydmljZSB0b2tlbiBtYXkgYmUgc2lnbmVkIHdpdGguICovXG5leHBvcnQgY29uc3QgU0VSVklDRV9UT0tFTl9BTEdPUklUSE0gPSAnRVMyNTYnO1xuXG4vKiogU3ViamVjdCBwcmVmaXggbmFtaW5nIHRoZSBjYWxsaW5nIHNlcnZpY2Ugb24gYSBzZXJ2aWNlIHRva2VuIChgc2VydmljZTo8bmFtZT5gKS4gKi9cbmV4cG9ydCBjb25zdCBTRVJWSUNFX1NVQkpFQ1RfUFJFRklYID0gJ3NlcnZpY2U6JztcblxuLyoqIEhvdyBsb25nIGEgbG9hZGVkIGJ1bmRsZSBpcyBzZXJ2ZWQgYmVmb3JlIGl0IGlzIHJlLXJlYWQgKHJvdGF0aW9uIHBpY2t1cCkuICovXG5jb25zdCBCVU5ETEVfUkVGUkVTSF9JTlRFUlZBTF9NUyA9IDMwMF8wMDA7IC8vIDUgbWludXRlc1xuXG4vKiogT25lIHNlcnZpY2UncyBwdWJsaXNoZWQgdmVyaWZpY2F0aW9uIGtleXMsIGFzIHRoZXkgYXBwZWFyIGluIHRoZSBidW5kbGUgZmlsZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZUtleUVudHJ5IHtcbiAga2V5czogUHVibGljSndrW107XG59XG5cbi8qKiBUaGUgZG9jdW1lbnQgYFNFUlZJQ0VfS0VZX0JVTkRMRV9GSUxFYCBob2xkczogZXZlcnkgc2VydmljZSdzIHB1YmxpYyBrZXlzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlS2V5QnVuZGxlIHtcbiAgc2VydmljZXM6IFJlY29yZDxzdHJpbmcsIFNlcnZpY2VLZXlFbnRyeT47XG59XG5cbi8qKiBBIHNpZ25pbmcga2V5IHRoaXMgcHJvY2VzcyBob2xkcywgaW4gdGhlIGZvcm1zIHNpZ25pbmcgbmVlZHMuICovXG5pbnRlcmZhY2UgTG9jYWxTaWduaW5nS2V5IHtcbiAgc2VydmljZU5hbWU6IHN0cmluZztcbiAga2lkOiBzdHJpbmc7XG4gIHByaXZhdGVLZXk6IEtleU9iamVjdDtcbiAgcHVibGljSndrOiBQdWJsaWNKd2s7XG59XG5cbi8qKiBUaGUgYnVuZGxlIGNvdWxkIG5vdCBiZSBsb2FkZWQgb3IgZG9lcyBub3Qga25vdyB0aGUga2V5IGEgdG9rZW4gbmFtZXMuICovXG5leHBvcnQgY2xhc3MgU2VydmljZUtleUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnU2VydmljZUtleUVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgcHJvY2VzcydzIHNlcnZpY2UgaWRlbnRpdHkg4oCUIHRoZSBgPG5hbWU+YCBpbiBgc2VydmljZTo8bmFtZT5gIGFuZCB0aGVcbiAqIG5hbWUgaXRzIGtleSBpcyBwdWJsaXNoZWQgdW5kZXIuIGBTRVJWSUNFX05BTUVgIGlzIGFscmVhZHkgc2V0IHBlciBzZXJ2aWNlIGluXG4gKiBldmVyeSBkZXBsb3kgdGFyZ2V0IChjb21wb3NlLCBtaW5pa3ViZSwgZWMyLCBla3MpLCBhbmQgaXMgdGhlIHNhbWUgdmFsdWUgdGhlXG4gKiBhdWRpdCBhbmQgbWV0cmljIGxhYmVscyB1c2UsIHNvIHRoZXJlIGlzIG9uZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIFwid2hvIGFtIElcIi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcnZpY2VJZGVudGl0eSgpOiBzdHJpbmcge1xuICByZXR1cm4gcHJvY2Vzcy5lbnYuU0VSVklDRV9OQU1FIHx8ICdhcGknO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIExvY2FsIHNpZ25pbmcga2V5XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxubGV0IGxvY2FsS2V5OiBMb2NhbFNpZ25pbmdLZXkgfCB1bmRlZmluZWQ7XG5sZXQgZXBoZW1lcmFsS2V5czogTWFwPHN0cmluZywgTG9jYWxTaWduaW5nS2V5PiB8IHVuZGVmaW5lZDtcbmxldCBlcGhlbWVyYWxXYXJuZWQgPSBmYWxzZTtcblxuZnVuY3Rpb24gbG9hZENvbmZpZ3VyZWRTaWduaW5nS2V5KGZpbGU6IHN0cmluZyk6IExvY2FsU2lnbmluZ0tleSB7XG4gIGNvbnN0IHNlcnZpY2VOYW1lID0gc2VydmljZUlkZW50aXR5KCk7XG4gIGxldCBwcml2YXRlS2V5OiBLZXlPYmplY3Q7XG4gIHRyeSB7XG4gICAgcHJpdmF0ZUtleSA9IGNyeXB0by5jcmVhdGVQcml2YXRlS2V5KHJlYWRGaWxlU3luYyhmaWxlLCAndXRmOCcpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgU2VydmljZUtleUVycm9yKGBDb3VsZCBub3QgcmVhZCB0aGUgc2VydmljZSBzaWduaW5nIGtleSBhdCAke2ZpbGV9OiAke2Vycm9yTWVzc2FnZShlcnJvcil9YCk7XG4gIH1cbiAgLy8gcHVibGljSndrRnJvbSByZWplY3RzIGFueXRoaW5nIGJ1dCBhbiBFQyBQLTI1NiBrZXksIHNvIGEgc2VydmljZSBjb25maWd1cmVkXG4gIC8vIHdpdGggKHNheSkgYW4gUlNBIGtleSBmYWlscyBIRVJFIHJhdGhlciB0aGFuIG1pbnRpbmcgdG9rZW5zIG5vYm9keSB2ZXJpZmllcy5cbiAgY29uc3QgcHVibGljSndrID0gcHVibGljSndrRnJvbShjcnlwdG8uY3JlYXRlUHVibGljS2V5KHByaXZhdGVLZXkpKTtcbiAgcmV0dXJuIHsgc2VydmljZU5hbWUsIGtpZDogcHVibGljSndrLmtpZCwgcHJpdmF0ZUtleSwgcHVibGljSndrIH07XG59XG5cbi8qKlxuICogVGhlIGluLXByb2Nlc3Mga2V5IGZvciBgc2VydmljZU5hbWVgIGluIGVwaGVtZXJhbCBtb2RlLCBnZW5lcmF0ZWQgb24gZmlyc3RcbiAqIHVzZSBhbmQgcmVnaXN0ZXJlZCBpbiB0aGUgaW4tbWVtb3J5IGJ1bmRsZSBzbyB0aGlzIHByb2Nlc3MgY2FuIHZlcmlmeSBpdHMgb3duXG4gKiB0b2tlbnMuIEtleWVkIGJ5IE5BTUUgKG5vdCBqdXN0IG9uZSBrZXkpIHNvIGEgc2luZ2xlLXByb2Nlc3Mgc3VpdGUgY2FuIG1pbnRcbiAqIHRva2VucyBmb3Igc2V2ZXJhbCBzZXJ2aWNlcywgYXMgdGhlIHJlYWwgZmxlZXQgZG9lcyBhY3Jvc3MgcHJvY2Vzc2VzLlxuICovXG5mdW5jdGlvbiBlcGhlbWVyYWxTaWduaW5nS2V5KHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBMb2NhbFNpZ25pbmdLZXkge1xuICBlcGhlbWVyYWxLZXlzID8/PSBuZXcgTWFwKCk7XG4gIGNvbnN0IGV4aXN0aW5nID0gZXBoZW1lcmFsS2V5cy5nZXQoc2VydmljZU5hbWUpO1xuICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZztcblxuICBpZiAoIWVwaGVtZXJhbFdhcm5lZCkge1xuICAgIGVwaGVtZXJhbFdhcm5lZCA9IHRydWU7XG4gICAgZW1pdENvdW50ZXIoJ3NlcnZpY2Vfc2lnbmluZ19lcGhlbWVyYWxfa2V5X3RvdGFsJywgeyBzZXJ2aWNlOiBzZXJ2aWNlSWRlbnRpdHkoKSB9KTtcbiAgICBsb2dnZXIud2FybignU0VSVklDRV9TSUdOSU5HX0tFWV9GSUxFIGlzIG5vdCBzZXQg4oCUIG1pbnRpbmcgaW50ZXJuYWwgc2VydmljZSB0b2tlbnMgd2l0aCBhbiBFUEhFTUVSQUwga2V5LiBPbmx5IHRoaXMgcHJvY2VzcyB3aWxsIGFjY2VwdCB0aGVtOyBldmVyeSBwZWVyIHdpbGwgcmVqZWN0IHRoZW0uIFNldCBTRVJWSUNFX1NJR05JTkdfS0VZX0ZJTEUgKyBTRVJWSUNFX0tFWV9CVU5ETEVfRklMRSAoZGVwbG95L2Jpbi9zZXJ2aWNlLXNpZ25pbmcta2V5cy5zaCkuJyk7XG4gIH1cbiAgY29uc3QgeyBwcml2YXRlS2V5LCBwdWJsaWNLZXkgfSA9IGNyeXB0by5nZW5lcmF0ZUtleVBhaXJTeW5jKCdlYycsIHsgbmFtZWRDdXJ2ZTogJ3ByaW1lMjU2djEnIH0pO1xuICBjb25zdCBwdWJsaWNKd2sgPSBwdWJsaWNKd2tGcm9tKHB1YmxpY0tleSk7XG4gIGNvbnN0IGdlbmVyYXRlZDogTG9jYWxTaWduaW5nS2V5ID0geyBzZXJ2aWNlTmFtZSwga2lkOiBwdWJsaWNKd2sua2lkLCBwcml2YXRlS2V5LCBwdWJsaWNKd2sgfTtcbiAgZXBoZW1lcmFsS2V5cy5zZXQoc2VydmljZU5hbWUsIGdlbmVyYXRlZCk7XG4gIHJldHVybiBnZW5lcmF0ZWQ7XG59XG5cbi8qKiBXaGV0aGVyIHRoaXMgcHJvY2VzcyBzaWducyB3aXRoIGEgbW91bnRlZCBrZXkgKGBjb25maWd1cmVkYCkgb3IgYW4gaW4tcHJvY2VzcyBvbmUuICovXG5leHBvcnQgZnVuY3Rpb24gc2VydmljZUtleU1vZGUoKTogJ2NvbmZpZ3VyZWQnIHwgJ2VwaGVtZXJhbCcge1xuICByZXR1cm4gcHJvY2Vzcy5lbnYuU0VSVklDRV9TSUdOSU5HX0tFWV9GSUxFID8gJ2NvbmZpZ3VyZWQnIDogJ2VwaGVtZXJhbCc7XG59XG5cbi8qKlxuICogVGhlIGtleSBgc2VydmljZU5hbWVgIG11c3QgYmUgc2lnbmVkIHdpdGguXG4gKlxuICogSW4gYGNvbmZpZ3VyZWRgIG1vZGUgdGhlcmUgaXMgZXhhY3RseSBPTkUga2V5IOKAlCB0aGlzIHNlcnZpY2UncyDigJQgc28gYSByZXF1ZXN0XG4gKiB0byBzaWduIGFzIHNvbWUgT1RIRVIgc2VydmljZSBpcyBhIGJ1ZyBhbmQgdGhyb3dzOiBzdWNoIGEgdG9rZW4gd291bGQgYmVcbiAqIHVudmVyaWZpYWJsZSBldmVyeXdoZXJlIChpdHMgYGtpZGAgbmFtZXMgdGhpcyBzZXJ2aWNlLCBpdHMgYHN1YmAgYW5vdGhlcikuXG4gKiBGYWlsaW5nIGF0IHRoZSBtaW50IG1ha2VzIHRoYXQgYW4gaW1tZWRpYXRlLCBvYnZpb3VzIGVycm9yIGluc3RlYWQgb2YgYVxuICogcnVudGltZSA0MDEuXG4gKi9cbmZ1bmN0aW9uIHNpZ25pbmdLZXlGb3Ioc2VydmljZU5hbWU6IHN0cmluZyk6IExvY2FsU2lnbmluZ0tleSB7XG4gIGNvbnN0IGZpbGUgPSBwcm9jZXNzLmVudi5TRVJWSUNFX1NJR05JTkdfS0VZX0ZJTEU7XG4gIGlmICghZmlsZSkgcmV0dXJuIGVwaGVtZXJhbFNpZ25pbmdLZXkoc2VydmljZU5hbWUpO1xuXG4gIGlmICghbG9jYWxLZXkgfHwgbG9jYWxLZXkuc2VydmljZU5hbWUgIT09IHNlcnZpY2VJZGVudGl0eSgpKSB7XG4gICAgbG9jYWxLZXkgPSBsb2FkQ29uZmlndXJlZFNpZ25pbmdLZXkoZmlsZSk7XG4gIH1cbiAgaWYgKHNlcnZpY2VOYW1lICE9PSBsb2NhbEtleS5zZXJ2aWNlTmFtZSkge1xuICAgIHRocm93IG5ldyBTZXJ2aWNlS2V5RXJyb3IoXG4gICAgICBgVGhpcyBwcm9jZXNzIGlzICcke2xvY2FsS2V5LnNlcnZpY2VOYW1lfScgYW5kIGhvbGRzIG9ubHkgaXRzIG93biBzaWduaW5nIGtleSwgc28gaXQgY2Fubm90IG1pbnQgYSB0b2tlbiBmb3IgJyR7c2VydmljZU5hbWV9Jy4gYFxuICAgICAgKyAnTmFtZSB0aGUgY2FsbGluZyBzZXJ2aWNlIGNvcnJlY3RseSwgb3IgZ2l2ZSB0aGUgY2FsbGVyIGl0cyBvd24ga2V5LicsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gbG9jYWxLZXk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVmVyaWZpY2F0aW9uIGJ1bmRsZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmludGVyZmFjZSBMb2FkZWRCdW5kbGUge1xuICAvKiogYGtpZGAg4oaSIHRoZSBzZXJ2aWNlIHRoYXQgcHVibGlzaGVkIGl0LCBwbHVzIHRoZSB2ZXJpZmljYXRpb24ga2V5LiAqL1xuICBieUtpZDogTWFwPHN0cmluZywgeyBzZXJ2aWNlTmFtZTogc3RyaW5nOyBrZXk6IEtleU9iamVjdCB9PjtcbiAgbG9hZGVkQXQ6IG51bWJlcjtcbiAgbXRpbWVNczogbnVtYmVyO1xufVxuXG5sZXQgYnVuZGxlOiBMb2FkZWRCdW5kbGUgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIHBhcnNlQnVuZGxlKHJhdzogc3RyaW5nLCBmaWxlOiBzdHJpbmcpOiBNYXA8c3RyaW5nLCB7IHNlcnZpY2VOYW1lOiBzdHJpbmc7IGtleTogS2V5T2JqZWN0IH0+IHtcbiAgbGV0IGRvY3VtZW50OiB1bmtub3duO1xuICB0cnkge1xuICAgIGRvY3VtZW50ID0gSlNPTi5wYXJzZShyYXcpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBTZXJ2aWNlS2V5RXJyb3IoYCR7ZmlsZX0gaXMgbm90IHZhbGlkIEpTT046ICR7ZXJyb3JNZXNzYWdlKGVycm9yKX1gKTtcbiAgfVxuICBjb25zdCBzZXJ2aWNlcyA9IChkb2N1bWVudCBhcyBQYXJ0aWFsPFNlcnZpY2VLZXlCdW5kbGU+KT8uc2VydmljZXM7XG4gIGlmICghc2VydmljZXMgfHwgdHlwZW9mIHNlcnZpY2VzICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBTZXJ2aWNlS2V5RXJyb3IoYCR7ZmlsZX0gaGFzIG5vIFwic2VydmljZXNcIiBvYmplY3RgKTtcbiAgfVxuICBjb25zdCBieUtpZCA9IG5ldyBNYXA8c3RyaW5nLCB7IHNlcnZpY2VOYW1lOiBzdHJpbmc7IGtleTogS2V5T2JqZWN0IH0+KCk7XG4gIGZvciAoY29uc3QgW3NlcnZpY2VOYW1lLCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXMoc2VydmljZXMpKSB7XG4gICAgZm9yIChjb25zdCBqd2sgb2YgZW50cnk/LmtleXMgPz8gW10pIHtcbiAgICAgIGlmICghandrPy5raWQpIGNvbnRpbnVlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYnlLaWQuc2V0KGp3ay5raWQsIHsgc2VydmljZU5hbWUsIGtleTogcHVibGljS2V5RnJvbUp3ayhqd2spIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gT25lIHVudXNhYmxlIGVudHJ5IG11c3Qgbm90IGRpc2NhcmQgdGhlIHJlc3Qgb2YgdGhlIGJ1bmRsZSDigJQgdGhlIHNhbWVcbiAgICAgICAgLy8gcnVsZSB0aGUgSldLUyBjYWNoZSBhcHBsaWVzIHRvIHBsYXRmb3JtJ3MgcHVibGlzaGVkIHNldC5cbiAgICAgICAgbG9nZ2VyLndhcm4oJ1NraXBwaW5nIHVudXNhYmxlIHNlcnZpY2Uga2V5JywgeyBzZXJ2aWNlTmFtZSwga2lkOiBqd2sua2lkLCBlcnJvcjogZXJyb3JNZXNzYWdlKGVycm9yKSB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGJ5S2lkLnNpemUgPT09IDApIHRocm93IG5ldyBTZXJ2aWNlS2V5RXJyb3IoYCR7ZmlsZX0gY29udGFpbmVkIG5vIHVzYWJsZSBzZXJ2aWNlIGtleXNgKTtcbiAgcmV0dXJuIGJ5S2lkO1xufVxuXG4vKipcbiAqIFRoZSBga2lkYCDihpIgc2VydmljZSBtYXAsIHJlLXJlYWQgd2hlbiB0aGUgcmVmcmVzaCBpbnRlcnZhbCBoYXMgcGFzc2VkIG9yIHRoZVxuICogZmlsZSdzIG10aW1lIGNoYW5nZWQgKHNvIGEgcm90YXRpb24gaXMgcGlja2VkIHVwIHdpdGhvdXQgYSByZXN0YXJ0KS5cbiAqXG4gKiBJbiBlcGhlbWVyYWwgbW9kZSB0aGUgXCJidW5kbGVcIiBpcyB3aGF0ZXZlciB0aGlzIHByb2Nlc3MgZ2VuZXJhdGVkIGZvciBpdHNlbGYuXG4gKiBOZXZlciB0aHJvd3MgZm9yIGEgbWlzc2luZyBmaWxlIGluIHRoYXQgbW9kZSDigJQgaXQganVzdCBob2xkcyB0aG9zZSBrZXlzLlxuICovXG5mdW5jdGlvbiB2ZXJpZmljYXRpb25LZXlzKCk6IE1hcDxzdHJpbmcsIHsgc2VydmljZU5hbWU6IHN0cmluZzsga2V5OiBLZXlPYmplY3QgfT4ge1xuICBjb25zdCBmaWxlID0gcHJvY2Vzcy5lbnYuU0VSVklDRV9LRVlfQlVORExFX0ZJTEU7XG4gIGlmICghZmlsZSkge1xuICAgIGNvbnN0IGxvY2FsID0gbmV3IE1hcDxzdHJpbmcsIHsgc2VydmljZU5hbWU6IHN0cmluZzsga2V5OiBLZXlPYmplY3QgfT4oKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBlcGhlbWVyYWxLZXlzPy52YWx1ZXMoKSA/PyBbXSkge1xuICAgICAgbG9jYWwuc2V0KGtleS5raWQsIHsgc2VydmljZU5hbWU6IGtleS5zZXJ2aWNlTmFtZSwga2V5OiBjcnlwdG8uY3JlYXRlUHVibGljS2V5KGtleS5wcml2YXRlS2V5KSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsO1xuICB9XG5cbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgbGV0IG10aW1lTXMgPSAwO1xuICB0cnkge1xuICAgIG10aW1lTXMgPSBzdGF0U3luYyhmaWxlKS5tdGltZU1zO1xuICB9IGNhdGNoIHtcbiAgICAvLyBVbnJlYWRhYmxlIG5vdzoga2VlcCBzZXJ2aW5nIGEgYnVuZGxlIGFscmVhZHkgaW4gaGFuZCAocHVibGljIGtleXMgZG9uJ3RcbiAgICAvLyBleHBpcmUsIGFuZCByZWZ1c2luZyBldmVyeSBpbnRlcm5hbCBjYWxsIGJlY2F1c2UgYSBtb3VudCBibGlwcGVkIHdvdWxkIGJlXG4gICAgLy8gYSBzZWxmLWluZmxpY3RlZCBvdXRhZ2UpLiBXaXRoIG5vdGhpbmcgaW4gaGFuZCwgZmFpbCBjbG9zZWQgYmVsb3cuXG4gICAgaWYgKGJ1bmRsZSkgcmV0dXJuIGJ1bmRsZS5ieUtpZDtcbiAgfVxuICBpZiAoYnVuZGxlICYmIGJ1bmRsZS5tdGltZU1zID09PSBtdGltZU1zICYmIG5vdyAtIGJ1bmRsZS5sb2FkZWRBdCA8IEJVTkRMRV9SRUZSRVNIX0lOVEVSVkFMX01TKSB7XG4gICAgcmV0dXJuIGJ1bmRsZS5ieUtpZDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgYnlLaWQgPSBwYXJzZUJ1bmRsZShyZWFkRmlsZVN5bmMoZmlsZSwgJ3V0ZjgnKSwgZmlsZSk7XG4gICAgYnVuZGxlID0geyBieUtpZCwgbG9hZGVkQXQ6IG5vdywgbXRpbWVNcyB9O1xuICAgIHJldHVybiBieUtpZDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoYnVuZGxlKSB7XG4gICAgICBsb2dnZXIud2FybignU2VydmljZSBrZXkgYnVuZGxlIHJlbG9hZCBmYWlsZWQ7IGNvbnRpbnVpbmcgb24gdGhlIGxvYWRlZCBjb3B5JywgeyBmaWxlLCBlcnJvcjogZXJyb3JNZXNzYWdlKGVycm9yKSB9KTtcbiAgICAgIHJldHVybiBidW5kbGUuYnlLaWQ7XG4gICAgfVxuICAgIHRocm93IGVycm9yIGluc3RhbmNlb2YgU2VydmljZUtleUVycm9yID8gZXJyb3IgOiBuZXcgU2VydmljZUtleUVycm9yKFN0cmluZyhlcnJvcikpO1xuICB9XG59XG5cbi8qKlxuICogV2hldGhlciBga2lkYCBiZWxvbmdzIHRvIGFuIGludGVybmFsIFNFUlZJQ0Uga2V5LiBUaGlzIGlzIGhvdyBhIGJlYXJlciB0b2tlblxuICogaXMgcm91dGVkIGJldHdlZW4gdGhlIHR3byBFUzI1NiBjaGFpbnM6IGJvdGggdXNlciBhbmQgc2VydmljZSB0b2tlbnMgYXJlXG4gKiBFUzI1NiB3aXRoIGEgYGtpZGAsIGFuZCBga2lkYCBpcyBhbiBSRkMgNzYzOCB0aHVtYnByaW50LCBzbyBvd25lcnNoaXAgb2YgdGhlXG4gKiBpZCDigJQgbm90IGEgY2xhaW0gaW5zaWRlIHRoZSB0b2tlbiDigJQgZGVjaWRlcyB3aGljaCBrZXkgc2V0IG1heSB2ZXJpZnkgaXQuXG4gKiBSZXR1cm5zIGBmYWxzZWAgKG5ldmVyIHRocm93cykgd2hlbiBubyBidW5kbGUgY2FuIGJlIHJlYWQ7IHRoZSB0b2tlbiB0aGVuXG4gKiB0YWtlcyB0aGUgdXNlciBjaGFpbiBhbmQgaXMgcmVqZWN0ZWQgdGhlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NlcnZpY2VLaWQoa2lkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gdmVyaWZpY2F0aW9uS2V5cygpLmhhcyhraWQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqIEV2ZXJ5IHNlcnZpY2UgbmFtZSB0aGUgYnVuZGxlIHB1Ymxpc2hlcyBhIGtleSBmb3IuIERpYWdub3N0aWNzIGFuZCB0ZXN0cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBrbm93blNlcnZpY2VOYW1lcygpOiBzdHJpbmdbXSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIFsuLi5uZXcgU2V0KFsuLi52ZXJpZmljYXRpb25LZXlzKCkudmFsdWVzKCldLm1hcCgodikgPT4gdi5zZXJ2aWNlTmFtZSkpXS5zb3J0KCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNpZ24gLyB2ZXJpZnlcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFNpZ24gYGNsYWltc2AgYXMgdGhpcyBzZXJ2aWNlJ3MgaW50ZXJuYWwgdG9rZW46IEVTMjU2LCBga2lkYCA9IHRoZSBzaWduZXInc1xuICogdGh1bWJwcmludCwgYHN1YmAgPSBgc2VydmljZTo8c2VydmljZU5hbWU+YC4gYGlhdGAvYGV4cGAgYW5kIHRoZSBvcHRpb25hbFxuICogaXNzdWVyL2F1ZGllbmNlIGFyZSBzdGFtcGVkIGhlcmUgc28gdGhlcmUgaXMgb25lIHBsYWNlIHRoYXQgZGVjaWRlcyB3aGF0IGFcbiAqIHNlcnZpY2UgdG9rZW4gc2F5cy5cbiAqXG4gKiBIYW5kLXJvbGxlZCAocmF0aGVyIHRoYW4gYGp3dC5zaWduYCkgb25seSBzbyB0aGUgaGVhZGVyIGNhcnJpZXMgdGhlIGBraWRgIGluXG4gKiB0aGUgc2FtZSBzaGFwZSBwbGF0Zm9ybSdzIHNpZ25lciBwcm9kdWNlcyDigJQgYGNyeXB0by5zaWduYCBpcyBzeW5jaHJvbm91cywgc29cbiAqIHVubGlrZSB0aGUgS01TIHBhdGggdGhpcyBjb3N0cyBub3RoaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnblNlcnZpY2VKd3QoXG4gIGNsYWltczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIG9wdGlvbnM6IHsgc2VydmljZU5hbWU6IHN0cmluZzsgZXhwaXJlc0luU2Vjb25kczogbnVtYmVyOyBpc3N1ZXI/OiBzdHJpbmc7IGF1ZGllbmNlPzogc3RyaW5nIH0sXG4pOiBzdHJpbmcge1xuICBjb25zdCBrZXkgPSBzaWduaW5nS2V5Rm9yKG9wdGlvbnMuc2VydmljZU5hbWUpO1xuICBjb25zdCBub3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgY29uc3QgYm9keSA9IHtcbiAgICAuLi5jbGFpbXMsXG4gICAgc3ViOiBgJHtTRVJWSUNFX1NVQkpFQ1RfUFJFRklYfSR7b3B0aW9ucy5zZXJ2aWNlTmFtZX1gLFxuICAgIGlhdDogbm93LFxuICAgIGV4cDogbm93ICsgb3B0aW9ucy5leHBpcmVzSW5TZWNvbmRzLFxuICAgIC4uLihvcHRpb25zLmlzc3VlciA/IHsgaXNzOiBvcHRpb25zLmlzc3VlciB9IDoge30pLFxuICAgIC4uLihvcHRpb25zLmF1ZGllbmNlID8geyBhdWQ6IG9wdGlvbnMuYXVkaWVuY2UgfSA6IHt9KSxcbiAgfTtcbiAgY29uc3Qgc2lnbmluZ0lucHV0ID0gZW5jb2RlSndzU2lnbmluZ0lucHV0KGtleS5raWQsIGJvZHkpO1xuICBjb25zdCBzaWduYXR1cmUgPSBjcnlwdG8uc2lnbignc2hhMjU2JywgQnVmZmVyLmZyb20oc2lnbmluZ0lucHV0LCAndXRmLTgnKSwge1xuICAgIGtleToga2V5LnByaXZhdGVLZXksXG4gICAgZHNhRW5jb2Rpbmc6ICdpZWVlLXAxMzYzJyxcbiAgfSk7XG4gIHJldHVybiBjb21wYWN0SndzKHNpZ25pbmdJbnB1dCwgc2lnbmF0dXJlKTtcbn1cblxuLyoqXG4gKiBWZXJpZnkgYW4gaW50ZXJuYWwgc2VydmljZSB0b2tlbiwgU1lOQ0hST05PVVNMWSwgYW5kIHJldHVybiBpdHMgY2xhaW1zLlxuICpcbiAqIFRoZSBzZWN1cml0eSBwcm9wZXJ0eSB0aGlzIGZ1bmN0aW9uIGV4aXN0cyBmb3I6IHRoZSBga2lkYCBzZWxlY3RzIHRoZSBrZXlcbiAqIEFORCBuYW1lcyB0aGUgc2lnbmVyLCBhbmQgdGhlIHRva2VuJ3MgYHN1YmAgbXVzdCBhZ3JlZS4gU28gYGJpbGxpbmdgIGNhbm5vdFxuICogYmUgaW1wZXJzb25hdGVkIGJ5IGFueSBvdGhlciBzZXJ2aWNlIOKAlCBub3QgZXZlbiBvbmUgdGhhdCBob2xkcyBhIHZhbGlkIGtleSBvZlxuICogaXRzIG93biDigJQgYSBndWFyYW50ZWUgbm8gc2hhcmVkIHNlY3JldCBjYW4gZ2l2ZS5cbiAqXG4gKiBAdGhyb3dzIHtqd3QuSnNvbldlYlRva2VuRXJyb3J9IHVua25vd24gYGtpZGAsIHdyb25nIGFsZ29yaXRobSwgYmFkXG4gKiAgICAgICAgIHNpZ25hdHVyZSwgZXhwaXJlZCwgb3IgYSBgc3ViYCB0aGF0IGRpc2FncmVlcyB3aXRoIHRoZSBzaWduaW5nIGtleS5cbiAqIEB0aHJvd3Mge1NlcnZpY2VLZXlFcnJvcn0gbm8gdmVyaWZpY2F0aW9uIGJ1bmRsZSBjb3VsZCBiZSByZWFkIGF0IGFsbCDigJQgdGhlXG4gKiAgICAgICAgIHRva2VuJ3MgdmFsaWRpdHkgaXMgVU5LTk9XTiBhbmQgdGhlIGNhbGxlciBtdXN0IG5vdCB0cmVhdCBpdCBhcyB2YWxpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeVNlcnZpY2VKd3Q8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgdG9rZW46IHN0cmluZyxcbiAgb3B0aW9uczogeyBraWQ6IHN0cmluZzsgaXNzdWVyPzogc3RyaW5nOyBhdWRpZW5jZT86IHN0cmluZyB9LFxuKTogVCB7XG4gIGNvbnN0IGVudHJ5ID0gdmVyaWZpY2F0aW9uS2V5cygpLmdldChvcHRpb25zLmtpZCk7XG4gIC8vIEVWRVJZIGVtaXNzaW9uIG9mIHRoaXMgY291bnRlciBjYXJyaWVzIHRoZSBzYW1lIGxhYmVsIEtFWVMuIFRoZSBQcm9tZXRoZXVzXG4gIC8vIGNvdW50ZXIgaXMgcmVnaXN0ZXJlZCBsYXppbHkgd2l0aCB3aGF0ZXZlciBrZXlzIGl0cyBmaXJzdCBlbWlzc2lvbiB1c2VkLFxuICAvLyBhbmQgYW4gaW5jcmVtZW50IHdpdGggYSBkaWZmZXJlbnQgc2V0IHRocm93cyDigJQgd2hpY2ggYGVtaXRDb3VudGVyYFxuICAvLyBzd2FsbG93cy4gU28gd2hlbiB0aGUgZmlyc3QgdG9rZW4gYSBwb2QgdmVyaWZpZWQgd2FzIGJhZCAoYHsgcmVzdWx0IH1gXG4gIC8vIGFsb25lKSwgZXZlcnkgbGF0ZXIgYG9rYCBhbmQgYHN1YmplY3RfbWlzbWF0Y2hgIChgeyByZXN1bHQsIHNlcnZpY2UgfWApIHdhc1xuICAvLyBzaWxlbnRseSBkcm9wcGVkIGZvciB0aGUgbGlmZSBvZiB0aGUgcHJvY2VzczogdGhlIG1ldHJpYyB0aGF0IHRlbGxzIHlvdVxuICAvLyBzZXJ2aWNlLXRvLXNlcnZpY2UgYXV0aCBpcyBoZWFsdGh5IHdlbnQgcXVpZXQgZXhhY3RseSB3aGVuIGl0IG1hdHRlcmVkLlxuICBpZiAoIWVudHJ5KSB7XG4gICAgZW1pdENvdW50ZXIoJ3NlcnZpY2VfdG9rZW5fdmVyaWZ5X3RvdGFsJywgeyByZXN1bHQ6ICd1bmtub3duX2tpZCcsIHNlcnZpY2U6ICd1bmtub3duJyB9KTtcbiAgICB0aHJvdyBuZXcgand0Lkpzb25XZWJUb2tlbkVycm9yKGBObyBwdWJsaXNoZWQgc2VydmljZSBrZXkgZm9yIGtpZCAke29wdGlvbnMua2lkfWApO1xuICB9XG4gIGxldCBjbGFpbXM6IFQgJiB7IHN1Yj86IHVua25vd24gfTtcbiAgdHJ5IHtcbiAgICBjbGFpbXMgPSBqd3QudmVyaWZ5KHRva2VuLCBlbnRyeS5rZXksIHtcbiAgICAgIGFsZ29yaXRobXM6IFtTRVJWSUNFX1RPS0VOX0FMR09SSVRITV0sXG4gICAgICAuLi4ob3B0aW9ucy5pc3N1ZXIgPyB7IGlzc3Vlcjogb3B0aW9ucy5pc3N1ZXIgfSA6IHt9KSxcbiAgICAgIC4uLihvcHRpb25zLmF1ZGllbmNlID8geyBhdWRpZW5jZTogb3B0aW9ucy5hdWRpZW5jZSB9IDoge30pLFxuICAgIH0pIGFzIFQgJiB7IHN1Yj86IHVua25vd24gfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBlbWl0Q291bnRlcignc2VydmljZV90b2tlbl92ZXJpZnlfdG90YWwnLCB7IHJlc3VsdDogJ2ludmFsaWQnLCBzZXJ2aWNlOiBlbnRyeS5zZXJ2aWNlTmFtZSB9KTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuICBpZiAoY2xhaW1zLnN1YiAhPT0gYCR7U0VSVklDRV9TVUJKRUNUX1BSRUZJWH0ke2VudHJ5LnNlcnZpY2VOYW1lfWApIHtcbiAgICAvLyBBIHZhbGlkIHNpZ25hdHVyZSBieSB0aGUgV1JPTkcgc2VydmljZTogdGhlIGtleSBiZWxvbmdzIHRvIGBlbnRyeS5zZXJ2aWNlTmFtZWBcbiAgICAvLyBidXQgdGhlIHRva2VuIHNwZWFrcyBmb3Igc29tZW9uZSBlbHNlOiBhIGNyb3NzLXNlcnZpY2UgZm9yZ2VyeS5cbiAgICBlbWl0Q291bnRlcignc2VydmljZV90b2tlbl92ZXJpZnlfdG90YWwnLCB7IHJlc3VsdDogJ3N1YmplY3RfbWlzbWF0Y2gnLCBzZXJ2aWNlOiBlbnRyeS5zZXJ2aWNlTmFtZSB9KTtcbiAgICB0aHJvdyBuZXcgand0Lkpzb25XZWJUb2tlbkVycm9yKGBTZXJ2aWNlIHRva2VuIHN1YmplY3QgJHtTdHJpbmcoY2xhaW1zLnN1Yil9IHdhcyBzaWduZWQgYnkgJHtlbnRyeS5zZXJ2aWNlTmFtZX1gKTtcbiAgfVxuICBlbWl0Q291bnRlcignc2VydmljZV90b2tlbl92ZXJpZnlfdG90YWwnLCB7IHJlc3VsdDogJ29rJywgc2VydmljZTogZW50cnkuc2VydmljZU5hbWUgfSk7XG4gIHJldHVybiBjbGFpbXM7XG59XG5cbi8qKlxuICogVHJ1ZSB3aGlsZSB0aGlzIHNlcnZpY2Ugc3RpbGwgcHVibGlzaGVzIG1vcmUgdGhhbiBvbmUgdmVyaWZpY2F0aW9uIGtleSDigJQgaS5lLlxuICogYSBzaWduaW5nLWtleSByb3RhdGlvbiBpcyBvcGVuIGFuZCB0aGUgcmV0aXJpbmcga2V5IGlzIHN0aWxsIHRydXN0ZWQuIEZlZWRzXG4gKiB0aGUgYHNlY3JldF9yb3RhdGlvbl9wcmV2aW91c19zZXR7c2VjcmV0PVwiU0VSVklDRV9TSUdOSU5HX0tFWVwifWAgZ2F1Z2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JldGlyaW5nU2VydmljZUtleVB1Ymxpc2hlZCgpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBtZSA9IHNlcnZpY2VJZGVudGl0eSgpO1xuICAgIHJldHVybiBbLi4udmVyaWZpY2F0aW9uS2V5cygpLnZhbHVlcygpXS5maWx0ZXIoKHYpID0+IHYuc2VydmljZU5hbWUgPT09IG1lKS5sZW5ndGggPiAxO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBUZXN0IHNlYW06IGRyb3AgdGhlIGxvYWRlZCBzaWduaW5nIGtleSwgdGhlIGJ1bmRsZSBhbmQgYW55IGVwaGVtZXJhbCBrZXlzIHNvXG4gKiB0aGUgbmV4dCBzaWduL3ZlcmlmeSByZS1yZWFkcyB0aGUgZW52aXJvbm1lbnQuIERvbid0IGNhbGwgZnJvbSBwcm9kdWN0aW9uIGNvZGVcbiAqIOKAlCByb3RhdGlvbiBpcyBwaWNrZWQgdXAgYnkgdGhlIHJlZnJlc2ggaW50ZXJ2YWwgYW5kIHRoZSBtdGltZSBjaGVjay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldFNlcnZpY2VLZXlzRm9yVGVzdHMoKTogdm9pZCB7XG4gIGxvY2FsS2V5ID0gdW5kZWZpbmVkO1xuICBidW5kbGUgPSB1bmRlZmluZWQ7XG4gIGVwaGVtZXJhbEtleXMgPSB1bmRlZmluZWQ7XG4gIGVwaGVtZXJhbFdhcm5lZCA9IGZhbHNlO1xufVxuIl19
@@ -76,9 +76,17 @@ export interface SseTicketRedis extends ReadyAwareRedis {
76
76
  * than handing out or accepting unvalidated tickets. `bindOwner` is best-effort.
77
77
  */
78
78
  export declare function createRedisSseTicketStore(redis: SseTicketRedis, config: SseTicketStoreConfig): SseTicketStore;
79
+ /**
80
+ * The deploy-wide ticket caps: `SSE_MAX_TOTAL_TICKETS` (default 1000) and
81
+ * `SSE_MAX_TICKETS_PER_ORG` (default 10). One reader so every channel parses
82
+ * them the same way.
83
+ */
84
+ export declare function envSseTicketCaps(): Pick<SseTicketStoreConfig, 'maxTotal' | 'maxPerOrg'>;
85
+ /** {@link createEnvSseTicketStore} config: the caps default to {@link envSseTicketCaps}. */
86
+ export type EnvSseTicketStoreConfig = Omit<SseTicketStoreConfig, 'maxTotal' | 'maxPerOrg'> & Partial<Pick<SseTicketStoreConfig, 'maxTotal' | 'maxPerOrg'>>;
79
87
  /**
80
88
  * Build an {@link SseTicketStore} from the standard Redis env (`REDIS_URL` or
81
89
  * `REDIS_SENTINELS`): the Redis backend when configured (multi-replica safe),
82
90
  * otherwise the in-memory single-process backend.
83
91
  */
84
- export declare function createEnvSseTicketStore(config: SseTicketStoreConfig): SseTicketStore;
92
+ export declare function createEnvSseTicketStore(options: EnvSseTicketStoreConfig): SseTicketStore;