velocious 1.0.299 → 1.0.301

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 (59) hide show
  1. package/build/src/configuration-types.d.ts +1 -1
  2. package/build/src/configuration.d.ts +1 -1
  3. package/build/src/database/drivers/base.d.ts +29 -0
  4. package/build/src/database/drivers/base.d.ts.map +1 -1
  5. package/build/src/database/drivers/base.js +25 -1
  6. package/build/src/database/drivers/mssql/index.d.ts.map +1 -1
  7. package/build/src/database/drivers/mssql/index.js +10 -1
  8. package/build/src/database/drivers/mssql/sql/upsert.d.ts +5 -0
  9. package/build/src/database/drivers/mssql/sql/upsert.d.ts.map +1 -0
  10. package/build/src/database/drivers/mssql/sql/upsert.js +19 -0
  11. package/build/src/database/drivers/mysql/index.d.ts.map +1 -1
  12. package/build/src/database/drivers/mysql/index.js +10 -1
  13. package/build/src/database/drivers/mysql/sql/upsert.d.ts +5 -0
  14. package/build/src/database/drivers/mysql/sql/upsert.d.ts.map +1 -0
  15. package/build/src/database/drivers/mysql/sql/upsert.js +11 -0
  16. package/build/src/database/drivers/pgsql/index.d.ts.map +1 -1
  17. package/build/src/database/drivers/pgsql/index.js +10 -1
  18. package/build/src/database/drivers/pgsql/sql/upsert.d.ts +5 -0
  19. package/build/src/database/drivers/pgsql/sql/upsert.d.ts.map +1 -0
  20. package/build/src/database/drivers/pgsql/sql/upsert.js +12 -0
  21. package/build/src/database/drivers/sqlite/base.d.ts.map +1 -1
  22. package/build/src/database/drivers/sqlite/base.js +7 -1
  23. package/build/src/database/drivers/sqlite/sql/upsert.d.ts +5 -0
  24. package/build/src/database/drivers/sqlite/sql/upsert.d.ts.map +1 -0
  25. package/build/src/database/drivers/sqlite/sql/upsert.js +12 -0
  26. package/build/src/database/query/upsert-base.d.ts +59 -0
  27. package/build/src/database/query/upsert-base.d.ts.map +1 -0
  28. package/build/src/database/query/upsert-base.js +87 -0
  29. package/build/src/frontend-model-controller.d.ts.map +1 -1
  30. package/build/src/frontend-model-controller.js +8 -3
  31. package/build/src/frontend-models/websocket-channel.d.ts +9 -1
  32. package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
  33. package/build/src/frontend-models/websocket-channel.js +17 -3
  34. package/build/src/http-client/websocket-client.d.ts +8 -6
  35. package/build/src/http-client/websocket-client.d.ts.map +1 -1
  36. package/build/src/http-client/websocket-client.js +17 -8
  37. package/build/src/http-server/client/websocket-session.d.ts +62 -5
  38. package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
  39. package/build/src/http-server/client/websocket-session.js +129 -14
  40. package/build/src/http-server/websocket-channel.d.ts +18 -3
  41. package/build/src/http-server/websocket-channel.d.ts.map +1 -1
  42. package/build/src/http-server/websocket-channel.js +18 -6
  43. package/build/src/http-server/websocket-event-log-store.d.ts +198 -0
  44. package/build/src/http-server/websocket-event-log-store.d.ts.map +1 -0
  45. package/build/src/http-server/websocket-event-log-store.js +308 -0
  46. package/build/src/http-server/websocket-events-host.d.ts +14 -0
  47. package/build/src/http-server/websocket-events-host.d.ts.map +1 -1
  48. package/build/src/http-server/websocket-events-host.js +38 -4
  49. package/build/src/http-server/worker-handler/in-process.d.ts +5 -1
  50. package/build/src/http-server/worker-handler/in-process.d.ts.map +1 -1
  51. package/build/src/http-server/worker-handler/in-process.js +10 -3
  52. package/build/src/http-server/worker-handler/index.d.ts +5 -1
  53. package/build/src/http-server/worker-handler/index.d.ts.map +1 -1
  54. package/build/src/http-server/worker-handler/index.js +5 -3
  55. package/build/src/http-server/worker-handler/worker-thread.d.ts +9 -1
  56. package/build/src/http-server/worker-handler/worker-thread.d.ts.map +1 -1
  57. package/build/src/http-server/worker-handler/worker-thread.js +16 -6
  58. package/build/tsconfig.tsbuildinfo +1 -1
  59. package/package.json +1 -1
@@ -3,12 +3,20 @@ export default class FrontendModelWebsocketChannel extends WebsocketChannel {
3
3
  /**
4
4
  * @param {object} args - Event args.
5
5
  * @param {string} args.channel - Broadcast channel.
6
+ * @param {string} [args.createdAt] - Event creation timestamp.
7
+ * @param {string} [args.eventId] - Event id.
6
8
  * @param {Record<string, any>} args.payload - Event payload.
9
+ * @param {boolean} [args.replayed] - Whether this event was replayed.
10
+ * @param {number} [args.sequence] - Event sequence.
7
11
  * @returns {Promise<void>} - Resolves when the event has been authorized and emitted.
8
12
  */
9
- receivedBroadcast({ channel, payload }: {
13
+ receivedBroadcast({ channel, createdAt, eventId, payload, replayed, sequence }: {
10
14
  channel: string;
15
+ createdAt?: string | undefined;
16
+ eventId?: string | undefined;
11
17
  payload: Record<string, any>;
18
+ replayed?: boolean | undefined;
19
+ sequence?: number | undefined;
12
20
  }): Promise<void>;
13
21
  /**
14
22
  * @param {string | number} id - Model id.
@@ -1 +1 @@
1
- {"version":3,"file":"websocket-channel.d.ts","sourceRoot":"","sources":["../../../src/frontend-models/websocket-channel.js"],"names":[],"mappings":"AASA,sEAAsE;AACtE;IAaE;;;;;OAKG;IACH,wCAJG;QAAqB,OAAO,EAApB,MAAM;QACoB,OAAO,EAAjC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;KAC3B,GAAU,OAAO,CAAC,IAAI,CAAC,CAoDzB;IAED;;;OAGG;IACH,4BAHW,MAAM,GAAG,MAAM,GACb,OAAO,CAAC,OAAO,6BAA6B,EAAE,OAAO,GAAG,IAAI,CAAC,CAgBzE;IAED;;;OAGG;IACH,sBAHW,OAAO,6BAA6B,EAAE,OAAO,GAC3C,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAgBxC;IAED;;OAEG;IACH,2BAFa,uBAAuB,CAYnC;IAED;;OAEG;IACH,aAFa,MAAM,CAUlB;IAED;;OAEG;IACH,mBAFa,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAS/B;IAED;;OAEG;IACH,oBAFa,gBAAgB,CAU5B;CACF;6BAxK4B,qCAAqC;oCAH9B,iCAAiC;6BAExC,4CAA4C"}
1
+ {"version":3,"file":"websocket-channel.d.ts","sourceRoot":"","sources":["../../../src/frontend-models/websocket-channel.js"],"names":[],"mappings":"AASA,sEAAsE;AACtE;IAeE;;;;;;;;;OASG;IACH,gFARG;QAAqB,OAAO,EAApB,MAAM;QACQ,SAAS;QACT,OAAO;QACK,OAAO,EAAjC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;QACJ,QAAQ;QACT,QAAQ;KAC9B,GAAU,OAAO,CAAC,IAAI,CAAC,CA4DzB;IAED;;;OAGG;IACH,4BAHW,MAAM,GAAG,MAAM,GACb,OAAO,CAAC,OAAO,6BAA6B,EAAE,OAAO,GAAG,IAAI,CAAC,CAgBzE;IAED;;;OAGG;IACH,sBAHW,OAAO,6BAA6B,EAAE,OAAO,GAC3C,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAgBxC;IAED;;OAEG;IACH,2BAFa,uBAAuB,CAYnC;IAED;;OAEG;IACH,aAFa,MAAM,CAUlB;IAED;;OAEG;IACH,mBAFa,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAS/B;IAED;;OAEG;IACH,oBAFa,gBAAgB,CAU5B;CACF;6BAtL4B,qCAAqC;oCAH9B,iCAAiC;6BAExC,4CAA4C"}
@@ -10,7 +10,9 @@ export default class FrontendModelWebsocketChannel extends WebsocketChannel {
10
10
  /** @returns {Promise<void>} - Resolves when the websocket subscription is ready. */
11
11
  async subscribed() {
12
12
  const modelName = this.modelName();
13
- await this.streamFrom(frontendModelBroadcastChannelName(modelName), { acknowledge: false });
13
+ const subscribed = await this.streamFrom(frontendModelBroadcastChannelName(modelName), { acknowledge: false });
14
+ if (!subscribed)
15
+ return;
14
16
  this.websocketSession.sendJson({
15
17
  channel: "frontend-models",
16
18
  params: { model: modelName },
@@ -20,10 +22,14 @@ export default class FrontendModelWebsocketChannel extends WebsocketChannel {
20
22
  /**
21
23
  * @param {object} args - Event args.
22
24
  * @param {string} args.channel - Broadcast channel.
25
+ * @param {string} [args.createdAt] - Event creation timestamp.
26
+ * @param {string} [args.eventId] - Event id.
23
27
  * @param {Record<string, any>} args.payload - Event payload.
28
+ * @param {boolean} [args.replayed] - Whether this event was replayed.
29
+ * @param {number} [args.sequence] - Event sequence.
24
30
  * @returns {Promise<void>} - Resolves when the event has been authorized and emitted.
25
31
  */
26
- async receivedBroadcast({ channel, payload }) {
32
+ async receivedBroadcast({ channel, createdAt, eventId, payload, replayed, sequence }) {
27
33
  void channel;
28
34
  const action = payload?.action;
29
35
  const id = payload?.id;
@@ -36,11 +42,15 @@ export default class FrontendModelWebsocketChannel extends WebsocketChannel {
36
42
  if (action === "destroy") {
37
43
  this.websocketSession.sendJson({
38
44
  channel: "frontend-models",
45
+ createdAt,
46
+ eventId,
39
47
  payload: serializeFrontendModelTransportValue({
40
48
  action,
41
49
  id,
42
50
  model: this.modelName()
43
51
  }),
52
+ replayed,
53
+ sequence,
44
54
  type: "event"
45
55
  });
46
56
  return;
@@ -58,12 +68,16 @@ export default class FrontendModelWebsocketChannel extends WebsocketChannel {
58
68
  return;
59
69
  this.websocketSession.sendJson({
60
70
  channel: "frontend-models",
71
+ createdAt,
72
+ eventId,
61
73
  payload: serializeFrontendModelTransportValue({
62
74
  action,
63
75
  id,
64
76
  model: this.modelName(),
65
77
  record: serializedModel
66
78
  }),
79
+ replayed,
80
+ sequence,
67
81
  type: "event"
68
82
  });
69
83
  }
@@ -149,4 +163,4 @@ export default class FrontendModelWebsocketChannel extends WebsocketChannel {
149
163
  });
150
164
  }
151
165
  }
152
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNoYW5uZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZnJvbnRlbmQtbW9kZWxzL3dlYnNvY2tldC1jaGFubmVsLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLHVCQUF1QixNQUFNLGlDQUFpQyxDQUFBO0FBQ3JFLE9BQU8sUUFBUSxNQUFNLG1DQUFtQyxDQUFBO0FBQ3hELE9BQU8sZ0JBQWdCLE1BQU0sNENBQTRDLENBQUE7QUFDekUsT0FBTyxnQkFBZ0IsTUFBTSxxQ0FBcUMsQ0FBQTtBQUNsRSxPQUFPLEVBQUMsaUNBQWlDLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQTtBQUMzRSxPQUFPLEVBQUMsb0NBQW9DLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQTtBQUVqRixzRUFBc0U7QUFDdEUsTUFBTSxDQUFDLE9BQU8sT0FBTyw2QkFBOEIsU0FBUSxnQkFBZ0I7SUFDekUsb0ZBQW9GO0lBQ3BGLEtBQUssQ0FBQyxVQUFVO1FBQ2QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFBO1FBRWxDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQ0FBaUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO1FBQ3pGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUM7WUFDN0IsT0FBTyxFQUFFLGlCQUFpQjtZQUMxQixNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsU0FBUyxFQUFDO1lBQzFCLElBQUksRUFBRSxZQUFZO1NBQ25CLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxFQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUM7UUFDeEMsS0FBSyxPQUFPLENBQUE7UUFFWixNQUFNLE1BQU0sR0FBRyxPQUFPLEVBQUUsTUFBTSxDQUFBO1FBQzlCLE1BQU0s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SSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsNkJBQTZCO1NBQzVFLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVM7UUFDUCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFBO1FBRWpDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbEQsTUFBTSxJQUFJLEtBQUssQ0FBQyw4REFBOEQsQ0FBQyxDQUFBO1FBQ2pGLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNILGVBQWU7UUFDYixPQUFPO1lBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDdkIsUUFBUSxFQUFFLENBQUM7b0JBQ1QsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUU7aUJBQ3hCLENBQUM7U0FDSCxDQUFBO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLGdCQUFnQixDQUFDO1lBQzFCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRTtZQUN4QyxNQUFNLEVBQUUsTUFBTTtZQUNkLE1BQU0sRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQzlCLElBQUksRUFBRSxrQkFBa0I7WUFDeEIsYUFBYSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLEVBQUU7U0FDL0MsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBGcm9udGVuZE1vZGVsQ29udHJvbGxlciBmcm9tIFwiLi4vZnJvbnRlbmQtbW9kZWwtY29udHJvbGxlci5qc1wiXG5pbXBvcnQgUmVzcG9uc2UgZnJvbSBcIi4uL2h0dHAtc2VydmVyL2NsaWVudC9yZXNwb25zZS5qc1wiXG5pbXBvcnQgV2Vic29ja2V0UmVxdWVzdCBmcm9tIFwiLi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1yZXF1ZXN0LmpzXCJcbmltcG9ydCBXZWJzb2NrZXRDaGFubmVsIGZyb20gXCIuLi9odHRwLXNlcnZlci93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiXG5pbXBvcnQge2Zyb250ZW5kTW9kZWxCcm9hZGNhc3RDaGFubmVsTmFtZX0gZnJvbSBcIi4vd2Vic29ja2V0LXB1Ymxpc2hlcnMuanNcIlxuaW1wb3J0IHtzZXJpYWxpemVGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWV9IGZyb20gXCIuL3RyYW5zcG9ydC1zZXJpYWxpemF0aW9uLmpzXCJcblxuLyoqIEJ1aWx0LWluIHdlYnNvY2tldCBjaGFubmVsIGZvciBmcm9udGVuZC1tb2RlbCBsaWZlY3ljbGUgZXZlbnRzLiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRnJvbnRlbmRNb2RlbFdlYnNvY2tldENoYW5uZWwgZXh0ZW5kcyBXZWJzb2NrZXRDaGFubmVsIHtcbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gdGhlIHdlYnNvY2tldCBzdWJzY3JpcHRpb24gaXMgcmVhZHkuICovXG4gIGFzeW5jIHN1YnNjcmliZWQoKSB7XG4gICAgY29uc3QgbW9kZWxOYW1lID0gdGhpcy5tb2RlbE5hbWUoKVxuXG4gICAgYXdhaXQgdGhpcy5zdHJlYW1Gcm9tKGZyb250ZW5kTW9kZWxCcm9hZGNhc3RDaGFubmVsTmFtZShtb2RlbE5hbWUpLCB7YWNrbm93bGVkZ2U6IGZhbHNlfSlcbiAgICB0aGlzLndlYnNvY2tldFNlc3Npb24uc2VuZEpzb24oe1xuICAgICAgY2hhbm5lbDogXCJmcm9udGVuZC1tb2RlbHNcIixcbiAgICAgIHBhcmFtczoge21vZGVsOiBtb2RlbE5hbWV9LFxuICAgICAgdHlwZTogXCJzdWJzY3JpYmVkXCJcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gRXZlbnQgYXJncy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2hhbm5lbCAtIEJyb2FkY2FzdCBjaGFubmVsLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGFyZ3MucGF5bG9hZCAtIEV2ZW50IHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gdGhlIGV2ZW50IGhhcyBiZWVuIGF1dGhvcml6ZWQgYW5kIGVtaXR0ZWQuXG4gICAqL1xuICBhc3luYyByZWNlaXZlZEJyb2FkY2FzdCh7Y2hhbm5lbCwgcGF5bG9hZH0pIHtcbiAgICB2b2lkIGNoYW5uZWxcblxuICAgIGNvbnN0IGFjdGlvbiA9IHBheWxvYWQ/LmFjdGlvblxuICAgIGNvbnN0IGlkID0gcGF5bG9hZD8uaWRcblxuICAgIGlmIChhY3Rpb24gIT09IFwiY3JlYXRlXCIgJiYgYWN0aW9uICE9PSBcImRlc3Ryb3lcIiAmJiBhY3Rpb24gIT09IFwidXBkYXRlXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBmcm9udGVuZCBtb2RlbCBicm9hZGNhc3QgYWN0aW9uOiAke2FjdGlvbn1gKVxuICAgIH1cblxuICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZyb250ZW5kIG1vZGVsIGJyb2FkY2FzdCBtaXNzaW5nIGlkIGZvciBhY3Rpb246ICR7YWN0aW9ufWApXG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbiA9PT0gXCJkZXN0cm95XCIpIHtcbiAgICAgIHRoaXMud2Vic29ja2V0U2Vzc2lvbi5zZW5kSnNvbih7XG4gICAgICAgIGNoYW5uZWw6IFwiZnJvbnRlbmQtbW9kZWxzXCIsXG4gICAgICAgIHBheWxvYWQ6IHNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZSh7XG4gICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgIGlkLFxuICAgICAgICAgIG1vZGVsOiB0aGlzLm1vZGVsTmFtZSgpXG4gICAgICAgIH0pLFxuICAgICAgICB0eXBlOiBcImV2ZW50XCJcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzZXJpYWxpemVkTW9kZWxGcm9tUGF5bG9hZCA9IHBheWxvYWQ/LnJlY29yZCAmJiB0eXBlb2YgcGF5bG9hZC5yZWNvcmQgPT09IFwib2JqZWN0XCJcbiAgICAgID8gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqLyAocGF5bG9hZC5yZWNvcmQpXG4gICAgICA6IG51bGxcbiAgICBjb25zdCBzZXJpYWxpemVkTW9kZWwgPSBzZXJpYWxpemVkTW9kZWxGcm9tUGF5bG9hZCB8fCBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBhd2FpdCB0aGlzLmZpbmRBdXRob3JpemVkTW9kZWxCeUlkKGlkKVxuXG4gICAgICBpZiAoIW1vZGVsKSByZXR1cm4gbnVsbFxuXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXJpYWxpemVNb2RlbChtb2RlbClcbiAgICB9KSgpXG5cbiAgICBpZiAoIXNlcmlhbGl6ZWRNb2RlbCkgcmV0dXJuXG5cbiAgICB0aGlzLndlYnNvY2tldFNlc3Npb24uc2VuZEpzb24oe1xuICAgICAgY2hhbm5lbDogXCJmcm9udGVuZC1tb2RlbHNcIixcbiAgICAgIHBheWxvYWQ6IHNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZSh7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgaWQsXG4gICAgICAgIG1vZGVsOiB0aGlzLm1vZGVsTmFtZSgpLFxuICAgICAgICByZWNvcmQ6IHNlcmlhbGl6ZWRNb2RlbFxuICAgICAgfSksXG4gICAgICB0eXBlOiBcImV2ZW50XCJcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIE1vZGVsIGlkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IG51bGw+fSAtIEF1dGhvcml6ZWQgbW9kZWwgb3IgbnVsbC5cbiAgICovXG4gIGFzeW5jIGZpbmRBdXRob3JpemVkTW9kZWxCeUlkKGlkKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IHRoaXMuZnJvbnRlbmRNb2RlbENvbnRyb2xsZXIoKVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5lbnN1cmVDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBhYmlsaXR5ID0gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJlc29sdmVBYmlsaXR5KHtcbiAgICAgICAgcGFyYW1zOiB0aGlzLnN5bnRoZXRpY1BhcmFtcygpLFxuICAgICAgICByZXF1ZXN0OiB0aGlzLnN5bnRoZXRpY1JlcXVlc3QoKSxcbiAgICAgICAgcmVzcG9uc2U6IG5ldyBSZXNwb25zZSh7Y29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9ufSlcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aEFiaWxpdHkoYWJpbGl0eSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgY29udHJvbGxlci5mcm9udGVuZE1vZGVsQXV0aG9yaXplZFF1ZXJ5KFwiZmluZFwiKS5maW5kQnkoe1tjb250cm9sbGVyLmZyb250ZW5kTW9kZWxQcmltYXJ5S2V5KCldOiBpZH0pXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gbW9kZWwgLSBNb2RlbCBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IC0gU2VyaWFsaXplZCBtb2RlbCBwYXlsb2FkLlxuICAgKi9cbiAgYXN5bmMgc2VyaWFsaXplTW9kZWwobW9kZWwpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gdGhpcy5mcm9udGVuZE1vZGVsQ29udHJvbGxlcigpXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmVuc3VyZUNvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGFiaWxpdHkgPSBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucmVzb2x2ZUFiaWxpdHkoe1xuICAgICAgICBwYXJhbXM6IHRoaXMuc3ludGhldGljUGFyYW1zKCksXG4gICAgICAgIHJlcXVlc3Q6IHRoaXMuc3ludGhldGljUmVxdWVzdCgpLFxuICAgICAgICByZXNwb25zZTogbmV3IFJlc3BvbnNlKHtjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb259KVxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5ydW5XaXRoQWJpbGl0eShhYmlsaXR5LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBjb250cm9sbGVyLmZyb250ZW5kTW9kZWxSZXNvdXJjZUluc3RhbmNlKCkuc2VyaWFsaXplKG1vZGVsLCBcImZpbmRcIilcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbENvbnRyb2xsZXJ9IC0gU3ludGhldGljIGZyb250ZW5kLW1vZGVsIGNvbnRyb2xsZXIuXG4gICAqL1xuICBmcm9udGVuZE1vZGVsQ29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gbmV3IEZyb250ZW5kTW9kZWxDb250cm9sbGVyKHtcbiAgICAgIGFjdGlvbjogXCJmcm9udGVuZEFwaVwiLFxuICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgY29udHJvbGxlcjogXCJmcm9udGVuZC1tb2RlbHNcIixcbiAgICAgIHBhcmFtczogdGhpcy5zeW50aGV0aWNQYXJhbXMoKSxcbiAgICAgIHJlcXVlc3Q6IC8qKiBAdHlwZSB7YW55fSAqLyAodGhpcy5zeW50aGV0aWNSZXF1ZXN0KCkpLFxuICAgICAgcmVzcG9uc2U6IG5ldyBSZXNwb25zZSh7Y29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9ufSksXG4gICAgICB2aWV3UGF0aDogYCR7dGhpcy5jb25maWd1cmF0aW9uLmdldERpcmVjdG9yeSgpfS9zcmMvcm91dGVzL2Zyb250ZW5kLW1vZGVsc2BcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gUmVxdWVzdGVkIGZyb250ZW5kLW1vZGVsIG5hbWUuXG4gICAqL1xuICBtb2RlbE5hbWUoKSB7XG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLnBhcmFtcygpLm1vZGVsXG5cbiAgICBpZiAodHlwZW9mIG1vZGVsICE9PSBcInN0cmluZ1wiIHx8IG1vZGVsLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIGZyb250ZW5kLW1vZGVsIHdlYnNvY2tldCBzdWJzY3JpcHRpb24gcGFyYW0gJ21vZGVsJ1wiKVxuICAgIH1cblxuICAgIHJldHVybiBtb2RlbFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAtIFN5bnRoZXRpYyBwYXJhbXMgZm9yIGF1dGhvcml6YXRpb24gYW5kIHNlcmlhbGl6YXRpb24uXG4gICAqL1xuICBzeW50aGV0aWNQYXJhbXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZGVsOiB0aGlzLm1vZGVsTmFtZSgpLFxuICAgICAgcmVxdWVzdHM6IFt7XG4gICAgICAgIG1vZGVsOiB0aGlzLm1vZGVsTmFtZSgpXG4gICAgICB9XVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7V2Vic29ja2V0UmVxdWVzdH0gLSBTeW50aGV0aWMgc2hhcmVkIGZyb250ZW5kLW1vZGVsIHJlcXVlc3QuXG4gICAqL1xuICBzeW50aGV0aWNSZXF1ZXN0KCkge1xuICAgIHJldHVybiBuZXcgV2Vic29ja2V0UmVxdWVzdCh7XG4gICAgICBoZWFkZXJzOiB0aGlzLnJlcXVlc3Q/LmhlYWRlcnM/LigpIHx8IHt9LFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHBhcmFtczogdGhpcy5zeW50aGV0aWNQYXJhbXMoKSxcbiAgICAgIHBhdGg6IFwiL2Zyb250ZW5kLW1vZGVsc1wiLFxuICAgICAgcmVtb3RlQWRkcmVzczogdGhpcy5yZXF1ZXN0Py5yZW1vdGVBZGRyZXNzPy4oKVxuICAgIH0pXG4gIH1cbn1cbiJdfQ==
166
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNoYW5uZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZnJvbnRlbmQtbW9kZWxzL3dlYnNvY2tldC1jaGFubmVsLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLHVCQUF1QixNQUFNLGlDQUFpQyxDQUFBO0FBQ3JFLE9BQU8sUUFBUSxNQUFNLG1DQUFtQyxDQUFBO0FBQ3hELE9BQU8sZ0JBQWdCLE1BQU0sNENBQTRDLENBQUE7QUFDekUsT0FBTyxnQkFBZ0IsTUFBTSxxQ0FBcUMsQ0FBQTtBQUNsRSxPQUFPLEVBQUMsaUNBQWlDLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQTtBQUMzRSxPQUFPLEVBQUMsb0NBQW9DLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQTtBQUVqRixzRUFBc0U7QUFDdEUsTUFBTSxDQUFDLE9BQU8sT0FBTyw2QkFBOEIsU0FBUSxnQkFBZ0I7SUFDekUsb0ZBQW9GO0lBQ3BGLEtBQUssQ0FBQyxVQUFVO1FBQ2QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFBO1FBQ2xDLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQ0FBaUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO1FBRTVHLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTTtRQUV2QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO1lBQzdCLE9BQU8sRUFBRSxpQkFBaUI7WUFDMUIsTUFBTSxFQUFFLEVBQUMsS0FBSyxFQUFFLFNBQVMsRUFBQztZQUMxQixJQUFJLEVBQUUsWUFBWTtTQUNuQixDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEVBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFFB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c0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBGcm9udGVuZE1vZGVsQ29udHJvbGxlciBmcm9tIFwiLi4vZnJvbnRlbmQtbW9kZWwtY29udHJvbGxlci5qc1wiXG5pbXBvcnQgUmVzcG9uc2UgZnJvbSBcIi4uL2h0dHAtc2VydmVyL2NsaWVudC9yZXNwb25zZS5qc1wiXG5pbXBvcnQgV2Vic29ja2V0UmVxdWVzdCBmcm9tIFwiLi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1yZXF1ZXN0LmpzXCJcbmltcG9ydCBXZWJzb2NrZXRDaGFubmVsIGZyb20gXCIuLi9odHRwLXNlcnZlci93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiXG5pbXBvcnQge2Zyb250ZW5kTW9kZWxCcm9hZGNhc3RDaGFubmVsTmFtZX0gZnJvbSBcIi4vd2Vic29ja2V0LXB1Ymxpc2hlcnMuanNcIlxuaW1wb3J0IHtzZXJpYWxpemVGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWV9IGZyb20gXCIuL3RyYW5zcG9ydC1zZXJpYWxpemF0aW9uLmpzXCJcblxuLyoqIEJ1aWx0LWluIHdlYnNvY2tldCBjaGFubmVsIGZvciBmcm9udGVuZC1tb2RlbCBsaWZlY3ljbGUgZXZlbnRzLiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRnJvbnRlbmRNb2RlbFdlYnNvY2tldENoYW5uZWwgZXh0ZW5kcyBXZWJzb2NrZXRDaGFubmVsIHtcbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gdGhlIHdlYnNvY2tldCBzdWJzY3JpcHRpb24gaXMgcmVhZHkuICovXG4gIGFzeW5jIHN1YnNjcmliZWQoKSB7XG4gICAgY29uc3QgbW9kZWxOYW1lID0gdGhpcy5tb2RlbE5hbWUoKVxuICAgIGNvbnN0IHN1YnNjcmliZWQgPSBhd2FpdCB0aGlzLnN0cmVhbUZyb20oZnJvbnRlbmRNb2RlbEJyb2FkY2FzdENoYW5uZWxOYW1lKG1vZGVsTmFtZSksIHthY2tub3dsZWRnZTogZmFsc2V9KVxuXG4gICAgaWYgKCFzdWJzY3JpYmVkKSByZXR1cm5cblxuICAgIHRoaXMud2Vic29ja2V0U2Vzc2lvbi5zZW5kSnNvbih7XG4gICAgICBjaGFubmVsOiBcImZyb250ZW5kLW1vZGVsc1wiLFxuICAgICAgcGFyYW1zOiB7bW9kZWw6IG1vZGVsTmFtZX0sXG4gICAgICB0eXBlOiBcInN1YnNjcmliZWRcIlxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBFdmVudCBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jaGFubmVsIC0gQnJvYWRjYXN0IGNoYW5uZWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5jcmVhdGVkQXRdIC0gRXZlbnQgY3JlYXRpb24gdGltZXN0YW1wLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZXZlbnRJZF0gLSBFdmVudCBpZC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBhcmdzLnBheWxvYWQgLSBFdmVudCBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLnJlcGxheWVkXSAtIFdoZXRoZXIgdGhpcyBldmVudCB3YXMgcmVwbGF5ZWQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5zZXF1ZW5jZV0gLSBFdmVudCBzZXF1ZW5jZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiB0aGUgZXZlbnQgaGFzIGJlZW4gYXV0aG9yaXplZCBhbmQgZW1pdHRlZC5cbiAgICovXG4gIGFzeW5jIHJlY2VpdmVkQnJvYWRjYXN0KHtjaGFubmVsLCBjcmVhdGVkQXQsIGV2ZW50SWQsIHBheWxvYWQsIHJlcGxheWVkLCBzZXF1ZW5jZX0pIHtcbiAgICB2b2lkIGNoYW5uZWxcblxuICAgIGNvbnN0IGFjdGlvbiA9IHBheWxvYWQ/LmFjdGlvblxuICAgIGNvbnN0IGlkID0gcGF5bG9hZD8uaWRcblxuICAgIGlmIChhY3Rpb24gIT09IFwiY3JlYXRlXCIgJiYgYWN0aW9uICE9PSBcImRlc3Ryb3lcIiAmJiBhY3Rpb24gIT09IFwidXBkYXRlXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBmcm9udGVuZCBtb2RlbCBicm9hZGNhc3QgYWN0aW9uOiAke2FjdGlvbn1gKVxuICAgIH1cblxuICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZyb250ZW5kIG1vZGVsIGJyb2FkY2FzdCBtaXNzaW5nIGlkIGZvciBhY3Rpb246ICR7YWN0aW9ufWApXG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbiA9PT0gXCJkZXN0cm95XCIpIHtcbiAgICAgIHRoaXMud2Vic29ja2V0U2Vzc2lvbi5zZW5kSnNvbih7XG4gICAgICAgIGNoYW5uZWw6IFwiZnJvbnRlbmQtbW9kZWxzXCIsXG4gICAgICAgIGNyZWF0ZWRBdCxcbiAgICAgICAgZXZlbnRJZCxcbiAgICAgICAgcGF5bG9hZDogc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlKHtcbiAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgaWQsXG4gICAgICAgICAgbW9kZWw6IHRoaXMubW9kZWxOYW1lKClcbiAgICAgICAgfSksXG4gICAgICAgIHJlcGxheWVkLFxuICAgICAgICBzZXF1ZW5jZSxcbiAgICAgICAgdHlwZTogXCJldmVudFwiXG4gICAgICB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc2VyaWFsaXplZE1vZGVsRnJvbVBheWxvYWQgPSBwYXlsb2FkPy5yZWNvcmQgJiYgdHlwZW9mIHBheWxvYWQucmVjb3JkID09PSBcIm9iamVjdFwiXG4gICAgICA/IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi8gKHBheWxvYWQucmVjb3JkKVxuICAgICAgOiBudWxsXG4gICAgY29uc3Qgc2VyaWFsaXplZE1vZGVsID0gc2VyaWFsaXplZE1vZGVsRnJvbVBheWxvYWQgfHwgYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gYXdhaXQgdGhpcy5maW5kQXV0aG9yaXplZE1vZGVsQnlJZChpZClcblxuICAgICAgaWYgKCFtb2RlbCkgcmV0dXJuIG51bGxcblxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VyaWFsaXplTW9kZWwobW9kZWwpXG4gICAgfSkoKVxuXG4gICAgaWYgKCFzZXJpYWxpemVkTW9kZWwpIHJldHVyblxuXG4gICAgdGhpcy53ZWJzb2NrZXRTZXNzaW9uLnNlbmRKc29uKHtcbiAgICAgIGNoYW5uZWw6IFwiZnJvbnRlbmQtbW9kZWxzXCIsXG4gICAgICBjcmVhdGVkQXQsXG4gICAgICBldmVudElkLFxuICAgICAgcGF5bG9hZDogc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBpZCxcbiAgICAgICAgbW9kZWw6IHRoaXMubW9kZWxOYW1lKCksXG4gICAgICAgIHJlY29yZDogc2VyaWFsaXplZE1vZGVsXG4gICAgICB9KSxcbiAgICAgIHJlcGxheWVkLFxuICAgICAgc2VxdWVuY2UsXG4gICAgICB0eXBlOiBcImV2ZW50XCJcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIE1vZGVsIGlkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IG51bGw+fSAtIEF1dGhvcml6ZWQgbW9kZWwgb3IgbnVsbC5cbiAgICovXG4gIGFzeW5jIGZpbmRBdXRob3JpemVkTW9kZWxCeUlkKGlkKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IHRoaXMuZnJvbnRlbmRNb2RlbENvbnRyb2xsZXIoKVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5lbnN1cmVDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBhYmlsaXR5ID0gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJlc29sdmVBYmlsaXR5KHtcbiAgICAgICAgcGFyYW1zOiB0aGlzLnN5bnRoZXRpY1BhcmFtcygpLFxuICAgICAgICByZXF1ZXN0OiB0aGlzLnN5bnRoZXRpY1JlcXVlc3QoKSxcbiAgICAgICAgcmVzcG9uc2U6IG5ldyBSZXNwb25zZSh7Y29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9ufSlcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aEFiaWxpdHkoYWJpbGl0eSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgY29udHJvbGxlci5mcm9udGVuZE1vZGVsQXV0aG9yaXplZFF1ZXJ5KFwiZmluZFwiKS5maW5kQnkoe1tjb250cm9sbGVyLmZyb250ZW5kTW9kZWxQcmltYXJ5S2V5KCldOiBpZH0pXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gbW9kZWwgLSBNb2RlbCBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IC0gU2VyaWFsaXplZCBtb2RlbCBwYXlsb2FkLlxuICAgKi9cbiAgYXN5bmMgc2VyaWFsaXplTW9kZWwobW9kZWwpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gdGhpcy5mcm9udGVuZE1vZGVsQ29udHJvbGxlcigpXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmVuc3VyZUNvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGFiaWxpdHkgPSBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucmVzb2x2ZUFiaWxpdHkoe1xuICAgICAgICBwYXJhbXM6IHRoaXMuc3ludGhldGljUGFyYW1zKCksXG4gICAgICAgIHJlcXVlc3Q6IHRoaXMuc3ludGhldGljUmVxdWVzdCgpLFxuICAgICAgICByZXNwb25zZTogbmV3IFJlc3BvbnNlKHtjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb259KVxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5ydW5XaXRoQWJpbGl0eShhYmlsaXR5LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBjb250cm9sbGVyLmZyb250ZW5kTW9kZWxSZXNvdXJjZUluc3RhbmNlKCkuc2VyaWFsaXplKG1vZGVsLCBcImZpbmRcIilcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbENvbnRyb2xsZXJ9IC0gU3ludGhldGljIGZyb250ZW5kLW1vZGVsIGNvbnRyb2xsZXIuXG4gICAqL1xuICBmcm9udGVuZE1vZGVsQ29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gbmV3IEZyb250ZW5kTW9kZWxDb250cm9sbGVyKHtcbiAgICAgIGFjdGlvbjogXCJmcm9udGVuZEFwaVwiLFxuICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgY29udHJvbGxlcjogXCJmcm9udGVuZC1tb2RlbHNcIixcbiAgICAgIHBhcmFtczogdGhpcy5zeW50aGV0aWNQYXJhbXMoKSxcbiAgICAgIHJlcXVlc3Q6IC8qKiBAdHlwZSB7YW55fSAqLyAodGhpcy5zeW50aGV0aWNSZXF1ZXN0KCkpLFxuICAgICAgcmVzcG9uc2U6IG5ldyBSZXNwb25zZSh7Y29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9ufSksXG4gICAgICB2aWV3UGF0aDogYCR7dGhpcy5jb25maWd1cmF0aW9uLmdldERpcmVjdG9yeSgpfS9zcmMvcm91dGVzL2Zyb250ZW5kLW1vZGVsc2BcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gUmVxdWVzdGVkIGZyb250ZW5kLW1vZGVsIG5hbWUuXG4gICAqL1xuICBtb2RlbE5hbWUoKSB7XG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLnBhcmFtcygpLm1vZGVsXG5cbiAgICBpZiAodHlwZW9mIG1vZGVsICE9PSBcInN0cmluZ1wiIHx8IG1vZGVsLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIGZyb250ZW5kLW1vZGVsIHdlYnNvY2tldCBzdWJzY3JpcHRpb24gcGFyYW0gJ21vZGVsJ1wiKVxuICAgIH1cblxuICAgIHJldHVybiBtb2RlbFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAtIFN5bnRoZXRpYyBwYXJhbXMgZm9yIGF1dGhvcml6YXRpb24gYW5kIHNlcmlhbGl6YXRpb24uXG4gICAqL1xuICBzeW50aGV0aWNQYXJhbXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZGVsOiB0aGlzLm1vZGVsTmFtZSgpLFxuICAgICAgcmVxdWVzdHM6IFt7XG4gICAgICAgIG1vZGVsOiB0aGlzLm1vZGVsTmFtZSgpXG4gICAgICB9XVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7V2Vic29ja2V0UmVxdWVzdH0gLSBTeW50aGV0aWMgc2hhcmVkIGZyb250ZW5kLW1vZGVsIHJlcXVlc3QuXG4gICAqL1xuICBzeW50aGV0aWNSZXF1ZXN0KCkge1xuICAgIHJldHVybiBuZXcgV2Vic29ja2V0UmVxdWVzdCh7XG4gICAgICBoZWFkZXJzOiB0aGlzLnJlcXVlc3Q/LmhlYWRlcnM/LigpIHx8IHt9LFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHBhcmFtczogdGhpcy5zeW50aGV0aWNQYXJhbXMoKSxcbiAgICAgIHBhdGg6IFwiL2Zyb250ZW5kLW1vZGVsc1wiLFxuICAgICAgcmVtb3RlQWRkcmVzczogdGhpcy5yZXF1ZXN0Py5yZW1vdGVBZGRyZXNzPy4oKVxuICAgIH0pXG4gIH1cbn1cbiJdfQ==
@@ -114,25 +114,27 @@ export default class VelociousWebsocketClient {
114
114
  /**
115
115
  * Subscribe to a channel for server-sent events with optional params.
116
116
  * @param {string} channel - Channel name.
117
- * @param {{params?: Record<string, any>}} options - Subscription options.
118
- * @param {(payload: any) => void} callback - Callback function.
117
+ * @param {{lastEventId?: string, params?: Record<string, any>}} options - Subscription options.
118
+ * @param {(payload: any, message?: Record<string, any>) => void} callback - Callback function.
119
119
  * @returns {(() => void) & {ready: Promise<void>}} - Unsubscribe function with readiness promise.
120
120
  */
121
121
  subscribe(channel: string, options: {
122
+ lastEventId?: string;
122
123
  params?: Record<string, any>;
123
- }, callback: (payload: any) => void): (() => void) & {
124
+ }, callback: (payload: any, message?: Record<string, any>) => void): (() => void) & {
124
125
  ready: Promise<void>;
125
126
  };
126
127
  /**
127
128
  * Subscribe to a channel and wait until the server acknowledges the subscription.
128
129
  * @param {string} channel - Channel name.
129
- * @param {{params?: Record<string, any>}} options - Subscription options.
130
- * @param {(payload: any) => void} callback - Callback function.
130
+ * @param {{lastEventId?: string, params?: Record<string, any>}} options - Subscription options.
131
+ * @param {(payload: any, message?: Record<string, any>) => void} callback - Callback function.
131
132
  * @returns {Promise<(() => void) & {ready: Promise<void>}>} - Ready unsubscribe handle.
132
133
  */
133
134
  subscribeAndWait(channel: string, options: {
135
+ lastEventId?: string;
134
136
  params?: Record<string, any>;
135
- }, callback: (payload: any) => void): Promise<(() => void) & {
137
+ }, callback: (payload: any, message?: Record<string, any>) => void): Promise<(() => void) & {
136
138
  ready: Promise<void>;
137
139
  }>;
138
140
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"websocket-client.d.ts","sourceRoot":"","sources":["../../../src/http-client/websocket-client.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"websocket-client.d.ts","sourceRoot":"","sources":["../../../src/http-client/websocket-client.js"],"names":[],"mappings":"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"}
@@ -166,12 +166,13 @@ export default class VelociousWebsocketClient {
166
166
  /**
167
167
  * Subscribe to a channel for server-sent events with optional params.
168
168
  * @param {string} channel - Channel name.
169
- * @param {{params?: Record<string, any>}} options - Subscription options.
170
- * @param {(payload: any) => void} callback - Callback function.
169
+ * @param {{lastEventId?: string, params?: Record<string, any>}} options - Subscription options.
170
+ * @param {(payload: any, message?: Record<string, any>) => void} callback - Callback function.
171
171
  * @returns {(() => void) & {ready: Promise<void>}} - Unsubscribe function with readiness promise.
172
172
  */
173
173
  subscribe(channel, options, callback) {
174
174
  const params = options?.params;
175
+ const lastEventId = options?.lastEventId;
175
176
  const subscriptionKey = this._subscriptionKey(channel, params);
176
177
  if (!this.listeners.has(subscriptionKey)) {
177
178
  /** @type {(() => void) | undefined} */
@@ -194,7 +195,7 @@ export default class VelociousWebsocketClient {
194
195
  resolve: resolveReady || (() => { })
195
196
  });
196
197
  void this.connect().then(() => {
197
- this._sendMessage({ channel, params, type: "subscribe" });
198
+ this._sendMessage({ channel, lastEventId, params, type: "subscribe" });
198
199
  }).catch((error) => this._debug("Subscribe failed", error));
199
200
  }
200
201
  const listenerEntry = this.listeners.get(subscriptionKey);
@@ -213,8 +214,8 @@ export default class VelociousWebsocketClient {
213
214
  /**
214
215
  * Subscribe to a channel and wait until the server acknowledges the subscription.
215
216
  * @param {string} channel - Channel name.
216
- * @param {{params?: Record<string, any>}} options - Subscription options.
217
- * @param {(payload: any) => void} callback - Callback function.
217
+ * @param {{lastEventId?: string, params?: Record<string, any>}} options - Subscription options.
218
+ * @param {(payload: any, message?: Record<string, any>) => void} callback - Callback function.
218
219
  * @returns {Promise<(() => void) & {ready: Promise<void>}>} - Ready unsubscribe handle.
219
220
  */
220
221
  async subscribeAndWait(channel, options, callback) {
@@ -289,9 +290,9 @@ export default class VelociousWebsocketClient {
289
290
  for (const listenerEntry of this.listeners.values()) {
290
291
  if (listenerEntry.channel !== channel)
291
292
  continue;
292
- listenerEntry.callbacks.forEach((/** @type {(payload: any) => void} */ callback) => {
293
+ listenerEntry.callbacks.forEach((/** @type {(payload: any, message?: Record<string, any>) => void} */ callback) => {
293
294
  try {
294
- callback(payload);
295
+ callback(payload, message);
295
296
  }
296
297
  catch (error) {
297
298
  this._debug("Listener error", error);
@@ -299,6 +300,14 @@ export default class VelociousWebsocketClient {
299
300
  });
300
301
  }
301
302
  }
303
+ else if (type === "replay-gap") {
304
+ const subscriptionKey = this._subscriptionKey(message.channel, message.params);
305
+ const pendingSubscription = this.pendingSubscriptions.get(subscriptionKey);
306
+ if (pendingSubscription) {
307
+ this.pendingSubscriptions.delete(subscriptionKey);
308
+ pendingSubscription.reject(new Error(`Replay gap for ${message.channel}`));
309
+ }
310
+ }
302
311
  else if (type === "error" && message.id) {
303
312
  const pending = this.pendingRequests.get(message.id);
304
313
  if (pending) {
@@ -434,4 +443,4 @@ class VelociousWebsocketResponse {
434
443
  return JSON.parse(this.body);
435
444
  }
436
445
  }
437
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9odHRwLWNsaWVudC93ZWJzb2NrZXQtY2xpZW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixNQUFNLHdCQUF3QixHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFBO0FBRWhFOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sd0JBQXdCO0lBQzNDLHVIQUF1SDtJQUN2SCxlQUFlLENBQUE7SUFDZiwrRkFBK0Y7SUFDL0Ysb0JBQW9CLENBQUE7SUFDcEIsb0pBQW9KO0lBQ3BKLFNBQVMsQ0FBQTtJQUVUOzs7Ozs7T0FNRztJQUNILFlBQVksRUFBQyxhQUFhLEdBQUcsS0FBSyxFQUFFLEtBQUssR0FBRyxLQUFLLEVBQUUsZUFBZSxFQUFFLEdBQUcsRUFBQyxHQUFHLEVBQUU7UUFDM0UsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFBO1FBRS9FLHNCQUFzQjtRQUN0QixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQTtRQUNsQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtRQUNsQiw0QkFBNEI7UUFDNUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQTtRQUM3QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7UUFDaEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7UUFDckMscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUE7UUFDekIsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxJQUFJLHdCQUF3QixDQUFBO1FBQ2xFLG1EQUFtRDtRQUNuRCxJ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VF9SRUNPTk5FQ1RfREVMQVlTID0gWzEwMDAsIDIwMDAsIDQwMDAsIDgwMDAsIDE1MDAwXVxuXG4vKipcbiAqIEEgc21hbGwgd2Vic29ja2V0IGNsaWVudCB0aGF0IG1pcnJvcnMgc2ltcGxlIEhUVFAtc3R5bGUgY2FsbHMgYW5kIGNoYW5uZWwgc3Vic2NyaXB0aW9ucy5cbiAqIFN1cHBvcnRzIG9wdGlvbmFsIGF1dG8tcmVjb25uZWN0IHdpdGggZXhwb25lbnRpYWwgYmFja29mZiBhbmQgbGlzdGVuZXIgcmUtc3Vic2NyaXB0aW9uLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnQge1xuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIHtyZWplY3Q6IChlcnJvcjogdW5rbm93bikgPT4gdm9pZCwgcmVzb2x2ZTogKHJlc3BvbnNlOiBWZWxvY2lvdXNXZWJzb2NrZXRSZXNwb25zZSkgPT4gdm9pZH0+fSAqL1xuICBwZW5kaW5nUmVxdWVzdHNcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCB7cmVqZWN0OiAoZXJyb3I6IHVua25vd24pID0+IHZvaWQsIHJlc29sdmU6ICh2YWx1ZT86IHZvaWQpID0+IHZvaWR9Pn0gKi9cbiAgcGVuZGluZ1N1YnNjcmlwdGlvbnNcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCB7Y2FsbGJhY2tzOiBTZXQ8KHBheWxvYWQ6IGFueSkgPT4gdm9pZD4sIGNoYW5uZWw6IHN0cmluZywgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkLCByZWFkeTogUHJvbWlzZTx2b2lkPn0+fSAqL1xuICBsaXN0ZW5lcnNcblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IFthcmdzXSAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmF1dG9SZWNvbm5lY3RdIC0gRW5hYmxlIGF1dG8tcmVjb25uZWN0IHdpdGggZXhwb25lbnRpYWwgYmFja29mZi5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy5kZWJ1Z10gLSBXaGV0aGVyIGRlYnVnLlxuICAgKiBAcGFyYW0ge251bWJlcltdfSBbYXJncy5yZWNvbm5lY3REZWxheXNdIC0gQmFja29mZiBkZWxheXMgaW4gbXMgKGRlZmF1bHQ6IFsxMDAwLCAyMDAwLCA0MDAwLCA4MDAwLCAxNTAwMF0pLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MudXJsXSBGdWxsIHdlYnNvY2tldCBVUkwgKGRlZmF1bHQ6IHdzOi8vMTI3LjAuMC4xOjMwMDYvd2Vic29ja2V0KVxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2F1dG9SZWNvbm5lY3QgPSBmYWxzZSwgZGVidWcgPSBmYWxzZSwgcmVjb25uZWN0RGVsYXlzLCB1cmx9ID0ge30pIHtcbiAgICBpZiAoIWdsb2JhbFRoaXMuV2ViU29ja2V0KSB0aHJvdyBuZXcgRXJyb3IoXCJXZWJTb2NrZXQgZ2xvYmFsIGlzIG5vdCBhdmFpbGFibGVcIilcblxuICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICB0aGlzLmF1dG9SZWNvbm5lY3QgPSBhdXRvUmVjb25uZWN0XG4gICAgdGhpcy5kZWJ1ZyA9IGRlYnVnXG4gICAgLyoqIEB0eXBlIHtudW1iZXIgfCBudWxsfSAqL1xuICAgIHRoaXMuZGlzY29ubmVjdGVkU2luY2UgPSBudWxsXG4gICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMgPSBuZXcgTWFwKClcbiAgICB0aGlzLnBlbmRpbmdTdWJzY3JpcHRpb25zID0gbmV3IE1hcCgpXG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgdGhpcy5yZWNvbm5lY3RBdHRlbXB0ID0gMFxuICAgIC8qKiBAdHlwZSB7bnVtYmVyW119ICovXG4gICAgdGhpcy5yZWNvbm5lY3REZWxheXMgPSByZWNvbm5lY3REZWxheXMgfHwgREVGQVVMVF9SRUNPTk5FQ1RfREVMQVlTXG4gICAgLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGx9ICovXG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lciA9IG51bGxcbiAgICB0aGlzLnVybCA9IHVybCB8fCBcIndzOi8vMTI3LjAuMC4xOjMwMDYvd2Vic29ja2V0XCJcbiAgICB0aGlzLmxpc3RlbmVycyA9IG5ldyBNYXAoKVxuICAgIHRoaXMubmV4dElEID0gMVxuICAgIC8qKiBAdHlwZSB7KCgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+KSB8IG51bGx9ICovXG4gICAgdGhpcy5vblJlY29ubmVjdCA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgYSB3ZWJzb2NrZXQgY29ubmVjdGlvbiBpcyBvcGVuLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgY29ubmVjdCgpIHtcbiAgICBpZiAodGhpcy5zb2NrZXQgJiYgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gdGhpcy5zb2NrZXQuT1BFTikgcmV0dXJuXG4gICAgaWYgKHRoaXMuY29ubmVjdFByb21pc2UpIHJldHVybiB0aGlzLmNvbm5lY3RQcm9taXNlXG5cbiAgICB0aGlzLmNvbm5lY3RQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgV2ViU29ja2V0KHRoaXMudXJsKVxuXG4gICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnNvY2tldD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm9wZW5cIiwgb25PcGVuKVxuICAgICAgICB0aGlzLnNvY2tldD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIG9uRXJyb3IpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9uT3BlbiA9ICgpID0+IHtcbiAgICAgICAgY2xlYW51cCgpXG4gICAgICAgIHJlc29sdmUodW5kZWZpbmVkKVxuICAgICAgfVxuICAgICAgY29uc3Qgb25FcnJvciA9ICgvKiogQHR5cGUge0V2ZW50ICYge2Vycm9yPzogdW5rbm93bn19ICovIGV2ZW50KSA9PiB7XG4gICAgICAgIGNsZWFudXAoKVxuICAgICAgICBjb25zdCBlcnJvciA9IGV2ZW50Py5lcnJvciB8fCBuZXcgRXJyb3IoXCJXZWJzb2NrZXQgY29ubmVjdGlvbiBlcnJvclwiKVxuICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJvcGVuXCIsIG9uT3BlbilcbiAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBvbkVycm9yKVxuICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5vbk1lc3NhZ2UpXG4gICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKFwiY2xvc2VcIiwgdGhpcy5vbkNsb3NlKVxuICAgIH0pXG5cbiAgICByZXR1cm4gdGhpcy5jb25uZWN0UHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIENvbm5lY3QgYW5kIGVuYWJsZSBhdXRvLXJlY29ubmVjdC4gUmVzZXRzIHJlY29ubmVjdCBzdGF0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb25uZWN0ZWQuXG4gICAqL1xuICBhc3luYyBjb25uZWN0V2l0aFJlY29ubmVjdCgpIHtcbiAgICB0aGlzLmF1dG9SZWNvbm5lY3QgPSB0cnVlXG4gICAgdGhpcy5yZWNvbm5lY3RBdHRlbXB0ID0gMFxuICAgIHRoaXMuX2NhbmNlbFBlbmRpbmdSZWNvbm5lY3QoKVxuICAgIGF3YWl0IHRoaXMuY29ubmVjdCgpXG4gICAgdGhpcy5kaXNjb25uZWN0ZWRTaW5jZSA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgd2Vic29ja2V0IGFuZCBjbGVhciBwZW5kaW5nIHN0YXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgY2xvc2UoKSB7XG4gICAgaWYgKCF0aGlzLnNvY2tldCkgcmV0dXJuXG5cbiAgICBpZiAodGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gdGhpcy5zb2NrZXQuQ0xPU0VEKSB7XG4gICAgICB0aGlzLnNvY2tldCA9IHVuZGVmaW5lZFxuICAgICAgdGhpcy5jb25uZWN0UHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMuc29ja2V0Py5hZGRFdmVudExpc3RlbmVyKFwiY2xvc2VcIiwgKCkgPT4gcmVzb2x2ZSh1bmRlZmluZWQpKVxuICAgICAgdGhpcy5zb2NrZXQ/LmNsb3NlKClcbiAgICB9KVxuXG4gICAgdGhpcy5zb2NrZXQgPSB1bmRlZmluZWRcbiAgICB0aGlzLmNvbm5lY3RQcm9taXNlID0gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogRGlzYWJsZSBhdXRvLXJlY29ubmVjdCBhbmQgY2xvc2UgdGhlIHdlYnNvY2tldC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjbG9zZWQuXG4gICAqL1xuICBhc3luYyBkaXNjb25uZWN0QW5kU3RvcFJlY29ubmVjdCgpIHtcbiAgICB0aGlzLmF1dG9SZWNvbm5lY3QgPSBmYWxzZVxuICAgIHRoaXMuX2NhbmNlbFBlbmRpbmdSZWNvbm5lY3QoKVxuICAgIGF3YWl0IHRoaXMuY2xvc2UoKVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSByYXcgc29ja2V0IHdpdGhvdXQgZGlzYWJsaW5nIGF1dG8tcmVjb25uZWN0LiBVc2VkIGJ5IHRlc3RzIHRvXG4gICAqIHNpbXVsYXRlIGFuIHVuZXhwZWN0ZWQgbmV0d29yayBkcm9wIGFuZCB2ZXJpZnkgcmVjb25uZWN0aW9uIGJlaGF2aW9yLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHRoZSBzb2NrZXQgaGFzIGNsb3NlZC5cbiAgICovXG4gIGFzeW5jIGRyb3BDb25uZWN0aW9uKCkge1xuICAgIGlmICghdGhpcy5zb2NrZXQpIHJldHVyblxuXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMuc29ja2V0Py5hZGRFdmVudExpc3RlbmVyKFwiY2xvc2VcIiwgKCkgPT4gcmVzb2x2ZSh1bmRlZmluZWQpKVxuICAgICAgdGhpcy5zb2NrZXQ/LmNsb3NlKClcbiAgICB9KVxuXG4gICAgdGhpcy5jb25uZWN0UHJvbWlzZSA9IHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gYSBQT1NUIHJlcXVlc3Qgb3ZlciB0aGUgd2Vic29ja2V0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFBhdGguXG4gICAqIEBwYXJhbSB7YW55fSBbYm9keV0gLSBSZXF1ZXN0IGJvZHkuXG4gICAqIEBwYXJhbSB7e2hlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fX0gW29wdGlvbnNdIC0gUmVxdWVzdCBvcHRpb25zIHN1Y2ggYXMgaGVhZGVycy5cbiAgICogQHJldHVybnMge1Byb21pc2U8VmVsb2Npb3VzV2Vic29ja2V0UmVzcG9uc2U+fSAtIFJlc29sdmVzIHdpdGggdGhlIHBvc3QuXG4gICAqL1xuICBhc3luYyBwb3N0KHBhdGgsIGJvZHksIG9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnJlcXVlc3QoXCJQT1NUXCIsIHBhdGgsIHsuLi5vcHRpb25zLCBib2R5fSlcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIGEgR0VUIHJlcXVlc3Qgb3ZlciB0aGUgd2Vic29ja2V0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFBhdGguXG4gICAqIEBwYXJhbSB7e2hlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fX0gW29wdGlvbnNdIC0gUmVxdWVzdCBvcHRpb25zIHN1Y2ggYXMgaGVhZGVycy5cbiAgICogQHJldHVybnMge1Byb21pc2U8VmVsb2Npb3VzV2Vic29ja2V0UmVzcG9uc2U+fSAtIFJlc29sdmVzIHdpdGggdGhlIGdldC5cbiAgICovXG4gIGFzeW5jIGdldChwYXRoLCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXF1ZXN0KFwiR0VUXCIsIHBhdGgsIG9wdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlIHRvIGEgY2hhbm5lbCBmb3Igc2VydmVyLXNlbnQgZXZlbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHsocGF5bG9hZDogYW55KSA9PiB2b2lkfSBjYWxsYmFjayAtIENhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJucyB7KCkgPT4gdm9pZH0gdW5zdWJzY3JpYmUgZnVuY3Rpb25cbiAgICovXG4gIG9uKGNoYW5uZWwsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRoaXMuc3Vic2NyaWJlKGNoYW5uZWwsIHt9LCBjYWxsYmFjaylcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc25hcHNob3Qgb2YgdGhlIGNsaWVudCdzIGNvbm5lY3Rpb24gc3RhdGUuXG4gICAqIEByZXR1cm5zIHt7ZGlzY29ubmVjdGVkU2luY2U6IG51bWJlciB8IG51bGwsIGlzT3BlbjogYm9vbGVhbiwgbGlzdGVuZXJDb3VudDogbnVtYmVyfX1cbiAgICovXG4gIHN0YXRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICBkaXNjb25uZWN0ZWRTaW5jZTogdGhpcy5kaXNjb25uZWN0ZWRTaW5jZSxcbiAgICAgIGlzT3BlbjogISF0aGlzLnNvY2tldCAmJiB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSB0aGlzLnNvY2tldC5PUEVOLFxuICAgICAgbGlzdGVuZXJDb3VudDogdGhpcy5saXN0ZW5lcnMuc2l6ZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gYSBjaGFubmVsIGZvciBzZXJ2ZXItc2VudCBldmVudHMgd2l0aCBvcHRpb25hbCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge3twYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+fX0gb3B0aW9ucyAtIFN1YnNjcmlwdGlvbiBvcHRpb25zLlxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiBhbnkpID0+IHZvaWR9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIHsoKCkgPT4gdm9pZCkgJiB7cmVhZHk6IFByb21pc2U8dm9pZD59fSAtIFVuc3Vic2NyaWJlIGZ1bmN0aW9uIHdpdGggcmVhZGluZXNzIHByb21pc2UuXG4gICAqL1xuICBzdWJzY3JpYmUoY2hhbm5lbCwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICBjb25zdCBwYXJhbXMgPSBvcHRpb25zPy5wYXJhbXNcbiAgICBjb25zdCBzdWJzY3JpcHRpb25LZXkgPSB0aGlzLl9zdWJzY3JpcHRpb25LZXkoY2hhbm5lbCwgcGFyYW1zKVxuXG4gICAgaWYgKCF0aGlzLmxpc3RlbmVycy5oYXMoc3Vic2NyaXB0aW9uS2V5KSkge1xuICAgICAgLyoqIEB0eXBlIHsoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWR9ICovXG4gICAgICAvKiogQHR5cGUgeygodmFsdWU/OiB2b2lkKSA9PiB2b2lkKSB8IHVuZGVmaW5lZH0gKi9cbiAgICAgIGxldCByZXNvbHZlUmVhZHlcbiAgICAgIC8qKiBAdHlwZSB7KChlcnJvcjogdW5rbm93bikgPT4gdm9pZCkgfCB1bmRlZmluZWR9ICovXG4gICAgICBsZXQgcmVqZWN0UmVhZHlcbiAgICAgIGNvbnN0IHJlYWR5ID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICByZXNvbHZlUmVhZHkgPSByZXNvbHZlXG4gICAgICAgIHJlamVjdFJlYWR5ID0gcmVqZWN0XG4gICAgICB9KVxuXG4gICAgICB0aGlzLmxpc3RlbmVycy5zZXQoc3Vic2NyaXB0aW9uS2V5LCB7XG4gICAgICAgIGNhbGxiYWNrczogbmV3IFNldCgpLFxuICAgICAgICBjaGFubmVsLFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIHJlYWR5XG4gICAgICB9KVxuICAgICAgdGhpcy5wZW5kaW5nU3Vic2NyaXB0aW9ucy5zZXQoc3Vic2NyaXB0aW9uS2V5LCB7XG4gICAgICAgIHJlamVjdDogcmVqZWN0UmVhZHkgfHwgKCgpID0+IHt9KSxcbiAgICAgICAgcmVzb2x2ZTogcmVzb2x2ZVJlYWR5IHx8ICgoKSA9PiB7fSlcbiAgICAgIH0pXG5cbiAgICAgIHZvaWQgdGhpcy5jb25uZWN0KCkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuX3NlbmRNZXNzYWdlKHtjaGFubmVsLCBwYXJhbXMsIHR5cGU6IFwic3Vic2NyaWJlXCJ9KVxuICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB0aGlzLl9kZWJ1ZyhcIlN1YnNjcmliZSBmYWlsZWRcIiwgZXJyb3IpKVxuICAgIH1cblxuICAgIGNvbnN0IGxpc3RlbmVyRW50cnkgPSB0aGlzLmxpc3RlbmVycy5nZXQoc3Vic2NyaXB0aW9uS2V5KVxuXG4gICAgaWYgKCFsaXN0ZW5lckVudHJ5KSB0aHJvdyBuZXcgRXJyb3IoXCJMaXN0ZW5lcnMgbWFwIG5vdCBpbml0aWFsaXplZFwiKVxuXG4gICAgbGlzdGVuZXJFbnRyeS5jYWxsYmFja3MuYWRkKGNhbGxiYWNrKVxuXG4gICAgY29uc3QgdW5zdWJzY3JpYmUgPSAoKSA9PiB7XG4gICAgICBsaXN0ZW5lckVudHJ5LmNhbGxiYWNrcy5kZWxldGUoY2FsbGJhY2spXG5cbiAgICAgIGlmIChsaXN0ZW5lckVudHJ5LmNhbGxiYWNrcy5zaXplID09PSAwKSB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzLmRlbGV0ZShzdWJzY3JpcHRpb25LZXkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdW5zdWJzY3JpYmUucmVhZHkgPSBsaXN0ZW5lckVudHJ5LnJlYWR5XG5cbiAgICByZXR1cm4gdW5zdWJzY3JpYmVcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gYSBjaGFubmVsIGFuZCB3YWl0IHVudGlsIHRoZSBzZXJ2ZXIgYWNrbm93bGVkZ2VzIHRoZSBzdWJzY3JpcHRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge3twYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+fX0gb3B0aW9ucyAtIFN1YnNjcmlwdGlvbiBvcHRpb25zLlxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiBhbnkpID0+IHZvaWR9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPCgoKSA9PiB2b2lkKSAmIHtyZWFkeTogUHJvbWlzZTx2b2lkPn0+fSAtIFJlYWR5IHVuc3Vic2NyaWJlIGhhbmRsZS5cbiAgICovXG4gIGFzeW5jIHN1YnNjcmliZUFuZFdhaXQoY2hhbm5lbCwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICBjb25zdCB1bnN1YnNjcmliZSA9IHRoaXMuc3Vic2NyaWJlKGNoYW5uZWwsIG9wdGlvbnMsIGNhbGxiYWNrKVxuXG4gICAgYXdhaXQgdW5zdWJzY3JpYmUucmVhZHlcblxuICAgIHJldHVybiB1bnN1YnNjcmliZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2QgLSBIVFRQIG1ldGhvZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBQYXRoLlxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7YW55fSBbb3B0aW9ucy5ib2R5XSAtIFJlcXVlc3QgYm9keS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBbb3B0aW9ucy5oZWFkZXJzXSAtIEhlYWRlciBsaXN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxWZWxvY2lvdXNXZWJzb2NrZXRSZXNwb25zZT59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgcmVxdWVzdC5cbiAgICovXG4gIGFzeW5jIHJlcXVlc3QobWV0aG9kLCBwYXRoLCB7Ym9keSwgaGVhZGVyc30gPSB7fSkge1xuICAgIGF3YWl0IHRoaXMuY29ubmVjdCgpXG5cbiAgICBjb25zdCBpZCA9IGB3cy0ke3RoaXMubmV4dElEKyt9YFxuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICBib2R5LFxuICAgICAgaGVhZGVycyxcbiAgICAgIGlkLFxuICAgICAgbWV0aG9kLFxuICAgICAgcGF0aCxcbiAgICAgIHR5cGU6IFwicmVxdWVzdFwiXG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzLnNldChpZCwge3Jlc29sdmUsIHJlamVjdH0pXG4gICAgICB0aGlzLl9zZW5kTWVzc2FnZShwYXlsb2FkKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtNZXNzYWdlRXZlbnQ8YW55Pn0gZXZlbnQgLSBFdmVudCBwYXlsb2FkLlxuICAgKi9cbiAgb25NZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gICAgY29uc3QgcmF3ID0gdHlwZW9mIGV2ZW50LmRhdGEgPT09IFwic3RyaW5nXCIgPyBldmVudC5kYXRhIDogZXZlbnQuZGF0YT8udG9TdHJpbmc/LigpXG5cbiAgICBpZiAoIXJhdykgcmV0dXJuXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgbGV0IG1lc3NhZ2VcblxuICAgIHRyeSB7XG4gICAgICBtZXNzYWdlID0gSlNPTi5wYXJzZShyYXcpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2RlYnVnKFwiRmFpbGVkIHRvIHBhcnNlIHdlYnNvY2tldCBtZXNzYWdlXCIsIGVycm9yKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qge3R5cGV9ID0gbWVzc2FnZVxuXG4gICAgaWYgKHR5cGUgPT09IFwicmVzcG9uc2VcIikge1xuICAgICAgY29uc3Qge2lkfSA9IG1lc3NhZ2VcbiAgICAgIGNvbnN0IHBlbmRpbmcgPSBpZCA/IHRoaXMucGVuZGluZ1JlcXVlc3RzLmdldChpZCkgOiB1bmRlZmluZWRcblxuICAgICAgaWYgKHBlbmRpbmcpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMuZGVsZXRlKGlkKVxuICAgICAgICBwZW5kaW5nLnJlc29sdmUobmV3IFZlbG9jaW91c1dlYnNvY2tldFJlc3BvbnNlKG1lc3NhZ2UpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZGVidWcoYE5vIHBlbmRpbmcgcmVxdWVzdCBmb3IgcmVzcG9uc2UgaWQgJHtpZH1gKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJzdWJzY3JpYmVkXCIpIHtcbiAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbktleSA9IHRoaXMuX3N1YnNjcmlwdGlvbktleShtZXNzYWdlLmNoYW5uZWwsIG1lc3NhZ2UucGFyYW1zKVxuICAgICAgY29uc3QgcGVuZGluZ1N1YnNjcmlwdGlvbiA9IHRoaXMucGVuZGluZ1N1YnNjcmlwdGlvbnMuZ2V0KHN1YnNjcmlwdGlvbktleSlcblxuICAgICAgaWYgKHBlbmRpbmdTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nU3Vic2NyaXB0aW9ucy5kZWxldGUoc3Vic2NyaXB0aW9uS2V5KVxuICAgICAgICBwZW5kaW5nU3Vic2NyaXB0aW9uLnJlc29sdmUoKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJldmVudFwiKSB7XG4gICAgICBjb25zdCB7Y2hhbm5lbCwgcGF5bG9hZH0gPSBtZXNzYWdlXG4gICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyRW50cnkgb2YgdGhpcy5saXN0ZW5lcnMudmFsdWVzKCkpIHtcbiAgICAgICAgaWYgKGxpc3RlbmVyRW50cnkuY2hhbm5lbCAhPT0gY2hhbm5lbCkgY29udGludWVcblxuICAgICAgICBsaXN0ZW5lckVudHJ5LmNhbGxiYWNrcy5mb3JFYWNoKCgvKiogQHR5cGUgeyhwYXlsb2FkOiBhbnkpID0+IHZvaWR9ICovIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNhbGxiYWNrKHBheWxvYWQpXG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKFwiTGlzdGVuZXIgZXJyb3JcIiwgZXJyb3IpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJlcnJvclwiICYmIG1lc3NhZ2UuaWQpIHtcbiAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdSZXF1ZXN0cy5nZXQobWVzc2FnZS5pZClcblxuICAgICAgaWYgKHBlbmRpbmcpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMuZGVsZXRlKG1lc3NhZ2UuaWQpXG4gICAgICAgIHBlbmRpbmcucmVqZWN0KG5ldyBFcnJvcihtZXNzYWdlLmVycm9yIHx8IFwiVW5rbm93biB3ZWJzb2NrZXQgZXJyb3JcIikpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWR9IHBhcmFtcyAtIFN1YnNjcmlwdGlvbiBwYXJhbXMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU3RhYmxlIHN1YnNjcmlwdGlvbiBrZXkuXG4gICAqL1xuICBfc3Vic2NyaXB0aW9uS2V5KGNoYW5uZWwsIHBhcmFtcykge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShbY2hhbm5lbCwgcGFyYW1zIHx8IG51bGxdKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlamVjdCBhbGwgcGVuZGluZyByZXF1ZXN0cyB3aGVuIHRoZSBzb2NrZXQgY2xvc2VzLiBTY2hlZHVsZXMgcmVjb25uZWN0IGlmIGVuYWJsZWQuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBvbkNsb3NlID0gKCkgPT4ge1xuICAgIHRoaXMuZGlzY29ubmVjdGVkU2luY2UgfHw9IERhdGUubm93KClcblxuICAgIGZvciAoY29uc3QgW2lkLCB7cmVqZWN0fV0gb2YgdGhpcy5wZW5kaW5nUmVxdWVzdHMuZW50cmllcygpKSB7XG4gICAgICByZWplY3QobmV3IEVycm9yKGBXZWJzb2NrZXQgY2xvc2VkIGJlZm9yZSByZXNwb25zZSBmb3IgJHtpZH1gKSlcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHtyZWplY3R9IG9mIHRoaXMucGVuZGluZ1N1YnNjcmlwdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJXZWJzb2NrZXQgY2xvc2VkIGJlZm9yZSBzdWJzY3JpcHRpb24gYWNrbm93bGVkZ2VtZW50XCIpKVxuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzLmNsZWFyKClcbiAgICB0aGlzLnBlbmRpbmdTdWJzY3JpcHRpb25zLmNsZWFyKClcbiAgICB0aGlzLmNvbm5lY3RQcm9taXNlID0gdW5kZWZpbmVkXG5cbiAgICBpZiAodGhpcy5hdXRvUmVjb25uZWN0KSB7XG4gICAgICB0aGlzLl9zY2hlZHVsZVJlY29ubmVjdCgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gcGF5bG9hZCAtIFBheWxvYWQgZGF0YS5cbiAgICovXG4gIF9zZW5kTWVzc2FnZShwYXlsb2FkKSB7XG4gICAgaWYgKCF0aGlzLnNvY2tldCB8fCB0aGlzLnNvY2tldC5yZWFkeVN0YXRlICE9PSB0aGlzLnNvY2tldC5PUEVOKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXZWJzb2NrZXQgaXMgbm90IG9wZW5cIilcbiAgICB9XG5cbiAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkocGF5bG9hZClcblxuICAgIHRoaXMuX2RlYnVnKFwiU2VuZGluZ1wiLCBqc29uKVxuICAgIHRoaXMuc29ja2V0LnNlbmQoanNvbilcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgX2NhbmNlbFBlbmRpbmdSZWNvbm5lY3QoKSB7XG4gICAgaWYgKHRoaXMucmVjb25uZWN0VGltZXIpIHtcbiAgICAgIGdsb2JhbFRoaXMuY2xlYXJUaW1lb3V0KHRoaXMucmVjb25uZWN0VGltZXIpXG4gICAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgX3NjaGVkdWxlUmVjb25uZWN0KCkge1xuICAgIHRoaXMuX2NhbmNlbFBlbmRpbmdSZWNvbm5lY3QoKVxuXG4gICAgY29uc3QgZGVsYXkgPSB0aGlzLnJlY29ubmVjdERlbGF5c1tNYXRoLm1pbih0aGlzLnJlY29ubmVjdEF0dGVtcHQsIHRoaXMucmVjb25uZWN0RGVsYXlzLmxlbmd0aCAtIDEpXVxuXG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lciA9IGdsb2JhbFRoaXMuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gbnVsbFxuICAgICAgdm9pZCB0aGlzLl9hdHRlbXB0UmVjb25uZWN0KClcbiAgICB9LCBkZWxheSlcblxuICAgIHRoaXMucmVjb25uZWN0QXR0ZW1wdCArPSAxXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIF9hdHRlbXB0UmVjb25uZWN0KCkge1xuICAgIGlmICghdGhpcy5hdXRvUmVjb25uZWN0KSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbm5lY3QoKVxuICAgICAgdGhpcy5yZWNvbm5lY3RBdHRlbXB0ID0gMFxuICAgICAgdGhpcy5kaXNjb25uZWN0ZWRTaW5jZSA9IG51bGxcbiAgICAgIHRoaXMuX3Jlc3Vic2NyaWJlQWN0aXZlTGlzdGVuZXJzKClcblxuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9uUmVjb25uZWN0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5vblJlY29ubmVjdCgpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2RlYnVnKFwiUmVjb25uZWN0IGF0dGVtcHQgZmFpbGVkOlwiLCBlcnJvcilcblxuICAgICAgaWYgKHRoaXMuYXV0b1JlY29ubmVjdCkge1xuICAgICAgICB0aGlzLl9zY2hlZHVsZVJlY29ubmVjdCgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlLXNlbmRzIHN1YnNjcmliZSBtZXNzYWdlcyBmb3IgYWxsIGFjdGl2ZSBsaXN0ZW5lcnMgYWZ0ZXIgcmVjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9yZXN1YnNjcmliZUFjdGl2ZUxpc3RlbmVycygpIHtcbiAgICBmb3IgKGNvbnN0IFssIGxpc3RlbmVyRW50cnldIG9mIHRoaXMubGlzdGVuZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9zZW5kTWVzc2FnZSh7XG4gICAgICAgICAgY2hhbm5lbDogbGlzdGVuZXJFbnRyeS5jaGFubmVsLFxuICAgICAgICAgIHBhcmFtczogbGlzdGVuZXJFbnRyeS5wYXJhbXMsXG4gICAgICAgICAgdHlwZTogXCJzdWJzY3JpYmVcIlxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fZGVidWcoXCJSZS1zdWJzY3JpYmUgZmFpbGVkOlwiLCBlcnJvcilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIF9kZWJ1ZyguLi5hcmdzKSB7XG4gICAgaWYgKCF0aGlzLmRlYnVnKSByZXR1cm5cblxuICAgIGNvbnNvbGUuZGVidWcoXCJbVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50XVwiLCAuLi5hcmdzKVxuICB9XG59XG5cbmNsYXNzIFZlbG9jaW91c1dlYnNvY2tldFJlc3BvbnNlIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBtZXNzYWdlIC0gTWVzc2FnZSB0ZXh0LlxuICAgKi9cbiAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgIGNvbnN0IHJlc3BvbnNlTWVzc2FnZSA9IC8qKiBAdHlwZSB7e2JvZHk/OiBhbnksIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBpZD86IHN0cmluZyB8IG51bWJlciB8IG51bGwsIHN0YXR1c0NvZGU/OiBudW1iZXIsIHN0YXR1c01lc3NhZ2U/OiBzdHJpbmcsIHR5cGU/OiBzdHJpbmd9fSAqLyAobWVzc2FnZSlcblxuICAgIHRoaXMuYm9keSA9IHJlc3BvbnNlTWVzc2FnZS5ib2R5XG4gICAgdGhpcy5oZWFkZXJzID0gcmVzcG9uc2VNZXNzYWdlLmhlYWRlcnMgfHwge31cbiAgICB0aGlzLmlkID0gcmVzcG9uc2VNZXNzYWdlLmlkXG4gICAgdGhpcy5zdGF0dXNDb2RlID0gcmVzcG9uc2VNZXNzYWdlLnN0YXR1c0NvZGUgfHwgMjAwXG4gICAgdGhpcy5zdGF0dXNNZXNzYWdlID0gcmVzcG9uc2VNZXNzYWdlLnN0YXR1c01lc3NhZ2UgfHwgXCJPS1wiXG4gICAgdGhpcy50eXBlID0gcmVzcG9uc2VNZXNzYWdlLnR5cGVcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7YW55fSAtIFRoZSBqc29uLiAgKi9cbiAganNvbigpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuYm9keSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVzcG9uc2UgYm9keSBpcyBub3QgYSBzdHJpbmdcIilcbiAgICB9XG5cbiAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGlzLmJvZHkpXG4gIH1cbn1cbiJdfQ==
446
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9odHRwLWNsaWVudC93ZWJzb2NrZXQtY2xpZW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixNQUFNLHdCQUF3QixHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFBO0FBRWhFOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sd0JBQXdCO0lBQzNDLHVIQUF1SDtJQUN2SCxlQUFlLENBQUE7SUFDZiwrRkFBK0Y7SUFDL0Ysb0JBQW9CLENBQUE7SUFDcEIsb0pBQW9KO0lBQ3BKLFNBQVMsQ0FBQTtJQUVUOzs7Ozs7T0FNRztJQUNILFlBQVksRUFBQyxhQUFhLEdBQUcsS0FBSyxFQUFFLEtBQUssR0FBRyxLQUFLLEVBQUUsZUFBZSxFQUFFLEdBQUcsRUFBQyxHQUFHLEVBQUU7UUFDM0UsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFBO1FBRS9FLHNCQUFzQjtRQUN0QixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQTtRQUNsQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtRQUNsQiw0QkFBNEI7UUFDNUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQTtRQUM3QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7UUFDaEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7UUFDckMscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUE7UUFDekIsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxJQUFJLHdCQUF3QixDQUFBO1FBQ2xFLG1EQUFtRDtRQUNuRCxJ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QUUsR0FBRyxlQUFlLENBQUMsRUFBRSxDQUFBO1FBQzVCLElBQUksQ0FBQyxVQUFVLEdBQUcsZUFBZSxDQUFDLFVBQVUsSUFBSSxHQUFHLENBQUE7UUFDbkQsSUFBSSxDQUFDLGFBQWEsR0FBRyxlQUFlLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQTtRQUMxRCxJQUFJLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUE7SUFDbEMsQ0FBQztJQUVELGtDQUFrQztJQUNsQyxJQUFJO1FBQ0YsSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFBO1FBQ2xELENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzlCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5jb25zdCBERUZBVUxUX1JFQ09OTkVDVF9ERUxBWVMgPSBbMTAwMCwgMjAwMCwgNDAwMCwgODAwMCwgMTUwMDBdXG5cbi8qKlxuICogQSBzbWFsbCB3ZWJzb2NrZXQgY2xpZW50IHRoYXQgbWlycm9ycyBzaW1wbGUgSFRUUC1zdHlsZSBjYWxscyBhbmQgY2hhbm5lbCBzdWJzY3JpcHRpb25zLlxuICogU3VwcG9ydHMgb3B0aW9uYWwgYXV0by1yZWNvbm5lY3Qgd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmIGFuZCBsaXN0ZW5lciByZS1zdWJzY3JpcHRpb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c1dlYnNvY2tldENsaWVudCB7XG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywge3JlamVjdDogKGVycm9yOiB1bmtub3duKSA9PiB2b2lkLCByZXNvbHZlOiAocmVzcG9uc2U6IFZlbG9jaW91c1dlYnNvY2tldFJlc3BvbnNlKSA9PiB2b2lkfT59ICovXG4gIHBlbmRpbmdSZXF1ZXN0c1xuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIHtyZWplY3Q6IChlcnJvcjogdW5rbm93bikgPT4gdm9pZCwgcmVzb2x2ZTogKHZhbHVlPzogdm9pZCkgPT4gdm9pZH0+fSAqL1xuICBwZW5kaW5nU3Vic2NyaXB0aW9uc1xuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIHtjYWxsYmFja3M6IFNldDwocGF5bG9hZDogYW55KSA9PiB2b2lkPiwgY2hhbm5lbDogc3RyaW5nLCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQsIHJlYWR5OiBQcm9taXNlPHZvaWQ+fT59ICovXG4gIGxpc3RlbmVyc1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NdIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuYXV0b1JlY29ubmVjdF0gLSBFbmFibGUgYXV0by1yZWNvbm5lY3Qgd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmRlYnVnXSAtIFdoZXRoZXIgZGVidWcuXG4gICAqIEBwYXJhbSB7bnVtYmVyW119IFthcmdzLnJlY29ubmVjdERlbGF5c10gLSBCYWNrb2ZmIGRlbGF5cyBpbiBtcyAoZGVmYXVsdDogWzEwMDAsIDIwMDAsIDQwMDAsIDgwMDAsIDE1MDAwXSkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy51cmxdIEZ1bGwgd2Vic29ja2V0IFVSTCAoZGVmYXVsdDogd3M6Ly8xMjcuMC4wLjE6MzAwNi93ZWJzb2NrZXQpXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7YXV0b1JlY29ubmVjdCA9IGZhbHNlLCBkZWJ1ZyA9IGZhbHNlLCByZWNvbm5lY3REZWxheXMsIHVybH0gPSB7fSkge1xuICAgIGlmICghZ2xvYmFsVGhpcy5XZWJTb2NrZXQpIHRocm93IG5ldyBFcnJvcihcIldlYlNvY2tldCBnbG9iYWwgaXMgbm90IGF2YWlsYWJsZVwiKVxuXG4gICAgLyoqIEB0eXBlIHtib29sZWFufSAqL1xuICAgIHRoaXMuYXV0b1JlY29ubmVjdCA9IGF1dG9SZWNvbm5lY3RcbiAgICB0aGlzLmRlYnVnID0gZGVidWdcbiAgICAvKiogQHR5cGUge251bWJlciB8IG51bGx9ICovXG4gICAgdGhpcy5kaXNjb25uZWN0ZWRTaW5jZSA9IG51bGxcbiAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0cyA9IG5ldyBNYXAoKVxuICAgIHRoaXMucGVuZGluZ1N1YnNjcmlwdGlvbnMgPSBuZXcgTWFwKClcbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICB0aGlzLnJlY29ubmVjdEF0dGVtcHQgPSAwXG4gICAgLyoqIEB0eXBlIHtudW1iZXJbXX0gKi9cbiAgICB0aGlzLnJlY29ubmVjdERlbGF5cyA9IHJlY29ubmVjdERlbGF5cyB8fCBERUZBVUxUX1JFQ09OTkVDVF9ERUxBWVNcbiAgICAvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbH0gKi9cbiAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gbnVsbFxuICAgIHRoaXMudXJsID0gdXJsIHx8IFwid3M6Ly8xMjcuMC4wLjE6MzAwNi93ZWJzb2NrZXRcIlxuICAgIHRoaXMubGlzdGVuZXJzID0gbmV3IE1hcCgpXG4gICAgdGhpcy5uZXh0SUQgPSAxXG4gICAgLyoqIEB0eXBlIHsoKCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4pIHwgbnVsbH0gKi9cbiAgICB0aGlzLm9uUmVjb25uZWN0ID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZSBhIHdlYnNvY2tldCBjb25uZWN0aW9uIGlzIG9wZW4uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBjb25uZWN0KCkge1xuICAgIGlmICh0aGlzLnNvY2tldCAmJiB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSB0aGlzLnNvY2tldC5PUEVOKSByZXR1cm5cbiAgICBpZiAodGhpcy5jb25uZWN0UHJvbWlzZSkgcmV0dXJuIHRoaXMuY29ubmVjdFByb21pc2VcblxuICAgIHRoaXMuY29ubmVjdFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXQodGhpcy51cmwpXG5cbiAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuc29ja2V0Py5yZW1vdmVFdmVudExpc3RlbmVyKFwib3BlblwiLCBvbk9wZW4pXG4gICAgICAgIHRoaXMuc29ja2V0Py5yZW1vdmVFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgb25FcnJvcilcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb25PcGVuID0gKCkgPT4ge1xuICAgICAgICBjbGVhbnVwKClcbiAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICB9XG4gICAgICBjb25zdCBvbkVycm9yID0gKC8qKiBAdHlwZSB7RXZlbnQgJiB7ZXJyb3I/OiB1bmtub3dufX0gKi8gZXZlbnQpID0+IHtcbiAgICAgICAgY2xlYW51cCgpXG4gICAgICAgIGNvbnN0IGVycm9yID0gZXZlbnQ/LmVycm9yIHx8IG5ldyBFcnJvcihcIldlYnNvY2tldCBjb25uZWN0aW9uIGVycm9yXCIpXG4gICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgIH1cblxuICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihcIm9wZW5cIiwgb25PcGVuKVxuICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIG9uRXJyb3IpXG4gICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLm9uTWVzc2FnZSlcbiAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJjbG9zZVwiLCB0aGlzLm9uQ2xvc2UpXG4gICAgfSlcblxuICAgIHJldHVybiB0aGlzLmNvbm5lY3RQcm9taXNlXG4gIH1cblxuICAvKipcbiAgICogQ29ubmVjdCBhbmQgZW5hYmxlIGF1dG8tcmVjb25uZWN0LiBSZXNldHMgcmVjb25uZWN0IHN0YXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbm5lY3RlZC5cbiAgICovXG4gIGFzeW5jIGNvbm5lY3RXaXRoUmVjb25uZWN0KCkge1xuICAgIHRoaXMuYXV0b1JlY29ubmVjdCA9IHRydWVcbiAgICB0aGlzLnJlY29ubmVjdEF0dGVtcHQgPSAwXG4gICAgdGhpcy5fY2FuY2VsUGVuZGluZ1JlY29ubmVjdCgpXG4gICAgYXdhaXQgdGhpcy5jb25uZWN0KClcbiAgICB0aGlzLmRpc2Nvbm5lY3RlZFNpbmNlID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSB3ZWJzb2NrZXQgYW5kIGNsZWFyIHBlbmRpbmcgc3RhdGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBjbG9zZSgpIHtcbiAgICBpZiAoIXRoaXMuc29ja2V0KSByZXR1cm5cblxuICAgIGlmICh0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSB0aGlzLnNvY2tldC5DTE9TRUQpIHtcbiAgICAgIHRoaXMuc29ja2V0ID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLmNvbm5lY3RQcm9taXNlID0gdW5kZWZpbmVkXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5zb2NrZXQ/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbG9zZVwiLCAoKSA9PiByZXNvbHZlKHVuZGVmaW5lZCkpXG4gICAgICB0aGlzLnNvY2tldD8uY2xvc2UoKVxuICAgIH0pXG5cbiAgICB0aGlzLnNvY2tldCA9IHVuZGVmaW5lZFxuICAgIHRoaXMuY29ubmVjdFByb21pc2UgPSB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlIGF1dG8tcmVjb25uZWN0IGFuZCBjbG9zZSB0aGUgd2Vic29ja2V0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNsb3NlZC5cbiAgICovXG4gIGFzeW5jIGRpc2Nvbm5lY3RBbmRTdG9wUmVjb25uZWN0KCkge1xuICAgIHRoaXMuYXV0b1JlY29ubmVjdCA9IGZhbHNlXG4gICAgdGhpcy5fY2FuY2VsUGVuZGluZ1JlY29ubmVjdCgpXG4gICAgYXdhaXQgdGhpcy5jbG9zZSgpXG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIHJhdyBzb2NrZXQgd2l0aG91dCBkaXNhYmxpbmcgYXV0by1yZWNvbm5lY3QuIFVzZWQgYnkgdGVzdHMgdG9cbiAgICogc2ltdWxhdGUgYW4gdW5leHBlY3RlZCBuZXR3b3JrIGRyb3AgYW5kIHZlcmlmeSByZWNvbm5lY3Rpb24gYmVoYXZpb3IuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gdGhlIHNvY2tldCBoYXMgY2xvc2VkLlxuICAgKi9cbiAgYXN5bmMgZHJvcENvbm5lY3Rpb24oKSB7XG4gICAgaWYgKCF0aGlzLnNvY2tldCkgcmV0dXJuXG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5zb2NrZXQ/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbG9zZVwiLCAoKSA9PiByZXNvbHZlKHVuZGVmaW5lZCkpXG4gICAgICB0aGlzLnNvY2tldD8uY2xvc2UoKVxuICAgIH0pXG5cbiAgICB0aGlzLmNvbm5lY3RQcm9taXNlID0gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBhIFBPU1QgcmVxdWVzdCBvdmVyIHRoZSB3ZWJzb2NrZXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gUGF0aC5cbiAgICogQHBhcmFtIHthbnl9IFtib2R5XSAtIFJlcXVlc3QgYm9keS5cbiAgICogQHBhcmFtIHt7aGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz59fSBbb3B0aW9uc10gLSBSZXF1ZXN0IG9wdGlvbnMgc3VjaCBhcyBoZWFkZXJzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxWZWxvY2lvdXNXZWJzb2NrZXRSZXNwb25zZT59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgcG9zdC5cbiAgICovXG4gIGFzeW5jIHBvc3QocGF0aCwgYm9keSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucmVxdWVzdChcIlBPU1RcIiwgcGF0aCwgey4uLm9wdGlvbnMsIGJvZHl9KVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gYSBHRVQgcmVxdWVzdCBvdmVyIHRoZSB3ZWJzb2NrZXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gUGF0aC5cbiAgICogQHBhcmFtIHt7aGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz59fSBbb3B0aW9uc10gLSBSZXF1ZXN0IG9wdGlvbnMgc3VjaCBhcyBoZWFkZXJzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxWZWxvY2lvdXNXZWJzb2NrZXRSZXNwb25zZT59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgZ2V0LlxuICAgKi9cbiAgYXN5bmMgZ2V0KHBhdGgsIG9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnJlcXVlc3QoXCJHRVRcIiwgcGF0aCwgb3B0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gYSBjaGFubmVsIGZvciBzZXJ2ZXItc2VudCBldmVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiBhbnkpID0+IHZvaWR9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIHsoKSA9PiB2b2lkfSB1bnN1YnNjcmliZSBmdW5jdGlvblxuICAgKi9cbiAgb24oY2hhbm5lbCwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gdGhpcy5zdWJzY3JpYmUoY2hhbm5lbCwge30sIGNhbGxiYWNrKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzbmFwc2hvdCBvZiB0aGUgY2xpZW50J3MgY29ubmVjdGlvbiBzdGF0ZS5cbiAgICogQHJldHVybnMge3tkaXNjb25uZWN0ZWRTaW5jZTogbnVtYmVyIHwgbnVsbCwgaXNPcGVuOiBib29sZWFuLCBsaXN0ZW5lckNvdW50OiBudW1iZXJ9fVxuICAgKi9cbiAgc3RhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc2Nvbm5lY3RlZFNpbmNlOiB0aGlzLmRpc2Nvbm5lY3RlZFNpbmNlLFxuICAgICAgaXNPcGVuOiAhIXRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT09IHRoaXMuc29ja2V0Lk9QRU4sXG4gICAgICBsaXN0ZW5lckNvdW50OiB0aGlzLmxpc3RlbmVycy5zaXplXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byBhIGNoYW5uZWwgZm9yIHNlcnZlci1zZW50IGV2ZW50cyB3aXRoIG9wdGlvbmFsIHBhcmFtcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7e2xhc3RFdmVudElkPzogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+fX0gb3B0aW9ucyAtIFN1YnNjcmlwdGlvbiBvcHRpb25zLlxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiBhbnksIG1lc3NhZ2U/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiB2b2lkfSBjYWxsYmFjayAtIENhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJucyB7KCgpID0+IHZvaWQpICYge3JlYWR5OiBQcm9taXNlPHZvaWQ+fX0gLSBVbnN1YnNjcmliZSBmdW5jdGlvbiB3aXRoIHJlYWRpbmVzcyBwcm9taXNlLlxuICAgKi9cbiAgc3Vic2NyaWJlKGNoYW5uZWwsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgcGFyYW1zID0gb3B0aW9ucz8ucGFyYW1zXG4gICAgY29uc3QgbGFzdEV2ZW50SWQgPSBvcHRpb25zPy5sYXN0RXZlbnRJZFxuICAgIGNvbnN0IHN1YnNjcmlwdGlvbktleSA9IHRoaXMuX3N1YnNjcmlwdGlvbktleShjaGFubmVsLCBwYXJhbXMpXG5cbiAgICBpZiAoIXRoaXMubGlzdGVuZXJzLmhhcyhzdWJzY3JpcHRpb25LZXkpKSB7XG4gICAgICAvKiogQHR5cGUgeygoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZH0gKi9cbiAgICAgIC8qKiBAdHlwZSB7KCh2YWx1ZT86IHZvaWQpID0+IHZvaWQpIHwgdW5kZWZpbmVkfSAqL1xuICAgICAgbGV0IHJlc29sdmVSZWFkeVxuICAgICAgLyoqIEB0eXBlIHsoKGVycm9yOiB1bmtub3duKSA9PiB2b2lkKSB8IHVuZGVmaW5lZH0gKi9cbiAgICAgIGxldCByZWplY3RSZWFkeVxuICAgICAgY29uc3QgcmVhZHkgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHJlc29sdmVSZWFkeSA9IHJlc29sdmVcbiAgICAgICAgcmVqZWN0UmVhZHkgPSByZWplY3RcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMubGlzdGVuZXJzLnNldChzdWJzY3JpcHRpb25LZXksIHtcbiAgICAgICAgY2FsbGJhY2tzOiBuZXcgU2V0KCksXG4gICAgICAgIGNoYW5uZWwsXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgcmVhZHlcbiAgICAgIH0pXG4gICAgICB0aGlzLnBlbmRpbmdTdWJzY3JpcHRpb25zLnNldChzdWJzY3JpcHRpb25LZXksIHtcbiAgICAgICAgcmVqZWN0OiByZWplY3RSZWFkeSB8fCAoKCkgPT4ge30pLFxuICAgICAgICByZXNvbHZlOiByZXNvbHZlUmVhZHkgfHwgKCgpID0+IHt9KVxuICAgICAgfSlcblxuICAgICAgdm9pZCB0aGlzLmNvbm5lY3QoKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5fc2VuZE1lc3NhZ2Uoe2NoYW5uZWwsIGxhc3RFdmVudElkLCBwYXJhbXMsIHR5cGU6IFwic3Vic2NyaWJlXCJ9KVxuICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB0aGlzLl9kZWJ1ZyhcIlN1YnNjcmliZSBmYWlsZWRcIiwgZXJyb3IpKVxuICAgIH1cblxuICAgIGNvbnN0IGxpc3RlbmVyRW50cnkgPSB0aGlzLmxpc3RlbmVycy5nZXQoc3Vic2NyaXB0aW9uS2V5KVxuXG4gICAgaWYgKCFsaXN0ZW5lckVudHJ5KSB0aHJvdyBuZXcgRXJyb3IoXCJMaXN0ZW5lcnMgbWFwIG5vdCBpbml0aWFsaXplZFwiKVxuXG4gICAgbGlzdGVuZXJFbnRyeS5jYWxsYmFja3MuYWRkKGNhbGxiYWNrKVxuXG4gICAgY29uc3QgdW5zdWJzY3JpYmUgPSAoKSA9PiB7XG4gICAgICBsaXN0ZW5lckVudHJ5LmNhbGxiYWNrcy5kZWxldGUoY2FsbGJhY2spXG5cbiAgICAgIGlmIChsaXN0ZW5lckVudHJ5LmNhbGxiYWNrcy5zaXplID09PSAwKSB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzLmRlbGV0ZShzdWJzY3JpcHRpb25LZXkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdW5zdWJzY3JpYmUucmVhZHkgPSBsaXN0ZW5lckVudHJ5LnJlYWR5XG5cbiAgICByZXR1cm4gdW5zdWJzY3JpYmVcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gYSBjaGFubmVsIGFuZCB3YWl0IHVudGlsIHRoZSBzZXJ2ZXIgYWNrbm93bGVkZ2VzIHRoZSBzdWJzY3JpcHRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge3tsYXN0RXZlbnRJZD86IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55Pn19IG9wdGlvbnMgLSBTdWJzY3JpcHRpb24gb3B0aW9ucy5cbiAgICogQHBhcmFtIHsocGF5bG9hZDogYW55LCBtZXNzYWdlPzogUmVjb3JkPHN0cmluZywgYW55PikgPT4gdm9pZH0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8KCgpID0+IHZvaWQpICYge3JlYWR5OiBQcm9taXNlPHZvaWQ+fT59IC0gUmVhZHkgdW5zdWJzY3JpYmUgaGFuZGxlLlxuICAgKi9cbiAgYXN5bmMgc3Vic2NyaWJlQW5kV2FpdChjaGFubmVsLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gdGhpcy5zdWJzY3JpYmUoY2hhbm5lbCwgb3B0aW9ucywgY2FsbGJhY2spXG5cbiAgICBhd2FpdCB1bnN1YnNjcmliZS5yZWFkeVxuXG4gICAgcmV0dXJuIHVuc3Vic2NyaWJlXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCAtIEhUVFAgbWV0aG9kLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFBhdGguXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHthbnl9IFtvcHRpb25zLmJvZHldIC0gUmVxdWVzdCBib2R5LlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFtvcHRpb25zLmhlYWRlcnNdIC0gSGVhZGVyIGxpc3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFZlbG9jaW91c1dlYnNvY2tldFJlc3BvbnNlPn0gLSBSZXNvbHZlcyB3aXRoIHRoZSByZXF1ZXN0LlxuICAgKi9cbiAgYXN5bmMgcmVxdWVzdChtZXRob2QsIHBhdGgsIHtib2R5LCBoZWFkZXJzfSA9IHt9KSB7XG4gICAgYXdhaXQgdGhpcy5jb25uZWN0KClcblxuICAgIGNvbnN0IGlkID0gYHdzLSR7dGhpcy5uZXh0SUQrK31gXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIGJvZHksXG4gICAgICBoZWFkZXJzLFxuICAgICAgaWQsXG4gICAgICBtZXRob2QsXG4gICAgICBwYXRoLFxuICAgICAgdHlwZTogXCJyZXF1ZXN0XCJcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMuc2V0KGlkLCB7cmVzb2x2ZSwgcmVqZWN0fSlcbiAgICAgIHRoaXMuX3NlbmRNZXNzYWdlKHBheWxvYWQpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge01lc3NhZ2VFdmVudDxhbnk+fSBldmVudCAtIEV2ZW50IHBheWxvYWQuXG4gICAqL1xuICBvbk1lc3NhZ2UgPSAoZXZlbnQpID0+IHtcbiAgICBjb25zdCByYXcgPSB0eXBlb2YgZXZlbnQuZGF0YSA9PT0gXCJzdHJpbmdcIiA/IGV2ZW50LmRhdGEgOiBldmVudC5kYXRhPy50b1N0cmluZz8uKClcblxuICAgIGlmICghcmF3KSByZXR1cm5cblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICBsZXQgbWVzc2FnZVxuXG4gICAgdHJ5IHtcbiAgICAgIG1lc3NhZ2UgPSBKU09OLnBhcnNlKHJhdylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5fZGVidWcoXCJGYWlsZWQgdG8gcGFyc2Ugd2Vic29ja2V0IG1lc3NhZ2VcIiwgZXJyb3IpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB7dHlwZX0gPSBtZXNzYWdlXG5cbiAgICBpZiAodHlwZSA9PT0gXCJyZXNwb25zZVwiKSB7XG4gICAgICBjb25zdCB7aWR9ID0gbWVzc2FnZVxuICAgICAgY29uc3QgcGVuZGluZyA9IGlkID8gdGhpcy5wZW5kaW5nUmVxdWVzdHMuZ2V0KGlkKSA6IHVuZGVmaW5lZFxuXG4gICAgICBpZiAocGVuZGluZykge1xuICAgICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0cy5kZWxldGUoaWQpXG4gICAgICAgIHBlbmRpbmcucmVzb2x2ZShuZXcgVmVsb2Npb3VzV2Vic29ja2V0UmVzcG9uc2UobWVzc2FnZSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9kZWJ1ZyhgTm8gcGVuZGluZyByZXF1ZXN0IGZvciByZXNwb25zZSBpZCAke2lkfWApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcInN1YnNjcmliZWRcIikge1xuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uS2V5ID0gdGhpcy5fc3Vic2NyaXB0aW9uS2V5KG1lc3NhZ2UuY2hhbm5lbCwgbWVzc2FnZS5wYXJhbXMpXG4gICAgICBjb25zdCBwZW5kaW5nU3Vic2NyaXB0aW9uID0gdGhpcy5wZW5kaW5nU3Vic2NyaXB0aW9ucy5nZXQoc3Vic2NyaXB0aW9uS2V5KVxuXG4gICAgICBpZiAocGVuZGluZ1N1YnNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLnBlbmRpbmdTdWJzY3JpcHRpb25zLmRlbGV0ZShzdWJzY3JpcHRpb25LZXkpXG4gICAgICAgIHBlbmRpbmdTdWJzY3JpcHRpb24ucmVzb2x2ZSgpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImV2ZW50XCIpIHtcbiAgICAgIGNvbnN0IHtjaGFubmVsLCBwYXlsb2FkfSA9IG1lc3NhZ2VcbiAgICAgIGZvciAoY29uc3QgbGlzdGVuZXJFbnRyeSBvZiB0aGlzLmxpc3RlbmVycy52YWx1ZXMoKSkge1xuICAgICAgICBpZiAobGlzdGVuZXJFbnRyeS5jaGFubmVsICE9PSBjaGFubmVsKSBjb250aW51ZVxuXG4gICAgICAgIGxpc3RlbmVyRW50cnkuY2FsbGJhY2tzLmZvckVhY2goKC8qKiBAdHlwZSB7KHBheWxvYWQ6IGFueSwgbWVzc2FnZT86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHZvaWR9ICovIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNhbGxiYWNrKHBheWxvYWQsIG1lc3NhZ2UpXG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKFwiTGlzdGVuZXIgZXJyb3JcIiwgZXJyb3IpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJyZXBsYXktZ2FwXCIpIHtcbiAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbktleSA9IHRoaXMuX3N1YnNjcmlwdGlvbktleShtZXNzYWdlLmNoYW5uZWwsIG1lc3NhZ2UucGFyYW1zKVxuICAgICAgY29uc3QgcGVuZGluZ1N1YnNjcmlwdGlvbiA9IHRoaXMucGVuZGluZ1N1YnNjcmlwdGlvbnMuZ2V0KHN1YnNjcmlwdGlvbktleSlcblxuICAgICAgaWYgKHBlbmRpbmdTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nU3Vic2NyaXB0aW9ucy5kZWxldGUoc3Vic2NyaXB0aW9uS2V5KVxuICAgICAgICBwZW5kaW5nU3Vic2NyaXB0aW9uLnJlamVjdChuZXcgRXJyb3IoYFJlcGxheSBnYXAgZm9yICR7bWVzc2FnZS5jaGFubmVsfWApKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJlcnJvclwiICYmIG1lc3NhZ2UuaWQpIHtcbiAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdSZXF1ZXN0cy5nZXQobWVzc2FnZS5pZClcblxuICAgICAgaWYgKHBlbmRpbmcpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMuZGVsZXRlKG1lc3NhZ2UuaWQpXG4gICAgICAgIHBlbmRpbmcucmVqZWN0KG5ldyBFcnJvcihtZXNzYWdlLmVycm9yIHx8IFwiVW5rbm93biB3ZWJzb2NrZXQgZXJyb3JcIikpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWR9IHBhcmFtcyAtIFN1YnNjcmlwdGlvbiBwYXJhbXMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU3RhYmxlIHN1YnNjcmlwdGlvbiBrZXkuXG4gICAqL1xuICBfc3Vic2NyaXB0aW9uS2V5KGNoYW5uZWwsIHBhcmFtcykge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShbY2hhbm5lbCwgcGFyYW1zIHx8IG51bGxdKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlamVjdCBhbGwgcGVuZGluZyByZXF1ZXN0cyB3aGVuIHRoZSBzb2NrZXQgY2xvc2VzLiBTY2hlZHVsZXMgcmVjb25uZWN0IGlmIGVuYWJsZWQuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBvbkNsb3NlID0gKCkgPT4ge1xuICAgIHRoaXMuZGlzY29ubmVjdGVkU2luY2UgfHw9IERhdGUubm93KClcblxuICAgIGZvciAoY29uc3QgW2lkLCB7cmVqZWN0fV0gb2YgdGhpcy5wZW5kaW5nUmVxdWVzdHMuZW50cmllcygpKSB7XG4gICAgICByZWplY3QobmV3IEVycm9yKGBXZWJzb2NrZXQgY2xvc2VkIGJlZm9yZSByZXNwb25zZSBmb3IgJHtpZH1gKSlcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHtyZWplY3R9IG9mIHRoaXMucGVuZGluZ1N1YnNjcmlwdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJXZWJzb2NrZXQgY2xvc2VkIGJlZm9yZSBzdWJzY3JpcHRpb24gYWNrbm93bGVkZ2VtZW50XCIpKVxuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzLmNsZWFyKClcbiAgICB0aGlzLnBlbmRpbmdTdWJzY3JpcHRpb25zLmNsZWFyKClcbiAgICB0aGlzLmNvbm5lY3RQcm9taXNlID0gdW5kZWZpbmVkXG5cbiAgICBpZiAodGhpcy5hdXRvUmVjb25uZWN0KSB7XG4gICAgICB0aGlzLl9zY2hlZHVsZVJlY29ubmVjdCgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gcGF5bG9hZCAtIFBheWxvYWQgZGF0YS5cbiAgICovXG4gIF9zZW5kTWVzc2FnZShwYXlsb2FkKSB7XG4gICAgaWYgKCF0aGlzLnNvY2tldCB8fCB0aGlzLnNvY2tldC5yZWFkeVN0YXRlICE9PSB0aGlzLnNvY2tldC5PUEVOKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXZWJzb2NrZXQgaXMgbm90IG9wZW5cIilcbiAgICB9XG5cbiAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkocGF5bG9hZClcblxuICAgIHRoaXMuX2RlYnVnKFwiU2VuZGluZ1wiLCBqc29uKVxuICAgIHRoaXMuc29ja2V0LnNlbmQoanNvbilcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgX2NhbmNlbFBlbmRpbmdSZWNvbm5lY3QoKSB7XG4gICAgaWYgKHRoaXMucmVjb25uZWN0VGltZXIpIHtcbiAgICAgIGdsb2JhbFRoaXMuY2xlYXJUaW1lb3V0KHRoaXMucmVjb25uZWN0VGltZXIpXG4gICAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgX3NjaGVkdWxlUmVjb25uZWN0KCkge1xuICAgIHRoaXMuX2NhbmNlbFBlbmRpbmdSZWNvbm5lY3QoKVxuXG4gICAgY29uc3QgZGVsYXkgPSB0aGlzLnJlY29ubmVjdERlbGF5c1tNYXRoLm1pbih0aGlzLnJlY29ubmVjdEF0dGVtcHQsIHRoaXMucmVjb25uZWN0RGVsYXlzLmxlbmd0aCAtIDEpXVxuXG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lciA9IGdsb2JhbFRoaXMuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gbnVsbFxuICAgICAgdm9pZCB0aGlzLl9hdHRlbXB0UmVjb25uZWN0KClcbiAgICB9LCBkZWxheSlcblxuICAgIHRoaXMucmVjb25uZWN0QXR0ZW1wdCArPSAxXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIF9hdHRlbXB0UmVjb25uZWN0KCkge1xuICAgIGlmICghdGhpcy5hdXRvUmVjb25uZWN0KSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbm5lY3QoKVxuICAgICAgdGhpcy5yZWNvbm5lY3RBdHRlbXB0ID0gMFxuICAgICAgdGhpcy5kaXNjb25uZWN0ZWRTaW5jZSA9IG51bGxcbiAgICAgIHRoaXMuX3Jlc3Vic2NyaWJlQWN0aXZlTGlzdGVuZXJzKClcblxuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9uUmVjb25uZWN0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5vblJlY29ubmVjdCgpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2RlYnVnKFwiUmVjb25uZWN0IGF0dGVtcHQgZmFpbGVkOlwiLCBlcnJvcilcblxuICAgICAgaWYgKHRoaXMuYXV0b1JlY29ubmVjdCkge1xuICAgICAgICB0aGlzLl9zY2hlZHVsZVJlY29ubmVjdCgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlLXNlbmRzIHN1YnNjcmliZSBtZXNzYWdlcyBmb3IgYWxsIGFjdGl2ZSBsaXN0ZW5lcnMgYWZ0ZXIgcmVjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9yZXN1YnNjcmliZUFjdGl2ZUxpc3RlbmVycygpIHtcbiAgICBmb3IgKGNvbnN0IFssIGxpc3RlbmVyRW50cnldIG9mIHRoaXMubGlzdGVuZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9zZW5kTWVzc2FnZSh7XG4gICAgICAgICAgY2hhbm5lbDogbGlzdGVuZXJFbnRyeS5jaGFubmVsLFxuICAgICAgICAgIHBhcmFtczogbGlzdGVuZXJFbnRyeS5wYXJhbXMsXG4gICAgICAgICAgdHlwZTogXCJzdWJzY3JpYmVcIlxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fZGVidWcoXCJSZS1zdWJzY3JpYmUgZmFpbGVkOlwiLCBlcnJvcilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIF9kZWJ1ZyguLi5hcmdzKSB7XG4gICAgaWYgKCF0aGlzLmRlYnVnKSByZXR1cm5cblxuICAgIGNvbnNvbGUuZGVidWcoXCJbVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50XVwiLCAuLi5hcmdzKVxuICB9XG59XG5cbmNsYXNzIFZlbG9jaW91c1dlYnNvY2tldFJlc3BvbnNlIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBtZXNzYWdlIC0gTWVzc2FnZSB0ZXh0LlxuICAgKi9cbiAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgIGNvbnN0IHJlc3BvbnNlTWVzc2FnZSA9IC8qKiBAdHlwZSB7e2JvZHk/OiBhbnksIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBpZD86IHN0cmluZyB8IG51bWJlciB8IG51bGwsIHN0YXR1c0NvZGU/OiBudW1iZXIsIHN0YXR1c01lc3NhZ2U/OiBzdHJpbmcsIHR5cGU/OiBzdHJpbmd9fSAqLyAobWVzc2FnZSlcblxuICAgIHRoaXMuYm9keSA9IHJlc3BvbnNlTWVzc2FnZS5ib2R5XG4gICAgdGhpcy5oZWFkZXJzID0gcmVzcG9uc2VNZXNzYWdlLmhlYWRlcnMgfHwge31cbiAgICB0aGlzLmlkID0gcmVzcG9uc2VNZXNzYWdlLmlkXG4gICAgdGhpcy5zdGF0dXNDb2RlID0gcmVzcG9uc2VNZXNzYWdlLnN0YXR1c0NvZGUgfHwgMjAwXG4gICAgdGhpcy5zdGF0dXNNZXNzYWdlID0gcmVzcG9uc2VNZXNzYWdlLnN0YXR1c01lc3NhZ2UgfHwgXCJPS1wiXG4gICAgdGhpcy50eXBlID0gcmVzcG9uc2VNZXNzYWdlLnR5cGVcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7YW55fSAtIFRoZSBqc29uLiAgKi9cbiAganNvbigpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuYm9keSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVzcG9uc2UgYm9keSBpcyBub3QgYSBzdHJpbmdcIilcbiAgICB9XG5cbiAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGlzLmJvZHkpXG4gIH1cbn1cbiJdfQ==
@@ -20,6 +20,7 @@ export default class VelociousHttpServerClientWebsocketSession {
20
20
  subscriptionHandlers: Map<any, any>;
21
21
  handlerSubscriptions: Map<any, any>;
22
22
  channelTenants: Map<any, any>;
23
+ channelReplayStates: Map<any, any>;
23
24
  /** @type {WebsocketSessionMessage[]} */
24
25
  messageQueue: WebsocketSessionMessage[];
25
26
  buffer: Buffer<ArrayBuffer>;
@@ -49,9 +50,15 @@ export default class VelociousHttpServerClientWebsocketSession {
49
50
  /**
50
51
  * @param {string} channel - Channel name.
51
52
  * @param {any} payload - Payload data.
53
+ * @param {{createdAt?: string, eventId?: string, replayed?: boolean, sequence?: number}} [options] - Event metadata.
52
54
  * @returns {Promise<void>} - Resolves when complete.
53
55
  */
54
- sendEvent(channel: string, payload: any): Promise<void>;
56
+ sendEvent(channel: string, payload: any, options?: {
57
+ createdAt?: string;
58
+ eventId?: string;
59
+ replayed?: boolean;
60
+ sequence?: number;
61
+ }): Promise<void>;
55
62
  /**
56
63
  * @returns {Promise<void>} - Resolves when complete.
57
64
  */
@@ -83,12 +90,15 @@ export default class VelociousHttpServerClientWebsocketSession {
83
90
  sendJson(body: object): void;
84
91
  /**
85
92
  * @param {string} channel - Channel name.
86
- * @param {{acknowledge?: boolean, channelHandler?: import("../websocket-channel.js").default}} [options] - Subscribe options.
93
+ * @param {{acknowledge?: boolean, channelHandler?: import("../websocket-channel.js").default, lastEventId?: string, params?: Record<string, any>, subscriptionChannel?: string}} [options] - Subscribe options.
87
94
  * @returns {Promise<boolean>} - Whether the subscription was added.
88
95
  */
89
- subscribeToChannel(channel: string, { acknowledge, channelHandler }?: {
96
+ subscribeToChannel(channel: string, { acknowledge, channelHandler, lastEventId, params, subscriptionChannel }?: {
90
97
  acknowledge?: boolean;
91
98
  channelHandler?: import("../websocket-channel.js").default;
99
+ lastEventId?: string;
100
+ params?: Record<string, any>;
101
+ subscriptionChannel?: string;
92
102
  }): Promise<boolean>;
93
103
  _handleClose(): void;
94
104
  _teardownChannel(): Promise<void>;
@@ -109,13 +119,59 @@ export default class VelociousHttpServerClientWebsocketSession {
109
119
  */
110
120
  _withConnections(callback: () => Promise<void>): Promise<void>;
111
121
  /**
112
- * @param {{channel: string, params?: Record<string, any>}} args - Subscription args.
122
+ * @param {{channel: string, lastEventId?: string, params?: Record<string, any>}} args - Subscription args.
113
123
  * @returns {Promise<void>} - Resolves when complete.
114
124
  */
115
- _handleChannelSubscription({ channel, params }: {
125
+ _handleChannelSubscription({ channel, lastEventId, params }: {
116
126
  channel: string;
127
+ lastEventId?: string;
117
128
  params?: Record<string, any>;
118
129
  }): Promise<void>;
130
+ /**
131
+ * @param {object} args - Options.
132
+ * @param {string} args.channel - Internal channel name.
133
+ * @param {string | undefined} args.lastEventId - Last received event id.
134
+ * @param {string} args.subscriptionChannel - Client-facing channel name.
135
+ * @param {Record<string, any> | undefined} args.subscriptionParams - Client-facing params.
136
+ * @returns {Promise<false | {buffered: boolean, ceilingSequence: number, checkpointSequence: number, replaying: boolean} | null>} - Replay state.
137
+ */
138
+ _prepareReplayState({ channel, lastEventId, subscriptionChannel, subscriptionParams }: {
139
+ channel: string;
140
+ lastEventId: string | undefined;
141
+ subscriptionChannel: string;
142
+ subscriptionParams: Record<string, any> | undefined;
143
+ }): Promise<false | {
144
+ buffered: boolean;
145
+ ceilingSequence: number;
146
+ checkpointSequence: number;
147
+ replaying: boolean;
148
+ } | null>;
149
+ /**
150
+ * @param {object} args - Options.
151
+ * @param {string} args.channel - Channel name.
152
+ * @param {{buffered: boolean, ceilingSequence: number, checkpointSequence: number, replaying: boolean}} args.replayState - Replay state.
153
+ * @returns {Promise<void>} - Resolves when replay completes.
154
+ */
155
+ _replayChannelEvents({ channel, replayState }: {
156
+ channel: string;
157
+ replayState: {
158
+ buffered: boolean;
159
+ ceilingSequence: number;
160
+ checkpointSequence: number;
161
+ replaying: boolean;
162
+ };
163
+ }): Promise<void>;
164
+ /**
165
+ * @param {string} channel - Channel name.
166
+ * @param {{buffered: boolean, ceilingSequence: number, checkpointSequence: number, replaying: boolean}} replayState - Replay state.
167
+ * @returns {Promise<void>} - Resolves when buffered events are flushed.
168
+ */
169
+ _finishReplayState(channel: string, replayState: {
170
+ buffered: boolean;
171
+ ceilingSequence: number;
172
+ checkpointSequence: number;
173
+ replaying: boolean;
174
+ }): Promise<void>;
119
175
  /**
120
176
  * @param {{channel?: string, params?: Record<string, unknown>}} args - Tenant resolution args.
121
177
  * @returns {Promise<string | null | undefined>} - Resolved tenant.
@@ -154,6 +210,7 @@ export default class VelociousHttpServerClientWebsocketSession {
154
210
  export type WebsocketSessionMessage = {
155
211
  type: "subscribe";
156
212
  channel: string;
213
+ lastEventId?: string;
157
214
  params?: Record<string, any>;
158
215
  } | {
159
216
  type?: "request";
@@ -1 +1 @@
1
- {"version":3,"file":"websocket-session.d.ts","sourceRoot":"","sources":["../../../../src/http-server/client/websocket-session.js"],"names":[],"mappings":"AAsCA;IAUE;;;;;;;OAOG;IACH,8FANG;QAAuD,aAAa,EAA5D,OAAO,wBAAwB,EAAE,OAAO;QACL,MAAM,EAAzC,OAAO,YAAY,EAAE,OAAO;QACqD,cAAc;QACzB,cAAc;QACE,qBAAqB;KACrH,EAUA;IA1BD,mEAA2B;IAC3B,wBAAyB;IACzB,mBAAoB;IACpB,oCAAgC;IAChC,oCAAgC;IAChC,8BAA0B;IAC1B,wCAAwC;IACxC,cADW,uBAAuB,EAAE,CACnB;IAWf,4BAA6B;IAC7B,qCAAoB;IACpB,wDAAkC;IAClC,8EAAoC;IACpC,2FAAoC;IACpC,kHAAkD;IAClD,+BAA2D;IAC3D,eAA8B;IAGhC;;;OAGG;IACH,yBAHW,MAAM,GACJ,IAAI,CAIhB;IAED,gBAGC;IAED;;;OAGG;IACH,yBAHW,MAAM,GACJ,OAAO,CAInB;IAED;;;OAGG;IACH,aAHW,MAAM,GACJ,IAAI,CAKhB;IAED;;;;OAIG;IACH,mBAJW,MAAM,WACN,GAAG,GACD,OAAO,CAAC,IAAI,CAAC,CAsBzB;IAED;;OAEG;IACH,qBAFa,OAAO,CAAC,IAAI,CAAC,CA2CzB;IAED;;;OAGG;IACH,oBAHW,OAAO,YAAY,EAAE,OAAO,GAC1B,IAAI,CAMhB;IAED;;;OAGG;IACH,wBAHW,uBAAuB,GACrB,OAAO,CAAC,IAAI,CAAC,CA2EzB;IAED;;OAEG;IACH,kBAFa,IAAI,CAuEhB;IAED;;;;OAIG;IACH,0BAJW,MAAM,WACN,MAAM,GACJ,IAAI,CAShB;IAED;;;OAGG;IACH,eAHW,MAAM,GACJ,IAAI,CAuBhB;IAED;;;;OAIG;IACH,4BAJW,MAAM,oCACN;QAAC,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,yBAAyB,EAAE,OAAO,CAAA;KAAC,GACjF,OAAO,CAAC,OAAO,CAAC,CAuB5B;IAED,qBAIC;IAED,kCAKC;IAED;;;OAGG;IACH,gCAHW,gBAAgB,GACd,OAAO,CAAC,IAAI,CAAC,CA8BzB;IAED;;;;OAIG;IACH,0BAJW,gBAAgB,GAAG,SAAS,UAC5B,MAAM,GAAG,IAAI,GAAG,SAAS,GACvB,OAAO,CAAC,IAAI,CAAC,CAYzB;IAED;;;OAGG;IACH,2BAHW,MAAM,OAAO,CAAC,IAAI,CAAC,GACjB,OAAO,CAAC,IAAI,CAAC,CAMzB;IAED;;;OAGG;IACH,gDAHW;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAC,GAC7C,OAAO,CAAC,IAAI,CAAC,CA2CzB;IAED;;;OAGG;IACH,oCAHW;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAC,GAClD,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAe9C;IAED;;;;OAIG;IACH,wBAJW,MAAM,QACN,MAAM,GACJ,MAAM,CAWlB;IAED,wCAWC;IAED;;;OAGG;IACH,mCAHW,uBAAuB,GACrB,OAAO,CAAC,IAAI,CAAC,CAmBzB;IAED,yCAWC;IAED;;;OAGG;IACH,2BAHW,OAAO,8BAA8B,EAAE,uBAAuB,GAC5D,IAAI,CAKhB;IAED,+CAoBC;IAED;;;OAGG;IACH,qCAHW;QAAC,UAAU,EAAE,OAAO,CAAA;KAAC,GACnB,OAAO,CAAC,IAAI,CAAC,CAezB;CACF;sCAjoBY;IAAC,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAAC,GAAG;IAAC,IAAI,CAAC,EAAE,SAAS,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;6BAVvM,wBAAwB;mBAFlC,iBAAiB;6BAGP,yBAAyB"}
1
+ {"version":3,"file":"websocket-session.d.ts","sourceRoot":"","sources":["../../../../src/http-server/client/websocket-session.js"],"names":[],"mappings":"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"}