velocious 1.0.618 → 1.0.620

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 (61) hide show
  1. package/README.md +4 -2
  2. package/build/configuration.js +1 -1
  3. package/build/database/pool/async-tracked-multi-connection.js +25 -5
  4. package/build/database/pool/base.js +20 -10
  5. package/build/environment-handlers/base.js +9 -1
  6. package/build/environment-handlers/node.js +22 -4
  7. package/build/src/configuration.js +2 -2
  8. package/build/src/database/pool/async-tracked-multi-connection.d.ts +19 -1
  9. package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
  10. package/build/src/database/pool/async-tracked-multi-connection.js +26 -4
  11. package/build/src/database/pool/base.d.ts +12 -1
  12. package/build/src/database/pool/base.d.ts.map +1 -1
  13. package/build/src/database/pool/base.js +20 -11
  14. package/build/src/environment-handlers/base.d.ts +9 -1
  15. package/build/src/environment-handlers/base.d.ts.map +1 -1
  16. package/build/src/environment-handlers/base.js +9 -2
  17. package/build/src/environment-handlers/node.d.ts +10 -2
  18. package/build/src/environment-handlers/node.d.ts.map +1 -1
  19. package/build/src/environment-handlers/node.js +24 -5
  20. package/build/src/testing/shared-transaction-broker-client.d.ts +4 -2
  21. package/build/src/testing/shared-transaction-broker-client.d.ts.map +1 -1
  22. package/build/src/testing/shared-transaction-broker-client.js +5 -3
  23. package/build/src/testing/shared-transaction-broker.d.ts +21 -0
  24. package/build/src/testing/shared-transaction-broker.d.ts.map +1 -1
  25. package/build/src/testing/shared-transaction-broker.js +61 -18
  26. package/build/src/testing/shared-transaction-connection-coordinator.d.ts +2 -0
  27. package/build/src/testing/shared-transaction-connection-coordinator.d.ts.map +1 -1
  28. package/build/src/testing/shared-transaction-connection-coordinator.js +79 -12
  29. package/build/src/testing/shared-transaction-proxy-driver.d.ts +22 -3
  30. package/build/src/testing/shared-transaction-proxy-driver.d.ts.map +1 -1
  31. package/build/src/testing/shared-transaction-proxy-driver.js +51 -14
  32. package/build/src/testing/test-transaction-session.d.ts +129 -0
  33. package/build/src/testing/test-transaction-session.d.ts.map +1 -0
  34. package/build/src/testing/test-transaction-session.js +255 -0
  35. package/build/src/testing/test.d.ts +1 -1
  36. package/build/src/testing/test.d.ts.map +1 -1
  37. package/build/src/testing/test.js +2 -2
  38. package/build/testing/shared-transaction-broker-client.js +4 -2
  39. package/build/testing/shared-transaction-broker.js +58 -16
  40. package/build/testing/shared-transaction-connection-coordinator.js +83 -10
  41. package/build/testing/shared-transaction-proxy-driver.js +52 -13
  42. package/build/testing/test-transaction-session.js +240 -0
  43. package/build/testing/test.js +1 -1
  44. package/build/tsconfig.tsbuildinfo +1 -1
  45. package/package.json +2 -1
  46. package/src/configuration.js +1 -1
  47. package/src/database/pool/async-tracked-multi-connection.js +25 -5
  48. package/src/database/pool/base.js +20 -10
  49. package/src/environment-handlers/base.js +9 -1
  50. package/src/environment-handlers/node.js +22 -4
  51. package/src/testing/shared-transaction-broker-client.js +4 -2
  52. package/src/testing/shared-transaction-broker.js +58 -16
  53. package/src/testing/shared-transaction-connection-coordinator.js +83 -10
  54. package/src/testing/shared-transaction-proxy-driver.js +52 -13
  55. package/src/testing/test-transaction-session.js +240 -0
  56. package/src/testing/test.js +1 -1
  57. package/build/src/testing/wait-for-event.d.ts +0 -46
  58. package/build/src/testing/wait-for-event.d.ts.map +0 -1
  59. package/build/src/testing/wait-for-event.js +0 -64
  60. package/build/testing/wait-for-event.js +0 -72
  61. package/src/testing/wait-for-event.js +0 -72
@@ -4,11 +4,12 @@ import { decodeBrokerValue, encodeBrokerValue } from "./shared-transaction-codec
4
4
  export default class SharedTransactionBrokerClient {
5
5
  /**
6
6
  * Creates a broker client.
7
- * @param {{address: string, capability: string, databaseIdentifier: string}} args - Broker coordinates.
7
+ * @param {{address: string, capability: string, databaseIdentifier: string, reuseKey?: string}} args - Broker coordinates.
8
8
  */
9
- constructor({ address, capability, databaseIdentifier }) {
9
+ constructor({ address, capability, databaseIdentifier, reuseKey }) {
10
10
  this.capability = capability;
11
11
  this.databaseIdentifier = databaseIdentifier;
12
+ this.reuseKey = reuseKey;
12
13
  this.nextRequestId = 1;
13
14
  /** @type {Map<number, {reject: (error: Error) => void, resolve: (value: ReturnType<typeof decodeBrokerValue>) => void}>} */
14
15
  this.pending = new Map();
@@ -42,6 +43,7 @@ export default class SharedTransactionBrokerClient {
42
43
  requestId,
43
44
  capability: this.capability,
44
45
  databaseIdentifier: this.databaseIdentifier,
46
+ reuseKey: this.reuseKey,
45
47
  method,
46
48
  args: encodeBrokerValue(args)
47
49
  }), (error) => {
@@ -102,4 +104,4 @@ export default class SharedTransactionBrokerClient {
102
104
  });
103
105
  }
104
106
  }
105
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLXRyYW5zYWN0aW9uLWJyb2tlci1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy9zaGFyZWQtdHJhbnNhY3Rpb24tYnJva2VyLWNsaWVudC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxTQUFTLE1BQU0sSUFBSSxDQUFBO0FBQzFCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFBO0FBRXBGLE1BQU0sQ0FBQyxPQUFPLE9BQU8sNkJBQTZCO0lBQ2hEOzs7T0FHRztJQUNILFlBQVksRUFBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixFQUFDO1FBQ25ELElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFBO1FBQzVCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQTtRQUM1QyxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQTtRQUN0Qiw0SEFBNEg7UUFDNUgsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBQ3hCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDcEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3ZELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQTtZQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDbkMsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxJQUFJ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O1FBQ3JELENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDLENBQUE7UUFDekUsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsYUFBYSxDQUFDLEtBQUs7UUFDakIsS0FBSyxNQUFNLEVBQUMsTUFBTSxFQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDM0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUN0QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLEtBQUs7UUFDVCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxLQUFLLFNBQVMsQ0FBQyxNQUFNO1lBQUUsT0FBTTtRQUN2RCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxLQUFLLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFBO1lBQ3ZCLE9BQU07UUFDUixDQUFDO1FBQ0QsTUFBTSxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQTtZQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ3JCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBXZWJTb2NrZXQgZnJvbSBcIndzXCJcbmltcG9ydCB7IGRlY29kZUJyb2tlclZhbHVlLCBlbmNvZGVCcm9rZXJWYWx1ZSB9IGZyb20gXCIuL3NoYXJlZC10cmFuc2FjdGlvbi1jb2RlYy5qc1wiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoYXJlZFRyYW5zYWN0aW9uQnJva2VyQ2xpZW50IHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBicm9rZXIgY2xpZW50LlxuICAgKiBAcGFyYW0ge3thZGRyZXNzOiBzdHJpbmcsIGNhcGFiaWxpdHk6IHN0cmluZywgZGF0YWJhc2VJZGVudGlmaWVyOiBzdHJpbmd9fSBhcmdzIC0gQnJva2VyIGNvb3JkaW5hdGVzLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2FkZHJlc3MsIGNhcGFiaWxpdHksIGRhdGFiYXNlSWRlbnRpZmllcn0pIHtcbiAgICB0aGlzLmNhcGFiaWxpdHkgPSBjYXBhYmlsaXR5XG4gICAgdGhpcy5kYXRhYmFzZUlkZW50aWZpZXIgPSBkYXRhYmFzZUlkZW50aWZpZXJcbiAgICB0aGlzLm5leHRSZXF1ZXN0SWQgPSAxXG4gICAgLyoqIEB0eXBlIHtNYXA8bnVtYmVyLCB7cmVqZWN0OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkLCByZXNvbHZlOiAodmFsdWU6IFJldHVyblR5cGU8dHlwZW9mIGRlY29kZUJyb2tlclZhbHVlPikgPT4gdm9pZH0+fSAqL1xuICAgIHRoaXMucGVuZGluZyA9IG5ldyBNYXAoKVxuICAgIHRoaXMuc29ja2V0ID0gbmV3IFdlYlNvY2tldChhZGRyZXNzKVxuICAgIHRoaXMuY29ubmVjdGlvblByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnNvY2tldC5vbmNlKFwib3BlblwiLCByZXNvbHZlKVxuICAgICAgdGhpcy5zb2NrZXQub25jZShcImVycm9yXCIsIHJlamVjdClcbiAgICB9KVxuICAgIHRoaXMuc29ja2V0Lm9uKFwibWVzc2FnZVwiLCAoZGF0YSkgPT4gdGhpcy5oYW5kbGVNZXNzYWdlKGAke2RhdGF9YCkpXG4gICAgdGhpcy5zb2NrZXQub25jZShcImNsb3NlXCIsICgpID0+IHRoaXMucmVqZWN0UGVuZGluZyhuZXcgRXJyb3IoXCJTaGFyZWQgdHJhbnNhY3Rpb24gYnJva2VyIGNvbm5lY3Rpb24gY2xvc2VkXCIpKSlcbiAgICB0aGlzLnNvY2tldC5vbihcImVycm9yXCIsIChlcnJvcikgPT4gdGhpcy5yZWplY3RQZW5kaW5nKGVycm9yKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgdGhlIHdlYnNvY2tldCB0byBvcGVuLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciB0aGUgd2Vic29ja2V0IG9wZW5zLlxuICAgKi9cbiAgYXN5bmMgY29ubmVjdGVkKCkgeyBhd2FpdCB0aGlzLmNvbm5lY3Rpb25Qcm9taXNlIH1cblxuICAvKipcbiAgICogQ2FsbHMgb25lIHBoeXNpY2FsIGNvbm5lY3Rpb24gb3BlcmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kIC0gQnJva2VyIG9wZXJhdGlvbi5cbiAgICogQHBhcmFtIHtBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGFyZ3MgLSBPcGVyYXRpb24gYXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBkZWNvZGVCcm9rZXJWYWx1ZT4+fSAtIFJlbW90ZSByZXN1bHQuXG4gICAqL1xuICBhc3luYyBjYWxsKG1ldGhvZCwgYXJncykge1xuICAgIGF3YWl0IHRoaXMuY29ubmVjdGVkKClcbiAgICBpZiAodGhpcy5zb2NrZXQucmVhZHlTdGF0ZSAhPT0gV2ViU29ja2V0Lk9QRU4pIHRocm93IG5ldyBFcnJvcihcIlNoYXJlZCB0cmFuc2FjdGlvbiBicm9rZXIgY29ubmVjdGlvbiBpcyBjbG9zZWRcIilcbiAgICBjb25zdCByZXF1ZXN0SWQgPSB0aGlzLm5leHRSZXF1ZXN0SWQrK1xuICAgIGNvbnN0IHJlc3BvbnNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gdGhpcy5wZW5kaW5nLnNldChyZXF1ZXN0SWQsIHtyZXNvbHZlLCByZWplY3R9KSlcblxuICAgIHRoaXMuc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgcmVxdWVzdElkLFxuICAgICAgY2FwYWJpbGl0eTogdGhpcy5jYXBhYmlsaXR5LFxuICAgICAgZGF0YWJhc2VJZGVudGlmaWVyOiB0aGlzLmRhdGFiYXNlSWRlbnRpZmllcixcbiAgICAgIG1ldGhvZCxcbiAgICAgIGFyZ3M6IGVuY29kZUJyb2tlclZhbHVlKGFyZ3MpXG4gICAgfSksIChlcnJvcikgPT4ge1xuICAgICAgaWYgKCFlcnJvcikgcmV0dXJuXG4gICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nLmdldChyZXF1ZXN0SWQpXG4gICAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKHJlcXVlc3RJZClcbiAgICAgIHBlbmRpbmc/LnJlamVjdChlcnJvcilcbiAgICB9KVxuXG4gICAgcmV0dXJuIGF3YWl0IHJlc3BvbnNlXG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhIGNvcnJlbGF0ZWQgYnJva2VyIHJlc3BvbnNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VyaWFsaXplZCAtIFNlcmlhbGl6ZWQgcmVzcG9uc2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIGhhbmRsZU1lc3NhZ2Uoc2VyaWFsaXplZCkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gLyoqIEB0eXBlIHt7cmVxdWVzdElkOiBudW1iZXIsIHJlc3VsdD86IGltcG9ydChcIi4vc2hhcmVkLXRyYW5zYWN0aW9uLWNvZGVjLmpzXCIpLkVuY29kZWRCcm9rZXJWYWx1ZSwgZXJyb3I/OiBpbXBvcnQoXCIuL3NoYXJlZC10cmFuc2FjdGlvbi1jb2RlYy5qc1wiKS5FbmNvZGVkQnJva2VyVmFsdWV9fSAqLyAoSlNPTi5wYXJzZShzZXJpYWxpemVkKSlcbiAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nLmdldChyZXNwb25zZS5yZXF1ZXN0SWQpXG4gICAgaWYgKCFwZW5kaW5nKSByZXR1cm5cbiAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKHJlc3BvbnNlLnJlcXVlc3RJZClcblxuICAgIGlmIChyZXNwb25zZS5lcnJvcikge1xuICAgICAgY29uc3QgZXJyb3IgPSBkZWNvZGVCcm9rZXJWYWx1ZShyZXNwb25zZS5lcnJvcilcbiAgICAgIHBlbmRpbmcucmVqZWN0KGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSlcbiAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnJlc3VsdCkge1xuICAgICAgcGVuZGluZy5yZXNvbHZlKGRlY29kZUJyb2tlclZhbHVlKHJlc3BvbnNlLnJlc3VsdCkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHBlbmRpbmcucmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgc2hhcmVkIHRyYW5zYWN0aW9uIGJyb2tlciByZXNwb25zZVwiKSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVqZWN0cyBldmVyeSBwZW5kaW5nIGNhbGwgYWZ0ZXIgZGlzY29ubmVjdC5cbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBEaXNjb25uZWN0IGVycm9yLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICByZWplY3RQZW5kaW5nKGVycm9yKSB7XG4gICAgZm9yIChjb25zdCB7cmVqZWN0fSBvZiB0aGlzLnBlbmRpbmcudmFsdWVzKCkpIHJlamVjdChlcnJvcilcbiAgICB0aGlzLnBlbmRpbmcuY2xlYXIoKVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgY2xpZW50IHdpdGhvdXQgdG91Y2hpbmcgdGhlIHBhcmVudCBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciB0aGUgd2Vic29ja2V0IGNsb3Nlcy5cbiAgICovXG4gIGFzeW5jIGNsb3NlKCkge1xuICAgIGlmICh0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuQ0xPU0VEKSByZXR1cm5cbiAgICBpZiAodGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNPTk5FQ1RJTkcpIHtcbiAgICAgIHRoaXMuc29ja2V0LnRlcm1pbmF0ZSgpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMuc29ja2V0Lm9uY2UoXCJjbG9zZVwiLCByZXNvbHZlKVxuICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKVxuICAgIH0pXG4gIH1cbn1cbiJdfQ==
107
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLXRyYW5zYWN0aW9uLWJyb2tlci1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy9zaGFyZWQtdHJhbnNhY3Rpb24tYnJva2VyLWNsaWVudC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxTQUFTLE1BQU0sSUFBSSxDQUFBO0FBQzFCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFBO0FBRXBGLE1BQU0sQ0FBQyxPQUFPLE9BQU8sNkJBQTZCO0lBQ2hEOzs7T0FHRztJQUNILFlBQVksRUFBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixFQUFFLFFBQVEsRUFBQztRQUM3RCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQTtRQUM1QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUE7UUFDNUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUE7UUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUE7UUFDdEIsNEhBQTRIO1FBQzVILElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUN4QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3BDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUN2RCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUE7WUFDakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ25DLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsSUFB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RUFBRSxDQUFDO1lBQzNCLE9BQU8sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7UUFDckQsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUMsQ0FBQTtRQUN6RSxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxhQUFhLENBQUMsS0FBSztRQUNqQixLQUFLLE1BQU0sRUFBQyxNQUFNLEVBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUMzRCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQ3RCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsS0FBSztRQUNULElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEtBQUssU0FBUyxDQUFDLE1BQU07WUFBRSxPQUFNO1FBQ3ZELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEtBQUssU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUE7WUFDdkIsT0FBTTtRQUNSLENBQUM7UUFDRCxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1lBQ2xDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDckIsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IFdlYlNvY2tldCBmcm9tIFwid3NcIlxuaW1wb3J0IHsgZGVjb2RlQnJva2VyVmFsdWUsIGVuY29kZUJyb2tlclZhbHVlIH0gZnJvbSBcIi4vc2hhcmVkLXRyYW5zYWN0aW9uLWNvZGVjLmpzXCJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXJDbGllbnQge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIGJyb2tlciBjbGllbnQuXG4gICAqIEBwYXJhbSB7e2FkZHJlc3M6IHN0cmluZywgY2FwYWJpbGl0eTogc3RyaW5nLCBkYXRhYmFzZUlkZW50aWZpZXI6IHN0cmluZywgcmV1c2VLZXk/OiBzdHJpbmd9fSBhcmdzIC0gQnJva2VyIGNvb3JkaW5hdGVzLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2FkZHJlc3MsIGNhcGFiaWxpdHksIGRhdGFiYXNlSWRlbnRpZmllciwgcmV1c2VLZXl9KSB7XG4gICAgdGhpcy5jYXBhYmlsaXR5ID0gY2FwYWJpbGl0eVxuICAgIHRoaXMuZGF0YWJhc2VJZGVudGlmaWVyID0gZGF0YWJhc2VJZGVudGlmaWVyXG4gICAgdGhpcy5yZXVzZUtleSA9IHJldXNlS2V5XG4gICAgdGhpcy5uZXh0UmVxdWVzdElkID0gMVxuICAgIC8qKiBAdHlwZSB7TWFwPG51bWJlciwge3JlamVjdDogKGVycm9yOiBFcnJvcikgPT4gdm9pZCwgcmVzb2x2ZTogKHZhbHVlOiBSZXR1cm5UeXBlPHR5cGVvZiBkZWNvZGVCcm9rZXJWYWx1ZT4pID0+IHZvaWR9Pn0gKi9cbiAgICB0aGlzLnBlbmRpbmcgPSBuZXcgTWFwKClcbiAgICB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXQoYWRkcmVzcylcbiAgICB0aGlzLmNvbm5lY3Rpb25Qcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5zb2NrZXQub25jZShcIm9wZW5cIiwgcmVzb2x2ZSlcbiAgICAgIHRoaXMuc29ja2V0Lm9uY2UoXCJlcnJvclwiLCByZWplY3QpXG4gICAgfSlcbiAgICB0aGlzLnNvY2tldC5vbihcIm1lc3NhZ2VcIiwgKGRhdGEpID0+IHRoaXMuaGFuZGxlTWVzc2FnZShgJHtkYXRhfWApKVxuICAgIHRoaXMuc29ja2V0Lm9uY2UoXCJjbG9zZVwiLCAoKSA9PiB0aGlzLnJlamVjdFBlbmRpbmcobmV3IEVycm9yKFwiU2hhcmVkIHRyYW5zYWN0aW9uIGJyb2tlciBjb25uZWN0aW9uIGNsb3NlZFwiKSkpXG4gICAgdGhpcy5zb2NrZXQub24oXCJlcnJvclwiLCAoZXJyb3IpID0+IHRoaXMucmVqZWN0UGVuZGluZyhlcnJvcikpXG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgZm9yIHRoZSB3ZWJzb2NrZXQgdG8gb3Blbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgdGhlIHdlYnNvY2tldCBvcGVucy5cbiAgICovXG4gIGFzeW5jIGNvbm5lY3RlZCgpIHsgYXdhaXQgdGhpcy5jb25uZWN0aW9uUHJvbWlzZSB9XG5cbiAgLyoqXG4gICAqIENhbGxzIG9uZSBwaHlzaWNhbCBjb25uZWN0aW9uIG9wZXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCAtIEJyb2tlciBvcGVyYXRpb24uXG4gICAqIEBwYXJhbSB7QXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBhcmdzIC0gT3BlcmF0aW9uIGFyZ3VtZW50cy5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgZGVjb2RlQnJva2VyVmFsdWU+Pn0gLSBSZW1vdGUgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgY2FsbChtZXRob2QsIGFyZ3MpIHtcbiAgICBhd2FpdCB0aGlzLmNvbm5lY3RlZCgpXG4gICAgaWYgKHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgIT09IFdlYlNvY2tldC5PUEVOKSB0aHJvdyBuZXcgRXJyb3IoXCJTaGFyZWQgdHJhbnNhY3Rpb24gYnJva2VyIGNvbm5lY3Rpb24gaXMgY2xvc2VkXCIpXG4gICAgY29uc3QgcmVxdWVzdElkID0gdGhpcy5uZXh0UmVxdWVzdElkKytcbiAgICBjb25zdCByZXNwb25zZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHRoaXMucGVuZGluZy5zZXQocmVxdWVzdElkLCB7cmVzb2x2ZSwgcmVqZWN0fSkpXG5cbiAgICB0aGlzLnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHJlcXVlc3RJZCxcbiAgICAgIGNhcGFiaWxpdHk6IHRoaXMuY2FwYWJpbGl0eSxcbiAgICAgIGRhdGFiYXNlSWRlbnRpZmllcjogdGhpcy5kYXRhYmFzZUlkZW50aWZpZXIsXG4gICAgICByZXVzZUtleTogdGhpcy5yZXVzZUtleSxcbiAgICAgIG1ldGhvZCxcbiAgICAgIGFyZ3M6IGVuY29kZUJyb2tlclZhbHVlKGFyZ3MpXG4gICAgfSksIChlcnJvcikgPT4ge1xuICAgICAgaWYgKCFlcnJvcikgcmV0dXJuXG4gICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nLmdldChyZXF1ZXN0SWQpXG4gICAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKHJlcXVlc3RJZClcbiAgICAgIHBlbmRpbmc/LnJlamVjdChlcnJvcilcbiAgICB9KVxuXG4gICAgcmV0dXJuIGF3YWl0IHJlc3BvbnNlXG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhIGNvcnJlbGF0ZWQgYnJva2VyIHJlc3BvbnNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VyaWFsaXplZCAtIFNlcmlhbGl6ZWQgcmVzcG9uc2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIGhhbmRsZU1lc3NhZ2Uoc2VyaWFsaXplZCkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gLyoqIEB0eXBlIHt7cmVxdWVzdElkOiBudW1iZXIsIHJlc3VsdD86IGltcG9ydChcIi4vc2hhcmVkLXRyYW5zYWN0aW9uLWNvZGVjLmpzXCIpLkVuY29kZWRCcm9rZXJWYWx1ZSwgZXJyb3I/OiBpbXBvcnQoXCIuL3NoYXJlZC10cmFuc2FjdGlvbi1jb2RlYy5qc1wiKS5FbmNvZGVkQnJva2VyVmFsdWV9fSAqLyAoSlNPTi5wYXJzZShzZXJpYWxpemVkKSlcbiAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nLmdldChyZXNwb25zZS5yZXF1ZXN0SWQpXG4gICAgaWYgKCFwZW5kaW5nKSByZXR1cm5cbiAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKHJlc3BvbnNlLnJlcXVlc3RJZClcblxuICAgIGlmIChyZXNwb25zZS5lcnJvcikge1xuICAgICAgY29uc3QgZXJyb3IgPSBkZWNvZGVCcm9rZXJWYWx1ZShyZXNwb25zZS5lcnJvcilcbiAgICAgIHBlbmRpbmcucmVqZWN0KGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSlcbiAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnJlc3VsdCkge1xuICAgICAgcGVuZGluZy5yZXNvbHZlKGRlY29kZUJyb2tlclZhbHVlKHJlc3BvbnNlLnJlc3VsdCkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHBlbmRpbmcucmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgc2hhcmVkIHRyYW5zYWN0aW9uIGJyb2tlciByZXNwb25zZVwiKSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVqZWN0cyBldmVyeSBwZW5kaW5nIGNhbGwgYWZ0ZXIgZGlzY29ubmVjdC5cbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBEaXNjb25uZWN0IGVycm9yLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICByZWplY3RQZW5kaW5nKGVycm9yKSB7XG4gICAgZm9yIChjb25zdCB7cmVqZWN0fSBvZiB0aGlzLnBlbmRpbmcudmFsdWVzKCkpIHJlamVjdChlcnJvcilcbiAgICB0aGlzLnBlbmRpbmcuY2xlYXIoKVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgY2xpZW50IHdpdGhvdXQgdG91Y2hpbmcgdGhlIHBhcmVudCBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciB0aGUgd2Vic29ja2V0IGNsb3Nlcy5cbiAgICovXG4gIGFzeW5jIGNsb3NlKCkge1xuICAgIGlmICh0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuQ0xPU0VEKSByZXR1cm5cbiAgICBpZiAodGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNPTk5FQ1RJTkcpIHtcbiAgICAgIHRoaXMuc29ja2V0LnRlcm1pbmF0ZSgpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMuc29ja2V0Lm9uY2UoXCJjbG9zZVwiLCByZXNvbHZlKVxuICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKVxuICAgIH0pXG4gIH1cbn1cbiJdfQ==
@@ -27,6 +27,7 @@ export default class SharedTransactionBroker extends EventEmitter {
27
27
  connectionCoordinators: Map<object, (callback: () => Promise<ReturnType<typeof JSON.parse>>) => Promise<ReturnType<typeof JSON.parse>>>;
28
28
  /** @type {Map<object, symbol>} */
29
29
  connectionCoordinatorOwners: Map<object, symbol>;
30
+ physicalConnections: Map<any, any>;
30
31
  httpServer: import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>;
31
32
  websocketServer: import("ws").Server<typeof import("ws").WebSocket, typeof import("node:http").IncomingMessage>;
32
33
  /**
@@ -36,6 +37,22 @@ export default class SharedTransactionBroker extends EventEmitter {
36
37
  constructor({ connections }: {
37
38
  connections: Record<string, object>;
38
39
  });
40
+ /**
41
+ * Installs serialization ownership for a newly enrolled physical connection.
42
+ * @param {object} connection - Parent-owned physical connection.
43
+ * @returns {void}
44
+ */
45
+ installConnectionCoordinator(connection: object): void;
46
+ /**
47
+ * Enrolls one exact physical database identity in this capability's rollback set.
48
+ * @param {{connection: object, databaseIdentifier: string, reuseKey: string}} args - Physical connection identity.
49
+ * @returns {void}
50
+ */
51
+ enrollConnection({ connection, databaseIdentifier, reuseKey }: {
52
+ connection: object;
53
+ databaseIdentifier: string;
54
+ reuseKey: string;
55
+ }): void;
39
56
  /**
40
57
  * Starts a broker on an ephemeral loopback port.
41
58
  * @param {{connections: Record<string, object>}} args - Parent-owned physical connections.
@@ -158,6 +175,10 @@ export default class SharedTransactionBroker extends EventEmitter {
158
175
  * @returns {Promise<void>} - Resolves after transport shutdown.
159
176
  */
160
177
  close(): Promise<void>;
178
+ /** Revokes admission without interrupting already accepted work. */
179
+ revoke(): void;
180
+ /** Drains all work accepted before capability revocation. */
181
+ drain(): Promise<void>;
161
182
  /**
162
183
  * Performs deterministic transport shutdown and reports cleanup failures last.
163
184
  * @returns {Promise<void>} - Resolves after shutdown or rejects with cleanup errors.
@@ -1 +1 @@
1
- {"version":3,"file":"shared-transaction-broker.d.ts","sourceRoot":"","sources":["../../../src/testing/shared-transaction-broker.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shared-transaction-broker.d.ts","sourceRoot":"","sources":["../../../src/testing/shared-transaction-broker.js"],"names":[],"mappings":"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"}
@@ -73,15 +73,9 @@ export default class SharedTransactionBroker extends EventEmitter {
73
73
  /** @type {Map<object, symbol>} */
74
74
  this.connectionCoordinatorOwners = new Map();
75
75
  for (const connection of new Set(Object.values(connections))) {
76
- /**
77
- * Serializes parent operations with child broker traffic.
78
- * @param {() => Promise<unknown>} callback - Parent operation.
79
- * @returns {Promise<unknown>} - Operation result.
80
- */
81
- const coordinator = async (callback) => await this.serialize(this.connectionState(connection), callback);
82
- this.connectionCoordinators.set(connection, coordinator);
83
- this.connectionCoordinatorOwners.set(connection, setSharedTransactionCoordinator(connection, coordinator));
76
+ this.installConnectionCoordinator(connection);
84
77
  }
78
+ this.physicalConnections = new Map();
85
79
  this.httpServer = createServer();
86
80
  this.websocketServer = new WebSocketServer({ server: this.httpServer, maxPayload: 16 * 1024 * 1024 });
87
81
  this.websocketServer.on("connection", (socket) => {
@@ -93,6 +87,38 @@ export default class SharedTransactionBroker extends EventEmitter {
93
87
  socket.on("message", (data) => void this.handleRequest(socket, `${data}`));
94
88
  });
95
89
  }
90
+ /**
91
+ * Installs serialization ownership for a newly enrolled physical connection.
92
+ * @param {object} connection - Parent-owned physical connection.
93
+ * @returns {void}
94
+ */
95
+ installConnectionCoordinator(connection) {
96
+ if (this.connectionCoordinators.has(connection))
97
+ return;
98
+ /**
99
+ * Serializes parent operations with child broker traffic.
100
+ * @param {() => Promise<unknown>} callback - Parent operation.
101
+ * @returns {Promise<unknown>} - Operation result.
102
+ */
103
+ const coordinator = async (callback) => await this.serialize(this.connectionState(connection), callback);
104
+ this.connectionCoordinators.set(connection, coordinator);
105
+ this.connectionCoordinatorOwners.set(connection, setSharedTransactionCoordinator(connection, coordinator));
106
+ }
107
+ /**
108
+ * Enrolls one exact physical database identity in this capability's rollback set.
109
+ * @param {{connection: object, databaseIdentifier: string, reuseKey: string}} args - Physical connection identity.
110
+ * @returns {void}
111
+ */
112
+ enrollConnection({ connection, databaseIdentifier, reuseKey }) {
113
+ if (!this.accepting)
114
+ throw new Error("Shared transaction broker capability has been revoked");
115
+ const identity = `${databaseIdentifier}\0${reuseKey}`;
116
+ const existing = this.physicalConnections.get(identity);
117
+ if (existing && existing !== connection)
118
+ throw new Error(`Shared transaction physical connection identity is already enrolled: ${databaseIdentifier}`);
119
+ this.installConnectionCoordinator(connection);
120
+ this.physicalConnections.set(identity, connection);
121
+ }
96
122
  /**
97
123
  * Starts a broker on an ephemeral loopback port.
98
124
  * @param {{connections: Record<string, object>}} args - Parent-owned physical connections.
@@ -130,15 +156,20 @@ export default class SharedTransactionBroker extends EventEmitter {
130
156
  async handleRequest(socket, serialized) {
131
157
  let requestId = 0;
132
158
  try {
133
- const request = /** @type {{requestId: number, capability: string, databaseIdentifier: string, method: string, args: import("./shared-transaction-codec.js").EncodedBrokerValue}} */ (JSON.parse(serialized));
159
+ const request = /** @type {{requestId: number, capability: string, databaseIdentifier: string, reuseKey?: string, method: string, args: import("./shared-transaction-codec.js").EncodedBrokerValue}} */ (JSON.parse(serialized));
134
160
  requestId = request.requestId;
135
161
  if (!this.accepting)
136
162
  throw new Error("Shared transaction broker capability has been revoked");
137
163
  if (!capabilityMatches(request.capability, this.secret))
138
164
  throw new Error("Unknown shared transaction broker capability");
139
- const connection = this.connections[request.databaseIdentifier];
140
- if (!connection)
165
+ const connection = request.reuseKey
166
+ ? this.physicalConnections.get(`${request.databaseIdentifier}\0${request.reuseKey}`)
167
+ : this.connections[request.databaseIdentifier];
168
+ if (!connection) {
169
+ if (request.reuseKey)
170
+ throw new Error(`Unenrolled physical connection identity: ${request.databaseIdentifier}`);
141
171
  throw new Error(`Unknown shared transaction database identifier: ${request.databaseIdentifier}`);
172
+ }
142
173
  if (!ALLOWED_METHODS.has(request.method))
143
174
  throw new Error(`Unsupported shared transaction broker method: ${request.method}`);
144
175
  const args = decodeBrokerValue(request.args);
@@ -146,8 +177,6 @@ export default class SharedTransactionBroker extends EventEmitter {
146
177
  throw new TypeError("Shared transaction broker arguments must be an array");
147
178
  this.emit("work-queued", { connection, databaseIdentifier: request.databaseIdentifier, method: request.method });
148
179
  const result = await this.runConnectionRequest({ connection, method: request.method, savePointName: typeof args[0] === "string" ? args[0] : undefined, socket }, async () => {
149
- if (!this.accepting)
150
- throw new Error("Shared transaction broker capability has been revoked");
151
180
  if (request.method === "rootTransactionRollback") {
152
181
  await this.rollbackRootSavePoint(connection, /** @type {string} */ (args[0]));
153
182
  return undefined;
@@ -255,11 +284,13 @@ export default class SharedTransactionBroker extends EventEmitter {
255
284
  const held = new Promise((resolve) => { release = resolve; });
256
285
  state.queue = previous.then(async () => {
257
286
  try {
258
- if (!this.accepting || socket.readyState !== socket.OPEN)
287
+ if (socket.readyState !== socket.OPEN)
259
288
  throw new Error("Shared transaction broker root transaction session closed before lease acquisition");
260
289
  const result = await callback();
261
290
  state.lease = { operations: Promise.resolve(), release, savePointName, socket };
262
291
  resolveStarted(result);
292
+ if (!this.accepting)
293
+ await this.scheduleSessionCleanup(socket);
263
294
  await held;
264
295
  }
265
296
  catch (error) {
@@ -425,18 +456,30 @@ export default class SharedTransactionBroker extends EventEmitter {
425
456
  this.closePromise = this.closeTransport();
426
457
  return await this.closePromise;
427
458
  }
459
+ /** Revokes admission without interrupting already accepted work. */
460
+ revoke() {
461
+ if (!this.accepting)
462
+ return;
463
+ this.accepting = false;
464
+ this.secret = randomBytes(32).toString("base64url");
465
+ }
466
+ /** Drains all work accepted before capability revocation. */
467
+ async drain() {
468
+ if (this.accepting)
469
+ throw new Error("Shared transaction broker must be revoked before drain");
470
+ await Promise.all(Array.from(this.connectionStates.values()).map((state) => state.queue));
471
+ }
428
472
  /**
429
473
  * Performs deterministic transport shutdown and reports cleanup failures last.
430
474
  * @returns {Promise<void>} - Resolves after shutdown or rejects with cleanup errors.
431
475
  */
432
476
  async closeTransport() {
433
- this.accepting = false;
434
- this.secret = randomBytes(32).toString("base64url");
477
+ this.revoke();
435
478
  const closingSessions = Array.from(this.sessions);
436
479
  await Promise.all(closingSessions.map(async (socket) => await this.scheduleSessionCleanup(socket)));
480
+ await this.drain();
437
481
  for (const socket of closingSessions)
438
482
  socket.close(1001, "Shared transaction broker closed");
439
- await Promise.allSettled(Array.from(this.connectionStates.values()).map((state) => state.queue));
440
483
  await new Promise((resolve) => this.websocketServer.close(() => resolve(undefined)));
441
484
  await new Promise((resolve) => this.httpServer.close(() => resolve(undefined)));
442
485
  await Promise.all(Array.from(this.sessionCleanup.values()));
@@ -448,4 +491,4 @@ export default class SharedTransactionBroker extends EventEmitter {
448
491
  }
449
492
  }
450
493
  }
451
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLXRyYW5zYWN0aW9uLWJyb2tlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL3NoYXJlZC10cmFuc2FjdGlvbi1icm9rZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDeEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUMxQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sSUFBSSxDQUFBO0FBQ3BDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFBO0FBQ3BGLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSwrQkFBK0IsRUFBRSxNQUFNLGdEQUFnRCxDQUFBO0FBRW5JLG9OQUFvTjtBQUVwTixNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUM5QixPQUFPO0lBQ1AsY0FBYztJQUNkLGNBQWM7SUFDZCxxQkFBcUI7SUFDckIseUJBQXlCO0lBQ3pCLDBCQUEwQjtJQUMxQiw0QkFBNEI7SUFDNUIsZ0JBQWdCO0lBQ2hCLGtCQUFrQjtJQUNsQixtQkFBbUI7SUFDbkIsMEJBQTBCO0lBQzFCLHNCQUFzQjtJQUN0Qix3QkFBd0I7SUFDeEIseUJBQXlCO0NBQzFCLENBQUMsQ0FBQTtBQUVGOzs7OztHQUtHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsUUFBUTtJQUMzQyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQzNDLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDM0MsT0FBTyxhQUFhLENBQUMsTUFBTSxLQUFLLGFBQWEsQ0FBQyxNQUFNLElB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LElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLDZDQUE2QyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDMUosQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgeyByYW5kb21CeXRlcywgdGltaW5nU2FmZUVxdWFsIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCJcbmltcG9ydCB7IGNyZWF0ZVNlcnZlciB9IGZyb20gXCJub2RlOmh0dHBcIlxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSBcIm5vZGU6ZXZlbnRzXCJcbmltcG9ydCB7IFdlYlNvY2tldFNlcnZlciB9IGZyb20gXCJ3c1wiXG5pbXBvcnQgeyBkZWNvZGVCcm9rZXJWYWx1ZSwgZW5jb2RlQnJva2VyVmFsdWUgfSBmcm9tIFwiLi9zaGFyZWQtdHJhbnNhY3Rpb24tY29kZWMuanNcIlxuaW1wb3J0IHsgY2xlYXJTaGFyZWRUcmFuc2FjdGlvbkNvb3JkaW5hdG9yLCBzZXRTaGFyZWRUcmFuc2FjdGlvbkNvb3JkaW5hdG9yIH0gZnJvbSBcIi4vc2hhcmVkLXRyYW5zYWN0aW9uLWNvbm5lY3Rpb24tY29vcmRpbmF0b3IuanNcIlxuXG4vKiogQHR5cGVkZWYge3txdWV1ZTogUHJvbWlzZTx2b2lkPiwgcm9vdFNlc3Npb25zOiBTZXQ8aW1wb3J0KFwid3NcIikuV2ViU29ja2V0PiwgbGVhc2U/OiB7b3BlcmF0aW9uczogUHJvbWlzZTx2b2lkPiwgcmVsZWFzZTogKCkgPT4gdm9pZCwgc2F2ZVBvaW50TmFtZTogc3RyaW5nLCBzb2NrZXQ6IGltcG9ydChcIndzXCIpLldlYlNvY2tldH19fSBDb25uZWN0aW9uU3RhdGUgKi9cblxuY29uc3QgQUxMT1dFRF9NRVRIT0RTID0gbmV3IFNldChbXG4gIFwicXVlcnlcIixcbiAgXCJhZmZlY3RlZFJvd3NcIixcbiAgXCJfcXVlcnlBY3R1YWxcIixcbiAgXCJfYWZmZWN0ZWRSb3dzQWN0dWFsXCIsXG4gIFwiX3N0YXJ0VHJhbnNhY3Rpb25BY3Rpb25cIixcbiAgXCJfY29tbWl0VHJhbnNhY3Rpb25BY3Rpb25cIixcbiAgXCJfcm9sbGJhY2tUcmFuc2FjdGlvbkFjdGlvblwiLFxuICBcInN0YXJ0U2F2ZVBvaW50XCIsXG4gIFwicmVsZWFzZVNhdmVQb2ludFwiLFxuICBcInJvbGxiYWNrU2F2ZVBvaW50XCIsXG4gIFwiZ2V0Q29ubmVjdGlvblNjb3BlZFZhbHVlXCIsXG4gIFwicm9vdFRyYW5zYWN0aW9uU3RhcnRcIixcbiAgXCJyb290VHJhbnNhY3Rpb25SZWxlYXNlXCIsXG4gIFwicm9vdFRyYW5zYWN0aW9uUm9sbGJhY2tcIlxuXSlcblxuLyoqXG4gKiBDb21wYXJlcyBhIHByZXNlbnRlZCBjYXBhYmlsaXR5IHdpdGhvdXQgbGVha2luZyBtYXRjaGluZyBwcmVmaXggdGltaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVkIC0gUHJlc2VudGVkIGNhcGFiaWxpdHkuXG4gKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWQgLSBBY3RpdmUgY2FwYWJpbGl0eS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGNhcGFiaWxpdGllcyBtYXRjaC5cbiAqL1xuZnVuY3Rpb24gY2FwYWJpbGl0eU1hdGNoZXMocHJvdmlkZWQsIGV4cGVjdGVkKSB7XG4gIGNvbnN0IHByb3ZpZGVkQnl0ZXMgPSBCdWZmZXIuZnJvbShwcm92aWRlZClcbiAgY29uc3QgZXhwZWN0ZWRCeXRlcyA9IEJ1ZmZlci5mcm9tKGV4cGVjdGVkKVxuICByZXR1cm4gcHJvdmlkZWRCeXRlcy5sZW5ndGggPT09IGV4cGVjdGVkQnl0ZXMubGVuZ3RoICYmIHRpbWluZ1NhZmVFcXVhbChwcm92aWRlZEJ5dGVzLCBleHBlY3RlZEJ5dGVzKVxufVxuXG4vKipcbiAqIEFkZHMgYnJva2VyIG93bmVyc2hpcCB0byBkZWNvZGVkIGRyaXZlciBvcHRpb25zLlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gdmFsdWUgLSBEZWNvZGVkIG9wdGlvbnMuXG4gKiBAcGFyYW0ge3N5bWJvbH0gb3BlcmF0aW9uT3duZXIgLSBCcm9rZXIgY29vcmRpbmF0b3Igb3duZXIuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+ICYge29wZXJhdGlvbk93bmVyOiBzeW1ib2x9fSAtIE93bmVkIG9wdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIG93bmVkT3BlcmF0aW9uT3B0aW9ucyh2YWx1ZSwgb3BlcmF0aW9uT3duZXIpIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB7b3BlcmF0aW9uT3duZXJ9XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlNoYXJlZCB0cmFuc2FjdGlvbiBicm9rZXIgZHJpdmVyIG9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3RcIilcbiAgfVxuXG4gIGNvbnN0IG9wdGlvbnMgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gKHZhbHVlKVxuXG4gIHJldHVybiB7Li4ub3B0aW9ucywgb3BlcmF0aW9uT3duZXJ9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoYXJlZFRyYW5zYWN0aW9uQnJva2VyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBicm9rZXIgYXJvdW5kIHBhcmVudC1vd25lZCBwaHlzaWNhbCBjb25uZWN0aW9ucy5cbiAgICogQHBhcmFtIHt7Y29ubmVjdGlvbnM6IFJlY29yZDxzdHJpbmcsIG9iamVjdD59fSBhcmdzIC0gUGFyZW50LW93bmVkIHBoeXNpY2FsIGNvbm5lY3Rpb25zLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2Nvbm5lY3Rpb25zfSkge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gY29ubmVjdGlvbnNcbiAgICB0aGlzLnNlY3JldCA9IHJhbmRvbUJ5dGVzKDMyKS50b1N0cmluZyhcImJhc2U2NHVybFwiKVxuICAgIHRoaXMuYWNjZXB0aW5nID0gdHJ1ZVxuICAgIC8qKiBAdHlwZSB7TWFwPG9iamVjdCwgQ29ubmVjdGlvblN0YXRlPn0gKi9cbiAgICB0aGlzLmNvbm5lY3Rpb25TdGF0ZXMgPSBuZXcgTWFwKClcbiAgICAvKiogQHR5cGUge1NldDxpbXBvcnQoXCJ3c1wiKS5XZWJTb2NrZXQ+fSAqL1xuICAgIHRoaXMuc2Vzc2lvbnMgPSBuZXcgU2V0KClcbiAgICAvKiogQHR5cGUge01hcDxpbXBvcnQoXCJ3c1wiKS5XZWJTb2NrZXQsIFByb21pc2U8dm9pZD4+fSAqL1xuICAgIHRoaXMuc2Vzc2lvbkNsZWFudXAgPSBuZXcgTWFwKClcbiAgICAvKiogQHR5cGUge0FycmF5PEVycm9yPn0gKi9cbiAgICB0aGlzLmNsZWFudXBFcnJvcnMgPSBbXVxuICAgIC8qKiBAdHlwZSB7UHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZH0gKi9cbiAgICB0aGlzLmNsb3NlUHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgIC8qKiBAdHlwZSB7TWFwPG9iamVjdCwgKGNhbGxiYWNrOiAoKSA9PiBQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PikgPT4gUHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fSAqL1xuICAgIHRoaXMuY29ubmVjdGlvbkNvb3JkaW5hdG9ycyA9IG5ldyBNYXAoKVxuICAgIC8qKiBAdHlwZSB7TWFwPG9iamVjdCwgc3ltYm9sPn0gKi9cbiAgICB0aGlzLmNvbm5lY3Rpb25Db29yZGluYXRvck93bmVycyA9IG5ldyBNYXAoKVxuICAgIGZvciAoY29uc3QgY29ubmVjdGlvbiBvZiBuZXcgU2V0KE9iamVjdC52YWx1ZXMoY29ubmVjdGlvbnMpKSkge1xuICAgICAgLyoqXG4gICAgICAgKiBTZXJpYWxpemVzIHBhcmVudCBvcGVyYXRpb25zIHdpdGggY2hpbGQgYnJva2VyIHRyYWZmaWMuXG4gICAgICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8dW5rbm93bj59IGNhbGxiYWNrIC0gUGFyZW50IG9wZXJhdGlvbi5cbiAgICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHVua25vd24+fSAtIE9wZXJhdGlvbiByZXN1bHQuXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGNvb3JkaW5hdG9yID0gYXN5bmMgKGNhbGxiYWNrKSA9PiBhd2FpdCB0aGlzLnNlcmlhbGl6ZSh0aGlzLmNvbm5lY3Rpb25TdGF0ZShjb25uZWN0aW9uKSwgY2FsbGJhY2spXG4gICAgICB0aGlzLmNvbm5lY3Rpb25Db29yZGluYXRvcnMuc2V0KGNvbm5lY3Rpb24sIGNvb3JkaW5hdG9yKVxuICAgICAgdGhpcy5jb25uZWN0aW9uQ29vcmRpbmF0b3JPd25lcnMuc2V0KGNvbm5lY3Rpb24sIHNldFNoYXJlZFRyYW5zYWN0aW9uQ29vcmRpbmF0b3IoY29ubmVjdGlvbiwgY29vcmRpbmF0b3IpKVxuICAgIH1cbiAgICB0aGlzLmh0dHBTZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoKVxuICAgIHRoaXMud2Vic29ja2V0U2VydmVyID0gbmV3IFdlYlNvY2tldFNlcnZlcih7c2VydmVyOiB0aGlzLmh0dHBTZXJ2ZXIsIG1heFBheWxvYWQ6IDE2ICogMTAyNCAqIDEwMjR9KVxuICAgIHRoaXMud2Vic29ja2V0U2VydmVyLm9uKFwiY29ubmVjdGlvblwiLCAoc29ja2V0KSA9PiB7XG4gICAgICB0aGlzLnNlc3Npb25zLmFkZChzb2NrZXQpXG4gICAgICBzb2NrZXQub25jZShcImNsb3NlXCIsICgpID0+IHtcbiAgICAgICAgdGhpcy5zZXNzaW9ucy5kZWxldGUoc29ja2V0KVxuICAgICAgICB0aGlzLnNjaGVkdWxlU2Vzc2lvbkNsZWFudXAoc29ja2V0KVxuICAgICAgfSlcbiAgICAgIHNvY2tldC5vbihcIm1lc3NhZ2VcIiwgKGRhdGEpID0+IHZvaWQgdGhpcy5oYW5kbGVSZXF1ZXN0KHNvY2tldCwgYCR7ZGF0YX1gKSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyBhIGJyb2tlciBvbiBhbiBlcGhlbWVyYWwgbG9vcGJhY2sgcG9ydC5cbiAgICogQHBhcmFtIHt7Y29ubmVjdGlvbnM6IFJlY29yZDxzdHJpbmcsIG9iamVjdD59fSBhcmdzIC0gUGFyZW50LW93bmVkIHBoeXNpY2FsIGNvbm5lY3Rpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTaGFyZWRUcmFuc2FjdGlvbkJyb2tlcj59IC0gTGlzdGVuaW5nIGJyb2tlci5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBzdGFydChhcmdzKSB7XG4gICAgY29uc3QgYnJva2VyID0gbmV3IFNoYXJlZFRyYW5zYWN0aW9uQnJva2VyKGFyZ3MpXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgYnJva2VyLmh0dHBTZXJ2ZXIub25jZShcImVycm9yXCIsIHJlamVjdClcbiAgICAgIGJyb2tlci5odHRwU2VydmVyLmxpc3Rlbih7aG9zdDogXCIxMjcuMC4wLjFcIiwgcG9ydDogMH0sICgpID0+IHJlc29sdmUodW5kZWZpbmVkKSlcbiAgICB9KVxuICAgIHJldHVybiBicm9rZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsb29wYmFjayB3ZWJzb2NrZXQgYWRkcmVzcy5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBMb29wYmFjayB3ZWJzb2NrZXQgYWRkcmVzcy5cbiAgICovXG4gIGFkZHJlc3MoKSB7XG4gICAgY29uc3QgYWRkcmVzcyA9IHRoaXMuaHR0cFNlcnZlci5hZGRyZXNzKClcbiAgICBpZiAoIWFkZHJlc3MgfHwgdHlwZW9mIGFkZHJlc3MgPT09IFwic3RyaW5nXCIpIHRocm93IG5ldyBFcnJvcihcIlNoYXJlZCB0cmFuc2FjdGlvbiBicm9rZXIgaXMgbm90IGxpc3RlbmluZ1wiKVxuICAgIHJldHVybiBgd3M6Ly8xMjcuMC4wLjE6JHthZGRyZXNzLnBvcnR9YFxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHBlci1hdHRlbXB0IHVuZ3Vlc3NhYmxlIGNhcGFiaWxpdHkuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gUGVyLWF0dGVtcHQgdW5ndWVzc2FibGUgY2FwYWJpbGl0eS5cbiAgICovXG4gIGNhcGFiaWxpdHkoKSB7IHJldHVybiB0aGlzLnNlY3JldCB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhbmQgaGFuZGxlcyBvbmUgcmVxdWVzdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCJ3c1wiKS5XZWJTb2NrZXR9IHNvY2tldCAtIENhbGxpbmcgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlcmlhbGl6ZWQgLSBSZXF1ZXN0IEpTT04uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIHJlc3BvbmRpbmcuXG4gICAqL1xuICBhc3luYyBoYW5kbGVSZXF1ZXN0KHNvY2tldCwgc2VyaWFsaXplZCkge1xuICAgIGxldCByZXF1ZXN0SWQgPSAwXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSAvKiogQHR5cGUge3tyZXF1ZXN0SWQ6IG51bWJlciwgY2FwYWJpbGl0eTogc3RyaW5nLCBkYXRhYmFzZUlkZW50aWZpZXI6IHN0cmluZywgbWV0aG9kOiBzdHJpbmcsIGFyZ3M6IGltcG9ydChcIi4vc2hhcmVkLXRyYW5zYWN0aW9uLWNvZGVjLmpzXCIpLkVuY29kZWRCcm9rZXJWYWx1ZX19ICovIChKU09OLnBhcnNlKHNlcmlhbGl6ZWQpKVxuICAgICAgcmVxdWVzdElkID0gcmVxdWVzdC5yZXF1ZXN0SWRcbiAgICAgIGlmICghdGhpcy5hY2NlcHRpbmcpIHRocm93IG5ldyBFcnJvcihcIlNoYXJlZCB0cmFuc2FjdGlvbiBicm9rZXIgY2FwYWJpbGl0eSBoYXMgYmVlbiByZXZva2VkXCIpXG4gICAgICBpZiAoIWNhcGFiaWxpdHlNYXRjaGVzKHJlcXVlc3QuY2FwYWJpbGl0eSwgdGhpcy5zZWNyZXQpKSB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHNoYXJlZCB0cmFuc2FjdGlvbiBicm9rZXIgY2FwYWJpbGl0eVwiKVxuICAgICAgY29uc3QgY29ubmVjdGlvbiA9IHRoaXMuY29ubmVjdGlvbnNbcmVxdWVzdC5kYXRhYmFzZUlkZW50aWZpZXJdXG4gICAgICBpZiAoIWNvbm5lY3Rpb24pIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzaGFyZWQgdHJhbnNhY3Rpb24gZGF0YWJhc2UgaWRlbnRpZmllcjogJHtyZXF1ZXN0LmRhdGFiYXNlSWRlbnRpZmllcn1gKVxuICAgICAgaWYgKCFBTExPV0VEX01FVEhPRFMuaGFzKHJlcXVlc3QubWV0aG9kKSkgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBzaGFyZWQgdHJhbnNhY3Rpb24gYnJva2VyIG1ldGhvZDogJHtyZXF1ZXN0Lm1ldGhvZH1gKVxuICAgICAgY29uc3QgYXJncyA9IGRlY29kZUJyb2tlclZhbHVlKHJlcXVlc3QuYXJncylcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShhcmdzKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlNoYXJlZCB0cmFuc2FjdGlvbiBicm9rZXIgYXJndW1lbnRzIG11c3QgYmUgYW4gYXJyYXlcIilcbiAgICAgIHRoaXMuZW1pdChcIndvcmstcXVldWVkXCIsIHtjb25uZWN0aW9uLCBkYXRhYmFzZUlkZW50aWZpZXI6IHJlcXVlc3QuZGF0YWJhc2VJZGVudGlmaWVyLCBtZXRob2Q6IHJlcXVlc3QubWV0aG9kfSlcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuQ29ubmVjdGlvblJlcXVlc3Qoe2Nvbm5lY3Rpb24sIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsIHNhdmVQb2ludE5hbWU6IHR5cGVvZiBhcmdzWzBdID09PSBcInN0cmluZ1wiID8gYXJnc1swXSA6IHVuZGVmaW5lZCwgc29ja2V0fSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuYWNjZXB0aW5nKSB0aHJvdyBuZXcgRXJyb3IoXCJTaGFyZWQgdHJhbnNhY3Rpb24gYnJva2VyIGNhcGFiaWxpdHkgaGFzIGJlZW4gcmV2b2tlZFwiKVxuICAgICAgICBpZiAocmVxdWVzdC5tZXRob2QgPT09IFwicm9vdFRyYW5zYWN0aW9uUm9sbGJhY2tcIikge1xuICAgICAgICAgIGF3YWl0IHRoaXMucm9sbGJhY2tSb290U2F2ZVBvaW50KGNvbm5lY3Rpb24sIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoYXJnc1swXSkpXG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBoeXNpY2FsTWV0aG9kID0gcmVxdWVzdC5tZXRob2QgPT09IFwicm9vdFRyYW5zYWN0aW9uU3RhcnRcIlxuICAgICAgICAgID8gXCJzdGFydFNhdmVQb2ludFwiXG4gICAgICAgICAgOiByZXF1ZXN0Lm1ldGhvZCA9PT0gXCJyb290VHJhbnNhY3Rpb25SZWxlYXNlXCJcbiAgICAgICAgICAgID8gXCJyZWxlYXNlU2F2ZVBvaW50XCJcbiAgICAgICAgICAgIDogcmVxdWVzdC5tZXRob2QgPT09IFwicm9vdFRyYW5zYWN0aW9uUm9sbGJhY2tcIlxuICAgICAgICAgICAgICA/IFwicm9sbGJhY2tTYXZlUG9pbnRcIlxuICAgICAgICAgICAgICA6IHJlcXVlc3QubWV0aG9kXG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb25NZXRob2RzID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCAoLi4ubWV0aG9kQXJnczogQXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4gfCB7b3BlcmF0aW9uT3duZXI6IHN5bWJvbH0+KSA9PiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovIChjb25uZWN0aW9uKVxuICAgICAgICBjb25zdCBtZXRob2QgPSBjb25uZWN0aW9uTWV0aG9kc1twaHlzaWNhbE1ldGhvZF1cbiAgICAgICAgaWYgKHR5cGVvZiBtZXRob2QgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yKGBDb25uZWN0aW9uIGRvZXMgbm90IHN1cHBvcnQgc2hhcmVkIHRyYW5zYWN0aW9uIG1ldGhvZDogJHtyZXF1ZXN0Lm1ldGhvZH1gKVxuICAgICAgICByZXR1cm4gYXdhaXQgbWV0aG9kLmFwcGx5KGNvbm5lY3Rpb24sIHRoaXMub3duZWRNZXRob2RBcmdzKHthcmdzLCBjb25uZWN0aW9uLCBtZXRob2Q6IHBoeXNpY2FsTWV0aG9kfSkpXG4gICAgICB9KVxuICAgICAgaWYgKHNvY2tldC5yZWFkeVN0YXRlID09PSBzb2NrZXQuT1BFTikgc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe3JlcXVlc3RJZCwgcmVzdWx0OiBlbmNvZGVCcm9rZXJWYWx1ZShyZXN1bHQpfSkpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSlcbiAgICAgIGlmIChzb2NrZXQucmVhZHlTdGF0ZSA9PT0gc29ja2V0Lk9QRU4pIHNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtyZXF1ZXN0SWQsIGVycm9yOiBlbmNvZGVCcm9rZXJWYWx1ZShub3JtYWxpemVkKX0pKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRoZSBicm9rZXIgb3duZXIgdG8gcHVibGljIGRyaXZlciBtZXRob2RzIHRoYXQgcmUtZW50ZXIgY29vcmRpbmF0ZWQgcXVlcnkgd29yay5cbiAgICogQHBhcmFtIHt7YXJnczogQXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBjb25uZWN0aW9uOiBvYmplY3QsIG1ldGhvZDogc3RyaW5nfX0gYXJncyAtIFBoeXNpY2FsIGludm9jYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiB8IHtvcGVyYXRpb25Pd25lcjogc3ltYm9sfT59IC0gT3duZWQgbWV0aG9kIGFyZ3VtZW50cy5cbiAgICovXG4gIG93bmVkTWV0aG9kQXJncyh7YXJncywgY29ubmVjdGlvbiwgbWV0aG9kfSkge1xuICAgIGNvbnN0IG9wZXJhdGlvbk93bmVyID0gdGhpcy5jb25uZWN0aW9uQ29vcmRpbmF0b3JPd25lcnMuZ2V0KGNvbm5lY3Rpb24pXG5cbiAgICBpZiAoIW9wZXJhdGlvbk93bmVyKSB0aHJvdyBuZXcgRXJyb3IoXCJTaGFyZWQgdHJhbnNhY3Rpb24gYnJva2VyIGNvbm5lY3Rpb24gb3duZXIgaXMgbWlzc2luZ1wiKVxuICAgIGlmIChbXCJfc3RhcnRUcmFuc2FjdGlvbkFjdGlvblwiLCBcIl9jb21taXRUcmFuc2FjdGlvbkFjdGlvblwiLCBcIl9yb2xsYmFja1RyYW5zYWN0aW9uQWN0aW9uXCJdLmluY2x1ZGVzKG1ldGhvZCkpIHtcbiAgICAgIHJldHVybiBbb3duZWRPcGVyYXRpb25PcHRpb25zKGFyZ3NbMF0sIG9wZXJhdGlvbk93bmVyKV1cbiAgICB9XG4gICAgaWYgKFtcInF1ZXJ5XCIsIFwiYWZmZWN0ZWRSb3dzXCIsIFwic3RhcnRTYXZlUG9pbnRcIiwgXCJyZWxlYXNlU2F2ZVBvaW50XCIsIFwicm9sbGJhY2tTYXZlUG9pbnRcIl0uaW5jbHVkZXMobWV0aG9kKSkge1xuICAgICAgcmV0dXJuIFthcmdzWzBdLCBvd25lZE9wZXJhdGlvbk9wdGlvbnMoYXJnc1sxXSwgb3BlcmF0aW9uT3duZXIpXVxuICAgIH1cblxuICAgIHJldHVybiBhcmdzXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBtdXRhYmxlIHNlcmlhbGl6YXRpb24gc3RhdGUgZm9yIG9uZSBwaHlzaWNhbCBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29ubmVjdGlvbiAtIFBoeXNpY2FsIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtDb25uZWN0aW9uU3RhdGV9IC0gQ29ubmVjdGlvbiBzdGF0ZS5cbiAgICovXG4gIGNvbm5lY3Rpb25TdGF0ZShjb25uZWN0aW9uKSB7XG4gICAgbGV0IHN0YXRlID0gdGhpcy5jb25uZWN0aW9uU3RhdGVzLmdldChjb25uZWN0aW9uKVxuICAgIGlmICghc3RhdGUpIHtcbiAgICAgIHN0YXRlID0ge3F1ZXVlOiBQcm9taXNlLnJlc29sdmUoKSwgcm9vdFNlc3Npb25zOiBuZXcgU2V0KCl9XG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0ZXMuc2V0KGNvbm5lY3Rpb24sIHN0YXRlKVxuICAgIH1cbiAgICByZXR1cm4gc3RhdGVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgdmFsaWRhdGVkIHJlcXVlc3Qgd2l0aCByb290IHRyYW5zYWN0aW9uIGxlYXNlIHNlbWFudGljcy5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHt7Y29ubmVjdGlvbjogb2JqZWN0LCBtZXRob2Q6IHN0cmluZywgc2F2ZVBvaW50TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBzb2NrZXQ6IGltcG9ydChcIndzXCIpLldlYlNvY2tldH19IGFyZ3MgLSBSZXF1ZXN0IGlkZW50aXR5LlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gUGh5c2ljYWwgb3BlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBPcGVyYXRpb24gcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgcnVuQ29ubmVjdGlvblJlcXVlc3Qoe2Nvbm5lY3Rpb24sIG1ldGhvZCwgc2F2ZVBvaW50TmFtZSwgc29ja2V0fSwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuY29ubmVjdGlvblN0YXRlKGNvbm5lY3Rpb24pXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJyb290VHJhbnNhY3Rpb25TdGFydFwiKSB7XG4gICAgICBpZiAoIXNhdmVQb2ludE5hbWUpIHRocm93IG5ldyBFcnJvcihcIlNoYXJlZCB0cmFuc2FjdGlvbiBicm9rZXIgcm9vdCB0cmFuc2FjdGlvbiByZXF1aXJlcyBhIHNhdmVwb2ludCBuYW1lXCIpXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zdGFydFJvb3RMZWFzZSh7Y2FsbGJhY2ssIHNhdmVQb2ludE5hbWUsIHN0YXRlLCBzb2NrZXR9KVxuICAgIH1cbiAgICBpZiAobWV0aG9kID09PSBcInJvb3RUcmFuc2FjdGlvblJlbGVhc2VcIiB8fCBtZXRob2QgPT09IFwicm9vdFRyYW5zYWN0aW9uUm9sbGJhY2tcIikge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluaXNoUm9vdExlYXNlKHtjYWxsYmFjaywgc2F2ZVBvaW50TmFtZSwgc3RhdGUsIHNvY2tldH0pXG4gICAgfVxuICAgIGlmIChzdGF0ZS5sZWFzZT8uc29ja2V0ID09PSBzb2NrZXQpIHJldHVybiBhd2FpdCB0aGlzLnNlcmlhbGl6ZUxlYXNlKHN0YXRlLmxlYXNlLCBjYWxsYmFjaylcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXJpYWxpemUoc3RhdGUsIGNhbGxiYWNrKVxuICB9XG5cbiAgLyoqXG4gICAqIEFjcXVpcmVzIHRoZSBGSUZPIHBoeXNpY2FsIGNvbm5lY3Rpb24gbGVhc2UgYW5kIGhvbGRzIHRoZSBxdWV1ZSB1bnRpbCBlbmQuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7e2NhbGxiYWNrOiAoKSA9PiBQcm9taXNlPFQ+LCBzYXZlUG9pbnROYW1lOiBzdHJpbmcsIHN0YXRlOiBDb25uZWN0aW9uU3RhdGUsIHNvY2tldDogaW1wb3J0KFwid3NcIikuV2ViU29ja2V0fX0gYXJncyAtIExlYXNlIHJlcXVlc3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIFJvb3Qgc2F2ZXBvaW50IHN0YXJ0IHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHN0YXJ0Um9vdExlYXNlKHtjYWxsYmFjaywgc2F2ZVBvaW50TmFtZSwgc3RhdGUsIHNvY2tldH0pIHtcbiAgICBpZiAoc3RhdGUucm9vdFNlc3Npb25zLmhhcyhzb2NrZXQpKSB0aHJvdyBuZXcgRXJyb3IoXCJTaGFyZWQgdHJhbnNhY3Rpb24gYnJva2VyIHJvb3QgdHJhbnNhY3Rpb24gaXMgYWxyZWFkeSBhY3RpdmUgZm9yIHRoaXMgc2Vzc2lvblwiKVxuICAgIHN0YXRlLnJvb3RTZXNzaW9ucy5hZGQoc29ja2V0KVxuICAgIGNvbnN0IHByZXZpb3VzID0gc3RhdGUucXVldWVcbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyB0aGUgc3RhcnQgcmVzcG9uc2UuXG4gICAgICogQHR5cGUgeyh2YWx1ZTogVCkgPT4gdm9pZH1cbiAgICAgKi9cbiAgICBsZXQgcmVzb2x2ZVN0YXJ0ZWQgPSAoKSA9PiB7fVxuICAgIC8qKlxuICAgICAqIFJlamVjdHMgdGhlIHN0YXJ0IHJlc3BvbnNlLlxuICAgICAqIEB0eXBlIHsoZXJyb3I6IEVycm9yKSA9PiB2b2lkfVxuICAgICAqL1xuICAgIGxldCByZWplY3RTdGFydGVkID0gKCkgPT4ge31cbiAgICBjb25zdCBzdGFydGVkID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyByZXNvbHZlU3RhcnRlZCA9IHJlc29sdmU7IHJlamVjdFN0YXJ0ZWQgPSByZWplY3QgfSlcbiAgICAvKipcbiAgICAgKiBSZWxlYXNlcyB0aGUgaGVsZCBjb25uZWN0aW9uIHF1ZXVlLlxuICAgICAqIEB0eXBlIHsodmFsdWU/OiB2b2lkKSA9PiB2b2lkfVxuICAgICAqL1xuICAgIGxldCByZWxlYXNlID0gKCkgPT4ge31cbiAgICBjb25zdCBoZWxkID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsgcmVsZWFzZSA9IHJlc29sdmUgfSlcblxuICAgIHN0YXRlLnF1ZXVlID0gcHJldmlvdXMudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIXRoaXMuYWNjZXB0aW5nIHx8IHNvY2tldC5yZWFkeVN0YXRlICE9PSBzb2NrZXQuT1BFTikgdGhyb3cgbmV3IEVycm9yKFwiU2hhcmVkIHRyYW5zYWN0aW9uIGJyb2tlciByb290IHRyYW5zYWN0aW9uIHNlc3Npb24gY2xvc2VkIGJlZm9yZSBsZWFzZSBhY3F1aXNpdGlvblwiKVxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjYWxsYmFjaygpXG4gICAgICAgIHN0YXRlLmxlYXNlID0ge29wZXJhdGlvbnM6IFByb21pc2UucmVzb2x2ZSgpLCByZWxlYXNlLCBzYXZlUG9pbnROYW1lLCBzb2NrZXR9XG4gICAgICAgIHJlc29sdmVTdGFydGVkKHJlc3VsdClcbiAgICAgICAgYXdhaXQgaGVsZFxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgc3RhdGUucm9vdFNlc3Npb25zLmRlbGV0ZShzb2NrZXQpXG4gICAgICAgIHJlamVjdFN0YXJ0ZWQoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIGF3YWl0IHN0YXJ0ZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5pc2hlcyB0aGUgY2FsbGluZyBzZXNzaW9uJ3Mgcm9vdCBsZWFzZS5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHt7Y2FsbGJhY2s6ICgpID0+IFByb21pc2U8VD4sIHNhdmVQb2ludE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgc3RhdGU6IENvbm5lY3Rpb25TdGF0ZSwgc29ja2V0OiBpbXBvcnQoXCJ3c1wiKS5XZWJTb2NrZXR9fSBhcmdzIC0gTGVhc2UgZW5kIHJlcXVlc3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIFNhdmVwb2ludCBlbmQgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgZmluaXNoUm9vdExlYXNlKHtjYWxsYmFjaywgc2F2ZVBvaW50TmFtZSwgc3RhdGUsIHNvY2tldH0pIHtcbiAgICBjb25zdCBsZWFzZSA9IHN0YXRlLmxlYXNlXG4gICAgaWYgKCFsZWFzZSB8fCBsZWFzZS5zb2NrZXQgIT09IHNvY2tldCkgdGhyb3cgbmV3IEVycm9yKFwiU2hhcmVkIHRyYW5zYWN0aW9uIGJyb2tlciBzZXNzaW9uIGRvZXMgbm90IG93biB0aGUgcm9vdCB0cmFuc2FjdGlvbiBsZWFzZVwiKVxuICAgIGlmIChzYXZlUG9pbnROYW1lICE9PSBsZWFzZS5zYXZlUG9pbnROYW1lKSB0aHJvdyBuZXcgRXJyb3IoXCJTaGFyZWQgdHJhbnNhY3Rpb24gYnJva2VyIHJvb3QgdHJhbnNhY3Rpb24gc2F2ZXBvaW50IGRvZXMgbm90IG1hdGNoIGl0cyBsZWFzZVwiKVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXJpYWxpemVMZWFzZShsZWFzZSwgY2FsbGJhY2spXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHN0YXRlLmxlYXNlID0gdW5kZWZpbmVkXG4gICAgICBzdGF0ZS5yb290U2Vzc2lvbnMuZGVsZXRlKHNvY2tldClcbiAgICAgIGxlYXNlLnJlbGVhc2UoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIG9wZXJhdGlvbnMgYmVsb25naW5nIHRvIHRoZSBhY3RpdmUgbGVhc2UgaG9sZGVyLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge3tvcGVyYXRpb25zOiBQcm9taXNlPHZvaWQ+fX0gbGVhc2UgLSBBY3RpdmUgbGVhc2UuXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBPcGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIFJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHNlcmlhbGl6ZUxlYXNlKGxlYXNlLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHByZXZpb3VzID0gbGVhc2Uub3BlcmF0aW9uc1xuICAgIC8qKlxuICAgICAqIFJlbGVhc2VzIHRoZSBob2xkZXIgb3BlcmF0aW9uIHF1ZXVlLlxuICAgICAqIEB0eXBlIHsodmFsdWU/OiB2b2lkKSA9PiB2b2lkfVxuICAgICAqL1xuICAgIGxldCByZWxlYXNlID0gKCkgPT4ge31cbiAgICBjb25zdCBjdXJyZW50ID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsgcmVsZWFzZSA9IHJlc29sdmUgfSlcbiAgICBsZWFzZS5vcGVyYXRpb25zID0gcHJldmlvdXMudGhlbigoKSA9PiBjdXJyZW50KVxuICAgIGF3YWl0IHByZXZpb3VzXG4gICAgdHJ5IHsgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKCkgfSBmaW5hbGx5IHsgcmVsZWFzZSgpIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSb2xscyBiYWNrIGxlYXNlcyBhYmFuZG9uZWQgYnkgYSBkaXNjb25uZWN0ZWQgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCJ3c1wiKS5XZWJTb2NrZXR9IHNvY2tldCAtIERpc2Nvbm5lY3RlZCBzZXNzaW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciBhbGwgb3duZWQgbGVhc2VzIHJlbGVhc2UuXG4gICAqL1xuICBhc3luYyByZWxlYXNlRGlzY29ubmVjdGVkTGVhc2VzKHNvY2tldCkge1xuICAgIC8qKiBAdHlwZSB7QXJyYXk8RXJyb3I+fSAqL1xuICAgIGNvbnN0IGVycm9ycyA9IFtdXG4gICAgZm9yIChjb25zdCBbY29ubmVjdGlvbiwgc3RhdGVdIG9mIHRoaXMuY29ubmVjdGlvblN0YXRlcykge1xuICAgICAgY29uc3QgbGVhc2UgPSBzdGF0ZS5sZWFzZVxuICAgICAgaWYgKCFsZWFzZSB8fCBsZWFzZS5zb2NrZXQgIT09IHNvY2tldCkgY29udGludWVcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2VyaWFsaXplTGVhc2UobGVhc2UsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJvbGxiYWNrUm9vdFNhdmVQb2ludChjb25uZWN0aW9uLCBsZWFzZS5zYXZlUG9pbnROYW1lKVxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc3RhdGUubGVhc2UgPSB1bmRlZmluZWRcbiAgICAgICAgc3RhdGUucm9vdFNlc3Npb25zLmRlbGV0ZShzb2NrZXQpXG4gICAgICAgIGxlYXNlLnJlbGVhc2UoKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBBZ2dyZWdhdGVFcnJvcihlcnJvcnMsIGBTaGFyZWQgdHJhbnNhY3Rpb24gYnJva2VyIGxlYXNlIGNsZWFudXAgZmFpbGVkOiAke2Vycm9ycy5tYXAoKGVycm9yKSA9PiBlcnJvci5tZXNzYWdlKS5qb2luKFwiOyBcIil9YClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJhY2tzIGRldGFjaGVkIHNvY2tldCBjbGVhbnVwIGFuZCByZWNvcmRzIGl0cyBmYWlsdXJlIGZvciBjbG9zZSgpLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIndzXCIpLldlYlNvY2tldH0gc29ja2V0IC0gQ2xvc2VkIHNlc3Npb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFNldHRsZWQgdHJhY2tlZCBjbGVhbnVwLlxuICAgKi9cbiAgc2NoZWR1bGVTZXNzaW9uQ2xlYW51cChzb2NrZXQpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuc2Vzc2lvbkNsZWFudXAuZ2V0KHNvY2tldClcbiAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZ1xuICAgIGNvbnN0IGNsZWFudXAgPSB0aGlzLnJlbGVhc2VEaXNjb25uZWN0ZWRMZWFzZXMoc29ja2V0KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLmNsZWFudXBFcnJvcnMucHVzaChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSkpXG4gICAgICB9KVxuICAgICAgLmZpbmFsbHkoKCkgPT4gdGhpcy5zZXNzaW9uQ2xlYW51cC5kZWxldGUoc29ja2V0KSlcbiAgICB0aGlzLnNlc3Npb25DbGVhbnVwLnNldChzb2NrZXQsIGNsZWFudXApXG4gICAgcmV0dXJuIGNsZWFudXBcbiAgfVxuXG4gIC8qKlxuICAgKiBSb2xscyBiYWNrIGFuZCByZW1vdmVzIGEgcm9vdCBzYXZlcG9pbnQgc28gaXQgY2Fubm90IHJlbWFpbiBiZW5lYXRoIHRoZSBuZXh0IGxlYXNlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29ubmVjdGlvbiAtIFBhcmVudCBwaHlzaWNhbCBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2F2ZVBvaW50TmFtZSAtIFJvb3Qgc2F2ZXBvaW50IG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIHJvbGxiYWNrIGFuZCByZWxlYXNlLlxuICAgKi9cbiAgYXN5bmMgcm9sbGJhY2tSb290U2F2ZVBvaW50KGNvbm5lY3Rpb24sIHNhdmVQb2ludE5hbWUpIHtcbiAgICBjb25zdCBtZXRob2RzID0gLyoqIEB0eXBlIHt7cmVsZWFzZVNhdmVQb2ludDogKG5hbWU6IHN0cmluZywgb3B0aW9ucz86IHtvcGVyYXRpb25Pd25lcj86IHN5bWJvbH0pID0+IFByb21pc2U8dm9pZD4sIHJvbGxiYWNrU2F2ZVBvaW50OiAobmFtZTogc3RyaW5nLCBvcHRpb25zPzoge29wZXJhdGlvbk93bmVyPzogc3ltYm9sfSkgPT4gUHJvbWlzZTx2b2lkPn19ICovIChjb25uZWN0aW9uKVxuICAgIGNvbnN0IG9wZXJhdGlvbk93bmVyID0gdGhpcy5jb25uZWN0aW9uQ29vcmRpbmF0b3JPd25lcnMuZ2V0KGNvbm5lY3Rpb24pXG5cbiAgICBpZiAoIW9wZXJhdGlvbk93bmVyKSB0aHJvdyBuZXcgRXJyb3IoXCJTaGFyZWQgdHJhbnNhY3Rpb24gYnJva2VyIGNvbm5lY3Rpb24gb3duZXIgaXMgbWlzc2luZ1wiKVxuICAgIC8qKiBAdHlwZSB7QXJyYXk8RXJyb3I+fSAqL1xuICAgIGNvbnN0IGVycm9ycyA9IFtdXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG1ldGhvZHMucm9sbGJhY2tTYXZlUG9pbnQoc2F2ZVBvaW50TmFtZSwge29wZXJhdGlvbk93bmVyfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZXJyb3JzLnB1c2goZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpKVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgbWV0aG9kcy5yZWxlYXNlU2F2ZVBvaW50KHNhdmVQb2ludE5hbWUsIHtvcGVyYXRpb25Pd25lcn0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGVycm9ycy5wdXNoKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSlcbiAgICB9XG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgQWdncmVnYXRlRXJyb3IoZXJyb3JzLCBgU2hhcmVkIHRyYW5zYWN0aW9uIGJyb2tlciBjb3VsZCBub3QgY2xlYW4gcm9vdCBzYXZlcG9pbnQgJHtzYXZlUG9pbnROYW1lfTogJHtlcnJvcnMubWFwKChlcnJvcikgPT4gZXJyb3IubWVzc2FnZSkuam9pbihcIjsgXCIpfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgb3JkaW5hcnkgbm9uLWhvbGRlciB3b3JrIHRocm91Z2ggdGhlIGNvbm5lY3Rpb24gRklGTy5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtDb25uZWN0aW9uU3RhdGV9IHN0YXRlIC0gQ29ubmVjdGlvbiBzdGF0ZS5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFQ+fSBjYWxsYmFjayAtIFdvcmsuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIFdvcmsgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgc2VyaWFsaXplKHN0YXRlLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHByZXZpb3VzID0gc3RhdGUucXVldWVcbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyB0aGUgY3VycmVudCBxdWV1ZSBlbnRyeS5cbiAgICAgKiBAdHlwZSB7KHZhbHVlPzogdm9pZCkgPT4gdm9pZH1cbiAgICAgKi9cbiAgICBsZXQgcmVsZWFzZSA9ICgpID0+IHt9XG4gICAgY29uc3QgY3VycmVudCA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7IHJlbGVhc2UgPSByZXNvbHZlIH0pXG4gICAgY29uc3QgcXVldWVkID0gcHJldmlvdXMudGhlbigoKSA9PiBjdXJyZW50KVxuICAgIHN0YXRlLnF1ZXVlID0gcXVldWVkXG4gICAgYXdhaXQgcHJldmlvdXNcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKClcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcmVsZWFzZSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIGFkbWlzc2lvbiwgcmV2b2tlcyBjYXBhYmlsaXR5LCByZWplY3RzIGNsaWVudHMsIGFuZCBkcmFpbnMgYWN0aXZlIHdvcmsuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIHRyYW5zcG9ydCBzaHV0ZG93bi5cbiAgICovXG4gIGFzeW5jIGNsb3NlKCkge1xuICAgIGlmICh0aGlzLmNsb3NlUHJvbWlzZSkgcmV0dXJuIGF3YWl0IHRoaXMuY2xvc2VQcm9taXNlXG4gICAgdGhpcy5jbG9zZVByb21pc2UgPSB0aGlzLmNsb3NlVHJhbnNwb3J0KClcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jbG9zZVByb21pc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBkZXRlcm1pbmlzdGljIHRyYW5zcG9ydCBzaHV0ZG93biBhbmQgcmVwb3J0cyBjbGVhbnVwIGZhaWx1cmVzIGxhc3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIHNodXRkb3duIG9yIHJlamVjdHMgd2l0aCBjbGVhbnVwIGVycm9ycy5cbiAgICovXG4gIGFzeW5jIGNsb3NlVHJhbnNwb3J0KCkge1xuICAgIHRoaXMuYWNjZXB0aW5nID0gZmFsc2VcbiAgICB0aGlzLnNlY3JldCA9IHJhbmRvbUJ5dGVzKDMyKS50b1N0cmluZyhcImJhc2U2NHVybFwiKVxuICAgIGNvbnN0IGNsb3NpbmdTZXNzaW9ucyA9IEFycmF5LmZyb20odGhpcy5zZXNzaW9ucylcbiAgICBhd2FpdCBQcm9taXNlLmFsbChjbG9zaW5nU2Vzc2lvbnMubWFwKGFzeW5jIChzb2NrZXQpID0+IGF3YWl0IHRoaXMuc2NoZWR1bGVTZXNzaW9uQ2xlYW51cChzb2NrZXQpKSlcbiAgICBmb3IgKGNvbnN0IHNvY2tldCBvZiBjbG9zaW5nU2Vzc2lvbnMpIHNvY2tldC5jbG9zZSgxMDAxLCBcIlNoYXJlZCB0cmFuc2FjdGlvbiBicm9rZXIgY2xvc2VkXCIpXG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKEFycmF5LmZyb20odGhpcy5jb25uZWN0aW9uU3RhdGVzLnZhbHVlcygpKS5tYXAoKHN0YXRlKSA9PiBzdGF0ZS5xdWV1ZSkpXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHRoaXMud2Vic29ja2V0U2VydmVyLmNsb3NlKCgpID0+IHJlc29sdmUodW5kZWZpbmVkKSkpXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHRoaXMuaHR0cFNlcnZlci5jbG9zZSgoKSA9PiByZXNvbHZlKHVuZGVmaW5lZCkpKVxuICAgIGF3YWl0IFByb21pc2UuYWxsKEFycmF5LmZyb20odGhpcy5zZXNzaW9uQ2xlYW51cC52YWx1ZXMoKSkpXG4gICAgZm9yIChjb25zdCBbY29ubmVjdGlvbiwgY29vcmRpbmF0b3JdIG9mIHRoaXMuY29ubmVjdGlvbkNvb3JkaW5hdG9ycykge1xuICAgICAgY2xlYXJTaGFyZWRUcmFuc2FjdGlvbkNvb3JkaW5hdG9yKGNvbm5lY3Rpb24sIGNvb3JkaW5hdG9yKVxuICAgIH1cbiAgICBpZiAodGhpcy5jbGVhbnVwRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBBZ2dyZWdhdGVFcnJvcih0aGlzLmNsZWFudXBFcnJvcnMsIGBTaGFyZWQgdHJhbnNhY3Rpb24gYnJva2VyIGNsZWFudXAgZmFpbGVkOiAke3RoaXMuY2xlYW51cEVycm9ycy5tYXAoKGVycm9yKSA9PiBlcnJvci5tZXNzYWdlKS5qb2luKFwiOyBcIil9YClcbiAgICB9XG4gIH1cbn1cbiJdfQ==
494
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLXRyYW5zYWN0aW9uLWJyb2tlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL3NoYXJlZC10cmFuc2FjdGlvbi1icm9rZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDeEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUMxQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sSUFBSSxDQUFBO0FBQ3BDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFBO0FBQ3BGLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSwrQkFBK0IsRUFBRSxNQUFNLGdEQUFnRCxDQUFBO0FBRW5JLG9OQUFvTjtBQUVwTixNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUM5QixPQUFPO0lBQ1AsY0FBYztJQUNkLGNBQWM7SUFDZCxxQkFBcUI7SUFDckIseUJBQXlCO0lBQ3pCLDBCQUEwQjtJQUMxQiw0QkFBNEI7SUFDNUIsZ0JBQWdCO0lBQ2hCLGtCQUFrQjtJQUNsQixtQkFBbUI7SUFDbkIsMEJBQTBCO0lBQzFCLHNCQUFzQjtJQUN0Qix3QkFBd0I7SUFDeEIseUJBQXlCO0NBQzFCLENBQUMsQ0FBQTtBQUVGOzs7OztHQUtHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsUUFBUTtJQUMzQyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQzNDLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDM0MsT0FBTyxhQUFhLENBQUMsTUFBTSxLQUFLLGFBQWEsQ0FBQyxNQUFNLElB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QUMsQ0FBQyxDQUFDLENBQUE7UUFDL0UsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDM0QsS0FBSyxNQUFNLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQ3BFLGlDQUFpQyxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQTtRQUM1RCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsNkNBQTZDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUMxSixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7IHJhbmRvbUJ5dGVzLCB0aW1pbmdTYWZlRXF1YWwgfSBmcm9tIFwibm9kZTpjcnlwdG9cIlxuaW1wb3J0IHsgY3JlYXRlU2VydmVyIH0gZnJvbSBcIm5vZGU6aHR0cFwiXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwibm9kZTpldmVudHNcIlxuaW1wb3J0IHsgV2ViU29ja2V0U2VydmVyIH0gZnJvbSBcIndzXCJcbmltcG9ydCB7IGRlY29kZUJyb2tlclZhbHVlLCBlbmNvZGVCcm9rZXJWYWx1ZSB9IGZyb20gXCIuL3NoYXJlZC10cmFuc2FjdGlvbi1jb2RlYy5qc1wiXG5pbXBvcnQgeyBjbGVhclNoYXJlZFRyYW5zYWN0aW9uQ29vcmRpbmF0b3IsIHNldFNoYXJlZFRyYW5zYWN0aW9uQ29vcmRpbmF0b3IgfSBmcm9tIFwiLi9zaGFyZWQtdHJhbnNhY3Rpb24tY29ubmVjdGlvbi1jb29yZGluYXRvci5qc1wiXG5cbi8qKiBAdHlwZWRlZiB7e3F1ZXVlOiBQcm9taXNlPHZvaWQ+LCByb290U2Vzc2lvbnM6IFNldDxpbXBvcnQoXCJ3c1wiKS5XZWJTb2NrZXQ+LCBsZWFzZT86IHtvcGVyYXRpb25zOiBQcm9taXNlPHZvaWQ+LCByZWxlYXNlOiAoKSA9PiB2b2lkLCBzYXZlUG9pbnROYW1lOiBzdHJpbmcsIHNvY2tldDogaW1wb3J0KFwid3NcIikuV2ViU29ja2V0fX19IENvbm5lY3Rpb25TdGF0ZSAqL1xuXG5jb25zdCBBTExPV0VEX01FVEhPRFMgPSBuZXcgU2V0KFtcbiAgXCJxdWVyeVwiLFxuICBcImFmZmVjdGVkUm93c1wiLFxuICBcIl9xdWVyeUFjdHVhbFwiLFxuICBcIl9hZmZlY3RlZFJvd3NBY3R1YWxcIixcbiAgXCJfc3RhcnRUcmFuc2FjdGlvbkFjdGlvblwiLFxuICBcIl9jb21taXRUcmFuc2FjdGlvbkFjdGlvblwiLFxuICBcIl9yb2xsYmFja1RyYW5zYWN0aW9uQWN0aW9uXCIsXG4gIFwic3RhcnRTYXZlUG9pbnRcIixcbiAgXCJyZWxlYXNlU2F2ZVBvaW50XCIsXG4gIFwicm9sbGJhY2tTYXZlUG9pbnRcIixcbiAgXCJnZXRDb25uZWN0aW9uU2NvcGVkVmFsdWVcIixcbiAgXCJyb290VHJhbnNhY3Rpb25TdGFydFwiLFxuICBcInJvb3RUcmFuc2FjdGlvblJlbGVhc2VcIixcbiAgXCJyb290VHJhbnNhY3Rpb25Sb2xsYmFja1wiXG5dKVxuXG4vKipcbiAqIENvbXBhcmVzIGEgcHJlc2VudGVkIGNhcGFiaWxpdHkgd2l0aG91dCBsZWFraW5nIG1hdGNoaW5nIHByZWZpeCB0aW1pbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvdmlkZWQgLSBQcmVzZW50ZWQgY2FwYWJpbGl0eS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZCAtIEFjdGl2ZSBjYXBhYmlsaXR5LlxuICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgY2FwYWJpbGl0aWVzIG1hdGNoLlxuICovXG5mdW5jdGlvbiBjYXBhYmlsaXR5TWF0Y2hlcyhwcm92aWRlZCwgZXhwZWN0ZWQpIHtcbiAgY29uc3QgcHJvdmlkZWRCeXRlcyA9IEJ1ZmZlci5mcm9tKHByb3ZpZGVkKVxuICBjb25zdCBleHBlY3RlZEJ5dGVzID0gQnVmZmVyLmZyb20oZXhwZWN0ZWQpXG4gIHJldHVybiBwcm92aWRlZEJ5dGVzLmxlbmd0aCA9PT0gZXhwZWN0ZWRCeXRlcy5sZW5ndGggJiYgdGltaW5nU2FmZUVxdWFsKHByb3ZpZGVkQnl0ZXMsIGV4cGVjdGVkQnl0ZXMpXG59XG5cbi8qKlxuICogQWRkcyBicm9rZXIgb3duZXJzaGlwIHRvIGRlY29kZWQgZHJpdmVyIG9wdGlvbnMuXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB2YWx1ZSAtIERlY29kZWQgb3B0aW9ucy5cbiAqIEBwYXJhbSB7c3ltYm9sfSBvcGVyYXRpb25Pd25lciAtIEJyb2tlciBjb29yZGluYXRvciBvd25lci5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4gJiB7b3BlcmF0aW9uT3duZXI6IHN5bWJvbH19IC0gT3duZWQgb3B0aW9ucy5cbiAqL1xuZnVuY3Rpb24gb3duZWRPcGVyYXRpb25PcHRpb25zKHZhbHVlLCBvcGVyYXRpb25Pd25lcikge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHtvcGVyYXRpb25Pd25lcn1cbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU2hhcmVkIHRyYW5zYWN0aW9uIGJyb2tlciBkcml2ZXIgb3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdFwiKVxuICB9XG5cbiAgY29uc3Qgb3B0aW9ucyA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqLyAodmFsdWUpXG5cbiAgcmV0dXJuIHsuLi5vcHRpb25zLCBvcGVyYXRpb25Pd25lcn1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIGJyb2tlciBhcm91bmQgcGFyZW50LW93bmVkIHBoeXNpY2FsIGNvbm5lY3Rpb25zLlxuICAgKiBAcGFyYW0ge3tjb25uZWN0aW9uczogUmVjb3JkPHN0cmluZywgb2JqZWN0Pn19IGFyZ3MgLSBQYXJlbnQtb3duZWQgcGh5c2ljYWwgY29ubmVjdGlvbnMuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29ubmVjdGlvbnN9KSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuY29ubmVjdGlvbnMgPSBjb25uZWN0aW9uc1xuICAgIHRoaXMuc2VjcmV0ID0gcmFuZG9tQnl0ZXMoMzIpLnRvU3RyaW5nKFwiYmFzZTY0dXJsXCIpXG4gICAgdGhpcy5hY2NlcHRpbmcgPSB0cnVlXG4gICAgLyoqIEB0eXBlIHtNYXA8b2JqZWN0LCBDb25uZWN0aW9uU3RhdGU+fSAqL1xuICAgIHRoaXMuY29ubmVjdGlvblN0YXRlcyA9IG5ldyBNYXAoKVxuICAgIC8qKiBAdHlwZSB7U2V0PGltcG9ydChcIndzXCIpLldlYlNvY2tldD59ICovXG4gICAgdGhpcy5zZXNzaW9ucyA9IG5ldyBTZXQoKVxuICAgIC8qKiBAdHlwZSB7TWFwPGltcG9ydChcIndzXCIpLldlYlNvY2tldCwgUHJvbWlzZTx2b2lkPj59ICovXG4gICAgdGhpcy5zZXNzaW9uQ2xlYW51cCA9IG5ldyBNYXAoKVxuICAgIC8qKiBAdHlwZSB7QXJyYXk8RXJyb3I+fSAqL1xuICAgIHRoaXMuY2xlYW51cEVycm9ycyA9IFtdXG4gICAgLyoqIEB0eXBlIHtQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkfSAqL1xuICAgIHRoaXMuY2xvc2VQcm9taXNlID0gdW5kZWZpbmVkXG4gICAgLyoqIEB0eXBlIHtNYXA8b2JqZWN0LCAoY2FsbGJhY2s6ICgpID0+IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+KSA9PiBQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pj59ICovXG4gICAgdGhpcy5jb25uZWN0aW9uQ29vcmRpbmF0b3JzID0gbmV3IE1hcCgpXG4gICAgLyoqIEB0eXBlIHtNYXA8b2JqZWN0LCBzeW1ib2w+fSAqL1xuICAgIHRoaXMuY29ubmVjdGlvbkNvb3JkaW5hdG9yT3duZXJzID0gbmV3IE1hcCgpXG4gICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIG5ldyBTZXQoT2JqZWN0LnZhbHVlcyhjb25uZWN0aW9ucykpKSB7XG4gICAgICB0aGlzLmluc3RhbGxDb25uZWN0aW9uQ29vcmRpbmF0b3IoY29ubmVjdGlvbilcbiAgICB9XG4gICAgdGhpcy5waHlzaWNhbENvbm5lY3Rpb25zID0gbmV3IE1hcCgpXG4gICAgdGhpcy5odHRwU2VydmVyID0gY3JlYXRlU2VydmVyKClcbiAgICB0aGlzLndlYnNvY2tldFNlcnZlciA9IG5ldyBXZWJTb2NrZXRTZXJ2ZXIoe3NlcnZlcjogdGhpcy5odHRwU2VydmVyLCBtYXhQYXlsb2FkOiAxNiAqIDEwMjQgKiAxMDI0fSlcbiAgICB0aGlzLndlYnNvY2tldFNlcnZlci5vbihcImNvbm5lY3Rpb25cIiwgKHNvY2tldCkgPT4ge1xuICAgICAgdGhpcy5zZXNzaW9ucy5hZGQoc29ja2V0KVxuICAgICAgc29ja2V0Lm9uY2UoXCJjbG9zZVwiLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2Vzc2lvbnMuZGVsZXRlKHNvY2tldClcbiAgICAgICAgdGhpcy5zY2hlZHVsZVNlc3Npb25DbGVhbnVwKHNvY2tldClcbiAgICAgIH0pXG4gICAgICBzb2NrZXQub24oXCJtZXNzYWdlXCIsIChkYXRhKSA9PiB2b2lkIHRoaXMuaGFuZGxlUmVxdWVzdChzb2NrZXQsIGAke2RhdGF9YCkpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxscyBzZXJpYWxpemF0aW9uIG93bmVyc2hpcCBmb3IgYSBuZXdseSBlbnJvbGxlZCBwaHlzaWNhbCBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29ubmVjdGlvbiAtIFBhcmVudC1vd25lZCBwaHlzaWNhbCBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGluc3RhbGxDb25uZWN0aW9uQ29vcmRpbmF0b3IoY29ubmVjdGlvbikge1xuICAgIGlmICh0aGlzLmNvbm5lY3Rpb25Db29yZGluYXRvcnMuaGFzKGNvbm5lY3Rpb24pKSByZXR1cm5cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemVzIHBhcmVudCBvcGVyYXRpb25zIHdpdGggY2hpbGQgYnJva2VyIHRyYWZmaWMuXG4gICAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPHVua25vd24+fSBjYWxsYmFjayAtIFBhcmVudCBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMge1Byb21pc2U8dW5rbm93bj59IC0gT3BlcmF0aW9uIHJlc3VsdC5cbiAgICAgKi9cbiAgICBjb25zdCBjb29yZGluYXRvciA9IGFzeW5jIChjYWxsYmFjaykgPT4gYXdhaXQgdGhpcy5zZXJpYWxpemUodGhpcy5jb25uZWN0aW9uU3RhdGUoY29ubmVjdGlvbiksIGNhbGxiYWNrKVxuICAgIHRoaXMuY29ubmVjdGlvbkNvb3JkaW5hdG9ycy5zZXQoY29ubmVjdGlvbiwgY29vcmRpbmF0b3IpXG4gICAgdGhpcy5jb25uZWN0aW9uQ29vcmRpbmF0b3JPd25lcnMuc2V0KGNvbm5lY3Rpb24sIHNldFNoYXJlZFRyYW5zYWN0aW9uQ29vcmRpbmF0b3IoY29ubmVjdGlvbiwgY29vcmRpbmF0b3IpKVxuICB9XG5cbiAgLyoqXG4gICAqIEVucm9sbHMgb25lIGV4YWN0IHBoeXNpY2FsIGRhdGFiYXNlIGlkZW50aXR5IGluIHRoaXMgY2FwYWJpbGl0eSdzIHJvbGxiYWNrIHNldC5cbiAgICogQHBhcmFtIHt7Y29ubmVjdGlvbjogb2JqZWN0LCBkYXRhYmFzZUlkZW50aWZpZXI6IHN0cmluZywgcmV1c2VLZXk6IHN0cmluZ319IGFyZ3MgLSBQaHlzaWNhbCBjb25uZWN0aW9uIGlkZW50aXR5LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGVucm9sbENvbm5lY3Rpb24oe2Nvbm5lY3Rpb24sIGRhdGFiYXNlSWRlbnRpZmllciwgcmV1c2VLZXl9KSB7XG4gICAgaWYgKCF0aGlzLmFjY2VwdGluZykgdGhyb3cgbmV3IEVycm9yKFwiU2hhcmVkIHRyYW5zYWN0aW9uIGJyb2tlciBjYXBhYmlsaXR5IGhhcyBiZWVuIHJldm9rZWRcIilcbiAgICBjb25zdCBpZGVudGl0eSA9IGAke2RhdGFiYXNlSWRlbnRpZmllcn1cXDAke3JldXNlS2V5fWBcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMucGh5c2ljYWxDb25uZWN0aW9ucy5nZXQoaWRlbnRpdHkpXG4gICAgaWYgKGV4aXN0aW5nICYmIGV4aXN0aW5nICE9PSBjb25uZWN0aW9uKSB0aHJvdyBuZXcgRXJyb3IoYFNoYXJlZCB0cmFuc2FjdGlvbiBwaHlzaWNhbCBjb25uZWN0aW9uIGlkZW50aXR5IGlzIGFscmVhZHkgZW5yb2xsZWQ6ICR7ZGF0YWJhc2VJZGVudGlmaWVyfWApXG4gICAgdGhpcy5pbnN0YWxsQ29ubmVjdGlvbkNvb3JkaW5hdG9yKGNvbm5lY3Rpb24pXG4gICAgdGhpcy5waHlzaWNhbENvbm5lY3Rpb25zLnNldChpZGVudGl0eSwgY29ubmVjdGlvbilcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgYSBicm9rZXIgb24gYW4gZXBoZW1lcmFsIGxvb3BiYWNrIHBvcnQuXG4gICAqIEBwYXJhbSB7e2Nvbm5lY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+fX0gYXJncyAtIFBhcmVudC1vd25lZCBwaHlzaWNhbCBjb25uZWN0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8U2hhcmVkVHJhbnNhY3Rpb25Ccm9rZXI+fSAtIExpc3RlbmluZyBicm9rZXIuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgc3RhcnQoYXJncykge1xuICAgIGNvbnN0IGJyb2tlciA9IG5ldyBTaGFyZWRUcmFuc2FjdGlvbkJyb2tlcihhcmdzKVxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGJyb2tlci5odHRwU2VydmVyLm9uY2UoXCJlcnJvclwiLCByZWplY3QpXG4gICAgICBicm9rZXIuaHR0cFNlcnZlci5saXN0ZW4oe2hvc3Q6IFwiMTI3LjAuMC4xXCIsIHBvcnQ6IDB9LCAoKSA9PiByZXNvbHZlKHVuZGVmaW5lZCkpXG4gICAgfSlcbiAgICByZXR1cm4gYnJva2VyXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbG9vcGJhY2sgd2Vic29ja2V0IGFkZHJlc3MuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gTG9vcGJhY2sgd2Vic29ja2V0IGFkZHJlc3MuXG4gICAqL1xuICBhZGRyZXNzKCkge1xuICAgIGNvbnN0IGFkZHJlc3MgPSB0aGlzLmh0dHBTZXJ2ZXIuYWRkcmVzcygpXG4gICAgaWYgKCFhZGRyZXNzIHx8IHR5cGVvZiBhZGRyZXNzID09PSBcInN0cmluZ1wiKSB0aHJvdyBuZXcgRXJyb3IoXCJTaGFyZWQgdHJhbnNhY3Rpb24gYnJva2VyIGlzIG5vdCBsaXN0ZW5pbmdcIilcbiAgICByZXR1cm4gYHdzOi8vMTI3LjAuMC4xOiR7YWRkcmVzcy5wb3J0fWBcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBwZXItYXR0ZW1wdCB1bmd1ZXNzYWJsZSBjYXBhYmlsaXR5LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFBlci1hdHRlbXB0IHVuZ3Vlc3NhYmxlIGNhcGFiaWxpdHkuXG4gICAqL1xuICBjYXBhYmlsaXR5KCkgeyByZXR1cm4gdGhpcy5zZWNyZXQgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYW5kIGhhbmRsZXMgb25lIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwid3NcIikuV2ViU29ja2V0fSBzb2NrZXQgLSBDYWxsaW5nIHNlc3Npb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXJpYWxpemVkIC0gUmVxdWVzdCBKU09OLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciByZXNwb25kaW5nLlxuICAgKi9cbiAgYXN5bmMgaGFuZGxlUmVxdWVzdChzb2NrZXQsIHNlcmlhbGl6ZWQpIHtcbiAgICBsZXQgcmVxdWVzdElkID0gMFxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gLyoqIEB0eXBlIHt7cmVxdWVzdElkOiBudW1iZXIsIGNhcGFiaWxpdHk6IHN0cmluZywgZGF0YWJhc2VJZGVudGlmaWVyOiBzdHJpbmcsIHJldXNlS2V5Pzogc3RyaW5nLCBtZXRob2Q6IHN0cmluZywgYXJnczogaW1wb3J0KFwiLi9zaGFyZWQtdHJhbnNhY3Rpb24tY29kZWMuanNcIikuRW5jb2RlZEJyb2tlclZhbHVlfX0gKi8gKEpTT04ucGFyc2Uoc2VyaWFsaXplZCkpXG4gICAgICByZXF1ZXN0SWQgPSByZXF1ZXN0LnJlcXVlc3RJZFxuICAgICAgaWYgKCF0aGlzLmFjY2VwdGluZykgdGhyb3cgbmV3IEVycm9yKFwiU2hhcmVkIHRyYW5zYWN0aW9uIGJyb2tlciBjYXBhYmlsaXR5IGhhcyBiZWVuIHJldm9rZWRcIilcbiAgICAgIGlmICghY2FwYWJpbGl0eU1hdGNoZXMocmVxdWVzdC5jYXBhYmlsaXR5LCB0aGlzLnNlY3JldCkpIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gc2hhcmVkIHRyYW5zYWN0aW9uIGJyb2tlciBjYXBhYmlsaXR5XCIpXG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gcmVxdWVzdC5yZXVzZUtleVxuICAgICAgICA/IHRoaXMucGh5c2ljYWxDb25uZWN0aW9ucy5nZXQoYCR7cmVxdWVzdC5kYXRhYmFzZUlkZW50aWZpZXJ9XFwwJHtyZXF1ZXN0LnJldXNlS2V5fWApXG4gICAgICAgIDogdGhpcy5jb25uZWN0aW9uc1tyZXF1ZXN0LmRhdGFiYXNlSWRlbnRpZmllcl1cbiAgICAgIGlmICghY29ubmVjdGlvbikge1xuICAgICAgICBpZiAocmVxdWVzdC5yZXVzZUtleSkgdGhyb3cgbmV3IEVycm9yKGBVbmVucm9sbGVkIHBoeXNpY2FsIGNvbm5lY3Rpb24gaWRlbnRpdHk6ICR7cmVxdWVzdC5kYXRhYmFzZUlkZW50aWZpZXJ9YClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHNoYXJlZCB0cmFuc2FjdGlvbiBkYXRhYmFzZSBpZGVudGlmaWVyOiAke3JlcXVlc3QuZGF0YWJhc2VJZGVudGlmaWVyfWApXG4gICAgICB9XG4gICAgICBpZiAoIUFMTE9XRURfTUVUSE9EUy5oYXMocmVxdWVzdC5tZXRob2QpKSB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHNoYXJlZCB0cmFuc2FjdGlvbiBicm9rZXIgbWV0aG9kOiAke3JlcXVlc3QubWV0aG9kfWApXG4gICAgICBjb25zdCBhcmdzID0gZGVjb2RlQnJva2VyVmFsdWUocmVxdWVzdC5hcmdzKVxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFyZ3MpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU2hhcmVkIHRyYW5zYWN0aW9uIGJyb2tlciBhcmd1bWVudHMgbXVzdCBiZSBhbiBhcnJheVwiKVxuICAgICAgdGhpcy5lbWl0KFwid29yay1xdWV1ZWRcIiwge2Nvbm5lY3Rpb24sIGRhdGFiYXNlSWRlbnRpZmllcjogcmVxdWVzdC5kYXRhYmFzZUlkZW50aWZpZXIsIG1ldGhvZDogcmVxdWVzdC5tZXRob2R9KVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ydW5Db25uZWN0aW9uUmVxdWVzdCh7Y29ubmVjdGlvbiwgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCwgc2F2ZVBvaW50TmFtZTogdHlwZW9mIGFyZ3NbMF0gPT09IFwic3RyaW5nXCIgPyBhcmdzWzBdIDogdW5kZWZpbmVkLCBzb2NrZXR9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmIChyZXF1ZXN0Lm1ldGhvZCA9PT0gXCJyb290VHJhbnNhY3Rpb25Sb2xsYmFja1wiKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5yb2xsYmFja1Jvb3RTYXZlUG9pbnQoY29ubmVjdGlvbiwgLyoqIEB0eXBlIHtzdHJpbmd9ICovIChhcmdzWzBdKSlcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGh5c2ljYWxNZXRob2QgPSByZXF1ZXN0Lm1ldGhvZCA9PT0gXCJyb290VHJhbnNhY3Rpb25TdGFydFwiXG4gICAgICAgICAgPyBcInN0YXJ0U2F2ZVBvaW50XCJcbiAgICAgICAgICA6IHJlcXVlc3QubWV0aG9kID09PSBcInJvb3RUcmFuc2FjdGlvblJlbGVhc2VcIlxuICAgICAgICAgICAgPyBcInJlbGVhc2VTYXZlUG9pbnRcIlxuICAgICAgICAgICAgOiByZXF1ZXN0Lm1ldGhvZCA9PT0gXCJyb290VHJhbnNhY3Rpb25Sb2xsYmFja1wiXG4gICAgICAgICAgICAgID8gXCJyb2xsYmFja1NhdmVQb2ludFwiXG4gICAgICAgICAgICAgIDogcmVxdWVzdC5tZXRob2RcbiAgICAgICAgY29uc3QgY29ubmVjdGlvbk1ldGhvZHMgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsICguLi5tZXRob2RBcmdzOiBBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiB8IHtvcGVyYXRpb25Pd25lcjogc3ltYm9sfT4pID0+IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gKGNvbm5lY3Rpb24pXG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IGNvbm5lY3Rpb25NZXRob2RzW3BoeXNpY2FsTWV0aG9kXVxuICAgICAgICBpZiAodHlwZW9mIG1ldGhvZCAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3IoYENvbm5lY3Rpb24gZG9lcyBub3Qgc3VwcG9ydCBzaGFyZWQgdHJhbnNhY3Rpb24gbWV0aG9kOiAke3JlcXVlc3QubWV0aG9kfWApXG4gICAgICAgIHJldHVybiBhd2FpdCBtZXRob2QuYXBwbHkoY29ubmVjdGlvbiwgdGhpcy5vd25lZE1ldGhvZEFyZ3Moe2FyZ3MsIGNvbm5lY3Rpb24sIG1ldGhvZDogcGh5c2ljYWxNZXRob2R9KSlcbiAgICAgIH0pXG4gICAgICBpZiAoc29ja2V0LnJlYWR5U3RhdGUgPT09IHNvY2tldC5PUEVOKSBzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7cmVxdWVzdElkLCByZXN1bHQ6IGVuY29kZUJyb2tlclZhbHVlKHJlc3VsdCl9KSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKVxuICAgICAgaWYgKHNvY2tldC5yZWFkeVN0YXRlID09PSBzb2NrZXQuT1BFTikgc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe3JlcXVlc3RJZCwgZXJyb3I6IGVuY29kZUJyb2tlclZhbHVlKG5vcm1hbGl6ZWQpfSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgdGhlIGJyb2tlciBvd25lciB0byBwdWJsaWMgZHJpdmVyIG1ldGhvZHMgdGhhdCByZS1lbnRlciBjb29yZGluYXRlZCBxdWVyeSB3b3JrLlxuICAgKiBAcGFyYW0ge3thcmdzOiBBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIGNvbm5lY3Rpb246IG9iamVjdCwgbWV0aG9kOiBzdHJpbmd9fSBhcmdzIC0gUGh5c2ljYWwgaW52b2NhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+IHwge29wZXJhdGlvbk93bmVyOiBzeW1ib2x9Pn0gLSBPd25lZCBtZXRob2QgYXJndW1lbnRzLlxuICAgKi9cbiAgb3duZWRNZXRob2RBcmdzKHthcmdzLCBjb25uZWN0aW9uLCBtZXRob2R9KSB7XG4gICAgY29uc3Qgb3BlcmF0aW9uT3duZXIgPSB0aGlzLmNvbm5lY3Rpb25Db29yZGluYXRvck93bmVycy5nZXQoY29ubmVjdGlvbilcblxuICAgIGlmICghb3BlcmF0aW9uT3duZXIpIHRocm93IG5ldyBFcnJvcihcIlNoYXJlZCB0cmFuc2FjdGlvbiBicm9rZXIgY29ubmVjdGlvbiBvd25lciBpcyBtaXNzaW5nXCIpXG4gICAgaWYgKFtcIl9zdGFydFRyYW5zYWN0aW9uQWN0aW9uXCIsIFwiX2NvbW1pdFRyYW5zYWN0aW9uQWN0aW9uXCIsIFwiX3JvbGxiYWNrVHJhbnNhY3Rpb25BY3Rpb25cIl0uaW5jbHVkZXMobWV0aG9kKSkge1xuICAgICAgcmV0dXJuIFtvd25lZE9wZXJhdGlvbk9wdGlvbnMoYXJnc1swXSwgb3BlcmF0aW9uT3duZXIpXVxuICAgIH1cbiAgICBpZiAoW1wicXVlcnlcIiwgXCJhZmZlY3RlZFJvd3NcIiwgXCJzdGFydFNhdmVQb2ludFwiLCBcInJlbGVhc2VTYXZlUG9pbnRcIiwgXCJyb2xsYmFja1NhdmVQb2ludFwiXS5pbmNsdWRlcyhtZXRob2QpKSB7XG4gICAgICByZXR1cm4gW2FyZ3NbMF0sIG93bmVkT3BlcmF0aW9uT3B0aW9ucyhhcmdzWzFdLCBvcGVyYXRpb25Pd25lcildXG4gICAgfVxuXG4gICAgcmV0dXJuIGFyZ3NcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIG11dGFibGUgc2VyaWFsaXphdGlvbiBzdGF0ZSBmb3Igb25lIHBoeXNpY2FsIGNvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb25uZWN0aW9uIC0gUGh5c2ljYWwgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge0Nvbm5lY3Rpb25TdGF0ZX0gLSBDb25uZWN0aW9uIHN0YXRlLlxuICAgKi9cbiAgY29ubmVjdGlvblN0YXRlKGNvbm5lY3Rpb24pIHtcbiAgICBsZXQgc3RhdGUgPSB0aGlzLmNvbm5lY3Rpb25TdGF0ZXMuZ2V0KGNvbm5lY3Rpb24pXG4gICAgaWYgKCFzdGF0ZSkge1xuICAgICAgc3RhdGUgPSB7cXVldWU6IFByb21pc2UucmVzb2x2ZSgpLCByb290U2Vzc2lvbnM6IG5ldyBTZXQoKX1cbiAgICAgIHRoaXMuY29ubmVjdGlvblN0YXRlcy5zZXQoY29ubmVjdGlvbiwgc3RhdGUpXG4gICAgfVxuICAgIHJldHVybiBzdGF0ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSB2YWxpZGF0ZWQgcmVxdWVzdCB3aXRoIHJvb3QgdHJhbnNhY3Rpb24gbGVhc2Ugc2VtYW50aWNzLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge3tjb25uZWN0aW9uOiBvYmplY3QsIG1ldGhvZDogc3RyaW5nLCBzYXZlUG9pbnROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsIHNvY2tldDogaW1wb3J0KFwid3NcIikuV2ViU29ja2V0fX0gYXJncyAtIFJlcXVlc3QgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBQaHlzaWNhbCBvcGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIE9wZXJhdGlvbiByZXN1bHQuXG4gICAqL1xuICBhc3luYyBydW5Db25uZWN0aW9uUmVxdWVzdCh7Y29ubmVjdGlvbiwgbWV0aG9kLCBzYXZlUG9pbnROYW1lLCBzb2NrZXR9LCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5jb25uZWN0aW9uU3RhdGUoY29ubmVjdGlvbilcbiAgICBpZiAobWV0aG9kID09PSBcInJvb3RUcmFuc2FjdGlvblN0YXJ0XCIpIHtcbiAgICAgIGlmICghc2F2ZVBvaW50TmFtZSkgdGhyb3cgbmV3IEVycm9yKFwiU2hhcmVkIHRyYW5zYWN0aW9uIGJyb2tlciByb290IHRyYW5zYWN0aW9uIHJlcXVpcmVzIGEgc2F2ZXBvaW50IG5hbWVcIilcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnN0YXJ0Um9vdExlYXNlKHtjYWxsYmFjaywgc2F2ZVBvaW50TmFtZSwgc3RhdGUsIHNvY2tldH0pXG4gICAgfVxuICAgIGlmIChtZXRob2QgPT09IFwicm9vdFRyYW5zYWN0aW9uUmVsZWFzZVwiIHx8IG1ldGhvZCA9PT0gXCJyb290VHJhbnNhY3Rpb25Sb2xsYmFja1wiKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5maW5pc2hSb290TGVhc2Uoe2NhbGxiYWNrLCBzYXZlUG9pbnROYW1lLCBzdGF0ZSwgc29ja2V0fSlcbiAgICB9XG4gICAgaWYgKHN0YXRlLmxlYXNlPy5zb2NrZXQgPT09IHNvY2tldCkgcmV0dXJuIGF3YWl0IHRoaXMuc2VyaWFsaXplTGVhc2Uoc3RhdGUubGVhc2UsIGNhbGxiYWNrKVxuICAgIHJldHVybiBhd2FpdCB0aGlzLnNlcmlhbGl6ZShzdGF0ZSwgY2FsbGJhY2spXG4gIH1cblxuICAvKipcbiAgICogQWNxdWlyZXMgdGhlIEZJRk8gcGh5c2ljYWwgY29ubmVjdGlvbiBsZWFzZSBhbmQgaG9sZHMgdGhlIHF1ZXVlIHVudGlsIGVuZC5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHt7Y2FsbGJhY2s6ICgpID0+IFByb21pc2U8VD4sIHNhdmVQb2ludE5hbWU6IHN0cmluZywgc3RhdGU6IENvbm5lY3Rpb25TdGF0ZSwgc29ja2V0OiBpbXBvcnQoXCJ3c1wiKS5XZWJTb2NrZXR9fSBhcmdzIC0gTGVhc2UgcmVxdWVzdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8VD59IC0gUm9vdCBzYXZlcG9pbnQgc3RhcnQgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgc3RhcnRSb290TGVhc2Uoe2NhbGxiYWNrLCBzYXZlUG9pbnROYW1lLCBzdGF0ZSwgc29ja2V0fSkge1xuICAgIGlmIChzdGF0ZS5yb290U2Vzc2lvbnMuaGFzKHNvY2tldCkpIHRocm93IG5ldyBFcnJvcihcIlNoYXJlZCB0cmFuc2FjdGlvbiBicm9rZXIgcm9vdCB0cmFuc2FjdGlvbiBpcyBhbHJlYWR5IGFjdGl2ZSBmb3IgdGhpcyBzZXNzaW9uXCIpXG4gICAgc3RhdGUucm9vdFNlc3Npb25zLmFkZChzb2NrZXQpXG4gICAgY29uc3QgcHJldmlvdXMgPSBzdGF0ZS5xdWV1ZVxuICAgIC8qKlxuICAgICAqIFJlc29sdmVzIHRoZSBzdGFydCByZXNwb25zZS5cbiAgICAgKiBAdHlwZSB7KHZhbHVlOiBUKSA9PiB2b2lkfVxuICAgICAqL1xuICAgIGxldCByZXNvbHZlU3RhcnRlZCA9ICgpID0+IHt9XG4gICAgLyoqXG4gICAgICogUmVqZWN0cyB0aGUgc3RhcnQgcmVzcG9uc2UuXG4gICAgICogQHR5cGUgeyhlcnJvcjogRXJyb3IpID0+IHZvaWR9XG4gICAgICovXG4gICAgbGV0IHJlamVjdFN0YXJ0ZWQgPSAoKSA9PiB7fVxuICAgIGNvbnN0IHN0YXJ0ZWQgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IHJlc29sdmVTdGFydGVkID0gcmVzb2x2ZTsgcmVqZWN0U3RhcnRlZCA9IHJlamVjdCB9KVxuICAgIC8qKlxuICAgICAqIFJlbGVhc2VzIHRoZSBoZWxkIGNvbm5lY3Rpb24gcXVldWUuXG4gICAgICogQHR5cGUgeyh2YWx1ZT86IHZvaWQpID0+IHZvaWR9XG4gICAgICovXG4gICAgbGV0IHJlbGVhc2UgPSAoKSA9PiB7fVxuICAgIGNvbnN0IGhlbGQgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4geyByZWxlYXNlID0gcmVzb2x2ZSB9KVxuXG4gICAgc3RhdGUucXVldWUgPSBwcmV2aW91cy50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChzb2NrZXQucmVhZHlTdGF0ZSAhPT0gc29ja2V0Lk9QRU4pIHRocm93IG5ldyBFcnJvcihcIlNoYXJlZCB0cmFuc2FjdGlvbiBicm9rZXIgcm9vdCB0cmFuc2FjdGlvbiBzZXNzaW9uIGNsb3NlZCBiZWZvcmUgbGVhc2UgYWNxdWlzaXRpb25cIilcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2FsbGJhY2soKVxuICAgICAgICBzdGF0ZS5sZWFzZSA9IHtvcGVyYXRpb25zOiBQcm9taXNlLnJlc29sdmUoKSwgcmVsZWFzZSwgc2F2ZVBvaW50TmFtZSwgc29ja2V0fVxuICAgICAgICByZXNvbHZlU3RhcnRlZChyZXN1bHQpXG4gICAgICAgIGlmICghdGhpcy5hY2NlcHRpbmcpIGF3YWl0IHRoaXMuc2NoZWR1bGVTZXNzaW9uQ2xlYW51cChzb2NrZXQpXG4gICAgICAgIGF3YWl0IGhlbGRcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHN0YXRlLnJvb3RTZXNzaW9ucy5kZWxldGUoc29ja2V0KVxuICAgICAgICByZWplY3RTdGFydGVkKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBhd2FpdCBzdGFydGVkXG4gIH1cblxuICAvKipcbiAgICogRmluaXNoZXMgdGhlIGNhbGxpbmcgc2Vzc2lvbidzIHJvb3QgbGVhc2UuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7e2NhbGxiYWNrOiAoKSA9PiBQcm9taXNlPFQ+LCBzYXZlUG9pbnROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsIHN0YXRlOiBDb25uZWN0aW9uU3RhdGUsIHNvY2tldDogaW1wb3J0KFwid3NcIikuV2ViU29ja2V0fX0gYXJncyAtIExlYXNlIGVuZCByZXF1ZXN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBTYXZlcG9pbnQgZW5kIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGZpbmlzaFJvb3RMZWFzZSh7Y2FsbGJhY2ssIHNhdmVQb2ludE5hbWUsIHN0YXRlLCBzb2NrZXR9KSB7XG4gICAgY29uc3QgbGVhc2UgPSBzdGF0ZS5sZWFzZVxuICAgIGlmICghbGVhc2UgfHwgbGVhc2Uuc29ja2V0ICE9PSBzb2NrZXQpIHRocm93IG5ldyBFcnJvcihcIlNoYXJlZCB0cmFuc2FjdGlvbiBicm9rZXIgc2Vzc2lvbiBkb2VzIG5vdCBvd24gdGhlIHJvb3QgdHJhbnNhY3Rpb24gbGVhc2VcIilcbiAgICBpZiAoc2F2ZVBvaW50TmFtZSAhPT0gbGVhc2Uuc2F2ZVBvaW50TmFtZSkgdGhyb3cgbmV3IEVycm9yKFwiU2hhcmVkIHRyYW5zYWN0aW9uIGJyb2tlciByb290IHRyYW5zYWN0aW9uIHNhdmVwb2ludCBkb2VzIG5vdCBtYXRjaCBpdHMgbGVhc2VcIilcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VyaWFsaXplTGVhc2UobGVhc2UsIGNhbGxiYWNrKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzdGF0ZS5sZWFzZSA9IHVuZGVmaW5lZFxuICAgICAgc3RhdGUucm9vdFNlc3Npb25zLmRlbGV0ZShzb2NrZXQpXG4gICAgICBsZWFzZS5yZWxlYXNlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBvcGVyYXRpb25zIGJlbG9uZ2luZyB0byB0aGUgYWN0aXZlIGxlYXNlIGhvbGRlci5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHt7b3BlcmF0aW9uczogUHJvbWlzZTx2b2lkPn19IGxlYXNlIC0gQWN0aXZlIGxlYXNlLlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gT3BlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBSZXN1bHQuXG4gICAqL1xuICBhc3luYyBzZXJpYWxpemVMZWFzZShsZWFzZSwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBwcmV2aW91cyA9IGxlYXNlLm9wZXJhdGlvbnNcbiAgICAvKipcbiAgICAgKiBSZWxlYXNlcyB0aGUgaG9sZGVyIG9wZXJhdGlvbiBxdWV1ZS5cbiAgICAgKiBAdHlwZSB7KHZhbHVlPzogdm9pZCkgPT4gdm9pZH1cbiAgICAgKi9cbiAgICBsZXQgcmVsZWFzZSA9ICgpID0+IHt9XG4gICAgY29uc3QgY3VycmVudCA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7IHJlbGVhc2UgPSByZXNvbHZlIH0pXG4gICAgbGVhc2Uub3BlcmF0aW9ucyA9IHByZXZpb3VzLnRoZW4oKCkgPT4gY3VycmVudClcbiAgICBhd2FpdCBwcmV2aW91c1xuICAgIHRyeSB7IHJldHVybiBhd2FpdCBjYWxsYmFjaygpIH0gZmluYWxseSB7IHJlbGVhc2UoKSB9XG4gIH1cblxuICAvKipcbiAgICogUm9sbHMgYmFjayBsZWFzZXMgYWJhbmRvbmVkIGJ5IGEgZGlzY29ubmVjdGVkIHNlc3Npb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwid3NcIikuV2ViU29ja2V0fSBzb2NrZXQgLSBEaXNjb25uZWN0ZWQgc2Vzc2lvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgYWxsIG93bmVkIGxlYXNlcyByZWxlYXNlLlxuICAgKi9cbiAgYXN5bmMgcmVsZWFzZURpc2Nvbm5lY3RlZExlYXNlcyhzb2NrZXQpIHtcbiAgICAvKiogQHR5cGUge0FycmF5PEVycm9yPn0gKi9cbiAgICBjb25zdCBlcnJvcnMgPSBbXVxuICAgIGZvciAoY29uc3QgW2Nvbm5lY3Rpb24sIHN0YXRlXSBvZiB0aGlzLmNvbm5lY3Rpb25TdGF0ZXMpIHtcbiAgICAgIGNvbnN0IGxlYXNlID0gc3RhdGUubGVhc2VcbiAgICAgIGlmICghbGVhc2UgfHwgbGVhc2Uuc29ja2V0ICE9PSBzb2NrZXQpIGNvbnRpbnVlXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnNlcmlhbGl6ZUxlYXNlKGxlYXNlLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5yb2xsYmFja1Jvb3RTYXZlUG9pbnQoY29ubmVjdGlvbiwgbGVhc2Uuc2F2ZVBvaW50TmFtZSlcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSlcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHN0YXRlLmxlYXNlID0gdW5kZWZpbmVkXG4gICAgICAgIHN0YXRlLnJvb3RTZXNzaW9ucy5kZWxldGUoc29ja2V0KVxuICAgICAgICBsZWFzZS5yZWxlYXNlKClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgQWdncmVnYXRlRXJyb3IoZXJyb3JzLCBgU2hhcmVkIHRyYW5zYWN0aW9uIGJyb2tlciBsZWFzZSBjbGVhbnVwIGZhaWxlZDogJHtlcnJvcnMubWFwKChlcnJvcikgPT4gZXJyb3IubWVzc2FnZSkuam9pbihcIjsgXCIpfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrcyBkZXRhY2hlZCBzb2NrZXQgY2xlYW51cCBhbmQgcmVjb3JkcyBpdHMgZmFpbHVyZSBmb3IgY2xvc2UoKS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCJ3c1wiKS5XZWJTb2NrZXR9IHNvY2tldCAtIENsb3NlZCBzZXNzaW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBTZXR0bGVkIHRyYWNrZWQgY2xlYW51cC5cbiAgICovXG4gIHNjaGVkdWxlU2Vzc2lvbkNsZWFudXAoc29ja2V0KSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLnNlc3Npb25DbGVhbnVwLmdldChzb2NrZXQpXG4gICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3RpbmdcbiAgICBjb25zdCBjbGVhbnVwID0gdGhpcy5yZWxlYXNlRGlzY29ubmVjdGVkTGVhc2VzKHNvY2tldClcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5jbGVhbnVwRXJyb3JzLnB1c2goZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpKVxuICAgICAgfSlcbiAgICAgIC5maW5hbGx5KCgpID0+IHRoaXMuc2Vzc2lvbkNsZWFudXAuZGVsZXRlKHNvY2tldCkpXG4gICAgdGhpcy5zZXNzaW9uQ2xlYW51cC5zZXQoc29ja2V0LCBjbGVhbnVwKVxuICAgIHJldHVybiBjbGVhbnVwXG4gIH1cblxuICAvKipcbiAgICogUm9sbHMgYmFjayBhbmQgcmVtb3ZlcyBhIHJvb3Qgc2F2ZXBvaW50IHNvIGl0IGNhbm5vdCByZW1haW4gYmVuZWF0aCB0aGUgbmV4dCBsZWFzZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbm5lY3Rpb24gLSBQYXJlbnQgcGh5c2ljYWwgY29ubmVjdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNhdmVQb2ludE5hbWUgLSBSb290IHNhdmVwb2ludCBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciByb2xsYmFjayBhbmQgcmVsZWFzZS5cbiAgICovXG4gIGFzeW5jIHJvbGxiYWNrUm9vdFNhdmVQb2ludChjb25uZWN0aW9uLCBzYXZlUG9pbnROYW1lKSB7XG4gICAgY29uc3QgbWV0aG9kcyA9IC8qKiBAdHlwZSB7e3JlbGVhc2VTYXZlUG9pbnQ6IChuYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiB7b3BlcmF0aW9uT3duZXI/OiBzeW1ib2x9KSA9PiBQcm9taXNlPHZvaWQ+LCByb2xsYmFja1NhdmVQb2ludDogKG5hbWU6IHN0cmluZywgb3B0aW9ucz86IHtvcGVyYXRpb25Pd25lcj86IHN5bWJvbH0pID0+IFByb21pc2U8dm9pZD59fSAqLyAoY29ubmVjdGlvbilcbiAgICBjb25zdCBvcGVyYXRpb25Pd25lciA9IHRoaXMuY29ubmVjdGlvbkNvb3JkaW5hdG9yT3duZXJzLmdldChjb25uZWN0aW9uKVxuXG4gICAgaWYgKCFvcGVyYXRpb25Pd25lcikgdGhyb3cgbmV3IEVycm9yKFwiU2hhcmVkIHRyYW5zYWN0aW9uIGJyb2tlciBjb25uZWN0aW9uIG93bmVyIGlzIG1pc3NpbmdcIilcbiAgICAvKiogQHR5cGUge0FycmF5PEVycm9yPn0gKi9cbiAgICBjb25zdCBlcnJvcnMgPSBbXVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBtZXRob2RzLnJvbGxiYWNrU2F2ZVBvaW50KHNhdmVQb2ludE5hbWUsIHtvcGVyYXRpb25Pd25lcn0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGVycm9ycy5wdXNoKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSlcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG1ldGhvZHMucmVsZWFzZVNhdmVQb2ludChzYXZlUG9pbnROYW1lLCB7b3BlcmF0aW9uT3duZXJ9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBlcnJvcnMucHVzaChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSkpXG4gICAgfVxuICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgYFNoYXJlZCB0cmFuc2FjdGlvbiBicm9rZXIgY291bGQgbm90IGNsZWFuIHJvb3Qgc2F2ZXBvaW50ICR7c2F2ZVBvaW50TmFtZX06ICR7ZXJyb3JzLm1hcCgoZXJyb3IpID0+IGVycm9yLm1lc3NhZ2UpLmpvaW4oXCI7IFwiKX1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIG9yZGluYXJ5IG5vbi1ob2xkZXIgd29yayB0aHJvdWdoIHRoZSBjb25uZWN0aW9uIEZJRk8uXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7Q29ubmVjdGlvblN0YXRlfSBzdGF0ZSAtIENvbm5lY3Rpb24gc3RhdGUuXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBXb3JrLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBXb3JrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHNlcmlhbGl6ZShzdGF0ZSwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBwcmV2aW91cyA9IHN0YXRlLnF1ZXVlXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZXMgdGhlIGN1cnJlbnQgcXVldWUgZW50cnkuXG4gICAgICogQHR5cGUgeyh2YWx1ZT86IHZvaWQpID0+IHZvaWR9XG4gICAgICovXG4gICAgbGV0IHJlbGVhc2UgPSAoKSA9PiB7fVxuICAgIGNvbnN0IGN1cnJlbnQgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4geyByZWxlYXNlID0gcmVzb2x2ZSB9KVxuICAgIGNvbnN0IHF1ZXVlZCA9IHByZXZpb3VzLnRoZW4oKCkgPT4gY3VycmVudClcbiAgICBzdGF0ZS5xdWV1ZSA9IHF1ZXVlZFxuICAgIGF3YWl0IHByZXZpb3VzXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBjYWxsYmFjaygpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJlbGVhc2UoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wcyBhZG1pc3Npb24sIHJldm9rZXMgY2FwYWJpbGl0eSwgcmVqZWN0cyBjbGllbnRzLCBhbmQgZHJhaW5zIGFjdGl2ZSB3b3JrLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciB0cmFuc3BvcnQgc2h1dGRvd24uXG4gICAqL1xuICBhc3luYyBjbG9zZSgpIHtcbiAgICBpZiAodGhpcy5jbG9zZVByb21pc2UpIHJldHVybiBhd2FpdCB0aGlzLmNsb3NlUHJvbWlzZVxuICAgIHRoaXMuY2xvc2VQcm9taXNlID0gdGhpcy5jbG9zZVRyYW5zcG9ydCgpXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xvc2VQcm9taXNlXG4gIH1cblxuICAvKiogUmV2b2tlcyBhZG1pc3Npb24gd2l0aG91dCBpbnRlcnJ1cHRpbmcgYWxyZWFkeSBhY2NlcHRlZCB3b3JrLiAqL1xuICByZXZva2UoKSB7XG4gICAgaWYgKCF0aGlzLmFjY2VwdGluZykgcmV0dXJuXG4gICAgdGhpcy5hY2NlcHRpbmcgPSBmYWxzZVxuICAgIHRoaXMuc2VjcmV0ID0gcmFuZG9tQnl0ZXMoMzIpLnRvU3RyaW5nKFwiYmFzZTY0dXJsXCIpXG4gIH1cblxuICAvKiogRHJhaW5zIGFsbCB3b3JrIGFjY2VwdGVkIGJlZm9yZSBjYXBhYmlsaXR5IHJldm9jYXRpb24uICovXG4gIGFzeW5jIGRyYWluKCkge1xuICAgIGlmICh0aGlzLmFjY2VwdGluZykgdGhyb3cgbmV3IEVycm9yKFwiU2hhcmVkIHRyYW5zYWN0aW9uIGJyb2tlciBtdXN0IGJlIHJldm9rZWQgYmVmb3JlIGRyYWluXCIpXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbSh0aGlzLmNvbm5lY3Rpb25TdGF0ZXMudmFsdWVzKCkpLm1hcCgoc3RhdGUpID0+IHN0YXRlLnF1ZXVlKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBkZXRlcm1pbmlzdGljIHRyYW5zcG9ydCBzaHV0ZG93biBhbmQgcmVwb3J0cyBjbGVhbnVwIGZhaWx1cmVzIGxhc3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIHNodXRkb3duIG9yIHJlamVjdHMgd2l0aCBjbGVhbnVwIGVycm9ycy5cbiAgICovXG4gIGFzeW5jIGNsb3NlVHJhbnNwb3J0KCkge1xuICAgIHRoaXMucmV2b2tlKClcbiAgICBjb25zdCBjbG9zaW5nU2Vzc2lvbnMgPSBBcnJheS5mcm9tKHRoaXMuc2Vzc2lvbnMpXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoY2xvc2luZ1Nlc3Npb25zLm1hcChhc3luYyAoc29ja2V0KSA9PiBhd2FpdCB0aGlzLnNjaGVkdWxlU2Vzc2lvbkNsZWFudXAoc29ja2V0KSkpXG4gICAgYXdhaXQgdGhpcy5kcmFpbigpXG4gICAgZm9yIChjb25zdCBzb2NrZXQgb2YgY2xvc2luZ1Nlc3Npb25zKSBzb2NrZXQuY2xvc2UoMTAwMSwgXCJTaGFyZWQgdHJhbnNhY3Rpb24gYnJva2VyIGNsb3NlZFwiKVxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB0aGlzLndlYnNvY2tldFNlcnZlci5jbG9zZSgoKSA9PiByZXNvbHZlKHVuZGVmaW5lZCkpKVxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB0aGlzLmh0dHBTZXJ2ZXIuY2xvc2UoKCkgPT4gcmVzb2x2ZSh1bmRlZmluZWQpKSlcbiAgICBhd2FpdCBQcm9taXNlLmFsbChBcnJheS5mcm9tKHRoaXMuc2Vzc2lvbkNsZWFudXAudmFsdWVzKCkpKVxuICAgIGZvciAoY29uc3QgW2Nvbm5lY3Rpb24sIGNvb3JkaW5hdG9yXSBvZiB0aGlzLmNvbm5lY3Rpb25Db29yZGluYXRvcnMpIHtcbiAgICAgIGNsZWFyU2hhcmVkVHJhbnNhY3Rpb25Db29yZGluYXRvcihjb25uZWN0aW9uLCBjb29yZGluYXRvcilcbiAgICB9XG4gICAgaWYgKHRoaXMuY2xlYW51cEVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgQWdncmVnYXRlRXJyb3IodGhpcy5jbGVhbnVwRXJyb3JzLCBgU2hhcmVkIHRyYW5zYWN0aW9uIGJyb2tlciBjbGVhbnVwIGZhaWxlZDogJHt0aGlzLmNsZWFudXBFcnJvcnMubWFwKChlcnJvcikgPT4gZXJyb3IubWVzc2FnZSkuam9pbihcIjsgXCIpfWApXG4gICAgfVxuICB9XG59XG4iXX0=
@@ -2,6 +2,8 @@ export type CoordinatorRegistration = {
2
2
  coordinator: (callback: () => Promise<unknown>) => Promise<unknown>;
3
3
  ownedQueue: Promise<void>;
4
4
  owner: symbol;
5
+ reentrantOwners: Set<symbol>;
6
+ rootOwners: Set<symbol>;
5
7
  };
6
8
  /**
7
9
  * Registers test-only serialization owned by the active broker.
@@ -1 +1 @@
1
- {"version":3,"file":"shared-transaction-connection-coordinator.d.ts","sourceRoot":"","sources":["../../../src/testing/shared-transaction-connection-coordinator.js"],"names":[],"mappings":"AAEI,YAA2H,uBAAuB,GAAxI;IAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAAyB;AA6BtJ;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAAC,UAAU,EAJ/C,MAI+C,EAAE,WAAW,EAH5D,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAGO,GAF1D,MAAM,CAOlB;AAED;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAAC,UAAU,EAJjD,MAIiD,EAAE,WAAW,EAH9D,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAGS,GAF5D,IAAI,CAIhB;AAED;;;;;;;GAOG;AACH,wBAAsB,qCAAqC,CAN9C,CAAC,EAM8C,UAAU,EAL3D,OAAO,6BAA6B,EAAE,OAKqB,EAAE,QAAQ,EAJrE,MAAM,OAAO,CAAC,CAAC,CAIsD,EAAE,cAAc,AAH7F,CACA,EADQ,MAGqF,GAFnF,OAAO,CAAC,CAAC,CAAC,CAiBtB"}
1
+ {"version":3,"file":"shared-transaction-connection-coordinator.d.ts","sourceRoot":"","sources":["../../../src/testing/shared-transaction-connection-coordinator.js"],"names":[],"mappings":"AAEI,YAAkL,uBAAuB,GAA/L;IAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAAC,CAAyB;AAkF7M;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAAC,UAAU,EAJ/C,MAI+C,EAAE,WAAW,EAH5D,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAGO,GAF1D,MAAM,CAgBlB;AAED;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAAC,UAAU,EAJjD,MAIiD,EAAE,WAAW,EAH9D,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAGS,GAF5D,IAAI,CAShB;AAED;;;;;;;GAOG;AACH,wBAAsB,qCAAqC,CAN9C,CAAC,EAM8C,UAAU,EAL3D,OAAO,6BAA6B,EAAE,OAKqB,EAAE,QAAQ,EAJrE,MAAM,OAAO,CAAC,CAAC,CAIsD,EAAE,cAAc,AAH7F,CACA,EADQ,MAGqF,GAFnF,OAAO,CAAC,CAAC,CAAC,CAuBtB"}