@pipeline-builder/api-core 4.1.22 → 5.0.1

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 (56) hide show
  1. package/lib/errors/app-errors.d.ts +4 -2
  2. package/lib/errors/app-errors.js +6 -4
  3. package/lib/helpers/content-disposition.d.ts +14 -0
  4. package/lib/helpers/content-disposition.js +22 -0
  5. package/lib/helpers/index.d.ts +1 -0
  6. package/lib/helpers/index.js +2 -1
  7. package/lib/middleware/assurance.js +2 -2
  8. package/lib/middleware/auth.js +7 -7
  9. package/lib/middleware/ecosystem-guard.js +3 -3
  10. package/lib/middleware/permission-gates.js +3 -3
  11. package/lib/middleware/service-tokens.js +2 -2
  12. package/lib/middleware/step-up.js +2 -2
  13. package/lib/services/api-key-exchange.js +2 -2
  14. package/lib/services/compliance-client.js +2 -2
  15. package/lib/services/durable-event-bus.js +3 -1
  16. package/lib/services/index.d.ts +1 -1
  17. package/lib/services/index.js +2 -2
  18. package/lib/services/jwks-cache.js +2 -2
  19. package/lib/services/leader-lock.d.ts +56 -3
  20. package/lib/services/leader-lock.js +60 -4
  21. package/lib/services/quota.js +2 -2
  22. package/lib/services/scheduler.d.ts +20 -4
  23. package/lib/services/scheduler.js +36 -6
  24. package/lib/services/service-keys.d.ts +0 -4
  25. package/lib/services/service-keys.js +1 -14
  26. package/lib/types/catalog-metadata.d.ts +0 -6
  27. package/lib/types/catalog-metadata.js +1 -1
  28. package/lib/types/ecosystem.d.ts +0 -1
  29. package/lib/types/ecosystem.js +1 -1
  30. package/lib/types/feature-flags.d.ts +1 -1
  31. package/lib/types/feature-flags.js +6 -1
  32. package/lib/types/index.d.ts +3 -2
  33. package/lib/types/index.js +3 -2
  34. package/lib/types/permissions.d.ts +16 -1
  35. package/lib/types/permissions.js +23 -2
  36. package/lib/types/plugin-scan.d.ts +26 -0
  37. package/lib/types/plugin-scan.js +1 -1
  38. package/lib/types/remote-audit-actions.d.ts +1 -1
  39. package/lib/types/remote-audit-actions.js +35 -1
  40. package/lib/types/reserved-tags.d.ts +28 -0
  41. package/lib/types/reserved-tags.js +37 -0
  42. package/lib/utils/index.d.ts +1 -1
  43. package/lib/utils/index.js +2 -2
  44. package/lib/utils/params.d.ts +33 -1
  45. package/lib/utils/params.js +54 -2
  46. package/lib/utils/response.js +2 -2
  47. package/lib/utils/secret-encryption.d.ts +0 -2
  48. package/lib/utils/secret-encryption.js +1 -5
  49. package/lib/validation/message-schemas.d.ts +0 -7
  50. package/lib/validation/message-schemas.js +3 -2
  51. package/lib/validation/pipeline-schemas.d.ts +6 -0
  52. package/lib/validation/pipeline-schemas.js +32 -2
  53. package/lib/validation/plugin-catalog-detect.d.ts +1 -1
  54. package/lib/validation/plugin-catalog-detect.js +2 -2
  55. package/lib/validation/plugin-spec-schema.js +2 -2
  56. package/package.json +2 -4
@@ -131,6 +131,8 @@ export function createRedisDurableEventBus(redis, opts = {}) {
131
131
  const deliver = async (envs) => {
132
132
  for (const env of envs) {
133
133
  try {
134
+ // The narrowing that used to be a cast: inside this branch `payload` is `T`,
135
+ // so `env` really is an EventEnvelope<T> and the handler's type is honest.
134
136
  if (env.payload !== undefined)
135
137
  await handler(env);
136
138
  // Ack on success OR on an undefined (corrupt) payload — a poison
@@ -261,4 +263,4 @@ export function createEnvRedisDurableEventBus(opts = {}) {
261
263
  logger.info('Redis durable event bus initialized');
262
264
  return createRedisDurableEventBus(inst, opts);
263
265
  }
264
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVyYWJsZS1ldmVudC1idXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvZHVyYWJsZS1ldmVudC1idXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFFSCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVwRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQXVFakQsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDO0FBQzlCLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztBQUN6QixNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUMvQixNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQztBQUNuQyxNQUFNLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztBQUVsQyxTQUFTLFNBQVMsQ0FBQyxLQUFhO0lBQzlCLE9BQU8sT0FBTyxLQUFLLEVBQUUsQ0FBQztBQUN4QixDQUFDO0FBRUQsc0NBQXNDO0FBQ3RDLE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxLQUFhO0lBQy9DLE9BQU8sT0FBTyxLQUFLLE1BQU0sQ0FBQztBQUM1QixDQUFDO0FBRUQsbUZBQW1GO0FBQ25GLFNBQVMsaUJBQWlCLENBQUMsRUFBVTtJQUNuQyxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFB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LGFBQWEsRUFBRSxDQUFDLENBQUM7WUFFckYsT0FBTztnQkFDTCxLQUFLLENBQUMsSUFBSTtvQkFDUixPQUFPLEdBQUcsSUFBSSxDQUFDO29CQUNmLHdFQUF3RTtvQkFDeEUsd0VBQXdFO29CQUN4RSx5RUFBeUU7b0JBQ3pFLE1BQU0sV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDekMsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNoRSxDQUFDO2FBQ0YsQ0FBQztRQUNKLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLDZCQUE2QixDQUFDLElBQUksR0FBd0IsRUFBRTtJQUMxRSxNQUFNLElBQUksR0FBRyxvQkFBb0IsQ0FBb0IsV0FBVyxDQUFDLENBQUM7SUFDbEUsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLHFDQUFxQyxDQUFDLENBQUM7SUFDbkQsT0FBTywwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDaEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIER1cmFibGUsIGF0LWxlYXN0LW9uY2UgZXZlbnQgYmFja2JvbmUgKFJlZGlzIFN0cmVhbXMpLlxuICpcbiAqIFRoZSBwbGF0Zm9ybSdzIGNyb3NzLXNlcnZpY2Ugc2lnbmFsbGluZyB0b2RheSBpcyBwb2ludC10by1wb2ludCBIVFRQIHBsdXNcbiAqIHBvbGxpbmcgcmVjb25jaWxlcnMgcGx1cyBhbiBJTi1QUk9DRVNTIGJlc3QtZWZmb3J0IGVtaXR0ZXIgKHtAbGluayBlbnRpdHlFdmVudHN9KS5cbiAqIFRoZXJlIGlzIG5vIGR1cmFibGUgYnVzLCBzbyBhIHNpZ25hbCBwcm9kdWNlZCBvbiBvbmUgcG9kIGlzIGVpdGhlciBkZWxpdmVyZWRcbiAqIHN5bmNocm9ub3VzbHkgb3ZlciBIVFRQIChjb3VwbGluZyArIHJldHJ5LXN0b3JtIHJpc2spIG9yIGxvc3QgaWYgdGhlIGNvbnN1bWVyXG4gKiBpcyBtb21lbnRhcmlseSBkb3duICh0aGUgcmVjb25jaWxlcnMgZXhpc3QgdG8gcGFwZXIgb3ZlciBleGFjdGx5IHRoYXQpLlxuICpcbiAqIFRoaXMgaXMgdGhhdCBtaXNzaW5nIGJ1cywgYXMgYSByZXVzYWJsZSBwcmltaXRpdmU6XG4gKiAgLSAqKnB1Ymxpc2godG9waWMsIHBheWxvYWQpKiog4oaSIGBYQUREYCBvbnRvIGEgYm91bmRlZCAoYE1BWExFTiB+YCkgcGVyLXRvcGljXG4gKiAgICBzdHJlYW0uIER1cmFibGUgYWNyb3NzIHJlc3RhcnRzLCBzaGFyZWQgYnkgYWxsIHJlcGxpY2FzLlxuICogIC0gKipzdWJzY3JpYmUoe3RvcGljLCBncm91cCwgY29uc3VtZXIsIGhhbmRsZXJ9KSoqIOKGkiBhIGBYUkVBREdST1VQYCBjb25zdW1lclxuICogICAgb24gaXRzIE9XTiBjb25uZWN0aW9uIChgZHVwbGljYXRlKClgKSwgc28gYSBibG9ja2luZyByZWFkIG5ldmVyIGRlbGF5cyBhXG4gKiAgICBwdWJsaXNoLiBDb25zdW1lciBHUk9VUFMgZ2l2ZSBhdC1sZWFzdC1vbmNlOiBlYWNoIGdyb3VwIGdldHMgZXZlcnkgbWVzc2FnZVxuICogICAgb25jZSwgYSBtZXNzYWdlIHN0YXlzIHBlbmRpbmcgdW50aWwgdGhlIGhhbmRsZXIgYFhBQ0tgcyBpdCwgYW5kIGBYQVVUT0NMQUlNYFxuICogICAgcmVjbGFpbXMgbWVzc2FnZXMgc3RyYW5kZWQgYnkgYSBjcmFzaGVkIGNvbnN1bWVyLiBBIG1lc3NhZ2UgdGhhdCBoYXMgYmVlblxuICogICAgZGVsaXZlcmVkIGBtYXhEZWxpdmVyaWVzYCB0aW1lcyB3aXRob3V0IGFuIGFjayBpcyBtb3ZlZCB0byBhIGRlYWQtbGV0dGVyXG4gKiAgICBzdHJlYW0gKGBldnQ6PHRvcGljPjpkbHFgKSBhbmQgYWNrZWQsIHNvIGEgcG9pc29uIG1lc3NhZ2UgY2FuJ3QgcmVkZWxpdmVyXG4gKiAgICBmb3JldmVyLiBNdWx0aXBsZSBncm91cHMgb24gb25lIHRvcGljID0gaW5kZXBlbmRlbnQgZmFuLW91dC5cbiAqXG4gKiBGQUlMLVNBRkUgKyBPUFQtSU4sIGV4YWN0bHkgbGlrZSB0aGUgYXVkaXQgc3Bvb2w6IHtAbGluayBjcmVhdGVFbnZSZWRpc0R1cmFibGVFdmVudEJ1c31cbiAqIHJldHVybnMgYG51bGxgIHdoZW4gUmVkaXMgaXNuJ3QgY29uZmlndXJlZCwgc28gYSBzZXJ2aWNlIHdpdGhvdXQgaXQgc2ltcGx5XG4gKiBkb2Vzbid0IHVzZSB0aGUgYnVzIChrZWVwcyB0b2RheSdzIGJlaGF2aW9yKS4gQSBwdWJsaXNoIGZhaWx1cmUgaXMgZHJvcHBlZC13aXRoLVxuICogLW1ldHJpYywgbmV2ZXIgdGhyb3duOyBhIGhhbmRsZXIgdGhyb3cgbGVhdmVzIHRoZSBtZXNzYWdlIHVuLWFja2VkIGZvciByZWRlbGl2ZXJ5LlxuICpcbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVFbnZSZWRpc0NsaWVudCB9IGZyb20gJy4vZW52LXJlZGlzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlbWl0Q291bnRlciB9IGZyb20gJy4uL3V0aWxzL21ldHJpYy1lbWl0dGVyLmpzJztcbmltcG9ydCB7IGVycm9yTWVzc2FnZSB9IGZyb20gJy4uL3V0aWxzL3Jlc3BvbnNlLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdkdXJhYmxlLWV2ZW50LWJ1cycpO1xuXG4vKiogQSBkZWxpdmVyZWQgZXZlbnQ6IGl0cyBzdHJlYW0gaWQsIHRvcGljLCBwdWJsaXNoIHRpbWUsIGFuZCBkZWNvZGVkIHBheWxvYWQuICovXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50RW52ZWxvcGU8VCA9IHVua25vd24+IHtcbiAgLyoqIFJlZGlzIFN0cmVhbSBlbnRyeSBpZCAoYDxtcz4tPHNlcT5gKSDigJQgYWxzbyB0aGUgaWRlbXBvdGVuY3kgaGFuZGxlLiAqL1xuICBpZDogc3RyaW5nO1xuICB0b3BpYzogc3RyaW5nO1xuICAvKipcbiAgICogV2hlbiB0aGUgZXZlbnQgd2FzIHB1Ymxpc2hlZCAodGhlIFJlZGlzIHNlcnZlciB0aW1lIGVtYmVkZGVkIGluIHRoZSBzdHJlYW1cbiAgICogaWQpLiBBIHJlZGVsaXZlcnkga2VlcHMgaXRzIE9SSUdJTkFMIHB1Ymxpc2ggdGltZSwgc28gYSBjb25zdW1lciBhcHBseWluZ1xuICAgKiBsYXN0LXdyaXRlci13aW5zIHN0YXRlIChlLmcuIGFuIGVudGl0bGVtZW50IHN5bmMpIGNhbiBvcmRlciBldmVudHMgYnkgaXRcbiAgICogaW5zdGVhZCBvZiBieSBkZWxpdmVyeSB0aW1lIGFuZCByZWZ1c2UgdG8gbGV0IGEgc3RhbGUgcmV0cnkgb3ZlcndyaXRlIGFcbiAgICogbmV3ZXIgc3RhdGUuXG4gICAqL1xuICBwdWJsaXNoZWRBdDogRGF0ZTtcbiAgcGF5bG9hZDogVDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdWJzY3JpYmVPcHRpb25zPFQgPSB1bmtub3duPiB7XG4gIC8qKiBUb3BpYyAoc3RyZWFtKSB0byBjb25zdW1lLiAqL1xuICB0b3BpYzogc3RyaW5nO1xuICAvKiogQ29uc3VtZXIgZ3JvdXAg4oCUIG9uZSBkZWxpdmVyeSBwZXIgZ3JvdXA7IGRpc3RpbmN0IGdyb3VwcyBmYW4gb3V0LiAqL1xuICBncm91cDogc3RyaW5nO1xuICAvKiogVGhpcyBjb25zdW1lcidzIGlkIHdpdGhpbiB0aGUgZ3JvdXAgKGUuZy4gYCR7c2VydmljZX0tJHtwaWR9YCkuICovXG4gIGNvbnN1bWVyOiBzdHJpbmc7XG4gIC8qKiBBc3luYyBoYW5kbGVyLiBSZXNvbHZlcyDih5IgdGhlIG1lc3NhZ2UgaXMgYWNrZWQ7IHRocm93cyDih5IgbGVmdCBwZW5kaW5nIGZvciByZWRlbGl2ZXJ5LiAqL1xuICBoYW5kbGVyOiAoZW52OiBFdmVudEVudmVsb3BlPFQ+KSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKiogTWF4IG1lc3NhZ2VzIHBlciByZWFkIChkZWZhdWx0IDE2KS4gKi9cbiAgYmF0Y2hTaXplPzogbnVtYmVyO1xuICAvKiogWFJFQURHUk9VUCBibG9jayB0aW1lIGluIG1zIChkZWZhdWx0IDUwMDApLiAqL1xuICBibG9ja01zPzogbnVtYmVyO1xuICAvKiogQSBwZW5kaW5nIG1lc3NhZ2UgaWRsZSB0aGlzIGxvbmcgKG1zKSBpcyByZWNsYWltZWQgZnJvbSBhIGRlYWQgY29uc3VtZXIgKGRlZmF1bHQgNjAwMDApLiAqL1xuICBtaW5JZGxlTXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBEZWxpdmVyaWVzIGFmdGVyIHdoaWNoIGFuIHVuLWFja2VkIG1lc3NhZ2UgaXMgZGVhZC1sZXR0ZXJlZCB0b1xuICAgKiBgZXZ0Ojx0b3BpYz46ZGxxYCBhbmQgYWNrZWQgaW5zdGVhZCBvZiBiZWluZyByZWRlbGl2ZXJlZCBhZ2FpbiAoZGVmYXVsdCAxMCkuXG4gICAqL1xuICBtYXhEZWxpdmVyaWVzPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50U3Vic2NyaXB0aW9uIHtcbiAgLyoqIFN0b3AgdGhlIGNvbnN1bWVyIGxvb3AuIFJlc29sdmVzIG9uY2UgdGhlIGluLWZsaWdodCByZWFkIHJldHVybnMuICovXG4gIHN0b3AoKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEdXJhYmxlRXZlbnRCdXMge1xuICAvKiogUHVibGlzaCBhIHBheWxvYWQgdG8gYSB0b3BpYy4gUmV0dXJucyB0aGUgc3RyZWFtIGlkLCBvciBudWxsIG9uIGZhaWx1cmUgKGRyb3BwZWQsIG5ldmVyIHRocm93cykuICovXG4gIHB1Ymxpc2g8VD4odG9waWM6IHN0cmluZywgcGF5bG9hZDogVCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG4gIC8qKiBTdGFydCBhIGNvbnN1bWVyLWdyb3VwIHJlYWRlciBmb3IgYSB0b3BpYy4gRmlyZS1hbmQtZm9yZ2V0IGxvb3A7IGNhbGwgYHN0b3AoKWAgdG8gZW5kIGl0LiAqL1xuICBzdWJzY3JpYmU8VD4ob3B0czogU3Vic2NyaWJlT3B0aW9uczxUPik6IEV2ZW50U3Vic2NyaXB0aW9uO1xufVxuXG4vKipcbiAqIFRoZSBzdWJzZXQgb2YgaW9yZWRpcycgU3RyZWFtIEFQSSB0aGUgYnVzIHVzZXMuIEtlcHQgbWluaW1hbCBzbyBhIHRlc3QgY2FuXG4gKiBzdXBwbHkgYW4gaW4tbWVtb3J5IGZha2UgYW5kIHNvIG1lcmVseSBpbXBvcnRpbmcgdGhpcyBuZXZlciBoYXJkLWRlcGVuZHMgb25cbiAqIGlvcmVkaXMgKGNvbnN0cnVjdGVkIHZpYSB0aGUgc2hhcmVkIGVudiBoZWxwZXIpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZGlzU3RyZWFtQ2xpZW50IHtcbiAgeGFkZChrZXk6IHN0cmluZywgLi4uYXJnczogKHN0cmluZyB8IG51bWJlcilbXSk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG4gIHhncm91cCguLi5hcmdzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogUHJvbWlzZTx1bmtub3duPjtcbiAgeHJlYWRncm91cCguLi5hcmdzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogUHJvbWlzZTx1bmtub3duPjtcbiAgeGFjayhrZXk6IHN0cmluZywgZ3JvdXA6IHN0cmluZywgLi4uaWRzOiBzdHJpbmdbXSk6IFByb21pc2U8bnVtYmVyPjtcbiAgeGF1dG9jbGFpbSguLi5hcmdzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogUHJvbWlzZTx1bmtub3duPjtcbiAgeHBlbmRpbmcoa2V5OiBzdHJpbmcsIGdyb3VwOiBzdHJpbmcsIC4uLmFyZ3M6IChzdHJpbmcgfCBudW1iZXIpW10pOiBQcm9taXNlPHVua25vd24+O1xuICB4cmFuZ2Uoa2V5OiBzdHJpbmcsIHN0YXJ0OiBzdHJpbmcsIGVuZDogc3RyaW5nLCAuLi5hcmdzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogUHJvbWlzZTx1bmtub3duPjtcbiAgLyoqIEEgbmV3IGNvbm5lY3Rpb24gd2l0aCB0aGUgc2FtZSBvcHRpb25zIOKAlCBlYWNoIHN1YnNjcmliZXIgcmVhZHMgb24gaXRzIG93bi4gKi9cbiAgZHVwbGljYXRlKCk6IFJlZGlzU3RyZWFtQ2xpZW50O1xuICBxdWl0PygpOiBQcm9taXNlPHVua25vd24+O1xuICBvbj8oZXZlbnQ6ICdlcnJvcicsIGNiOiAoZXJyOiB1bmtub3duKSA9PiB2b2lkKTogdW5rbm93bjtcbn1cblxuY29uc3QgREVGQVVMVF9NQVhMRU4gPSAxMF8wMDA7XG5jb25zdCBERUZBVUxUX0JBVENIID0gMTY7XG5jb25zdCBERUZBVUxUX0JMT0NLX01TID0gNV8wMDA7XG5jb25zdCBERUZBVUxUX01JTl9JRExFX01TID0gNjBfMDAwO1xuY29uc3QgREVGQVVMVF9NQVhfREVMSVZFUklFUyA9IDEwO1xuXG5mdW5jdGlvbiBzdHJlYW1LZXkodG9waWM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgZXZ0OiR7dG9waWN9YDtcbn1cblxuLyoqIERlYWQtbGV0dGVyIHN0cmVhbSBmb3IgYSB0b3BpYy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWFkTGV0dGVyU3RyZWFtS2V5KHRvcGljOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYGV2dDoke3RvcGljfTpkbHFgO1xufVxuXG4vKiogUHVibGlzaCB0aW1lIGZyb20gYSBzdHJlYW0gaWQgKGA8bXM+LTxzZXE+YCk7IGVwb2NoIDAgZm9yIGFuIHVucGFyc2VhYmxlIGlkLiAqL1xuZnVuY3Rpb24gcHVibGlzaGVkQXRGcm9tSWQoaWQ6IHN0cmluZyk6IERhdGUge1xuICBjb25zdCBtcyA9IE51bWJlcihpZC5zcGxpdCgnLScpWzBdKTtcbiAgcmV0dXJuIG5ldyBEYXRlKE51bWJlci5pc0Zpbml0ZShtcykgPyBtcyA6IDApO1xufVxuXG4vKiogVHJ1ZSB3aGVuIHRoZSBlcnJvciBpcyBSZWRpcycgXCJncm91cCBhbHJlYWR5IGV4aXN0c1wiIChpZGVtcG90ZW50IGNyZWF0ZSkuICovXG5mdW5jdGlvbiBpc0J1c3lHcm91cChlcnI6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGVycm9yTWVzc2FnZShlcnIpLmluY2x1ZGVzKCdCVVNZR1JPVVAnKTtcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgbmVzdGVkIGFycmF5IHNoYXBlIFhSRUFER1JPVVAgLyBYQVVUT0NMQUlNIHJldHVybiBpbnRvIGZsYXQgZW52ZWxvcGVzLlxuICogWFJFQURHUk9VUDogYFtbc3RyZWFtS2V5LCBbW2lkLCBbZiwgdiwgLi4uXV0sIC4uLl1dXWAuXG4gKiBYQVVUT0NMQUlNOiBgW25leHRDdXJzb3IsIFtbaWQsIFtmLCB2LCAuLi5dXSwgLi4uXSwgZGVsZXRlZElkc11gLlxuICogV2Ugc3RvcmUgdGhlIEpTT04gcGF5bG9hZCB1bmRlciBhIHNpbmdsZSBmaWVsZCBgZGAuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlRW50cmllczxUPih0b3BpYzogc3RyaW5nLCBlbnRyaWVzOiB1bmtub3duKTogRXZlbnRFbnZlbG9wZTxUPltdIHtcbiAgY29uc3Qgb3V0OiBFdmVudEVudmVsb3BlPFQ+W10gPSBbXTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGVudHJpZXMpKSByZXR1cm4gb3V0O1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZW50cnkpIHx8IGVudHJ5Lmxlbmd0aCA8IDIpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGlkID0gU3RyaW5nKGVudHJ5WzBdKTtcbiAgICBjb25zdCBmaWVsZHMgPSBlbnRyeVsxXTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmllbGRzKSkgY29udGludWU7XG4gICAgLy8gZmllbGRzIGlzIFtuYW1lLCB2YWx1ZSwgbmFtZSwgdmFsdWUsIC4uLl07IGZpbmQgJ2QnLlxuICAgIGxldCByYXc6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSArIDEgPCBmaWVsZHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIGlmIChTdHJpbmcoZmllbGRzW2ldKSA9PT0gJ2QnKSB7IHJhdyA9IFN0cmluZyhmaWVsZHNbaSArIDFdKTsgYnJlYWs7IH1cbiAgICB9XG4gICAgLy8gQSBtaXNzaW5nIGBkYCBmaWVsZCAoYW4gZW50cnkgbm90IHdyaXR0ZW4gYnkgcHVibGlzaCgpKSBPUiBhIGNvcnJ1cHQgSlNPTlxuICAgIC8vIHBheWxvYWQgYm90aCB5aWVsZCBhbiB1bmRlZmluZWQtcGF5bG9hZCBlbnZlbG9wZSBzbyBgZGVsaXZlcigpYCBBQ0tzIGl0IOKAlFxuICAgIC8vIGEgcG9pc29uIG1lc3NhZ2UgbXVzdCBuZXZlciB3ZWRnZSB0aGUgZ3JvdXAgYnkgc3RheWluZyBwZXJwZXR1YWxseSBwZW5kaW5nLlxuICAgIGNvbnN0IHB1Ymxpc2hlZEF0ID0gcHVibGlzaGVkQXRGcm9tSWQoaWQpO1xuICAgIGlmIChyYXcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb3V0LnB1c2goeyBpZCwgdG9waWMsIHB1Ymxpc2hlZEF0LCBwYXlsb2FkOiB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBUIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBvdXQucHVzaCh7IGlkLCB0b3BpYywgcHVibGlzaGVkQXQsIHBheWxvYWQ6IEpTT04ucGFyc2UocmF3KSBhcyBUIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgb3V0LnB1c2goeyBpZCwgdG9waWMsIHB1Ymxpc2hlZEF0LCBwYXlsb2FkOiB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBUIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKiogQnVpbGQgYSBkdXJhYmxlIGV2ZW50IGJ1cyBvdmVyIGEgUmVkaXMgU3RyZWFtcyBjbGllbnQuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVkaXNEdXJhYmxlRXZlbnRCdXMoXG4gIHJlZGlzOiBSZWRpc1N0cmVhbUNsaWVudCxcbiAgb3B0czogeyBtYXhMZW4/OiBudW1iZXIgfSA9IHt9LFxuKTogRHVyYWJsZUV2ZW50QnVzIHtcbiAgY29uc3QgbWF4TGVuID0gTWF0aC5tYXgoMSwgb3B0cy5tYXhMZW4gPz8gREVGQVVMVF9NQVhMRU4pO1xuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgcHVibGlzaDxUPih0b3BpYzogc3RyaW5nLCBwYXlsb2FkOiBUKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgICBjb25zdCBrZXkgPSBzdHJlYW1LZXkodG9waWMpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gTUFYTEVOIH4gPG4+IGJvdW5kcyB0aGUgc3RyZWFtIGFwcHJveGltYXRlbHkgKGNoZWFwKTsgYCpgID0gc2VydmVyIGlkLlxuICAgICAgICBjb25zdCBpZCA9IGF3YWl0IHJlZGlzLnhhZGQoa2V5LCAnTUFYTEVOJywgJ34nLCBtYXhMZW4sICcqJywgJ2QnLCBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSk7XG4gICAgICAgIGVtaXRDb3VudGVyKCdldmVudF9idXNfcHVibGlzaGVkX3RvdGFsJywgeyB0b3BpYyB9KTtcbiAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGVtaXRDb3VudGVyKCdldmVudF9idXNfcHVibGlzaF9mYWlsZWRfdG90YWwnLCB7IHRvcGljIH0pO1xuICAgICAgICBsb2dnZXIud2FybignRXZlbnQgYnVzIHB1Ymxpc2ggZmFpbGVkIChldmVudCBkcm9wcGVkKScsIHsgdG9waWMsIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcblxuICAgIHN1YnNjcmliZTxUPihzdWJPcHRzOiBTdWJzY3JpYmVPcHRpb25zPFQ+KTogRXZlbnRTdWJzY3JpcHRpb24ge1xuICAgICAgY29uc3QgeyB0b3BpYywgZ3JvdXAsIGNvbnN1bWVyLCBoYW5kbGVyIH0gPSBzdWJPcHRzO1xuICAgICAgY29uc3Qga2V5ID0gc3RyZWFtS2V5KHRvcGljKTtcbiAgICAgIGNvbnN0IGRscUtleSA9IGRlYWRMZXR0ZXJTdHJlYW1LZXkodG9waWMpO1xuICAgICAgY29uc3QgYmF0Y2ggPSBNYXRoLm1heCgxLCBzdWJPcHRzLmJhdGNoU2l6ZSA/PyBERUZBVUxUX0JBVENIKTtcbiAgICAgIGNvbnN0IGJsb2NrTXMgPSBNYXRoLm1heCgwLCBzdWJPcHRzLmJsb2NrTXMgPz8gREVGQVVMVF9CTE9DS19NUyk7XG4gICAgICBjb25zdCBtaW5JZGxlID0gTWF0aC5tYXgoMCwgc3ViT3B0cy5taW5JZGxlTXMgPz8gREVGQVVMVF9NSU5fSURMRV9NUyk7XG4gICAgICBjb25zdCBtYXhEZWxpdmVyaWVzID0gTWF0aC5tYXgoMSwgc3ViT3B0cy5tYXhEZWxpdmVyaWVzID8/IERFRkFVTFRfTUFYX0RFTElWRVJJRVMpO1xuXG4gICAgICAvLyBgWFJFQURHUk9VUCBCTE9DS2AgaG9sZHMgaXRzIGNvbm5lY3Rpb24gZm9yIHVwIHRvIGBibG9ja01zYDsgb24gdGhlXG4gICAgICAvLyBzaGFyZWQgY2xpZW50IGV2ZXJ5IHB1Ymxpc2ggcXVldWVkIGJlaGluZCBpdC4gUmVhZCBvbiBhIGRlZGljYXRlZCBvbmUuXG4gICAgICBjb25zdCByZWFkZXIgPSByZWRpcy5kdXBsaWNhdGUoKTtcbiAgICAgIC8vIEEgZHVwbGljYXRlZCBpb3JlZGlzIGNvbm5lY3Rpb24gZG9lc24ndCBpbmhlcml0IGxpc3RlbmVyczsgd2l0aG91dCBvbmUgYVxuICAgICAgLy8gY29ubmVjdGlvbiBlcnJvciBpcyBhbiB1bmhhbmRsZWQgJ2Vycm9yJyBldmVudCB0aGF0IGNyYXNoZXMgdGhlIHByb2Nlc3MuXG4gICAgICByZWFkZXIub24/LignZXJyb3InLCAoZXJyKSA9PiBsb2dnZXIud2FybignRXZlbnQgYnVzIHJlYWRlciBjb25uZWN0aW9uIGVycm9yJywgeyB0b3BpYywgZ3JvdXAsIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KSk7XG5cbiAgICAgIGxldCBzdG9wcGVkID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGRlbGl2ZXIgPSBhc3luYyAoZW52czogRXZlbnRFbnZlbG9wZTxUPltdKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZW52IG9mIGVudnMpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGVudi5wYXlsb2FkICE9PSB1bmRlZmluZWQpIGF3YWl0IGhhbmRsZXIoZW52KTtcbiAgICAgICAgICAgIC8vIEFjayBvbiBzdWNjZXNzIE9SIG9uIGFuIHVuZGVmaW5lZCAoY29ycnVwdCkgcGF5bG9hZCDigJQgYSBwb2lzb25cbiAgICAgICAgICAgIC8vIG1lc3NhZ2UgbXVzdCBub3QgYmxvY2sgdGhlIGdyb3VwIGZvcmV2ZXIuXG4gICAgICAgICAgICBhd2FpdCByZWFkZXIueGFjayhrZXksIGdyb3VwLCBlbnYuaWQpO1xuICAgICAgICAgICAgZW1pdENvdW50ZXIoJ2V2ZW50X2J1c19kZWxpdmVyZWRfdG90YWwnLCB7IHRvcGljLCBncm91cCB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIC8vIExlYXZlIGl0IHBlbmRpbmcgKG5vIFhBQ0spIOKAlCBYQVVUT0NMQUlNIHJlZGVsaXZlcnMgaXQgYWZ0ZXIgbWluSWRsZS5cbiAgICAgICAgICAgIGVtaXRDb3VudGVyKCdldmVudF9idXNfaGFuZGxlcl9mYWlsZWRfdG90YWwnLCB7IHRvcGljLCBncm91cCB9KTtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKCdFdmVudCBoYW5kbGVyIGZhaWxlZDsgbGVhdmluZyBtZXNzYWdlIHBlbmRpbmcgZm9yIHJlZGVsaXZlcnknLCB7XG4gICAgICAgICAgICAgIHRvcGljLCBncm91cCwgaWQ6IGVudi5pZCwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvKipcbiAgICAgICAqIE1vdmUgZXZlcnkgaWRsZSBwZW5kaW5nIG1lc3NhZ2UgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGRlbGl2ZXJlZFxuICAgICAgICogYG1heERlbGl2ZXJpZXNgIHRpbWVzIHRvIHRoZSBkZWFkLWxldHRlciBzdHJlYW0gYW5kIGFjayBpdC4gVGhlIGVudHJ5XG4gICAgICAgKiBrZWVwcyBpdHMgcGF5bG9hZCBwbHVzIHdoZXJlIGl0IGNhbWUgZnJvbSwgc28gYW4gb3BlcmF0b3IgY2FuIGluc3BlY3Qgb3JcbiAgICAgICAqIHJlcGxheSBpdC4gSWYgY29weWluZyBmYWlscyB0aGUgbWVzc2FnZSBpcyBsZWZ0IHBlbmRpbmcgKHJldHJpZWQgbmV4dFxuICAgICAgICogcGFzcykg4oCUIGl0IGlzIG5ldmVyIGFja2VkIHdpdGhvdXQgYmVpbmcgcHJlc2VydmVkLlxuICAgICAgICovXG4gICAgICBjb25zdCBkZWFkTGV0dGVyRXhoYXVzdGVkID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gYXdhaXQgcmVhZGVyLnhwZW5kaW5nKGtleSwgZ3JvdXAsICdJRExFJywgbWluSWRsZSwgJy0nLCAnKycsIGJhdGNoKTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBlbmRpbmcpKSByZXR1cm47XG4gICAgICAgIGZvciAoY29uc3QgcCBvZiBwZW5kaW5nKSB7XG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHApIHx8IHAubGVuZ3RoIDwgNCkgY29udGludWU7XG4gICAgICAgICAgY29uc3QgaWQgPSBTdHJpbmcocFswXSk7XG4gICAgICAgICAgY29uc3QgZGVsaXZlcmllcyA9IE51bWJlcihwWzNdKTtcbiAgICAgICAgICBpZiAoIShkZWxpdmVyaWVzID49IG1heERlbGl2ZXJpZXMpKSBjb250aW51ZTtcbiAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgcmVhZGVyLnhyYW5nZShrZXksIGlkLCBpZCk7XG4gICAgICAgICAgY29uc3QgZmllbGRzID0gQXJyYXkuaXNBcnJheShlbnRyaWVzKSAmJiBBcnJheS5pc0FycmF5KGVudHJpZXNbMF0pICYmIEFycmF5LmlzQXJyYXkoZW50cmllc1swXVsxXSkgPyBlbnRyaWVzWzBdWzFdIDogW107XG4gICAgICAgICAgbGV0IHJhdyA9ICcnO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpICsgMSA8IGZpZWxkcy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgaWYgKFN0cmluZyhmaWVsZHNbaV0pID09PSAnZCcpIHsgcmF3ID0gU3RyaW5nKGZpZWxkc1tpICsgMV0pOyBicmVhazsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCByZWFkZXIueGFkZChcbiAgICAgICAgICAgIGRscUtleSwgJ01BWExFTicsICd+JywgbWF4TGVuLCAnKicsXG4gICAgICAgICAgICAnZCcsIHJhdywgJ3NvdXJjZUlkJywgaWQsICdncm91cCcsIGdyb3VwLCAnZGVsaXZlcmllcycsIGRlbGl2ZXJpZXMsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhd2FpdCByZWFkZXIueGFjayhrZXksIGdyb3VwLCBpZCk7XG4gICAgICAgICAgZW1pdENvdW50ZXIoJ2V2ZW50X2J1c19kZWFkX2xldHRlcmVkX3RvdGFsJywgeyB0b3BpYywgZ3JvdXAgfSk7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdFdmVudCBleGNlZWRlZCBtYXggZGVsaXZlcmllczsgbW92ZWQgdG8gZGVhZC1sZXR0ZXIgc3RyZWFtJywge1xuICAgICAgICAgICAgdG9waWMsIGdyb3VwLCBpZCwgZGVsaXZlcmllcywgZGVhZExldHRlclN0cmVhbTogZGxxS2V5LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBUaGUgY29uc3VtZXIgZ3JvdXAgbXVzdCBleGlzdCBiZWZvcmUgWFJFQURHUk9VUCBjYW4gc3VjY2VlZC4gQ3JlYXRpbmcgaXRcbiAgICAgIC8vIGlzIHJldHJpZWQgaW5zaWRlIHRoZSBsb29wOiBhdCBzdGFydHVwIHRoZSBjbGllbnQgbWF5IG5vdCBoYXZlIGNvbm5lY3RlZFxuICAgICAgLy8geWV0LCBhbmQgYSBzaW5nbGUgZmFpbGVkIGF0dGVtcHQgd291bGQgbGVhdmUgdGhlIGNvbnN1bWVyIHJlYWRpbmcgYVxuICAgICAgLy8gZ3JvdXAgdGhhdCB3YXMgbmV2ZXIgY3JlYXRlZCDigJQgZm9yZXZlci5cbiAgICAgIGxldCBncm91cFJlYWR5ID0gZmFsc2U7XG4gICAgICBjb25zdCBlbnN1cmVHcm91cCA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBNS1NUUkVBTSBzbyB0aGUgc3RyZWFtIG5lZWQgbm90IGV4aXN0IHlldDsgJyQnID0gb25seSBuZXcgbWVzc2FnZXMuXG4gICAgICAgICAgYXdhaXQgcmVhZGVyLnhncm91cCgnQ1JFQVRFJywga2V5LCBncm91cCwgJyQnLCAnTUtTVFJFQU0nKTtcbiAgICAgICAgICBncm91cFJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKCFpc0J1c3lHcm91cChlcnIpKSB0aHJvdyBlcnI7XG4gICAgICAgICAgZ3JvdXBSZWFkeSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGxvb3AgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIHdoaWxlICghc3RvcHBlZCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIWdyb3VwUmVhZHkpIGF3YWl0IGVuc3VyZUdyb3VwKCk7XG4gICAgICAgICAgICAvLyAxKSBEZWFkLWxldHRlciBtZXNzYWdlcyB0aGF0IGhhdmUgZXhoYXVzdGVkIHRoZWlyIGRlbGl2ZXJpZXMsIHRoZW5cbiAgICAgICAgICAgIC8vICAgIHJlY2xhaW0gdGhlIHJlc3Qgc3RyYW5kZWQgYnkgYSBmYWlsZWQvY3Jhc2hlZCBjb25zdW1lci5cbiAgICAgICAgICAgIGF3YWl0IGRlYWRMZXR0ZXJFeGhhdXN0ZWQoKTtcbiAgICAgICAgICAgIGNvbnN0IGNsYWltZWQgPSBhd2FpdCByZWFkZXIueGF1dG9jbGFpbShrZXksIGdyb3VwLCBjb25zdW1lciwgbWluSWRsZSwgJzAnLCAnQ09VTlQnLCBiYXRjaCk7XG4gICAgICAgICAgICAvLyBYQVVUT0NMQUlNIHJlcGx5OiBbbmV4dEN1cnNvciwgZW50cmllcywgZGVsZXRlZElkc11cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNsYWltZWQpICYmIGNsYWltZWQubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgICAgYXdhaXQgZGVsaXZlcihwYXJzZUVudHJpZXM8VD4odG9waWMsIGNsYWltZWRbMV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdG9wcGVkKSBicmVhaztcblxuICAgICAgICAgICAgLy8gMikgUmVhZCBuZXcsIG5ldmVyLWRlbGl2ZXJlZCBtZXNzYWdlcyBmb3IgdGhpcyBncm91cCAoJz4nKS5cbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJlYWRlci54cmVhZGdyb3VwKFxuICAgICAgICAgICAgICAnR1JPVVAnLCBncm91cCwgY29uc3VtZXIsICdDT1VOVCcsIGJhdGNoLCAnQkxPQ0snLCBibG9ja01zLCAnU1RSRUFNUycsIGtleSwgJz4nLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vIFhSRUFER1JPVVAgcmVwbHk6IFtbc3RyZWFtS2V5LCBlbnRyaWVzXV0gfCBudWxsIChvbiBibG9jayB0aW1lb3V0KVxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzKSAmJiByZXMubGVuZ3RoID4gMCAmJiBBcnJheS5pc0FycmF5KHJlc1swXSkgJiYgcmVzWzBdLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgIGF3YWl0IGRlbGl2ZXIocGFyc2VFbnRyaWVzPFQ+KHRvcGljLCByZXNbMF1bMV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChzdG9wcGVkKSBicmVhaztcbiAgICAgICAgICAgIC8vIFRoZSBzdHJlYW0gb3IgZ3JvdXAgd2FzIGRlbGV0ZWQgb3V0IGZyb20gdW5kZXIgdXMg4oCUIHJlY3JlYXRlIGl0LlxuICAgICAgICAgICAgaWYgKC9OT0dST1VQL2kudGVzdChlcnJvck1lc3NhZ2UoZXJyKSkpIGdyb3VwUmVhZHkgPSBmYWxzZTtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKCdFdmVudCBidXMgY29uc3VtZXIgbG9vcCBlcnJvcjsgYmFja2luZyBvZmYnLCB7IHRvcGljLCBncm91cCwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgICAgICAgICAgLy8gQmFjayBvZmYgc28gYSBwZXJzaXN0ZW50IFJlZGlzIGVycm9yIGRvZXNuJ3QgaG90LXNwaW4uXG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCAxMDAwKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBsb29wUHJvbWlzZSA9IGxvb3AoKTtcbiAgICAgIGxvZ2dlci5pbmZvKCdFdmVudCBidXMgY29uc3VtZXIgc3RhcnRlZCcsIHsgdG9waWMsIGdyb3VwLCBjb25zdW1lciwgbWF4RGVsaXZlcmllcyB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXN5bmMgc3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICBzdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgICAvLyBBd2FpdCB0aGUgaW4tZmxpZ2h0IHJlYWQvaGFuZGxlciBzbyBhIGNhbGxlciAoZS5nLiBhIHNlcnZpY2Ugc2h1dHRpbmdcbiAgICAgICAgICAvLyBkb3duIGl0cyBEQikgZG9lc24ndCByYWNlIGEgbWVzc2FnZSBzdGlsbCBiZWluZyBwcm9jZXNzZWQuIEJvdW5kZWQgYnlcbiAgICAgICAgICAvLyB0aGUgWFJFQURHUk9VUCBCTE9DSyB3aW5kb3cuIE5ldmVyIHJlamVjdHMg4oCUIHRoZSBsb29wIHN3YWxsb3dzIGVycm9ycy5cbiAgICAgICAgICBhd2FpdCBsb29wUHJvbWlzZS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgICAgIGF3YWl0IFByb21pc2UucmVzb2x2ZShyZWFkZXIucXVpdD8uKCkpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgYSBkdXJhYmxlIGV2ZW50IGJ1cyBmcm9tIHRoZSBhbWJpZW50IFJlZGlzIGVudiB2aWEgdGhlIHNoYXJlZFxuICogYGNyZWF0ZUVudlJlZGlzQ2xpZW50YC4gUmV0dXJucyBgbnVsbGAgd2hlbiBSZWRpcyBpcyBub3QgY29uZmlndXJlZCDigJQgdGhlXG4gKiBjYWxsZXIgdGhlbiBydW5zIHdpdGhvdXQgYSBidXMgKHRvZGF5J3MgSFRUUC9yZWNvbmNpbGVyIGJlaGF2aW9yKSwgbmV2ZXJcbiAqIGNyYXNoaW5nLiBPcHQgaW4gd2l0aCBhIHNpbmdsZSBib290IGxpbmUgd2hlcmUgYSBzZXJ2aWNlIHdhbnRzIGR1cmFibGUgZXZlbnRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW52UmVkaXNEdXJhYmxlRXZlbnRCdXMob3B0czogeyBtYXhMZW4/OiBudW1iZXIgfSA9IHt9KTogRHVyYWJsZUV2ZW50QnVzIHwgbnVsbCB7XG4gIGNvbnN0IGluc3QgPSBjcmVhdGVFbnZSZWRpc0NsaWVudDxSZWRpc1N0cmVhbUNsaWVudD4oJ2V2ZW50LWJ1cycpO1xuICBpZiAoIWluc3QpIHJldHVybiBudWxsO1xuICBsb2dnZXIuaW5mbygnUmVkaXMgZHVyYWJsZSBldmVudCBidXMgaW5pdGlhbGl6ZWQnKTtcbiAgcmV0dXJuIGNyZWF0ZVJlZGlzRHVyYWJsZUV2ZW50QnVzKGluc3QsIG9wdHMpO1xufVxuIl19
266
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVyYWJsZS1ldmVudC1idXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvZHVyYWJsZS1ldmVudC1idXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFFSCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVwRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQW9GakQsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDO0FBQzlCLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztBQUN6QixNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUMvQixNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQztBQUNuQyxNQUFNLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztBQUVsQyxTQUFTLFNBQVMsQ0FBQyxLQUFhO0lBQzlCLE9BQU8sT0FBTyxLQUFLLEVBQUUsQ0FBQztBQUN4QixDQUFDO0FBRUQsc0NBQXNDO0FBQ3RDLE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxLQUFhO0lBQy9DLE9BQU8sT0FBTyxLQUFLLE1BQU0sQ0FBQztBQUM1QixDQUFDO0FBRUQsbUZBQW1GO0FBQ25GLFNBQVMsaUJBQWlCLENBQUMsRUFBVTtJQUNuQyxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFB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QUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7WUFFckYsT0FBTztnQkFDTCxLQUFLLENBQUMsSUFBSTtvQkFDUixPQUFPLEdBQUcsSUFBSSxDQUFDO29CQUNmLHdFQUF3RTtvQkFDeEUsd0VBQXdFO29CQUN4RSx5RUFBeUU7b0JBQ3pFLE1BQU0sV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDekMsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNoRSxDQUFDO2FBQ0YsQ0FBQztRQUNKLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLDZCQUE2QixDQUFDLElBQUksR0FBd0IsRUFBRTtJQUMxRSxNQUFNLElBQUksR0FBRyxvQkFBb0IsQ0FBb0IsV0FBVyxDQUFDLENBQUM7SUFDbEUsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLHFDQUFxQyxDQUFDLENBQUM7SUFDbkQsT0FBTywwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDaEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIER1cmFibGUsIGF0LWxlYXN0LW9uY2UgZXZlbnQgYmFja2JvbmUgKFJlZGlzIFN0cmVhbXMpLlxuICpcbiAqIFRoZSBwbGF0Zm9ybSdzIGNyb3NzLXNlcnZpY2Ugc2lnbmFsbGluZyB0b2RheSBpcyBwb2ludC10by1wb2ludCBIVFRQIHBsdXNcbiAqIHBvbGxpbmcgcmVjb25jaWxlcnMgcGx1cyBhbiBJTi1QUk9DRVNTIGJlc3QtZWZmb3J0IGVtaXR0ZXIgKHtAbGluayBlbnRpdHlFdmVudHN9KS5cbiAqIFRoZXJlIGlzIG5vIGR1cmFibGUgYnVzLCBzbyBhIHNpZ25hbCBwcm9kdWNlZCBvbiBvbmUgcG9kIGlzIGVpdGhlciBkZWxpdmVyZWRcbiAqIHN5bmNocm9ub3VzbHkgb3ZlciBIVFRQIChjb3VwbGluZyArIHJldHJ5LXN0b3JtIHJpc2spIG9yIGxvc3QgaWYgdGhlIGNvbnN1bWVyXG4gKiBpcyBtb21lbnRhcmlseSBkb3duICh0aGUgcmVjb25jaWxlcnMgZXhpc3QgdG8gcGFwZXIgb3ZlciBleGFjdGx5IHRoYXQpLlxuICpcbiAqIFRoaXMgaXMgdGhhdCBtaXNzaW5nIGJ1cywgYXMgYSByZXVzYWJsZSBwcmltaXRpdmU6XG4gKiAgLSAqKnB1Ymxpc2godG9waWMsIHBheWxvYWQpKiog4oaSIGBYQUREYCBvbnRvIGEgYm91bmRlZCAoYE1BWExFTiB+YCkgcGVyLXRvcGljXG4gKiAgICBzdHJlYW0uIER1cmFibGUgYWNyb3NzIHJlc3RhcnRzLCBzaGFyZWQgYnkgYWxsIHJlcGxpY2FzLlxuICogIC0gKipzdWJzY3JpYmUoe3RvcGljLCBncm91cCwgY29uc3VtZXIsIGhhbmRsZXJ9KSoqIOKGkiBhIGBYUkVBREdST1VQYCBjb25zdW1lclxuICogICAgb24gaXRzIE9XTiBjb25uZWN0aW9uIChgZHVwbGljYXRlKClgKSwgc28gYSBibG9ja2luZyByZWFkIG5ldmVyIGRlbGF5cyBhXG4gKiAgICBwdWJsaXNoLiBDb25zdW1lciBHUk9VUFMgZ2l2ZSBhdC1sZWFzdC1vbmNlOiBlYWNoIGdyb3VwIGdldHMgZXZlcnkgbWVzc2FnZVxuICogICAgb25jZSwgYSBtZXNzYWdlIHN0YXlzIHBlbmRpbmcgdW50aWwgdGhlIGhhbmRsZXIgYFhBQ0tgcyBpdCwgYW5kIGBYQVVUT0NMQUlNYFxuICogICAgcmVjbGFpbXMgbWVzc2FnZXMgc3RyYW5kZWQgYnkgYSBjcmFzaGVkIGNvbnN1bWVyLiBBIG1lc3NhZ2UgdGhhdCBoYXMgYmVlblxuICogICAgZGVsaXZlcmVkIGBtYXhEZWxpdmVyaWVzYCB0aW1lcyB3aXRob3V0IGFuIGFjayBpcyBtb3ZlZCB0byBhIGRlYWQtbGV0dGVyXG4gKiAgICBzdHJlYW0gKGBldnQ6PHRvcGljPjpkbHFgKSBhbmQgYWNrZWQsIHNvIGEgcG9pc29uIG1lc3NhZ2UgY2FuJ3QgcmVkZWxpdmVyXG4gKiAgICBmb3JldmVyLiBNdWx0aXBsZSBncm91cHMgb24gb25lIHRvcGljID0gaW5kZXBlbmRlbnQgZmFuLW91dC5cbiAqXG4gKiBGQUlMLVNBRkUgKyBPUFQtSU4sIGV4YWN0bHkgbGlrZSB0aGUgYXVkaXQgc3Bvb2w6IHtAbGluayBjcmVhdGVFbnZSZWRpc0R1cmFibGVFdmVudEJ1c31cbiAqIHJldHVybnMgYG51bGxgIHdoZW4gUmVkaXMgaXNuJ3QgY29uZmlndXJlZCwgc28gYSBzZXJ2aWNlIHdpdGhvdXQgaXQgc2ltcGx5XG4gKiBkb2Vzbid0IHVzZSB0aGUgYnVzIChrZWVwcyB0b2RheSdzIGJlaGF2aW9yKS4gQSBwdWJsaXNoIGZhaWx1cmUgaXMgZHJvcHBlZC13aXRoLVxuICogLW1ldHJpYywgbmV2ZXIgdGhyb3duOyBhIGhhbmRsZXIgdGhyb3cgbGVhdmVzIHRoZSBtZXNzYWdlIHVuLWFja2VkIGZvciByZWRlbGl2ZXJ5LlxuICpcbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVFbnZSZWRpc0NsaWVudCB9IGZyb20gJy4vZW52LXJlZGlzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlbWl0Q291bnRlciB9IGZyb20gJy4uL3V0aWxzL21ldHJpYy1lbWl0dGVyLmpzJztcbmltcG9ydCB7IGVycm9yTWVzc2FnZSB9IGZyb20gJy4uL3V0aWxzL3Jlc3BvbnNlLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdkdXJhYmxlLWV2ZW50LWJ1cycpO1xuXG4vKiogQSBkZWxpdmVyZWQgZXZlbnQ6IGl0cyBzdHJlYW0gaWQsIHRvcGljLCBwdWJsaXNoIHRpbWUsIGFuZCBkZWNvZGVkIHBheWxvYWQuICovXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50RW52ZWxvcGU8VCA9IHVua25vd24+IHtcbiAgLyoqIFJlZGlzIFN0cmVhbSBlbnRyeSBpZCAoYDxtcz4tPHNlcT5gKSDigJQgYWxzbyB0aGUgaWRlbXBvdGVuY3kgaGFuZGxlLiAqL1xuICBpZDogc3RyaW5nO1xuICB0b3BpYzogc3RyaW5nO1xuICAvKipcbiAgICogV2hlbiB0aGUgZXZlbnQgd2FzIHB1Ymxpc2hlZCAodGhlIFJlZGlzIHNlcnZlciB0aW1lIGVtYmVkZGVkIGluIHRoZSBzdHJlYW1cbiAgICogaWQpLiBBIHJlZGVsaXZlcnkga2VlcHMgaXRzIE9SSUdJTkFMIHB1Ymxpc2ggdGltZSwgc28gYSBjb25zdW1lciBhcHBseWluZ1xuICAgKiBsYXN0LXdyaXRlci13aW5zIHN0YXRlIChlLmcuIGFuIGVudGl0bGVtZW50IHN5bmMpIGNhbiBvcmRlciBldmVudHMgYnkgaXRcbiAgICogaW5zdGVhZCBvZiBieSBkZWxpdmVyeSB0aW1lIGFuZCByZWZ1c2UgdG8gbGV0IGEgc3RhbGUgcmV0cnkgb3ZlcndyaXRlIGFcbiAgICogbmV3ZXIgc3RhdGUuXG4gICAqL1xuICBwdWJsaXNoZWRBdDogRGF0ZTtcbiAgcGF5bG9hZDogVDtcbn1cblxuLyoqXG4gKiBBIHBhcnNlZCBzdHJlYW0gZW50cnksIHdoaWNoIG1heSBoYXZlIE5PIHVzYWJsZSBwYXlsb2FkLlxuICpcbiAqIFNlcGFyYXRlIGZyb20ge0BsaW5rIEV2ZW50RW52ZWxvcGV9IGJlY2F1c2UgdGhlIHR3byBhcmUgZ2VudWluZWx5IGRpZmZlcmVudCB0aGluZ3MgYW5kXG4gKiBjb25mbGF0aW5nIHRoZW0gY29zdCB0aHJlZSBgdW5kZWZpbmVkIGFzIHVua25vd24gYXMgVGAgY2FzdHM6IGFuIGVudHJ5IHdpdGggbm8gYGRgIGZpZWxkXG4gKiBvciB3aXRoIHVucGFyc2VhYmxlIEpTT04gaXMgYSBwb2lzb24gbWVzc2FnZSwgYW5kIGl0IGhhcyB0byB0cmF2ZWwgZmFyIGVub3VnaCBmb3JcbiAqIGBkZWxpdmVyKClgIHRvIEFDSyBpdCAobGVhdmluZyBpdCBwZW5kaW5nIHdvdWxkIHdlZGdlIHRoZSBncm91cCBmb3JldmVyKS4gRGVjbGFyaW5nIHRoYXRcbiAqIHBvc3NpYmlsaXR5IGhlcmUgbWVhbnMgdGhlIEFDSy13aXRob3V0LWhhbmRsaW5nIHBhdGggaXMgYSB0eXBlIE5BUlJPV0lORyByYXRoZXIgdGhhbiBhXG4gKiBydW50aW1lIGNvbnZlbnRpb24gdGhlIHR5cGUgc3lzdGVtIHdhcyBsaWVkIHRvIGFib3V0IOKAlCBhIGhhbmRsZXIgc3RpbGwgb25seSBldmVyIHNlZXNcbiAqIGBwYXlsb2FkOiBUYC5cbiAqL1xudHlwZSBQYXJzZWRFbnZlbG9wZTxUPiA9IE9taXQ8RXZlbnRFbnZlbG9wZTxUPiwgJ3BheWxvYWQnPiAmIHsgcGF5bG9hZDogVCB8IHVuZGVmaW5lZCB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIFN1YnNjcmliZU9wdGlvbnM8VCA9IHVua25vd24+IHtcbiAgLyoqIFRvcGljIChzdHJlYW0pIHRvIGNvbnN1bWUuICovXG4gIHRvcGljOiBzdHJpbmc7XG4gIC8qKiBDb25zdW1lciBncm91cCDigJQgb25lIGRlbGl2ZXJ5IHBlciBncm91cDsgZGlzdGluY3QgZ3JvdXBzIGZhbiBvdXQuICovXG4gIGdyb3VwOiBzdHJpbmc7XG4gIC8qKiBUaGlzIGNvbnN1bWVyJ3MgaWQgd2l0aGluIHRoZSBncm91cCAoZS5nLiBgJHtzZXJ2aWNlfS0ke3BpZH1gKS4gKi9cbiAgY29uc3VtZXI6IHN0cmluZztcbiAgLyoqIEFzeW5jIGhhbmRsZXIuIFJlc29sdmVzIOKHkiB0aGUgbWVzc2FnZSBpcyBhY2tlZDsgdGhyb3dzIOKHkiBsZWZ0IHBlbmRpbmcgZm9yIHJlZGVsaXZlcnkuICovXG4gIGhhbmRsZXI6IChlbnY6IEV2ZW50RW52ZWxvcGU8VD4pID0+IFByb21pc2U8dm9pZD47XG4gIC8qKiBNYXggbWVzc2FnZXMgcGVyIHJlYWQgKGRlZmF1bHQgMTYpLiAqL1xuICBiYXRjaFNpemU/OiBudW1iZXI7XG4gIC8qKiBYUkVBREdST1VQIGJsb2NrIHRpbWUgaW4gbXMgKGRlZmF1bHQgNTAwMCkuICovXG4gIGJsb2NrTXM/OiBudW1iZXI7XG4gIC8qKiBBIHBlbmRpbmcgbWVzc2FnZSBpZGxlIHRoaXMgbG9uZyAobXMpIGlzIHJlY2xhaW1lZCBmcm9tIGEgZGVhZCBjb25zdW1lciAoZGVmYXVsdCA2MDAwMCkuICovXG4gIG1pbklkbGVNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIERlbGl2ZXJpZXMgYWZ0ZXIgd2hpY2ggYW4gdW4tYWNrZWQgbWVzc2FnZSBpcyBkZWFkLWxldHRlcmVkIHRvXG4gICAqIGBldnQ6PHRvcGljPjpkbHFgIGFuZCBhY2tlZCBpbnN0ZWFkIG9mIGJlaW5nIHJlZGVsaXZlcmVkIGFnYWluIChkZWZhdWx0IDEwKS5cbiAgICovXG4gIG1heERlbGl2ZXJpZXM/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXZlbnRTdWJzY3JpcHRpb24ge1xuICAvKiogU3RvcCB0aGUgY29uc3VtZXIgbG9vcC4gUmVzb2x2ZXMgb25jZSB0aGUgaW4tZmxpZ2h0IHJlYWQgcmV0dXJucy4gKi9cbiAgc3RvcCgpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIER1cmFibGVFdmVudEJ1cyB7XG4gIC8qKiBQdWJsaXNoIGEgcGF5bG9hZCB0byBhIHRvcGljLiBSZXR1cm5zIHRoZSBzdHJlYW0gaWQsIG9yIG51bGwgb24gZmFpbHVyZSAoZHJvcHBlZCwgbmV2ZXIgdGhyb3dzKS4gKi9cbiAgcHVibGlzaDxUPih0b3BpYzogc3RyaW5nLCBwYXlsb2FkOiBUKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcbiAgLyoqIFN0YXJ0IGEgY29uc3VtZXItZ3JvdXAgcmVhZGVyIGZvciBhIHRvcGljLiBGaXJlLWFuZC1mb3JnZXQgbG9vcDsgY2FsbCBgc3RvcCgpYCB0byBlbmQgaXQuICovXG4gIHN1YnNjcmliZTxUPihvcHRzOiBTdWJzY3JpYmVPcHRpb25zPFQ+KTogRXZlbnRTdWJzY3JpcHRpb247XG59XG5cbi8qKlxuICogVGhlIHN1YnNldCBvZiBpb3JlZGlzJyBTdHJlYW0gQVBJIHRoZSBidXMgdXNlcy4gS2VwdCBtaW5pbWFsIHNvIGEgdGVzdCBjYW5cbiAqIHN1cHBseSBhbiBpbi1tZW1vcnkgZmFrZSBhbmQgc28gbWVyZWx5IGltcG9ydGluZyB0aGlzIG5ldmVyIGhhcmQtZGVwZW5kcyBvblxuICogaW9yZWRpcyAoY29uc3RydWN0ZWQgdmlhIHRoZSBzaGFyZWQgZW52IGhlbHBlcikuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVkaXNTdHJlYW1DbGllbnQge1xuICB4YWRkKGtleTogc3RyaW5nLCAuLi5hcmdzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcbiAgeGdyb3VwKC4uLmFyZ3M6IChzdHJpbmcgfCBudW1iZXIpW10pOiBQcm9taXNlPHVua25vd24+O1xuICB4cmVhZGdyb3VwKC4uLmFyZ3M6IChzdHJpbmcgfCBudW1iZXIpW10pOiBQcm9taXNlPHVua25vd24+O1xuICB4YWNrKGtleTogc3RyaW5nLCBncm91cDogc3RyaW5nLCAuLi5pZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxudW1iZXI+O1xuICB4YXV0b2NsYWltKC4uLmFyZ3M6IChzdHJpbmcgfCBudW1iZXIpW10pOiBQcm9taXNlPHVua25vd24+O1xuICB4cGVuZGluZyhrZXk6IHN0cmluZywgZ3JvdXA6IHN0cmluZywgLi4uYXJnczogKHN0cmluZyB8IG51bWJlcilbXSk6IFByb21pc2U8dW5rbm93bj47XG4gIHhyYW5nZShrZXk6IHN0cmluZywgc3RhcnQ6IHN0cmluZywgZW5kOiBzdHJpbmcsIC4uLmFyZ3M6IChzdHJpbmcgfCBudW1iZXIpW10pOiBQcm9taXNlPHVua25vd24+O1xuICAvKiogQSBuZXcgY29ubmVjdGlvbiB3aXRoIHRoZSBzYW1lIG9wdGlvbnMg4oCUIGVhY2ggc3Vic2NyaWJlciByZWFkcyBvbiBpdHMgb3duLiAqL1xuICBkdXBsaWNhdGUoKTogUmVkaXNTdHJlYW1DbGllbnQ7XG4gIHF1aXQ/KCk6IFByb21pc2U8dW5rbm93bj47XG4gIG9uPyhldmVudDogJ2Vycm9yJywgY2I6IChlcnI6IHVua25vd24pID0+IHZvaWQpOiB1bmtub3duO1xufVxuXG5jb25zdCBERUZBVUxUX01BWExFTiA9IDEwXzAwMDtcbmNvbnN0IERFRkFVTFRfQkFUQ0ggPSAxNjtcbmNvbnN0IERFRkFVTFRfQkxPQ0tfTVMgPSA1XzAwMDtcbmNvbnN0IERFRkFVTFRfTUlOX0lETEVfTVMgPSA2MF8wMDA7XG5jb25zdCBERUZBVUxUX01BWF9ERUxJVkVSSUVTID0gMTA7XG5cbmZ1bmN0aW9uIHN0cmVhbUtleSh0b3BpYzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBldnQ6JHt0b3BpY31gO1xufVxuXG4vKiogRGVhZC1sZXR0ZXIgc3RyZWFtIGZvciBhIHRvcGljLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlYWRMZXR0ZXJTdHJlYW1LZXkodG9waWM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgZXZ0OiR7dG9waWN9OmRscWA7XG59XG5cbi8qKiBQdWJsaXNoIHRpbWUgZnJvbSBhIHN0cmVhbSBpZCAoYDxtcz4tPHNlcT5gKTsgZXBvY2ggMCBmb3IgYW4gdW5wYXJzZWFibGUgaWQuICovXG5mdW5jdGlvbiBwdWJsaXNoZWRBdEZyb21JZChpZDogc3RyaW5nKTogRGF0ZSB7XG4gIGNvbnN0IG1zID0gTnVtYmVyKGlkLnNwbGl0KCctJylbMF0pO1xuICByZXR1cm4gbmV3IERhdGUoTnVtYmVyLmlzRmluaXRlKG1zKSA/IG1zIDogMCk7XG59XG5cbi8qKiBUcnVlIHdoZW4gdGhlIGVycm9yIGlzIFJlZGlzJyBcImdyb3VwIGFscmVhZHkgZXhpc3RzXCIgKGlkZW1wb3RlbnQgY3JlYXRlKS4gKi9cbmZ1bmN0aW9uIGlzQnVzeUdyb3VwKGVycjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gZXJyb3JNZXNzYWdlKGVycikuaW5jbHVkZXMoJ0JVU1lHUk9VUCcpO1xufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBuZXN0ZWQgYXJyYXkgc2hhcGUgWFJFQURHUk9VUCAvIFhBVVRPQ0xBSU0gcmV0dXJuIGludG8gZmxhdCBlbnZlbG9wZXMuXG4gKiBYUkVBREdST1VQOiBgW1tzdHJlYW1LZXksIFtbaWQsIFtmLCB2LCAuLi5dXSwgLi4uXV1dYC5cbiAqIFhBVVRPQ0xBSU06IGBbbmV4dEN1cnNvciwgW1tpZCwgW2YsIHYsIC4uLl1dLCAuLi5dLCBkZWxldGVkSWRzXWAuXG4gKiBXZSBzdG9yZSB0aGUgSlNPTiBwYXlsb2FkIHVuZGVyIGEgc2luZ2xlIGZpZWxkIGBkYC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VFbnRyaWVzPFQ+KHRvcGljOiBzdHJpbmcsIGVudHJpZXM6IHVua25vd24pOiBQYXJzZWRFbnZlbG9wZTxUPltdIHtcbiAgY29uc3Qgb3V0OiBQYXJzZWRFbnZlbG9wZTxUPltdID0gW107XG4gIGlmICghQXJyYXkuaXNBcnJheShlbnRyaWVzKSkgcmV0dXJuIG91dDtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGVudHJ5KSB8fCBlbnRyeS5sZW5ndGggPCAyKSBjb250aW51ZTtcbiAgICBjb25zdCBpZCA9IFN0cmluZyhlbnRyeVswXSk7XG4gICAgY29uc3QgZmllbGRzID0gZW50cnlbMV07XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGZpZWxkcykpIGNvbnRpbnVlO1xuICAgIC8vIGZpZWxkcyBpcyBbbmFtZSwgdmFsdWUsIG5hbWUsIHZhbHVlLCAuLi5dOyBmaW5kICdkJy5cbiAgICBsZXQgcmF3OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgKyAxIDwgZmllbGRzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICBpZiAoU3RyaW5nKGZpZWxkc1tpXSkgPT09ICdkJykgeyByYXcgPSBTdHJpbmcoZmllbGRzW2kgKyAxXSk7IGJyZWFrOyB9XG4gICAgfVxuICAgIC8vIEEgbWlzc2luZyBgZGAgZmllbGQgKGFuIGVudHJ5IG5vdCB3cml0dGVuIGJ5IHB1Ymxpc2goKSkgT1IgYSBjb3JydXB0IEpTT05cbiAgICAvLyBwYXlsb2FkIGJvdGggeWllbGQgYW4gdW5kZWZpbmVkLXBheWxvYWQgZW52ZWxvcGUgc28gYGRlbGl2ZXIoKWAgQUNLcyBpdCDigJRcbiAgICAvLyBhIHBvaXNvbiBtZXNzYWdlIG11c3QgbmV2ZXIgd2VkZ2UgdGhlIGdyb3VwIGJ5IHN0YXlpbmcgcGVycGV0dWFsbHkgcGVuZGluZy5cbiAgICBjb25zdCBwdWJsaXNoZWRBdCA9IHB1Ymxpc2hlZEF0RnJvbUlkKGlkKTtcbiAgICBpZiAocmF3ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG91dC5wdXNoKHsgaWQsIHRvcGljLCBwdWJsaXNoZWRBdCwgcGF5bG9hZDogdW5kZWZpbmVkIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBvdXQucHVzaCh7IGlkLCB0b3BpYywgcHVibGlzaGVkQXQsIHBheWxvYWQ6IEpTT04ucGFyc2UocmF3KSBhcyBUIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgb3V0LnB1c2goeyBpZCwgdG9waWMsIHB1Ymxpc2hlZEF0LCBwYXlsb2FkOiB1bmRlZmluZWQgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBCdWlsZCBhIGR1cmFibGUgZXZlbnQgYnVzIG92ZXIgYSBSZWRpcyBTdHJlYW1zIGNsaWVudC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWRpc0R1cmFibGVFdmVudEJ1cyhcbiAgcmVkaXM6IFJlZGlzU3RyZWFtQ2xpZW50LFxuICBvcHRzOiB7IG1heExlbj86IG51bWJlciB9ID0ge30sXG4pOiBEdXJhYmxlRXZlbnRCdXMge1xuICBjb25zdCBtYXhMZW4gPSBNYXRoLm1heCgxLCBvcHRzLm1heExlbiA/PyBERUZBVUxUX01BWExFTik7XG5cbiAgcmV0dXJuIHtcbiAgICBhc3luYyBwdWJsaXNoPFQ+KHRvcGljOiBzdHJpbmcsIHBheWxvYWQ6IFQpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICAgIGNvbnN0IGtleSA9IHN0cmVhbUtleSh0b3BpYyk7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBNQVhMRU4gfiA8bj4gYm91bmRzIHRoZSBzdHJlYW0gYXBwcm94aW1hdGVseSAoY2hlYXApOyBgKmAgPSBzZXJ2ZXIgaWQuXG4gICAgICAgIGNvbnN0IGlkID0gYXdhaXQgcmVkaXMueGFkZChrZXksICdNQVhMRU4nLCAnficsIG1heExlbiwgJyonLCAnZCcsIEpTT04uc3RyaW5naWZ5KHBheWxvYWQpKTtcbiAgICAgICAgZW1pdENvdW50ZXIoJ2V2ZW50X2J1c19wdWJsaXNoZWRfdG90YWwnLCB7IHRvcGljIH0pO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgZW1pdENvdW50ZXIoJ2V2ZW50X2J1c19wdWJsaXNoX2ZhaWxlZF90b3RhbCcsIHsgdG9waWMgfSk7XG4gICAgICAgIGxvZ2dlci53YXJuKCdFdmVudCBidXMgcHVibGlzaCBmYWlsZWQgKGV2ZW50IGRyb3BwZWQpJywgeyB0b3BpYywgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3Vic2NyaWJlPFQ+KHN1Yk9wdHM6IFN1YnNjcmliZU9wdGlvbnM8VD4pOiBFdmVudFN1YnNjcmlwdGlvbiB7XG4gICAgICBjb25zdCB7IHRvcGljLCBncm91cCwgY29uc3VtZXIsIGhhbmRsZXIgfSA9IHN1Yk9wdHM7XG4gICAgICBjb25zdCBrZXkgPSBzdHJlYW1LZXkodG9waWMpO1xuICAgICAgY29uc3QgZGxxS2V5ID0gZGVhZExldHRlclN0cmVhbUtleSh0b3BpYyk7XG4gICAgICBjb25zdCBiYXRjaCA9IE1hdGgubWF4KDEsIHN1Yk9wdHMuYmF0Y2hTaXplID8/IERFRkFVTFRfQkFUQ0gpO1xuICAgICAgY29uc3QgYmxvY2tNcyA9IE1hdGgubWF4KDAsIHN1Yk9wdHMuYmxvY2tNcyA/PyBERUZBVUxUX0JMT0NLX01TKTtcbiAgICAgIGNvbnN0IG1pbklkbGUgPSBNYXRoLm1heCgwLCBzdWJPcHRzLm1pbklkbGVNcyA/PyBERUZBVUxUX01JTl9JRExFX01TKTtcbiAgICAgIGNvbnN0IG1heERlbGl2ZXJpZXMgPSBNYXRoLm1heCgxLCBzdWJPcHRzLm1heERlbGl2ZXJpZXMgPz8gREVGQVVMVF9NQVhfREVMSVZFUklFUyk7XG5cbiAgICAgIC8vIGBYUkVBREdST1VQIEJMT0NLYCBob2xkcyBpdHMgY29ubmVjdGlvbiBmb3IgdXAgdG8gYGJsb2NrTXNgOyBvbiB0aGVcbiAgICAgIC8vIHNoYXJlZCBjbGllbnQgZXZlcnkgcHVibGlzaCBxdWV1ZWQgYmVoaW5kIGl0LiBSZWFkIG9uIGEgZGVkaWNhdGVkIG9uZS5cbiAgICAgIGNvbnN0IHJlYWRlciA9IHJlZGlzLmR1cGxpY2F0ZSgpO1xuICAgICAgLy8gQSBkdXBsaWNhdGVkIGlvcmVkaXMgY29ubmVjdGlvbiBkb2Vzbid0IGluaGVyaXQgbGlzdGVuZXJzOyB3aXRob3V0IG9uZSBhXG4gICAgICAvLyBjb25uZWN0aW9uIGVycm9yIGlzIGFuIHVuaGFuZGxlZCAnZXJyb3InIGV2ZW50IHRoYXQgY3Jhc2hlcyB0aGUgcHJvY2Vzcy5cbiAgICAgIHJlYWRlci5vbj8uKCdlcnJvcicsIChlcnIpID0+IGxvZ2dlci53YXJuKCdFdmVudCBidXMgcmVhZGVyIGNvbm5lY3Rpb24gZXJyb3InLCB7IHRvcGljLCBncm91cCwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pKTtcblxuICAgICAgbGV0IHN0b3BwZWQgPSBmYWxzZTtcblxuICAgICAgY29uc3QgZGVsaXZlciA9IGFzeW5jIChlbnZzOiBQYXJzZWRFbnZlbG9wZTxUPltdKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZW52IG9mIGVudnMpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gVGhlIG5hcnJvd2luZyB0aGF0IHVzZWQgdG8gYmUgYSBjYXN0OiBpbnNpZGUgdGhpcyBicmFuY2ggYHBheWxvYWRgIGlzIGBUYCxcbiAgICAgICAgICAgIC8vIHNvIGBlbnZgIHJlYWxseSBpcyBhbiBFdmVudEVudmVsb3BlPFQ+IGFuZCB0aGUgaGFuZGxlcidzIHR5cGUgaXMgaG9uZXN0LlxuICAgICAgICAgICAgaWYgKGVudi5wYXlsb2FkICE9PSB1bmRlZmluZWQpIGF3YWl0IGhhbmRsZXIoZW52IGFzIEV2ZW50RW52ZWxvcGU8VD4pO1xuICAgICAgICAgICAgLy8gQWNrIG9uIHN1Y2Nlc3MgT1Igb24gYW4gdW5kZWZpbmVkIChjb3JydXB0KSBwYXlsb2FkIOKAlCBhIHBvaXNvblxuICAgICAgICAgICAgLy8gbWVzc2FnZSBtdXN0IG5vdCBibG9jayB0aGUgZ3JvdXAgZm9yZXZlci5cbiAgICAgICAgICAgIGF3YWl0IHJlYWRlci54YWNrKGtleSwgZ3JvdXAsIGVudi5pZCk7XG4gICAgICAgICAgICBlbWl0Q291bnRlcignZXZlbnRfYnVzX2RlbGl2ZXJlZF90b3RhbCcsIHsgdG9waWMsIGdyb3VwIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy8gTGVhdmUgaXQgcGVuZGluZyAobm8gWEFDSykg4oCUIFhBVVRPQ0xBSU0gcmVkZWxpdmVycyBpdCBhZnRlciBtaW5JZGxlLlxuICAgICAgICAgICAgZW1pdENvdW50ZXIoJ2V2ZW50X2J1c19oYW5kbGVyX2ZhaWxlZF90b3RhbCcsIHsgdG9waWMsIGdyb3VwIH0pO1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0V2ZW50IGhhbmRsZXIgZmFpbGVkOyBsZWF2aW5nIG1lc3NhZ2UgcGVuZGluZyBmb3IgcmVkZWxpdmVyeScsIHtcbiAgICAgICAgICAgICAgdG9waWMsIGdyb3VwLCBpZDogZW52LmlkLCBlcnJvcjogZXJyb3JNZXNzYWdlKGVyciksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8qKlxuICAgICAgICogTW92ZSBldmVyeSBpZGxlIHBlbmRpbmcgbWVzc2FnZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gZGVsaXZlcmVkXG4gICAgICAgKiBgbWF4RGVsaXZlcmllc2AgdGltZXMgdG8gdGhlIGRlYWQtbGV0dGVyIHN0cmVhbSBhbmQgYWNrIGl0LiBUaGUgZW50cnlcbiAgICAgICAqIGtlZXBzIGl0cyBwYXlsb2FkIHBsdXMgd2hlcmUgaXQgY2FtZSBmcm9tLCBzbyBhbiBvcGVyYXRvciBjYW4gaW5zcGVjdCBvclxuICAgICAgICogcmVwbGF5IGl0LiBJZiBjb3B5aW5nIGZhaWxzIHRoZSBtZXNzYWdlIGlzIGxlZnQgcGVuZGluZyAocmV0cmllZCBuZXh0XG4gICAgICAgKiBwYXNzKSDigJQgaXQgaXMgbmV2ZXIgYWNrZWQgd2l0aG91dCBiZWluZyBwcmVzZXJ2ZWQuXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGRlYWRMZXR0ZXJFeGhhdXN0ZWQgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGNvbnN0IHBlbmRpbmcgPSBhd2FpdCByZWFkZXIueHBlbmRpbmcoa2V5LCBncm91cCwgJ0lETEUnLCBtaW5JZGxlLCAnLScsICcrJywgYmF0Y2gpO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGVuZGluZykpIHJldHVybjtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIHBlbmRpbmcpIHtcbiAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocCkgfHwgcC5sZW5ndGggPCA0KSBjb250aW51ZTtcbiAgICAgICAgICBjb25zdCBpZCA9IFN0cmluZyhwWzBdKTtcbiAgICAgICAgICBjb25zdCBkZWxpdmVyaWVzID0gTnVtYmVyKHBbM10pO1xuICAgICAgICAgIGlmICghKGRlbGl2ZXJpZXMgPj0gbWF4RGVsaXZlcmllcykpIGNvbnRpbnVlO1xuICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCByZWFkZXIueHJhbmdlKGtleSwgaWQsIGlkKTtcbiAgICAgICAgICBjb25zdCBmaWVsZHMgPSBBcnJheS5pc0FycmF5KGVudHJpZXMpICYmIEFycmF5LmlzQXJyYXkoZW50cmllc1swXSkgJiYgQXJyYXkuaXNBcnJheShlbnRyaWVzWzBdWzFdKSA/IGVudHJpZXNbMF1bMV0gOiBbXTtcbiAgICAgICAgICBsZXQgcmF3ID0gJyc7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgKyAxIDwgZmllbGRzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgICBpZiAoU3RyaW5nKGZpZWxkc1tpXSkgPT09ICdkJykgeyByYXcgPSBTdHJpbmcoZmllbGRzW2kgKyAxXSk7IGJyZWFrOyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IHJlYWRlci54YWRkKFxuICAgICAgICAgICAgZGxxS2V5LCAnTUFYTEVOJywgJ34nLCBtYXhMZW4sICcqJyxcbiAgICAgICAgICAgICdkJywgcmF3LCAnc291cmNlSWQnLCBpZCwgJ2dyb3VwJywgZ3JvdXAsICdkZWxpdmVyaWVzJywgZGVsaXZlcmllcyxcbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IHJlYWRlci54YWNrKGtleSwgZ3JvdXAsIGlkKTtcbiAgICAgICAgICBlbWl0Q291bnRlcignZXZlbnRfYnVzX2RlYWRfbGV0dGVyZWRfdG90YWwnLCB7IHRvcGljLCBncm91cCB9KTtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0V2ZW50IGV4Y2VlZGVkIG1heCBkZWxpdmVyaWVzOyBtb3ZlZCB0byBkZWFkLWxldHRlciBzdHJlYW0nLCB7XG4gICAgICAgICAgICB0b3BpYywgZ3JvdXAsIGlkLCBkZWxpdmVyaWVzLCBkZWFkTGV0dGVyU3RyZWFtOiBkbHFLZXksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8vIFRoZSBjb25zdW1lciBncm91cCBtdXN0IGV4aXN0IGJlZm9yZSBYUkVBREdST1VQIGNhbiBzdWNjZWVkLiBDcmVhdGluZyBpdFxuICAgICAgLy8gaXMgcmV0cmllZCBpbnNpZGUgdGhlIGxvb3A6IGF0IHN0YXJ0dXAgdGhlIGNsaWVudCBtYXkgbm90IGhhdmUgY29ubmVjdGVkXG4gICAgICAvLyB5ZXQsIGFuZCBhIHNpbmdsZSBmYWlsZWQgYXR0ZW1wdCB3b3VsZCBsZWF2ZSB0aGUgY29uc3VtZXIgcmVhZGluZyBhXG4gICAgICAvLyBncm91cCB0aGF0IHdhcyBuZXZlciBjcmVhdGVkIOKAlCBmb3JldmVyLlxuICAgICAgbGV0IGdyb3VwUmVhZHkgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGVuc3VyZUdyb3VwID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIE1LU1RSRUFNIHNvIHRoZSBzdHJlYW0gbmVlZCBub3QgZXhpc3QgeWV0OyAnJCcgPSBvbmx5IG5ldyBtZXNzYWdlcy5cbiAgICAgICAgICBhd2FpdCByZWFkZXIueGdyb3VwKCdDUkVBVEUnLCBrZXksIGdyb3VwLCAnJCcsICdNS1NUUkVBTScpO1xuICAgICAgICAgIGdyb3VwUmVhZHkgPSB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoIWlzQnVzeUdyb3VwKGVycikpIHRocm93IGVycjtcbiAgICAgICAgICBncm91cFJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3QgbG9vcCA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgd2hpbGUgKCFzdG9wcGVkKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghZ3JvdXBSZWFkeSkgYXdhaXQgZW5zdXJlR3JvdXAoKTtcbiAgICAgICAgICAgIC8vIDEpIERlYWQtbGV0dGVyIG1lc3NhZ2VzIHRoYXQgaGF2ZSBleGhhdXN0ZWQgdGhlaXIgZGVsaXZlcmllcywgdGhlblxuICAgICAgICAgICAgLy8gICAgcmVjbGFpbSB0aGUgcmVzdCBzdHJhbmRlZCBieSBhIGZhaWxlZC9jcmFzaGVkIGNvbnN1bWVyLlxuICAgICAgICAgICAgYXdhaXQgZGVhZExldHRlckV4aGF1c3RlZCgpO1xuICAgICAgICAgICAgY29uc3QgY2xhaW1lZCA9IGF3YWl0IHJlYWRlci54YXV0b2NsYWltKGtleSwgZ3JvdXAsIGNvbnN1bWVyLCBtaW5JZGxlLCAnMCcsICdDT1VOVCcsIGJhdGNoKTtcbiAgICAgICAgICAgIC8vIFhBVVRPQ0xBSU0gcmVwbHk6IFtuZXh0Q3Vyc29yLCBlbnRyaWVzLCBkZWxldGVkSWRzXVxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2xhaW1lZCkgJiYgY2xhaW1lZC5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgICBhd2FpdCBkZWxpdmVyKHBhcnNlRW50cmllczxUPih0b3BpYywgY2xhaW1lZFsxXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0b3BwZWQpIGJyZWFrO1xuXG4gICAgICAgICAgICAvLyAyKSBSZWFkIG5ldywgbmV2ZXItZGVsaXZlcmVkIG1lc3NhZ2VzIGZvciB0aGlzIGdyb3VwICgnPicpLlxuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgcmVhZGVyLnhyZWFkZ3JvdXAoXG4gICAgICAgICAgICAgICdHUk9VUCcsIGdyb3VwLCBjb25zdW1lciwgJ0NPVU5UJywgYmF0Y2gsICdCTE9DSycsIGJsb2NrTXMsICdTVFJFQU1TJywga2V5LCAnPicsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gWFJFQURHUk9VUCByZXBseTogW1tzdHJlYW1LZXksIGVudHJpZXNdXSB8IG51bGwgKG9uIGJsb2NrIHRpbWVvdXQpXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXMpICYmIHJlcy5sZW5ndGggPiAwICYmIEFycmF5LmlzQXJyYXkocmVzWzBdKSAmJiByZXNbMF0ubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgICAgYXdhaXQgZGVsaXZlcihwYXJzZUVudHJpZXM8VD4odG9waWMsIHJlc1swXVsxXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKHN0b3BwZWQpIGJyZWFrO1xuICAgICAgICAgICAgLy8gVGhlIHN0cmVhbSBvciBncm91cCB3YXMgZGVsZXRlZCBvdXQgZnJvbSB1bmRlciB1cyDigJQgcmVjcmVhdGUgaXQuXG4gICAgICAgICAgICBpZiAoL05PR1JPVVAvaS50ZXN0KGVycm9yTWVzc2FnZShlcnIpKSkgZ3JvdXBSZWFkeSA9IGZhbHNlO1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0V2ZW50IGJ1cyBjb25zdW1lciBsb29wIGVycm9yOyBiYWNraW5nIG9mZicsIHsgdG9waWMsIGdyb3VwLCBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgICAgICAgICAvLyBCYWNrIG9mZiBzbyBhIHBlcnNpc3RlbnQgUmVkaXMgZXJyb3IgZG9lc24ndCBob3Qtc3Bpbi5cbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIDEwMDApKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGxvb3BQcm9taXNlID0gbG9vcCgpO1xuICAgICAgbG9nZ2VyLmluZm8oJ0V2ZW50IGJ1cyBjb25zdW1lciBzdGFydGVkJywgeyB0b3BpYywgZ3JvdXAsIGNvbnN1bWVyLCBtYXhEZWxpdmVyaWVzIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgICAgIC8vIEF3YWl0IHRoZSBpbi1mbGlnaHQgcmVhZC9oYW5kbGVyIHNvIGEgY2FsbGVyIChlLmcuIGEgc2VydmljZSBzaHV0dGluZ1xuICAgICAgICAgIC8vIGRvd24gaXRzIERCKSBkb2Vzbid0IHJhY2UgYSBtZXNzYWdlIHN0aWxsIGJlaW5nIHByb2Nlc3NlZC4gQm91bmRlZCBieVxuICAgICAgICAgIC8vIHRoZSBYUkVBREdST1VQIEJMT0NLIHdpbmRvdy4gTmV2ZXIgcmVqZWN0cyDigJQgdGhlIGxvb3Agc3dhbGxvd3MgZXJyb3JzLlxuICAgICAgICAgIGF3YWl0IGxvb3BQcm9taXNlLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICAgICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKHJlYWRlci5xdWl0Py4oKSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIGR1cmFibGUgZXZlbnQgYnVzIGZyb20gdGhlIGFtYmllbnQgUmVkaXMgZW52IHZpYSB0aGUgc2hhcmVkXG4gKiBgY3JlYXRlRW52UmVkaXNDbGllbnRgLiBSZXR1cm5zIGBudWxsYCB3aGVuIFJlZGlzIGlzIG5vdCBjb25maWd1cmVkIOKAlCB0aGVcbiAqIGNhbGxlciB0aGVuIHJ1bnMgd2l0aG91dCBhIGJ1cyAodG9kYXkncyBIVFRQL3JlY29uY2lsZXIgYmVoYXZpb3IpLCBuZXZlclxuICogY3Jhc2hpbmcuIE9wdCBpbiB3aXRoIGEgc2luZ2xlIGJvb3QgbGluZSB3aGVyZSBhIHNlcnZpY2Ugd2FudHMgZHVyYWJsZSBldmVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZSZWRpc0R1cmFibGVFdmVudEJ1cyhvcHRzOiB7IG1heExlbj86IG51bWJlciB9ID0ge30pOiBEdXJhYmxlRXZlbnRCdXMgfCBudWxsIHtcbiAgY29uc3QgaW5zdCA9IGNyZWF0ZUVudlJlZGlzQ2xpZW50PFJlZGlzU3RyZWFtQ2xpZW50PignZXZlbnQtYnVzJyk7XG4gIGlmICghaW5zdCkgcmV0dXJuIG51bGw7XG4gIGxvZ2dlci5pbmZvKCdSZWRpcyBkdXJhYmxlIGV2ZW50IGJ1cyBpbml0aWFsaXplZCcpO1xuICByZXR1cm4gY3JlYXRlUmVkaXNEdXJhYmxlRXZlbnRCdXMoaW5zdCwgb3B0cyk7XG59XG4iXX0=
@@ -1,6 +1,6 @@
1
1
  export { exchangeApiKey, resetApiKeyExchangeCache, ApiKeyRejectedError, ApiKeyExchangeUnavailableError, } from './api-key-exchange.js';
2
2
  export { createCacheService, type RedisCacheClient, type CacheInvalidationMessage, type CacheInvalidationBus, type RedisInvalidationClient, CacheService, } from './cache-service.js';
3
- export { withLeaderLock, createEnvRedisLock, type LockRedis, } from './leader-lock.js';
3
+ export { withLeaderLock, createEnvRedisLock, leaderLockKey, DEFAULT_LEADER_LOCK_TTL_MS, type LockRedis, type LeaderLockRun, type LeaderLockOptions, type LeaderLockAbortReason, } from './leader-lock.js';
4
4
  export { sendSystemNotification, SYSTEM_NOTIFY_PATH, type SystemNotification, } from './system-notification.js';
5
5
  export { createScheduler, type SchedulerOptions, type Scheduler, } from './scheduler.js';
6
6
  export { createComplianceClient, type ComplianceCheckResult, type ComplianceViolation, } from './compliance-client.js';
@@ -2,7 +2,7 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  export { exchangeApiKey, resetApiKeyExchangeCache, ApiKeyRejectedError, ApiKeyExchangeUnavailableError, } from './api-key-exchange.js';
4
4
  export { createCacheService, CacheService, } from './cache-service.js';
5
- export { withLeaderLock, createEnvRedisLock, } from './leader-lock.js';
5
+ export { withLeaderLock, createEnvRedisLock, leaderLockKey, DEFAULT_LEADER_LOCK_TTL_MS, } from './leader-lock.js';
6
6
  export { sendSystemNotification, SYSTEM_NOTIFY_PATH, } from './system-notification.js';
7
7
  export { createScheduler, } from './scheduler.js';
8
8
  export { createComplianceClient, } from './compliance-client.js';
@@ -31,4 +31,4 @@ export { createMemorySseTicketStore, createEnvSseTicketStore, envSseTicketCaps,
31
31
  export { wireServiceSecurity, } from './service-boot.js';
32
32
  export { createWebhookChannel, createEmailChannel, createChannelRegistry, } from './notification-channels.js';
33
33
  export { createEcosystemNotifyClient, ECOSYSTEM_NOTIFY_PATH, } from './ecosystem-notify-client.js';
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQ0wsY0FBYyxFQUNkLHdCQUF3QixFQUN4QixtQkFBbUIsRUFDbkIsOEJBQThCLEdBQy9CLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUNMLGtCQUFrQixFQUtsQixZQUFZLEdBQ2IsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wsY0FBYyxFQUNkLGtCQUFrQixHQUVuQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsa0JBQWtCLEdBRW5CLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUNMLGVBQWUsR0FHaEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsc0JBQXNCLEdBR3ZCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixvQkFBb0IsRUFDcEIsMkJBQTJCLEVBRTNCLDhCQUE4QixHQUUvQixNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLGNBQWMsa0NBQWtDLENBQUM7QUFDakQsT0FBTyxFQUdMLFlBQVksR0FDYixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixrQkFBa0IsR0FDbkIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixlQUFlLEVBQ2YsU0FBUyxHQUNWLE1BQU0saUJBQWlCLENBQUM7QUFDekIsaUZBQWlGO0FBQ2pGLDhFQUE4RTtBQUM5RSxpRkFBaUY7QUFDakYsK0RBQStEO0FBQy9ELE9BQU8sRUFDTCxZQUFZLEVBQ1osZUFBZSxFQUNmLGdCQUFnQixHQUNqQixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLCtFQUErRTtBQUMvRSx5REFBeUQ7QUFDekQsT0FBTyxFQUNMLG9CQUFvQixHQUNyQixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFDTCw2QkFBNkIsR0FHOUIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQ0wscUJBQXFCLEdBQ3RCLE1BQU0scUJBQXFCLENBQUM7QUFJN0IsT0FBTyxFQUNMLGFBQWEsRUFDYixZQUFZLEdBQ2IsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLGtCQUFrQixFQUNsQixjQUFjLEVBQ2QsWUFBWSxFQUNaLHNCQUFzQixFQUN0QixjQUFjLEdBR2YsTUFBTSxZQUFZLENBQUM7QUFDcEIsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixzQkFBc0IsRUFDdEIsV0FBVyxHQUdaLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUNMLGFBQWEsRUFDYix3QkFBd0IsR0FFekIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixVQUFVLEVBQ1YsZ0JBQWdCLEdBRWpCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLCtCQUErQixFQUMvQixrQ0FBa0MsRUFDbEMsc0JBQXNCLEVBQ3RCLHdCQUF3QixFQUN4QiwyQkFBMkIsR0FDNUIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQ0wsMEJBQTBCLEVBQzFCLHVCQUF1QixFQUN2QixnQkFBZ0IsR0FJakIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQ0wsbUJBQW1CLEdBQ3BCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixrQkFBa0IsRUFDbEIscUJBQXFCLEdBTXRCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUNMLDJCQUEyQixFQUMzQixxQkFBcUIsR0FFdEIsTUFBTSw4QkFBOEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5leHBvcnQge1xuICBleGNoYW5nZUFwaUtleSxcbiAgcmVzZXRBcGlLZXlFeGNoYW5nZUNhY2hlLFxuICBBcGlLZXlSZWplY3RlZEVycm9yLFxuICBBcGlLZXlFeGNoYW5nZVVuYXZhaWxhYmxlRXJyb3IsXG59IGZyb20gJy4vYXBpLWtleS1leGNoYW5nZS5qcyc7XG5leHBvcnQge1xuICBjcmVhdGVDYWNoZVNlcnZpY2UsXG4gIHR5cGUgUmVkaXNDYWNoZUNsaWVudCxcbiAgdHlwZSBDYWNoZUludmFsaWRhdGlvbk1lc3NhZ2UsXG4gIHR5cGUgQ2FjaGVJbnZhbGlkYXRpb25CdXMsXG4gIHR5cGUgUmVkaXNJbnZhbGlkYXRpb25DbGllbnQsXG4gIENhY2hlU2VydmljZSxcbn0gZnJvbSAnLi9jYWNoZS1zZXJ2aWNlLmpzJztcbmV4cG9ydCB7XG4gIHdpdGhMZWFkZXJMb2NrLFxuICBjcmVhdGVFbnZSZWRpc0xvY2ssXG4gIHR5cGUgTG9ja1JlZGlzLFxufSBmcm9tICcuL2xlYWRlci1sb2NrLmpzJztcbmV4cG9ydCB7XG4gIHNlbmRTeXN0ZW1Ob3RpZmljYXRpb24sXG4gIFNZU1RFTV9OT1RJRllfUEFUSCxcbiAgdHlwZSBTeXN0ZW1Ob3RpZmljYXRpb24sXG59IGZyb20gJy4vc3lzdGVtLW5vdGlmaWNhdGlvbi5qcyc7XG5leHBvcnQge1xuICBjcmVhdGVTY2hlZHVsZXIsXG4gIHR5cGUgU2NoZWR1bGVyT3B0aW9ucyxcbiAgdHlwZSBTY2hlZHVsZXIsXG59IGZyb20gJy4vc2NoZWR1bGVyLmpzJztcbmV4cG9ydCB7XG4gIGNyZWF0ZUNvbXBsaWFuY2VDbGllbnQsXG4gIHR5cGUgQ29tcGxpYW5jZUNoZWNrUmVzdWx0LFxuICB0eXBlIENvbXBsaWFuY2VWaW9sYXRpb24sXG59IGZyb20gJy4vY29tcGxpYW5jZS1jbGllbnQuanMnO1xuZXhwb3J0IHtcbiAgcGx1Z2luUnVuc093bkltYWdlLFxuICBwbHVnaW5Db21wbGlhbmNlVGFncyxcbiAgZGVyaXZlUGx1Z2luSW1hZ2VDb21wbGlhbmNlLFxuICB0eXBlIFBsdWdpbkNvbXBsaWFuY2VBdHRyaWJ1dGVzLFxuICBQTFVHSU5fSU1BR0VfQ09NUExJQU5DRV9GSUVMRFMsXG4gIHR5cGUgUGx1Z2luSW1hZ2VSb3csXG59IGZyb20gJy4uL3V0aWxzL3BsdWdpbi1jb21wbGlhbmNlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29tcGxpYW5jZS1ldmVudC1zdWJzY3JpYmVyLmpzJztcbmV4cG9ydCB7XG4gIHR5cGUgRW50aXR5RXZlbnQsXG4gIHR5cGUgRW50aXR5RXZlbnRTdWJzY3JpYmVyLFxuICBlbnRpdHlFdmVudHMsXG59IGZyb20gJy4vZW50aXR5LWV2ZW50cy5qcyc7XG5leHBvcnQge1xuICBkZXN0cm95U2hhcmVkSHR0cEFnZW50cyxcbiAgY3JlYXRlU2FmZUNsaWVudCxcbiAgUmVzcG9uc2VUb29MYXJnZUVycm9yLFxuICBJbnRlcm5hbEh0dHBDbGllbnQsXG59IGZyb20gJy4vaHR0cC1jbGllbnQuanMnO1xuZXhwb3J0IHtcbiAgc2V0UGxhdGZvcm1Kd2tzQ2FjaGUsXG4gIEp3a3NVbmF2YWlsYWJsZUVycm9yLFxuICBVbmtub3duS2lkRXJyb3IsXG4gIEp3a3NDYWNoZSxcbn0gZnJvbSAnLi9qd2tzLWNhY2hlLmpzJztcbi8vIFNlcnZpY2Uta2V5IGludGVybmFscyBzdGF5IGludGVybmFsLiBUaGUgcGFja2FnZSBzdXJmYWNlIGlzIHRoZSB2ZXJpZnkvaW5zcGVjdFxuLy8gc2lkZSB0aGF0IHBsYXRmb3JtJ3MgSldUIG9wdGlvbnMgYW5kIHRoZSBhdXRoIG1pZGRsZXdhcmUgbmVlZDsga2V5IE1BVEVSSUFMXG4vLyBoYW5kbGluZyAoYHNpZ25TZXJ2aWNlSnd0YCwgdGhlIGJ1bmRsZSwgdGhlIHRlc3QgcmVzZXQgaG9vaykgaXMgcmVhY2hhYmxlIG9ubHlcbi8vIGJ5IGRlZXAgaW1wb3J0IGZyb20gaW5zaWRlIGFwaS1jb3JlIGFuZCBpdHMgdGVzdGluZyBoZWxwZXJzLlxuZXhwb3J0IHtcbiAgaXNTZXJ2aWNlS2lkLFxuICBzZXJ2aWNlSWRlbnRpdHksXG4gIHZlcmlmeVNlcnZpY2VKd3QsXG59IGZyb20gJy4vc2VydmljZS1rZXlzLmpzJztcbi8vIFRoZSBicmVha2VyIGlzIHdpcmVkIGJ5IHRoZSBzaGFyZWQgSFRUUCBjbGllbnQ7IHNlcnZpY2VzIGNvbnN1bWUgaXRzIEVGRkVDVCxcbi8vIG5vdCB0aGUgY2xhc3MuIE9ubHkgdGhlIG9wZXJhdGlvbmFsIHN1cmZhY2UgaXMgcHVibGljLlxuZXhwb3J0IHtcbiAgcmVzZXRDaXJjdWl0QnJlYWtlcnMsXG59IGZyb20gJy4vY2lyY3VpdC1icmVha2VyLmpzJztcbmV4cG9ydCB7XG4gIGNyZWF0ZUVudlJlZGlzRHVyYWJsZUV2ZW50QnVzLFxuICB0eXBlIEV2ZW50U3Vic2NyaXB0aW9uLFxuICB0eXBlIER1cmFibGVFdmVudEJ1cyxcbn0gZnJvbSAnLi9kdXJhYmxlLWV2ZW50LWJ1cy5qcyc7XG5leHBvcnQge1xuICBnZXRFcnJvclJldHJ5RGVjaXNpb24sXG59IGZyb20gJy4vcmV0cnktc3RyYXRlZ3kuanMnO1xuZXhwb3J0IHR5cGUge1xuICBSZXRyeUNvbmZpZyxcbn0gZnJvbSAnLi9yZXRyeS1zdHJhdGVneS5qcyc7XG5leHBvcnQge1xuICBuZXh0QmFja29mZk1zLFxuICByZXRyeUZvcmV2ZXIsXG59IGZyb20gJy4vcmV0cnktZm9yZXZlci5qcyc7XG5leHBvcnQge1xuICBnZXRRdW90YVNlcnZpY2VBdXRoSGVhZGVyLFxuICBjcmVhdGVRdW90YVNlcnZpY2UsXG4gIGluY3JlbWVudFF1b3RhLFxuICByZXNlcnZlUXVvdGEsXG4gIHNlbmRRdW90YVJlc2VydmVEZW5pZWQsXG4gIGRlY3JlbWVudFF1b3RhLFxuICB0eXBlIFF1b3RhUmVzZXJ2ZVJlc3VsdCxcbiAgdHlwZSBRdW90YVNlcnZpY2UsXG59IGZyb20gJy4vcXVvdGEuanMnO1xuZXhwb3J0IHtcbiAgY3JlYXRlUmVtb3RlQXVkaXRDbGllbnQsXG4gIHdpcmVBdXRoekRlbmlhbEF1ZGl0b3IsXG4gIHJlY29yZEF1ZGl0LFxuICB0eXBlIFJlbW90ZUF1ZGl0RXZlbnQsXG4gIHR5cGUgUmVtb3RlQXVkaXRDbGllbnQsXG59IGZyb20gJy4vcmVtb3RlLWF1ZGl0LWNsaWVudC5qcyc7XG5leHBvcnQge1xuICBhdWRpdFNwb29sS2V5LFxuICBjcmVhdGVFbnZSZWRpc0F1ZGl0U3Bvb2wsXG4gIHR5cGUgQXVkaXRTcG9vbCxcbn0gZnJvbSAnLi9hdWRpdC1zcG9vbC5qcyc7XG5leHBvcnQge1xuICByZXNvbHZlUmVkaXNDb25uZWN0aW9uLFxuICBkZXNjcmliZVJlZGlzQ29ubmVjdGlvbixcbiAgY3JlYXRlUmVkaXNDbGllbnQsXG4gIGNyZWF0ZUVudlJlZGlzQ2xpZW50LFxuICBjcmVhdGVSZWRpc1JlYWR5R2F0ZSxcbiAgaW5jcldpbmRvdyxcbiAgUmVkaXNDb25maWdFcnJvcixcbiAgdHlwZSBSZWRpc0V2YWxDbGllbnQsXG59IGZyb20gJy4vZW52LXJlZGlzLmpzJztcbmV4cG9ydCB7XG4gIGNyZWF0ZVJlZGlzVG9rZW5SZXZvY2F0aW9uU3RvcmUsXG4gIGNyZWF0ZUVudlJlZGlzVG9rZW5SZXZvY2F0aW9uU3RvcmUsXG4gIHB1Ymxpc2hUb2tlblJldm9jYXRpb24sXG4gIHB1Ymxpc2hTZXNzaW9uUmV2b2NhdGlvbixcbiAgcHVibGlzaENyZWRlbnRpYWxSZXZvY2F0aW9uLFxufSBmcm9tICcuL3Rva2VuLXJldm9jYXRpb24uanMnO1xuZXhwb3J0IHtcbiAgY3JlYXRlTWVtb3J5U3NlVGlja2V0U3RvcmUsXG4gIGNyZWF0ZUVudlNzZVRpY2tldFN0b3JlLFxuICBlbnZTc2VUaWNrZXRDYXBzLFxuICB0eXBlIEVudlNzZVRpY2tldFN0b3JlQ29uZmlnLFxuICB0eXBlIFNzZVRpY2tldFN0b3JlLFxuICB0eXBlIFNzZVRpY2tldFN0b3JlQ29uZmlnLFxufSBmcm9tICcuL3NzZS10aWNrZXQtc3RvcmUuanMnO1xuZXhwb3J0IHtcbiAgd2lyZVNlcnZpY2VTZWN1cml0eSxcbn0gZnJvbSAnLi9zZXJ2aWNlLWJvb3QuanMnO1xuZXhwb3J0IHtcbiAgY3JlYXRlV2ViaG9va0NoYW5uZWwsXG4gIGNyZWF0ZUVtYWlsQ2hhbm5lbCxcbiAgY3JlYXRlQ2hhbm5lbFJlZ2lzdHJ5LFxuICB0eXBlIE5vdGlmaWNhdGlvblByaW9yaXR5LFxuICB0eXBlIE5vdGlmaWNhdGlvbk1lc3NhZ2UsXG4gIHR5cGUgQ2hhbm5lbFRhcmdldCxcbiAgdHlwZSBEZWxpdmVyeVJlc3VsdCxcbiAgdHlwZSBOb3RpZmljYXRpb25DaGFubmVsLFxufSBmcm9tICcuL25vdGlmaWNhdGlvbi1jaGFubmVscy5qcyc7XG5leHBvcnQge1xuICBjcmVhdGVFY29zeXN0ZW1Ob3RpZnlDbGllbnQsXG4gIEVDT1NZU1RFTV9OT1RJRllfUEFUSCxcbiAgdHlwZSBFY29zeXN0ZW1Ob3RpZnlDbGllbnQsXG59IGZyb20gJy4vZWNvc3lzdGVtLW5vdGlmeS1jbGllbnQuanMnO1xuIl19
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQ0wsY0FBYyxFQUNkLHdCQUF3QixFQUN4QixtQkFBbUIsRUFDbkIsOEJBQThCLEdBQy9CLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUNMLGtCQUFrQixFQUtsQixZQUFZLEdBQ2IsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wsY0FBYyxFQUNkLGtCQUFrQixFQUNsQixhQUFhLEVBQ2IsMEJBQTBCLEdBSzNCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixrQkFBa0IsR0FFbkIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQ0wsZUFBZSxHQUdoQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDTCxzQkFBc0IsR0FHdkIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNwQiwyQkFBMkIsRUFFM0IsOEJBQThCLEdBRS9CLE1BQU0sK0JBQStCLENBQUM7QUFDdkMsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxPQUFPLEVBR0wsWUFBWSxHQUNiLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLGtCQUFrQixHQUNuQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsb0JBQW9CLEVBQ3BCLGVBQWUsRUFDZixTQUFTLEdBQ1YsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixpRkFBaUY7QUFDakYsOEVBQThFO0FBQzlFLGlGQUFpRjtBQUNqRiwrREFBK0Q7QUFDL0QsT0FBTyxFQUNMLFlBQVksRUFDWixlQUFlLEVBQ2YsZ0JBQWdCLEdBQ2pCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsK0VBQStFO0FBQy9FLHlEQUF5RDtBQUN6RCxPQUFPLEVBQ0wsb0JBQW9CLEdBQ3JCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLDZCQUE2QixHQUc5QixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFDTCxxQkFBcUIsR0FDdEIsTUFBTSxxQkFBcUIsQ0FBQztBQUk3QixPQUFPLEVBQ0wsYUFBYSxFQUNiLFlBQVksR0FDYixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIsa0JBQWtCLEVBQ2xCLGNBQWMsRUFDZCxZQUFZLEVBQ1osc0JBQXNCLEVBQ3RCLGNBQWMsR0FHZixNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLHNCQUFzQixFQUN0QixXQUFXLEdBR1osTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQ0wsYUFBYSxFQUNiLHdCQUF3QixHQUV6QixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixvQkFBb0IsRUFDcEIsb0JBQW9CLEVBQ3BCLFVBQVUsRUFDVixnQkFBZ0IsR0FFakIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsK0JBQStCLEVBQy9CLGtDQUFrQyxFQUNsQyxzQkFBc0IsRUFDdEIsd0JBQXdCLEVBQ3hCLDJCQUEyQixHQUM1QixNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFDTCwwQkFBMEIsRUFDMUIsdUJBQXVCLEVBQ3ZCLGdCQUFnQixHQUlqQixNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFDTCxtQkFBbUIsR0FDcEIsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLGtCQUFrQixFQUNsQixxQkFBcUIsR0FNdEIsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBQ0wsMkJBQTJCLEVBQzNCLHFCQUFxQixHQUV0QixNQUFNLDhCQUE4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmV4cG9ydCB7XG4gIGV4Y2hhbmdlQXBpS2V5LFxuICByZXNldEFwaUtleUV4Y2hhbmdlQ2FjaGUsXG4gIEFwaUtleVJlamVjdGVkRXJyb3IsXG4gIEFwaUtleUV4Y2hhbmdlVW5hdmFpbGFibGVFcnJvcixcbn0gZnJvbSAnLi9hcGkta2V5LWV4Y2hhbmdlLmpzJztcbmV4cG9ydCB7XG4gIGNyZWF0ZUNhY2hlU2VydmljZSxcbiAgdHlwZSBSZWRpc0NhY2hlQ2xpZW50LFxuICB0eXBlIENhY2hlSW52YWxpZGF0aW9uTWVzc2FnZSxcbiAgdHlwZSBDYWNoZUludmFsaWRhdGlvbkJ1cyxcbiAgdHlwZSBSZWRpc0ludmFsaWRhdGlvbkNsaWVudCxcbiAgQ2FjaGVTZXJ2aWNlLFxufSBmcm9tICcuL2NhY2hlLXNlcnZpY2UuanMnO1xuZXhwb3J0IHtcbiAgd2l0aExlYWRlckxvY2ssXG4gIGNyZWF0ZUVudlJlZGlzTG9jayxcbiAgbGVhZGVyTG9ja0tleSxcbiAgREVGQVVMVF9MRUFERVJfTE9DS19UVExfTVMsXG4gIHR5cGUgTG9ja1JlZGlzLFxuICB0eXBlIExlYWRlckxvY2tSdW4sXG4gIHR5cGUgTGVhZGVyTG9ja09wdGlvbnMsXG4gIHR5cGUgTGVhZGVyTG9ja0Fib3J0UmVhc29uLFxufSBmcm9tICcuL2xlYWRlci1sb2NrLmpzJztcbmV4cG9ydCB7XG4gIHNlbmRTeXN0ZW1Ob3RpZmljYXRpb24sXG4gIFNZU1RFTV9OT1RJRllfUEFUSCxcbiAgdHlwZSBTeXN0ZW1Ob3RpZmljYXRpb24sXG59IGZyb20gJy4vc3lzdGVtLW5vdGlmaWNhdGlvbi5qcyc7XG5leHBvcnQge1xuICBjcmVhdGVTY2hlZHVsZXIsXG4gIHR5cGUgU2NoZWR1bGVyT3B0aW9ucyxcbiAgdHlwZSBTY2hlZHVsZXIsXG59IGZyb20gJy4vc2NoZWR1bGVyLmpzJztcbmV4cG9ydCB7XG4gIGNyZWF0ZUNvbXBsaWFuY2VDbGllbnQsXG4gIHR5cGUgQ29tcGxpYW5jZUNoZWNrUmVzdWx0LFxuICB0eXBlIENvbXBsaWFuY2VWaW9sYXRpb24sXG59IGZyb20gJy4vY29tcGxpYW5jZS1jbGllbnQuanMnO1xuZXhwb3J0IHtcbiAgcGx1Z2luUnVuc093bkltYWdlLFxuICBwbHVnaW5Db21wbGlhbmNlVGFncyxcbiAgZGVyaXZlUGx1Z2luSW1hZ2VDb21wbGlhbmNlLFxuICB0eXBlIFBsdWdpbkNvbXBsaWFuY2VBdHRyaWJ1dGVzLFxuICBQTFVHSU5fSU1BR0VfQ09NUExJQU5DRV9GSUVMRFMsXG4gIHR5cGUgUGx1Z2luSW1hZ2VSb3csXG59IGZyb20gJy4uL3V0aWxzL3BsdWdpbi1jb21wbGlhbmNlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29tcGxpYW5jZS1ldmVudC1zdWJzY3JpYmVyLmpzJztcbmV4cG9ydCB7XG4gIHR5cGUgRW50aXR5RXZlbnQsXG4gIHR5cGUgRW50aXR5RXZlbnRTdWJzY3JpYmVyLFxuICBlbnRpdHlFdmVudHMsXG59IGZyb20gJy4vZW50aXR5LWV2ZW50cy5qcyc7XG5leHBvcnQge1xuICBkZXN0cm95U2hhcmVkSHR0cEFnZW50cyxcbiAgY3JlYXRlU2FmZUNsaWVudCxcbiAgUmVzcG9uc2VUb29MYXJnZUVycm9yLFxuICBJbnRlcm5hbEh0dHBDbGllbnQsXG59IGZyb20gJy4vaHR0cC1jbGllbnQuanMnO1xuZXhwb3J0IHtcbiAgc2V0UGxhdGZvcm1Kd2tzQ2FjaGUsXG4gIEp3a3NVbmF2YWlsYWJsZUVycm9yLFxuICBVbmtub3duS2lkRXJyb3IsXG4gIEp3a3NDYWNoZSxcbn0gZnJvbSAnLi9qd2tzLWNhY2hlLmpzJztcbi8vIFNlcnZpY2Uta2V5IGludGVybmFscyBzdGF5IGludGVybmFsLiBUaGUgcGFja2FnZSBzdXJmYWNlIGlzIHRoZSB2ZXJpZnkvaW5zcGVjdFxuLy8gc2lkZSB0aGF0IHBsYXRmb3JtJ3MgSldUIG9wdGlvbnMgYW5kIHRoZSBhdXRoIG1pZGRsZXdhcmUgbmVlZDsga2V5IE1BVEVSSUFMXG4vLyBoYW5kbGluZyAoYHNpZ25TZXJ2aWNlSnd0YCwgdGhlIGJ1bmRsZSwgdGhlIHRlc3QgcmVzZXQgaG9vaykgaXMgcmVhY2hhYmxlIG9ubHlcbi8vIGJ5IGRlZXAgaW1wb3J0IGZyb20gaW5zaWRlIGFwaS1jb3JlIGFuZCBpdHMgdGVzdGluZyBoZWxwZXJzLlxuZXhwb3J0IHtcbiAgaXNTZXJ2aWNlS2lkLFxuICBzZXJ2aWNlSWRlbnRpdHksXG4gIHZlcmlmeVNlcnZpY2VKd3QsXG59IGZyb20gJy4vc2VydmljZS1rZXlzLmpzJztcbi8vIFRoZSBicmVha2VyIGlzIHdpcmVkIGJ5IHRoZSBzaGFyZWQgSFRUUCBjbGllbnQ7IHNlcnZpY2VzIGNvbnN1bWUgaXRzIEVGRkVDVCxcbi8vIG5vdCB0aGUgY2xhc3MuIE9ubHkgdGhlIG9wZXJhdGlvbmFsIHN1cmZhY2UgaXMgcHVibGljLlxuZXhwb3J0IHtcbiAgcmVzZXRDaXJjdWl0QnJlYWtlcnMsXG59IGZyb20gJy4vY2lyY3VpdC1icmVha2VyLmpzJztcbmV4cG9ydCB7XG4gIGNyZWF0ZUVudlJlZGlzRHVyYWJsZUV2ZW50QnVzLFxuICB0eXBlIEV2ZW50U3Vic2NyaXB0aW9uLFxuICB0eXBlIER1cmFibGVFdmVudEJ1cyxcbn0gZnJvbSAnLi9kdXJhYmxlLWV2ZW50LWJ1cy5qcyc7XG5leHBvcnQge1xuICBnZXRFcnJvclJldHJ5RGVjaXNpb24sXG59IGZyb20gJy4vcmV0cnktc3RyYXRlZ3kuanMnO1xuZXhwb3J0IHR5cGUge1xuICBSZXRyeUNvbmZpZyxcbn0gZnJvbSAnLi9yZXRyeS1zdHJhdGVneS5qcyc7XG5leHBvcnQge1xuICBuZXh0QmFja29mZk1zLFxuICByZXRyeUZvcmV2ZXIsXG59IGZyb20gJy4vcmV0cnktZm9yZXZlci5qcyc7XG5leHBvcnQge1xuICBnZXRRdW90YVNlcnZpY2VBdXRoSGVhZGVyLFxuICBjcmVhdGVRdW90YVNlcnZpY2UsXG4gIGluY3JlbWVudFF1b3RhLFxuICByZXNlcnZlUXVvdGEsXG4gIHNlbmRRdW90YVJlc2VydmVEZW5pZWQsXG4gIGRlY3JlbWVudFF1b3RhLFxuICB0eXBlIFF1b3RhUmVzZXJ2ZVJlc3VsdCxcbiAgdHlwZSBRdW90YVNlcnZpY2UsXG59IGZyb20gJy4vcXVvdGEuanMnO1xuZXhwb3J0IHtcbiAgY3JlYXRlUmVtb3RlQXVkaXRDbGllbnQsXG4gIHdpcmVBdXRoekRlbmlhbEF1ZGl0b3IsXG4gIHJlY29yZEF1ZGl0LFxuICB0eXBlIFJlbW90ZUF1ZGl0RXZlbnQsXG4gIHR5cGUgUmVtb3RlQXVkaXRDbGllbnQsXG59IGZyb20gJy4vcmVtb3RlLWF1ZGl0LWNsaWVudC5qcyc7XG5leHBvcnQge1xuICBhdWRpdFNwb29sS2V5LFxuICBjcmVhdGVFbnZSZWRpc0F1ZGl0U3Bvb2wsXG4gIHR5cGUgQXVkaXRTcG9vbCxcbn0gZnJvbSAnLi9hdWRpdC1zcG9vbC5qcyc7XG5leHBvcnQge1xuICByZXNvbHZlUmVkaXNDb25uZWN0aW9uLFxuICBkZXNjcmliZVJlZGlzQ29ubmVjdGlvbixcbiAgY3JlYXRlUmVkaXNDbGllbnQsXG4gIGNyZWF0ZUVudlJlZGlzQ2xpZW50LFxuICBjcmVhdGVSZWRpc1JlYWR5R2F0ZSxcbiAgaW5jcldpbmRvdyxcbiAgUmVkaXNDb25maWdFcnJvcixcbiAgdHlwZSBSZWRpc0V2YWxDbGllbnQsXG59IGZyb20gJy4vZW52LXJlZGlzLmpzJztcbmV4cG9ydCB7XG4gIGNyZWF0ZVJlZGlzVG9rZW5SZXZvY2F0aW9uU3RvcmUsXG4gIGNyZWF0ZUVudlJlZGlzVG9rZW5SZXZvY2F0aW9uU3RvcmUsXG4gIHB1Ymxpc2hUb2tlblJldm9jYXRpb24sXG4gIHB1Ymxpc2hTZXNzaW9uUmV2b2NhdGlvbixcbiAgcHVibGlzaENyZWRlbnRpYWxSZXZvY2F0aW9uLFxufSBmcm9tICcuL3Rva2VuLXJldm9jYXRpb24uanMnO1xuZXhwb3J0IHtcbiAgY3JlYXRlTWVtb3J5U3NlVGlja2V0U3RvcmUsXG4gIGNyZWF0ZUVudlNzZVRpY2tldFN0b3JlLFxuICBlbnZTc2VUaWNrZXRDYXBzLFxuICB0eXBlIEVudlNzZVRpY2tldFN0b3JlQ29uZmlnLFxuICB0eXBlIFNzZVRpY2tldFN0b3JlLFxuICB0eXBlIFNzZVRpY2tldFN0b3JlQ29uZmlnLFxufSBmcm9tICcuL3NzZS10aWNrZXQtc3RvcmUuanMnO1xuZXhwb3J0IHtcbiAgd2lyZVNlcnZpY2VTZWN1cml0eSxcbn0gZnJvbSAnLi9zZXJ2aWNlLWJvb3QuanMnO1xuZXhwb3J0IHtcbiAgY3JlYXRlV2ViaG9va0NoYW5uZWwsXG4gIGNyZWF0ZUVtYWlsQ2hhbm5lbCxcbiAgY3JlYXRlQ2hhbm5lbFJlZ2lzdHJ5LFxuICB0eXBlIE5vdGlmaWNhdGlvblByaW9yaXR5LFxuICB0eXBlIE5vdGlmaWNhdGlvbk1lc3NhZ2UsXG4gIHR5cGUgQ2hhbm5lbFRhcmdldCxcbiAgdHlwZSBEZWxpdmVyeVJlc3VsdCxcbiAgdHlwZSBOb3RpZmljYXRpb25DaGFubmVsLFxufSBmcm9tICcuL25vdGlmaWNhdGlvbi1jaGFubmVscy5qcyc7XG5leHBvcnQge1xuICBjcmVhdGVFY29zeXN0ZW1Ob3RpZnlDbGllbnQsXG4gIEVDT1NZU1RFTV9OT1RJRllfUEFUSCxcbiAgdHlwZSBFY29zeXN0ZW1Ob3RpZnlDbGllbnQsXG59IGZyb20gJy4vZWNvc3lzdGVtLW5vdGlmeS1jbGllbnQuanMnO1xuIl19
@@ -1,10 +1,10 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
+ import { envInt } from '../utils/env.js';
3
4
  import { JWKS_PATH, isJwksDocument, publicKeyFromJwk, } from '../utils/jwk.js';
4
5
  import { createLogger } from '../utils/logger.js';
5
6
  import { emitCounter } from '../utils/metric-emitter.js';
6
7
  import { errorMessage } from '../utils/response.js';
7
- import { envInt } from '../utils/env.js';
8
8
  import { serviceEndpoint } from '../utils/service-registry.js';
9
9
  const logger = createLogger('jwks-cache');
10
10
  /** How long a fetched key set is served before a refresh is due. */
@@ -221,4 +221,4 @@ export function platformJwksCache() {
221
221
  export function setPlatformJwksCache(cache) {
222
222
  platformJwks = cache;
223
223
  }
224
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiandrcy1jYWNoZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9qd2tzLWNhY2hlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUE0QnRDLE9BQU8sRUFDTCxTQUFTLEVBQ1QsY0FBYyxFQUNkLGdCQUFnQixHQUdqQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFL0QsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBRTFDLG9FQUFvRTtBQUNwRSxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxPQUFPLENBQUMsQ0FBQyxhQUFhO0FBRTlELDREQUE0RDtBQUM1RCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUM7QUFFM0MsMkZBQTJGO0FBQzNGLE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFHLE1BQU0sQ0FBQztBQUV0RCx3RkFBd0Y7QUFDeEYsTUFBTSxPQUFPLG9CQUFxQixTQUFRLEtBQUs7SUFDN0MsWUFBWSxPQUFPLEdBQUcsZ0RBQWdEO1FBQ3BFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsc0JBQXNCLENBQUM7SUFDckMsQ0FBQztDQUNGO0FBRUQsb0ZBQW9GO0FBQ3BGLE1BQU0sT0FBTyxlQUFnQixTQUFRLEtBQUs7SUFDeEMsWUFBWSxHQUFXO1FBQ3JCLEtBQUssQ0FBQyxvQ0FBb0MsR0FBRyxF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RSxrQkFBa0IsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNyRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNsRSxNQUFNLElBQUksR0FBWSxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztRQUM5RSxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7WUFBUyxDQUFDO1FBQ1QsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RCLENBQUM7QUFDSCxDQUFDO0FBRUQsSUFBSSxZQUFtQyxDQUFDO0FBRXhDLG1FQUFtRTtBQUNuRSxNQUFNLFVBQVUsaUJBQWlCO0lBQy9CLFlBQVksS0FBSyxJQUFJLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUNqRixPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLEtBQTRCO0lBQy9ELFlBQVksR0FBRyxLQUFLLENBQUM7QUFDdkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFRoZSBKV0tTIGNhY2hlIGV2ZXJ5IHZlcmlmaWVyIGluIHRoZSBmbGVldCBzaGFyZXMuXG4gKlxuICogUGxhdGZvcm0gc2lnbnMgdXNlciB0b2tlbnMgd2l0aCBFUzI1NiBhbmQgcHVibGlzaGVzIHRoZSBwdWJsaWMgaGFsdmVzIGF0XG4gKiBgLy53ZWxsLWtub3duL2p3a3MuanNvbmAuIFZlcmlmaWVycyBtdXN0IG5vdCBmZXRjaCB0aGF0IHBlciByZXF1ZXN0IChwbGF0Zm9ybVxuICogd291bGQgbGFuZCBvbiB0aGUgaG90IHBhdGggb2YgdGhlIHdob2xlIGZsZWV0KSBub3IgY2FjaGUgaXQgZm9yZXZlciAoYSByb3RhdGVkXG4gKiBrZXkgd291bGQgbmV2ZXIgYmUgcGlja2VkIHVwKSwgc28gdGhlIGNvbnRyYWN0IGlzIGZpeGVkIGhlcmUgYW5kIHJldXNlZCBieVxuICogYXBpLWNvcmUncyBgcmVxdWlyZUF1dGhgLCBpbWFnZS1yZWdpc3RyeSdzIGF1dGggcmVzb2x2ZXIgYW5kIHRoZSBDTEk6XG4gKlxuICogLSAqKlJlZnJlc2ggZXZlcnkgMTAgbWludXRlcy4qKiBBIGtleSByb3RhdGVkIGluIGF0IHBsYXRmb3JtIGlzIHRydXN0ZWQgZmxlZXQtXG4gKiAgIHdpZGUgd2l0aGluIHRoYXQgd2luZG93IHdpdGhvdXQgYW55b25lIHJlc3RhcnRpbmcuXG4gKiAtICoqUmVmZXRjaCBvbmNlIG9uIGFuIHVua25vd24gYGtpZGAuKiogQSBicmFuZC1uZXcgc2lnbmluZyBrZXkgaXMgcGlja2VkIHVwXG4gKiAgIGltbWVkaWF0ZWx5IGluc3RlYWQgb2YgNDAxLWluZyBldmVyeSByZXF1ZXN0IHVudGlsIHRoZSBuZXh0IHJlZnJlc2guIFJhdGUtXG4gKiAgIGxpbWl0ZWQgKHtAbGluayBVTktOT1dOX0tJRF9SRUZFVENIX0NPT0xET1dOX01TfSkgc28gYSBmbG9vZCBvZiBmb3JnZWQgYGtpZGBzXG4gKiAgIGNhbid0IHR1cm4gaW50byBhIGZldGNoIHN0b3JtIGFnYWluc3QgcGxhdGZvcm0uXG4gKiAtICoqTmVnYXRpdmUtY2FjaGUgZmFpbHVyZXMgYnJpZWZseS4qKiBBIHBsYXRmb3JtIG91dGFnZSBkb2Vzbid0IGJlY29tZSBhXG4gKiAgIGZldGNoLXBlci1yZXF1ZXN0IGFtcGxpZmllci5cbiAqIC0gKipGYWlsIGNsb3NlZC4qKiBBbiB1bnZlcmlmaWFibGUgdG9rZW4gaXMgbm90IGFuIGlkZW50aXR5OiB3aGVuIHRoZSBrZXkgc2V0XG4gKiAgIGNhbm5vdCBiZSBvYnRhaW5lZCB0aGUgdmVyaWZpZXIgdGhyb3dzIHtAbGluayBKd2tzVW5hdmFpbGFibGVFcnJvcn0gYW5kIHRoZVxuICogICBjYWxsZXIgYW5zd2VycyA0MDEvNTAzIOKAlCBpdCBORVZFUiBmYWxscyB0aHJvdWdoIHRvIFwiYWxsb3dcIi5cbiAqICAgQSBrZXkgc2V0IGFscmVhZHkgaW4gaGFuZCBpcyBzdGlsbCB1c2VkIHdoaWxlIGEgcmVmcmVzaCBpcyBmYWlsaW5nICh0aGUga2V5c1xuICogICBhcmUgcHVibGljIGFuZCBkb24ndCBleHBpcmU7IHJlZnVzaW5nIGV2ZXJ5IHJlcXVlc3QgYmVjYXVzZSBwbGF0Zm9ybSBibGlwcGVkXG4gKiAgIHdvdWxkIGJlIGEgc2VsZi1pbmZsaWN0ZWQgb3V0YWdlKSwgd2hpY2ggaXMgd2h5IHRoZSBuZWdhdGl2ZSBjYWNoZSBleGlzdHMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBLZXlPYmplY3QgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHtcbiAgSldLU19QQVRILFxuICBpc0p3a3NEb2N1bWVudCxcbiAgcHVibGljS2V5RnJvbUp3ayxcbiAgdHlwZSBKd2tzRG9jdW1lbnQsXG4gIHR5cGUgUHVibGljSndrLFxufSBmcm9tICcuLi91dGlscy9qd2suanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVtaXRDb3VudGVyIH0gZnJvbSAnLi4vdXRpbHMvbWV0cmljLWVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgZXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgZW52SW50IH0gZnJvbSAnLi4vdXRpbHMvZW52LmpzJztcbmltcG9ydCB7IHNlcnZpY2VFbmRwb2ludCB9IGZyb20gJy4uL3V0aWxzL3NlcnZpY2UtcmVnaXN0cnkuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2p3a3MtY2FjaGUnKTtcblxuLyoqIEhvdyBsb25nIGEgZmV0Y2hlZCBrZXkgc2V0IGlzIHNlcnZlZCBiZWZvcmUgYSByZWZyZXNoIGlzIGR1ZS4gKi9cbmV4cG9ydCBjb25zdCBKV0tTX1JFRlJFU0hfSU5URVJWQUxfTVMgPSA2MDBfMDAwOyAvLyAxMCBtaW51dGVzXG5cbi8qKiBIb3cgbG9uZyBhIGZldGNoIEZBSUxVUkUgc3VwcHJlc3NlcyBmdXJ0aGVyIGF0dGVtcHRzLiAqL1xuZXhwb3J0IGNvbnN0IEpXS1NfTkVHQVRJVkVfVFRMX01TID0gMTBfMDAwO1xuXG4vKiogTWluaW11bSBnYXAgYmV0d2VlbiB1bmtub3duLWBraWRgIHJlZmV0Y2hlcywgc28gZm9yZ2VkIGtpZHMgY2FuJ3Qgc3RhbXBlZGUgcGxhdGZvcm0uICovXG5leHBvcnQgY29uc3QgVU5LTk9XTl9LSURfUkVGRVRDSF9DT09MRE9XTl9NUyA9IDMwXzAwMDtcblxuLyoqIFRoZSBrZXkgc2V0IGNvdWxkIG5vdCBiZSBvYnRhaW5lZCDigJQgdGhlIHRva2VuJ3MgdmFsaWRpdHkgaXMgVU5LTk9XTiAoNTAzLXNoYXBlZCkuICovXG5leHBvcnQgY2xhc3MgSndrc1VuYXZhaWxhYmxlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UgPSAnVG9rZW4gc2lnbmluZyBrZXlzIGFyZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZScpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnSndrc1VuYXZhaWxhYmxlRXJyb3InO1xuICB9XG59XG5cbi8qKiBUaGUga2V5IHNldCB3YXMgb2J0YWluZWQgYW5kIGRvZXMgTk9UIGNvbnRhaW4gdGhlIHRva2VuJ3MgYGtpZGAgKDQwMS1zaGFwZWQpLiAqL1xuZXhwb3J0IGNsYXNzIFVua25vd25LaWRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3Ioa2lkOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgTm8gcHVibGlzaGVkIHNpZ25pbmcga2V5IGZvciBraWQgJHtraWR9YCk7XG4gICAgdGhpcy5uYW1lID0gJ1Vua25vd25LaWRFcnJvcic7XG4gIH1cbn1cblxuLyoqIEZldGNoZXMgdGhlIHJhdyBKV0tTIGRvY3VtZW50LiBSZWplY3RzIG9uIGFueSB0cmFuc3BvcnQvc2hhcGUgZmFpbHVyZS4gKi9cbmV4cG9ydCB0eXBlIEp3a3NGZXRjaGVyID0gKCkgPT4gUHJvbWlzZTxKd2tzRG9jdW1lbnQ+O1xuXG5leHBvcnQgaW50ZXJmYWNlIEp3a3NDYWNoZU9wdGlvbnMge1xuICBmZXRjaDogSndrc0ZldGNoZXI7XG4gIC8qKiBGb3IgbWV0cmljcy9sb2dnaW5nIChlLmcuIGAncGxhdGZvcm0nYCkuICovXG4gIHNvdXJjZT86IHN0cmluZztcbiAgcmVmcmVzaEludGVydmFsTXM/OiBudW1iZXI7XG4gIG5lZ2F0aXZlVHRsTXM/OiBudW1iZXI7XG4gIHVua25vd25LaWRDb29sZG93bk1zPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEEga2V5IHNldCB3aXRoIHRoZSBmcmVzaG5lc3MgYm9va2tlZXBpbmcgdGhlIGNvbnRyYWN0IGFib3ZlIG5lZWRzLiBEZWxpYmVyYXRlbHlcbiAqIHRyYW5zcG9ydC1hZ25vc3RpYzogdGhlIENMSSBhbmQgdGhlIExhbWJkYSBoYW5kIGl0IHRoZWlyIG93biBmZXRjaGVyLlxuICovXG5leHBvcnQgY2xhc3MgSndrc0NhY2hlIHtcbiAgcHJpdmF0ZSBrZXlzID0gbmV3IE1hcDxzdHJpbmcsIEtleU9iamVjdD4oKTtcbiAgcHJpdmF0ZSBmZXRjaGVkQXQgPSAwO1xuICBwcml2YXRlIGZhaWxlZFVudGlsID0gMDtcbiAgcHJpdmF0ZSBsYXN0VW5rbm93bktpZEZldGNoQXQgPSAwO1xuICBwcml2YXRlIGluRmxpZ2h0OiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVmcmVzaEludGVydmFsTXM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBuZWdhdGl2ZVR0bE1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgdW5rbm93bktpZENvb2xkb3duTXM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzb3VyY2U6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IEp3a3NDYWNoZU9wdGlvbnMpIHtcbiAgICB0aGlzLnJlZnJlc2hJbnRlcnZhbE1zID0gb3B0aW9ucy5yZWZyZXNoSW50ZXJ2YWxNcyA/PyBKV0tTX1JFRlJFU0hfSU5URVJWQUxfTVM7XG4gICAgdGhpcy5uZWdhdGl2ZVR0bE1zID0gb3B0aW9ucy5uZWdhdGl2ZVR0bE1zID8/IEpXS1NfTkVHQVRJVkVfVFRMX01TO1xuICAgIHRoaXMudW5rbm93bktpZENvb2xkb3duTXMgPSBvcHRpb25zLnVua25vd25LaWRDb29sZG93bk1zID8/IFVOS05PV05fS0lEX1JFRkVUQ0hfQ09PTERPV05fTVM7XG4gICAgdGhpcy5zb3VyY2UgPSBvcHRpb25zLnNvdXJjZSA/PyAncGxhdGZvcm0nO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJpZmljYXRpb24ga2V5IGZvciBga2lkYC5cbiAgICpcbiAgICogQHRocm93cyB7Sndrc1VuYXZhaWxhYmxlRXJyb3J9IHRoZSBrZXkgc2V0IGNvdWxkIG5vdCBiZSBvYnRhaW5lZCBhdCBhbGwuXG4gICAqIEB0aHJvd3Mge1Vua25vd25LaWRFcnJvcn0gdGhlIGtleSBzZXQgaXMgaW4gaGFuZCBidXQgaGFzIG5vIHN1Y2gga2V5LlxuICAgKi9cbiAgYXN5bmMgZ2V0S2V5KGtpZDogc3RyaW5nKTogUHJvbWlzZTxLZXlPYmplY3Q+IHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUZyZXNoKCk7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5rZXlzLmdldChraWQpO1xuICAgIGlmIChrZXkpIHJldHVybiBrZXk7XG5cbiAgICAvLyBVbmtub3duIGtpZDogcGxhdGZvcm0gbWF5IGhhdmUgSlVTVCByb3RhdGVkLiBSZWZldGNoIG9uY2UgKHJhdGUtbGltaXRlZCksXG4gICAgLy8gdGhlbiBkZWNpZGUuIEEgY2FjaGVkLWJ1dC1zdGFsZSBzZXQgdGhhdCBzdGlsbCBsYWNrcyB0aGUga2lkIGFmdGVyIHRoZVxuICAgIC8vIHJlZmV0Y2ggaXMgYSByZWFsIHJlamVjdGlvbiwgbm90IGEgZnJlc2huZXNzIHByb2JsZW0uXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBpZiAobm93IC0gdGhpcy5sYXN0VW5rbm93bktpZEZldGNoQXQgPj0gdGhpcy51bmtub3duS2lkQ29vbGRvd25Ncykge1xuICAgICAgdGhpcy5sYXN0VW5rbm93bktpZEZldGNoQXQgPSBub3c7XG4gICAgICBlbWl0Q291bnRlcignandrc191bmtub3duX2tpZF9yZWZldGNoX3RvdGFsJywgeyBzb3VyY2U6IHRoaXMuc291cmNlIH0pO1xuICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKHsgZm9yY2U6IHRydWUgfSkuY2F0Y2goKCkgPT4geyAvKiBoYW5kbGVkIGJlbG93IGJ5IHRoZSBtaXNzICovIH0pO1xuICAgICAgY29uc3QgcmVmcmVzaGVkID0gdGhpcy5rZXlzLmdldChraWQpO1xuICAgICAgaWYgKHJlZnJlc2hlZCkgcmV0dXJuIHJlZnJlc2hlZDtcbiAgICB9XG4gICAgaWYgKHRoaXMua2V5cy5zaXplID09PSAwKSB0aHJvdyBuZXcgSndrc1VuYXZhaWxhYmxlRXJyb3IoKTtcbiAgICB0aHJvdyBuZXcgVW5rbm93bktpZEVycm9yKGtpZCk7XG4gIH1cblxuICAvKiogRXZlcnkgY3VycmVudGx5LXRydXN0ZWQgYGtpZGAuIEV4cG9zZWQgZm9yIGRpYWdub3N0aWNzIGFuZCB0ZXN0cy4gKi9cbiAga25vd25LaWRzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMua2V5cy5rZXlzKCldO1xuICB9XG5cbiAgLyoqIERyb3AgZXZlcnl0aGluZywgc28gdGhlIG5leHQgbG9va3VwIHJlZmV0Y2hlcy4gKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5rZXlzLmNsZWFyKCk7XG4gICAgdGhpcy5mZXRjaGVkQXQgPSAwO1xuICAgIHRoaXMuZmFpbGVkVW50aWwgPSAwO1xuICAgIHRoaXMubGFzdFVua25vd25LaWRGZXRjaEF0ID0gMDtcbiAgICB0aGlzLmluRmxpZ2h0ID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFJlZmV0Y2ggd2hlbiB0aGUgc2V0IGlzIG1pc3Npbmcgb3IgcGFzdCBpdHMgcmVmcmVzaCBpbnRlcnZhbC4gKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVGcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHN0YWxlID0gbm93IC0gdGhpcy5mZXRjaGVkQXQgPj0gdGhpcy5yZWZyZXNoSW50ZXJ2YWxNcztcbiAgICBpZiAodGhpcy5rZXlzLnNpemUgPiAwICYmICFzdGFsZSkgcmV0dXJuO1xuXG4gICAgaWYgKG5vdyA8IHRoaXMuZmFpbGVkVW50aWwpIHtcbiAgICAgIC8vIEluc2lkZSB0aGUgbmVnYXRpdmUtY2FjaGUgd2luZG93LiBTZXJ2ZSBhIGtleSBzZXQgd2UgYWxyZWFkeSBob2xkXG4gICAgICAvLyAocHVibGljIGtleXMgZG9uJ3QgZXhwaXJlKTsgd2l0aCBub3RoaW5nIGluIGhhbmQsIGZhaWwgY2xvc2VkLlxuICAgICAgaWYgKHRoaXMua2V5cy5zaXplID4gMCkgcmV0dXJuO1xuICAgICAgdGhyb3cgbmV3IEp3a3NVbmF2YWlsYWJsZUVycm9yKCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMucmVmcmVzaCh7IGZvcmNlOiBmYWxzZSB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKHRoaXMua2V5cy5zaXplID4gMCkge1xuICAgICAgICBsb2dnZXIud2FybignSldLUyByZWZyZXNoIGZhaWxlZDsgY29udGludWluZyBvbiB0aGUgY2FjaGVkIGtleSBzZXQnLCB7XG4gICAgICAgICAgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgICAgICBlcnJvcjogZXJyb3JNZXNzYWdlKGVycm9yKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBKd2tzVW5hdmFpbGFibGVFcnJvcigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBPbmUgcmVhbCBmZXRjaCwgc2hhcmVkIGJ5IGV2ZXJ5IGNvbmN1cnJlbnQgY2FsbGVyLiAqL1xuICBwcml2YXRlIHJlZnJlc2gob3B0czogeyBmb3JjZTogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaW5GbGlnaHQpIHJldHVybiB0aGlzLmluRmxpZ2h0O1xuICAgIGlmICghb3B0cy5mb3JjZSAmJiBEYXRlLm5vdygpIDwgdGhpcy5mYWlsZWRVbnRpbCkgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBKd2tzVW5hdmFpbGFibGVFcnJvcigpKTtcbiAgICBjb25zdCBwcm9taXNlID0gdGhpcy5wZXJmb3JtRmV0Y2goKS5maW5hbGx5KCgpID0+IHsgdGhpcy5pbkZsaWdodCA9IHVuZGVmaW5lZDsgfSk7XG4gICAgdGhpcy5pbkZsaWdodCA9IHByb21pc2U7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBlcmZvcm1GZXRjaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgZG9jdW1lbnQ6IEp3a3NEb2N1bWVudDtcbiAgICB0cnkge1xuICAgICAgZG9jdW1lbnQgPSBhd2FpdCB0aGlzLm9wdGlvbnMuZmV0Y2goKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5mYWlsZWRVbnRpbCA9IERhdGUubm93KCkgKyB0aGlzLm5lZ2F0aXZlVHRsTXM7XG4gICAgICBlbWl0Q291bnRlcignandrc19mZXRjaF90b3RhbCcsIHsgc291cmNlOiB0aGlzLnNvdXJjZSwgcmVzdWx0OiAnZXJyb3InIH0pO1xuICAgICAgbG9nZ2VyLndhcm4oJ0pXS1MgZmV0Y2ggZmFpbGVkJywge1xuICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlLFxuICAgICAgICBlcnJvcjogZXJyb3JNZXNzYWdlKGVycm9yKSxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMgPSBuZXcgTWFwPHN0cmluZywgS2V5T2JqZWN0PigpO1xuICAgIGZvciAoY29uc3QgandrIG9mIGRvY3VtZW50LmtleXMgYXMgUHVibGljSndrW10pIHtcbiAgICAgIGlmICghandrPy5raWQpIGNvbnRpbnVlO1xuICAgICAgdHJ5IHtcbiAgICAgICAga2V5cy5zZXQoandrLmtpZCwgcHVibGljS2V5RnJvbUp3ayhqd2spKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIE9uZSB1bnVzYWJsZSBlbnRyeSBtdXN0IG5vdCBkaXNjYXJkIHRoZSByZXN0IG9mIHRoZSBzZXQuXG4gICAgICAgIGxvZ2dlci53YXJuKCdTa2lwcGluZyB1bnVzYWJsZSBKV0tTIGVudHJ5JywgeyBraWQ6IGp3ay5raWQsIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyb3IpIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoa2V5cy5zaXplID09PSAwKSB7XG4gICAgICB0aGlzLmZhaWxlZFVudGlsID0gRGF0ZS5ub3coKSArIHRoaXMubmVnYXRpdmVUdGxNcztcbiAgICAgIGVtaXRDb3VudGVyKCdqd2tzX2ZldGNoX3RvdGFsJywgeyBzb3VyY2U6IHRoaXMuc291cmNlLCByZXN1bHQ6ICdlbXB0eScgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0pXS1MgZG9jdW1lbnQgY29udGFpbmVkIG5vIHVzYWJsZSBrZXlzJyk7XG4gICAgfVxuXG4gICAgdGhpcy5rZXlzID0ga2V5cztcbiAgICB0aGlzLmZldGNoZWRBdCA9IERhdGUubm93KCk7XG4gICAgdGhpcy5mYWlsZWRVbnRpbCA9IDA7XG4gICAgZW1pdENvdW50ZXIoJ2p3a3NfZmV0Y2hfdG90YWwnLCB7IHNvdXJjZTogdGhpcy5zb3VyY2UsIHJlc3VsdDogJ3N1Y2Nlc3MnIH0pO1xuICB9XG59XG5cbi8qKlxuICogRmV0Y2ggcGxhdGZvcm0ncyBKV0tTIG92ZXIgdGhlIGluLWNsdXN0ZXIgYWRkcmVzcyBldmVyeSBvdGhlciBjYWxsZXIgdXNlc1xuICogKGBQTEFURk9STV9TRVJWSUNFX0hPU1RgIC8gYFBMQVRGT1JNX1NFUlZJQ0VfUE9SVGApLCBvciB0aGUgYWJzb2x1dGVcbiAqIGBQTEFURk9STV9KV0tTX1VSTGAgd2hlbiBvbmUgaXMgY29uZmlndXJlZCAodGhlIENMSSBhbmQgdGhlIGV2ZW50cyBMYW1iZGEgcnVuXG4gKiBvdXRzaWRlIHRoZSBjbHVzdGVyKS5cbiAqXG4gKiBVbmF1dGhlbnRpY2F0ZWQgYnkgZGVzaWduOiB0aGUga2V5IHNldCBpcyBwdWJsaWMsIGFuZCByZXF1aXJpbmcgYSBjcmVkZW50aWFsXG4gKiB0byBmZXRjaCB0aGUga2V5cyB0aGF0IHZlcmlmeSBjcmVkZW50aWFscyBpcyBhIGJvb3RzdHJhcCBjeWNsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hQbGF0Zm9ybUp3a3MoKTogUHJvbWlzZTxKd2tzRG9jdW1lbnQ+IHtcbiAgY29uc3QgYWJzb2x1dGUgPSBwcm9jZXNzLmVudi5QTEFURk9STV9KV0tTX1VSTDtcbiAgY29uc3QgdGltZW91dCA9IGVudkludCgnSldLU19GRVRDSF9USU1FT1VUX01TJywgMzAwMCwgeyBtaW46IDEgfSk7XG4gIGlmIChhYnNvbHV0ZSkgcmV0dXJuIGZldGNoSndrc0Zyb21VcmwoYWJzb2x1dGUsIHRpbWVvdXQpO1xuXG4gIC8vIExvYWRlZCBMQVpJTFksIG9uIHRoZSBmaXJzdCBmZXRjaC4gQSBzdGF0aWMgaW1wb3J0IHdvdWxkIHB1dCB0aGUgSFRUUCBjbGllbnRcbiAgLy8gKGFuZCBwbGF0Zm9ybSdzIGFkZHJlc3MpIGludG8gdGhlIGltcG9ydCBncmFwaCBvZiBldmVyeSBtb2R1bGUgdGhhdCBtZXJlbHlcbiAgLy8gdXNlcyBgcmVxdWlyZUF1dGhgIOKAlCB0aGUgc2FtZSByZWFzb24gYGFwaS1rZXktZXhjaGFuZ2VgIGlzIGxhenksIGFuZCB3aGF0XG4gIC8vIGtlZXBzIHBhcnRpYWwgYGh0dHAtY2xpZW50LmpzYCBtb2NrcyBpbiB0aGUgc2VydmljZSBzdWl0ZXMgd29ya2luZy5cbiAgY29uc3QgeyBJbnRlcm5hbEh0dHBDbGllbnQgfSA9IGF3YWl0IGltcG9ydCgnLi9odHRwLWNsaWVudC5qcycpO1xuICBjb25zdCBjbGllbnQgPSBuZXcgSW50ZXJuYWxIdHRwQ2xpZW50KHtcbiAgICAuLi5zZXJ2aWNlRW5kcG9pbnQoJ3BsYXRmb3JtJyksXG4gICAgdGltZW91dCxcbiAgfSk7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGNsaWVudC5nZXQ8dW5rbm93bj4oSldLU19QQVRILCB7IGlkZW1wb3RlbnQ6IHRydWUgfSk7XG4gIGlmIChyZXMuc3RhdHVzQ29kZSAhPT0gMjAwIHx8ICFpc0p3a3NEb2N1bWVudChyZXMuYm9keSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgSldLUyByZXNwb25zZSAoc3RhdHVzICR7cmVzLnN0YXR1c0NvZGV9KWApO1xuICB9XG4gIHJldHVybiByZXMuYm9keTtcbn1cblxuLyoqIEZldGNoIGEgSldLUyBkb2N1bWVudCBmcm9tIGFuIGFic29sdXRlIFVSTCAob3V0c2lkZS10aGUtY2x1c3RlciB2ZXJpZmllcnMpLiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hKd2tzRnJvbVVybCh1cmw6IHN0cmluZywgdGltZW91dE1zID0gMzAwMCk6IFByb21pc2U8Sndrc0RvY3VtZW50PiB7XG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIHRpbWVvdXRNcyk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsIGhlYWRlcnM6IHsgYWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicgfSB9KTtcbiAgICBpZiAoIXJlcy5vaykgdGhyb3cgbmV3IEVycm9yKGBKV0tTIGZldGNoIHJldHVybmVkICR7cmVzLnN0YXR1c31gKTtcbiAgICBjb25zdCBib2R5OiB1bmtub3duID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoIWlzSndrc0RvY3VtZW50KGJvZHkpKSB0aHJvdyBuZXcgRXJyb3IoJ0pXS1MgcmVzcG9uc2Ugd2FzIG5vdCBhIGtleSBzZXQnKTtcbiAgICByZXR1cm4gYm9keTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICB9XG59XG5cbmxldCBwbGF0Zm9ybUp3a3M6IEp3a3NDYWNoZSB8IHVuZGVmaW5lZDtcblxuLyoqIFRoZSBwcm9jZXNzLXdpZGUgY2FjaGUgb2YgcGxhdGZvcm0ncyBwdWJsaXNoZWQgc2lnbmluZyBrZXlzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsYXRmb3JtSndrc0NhY2hlKCk6IEp3a3NDYWNoZSB7XG4gIHBsYXRmb3JtSndrcyA/Pz0gbmV3IEp3a3NDYWNoZSh7IGZldGNoOiBmZXRjaFBsYXRmb3JtSndrcywgc291cmNlOiAncGxhdGZvcm0nIH0pO1xuICByZXR1cm4gcGxhdGZvcm1Kd2tzO1xufVxuXG4vKipcbiAqIFJlcGxhY2UgdGhlIHByb2Nlc3Mtd2lkZSBjYWNoZSDigJQgdXNlZCBieSB0ZXN0cywgYW5kIGJ5IGFueSBob3N0IHRoYXQgbXVzdFxuICogc3VwcGx5IGl0cyBvd24gZmV0Y2hlci4gUGFzcyBgdW5kZWZpbmVkYCB0byBkcm9wIGJhY2sgdG8gdGhlIGRlZmF1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRQbGF0Zm9ybUp3a3NDYWNoZShjYWNoZTogSndrc0NhY2hlIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIHBsYXRmb3JtSndrcyA9IGNhY2hlO1xufVxuIl19
224
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiandrcy1jYWNoZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9qd2tzLWNhY2hlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUE0QnRDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQ0wsU0FBUyxFQUNULGNBQWMsRUFDZCxnQkFBZ0IsR0FHakIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFL0QsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBRTFDLG9FQUFvRTtBQUNwRSxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxPQUFPLENBQUMsQ0FBQyxhQUFhO0FBRTlELDREQUE0RDtBQUM1RCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUM7QUFFM0MsMkZBQTJGO0FBQzNGLE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFHLE1BQU0sQ0FBQztBQUV0RCx3RkFBd0Y7QUFDeEYsTUFBTSxPQUFPLG9CQUFxQixTQUFRLEtBQUs7SUFDN0MsWUFBWSxPQUFPLEdBQUcsZ0RBQWdEO1FBQ3BFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsc0JBQXNCLENBQUM7SUFDckMsQ0FBQztDQUNGO0FBRUQsb0ZBQW9GO0FBQ3BGLE1BQU0sT0FBTyxlQUFnQixTQUFRLEtBQUs7SUFDeEMsWUFBWSxHQUFXO1FBQ3JCLEtBQUssQ0FBQyxvQ0FBb0MsR0FBRyxF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RSxrQkFBa0IsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNyRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNsRSxNQUFNLElBQUksR0FBWSxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztRQUM5RSxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7WUFBUyxDQUFDO1FBQ1QsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RCLENBQUM7QUFDSCxDQUFDO0FBRUQsSUFBSSxZQUFtQyxDQUFDO0FBRXhDLG1FQUFtRTtBQUNuRSxNQUFNLFVBQVUsaUJBQWlCO0lBQy9CLFlBQVksS0FBSyxJQUFJLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUNqRixPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLEtBQTRCO0lBQy9ELFlBQVksR0FBRyxLQUFLLENBQUM7QUFDdkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFRoZSBKV0tTIGNhY2hlIGV2ZXJ5IHZlcmlmaWVyIGluIHRoZSBmbGVldCBzaGFyZXMuXG4gKlxuICogUGxhdGZvcm0gc2lnbnMgdXNlciB0b2tlbnMgd2l0aCBFUzI1NiBhbmQgcHVibGlzaGVzIHRoZSBwdWJsaWMgaGFsdmVzIGF0XG4gKiBgLy53ZWxsLWtub3duL2p3a3MuanNvbmAuIFZlcmlmaWVycyBtdXN0IG5vdCBmZXRjaCB0aGF0IHBlciByZXF1ZXN0IChwbGF0Zm9ybVxuICogd291bGQgbGFuZCBvbiB0aGUgaG90IHBhdGggb2YgdGhlIHdob2xlIGZsZWV0KSBub3IgY2FjaGUgaXQgZm9yZXZlciAoYSByb3RhdGVkXG4gKiBrZXkgd291bGQgbmV2ZXIgYmUgcGlja2VkIHVwKSwgc28gdGhlIGNvbnRyYWN0IGlzIGZpeGVkIGhlcmUgYW5kIHJldXNlZCBieVxuICogYXBpLWNvcmUncyBgcmVxdWlyZUF1dGhgLCBpbWFnZS1yZWdpc3RyeSdzIGF1dGggcmVzb2x2ZXIgYW5kIHRoZSBDTEk6XG4gKlxuICogLSAqKlJlZnJlc2ggZXZlcnkgMTAgbWludXRlcy4qKiBBIGtleSByb3RhdGVkIGluIGF0IHBsYXRmb3JtIGlzIHRydXN0ZWQgZmxlZXQtXG4gKiAgIHdpZGUgd2l0aGluIHRoYXQgd2luZG93IHdpdGhvdXQgYW55b25lIHJlc3RhcnRpbmcuXG4gKiAtICoqUmVmZXRjaCBvbmNlIG9uIGFuIHVua25vd24gYGtpZGAuKiogQSBicmFuZC1uZXcgc2lnbmluZyBrZXkgaXMgcGlja2VkIHVwXG4gKiAgIGltbWVkaWF0ZWx5IGluc3RlYWQgb2YgNDAxLWluZyBldmVyeSByZXF1ZXN0IHVudGlsIHRoZSBuZXh0IHJlZnJlc2guIFJhdGUtXG4gKiAgIGxpbWl0ZWQgKHtAbGluayBVTktOT1dOX0tJRF9SRUZFVENIX0NPT0xET1dOX01TfSkgc28gYSBmbG9vZCBvZiBmb3JnZWQgYGtpZGBzXG4gKiAgIGNhbid0IHR1cm4gaW50byBhIGZldGNoIHN0b3JtIGFnYWluc3QgcGxhdGZvcm0uXG4gKiAtICoqTmVnYXRpdmUtY2FjaGUgZmFpbHVyZXMgYnJpZWZseS4qKiBBIHBsYXRmb3JtIG91dGFnZSBkb2Vzbid0IGJlY29tZSBhXG4gKiAgIGZldGNoLXBlci1yZXF1ZXN0IGFtcGxpZmllci5cbiAqIC0gKipGYWlsIGNsb3NlZC4qKiBBbiB1bnZlcmlmaWFibGUgdG9rZW4gaXMgbm90IGFuIGlkZW50aXR5OiB3aGVuIHRoZSBrZXkgc2V0XG4gKiAgIGNhbm5vdCBiZSBvYnRhaW5lZCB0aGUgdmVyaWZpZXIgdGhyb3dzIHtAbGluayBKd2tzVW5hdmFpbGFibGVFcnJvcn0gYW5kIHRoZVxuICogICBjYWxsZXIgYW5zd2VycyA0MDEvNTAzIOKAlCBpdCBORVZFUiBmYWxscyB0aHJvdWdoIHRvIFwiYWxsb3dcIi5cbiAqICAgQSBrZXkgc2V0IGFscmVhZHkgaW4gaGFuZCBpcyBzdGlsbCB1c2VkIHdoaWxlIGEgcmVmcmVzaCBpcyBmYWlsaW5nICh0aGUga2V5c1xuICogICBhcmUgcHVibGljIGFuZCBkb24ndCBleHBpcmU7IHJlZnVzaW5nIGV2ZXJ5IHJlcXVlc3QgYmVjYXVzZSBwbGF0Zm9ybSBibGlwcGVkXG4gKiAgIHdvdWxkIGJlIGEgc2VsZi1pbmZsaWN0ZWQgb3V0YWdlKSwgd2hpY2ggaXMgd2h5IHRoZSBuZWdhdGl2ZSBjYWNoZSBleGlzdHMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBLZXlPYmplY3QgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgZW52SW50IH0gZnJvbSAnLi4vdXRpbHMvZW52LmpzJztcbmltcG9ydCB7XG4gIEpXS1NfUEFUSCxcbiAgaXNKd2tzRG9jdW1lbnQsXG4gIHB1YmxpY0tleUZyb21Kd2ssXG4gIHR5cGUgSndrc0RvY3VtZW50LFxuICB0eXBlIFB1YmxpY0p3ayxcbn0gZnJvbSAnLi4vdXRpbHMvandrLmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlbWl0Q291bnRlciB9IGZyb20gJy4uL3V0aWxzL21ldHJpYy1lbWl0dGVyLmpzJztcbmltcG9ydCB7IGVycm9yTWVzc2FnZSB9IGZyb20gJy4uL3V0aWxzL3Jlc3BvbnNlLmpzJztcbmltcG9ydCB7IHNlcnZpY2VFbmRwb2ludCB9IGZyb20gJy4uL3V0aWxzL3NlcnZpY2UtcmVnaXN0cnkuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2p3a3MtY2FjaGUnKTtcblxuLyoqIEhvdyBsb25nIGEgZmV0Y2hlZCBrZXkgc2V0IGlzIHNlcnZlZCBiZWZvcmUgYSByZWZyZXNoIGlzIGR1ZS4gKi9cbmV4cG9ydCBjb25zdCBKV0tTX1JFRlJFU0hfSU5URVJWQUxfTVMgPSA2MDBfMDAwOyAvLyAxMCBtaW51dGVzXG5cbi8qKiBIb3cgbG9uZyBhIGZldGNoIEZBSUxVUkUgc3VwcHJlc3NlcyBmdXJ0aGVyIGF0dGVtcHRzLiAqL1xuZXhwb3J0IGNvbnN0IEpXS1NfTkVHQVRJVkVfVFRMX01TID0gMTBfMDAwO1xuXG4vKiogTWluaW11bSBnYXAgYmV0d2VlbiB1bmtub3duLWBraWRgIHJlZmV0Y2hlcywgc28gZm9yZ2VkIGtpZHMgY2FuJ3Qgc3RhbXBlZGUgcGxhdGZvcm0uICovXG5leHBvcnQgY29uc3QgVU5LTk9XTl9LSURfUkVGRVRDSF9DT09MRE9XTl9NUyA9IDMwXzAwMDtcblxuLyoqIFRoZSBrZXkgc2V0IGNvdWxkIG5vdCBiZSBvYnRhaW5lZCDigJQgdGhlIHRva2VuJ3MgdmFsaWRpdHkgaXMgVU5LTk9XTiAoNTAzLXNoYXBlZCkuICovXG5leHBvcnQgY2xhc3MgSndrc1VuYXZhaWxhYmxlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UgPSAnVG9rZW4gc2lnbmluZyBrZXlzIGFyZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZScpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnSndrc1VuYXZhaWxhYmxlRXJyb3InO1xuICB9XG59XG5cbi8qKiBUaGUga2V5IHNldCB3YXMgb2J0YWluZWQgYW5kIGRvZXMgTk9UIGNvbnRhaW4gdGhlIHRva2VuJ3MgYGtpZGAgKDQwMS1zaGFwZWQpLiAqL1xuZXhwb3J0IGNsYXNzIFVua25vd25LaWRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3Ioa2lkOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgTm8gcHVibGlzaGVkIHNpZ25pbmcga2V5IGZvciBraWQgJHtraWR9YCk7XG4gICAgdGhpcy5uYW1lID0gJ1Vua25vd25LaWRFcnJvcic7XG4gIH1cbn1cblxuLyoqIEZldGNoZXMgdGhlIHJhdyBKV0tTIGRvY3VtZW50LiBSZWplY3RzIG9uIGFueSB0cmFuc3BvcnQvc2hhcGUgZmFpbHVyZS4gKi9cbmV4cG9ydCB0eXBlIEp3a3NGZXRjaGVyID0gKCkgPT4gUHJvbWlzZTxKd2tzRG9jdW1lbnQ+O1xuXG5leHBvcnQgaW50ZXJmYWNlIEp3a3NDYWNoZU9wdGlvbnMge1xuICBmZXRjaDogSndrc0ZldGNoZXI7XG4gIC8qKiBGb3IgbWV0cmljcy9sb2dnaW5nIChlLmcuIGAncGxhdGZvcm0nYCkuICovXG4gIHNvdXJjZT86IHN0cmluZztcbiAgcmVmcmVzaEludGVydmFsTXM/OiBudW1iZXI7XG4gIG5lZ2F0aXZlVHRsTXM/OiBudW1iZXI7XG4gIHVua25vd25LaWRDb29sZG93bk1zPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEEga2V5IHNldCB3aXRoIHRoZSBmcmVzaG5lc3MgYm9va2tlZXBpbmcgdGhlIGNvbnRyYWN0IGFib3ZlIG5lZWRzLiBEZWxpYmVyYXRlbHlcbiAqIHRyYW5zcG9ydC1hZ25vc3RpYzogdGhlIENMSSBhbmQgdGhlIExhbWJkYSBoYW5kIGl0IHRoZWlyIG93biBmZXRjaGVyLlxuICovXG5leHBvcnQgY2xhc3MgSndrc0NhY2hlIHtcbiAgcHJpdmF0ZSBrZXlzID0gbmV3IE1hcDxzdHJpbmcsIEtleU9iamVjdD4oKTtcbiAgcHJpdmF0ZSBmZXRjaGVkQXQgPSAwO1xuICBwcml2YXRlIGZhaWxlZFVudGlsID0gMDtcbiAgcHJpdmF0ZSBsYXN0VW5rbm93bktpZEZldGNoQXQgPSAwO1xuICBwcml2YXRlIGluRmxpZ2h0OiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVmcmVzaEludGVydmFsTXM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBuZWdhdGl2ZVR0bE1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgdW5rbm93bktpZENvb2xkb3duTXM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzb3VyY2U6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IEp3a3NDYWNoZU9wdGlvbnMpIHtcbiAgICB0aGlzLnJlZnJlc2hJbnRlcnZhbE1zID0gb3B0aW9ucy5yZWZyZXNoSW50ZXJ2YWxNcyA/PyBKV0tTX1JFRlJFU0hfSU5URVJWQUxfTVM7XG4gICAgdGhpcy5uZWdhdGl2ZVR0bE1zID0gb3B0aW9ucy5uZWdhdGl2ZVR0bE1zID8/IEpXS1NfTkVHQVRJVkVfVFRMX01TO1xuICAgIHRoaXMudW5rbm93bktpZENvb2xkb3duTXMgPSBvcHRpb25zLnVua25vd25LaWRDb29sZG93bk1zID8/IFVOS05PV05fS0lEX1JFRkVUQ0hfQ09PTERPV05fTVM7XG4gICAgdGhpcy5zb3VyY2UgPSBvcHRpb25zLnNvdXJjZSA/PyAncGxhdGZvcm0nO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJpZmljYXRpb24ga2V5IGZvciBga2lkYC5cbiAgICpcbiAgICogQHRocm93cyB7Sndrc1VuYXZhaWxhYmxlRXJyb3J9IHRoZSBrZXkgc2V0IGNvdWxkIG5vdCBiZSBvYnRhaW5lZCBhdCBhbGwuXG4gICAqIEB0aHJvd3Mge1Vua25vd25LaWRFcnJvcn0gdGhlIGtleSBzZXQgaXMgaW4gaGFuZCBidXQgaGFzIG5vIHN1Y2gga2V5LlxuICAgKi9cbiAgYXN5bmMgZ2V0S2V5KGtpZDogc3RyaW5nKTogUHJvbWlzZTxLZXlPYmplY3Q+IHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUZyZXNoKCk7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5rZXlzLmdldChraWQpO1xuICAgIGlmIChrZXkpIHJldHVybiBrZXk7XG5cbiAgICAvLyBVbmtub3duIGtpZDogcGxhdGZvcm0gbWF5IGhhdmUgSlVTVCByb3RhdGVkLiBSZWZldGNoIG9uY2UgKHJhdGUtbGltaXRlZCksXG4gICAgLy8gdGhlbiBkZWNpZGUuIEEgY2FjaGVkLWJ1dC1zdGFsZSBzZXQgdGhhdCBzdGlsbCBsYWNrcyB0aGUga2lkIGFmdGVyIHRoZVxuICAgIC8vIHJlZmV0Y2ggaXMgYSByZWFsIHJlamVjdGlvbiwgbm90IGEgZnJlc2huZXNzIHByb2JsZW0uXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBpZiAobm93IC0gdGhpcy5sYXN0VW5rbm93bktpZEZldGNoQXQgPj0gdGhpcy51bmtub3duS2lkQ29vbGRvd25Ncykge1xuICAgICAgdGhpcy5sYXN0VW5rbm93bktpZEZldGNoQXQgPSBub3c7XG4gICAgICBlbWl0Q291bnRlcignandrc191bmtub3duX2tpZF9yZWZldGNoX3RvdGFsJywgeyBzb3VyY2U6IHRoaXMuc291cmNlIH0pO1xuICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKHsgZm9yY2U6IHRydWUgfSkuY2F0Y2goKCkgPT4geyAvKiBoYW5kbGVkIGJlbG93IGJ5IHRoZSBtaXNzICovIH0pO1xuICAgICAgY29uc3QgcmVmcmVzaGVkID0gdGhpcy5rZXlzLmdldChraWQpO1xuICAgICAgaWYgKHJlZnJlc2hlZCkgcmV0dXJuIHJlZnJlc2hlZDtcbiAgICB9XG4gICAgaWYgKHRoaXMua2V5cy5zaXplID09PSAwKSB0aHJvdyBuZXcgSndrc1VuYXZhaWxhYmxlRXJyb3IoKTtcbiAgICB0aHJvdyBuZXcgVW5rbm93bktpZEVycm9yKGtpZCk7XG4gIH1cblxuICAvKiogRXZlcnkgY3VycmVudGx5LXRydXN0ZWQgYGtpZGAuIEV4cG9zZWQgZm9yIGRpYWdub3N0aWNzIGFuZCB0ZXN0cy4gKi9cbiAga25vd25LaWRzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMua2V5cy5rZXlzKCldO1xuICB9XG5cbiAgLyoqIERyb3AgZXZlcnl0aGluZywgc28gdGhlIG5leHQgbG9va3VwIHJlZmV0Y2hlcy4gKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5rZXlzLmNsZWFyKCk7XG4gICAgdGhpcy5mZXRjaGVkQXQgPSAwO1xuICAgIHRoaXMuZmFpbGVkVW50aWwgPSAwO1xuICAgIHRoaXMubGFzdFVua25vd25LaWRGZXRjaEF0ID0gMDtcbiAgICB0aGlzLmluRmxpZ2h0ID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFJlZmV0Y2ggd2hlbiB0aGUgc2V0IGlzIG1pc3Npbmcgb3IgcGFzdCBpdHMgcmVmcmVzaCBpbnRlcnZhbC4gKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVGcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHN0YWxlID0gbm93IC0gdGhpcy5mZXRjaGVkQXQgPj0gdGhpcy5yZWZyZXNoSW50ZXJ2YWxNcztcbiAgICBpZiAodGhpcy5rZXlzLnNpemUgPiAwICYmICFzdGFsZSkgcmV0dXJuO1xuXG4gICAgaWYgKG5vdyA8IHRoaXMuZmFpbGVkVW50aWwpIHtcbiAgICAgIC8vIEluc2lkZSB0aGUgbmVnYXRpdmUtY2FjaGUgd2luZG93LiBTZXJ2ZSBhIGtleSBzZXQgd2UgYWxyZWFkeSBob2xkXG4gICAgICAvLyAocHVibGljIGtleXMgZG9uJ3QgZXhwaXJlKTsgd2l0aCBub3RoaW5nIGluIGhhbmQsIGZhaWwgY2xvc2VkLlxuICAgICAgaWYgKHRoaXMua2V5cy5zaXplID4gMCkgcmV0dXJuO1xuICAgICAgdGhyb3cgbmV3IEp3a3NVbmF2YWlsYWJsZUVycm9yKCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMucmVmcmVzaCh7IGZvcmNlOiBmYWxzZSB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKHRoaXMua2V5cy5zaXplID4gMCkge1xuICAgICAgICBsb2dnZXIud2FybignSldLUyByZWZyZXNoIGZhaWxlZDsgY29udGludWluZyBvbiB0aGUgY2FjaGVkIGtleSBzZXQnLCB7XG4gICAgICAgICAgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgICAgICBlcnJvcjogZXJyb3JNZXNzYWdlKGVycm9yKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBKd2tzVW5hdmFpbGFibGVFcnJvcigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBPbmUgcmVhbCBmZXRjaCwgc2hhcmVkIGJ5IGV2ZXJ5IGNvbmN1cnJlbnQgY2FsbGVyLiAqL1xuICBwcml2YXRlIHJlZnJlc2gob3B0czogeyBmb3JjZTogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaW5GbGlnaHQpIHJldHVybiB0aGlzLmluRmxpZ2h0O1xuICAgIGlmICghb3B0cy5mb3JjZSAmJiBEYXRlLm5vdygpIDwgdGhpcy5mYWlsZWRVbnRpbCkgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBKd2tzVW5hdmFpbGFibGVFcnJvcigpKTtcbiAgICBjb25zdCBwcm9taXNlID0gdGhpcy5wZXJmb3JtRmV0Y2goKS5maW5hbGx5KCgpID0+IHsgdGhpcy5pbkZsaWdodCA9IHVuZGVmaW5lZDsgfSk7XG4gICAgdGhpcy5pbkZsaWdodCA9IHByb21pc2U7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBlcmZvcm1GZXRjaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgZG9jdW1lbnQ6IEp3a3NEb2N1bWVudDtcbiAgICB0cnkge1xuICAgICAgZG9jdW1lbnQgPSBhd2FpdCB0aGlzLm9wdGlvbnMuZmV0Y2goKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5mYWlsZWRVbnRpbCA9IERhdGUubm93KCkgKyB0aGlzLm5lZ2F0aXZlVHRsTXM7XG4gICAgICBlbWl0Q291bnRlcignandrc19mZXRjaF90b3RhbCcsIHsgc291cmNlOiB0aGlzLnNvdXJjZSwgcmVzdWx0OiAnZXJyb3InIH0pO1xuICAgICAgbG9nZ2VyLndhcm4oJ0pXS1MgZmV0Y2ggZmFpbGVkJywge1xuICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlLFxuICAgICAgICBlcnJvcjogZXJyb3JNZXNzYWdlKGVycm9yKSxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMgPSBuZXcgTWFwPHN0cmluZywgS2V5T2JqZWN0PigpO1xuICAgIGZvciAoY29uc3QgandrIG9mIGRvY3VtZW50LmtleXMgYXMgUHVibGljSndrW10pIHtcbiAgICAgIGlmICghandrPy5raWQpIGNvbnRpbnVlO1xuICAgICAgdHJ5IHtcbiAgICAgICAga2V5cy5zZXQoandrLmtpZCwgcHVibGljS2V5RnJvbUp3ayhqd2spKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIE9uZSB1bnVzYWJsZSBlbnRyeSBtdXN0IG5vdCBkaXNjYXJkIHRoZSByZXN0IG9mIHRoZSBzZXQuXG4gICAgICAgIGxvZ2dlci53YXJuKCdTa2lwcGluZyB1bnVzYWJsZSBKV0tTIGVudHJ5JywgeyBraWQ6IGp3ay5raWQsIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyb3IpIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoa2V5cy5zaXplID09PSAwKSB7XG4gICAgICB0aGlzLmZhaWxlZFVudGlsID0gRGF0ZS5ub3coKSArIHRoaXMubmVnYXRpdmVUdGxNcztcbiAgICAgIGVtaXRDb3VudGVyKCdqd2tzX2ZldGNoX3RvdGFsJywgeyBzb3VyY2U6IHRoaXMuc291cmNlLCByZXN1bHQ6ICdlbXB0eScgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0pXS1MgZG9jdW1lbnQgY29udGFpbmVkIG5vIHVzYWJsZSBrZXlzJyk7XG4gICAgfVxuXG4gICAgdGhpcy5rZXlzID0ga2V5cztcbiAgICB0aGlzLmZldGNoZWRBdCA9IERhdGUubm93KCk7XG4gICAgdGhpcy5mYWlsZWRVbnRpbCA9IDA7XG4gICAgZW1pdENvdW50ZXIoJ2p3a3NfZmV0Y2hfdG90YWwnLCB7IHNvdXJjZTogdGhpcy5zb3VyY2UsIHJlc3VsdDogJ3N1Y2Nlc3MnIH0pO1xuICB9XG59XG5cbi8qKlxuICogRmV0Y2ggcGxhdGZvcm0ncyBKV0tTIG92ZXIgdGhlIGluLWNsdXN0ZXIgYWRkcmVzcyBldmVyeSBvdGhlciBjYWxsZXIgdXNlc1xuICogKGBQTEFURk9STV9TRVJWSUNFX0hPU1RgIC8gYFBMQVRGT1JNX1NFUlZJQ0VfUE9SVGApLCBvciB0aGUgYWJzb2x1dGVcbiAqIGBQTEFURk9STV9KV0tTX1VSTGAgd2hlbiBvbmUgaXMgY29uZmlndXJlZCAodGhlIENMSSBhbmQgdGhlIGV2ZW50cyBMYW1iZGEgcnVuXG4gKiBvdXRzaWRlIHRoZSBjbHVzdGVyKS5cbiAqXG4gKiBVbmF1dGhlbnRpY2F0ZWQgYnkgZGVzaWduOiB0aGUga2V5IHNldCBpcyBwdWJsaWMsIGFuZCByZXF1aXJpbmcgYSBjcmVkZW50aWFsXG4gKiB0byBmZXRjaCB0aGUga2V5cyB0aGF0IHZlcmlmeSBjcmVkZW50aWFscyBpcyBhIGJvb3RzdHJhcCBjeWNsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hQbGF0Zm9ybUp3a3MoKTogUHJvbWlzZTxKd2tzRG9jdW1lbnQ+IHtcbiAgY29uc3QgYWJzb2x1dGUgPSBwcm9jZXNzLmVudi5QTEFURk9STV9KV0tTX1VSTDtcbiAgY29uc3QgdGltZW91dCA9IGVudkludCgnSldLU19GRVRDSF9USU1FT1VUX01TJywgMzAwMCwgeyBtaW46IDEgfSk7XG4gIGlmIChhYnNvbHV0ZSkgcmV0dXJuIGZldGNoSndrc0Zyb21VcmwoYWJzb2x1dGUsIHRpbWVvdXQpO1xuXG4gIC8vIExvYWRlZCBMQVpJTFksIG9uIHRoZSBmaXJzdCBmZXRjaC4gQSBzdGF0aWMgaW1wb3J0IHdvdWxkIHB1dCB0aGUgSFRUUCBjbGllbnRcbiAgLy8gKGFuZCBwbGF0Zm9ybSdzIGFkZHJlc3MpIGludG8gdGhlIGltcG9ydCBncmFwaCBvZiBldmVyeSBtb2R1bGUgdGhhdCBtZXJlbHlcbiAgLy8gdXNlcyBgcmVxdWlyZUF1dGhgIOKAlCB0aGUgc2FtZSByZWFzb24gYGFwaS1rZXktZXhjaGFuZ2VgIGlzIGxhenksIGFuZCB3aGF0XG4gIC8vIGtlZXBzIHBhcnRpYWwgYGh0dHAtY2xpZW50LmpzYCBtb2NrcyBpbiB0aGUgc2VydmljZSBzdWl0ZXMgd29ya2luZy5cbiAgY29uc3QgeyBJbnRlcm5hbEh0dHBDbGllbnQgfSA9IGF3YWl0IGltcG9ydCgnLi9odHRwLWNsaWVudC5qcycpO1xuICBjb25zdCBjbGllbnQgPSBuZXcgSW50ZXJuYWxIdHRwQ2xpZW50KHtcbiAgICAuLi5zZXJ2aWNlRW5kcG9pbnQoJ3BsYXRmb3JtJyksXG4gICAgdGltZW91dCxcbiAgfSk7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGNsaWVudC5nZXQ8dW5rbm93bj4oSldLU19QQVRILCB7IGlkZW1wb3RlbnQ6IHRydWUgfSk7XG4gIGlmIChyZXMuc3RhdHVzQ29kZSAhPT0gMjAwIHx8ICFpc0p3a3NEb2N1bWVudChyZXMuYm9keSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgSldLUyByZXNwb25zZSAoc3RhdHVzICR7cmVzLnN0YXR1c0NvZGV9KWApO1xuICB9XG4gIHJldHVybiByZXMuYm9keTtcbn1cblxuLyoqIEZldGNoIGEgSldLUyBkb2N1bWVudCBmcm9tIGFuIGFic29sdXRlIFVSTCAob3V0c2lkZS10aGUtY2x1c3RlciB2ZXJpZmllcnMpLiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hKd2tzRnJvbVVybCh1cmw6IHN0cmluZywgdGltZW91dE1zID0gMzAwMCk6IFByb21pc2U8Sndrc0RvY3VtZW50PiB7XG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIHRpbWVvdXRNcyk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsIGhlYWRlcnM6IHsgYWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicgfSB9KTtcbiAgICBpZiAoIXJlcy5vaykgdGhyb3cgbmV3IEVycm9yKGBKV0tTIGZldGNoIHJldHVybmVkICR7cmVzLnN0YXR1c31gKTtcbiAgICBjb25zdCBib2R5OiB1bmtub3duID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoIWlzSndrc0RvY3VtZW50KGJvZHkpKSB0aHJvdyBuZXcgRXJyb3IoJ0pXS1MgcmVzcG9uc2Ugd2FzIG5vdCBhIGtleSBzZXQnKTtcbiAgICByZXR1cm4gYm9keTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICB9XG59XG5cbmxldCBwbGF0Zm9ybUp3a3M6IEp3a3NDYWNoZSB8IHVuZGVmaW5lZDtcblxuLyoqIFRoZSBwcm9jZXNzLXdpZGUgY2FjaGUgb2YgcGxhdGZvcm0ncyBwdWJsaXNoZWQgc2lnbmluZyBrZXlzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsYXRmb3JtSndrc0NhY2hlKCk6IEp3a3NDYWNoZSB7XG4gIHBsYXRmb3JtSndrcyA/Pz0gbmV3IEp3a3NDYWNoZSh7IGZldGNoOiBmZXRjaFBsYXRmb3JtSndrcywgc291cmNlOiAncGxhdGZvcm0nIH0pO1xuICByZXR1cm4gcGxhdGZvcm1Kd2tzO1xufVxuXG4vKipcbiAqIFJlcGxhY2UgdGhlIHByb2Nlc3Mtd2lkZSBjYWNoZSDigJQgdXNlZCBieSB0ZXN0cywgYW5kIGJ5IGFueSBob3N0IHRoYXQgbXVzdFxuICogc3VwcGx5IGl0cyBvd24gZmV0Y2hlci4gUGFzcyBgdW5kZWZpbmVkYCB0byBkcm9wIGJhY2sgdG8gdGhlIGRlZmF1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRQbGF0Zm9ybUp3a3NDYWNoZShjYWNoZTogSndrc0NhY2hlIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIHBsYXRmb3JtSndrcyA9IGNhY2hlO1xufVxuIl19
@@ -22,15 +22,58 @@ export interface LockRedis extends ReadyAwareRedis {
22
22
  * either method. Never throws.
23
23
  */
24
24
  export declare function closeLeaderLock(redis: LockRedis | null | undefined): Promise<void>;
25
+ /**
26
+ * Default lock lifetime — a CRASH-RECOVERY window, not a run-duration cover.
27
+ *
28
+ * The holder heartbeats (compare-and-PEXPIRE every `ttlMs / 3`) for as long as
29
+ * `fn` runs, so a six-hour job holds a two-minute lock perfectly well. What the
30
+ * TTL actually decides is how long a job stays BLOCKED after the pod holding it
31
+ * dies without releasing — the key simply sits there until it expires. Sizing the
32
+ * TTL to the expected run time (which is what several callers used to do) turned a
33
+ * crashed pod into hours of silent inactivity.
34
+ *
35
+ * Two minutes leaves three missed heartbeats of slack, so an event-loop stall or a
36
+ * brief Redis blip does not hand the lock to a second pod mid-run, while recovery
37
+ * after a real crash is bounded at two minutes.
38
+ */
39
+ export declare const DEFAULT_LEADER_LOCK_TTL_MS = 120000;
40
+ /**
41
+ * The one way to build a leader-lock key: `<service>:<job>:leader`.
42
+ *
43
+ * Four conventions had grown up — `plugin:vuln-rescan:leader`,
44
+ * `platform:leader:org-purge`, a bare `ecosystem-stats:leader`, and billing's
45
+ * unnamespaced `subscription-lifecycle` — which meant no single glob found every
46
+ * lock. `KEYS '*:leader'` missed billing's three entirely, so an operator asking
47
+ * "what is held right now" got a partial answer. The env Redis client sets no
48
+ * `keyPrefix`, so these share one flat keyspace with cache, BullMQ and spool keys;
49
+ * the `<service>:` segment is what keeps them apart.
50
+ */
51
+ export declare function leaderLockKey(service: string, job: string): string;
52
+ /** Why a leader-locked run was told to stop. */
53
+ export type LeaderLockAbortReason = 'lock-lost' | 'shutdown';
25
54
  /** What a leader-locked run is told while it runs. */
26
55
  export interface LeaderLockRun {
27
56
  /**
28
57
  * Aborted when the lock is LOST mid-run (a heartbeat found another holder, or
29
- * the key gone). Long runs should check it between units of work and stop —
30
- * past that point another pod may be doing the same work.
58
+ * the key gone), or when the caller is SHUTTING DOWN. Long runs must check it
59
+ * between units of work and return: past a lock loss another pod may be doing
60
+ * the same work, and on shutdown returning promptly is what releases the lock
61
+ * instead of leaving it to expire.
62
+ *
63
+ * `signal.reason` is a {@link LeaderLockAbortReason}.
31
64
  */
32
65
  signal: AbortSignal;
33
66
  }
67
+ /** Caller-supplied controls for {@link withLeaderLock}. */
68
+ export interface LeaderLockOptions {
69
+ /**
70
+ * Aborted by the caller to ask a running job to stop — a scheduler's `stop()`
71
+ * on shutdown. Merged into {@link LeaderLockRun.signal}, so a signal-aware `fn`
72
+ * returns and the lock is released in the `finally` rather than lingering for
73
+ * the rest of the TTL.
74
+ */
75
+ signal?: AbortSignal;
76
+ }
34
77
  /**
35
78
  * Run `fn` only if this process wins a short-lived distributed lock — the
36
79
  * across-pods "single runner" guard for periodic jobs (digest flushes, etc.).
@@ -46,10 +89,20 @@ export interface LeaderLockRun {
46
89
  * If Redis can't be reached the run is skipped (returns false) rather than
47
90
  * rejecting — callers are timers, and a Redis blip must not crash the process.
48
91
  *
92
+ * EVERY outcome is counted, because they mean very different things and the
93
+ * difference used to be visible only in a log line:
94
+ * - `leader_lock_acquired_total` — this pod ran the window. A job whose count
95
+ * stays flat is not running ANYWHERE, which is the condition worth alerting on.
96
+ * - `leader_lock_contended_total` — another pod holds it. Healthy and expected
97
+ * with replicas > 1; exactly one acquire per window across the fleet.
98
+ * - `leader_lock_unavailable_total` — Redis unreachable, so NOBODY ran this
99
+ * window. A Redis blip silently stopping every sweep fleet-wide was previously
100
+ * a WARN log and nothing else.
101
+ *
49
102
  * @returns true if we held the lock and ran `fn`; false if another holder did or
50
103
  * the lock couldn't be taken.
51
104
  */
52
- export declare function withLeaderLock(redis: LockRedis, key: string, ttlMs: number, fn: (run: LeaderLockRun) => Promise<void>): Promise<boolean>;
105
+ export declare function withLeaderLock(redis: LockRedis, key: string, ttlMs: number, fn: (run: LeaderLockRun) => Promise<void>, opts?: LeaderLockOptions): Promise<boolean>;
53
106
  /**
54
107
  * A `LockRedis` backed by the shared env Redis client (see env-redis.ts) — the leader-lock counterpart to `createEnvRedisAuditSpool` /
55
108
  * `createEnvRedisTokenRevocationStore`, for a service that has no BullMQ client to