velocious 1.0.667 → 1.0.669

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 (112) hide show
  1. package/README.md +34 -9
  2. package/build/configuration.js +23 -1
  3. package/build/environment-handlers/node/cli/commands/test/timing-manifest/merge.js +2 -48
  4. package/build/environment-handlers/node/cli/commands/test.js +17 -69
  5. package/build/frontend-models/websocket-channel.js +18 -0
  6. package/build/http-server/client/websocket-session.js +41 -4
  7. package/build/http-server/websocket-channel.js +14 -0
  8. package/build/http-server/websocket-event-log-store.js +85 -12
  9. package/build/http-server/websocket-events-host.js +14 -6
  10. package/build/src/configuration.d.ts +18 -1
  11. package/build/src/configuration.d.ts.map +1 -1
  12. package/build/src/configuration.js +22 -2
  13. package/build/src/environment-handlers/node/cli/commands/test/timing-manifest/merge.d.ts.map +1 -1
  14. package/build/src/environment-handlers/node/cli/commands/test/timing-manifest/merge.js +3 -47
  15. package/build/src/environment-handlers/node/cli/commands/test.d.ts +2 -28
  16. package/build/src/environment-handlers/node/cli/commands/test.d.ts.map +1 -1
  17. package/build/src/environment-handlers/node/cli/commands/test.js +10 -61
  18. package/build/src/frontend-models/websocket-channel.d.ts +9 -0
  19. package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
  20. package/build/src/frontend-models/websocket-channel.js +16 -1
  21. package/build/src/http-server/client/websocket-session.d.ts +25 -2
  22. package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
  23. package/build/src/http-server/client/websocket-session.js +40 -5
  24. package/build/src/http-server/websocket-channel.d.ts +11 -0
  25. package/build/src/http-server/websocket-channel.d.ts.map +1 -1
  26. package/build/src/http-server/websocket-channel.js +14 -1
  27. package/build/src/http-server/websocket-event-log-store.d.ts +60 -41
  28. package/build/src/http-server/websocket-event-log-store.d.ts.map +1 -1
  29. package/build/src/http-server/websocket-event-log-store.js +79 -12
  30. package/build/src/http-server/websocket-events-host.d.ts +10 -3
  31. package/build/src/http-server/websocket-events-host.d.ts.map +1 -1
  32. package/build/src/http-server/websocket-events-host.js +14 -7
  33. package/build/src/testing/expect-utils.d.ts +1 -51
  34. package/build/src/testing/expect-utils.d.ts.map +1 -1
  35. package/build/src/testing/expect-utils.js +2 -205
  36. package/build/src/testing/expect.d.ts +1 -171
  37. package/build/src/testing/expect.d.ts.map +1 -1
  38. package/build/src/testing/expect.js +2 -667
  39. package/build/src/testing/test-files-finder.d.ts +13 -116
  40. package/build/src/testing/test-files-finder.d.ts.map +1 -1
  41. package/build/src/testing/test-files-finder.js +26 -296
  42. package/build/src/testing/test-filter-parser.d.ts +32 -22
  43. package/build/src/testing/test-filter-parser.d.ts.map +1 -1
  44. package/build/src/testing/test-filter-parser.js +25 -217
  45. package/build/src/testing/test-profile-activity.d.ts +1 -6
  46. package/build/src/testing/test-profile-activity.d.ts.map +1 -1
  47. package/build/src/testing/test-profile-activity.js +2 -12
  48. package/build/src/testing/test-profile-output.d.ts +1 -40
  49. package/build/src/testing/test-profile-output.d.ts.map +1 -1
  50. package/build/src/testing/test-profile-output.js +2 -217
  51. package/build/src/testing/test-profiler.d.ts +15 -659
  52. package/build/src/testing/test-profiler.d.ts.map +1 -1
  53. package/build/src/testing/test-profiler.js +35 -833
  54. package/build/src/testing/test-runner.d.ts +10 -1
  55. package/build/src/testing/test-runner.d.ts.map +1 -1
  56. package/build/src/testing/test-runner.js +26 -4
  57. package/build/src/testing/test-suite-splitter.d.ts +1 -128
  58. package/build/src/testing/test-suite-splitter.d.ts.map +1 -1
  59. package/build/src/testing/test-suite-splitter.js +2 -259
  60. package/build/src/testing/test.d.ts +1 -13
  61. package/build/src/testing/test.d.ts.map +1 -1
  62. package/build/src/testing/test.js +2 -14
  63. package/build/src/testing/timing-manifest.d.ts +5 -93
  64. package/build/src/testing/timing-manifest.d.ts.map +1 -1
  65. package/build/src/testing/timing-manifest.js +4 -283
  66. package/build/src/testing/velocious-attempt-executor.d.ts.map +1 -1
  67. package/build/src/testing/velocious-attempt-executor.js +8 -2
  68. package/build/testing/expect-utils.js +1 -242
  69. package/build/testing/expect.js +1 -760
  70. package/build/testing/test-files-finder.js +29 -345
  71. package/build/testing/test-filter-parser.js +29 -248
  72. package/build/testing/test-profile-activity.js +1 -12
  73. package/build/testing/test-profile-output.js +8 -253
  74. package/build/testing/test-profiler.js +38 -895
  75. package/build/testing/test-runner.js +33 -9
  76. package/build/testing/test-suite-splitter.js +1 -301
  77. package/build/testing/test.js +3 -14
  78. package/build/testing/timing-manifest.js +10 -344
  79. package/build/testing/velocious-attempt-executor.js +7 -1
  80. package/package.json +3 -4
  81. package/scripts/test-browser.js +29 -6
  82. package/scripts/verify-docker-dev-environment.js +13 -1
  83. package/src/configuration.js +23 -1
  84. package/src/environment-handlers/node/cli/commands/test/timing-manifest/merge.js +2 -48
  85. package/src/environment-handlers/node/cli/commands/test.js +17 -69
  86. package/src/frontend-models/websocket-channel.js +18 -0
  87. package/src/http-server/client/websocket-session.js +41 -4
  88. package/src/http-server/websocket-channel.js +14 -0
  89. package/src/http-server/websocket-event-log-store.js +85 -12
  90. package/src/http-server/websocket-events-host.js +14 -6
  91. package/src/testing/expect-utils.js +1 -242
  92. package/src/testing/expect.js +1 -760
  93. package/src/testing/test-files-finder.js +29 -345
  94. package/src/testing/test-filter-parser.js +29 -248
  95. package/src/testing/test-profile-activity.js +1 -12
  96. package/src/testing/test-profile-output.js +8 -253
  97. package/src/testing/test-profiler.js +38 -895
  98. package/src/testing/test-runner.js +33 -9
  99. package/src/testing/test-suite-splitter.js +1 -301
  100. package/src/testing/test.js +3 -14
  101. package/src/testing/timing-manifest.js +10 -344
  102. package/src/testing/velocious-attempt-executor.js +7 -1
  103. package/build/src/testing/base-expect.d.ts +0 -15
  104. package/build/src/testing/base-expect.d.ts.map +0 -1
  105. package/build/src/testing/base-expect.js +0 -16
  106. package/build/src/testing/expect-to-change.d.ts +0 -32
  107. package/build/src/testing/expect-to-change.d.ts.map +0 -1
  108. package/build/src/testing/expect-to-change.js +0 -46
  109. package/build/testing/base-expect.js +0 -17
  110. package/build/testing/expect-to-change.js +0 -55
  111. package/src/testing/base-expect.js +0 -17
  112. package/src/testing/expect-to-change.js +0 -55
@@ -9,6 +9,7 @@ import Logger from "../logger.js";
9
9
  * @property {Date | string} created_at - Creation time.
10
10
  * @property {string} id - Event id.
11
11
  * @property {string} payload_json - Serialized payload.
12
+ * @property {string | null} params_json - Serialized broadcast params, or null when the publish carried none.
12
13
  * @property {number | string} sequence - Sequence number.
13
14
  */
14
15
  /**
@@ -16,6 +17,16 @@ import Logger from "../logger.js";
16
17
  * @typedef {object} WebsocketReplayChannelRow
17
18
  * @property {string} channel - Channel name.
18
19
  */
20
+ /**
21
+ * Normalized persisted websocket event.
22
+ * @typedef {object} WebsocketPersistedEvent
23
+ * @property {string} channel - Channel name.
24
+ * @property {string} createdAt - ISO creation time.
25
+ * @property {string} id - Event id.
26
+ * @property {Record<string, ReturnType<typeof JSON.parse>> | null} params - Persisted broadcast params, or null when the publish carried none.
27
+ * @property {ReturnType<typeof JSON.parse>} payload - Event payload.
28
+ * @property {number} sequence - Sequence number.
29
+ */
19
30
  const EVENTS_TABLE = "websocket_channel_events";
20
31
  const REPLAY_CHANNELS_TABLE = "websocket_replay_channels";
21
32
  const DEFAULT_RETENTION_MS = 10 * 60 * 1000;
@@ -91,19 +102,35 @@ export default class VelociousHttpServerWebsocketEventLogStore {
91
102
  }
92
103
  /**
93
104
  * Runs schema present.
94
- * @returns {Promise<boolean>} - Whether both event-log tables physically exist.
105
+ * @returns {Promise<boolean>} - Whether both event-log tables exist and the events table carries every required column.
95
106
  */
96
107
  async _schemaPresent() {
97
- return await this._withDb(async (db) => await db.tableExists(EVENTS_TABLE) && await db.tableExists(REPLAY_CHANNELS_TABLE));
108
+ return await this._withDb(async (db) => (await db.tableExists(EVENTS_TABLE) && await db.tableExists(REPLAY_CHANNELS_TABLE))
109
+ && (await this._columnPresent(db, EVENTS_TABLE, "params_json")));
110
+ }
111
+ /**
112
+ * Runs column present.
113
+ * @param {import("../database/drivers/base.js").default} db - Database connection.
114
+ * @param {string} tableName - Table name.
115
+ * @param {string} columnName - Column name.
116
+ * @returns {Promise<boolean>} - Whether the column exists on the table.
117
+ */
118
+ async _columnPresent(db, tableName, columnName) {
119
+ const tables = await db.getTables();
120
+ const table = tables.find((candidate) => candidate.getName() == tableName);
121
+ if (!table)
122
+ return false;
123
+ return (await table.getColumnByName(columnName)) !== undefined;
98
124
  }
99
125
  /**
100
126
  * Runs append event.
101
127
  * @param {object} args - Options.
102
128
  * @param {string} args.channel - Channel name.
103
129
  * @param {ReturnType<typeof JSON.parse>} args.payload - Event payload.
104
- * @returns {Promise<{channel: string, createdAt: string, id: string, payload: ReturnType<typeof JSON.parse>}>} - Persisted event row.
130
+ * @param {Record<string, ReturnType<typeof JSON.parse>> | null} [args.params] - Broadcast params to persist for stream-scoped replay, or null when the publish carried none.
131
+ * @returns {Promise<WebsocketPersistedEvent>} - Persisted event row.
105
132
  */
106
- async appendEvent({ channel, payload }) {
133
+ async appendEvent({ channel, params = null, payload }) {
107
134
  await this.ensureReady();
108
135
  const id = randomUUID();
109
136
  const createdAt = new Date();
@@ -114,18 +141,23 @@ export default class VelociousHttpServerWebsocketEventLogStore {
114
141
  channel,
115
142
  created_at: createdAt,
116
143
  id,
144
+ params_json: params === null ? null : JSON.stringify(params),
117
145
  payload_json: JSON.stringify(payload)
118
146
  }
119
147
  });
120
- return { channel, createdAt: createdAt.toISOString(), id, payload };
148
+ return { channel, createdAt: createdAt.toISOString(), id, params, payload };
121
149
  });
122
150
  }
123
151
  /**
124
152
  * Runs mark channel interested.
125
153
  * @param {string} channel - Channel name.
126
154
  * @returns {Promise<void>} - Resolves when the channel interest was persisted.
155
+ * @throws {Error} When the channel is registered live-only, which forbids replay persistence.
127
156
  */
128
157
  async markChannelInterested(channel) {
158
+ if (this.configuration.isWebsocketChannelLiveOnly(channel)) {
159
+ throw new Error(`Websocket channel "${channel}" is registered live-only and cannot be marked interested in replay persistence`);
160
+ }
129
161
  await this.ensureReady();
130
162
  const interestedUntil = new Date(Date.now() + this.retentionMs);
131
163
  this._interestedChannels.set(channel, interestedUntil.getTime());
@@ -139,6 +171,12 @@ export default class VelociousHttpServerWebsocketEventLogStore {
139
171
  * @returns {Promise<boolean>} - Whether the channel should be persisted for replay.
140
172
  */
141
173
  async shouldPersistChannel(channel) {
174
+ // A channel re-registered live-only can still hold cached or durable
175
+ // interest state from before the re-registration; the live-only
176
+ // contract must hold at the persistence decision, not only at
177
+ // interest marking.
178
+ if (this.configuration.isWebsocketChannelLiveOnly(channel))
179
+ return false;
142
180
  if (this._channelInterestCached(channel))
143
181
  return true;
144
182
  if (this._interestedChannels.size === 0)
@@ -174,7 +212,7 @@ export default class VelociousHttpServerWebsocketEventLogStore {
174
212
  * @param {object} args - Options.
175
213
  * @param {string} args.channel - Channel name.
176
214
  * @param {string} args.id - Event id.
177
- * @returns {Promise<{channel: string, createdAt: string, id: string, payload: ReturnType<typeof JSON.parse>, sequence: number} | null>} - Event row or null.
215
+ * @returns {Promise<WebsocketPersistedEvent | null>} - Event row or null.
178
216
  */
179
217
  async getEventById({ channel, id }) {
180
218
  await this.ensureReady();
@@ -209,7 +247,7 @@ export default class VelociousHttpServerWebsocketEventLogStore {
209
247
  * @param {string} args.channel - Channel name.
210
248
  * @param {number} args.sequence - Lower bound sequence.
211
249
  * @param {number | null | undefined} [args.upToSequence] - Inclusive ceiling sequence.
212
- * @returns {Promise<Array<{channel: string, createdAt: string, id: string, payload: ReturnType<typeof JSON.parse>, sequence: number}>>} - Ordered events.
250
+ * @returns {Promise<WebsocketPersistedEvent[]>} - Ordered events.
213
251
  */
214
252
  async getEventsAfter({ channel, sequence, upToSequence }) {
215
253
  await this.ensureReady();
@@ -273,19 +311,47 @@ export default class VelociousHttpServerWebsocketEventLogStore {
273
311
  * @returns {Promise<void>} - Resolves when complete.
274
312
  */
275
313
  async _ensureEventsTable(db) {
276
- this.logger.info("Applying websocket event-log schema");
277
314
  if (await db.tableExists(EVENTS_TABLE)) {
278
- this.logger.info("Websocket event-log table already exists - skipping create");
315
+ await this._ensureEventsTableColumns(db);
279
316
  return;
280
317
  }
318
+ this.logger.info("Applying websocket event-log schema");
281
319
  const eventTable = new TableData(EVENTS_TABLE, { ifNotExists: true });
282
320
  eventTable.integer("sequence", { autoIncrement: true, null: false, primaryKey: true });
283
321
  eventTable.string("id", { index: true, null: false });
284
322
  eventTable.string("channel", { index: true, null: false });
323
+ eventTable.text("params_json", { null: true });
285
324
  eventTable.text("payload_json", { null: false });
286
325
  eventTable.datetime("created_at", { index: true, null: false });
287
326
  await db.createTable(eventTable);
288
327
  }
328
+ /**
329
+ * Adds columns the current schema requires to an events table created by an
330
+ * older framework version, so upgrades keep working without a manual ALTER.
331
+ * @param {import("../database/drivers/base.js").default} db - Database connection.
332
+ * @returns {Promise<void>} - Resolves when the events table schema is current.
333
+ */
334
+ async _ensureEventsTableColumns(db) {
335
+ if (await this._columnPresent(db, EVENTS_TABLE, "params_json"))
336
+ return;
337
+ this.logger.info("Adding params_json column to websocket event-log table");
338
+ const tableData = new TableData(EVENTS_TABLE);
339
+ tableData.addColumn("params_json", { isNewColumn: true, null: true, type: "text" });
340
+ try {
341
+ for (const sql of await db.alterTableSQLs(tableData)) {
342
+ await db.query(sql);
343
+ }
344
+ }
345
+ catch (error) {
346
+ // A concurrent process can add the column between the presence check
347
+ // and the ALTER (multi-worker or rolling upgrade); the
348
+ // duplicate-column failure is then the expected outcome, not a real
349
+ // error. Anything else re-checks as absent and rethrows.
350
+ if (await this._columnPresent(db, EVENTS_TABLE, "params_json"))
351
+ return;
352
+ throw error;
353
+ }
354
+ }
289
355
  /**
290
356
  * Runs ensure replay channels table.
291
357
  * @param {import("../database/drivers/base.js").default} db - Database connection.
@@ -305,7 +371,7 @@ export default class VelociousHttpServerWebsocketEventLogStore {
305
371
  * @param {string} args.channel - Channel name.
306
372
  * @param {import("../database/drivers/base.js").default} args.db - Database connection.
307
373
  * @param {string} args.id - Event id.
308
- * @returns {Promise<{channel: string, createdAt: string, id: string, payload: ReturnType<typeof JSON.parse>, sequence: number} | null>} - Event row or null.
374
+ * @returns {Promise<WebsocketPersistedEvent | null>} - Event row or null.
309
375
  */
310
376
  async _getEventById({ channel, db, id }) {
311
377
  const rows = /** @type {WebsocketEventRow[]} */ (await db
@@ -321,7 +387,7 @@ export default class VelociousHttpServerWebsocketEventLogStore {
321
387
  /**
322
388
  * Runs normalize event row.
323
389
  * @param {WebsocketEventRow} row - Raw row.
324
- * @returns {{channel: string, createdAt: string, id: string, payload: ReturnType<typeof JSON.parse>, sequence: number}} - Normalized row.
390
+ * @returns {WebsocketPersistedEvent} - Normalized row.
325
391
  */
326
392
  _normalizeEventRow(row) {
327
393
  const createdAtValue = row.created_at;
@@ -329,6 +395,7 @@ export default class VelociousHttpServerWebsocketEventLogStore {
329
395
  channel: row.channel,
330
396
  createdAt: createdAtValue instanceof Date ? createdAtValue.toISOString() : new Date(createdAtValue).toISOString(),
331
397
  id: row.id,
398
+ params: row.params_json === null || row.params_json === undefined ? null : JSON.parse(row.params_json),
332
399
  payload: JSON.parse(row.payload_json),
333
400
  sequence: Number(row.sequence)
334
401
  };
@@ -366,4 +433,4 @@ export default class VelociousHttpServerWebsocketEventLogStore {
366
433
  });
367
434
  }
368
435
  }
369
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWV2ZW50LWxvZy1zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9odHRwLXNlcnZlci93ZWJzb2NrZXQtZXZlbnQtbG9nLXN0b3JlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sUUFBUSxDQUFBO0FBQ2pDLE9BQU8sU0FBUyxNQUFNLGlDQUFpQyxDQUFBO0FBQ3ZELE9BQU8sTUFBTSxNQUFNLGNBQWMsQ0FBQTtBQUVqQzs7Ozs7Ozs7R0FRRztBQUNIOzs7O0dBSUc7QUFDSCxNQUFNLFlBQVksR0FBRywwQkFBMEIsQ0FBQTtBQUMvQyxNQUFNLHFCQUFxQixHQUFHLDJCQUEyQixDQUFBO0FBQ3pELE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUE7QUFDM0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtBQUU1Qjs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHNDQUFzQyxDQUFDLGFBQWE7SUFDbEUsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUVyQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxLQUFLLEdBQUcsSUFBSSx5Q0FBeUMsQ0FBQyxFQUFDLGFBQWEsRUFBQyxDQUFDLENBQUE7UUFDdEUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUE7SUFDbEMsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVELE1BQU0sQ0FBQyxPQUFPLE9BQU8seUNBQXlDO0lBQzVEOzs7Ozs7T0FNRztJQUNILFlBQVksRUFBQyxhQUFhLEVBQUUsa0JBQWtCLEdBQUcsU0FBUyxFQUFFLFdBQVcsR0FBRyxvQkFBb0IsRUFBQztRQUM3RixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQTtR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TUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLEVBQUMsbUJBQW1CLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxJQUFJLEVBQUUsMkJBQTJCLEVBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDbkosTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1lBRXZDLElBQUksQ0FBQyxFQUFFO2dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUE7WUFFdkcsT0FBTyxNQUFNLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUMzQixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge3JhbmRvbVVVSUR9IGZyb20gXCJjcnlwdG9cIlxuaW1wb3J0IFRhYmxlRGF0YSBmcm9tIFwiLi4vZGF0YWJhc2UvdGFibGUtZGF0YS9pbmRleC5qc1wiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi9sb2dnZXIuanNcIlxuXG4vKipcbiAqIFdlYnNvY2tldEV2ZW50Um93IHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBXZWJzb2NrZXRFdmVudFJvd1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gKiBAcHJvcGVydHkge0RhdGUgfCBzdHJpbmd9IGNyZWF0ZWRfYXQgLSBDcmVhdGlvbiB0aW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRXZlbnQgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF5bG9hZF9qc29uIC0gU2VyaWFsaXplZCBwYXlsb2FkLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBzdHJpbmd9IHNlcXVlbmNlIC0gU2VxdWVuY2UgbnVtYmVyLlxuICovXG4vKipcbiAqIFdlYnNvY2tldFJlcGxheUNoYW5uZWxSb3cgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFdlYnNvY2tldFJlcGxheUNoYW5uZWxSb3dcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICovXG5jb25zdCBFVkVOVFNfVEFCTEUgPSBcIndlYnNvY2tldF9jaGFubmVsX2V2ZW50c1wiXG5jb25zdCBSRVBMQVlfQ0hBTk5FTFNfVEFCTEUgPSBcIndlYnNvY2tldF9yZXBsYXlfY2hhbm5lbHNcIlxuY29uc3QgREVGQVVMVF9SRVRFTlRJT05fTVMgPSAxMCAqIDYwICogMTAwMFxuY29uc3Qgc3RvcmVzID0gbmV3IFdlYWtNYXAoKVxuXG4vKipcbiAqIFJ1bnMgdGhlIHdlYnNvY2tldEV2ZW50TG9nU3RvcmVGb3JDb25maWd1cmF0aW9uIGhlbHBlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBjb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbi5cbiAqIEByZXR1cm5zIHtWZWxvY2lvdXNIdHRwU2VydmVyV2Vic29ja2V0RXZlbnRMb2dTdG9yZX0gLSBTaGFyZWQgc3RvcmUgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3ZWJzb2NrZXRFdmVudExvZ1N0b3JlRm9yQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKSB7XG4gIGxldCBzdG9yZSA9IHN0b3Jlcy5nZXQoY29uZmlndXJhdGlvbilcblxuICBpZiAoIXN0b3JlKSB7XG4gICAgc3RvcmUgPSBuZXcgVmVsb2Npb3VzSHR0cFNlcnZlcldlYnNvY2tldEV2ZW50TG9nU3RvcmUoe2NvbmZpZ3VyYXRpb259KVxuICAgIHN0b3Jlcy5zZXQoY29uZmlndXJhdGlvbiwgc3RvcmUpXG4gIH1cblxuICByZXR1cm4gc3RvcmVcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzSHR0cFNlcnZlcldlYnNvY2tldEV2ZW50TG9nU3RvcmUge1xuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmRhdGFiYXNlSWRlbnRpZmllcl0gLSBEYXRhYmFzZSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MucmV0ZW50aW9uTXNdIC0gRXZlbnQgcmV0ZW50aW9uIGluIG1pbGxpc2Vjb25kcy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9uLCBkYXRhYmFzZUlkZW50aWZpZXIgPSBcImRlZmF1bHRcIiwgcmV0ZW50aW9uTXMgPSBERUZBVUxUX1JFVEVOVElPTl9NU30pIHtcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5kYXRhYmFzZUlkZW50aWZpZXIgPSBkYXRhYmFzZUlkZW50aWZpZXJcbiAgICB0aGlzLnJldGVudGlvbk1zID0gcmV0ZW50aW9uTXNcbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcylcbiAgICB0aGlzLl9pc1JlYWR5ID0gZmFsc2VcbiAgICB0aGlzLl9yZWFkeVByb21pc2UgPSBudWxsXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAqIEB0eXBlIHtNYXA8c3RyaW5nLCBudW1iZXI+fSAqL1xuICAgIHRoaXMuX2ludGVyZXN0ZWRDaGFubmVscyA9IG5ldyBNYXAoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZW5zdXJlIHJlYWR5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHJlYWR5LlxuICAgKi9cbiAgYXN5bmMgZW5zdXJlUmVhZHkoKSB7XG4gICAgaWYgKGF3YWl0IHRoaXMuX3NjaGVtYVJlYWR5KCkpIHJldHVyblxuXG4gICAgaWYgKHRoaXMuX3JlYWR5UHJvbWlzZSkgcmV0dXJuIGF3YWl0IHRoaXMuX3JlYWR5UHJvbWlzZVxuXG4gICAgdGhpcy5fcmVhZHlQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5zZXRDdXJyZW50KClcbiAgICAgIGF3YWl0IHRoaXMuX2Vuc3VyZVNjaGVtYSgpXG4gICAgICB0aGlzLl9pc1JlYWR5ID0gdHJ1ZVxuICAgIH0pKClcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9yZWFkeVByb21pc2VcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKCF0aGlzLl9pc1JlYWR5KSB7XG4gICAgICAgIHRoaXMuX3JlYWR5UHJvbWlzZSA9IG51bGxcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmUtdmFsaWRhdGVzIGNhY2hlZCBzY2hlbWEgcmVhZGluZXNzIGJlY2F1c2UgdHJhbnNhY3Rpb25hbCBEREwgY2FuIHJvbGwgdGhlIHRhYmxlcyBiYWNrLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIHRoZSBjYWNoZWQgcmVhZHkgc3RhdGUgaXMgc3RpbGwgdmFsaWQuXG4gICAqL1xuICBhc3luYyBfc2NoZW1hUmVhZHkoKSB7XG4gICAgaWYgKCF0aGlzLl9pc1JlYWR5KSByZXR1cm4gZmFsc2VcbiAgICBpZiAoYXdhaXQgdGhpcy5fc2NoZW1hUHJlc2VudCgpKSByZXR1cm4gdHJ1ZVxuXG4gICAgdGhpcy5faXNSZWFkeSA9IGZhbHNlXG4gICAgdGhpcy5fcmVhZHlQcm9taXNlID0gbnVsbFxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzY2hlbWEgcHJlc2VudC5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciBib3RoIGV2ZW50LWxvZyB0YWJsZXMgcGh5c2ljYWxseSBleGlzdC5cbiAgICovXG4gIGFzeW5jIF9zY2hlbWFQcmVzZW50KCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl93aXRoRGIoYXN5bmMgKGRiKSA9PlxuICAgICAgYXdhaXQgZGIudGFibGVFeGlzdHMoRVZFTlRTX1RBQkxFKSAmJiBhd2FpdCBkYi50YWJsZUV4aXN0cyhSRVBMQVlfQ0hBTk5FTFNfVEFCTEUpXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYXBwZW5kIGV2ZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGFyZ3MucGF5bG9hZCAtIEV2ZW50IHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtjaGFubmVsOiBzdHJpbmcsIGNyZWF0ZWRBdDogc3RyaW5nLCBpZDogc3RyaW5nLCBwYXlsb2FkOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0+fSAtIFBlcnNpc3RlZCBldmVudCByb3cuXG4gICAqL1xuICBhc3luYyBhcHBlbmRFdmVudCh7Y2hhbm5lbCwgcGF5bG9hZH0pIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVJlYWR5KClcblxuICAgIGNvbnN0IGlkID0gcmFuZG9tVVVJRCgpXG4gICAgY29uc3QgY3JlYXRlZEF0ID0gbmV3IERhdGUoKVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3dpdGhEYihhc3luYyAoZGIpID0+IHtcbiAgICAgIGF3YWl0IGRiLmluc2VydCh7XG4gICAgICAgIHRhYmxlTmFtZTogRVZFTlRTX1RBQkxFLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICBjcmVhdGVkX2F0OiBjcmVhdGVkQXQsXG4gICAgICAgICAgaWQsXG4gICAgICAgICAgcGF5bG9hZF9qc29uOiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtjaGFubmVsLCBjcmVhdGVkQXQ6IGNyZWF0ZWRBdC50b0lTT1N0cmluZygpLCBpZCwgcGF5bG9hZH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbWFyayBjaGFubmVsIGludGVyZXN0ZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHRoZSBjaGFubmVsIGludGVyZXN0IHdhcyBwZXJzaXN0ZWQuXG4gICAqL1xuICBhc3luYyBtYXJrQ2hhbm5lbEludGVyZXN0ZWQoY2hhbm5lbCkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlUmVhZHkoKVxuXG4gICAgY29uc3QgaW50ZXJlc3RlZFVudGlsID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIHRoaXMucmV0ZW50aW9uTXMpXG5cbiAgICB0aGlzLl9pbnRlcmVzdGVkQ2hhbm5lbHMuc2V0KGNoYW5uZWwsIGludGVyZXN0ZWRVbnRpbC5nZXRUaW1lKCkpXG5cbiAgICBhd2FpdCB0aGlzLl93aXRoRGIoYXN5bmMgKGRiKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLl91cHNlcnRSZXBsYXlDaGFubmVsSW50ZXJlc3QoZGIsIHtjaGFubmVsLCBpbnRlcmVzdGVkVW50aWx9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzaG91bGQgcGVyc2lzdCBjaGFubmVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciB0aGUgY2hhbm5lbCBzaG91bGQgYmUgcGVyc2lzdGVkIGZvciByZXBsYXkuXG4gICAqL1xuICBhc3luYyBzaG91bGRQZXJzaXN0Q2hhbm5lbChjaGFubmVsKSB7XG4gICAgaWYgKHRoaXMuX2NoYW5uZWxJbnRlcmVzdENhY2hlZChjaGFubmVsKSkgcmV0dXJuIHRydWVcbiAgICBpZiAodGhpcy5faW50ZXJlc3RlZENoYW5uZWxzLnNpemUgPT09IDApIHJldHVybiBmYWxzZVxuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVSZWFkeSgpXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fd2l0aERiKGFzeW5jIChkYikgPT4ge1xuICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IGRiXG4gICAgICAgIC5uZXdRdWVyeSgpXG4gICAgICAgIC5mcm9tKFJFUExBWV9DSEFOTkVMU19UQUJMRSlcbiAgICAgICAgLndoZXJlKHtjaGFubmVsfSlcbiAgICAgICAgLndoZXJlKGBpbnRlcmVzdGVkX3VudGlsID4gJHtkYi5xdW90ZShuZXcgRGF0ZSgpKX1gKVxuICAgICAgICAubGltaXQoMSlcbiAgICAgICAgLnJlc3VsdHMoKVxuXG4gICAgICByZXR1cm4gcm93cy5sZW5ndGggPiAwXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNoYW5uZWwgaW50ZXJlc3QgY2FjaGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBtZW1vcnkgY2FjaGUgc3RpbGwgbWFya3MgdGhlIGNoYW5uZWwgaW50ZXJlc3RlZC5cbiAgICovXG4gIF9jaGFubmVsSW50ZXJlc3RDYWNoZWQoY2hhbm5lbCkge1xuICAgIGNvbnN0IGludGVyZXN0ZWRVbnRpbCA9IHRoaXMuX2ludGVyZXN0ZWRDaGFubmVscy5nZXQoY2hhbm5lbClcblxuICAgIGlmICghaW50ZXJlc3RlZFVudGlsKSByZXR1cm4gZmFsc2VcbiAgICBpZiAoaW50ZXJlc3RlZFVudGlsID4gRGF0ZS5ub3coKSkgcmV0dXJuIHRydWVcblxuICAgIHRoaXMuX2ludGVyZXN0ZWRDaGFubmVscy5kZWxldGUoY2hhbm5lbClcblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGV2ZW50IGJ5IGlkLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmlkIC0gRXZlbnQgaWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtjaGFubmVsOiBzdHJpbmcsIGNyZWF0ZWRBdDogc3RyaW5nLCBpZDogc3RyaW5nLCBwYXlsb2FkOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgc2VxdWVuY2U6IG51bWJlcn0gfCBudWxsPn0gLSBFdmVudCByb3cgb3IgbnVsbC5cbiAgICovXG4gIGFzeW5jIGdldEV2ZW50QnlJZCh7Y2hhbm5lbCwgaWR9KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVSZWFkeSgpXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fd2l0aERiKGFzeW5jIChkYikgPT4ge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2dldEV2ZW50QnlJZCh7Y2hhbm5lbCwgZGIsIGlkfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbGF0ZXN0IHNlcXVlbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyIHwgbnVsbD59IC0gTGF0ZXN0IGNoYW5uZWwgc2VxdWVuY2UuXG4gICAqL1xuICBhc3luYyBsYXRlc3RTZXF1ZW5jZShjaGFubmVsKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVSZWFkeSgpXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fd2l0aERiKGFzeW5jIChkYikgPT4ge1xuICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IGRiXG4gICAgICAgIC5uZXdRdWVyeSgpXG4gICAgICAgIC5mcm9tKEVWRU5UU19UQUJMRSlcbiAgICAgICAgLndoZXJlKHtjaGFubmVsfSlcbiAgICAgICAgLm9yZGVyKFwic2VxdWVuY2UgREVTQ1wiKVxuICAgICAgICAubGltaXQoMSlcbiAgICAgICAgLnJlc3VsdHMoKVxuICAgICAgY29uc3Qgcm93ID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4gfCB1bmRlZmluZWR9ICovIChyb3dzWzBdKVxuXG4gICAgICBpZiAoIXJvdykgcmV0dXJuIG51bGxcblxuICAgICAgcmV0dXJuIE51bWJlcihyb3cuc2VxdWVuY2UpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBldmVudHMgYWZ0ZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3Muc2VxdWVuY2UgLSBMb3dlciBib3VuZCBzZXF1ZW5jZS5cbiAgICogQHBhcmFtIHtudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfSBbYXJncy51cFRvU2VxdWVuY2VdIC0gSW5jbHVzaXZlIGNlaWxpbmcgc2VxdWVuY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PHtjaGFubmVsOiBzdHJpbmcsIGNyZWF0ZWRBdDogc3RyaW5nLCBpZDogc3RyaW5nLCBwYXlsb2FkOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgc2VxdWVuY2U6IG51bWJlcn0+Pn0gLSBPcmRlcmVkIGV2ZW50cy5cbiAgICovXG4gIGFzeW5jIGdldEV2ZW50c0FmdGVyKHtjaGFubmVsLCBzZXF1ZW5jZSwgdXBUb1NlcXVlbmNlfSkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlUmVhZHkoKVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3dpdGhEYihhc3luYyAoZGIpID0+IHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gZGJcbiAgICAgICAgLm5ld1F1ZXJ5KClcbiAgICAgICAgLmZyb20oRVZFTlRTX1RBQkxFKVxuICAgICAgICAud2hlcmUoe2NoYW5uZWx9KVxuICAgICAgICAud2hlcmUoYHNlcXVlbmNlID4gJHtkYi5xdW90ZShzZXF1ZW5jZSl9YClcbiAgICAgICAgLm9yZGVyKFwic2VxdWVuY2UgQVNDXCIpXG5cbiAgICAgIGlmICh0eXBlb2YgdXBUb1NlcXVlbmNlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHF1ZXJ5LndoZXJlKGBzZXF1ZW5jZSA8PSAke2RiLnF1b3RlKHVwVG9TZXF1ZW5jZSl9YClcbiAgICAgIH1cblxuICAgICAgY29uc3Qgcm93cyA9IC8qKiBAdHlwZSB7V2Vic29ja2V0RXZlbnRSb3dbXX0gKi8gKGF3YWl0IHF1ZXJ5LnJlc3VsdHMoKSlcblxuICAgICAgcmV0dXJuIHJvd3MubWFwKChyb3cpID0+IHRoaXMuX25vcm1hbGl6ZUV2ZW50Um93KHJvdykpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNsZWFudXAgZXhwaXJlZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IFthcmdzXSAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7RGF0ZX0gW2FyZ3Mubm93XSAtIENsZWFudXAgcmVmZXJlbmNlIHRpbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY2xlYW51cCBjb21wbGV0ZXMuXG4gICAqL1xuICBhc3luYyBjbGVhbnVwRXhwaXJlZCh7bm93ID0gbmV3IERhdGUoKX0gPSB7fSkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlUmVhZHkoKVxuXG4gICAgY29uc3QgY3V0b2ZmID0gbmV3IERhdGUobm93LmdldFRpbWUoKSAtIHRoaXMucmV0ZW50aW9uTXMpXG5cbiAgICBhd2FpdCB0aGlzLl93aXRoRGIoYXN5bmMgKGRiKSA9PiB7XG4gICAgICBjb25zdCBleHBpcmVkRXZlbnRSb3dzID0gLyoqIEB0eXBlIHtBcnJheTx7aWQ6IHN0cmluZ30+fSAqLyAoYXdhaXQgZGJcbiAgICAgICAgLm5ld1F1ZXJ5KClcbiAgICAgICAgLmZyb20oRVZFTlRTX1RBQkxFKVxuICAgICAgICAud2hlcmUoYGNyZWF0ZWRfYXQgPD0gJHtkYi5xdW90ZShjdXRvZmYpfWApXG4gICAgICAgIC5yZXN1bHRzKCkpXG4gICAgICBjb25zdCBleHBpcmVkUmVwbGF5Q2hhbm5lbFJvd3MgPSAvKiogQHR5cGUge1dlYnNvY2tldFJlcGxheUNoYW5uZWxSb3dbXX0gKi8gKGF3YWl0IGRiXG4gICAgICAgIC5uZXdRdWVyeSgpXG4gICAgICAgIC5mcm9tKFJFUExBWV9DSEFOTkVMU19UQUJMRSlcbiAgICAgICAgLndoZXJlKGBpbnRlcmVzdGVkX3VudGlsIDw9ICR7ZGIucXVvdGUobm93KX1gKVxuICAgICAgICAucmVzdWx0cygpKVxuXG4gICAgICBmb3IgKGNvbnN0IGV4cGlyZWRFdmVudFJvdyBvZiBleHBpcmVkRXZlbnRSb3dzKSB7XG4gICAgICAgIGF3YWl0IGRiLmRlbGV0ZSh7XG4gICAgICAgICAgdGFibGVOYW1lOiBFVkVOVFNfVEFCTEUsXG4gICAgICAgICAgY29uZGl0aW9uczoge2lkOiBleHBpcmVkRXZlbnRSb3cuaWR9XG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZXhwaXJlZFJlcGxheUNoYW5uZWxSb3cgb2YgZXhwaXJlZFJlcGxheUNoYW5uZWxSb3dzKSB7XG4gICAgICAgIGF3YWl0IGRiLmRlbGV0ZSh7XG4gICAgICAgICAgdGFibGVOYW1lOiBSRVBMQVlfQ0hBTk5FTFNfVEFCTEUsXG4gICAgICAgICAgY29uZGl0aW9uczoge2NoYW5uZWw6IGV4cGlyZWRSZXBsYXlDaGFubmVsUm93LmNoYW5uZWx9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIF9lbnN1cmVTY2hlbWEoKSB7XG4gICAgYXdhaXQgdGhpcy5fd2l0aERiKGFzeW5jIChkYikgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5fZW5zdXJlRXZlbnRzVGFibGUoZGIpXG4gICAgICBhd2FpdCB0aGlzLl9lbnN1cmVSZXBsYXlDaGFubmVsc1RhYmxlKGRiKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBlbnN1cmUgZXZlbnRzIHRhYmxlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBkYiAtIERhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfZW5zdXJlRXZlbnRzVGFibGUoZGIpIHtcbiAgICB0aGlzLmxvZ2dlci5pbmZvKFwiQXBwbHlpbmcgd2Vic29ja2V0IGV2ZW50LWxvZyBzY2hlbWFcIilcblxuICAgIGlmIChhd2FpdCBkYi50YWJsZUV4aXN0cyhFVkVOVFNfVEFCTEUpKSB7XG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKFwiV2Vic29ja2V0IGV2ZW50LWxvZyB0YWJsZSBhbHJlYWR5IGV4aXN0cyAtIHNraXBwaW5nIGNyZWF0ZVwiKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZXZlbnRUYWJsZSA9IG5ldyBUYWJsZURhdGEoRVZFTlRTX1RBQkxFLCB7aWZOb3RFeGlzdHM6IHRydWV9KVxuXG4gICAgZXZlbnRUYWJsZS5pbnRlZ2VyKFwic2VxdWVuY2VcIiwge2F1dG9JbmNyZW1lbnQ6IHRydWUsIG51bGw6IGZhbHNlLCBwcmltYXJ5S2V5OiB0cnVlfSlcbiAgICBldmVudFRhYmxlLnN0cmluZyhcImlkXCIsIHtpbmRleDogdHJ1ZSwgbnVsbDogZmFsc2V9KVxuICAgIGV2ZW50VGFibGUuc3RyaW5nKFwiY2hhbm5lbFwiLCB7aW5kZXg6IHRydWUsIG51bGw6IGZhbHNlfSlcbiAgICBldmVudFRhYmxlLnRleHQoXCJwYXlsb2FkX2pzb25cIiwge251bGw6IGZhbHNlfSlcbiAgICBldmVudFRhYmxlLmRhdGV0aW1lKFwiY3JlYXRlZF9hdFwiLCB7aW5kZXg6IHRydWUsIG51bGw6IGZhbHNlfSlcblxuICAgIGF3YWl0IGRiLmNyZWF0ZVRhYmxlKGV2ZW50VGFibGUpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBlbnN1cmUgcmVwbGF5IGNoYW5uZWxzIHRhYmxlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBkYiAtIERhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfZW5zdXJlUmVwbGF5Q2hhbm5lbHNUYWJsZShkYikge1xuICAgIGlmIChhd2FpdCBkYi50YWJsZUV4aXN0cyhSRVBMQVlfQ0hBTk5FTFNfVEFCTEUpKSByZXR1cm5cblxuICAgIGNvbnN0IHJlcGxheUNoYW5uZWxUYWJsZSA9IG5ldyBUYWJsZURhdGEoUkVQTEFZX0NIQU5ORUxTX1RBQkxFLCB7aWZOb3RFeGlzdHM6IHRydWV9KVxuXG4gICAgcmVwbGF5Q2hhbm5lbFRhYmxlLnN0cmluZyhcImNoYW5uZWxcIiwge251bGw6IGZhbHNlLCBwcmltYXJ5S2V5OiB0cnVlfSlcbiAgICByZXBsYXlDaGFubmVsVGFibGUuZGF0ZXRpbWUoXCJpbnRlcmVzdGVkX3VudGlsXCIsIHtpbmRleDogdHJ1ZSwgbnVsbDogZmFsc2V9KVxuXG4gICAgYXdhaXQgZGIuY3JlYXRlVGFibGUocmVwbGF5Q2hhbm5lbFRhYmxlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGV2ZW50IGJ5IGlkLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGFyZ3MuZGIgLSBEYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5pZCAtIEV2ZW50IGlkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7Y2hhbm5lbDogc3RyaW5nLCBjcmVhdGVkQXQ6IHN0cmluZywgaWQ6IHN0cmluZywgcGF5bG9hZDogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIHNlcXVlbmNlOiBudW1iZXJ9IHwgbnVsbD59IC0gRXZlbnQgcm93IG9yIG51bGwuXG4gICAqL1xuICBhc3luYyBfZ2V0RXZlbnRCeUlkKHtjaGFubmVsLCBkYiwgaWR9KSB7XG4gICAgY29uc3Qgcm93cyA9IC8qKiBAdHlwZSB7V2Vic29ja2V0RXZlbnRSb3dbXX0gKi8gKGF3YWl0IGRiXG4gICAgICAubmV3UXVlcnkoKVxuICAgICAgLmZyb20oRVZFTlRTX1RBQkxFKVxuICAgICAgLndoZXJlKHtjaGFubmVsLCBpZH0pXG4gICAgICAubGltaXQoMSlcbiAgICAgIC5yZXN1bHRzKCkpXG5cbiAgICBpZiAoIXJvd3NbMF0pIHJldHVybiBudWxsXG5cbiAgICByZXR1cm4gdGhpcy5fbm9ybWFsaXplRXZlbnRSb3cocm93c1swXSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIG5vcm1hbGl6ZSBldmVudCByb3cuXG4gICAqIEBwYXJhbSB7V2Vic29ja2V0RXZlbnRSb3d9IHJvdyAtIFJhdyByb3cuXG4gICAqIEByZXR1cm5zIHt7Y2hhbm5lbDogc3RyaW5nLCBjcmVhdGVkQXQ6IHN0cmluZywgaWQ6IHN0cmluZywgcGF5bG9hZDogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIHNlcXVlbmNlOiBudW1iZXJ9fSAtIE5vcm1hbGl6ZWQgcm93LlxuICAgKi9cbiAgX25vcm1hbGl6ZUV2ZW50Um93KHJvdykge1xuICAgIGNvbnN0IGNyZWF0ZWRBdFZhbHVlID0gcm93LmNyZWF0ZWRfYXRcblxuICAgIHJldHVybiB7XG4gICAgICBjaGFubmVsOiByb3cuY2hhbm5lbCxcbiAgICAgIGNyZWF0ZWRBdDogY3JlYXRlZEF0VmFsdWUgaW5zdGFuY2VvZiBEYXRlID8gY3JlYXRlZEF0VmFsdWUudG9JU09TdHJpbmcoKSA6IG5ldyBEYXRlKGNyZWF0ZWRBdFZhbHVlKS50b0lTT1N0cmluZygpLFxuICAgICAgaWQ6IHJvdy5pZCxcbiAgICAgIHBheWxvYWQ6IEpTT04ucGFyc2Uocm93LnBheWxvYWRfanNvbiksXG4gICAgICBzZXF1ZW5jZTogTnVtYmVyKHJvdy5zZXF1ZW5jZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyB1cHNlcnQgcmVwbGF5IGNoYW5uZWwgaW50ZXJlc3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGRiIC0gRGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge0RhdGV9IGFyZ3MuaW50ZXJlc3RlZFVudGlsIC0gUmV0ZW50aW9uIGRlYWRsaW5lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHRoZSByZXBsYXktY2hhbm5lbCByb3cgd2FzIHVwc2VydGVkLlxuICAgKi9cbiAgYXN5bmMgX3Vwc2VydFJlcGxheUNoYW5uZWxJbnRlcmVzdChkYiwge2NoYW5uZWwsIGludGVyZXN0ZWRVbnRpbH0pIHtcbiAgICBhd2FpdCBkYi51cHNlcnQoe1xuICAgICAgY29uZmxpY3RDb2x1bW5zOiBbXCJjaGFubmVsXCJdLFxuICAgICAgZGF0YToge1xuICAgICAgICBjaGFubmVsLFxuICAgICAgICBpbnRlcmVzdGVkX3VudGlsOiBpbnRlcmVzdGVkVW50aWxcbiAgICAgIH0sXG4gICAgICB0YWJsZU5hbWU6IFJFUExBWV9DSEFOTkVMU19UQUJMRSxcbiAgICAgIHVwZGF0ZUNvbHVtbnM6IFtcImludGVyZXN0ZWRfdW50aWxcIl1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgd2l0aCBkYi5cbiAgICogQHBhcmFtIHsoZGI6IGltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0KSA9PiBQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gY2FsbGJhY2sgLSBDYWxsYmFjay5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAtIENhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIF93aXRoRGIoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmVuc3VyZUNvbm5lY3Rpb25zKHtkYXRhYmFzZUlkZW50aWZpZXJzOiBbdGhpcy5kYXRhYmFzZUlkZW50aWZpZXJdLCBuYW1lOiBcIldlYnNvY2tldCBldmVudCBsb2cgc3RvcmVcIn0sIGFzeW5jIChkYnMpID0+IHtcbiAgICAgIGNvbnN0IGRiID0gZGJzW3RoaXMuZGF0YWJhc2VJZGVudGlmaWVyXVxuXG4gICAgICBpZiAoIWRiKSB0aHJvdyBuZXcgRXJyb3IoYE5vIGRhdGFiYXNlIGNvbm5lY3Rpb24gYXZhaWxhYmxlIGZvciBpZGVudGlmaWVyOiAke3RoaXMuZGF0YWJhc2VJZGVudGlmaWVyfWApXG5cbiAgICAgIHJldHVybiBhd2FpdCBjYWxsYmFjayhkYilcbiAgICB9KVxuICB9XG59XG4iXX0=
436
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWV2ZW50LWxvZy1zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9odHRwLXNlcnZlci93ZWJzb2NrZXQtZXZlbnQtbG9nLXN0b3JlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sUUFBUSxDQUFBO0FBQ2pDLE9BQU8sU0FBUyxNQUFNLGlDQUFpQyxDQUFBO0FBQ3ZELE9BQU8sTUFBTSxNQUFNLGNBQWMsQ0FBQTtBQUVqQzs7Ozs7Ozs7O0dBU0c7QUFDSDs7OztHQUlHO0FBQ0g7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxZQUFZLEdBQUcsMEJBQTBCLENBQUE7QUFDL0MsTUFBTSxxQkFBcUIsR0FBRywyQkFBMkIsQ0FBQTtBQUN6RCxNQUFNLG9CQUFvQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFBO0FBQzNDLE1BQU0sTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7QUFFNUI7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxzQ0FBc0MsQ0FBQyxhQUFhO0lBQ2xFLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7SUFFckMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsS0FBSyxHQUFHLElBQUkseUNBQXlDLENBQUMsRUFBQyxhQUFhLEVBQUMsQ0FBQyxDQUFBO1FBQ3RFLE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ2xDLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRCxNQUFNLENBQUMsT0FBTyxPQUFPLHlDQUF5QztJQUM1RDs7Ozs7O09BTUc7SUFDSCxZQUFZLEVBQUMsYUFBYSxFQUFFLGtCQUFrQixHQUFHLFNBQVMsRUFBRSxXQUFXLEdBQUcsb0JBQW9CLEVBQUM7UUFDN0YsSUFBSSxDQUFDLGFB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Q0FBQyxFQUFFLElBQUksRUFBRSwyQkFBMkIsRUFBQyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUNuSixNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUE7WUFFdkMsSUFBSSxDQUFDLEVBQUU7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQTtZQUV2RyxPQUFPLE1BQU0sUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQzNCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7cmFuZG9tVVVJRH0gZnJvbSBcImNyeXB0b1wiXG5pbXBvcnQgVGFibGVEYXRhIGZyb20gXCIuLi9kYXRhYmFzZS90YWJsZS1kYXRhL2luZGV4LmpzXCJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uL2xvZ2dlci5qc1wiXG5cbi8qKlxuICogV2Vic29ja2V0RXZlbnRSb3cgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFdlYnNvY2tldEV2ZW50Um93XG4gKiBAcHJvcGVydHkge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7RGF0ZSB8IHN0cmluZ30gY3JlYXRlZF9hdCAtIENyZWF0aW9uIHRpbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBFdmVudCBpZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXlsb2FkX2pzb24gLSBTZXJpYWxpemVkIHBheWxvYWQuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IHBhcmFtc19qc29uIC0gU2VyaWFsaXplZCBicm9hZGNhc3QgcGFyYW1zLCBvciBudWxsIHdoZW4gdGhlIHB1Ymxpc2ggY2FycmllZCBub25lLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBzdHJpbmd9IHNlcXVlbmNlIC0gU2VxdWVuY2UgbnVtYmVyLlxuICovXG4vKipcbiAqIFdlYnNvY2tldFJlcGxheUNoYW5uZWxSb3cgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFdlYnNvY2tldFJlcGxheUNoYW5uZWxSb3dcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICovXG4vKipcbiAqIE5vcm1hbGl6ZWQgcGVyc2lzdGVkIHdlYnNvY2tldCBldmVudC5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFdlYnNvY2tldFBlcnNpc3RlZEV2ZW50XG4gKiBAcHJvcGVydHkge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjcmVhdGVkQXQgLSBJU08gY3JlYXRpb24gdGltZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIEV2ZW50IGlkLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4gfCBudWxsfSBwYXJhbXMgLSBQZXJzaXN0ZWQgYnJvYWRjYXN0IHBhcmFtcywgb3IgbnVsbCB3aGVuIHRoZSBwdWJsaXNoIGNhcnJpZWQgbm9uZS5cbiAqIEBwcm9wZXJ0eSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHBheWxvYWQgLSBFdmVudCBwYXlsb2FkLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHNlcXVlbmNlIC0gU2VxdWVuY2UgbnVtYmVyLlxuICovXG5jb25zdCBFVkVOVFNfVEFCTEUgPSBcIndlYnNvY2tldF9jaGFubmVsX2V2ZW50c1wiXG5jb25zdCBSRVBMQVlfQ0hBTk5FTFNfVEFCTEUgPSBcIndlYnNvY2tldF9yZXBsYXlfY2hhbm5lbHNcIlxuY29uc3QgREVGQVVMVF9SRVRFTlRJT05fTVMgPSAxMCAqIDYwICogMTAwMFxuY29uc3Qgc3RvcmVzID0gbmV3IFdlYWtNYXAoKVxuXG4vKipcbiAqIFJ1bnMgdGhlIHdlYnNvY2tldEV2ZW50TG9nU3RvcmVGb3JDb25maWd1cmF0aW9uIGhlbHBlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBjb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbi5cbiAqIEByZXR1cm5zIHtWZWxvY2lvdXNIdHRwU2VydmVyV2Vic29ja2V0RXZlbnRMb2dTdG9yZX0gLSBTaGFyZWQgc3RvcmUgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3ZWJzb2NrZXRFdmVudExvZ1N0b3JlRm9yQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKSB7XG4gIGxldCBzdG9yZSA9IHN0b3Jlcy5nZXQoY29uZmlndXJhdGlvbilcblxuICBpZiAoIXN0b3JlKSB7XG4gICAgc3RvcmUgPSBuZXcgVmVsb2Npb3VzSHR0cFNlcnZlcldlYnNvY2tldEV2ZW50TG9nU3RvcmUoe2NvbmZpZ3VyYXRpb259KVxuICAgIHN0b3Jlcy5zZXQoY29uZmlndXJhdGlvbiwgc3RvcmUpXG4gIH1cblxuICByZXR1cm4gc3RvcmVcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzSHR0cFNlcnZlcldlYnNvY2tldEV2ZW50TG9nU3RvcmUge1xuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmRhdGFiYXNlSWRlbnRpZmllcl0gLSBEYXRhYmFzZSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MucmV0ZW50aW9uTXNdIC0gRXZlbnQgcmV0ZW50aW9uIGluIG1pbGxpc2Vjb25kcy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9uLCBkYXRhYmFzZUlkZW50aWZpZXIgPSBcImRlZmF1bHRcIiwgcmV0ZW50aW9uTXMgPSBERUZBVUxUX1JFVEVOVElPTl9NU30pIHtcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5kYXRhYmFzZUlkZW50aWZpZXIgPSBkYXRhYmFzZUlkZW50aWZpZXJcbiAgICB0aGlzLnJldGVudGlvbk1zID0gcmV0ZW50aW9uTXNcbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcylcbiAgICB0aGlzLl9pc1JlYWR5ID0gZmFsc2VcbiAgICB0aGlzLl9yZWFkeVByb21pc2UgPSBudWxsXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAqIEB0eXBlIHtNYXA8c3RyaW5nLCBudW1iZXI+fSAqL1xuICAgIHRoaXMuX2ludGVyZXN0ZWRDaGFubmVscyA9IG5ldyBNYXAoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZW5zdXJlIHJlYWR5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHJlYWR5LlxuICAgKi9cbiAgYXN5bmMgZW5zdXJlUmVhZHkoKSB7XG4gICAgaWYgKGF3YWl0IHRoaXMuX3NjaGVtYVJlYWR5KCkpIHJldHVyblxuXG4gICAgaWYgKHRoaXMuX3JlYWR5UHJvbWlzZSkgcmV0dXJuIGF3YWl0IHRoaXMuX3JlYWR5UHJvbWlzZVxuXG4gICAgdGhpcy5fcmVhZHlQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5zZXRDdXJyZW50KClcbiAgICAgIGF3YWl0IHRoaXMuX2Vuc3VyZVNjaGVtYSgpXG4gICAgICB0aGlzLl9pc1JlYWR5ID0gdHJ1ZVxuICAgIH0pKClcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9yZWFkeVByb21pc2VcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKCF0aGlzLl9pc1JlYWR5KSB7XG4gICAgICAgIHRoaXMuX3JlYWR5UHJvbWlzZSA9IG51bGxcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmUtdmFsaWRhdGVzIGNhY2hlZCBzY2hlbWEgcmVhZGluZXNzIGJlY2F1c2UgdHJhbnNhY3Rpb25hbCBEREwgY2FuIHJvbGwgdGhlIHRhYmxlcyBiYWNrLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIHRoZSBjYWNoZWQgcmVhZHkgc3RhdGUgaXMgc3RpbGwgdmFsaWQuXG4gICAqL1xuICBhc3luYyBfc2NoZW1hUmVhZHkoKSB7XG4gICAgaWYgKCF0aGlzLl9pc1JlYWR5KSByZXR1cm4gZmFsc2VcbiAgICBpZiAoYXdhaXQgdGhpcy5fc2NoZW1hUHJlc2VudCgpKSByZXR1cm4gdHJ1ZVxuXG4gICAgdGhpcy5faXNSZWFkeSA9IGZhbHNlXG4gICAgdGhpcy5fcmVhZHlQcm9taXNlID0gbnVsbFxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzY2hlbWEgcHJlc2VudC5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciBib3RoIGV2ZW50LWxvZyB0YWJsZXMgZXhpc3QgYW5kIHRoZSBldmVudHMgdGFibGUgY2FycmllcyBldmVyeSByZXF1aXJlZCBjb2x1bW4uXG4gICAqL1xuICBhc3luYyBfc2NoZW1hUHJlc2VudCgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fd2l0aERiKGFzeW5jIChkYikgPT5cbiAgICAgIChhd2FpdCBkYi50YWJsZUV4aXN0cyhFVkVOVFNfVEFCTEUpICYmIGF3YWl0IGRiLnRhYmxlRXhpc3RzKFJFUExBWV9DSEFOTkVMU19UQUJMRSkpXG4gICAgICAmJiAoYXdhaXQgdGhpcy5fY29sdW1uUHJlc2VudChkYiwgRVZFTlRTX1RBQkxFLCBcInBhcmFtc19qc29uXCIpKVxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbHVtbiBwcmVzZW50LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBkYiAtIERhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sdW1uTmFtZSAtIENvbHVtbiBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIHRoZSBjb2x1bW4gZXhpc3RzIG9uIHRoZSB0YWJsZS5cbiAgICovXG4gIGFzeW5jIF9jb2x1bW5QcmVzZW50KGRiLCB0YWJsZU5hbWUsIGNvbHVtbk5hbWUpIHtcbiAgICBjb25zdCB0YWJsZXMgPSBhd2FpdCBkYi5nZXRUYWJsZXMoKVxuICAgIGNvbnN0IHRhYmxlID0gdGFibGVzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmdldE5hbWUoKSA9PSB0YWJsZU5hbWUpXG5cbiAgICBpZiAoIXRhYmxlKSByZXR1cm4gZmFsc2VcblxuICAgIHJldHVybiAoYXdhaXQgdGFibGUuZ2V0Q29sdW1uQnlOYW1lKGNvbHVtbk5hbWUpKSAhPT0gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhcHBlbmQgZXZlbnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gYXJncy5wYXlsb2FkIC0gRXZlbnQgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4gfCBudWxsfSBbYXJncy5wYXJhbXNdIC0gQnJvYWRjYXN0IHBhcmFtcyB0byBwZXJzaXN0IGZvciBzdHJlYW0tc2NvcGVkIHJlcGxheSwgb3IgbnVsbCB3aGVuIHRoZSBwdWJsaXNoIGNhcnJpZWQgbm9uZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8V2Vic29ja2V0UGVyc2lzdGVkRXZlbnQ+fSAtIFBlcnNpc3RlZCBldmVudCByb3cuXG4gICAqL1xuICBhc3luYyBhcHBlbmRFdmVudCh7Y2hhbm5lbCwgcGFyYW1zID0gbnVsbCwgcGF5bG9hZH0pIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVJlYWR5KClcblxuICAgIGNvbnN0IGlkID0gcmFuZG9tVVVJRCgpXG4gICAgY29uc3QgY3JlYXRlZEF0ID0gbmV3IERhdGUoKVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3dpdGhEYihhc3luYyAoZGIpID0+IHtcbiAgICAgIGF3YWl0IGRiLmluc2VydCh7XG4gICAgICAgIHRhYmxlTmFtZTogRVZFTlRTX1RBQkxFLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICBjcmVhdGVkX2F0OiBjcmVhdGVkQXQsXG4gICAgICAgICAgaWQsXG4gICAgICAgICAgcGFyYW1zX2pzb246IHBhcmFtcyA9PT0gbnVsbCA/IG51bGwgOiBKU09OLnN0cmluZ2lmeShwYXJhbXMpLFxuICAgICAgICAgIHBheWxvYWRfanNvbjogSlNPTi5zdHJpbmdpZnkocGF5bG9hZClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHJldHVybiB7Y2hhbm5lbCwgY3JlYXRlZEF0OiBjcmVhdGVkQXQudG9JU09TdHJpbmcoKSwgaWQsIHBhcmFtcywgcGF5bG9hZH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbWFyayBjaGFubmVsIGludGVyZXN0ZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHRoZSBjaGFubmVsIGludGVyZXN0IHdhcyBwZXJzaXN0ZWQuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIHRoZSBjaGFubmVsIGlzIHJlZ2lzdGVyZWQgbGl2ZS1vbmx5LCB3aGljaCBmb3JiaWRzIHJlcGxheSBwZXJzaXN0ZW5jZS5cbiAgICovXG4gIGFzeW5jIG1hcmtDaGFubmVsSW50ZXJlc3RlZChjaGFubmVsKSB7XG4gICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc1dlYnNvY2tldENoYW5uZWxMaXZlT25seShjaGFubmVsKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBXZWJzb2NrZXQgY2hhbm5lbCBcIiR7Y2hhbm5lbH1cIiBpcyByZWdpc3RlcmVkIGxpdmUtb25seSBhbmQgY2Fubm90IGJlIG1hcmtlZCBpbnRlcmVzdGVkIGluIHJlcGxheSBwZXJzaXN0ZW5jZWApXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVSZWFkeSgpXG5cbiAgICBjb25zdCBpbnRlcmVzdGVkVW50aWwgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgdGhpcy5yZXRlbnRpb25NcylcblxuICAgIHRoaXMuX2ludGVyZXN0ZWRDaGFubmVscy5zZXQoY2hhbm5lbCwgaW50ZXJlc3RlZFVudGlsLmdldFRpbWUoKSlcblxuICAgIGF3YWl0IHRoaXMuX3dpdGhEYihhc3luYyAoZGIpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuX3Vwc2VydFJlcGxheUNoYW5uZWxJbnRlcmVzdChkYiwge2NoYW5uZWwsIGludGVyZXN0ZWRVbnRpbH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNob3VsZCBwZXJzaXN0IGNoYW5uZWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIHRoZSBjaGFubmVsIHNob3VsZCBiZSBwZXJzaXN0ZWQgZm9yIHJlcGxheS5cbiAgICovXG4gIGFzeW5jIHNob3VsZFBlcnNpc3RDaGFubmVsKGNoYW5uZWwpIHtcbiAgICAvLyBBIGNoYW5uZWwgcmUtcmVnaXN0ZXJlZCBsaXZlLW9ubHkgY2FuIHN0aWxsIGhvbGQgY2FjaGVkIG9yIGR1cmFibGVcbiAgICAvLyBpbnRlcmVzdCBzdGF0ZSBmcm9tIGJlZm9yZSB0aGUgcmUtcmVnaXN0cmF0aW9uOyB0aGUgbGl2ZS1vbmx5XG4gICAgLy8gY29udHJhY3QgbXVzdCBob2xkIGF0IHRoZSBwZXJzaXN0ZW5jZSBkZWNpc2lvbiwgbm90IG9ubHkgYXRcbiAgICAvLyBpbnRlcmVzdCBtYXJraW5nLlxuICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNXZWJzb2NrZXRDaGFubmVsTGl2ZU9ubHkoY2hhbm5lbCkpIHJldHVybiBmYWxzZVxuXG4gICAgaWYgKHRoaXMuX2NoYW5uZWxJbnRlcmVzdENhY2hlZChjaGFubmVsKSkgcmV0dXJuIHRydWVcbiAgICBpZiAodGhpcy5faW50ZXJlc3RlZENoYW5uZWxzLnNpemUgPT09IDApIHJldHVybiBmYWxzZVxuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVSZWFkeSgpXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fd2l0aERiKGFzeW5jIChkYikgPT4ge1xuICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IGRiXG4gICAgICAgIC5uZXdRdWVyeSgpXG4gICAgICAgIC5mcm9tKFJFUExBWV9DSEFOTkVMU19UQUJMRSlcbiAgICAgICAgLndoZXJlKHtjaGFubmVsfSlcbiAgICAgICAgLndoZXJlKGBpbnRlcmVzdGVkX3VudGlsID4gJHtkYi5xdW90ZShuZXcgRGF0ZSgpKX1gKVxuICAgICAgICAubGltaXQoMSlcbiAgICAgICAgLnJlc3VsdHMoKVxuXG4gICAgICByZXR1cm4gcm93cy5sZW5ndGggPiAwXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNoYW5uZWwgaW50ZXJlc3QgY2FjaGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBtZW1vcnkgY2FjaGUgc3RpbGwgbWFya3MgdGhlIGNoYW5uZWwgaW50ZXJlc3RlZC5cbiAgICovXG4gIF9jaGFubmVsSW50ZXJlc3RDYWNoZWQoY2hhbm5lbCkge1xuICAgIGNvbnN0IGludGVyZXN0ZWRVbnRpbCA9IHRoaXMuX2ludGVyZXN0ZWRDaGFubmVscy5nZXQoY2hhbm5lbClcblxuICAgIGlmICghaW50ZXJlc3RlZFVudGlsKSByZXR1cm4gZmFsc2VcbiAgICBpZiAoaW50ZXJlc3RlZFVudGlsID4gRGF0ZS5ub3coKSkgcmV0dXJuIHRydWVcblxuICAgIHRoaXMuX2ludGVyZXN0ZWRDaGFubmVscy5kZWxldGUoY2hhbm5lbClcblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGV2ZW50IGJ5IGlkLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmlkIC0gRXZlbnQgaWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFdlYnNvY2tldFBlcnNpc3RlZEV2ZW50IHwgbnVsbD59IC0gRXZlbnQgcm93IG9yIG51bGwuXG4gICAqL1xuICBhc3luYyBnZXRFdmVudEJ5SWQoe2NoYW5uZWwsIGlkfSkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlUmVhZHkoKVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3dpdGhEYihhc3luYyAoZGIpID0+IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9nZXRFdmVudEJ5SWQoe2NoYW5uZWwsIGRiLCBpZH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGxhdGVzdCBzZXF1ZW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlciB8IG51bGw+fSAtIExhdGVzdCBjaGFubmVsIHNlcXVlbmNlLlxuICAgKi9cbiAgYXN5bmMgbGF0ZXN0U2VxdWVuY2UoY2hhbm5lbCkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlUmVhZHkoKVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3dpdGhEYihhc3luYyAoZGIpID0+IHtcbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBkYlxuICAgICAgICAubmV3UXVlcnkoKVxuICAgICAgICAuZnJvbShFVkVOVFNfVEFCTEUpXG4gICAgICAgIC53aGVyZSh7Y2hhbm5lbH0pXG4gICAgICAgIC5vcmRlcihcInNlcXVlbmNlIERFU0NcIilcbiAgICAgICAgLmxpbWl0KDEpXG4gICAgICAgIC5yZXN1bHRzKClcbiAgICAgIGNvbnN0IHJvdyA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+IHwgdW5kZWZpbmVkfSAqLyAocm93c1swXSlcblxuICAgICAgaWYgKCFyb3cpIHJldHVybiBudWxsXG5cbiAgICAgIHJldHVybiBOdW1iZXIocm93LnNlcXVlbmNlKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgZXZlbnRzIGFmdGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLnNlcXVlbmNlIC0gTG93ZXIgYm91bmQgc2VxdWVuY2UuXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZH0gW2FyZ3MudXBUb1NlcXVlbmNlXSAtIEluY2x1c2l2ZSBjZWlsaW5nIHNlcXVlbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxXZWJzb2NrZXRQZXJzaXN0ZWRFdmVudFtdPn0gLSBPcmRlcmVkIGV2ZW50cy5cbiAgICovXG4gIGFzeW5jIGdldEV2ZW50c0FmdGVyKHtjaGFubmVsLCBzZXF1ZW5jZSwgdXBUb1NlcXVlbmNlfSkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlUmVhZHkoKVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3dpdGhEYihhc3luYyAoZGIpID0+IHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gZGJcbiAgICAgICAgLm5ld1F1ZXJ5KClcbiAgICAgICAgLmZyb20oRVZFTlRTX1RBQkxFKVxuICAgICAgICAud2hlcmUoe2NoYW5uZWx9KVxuICAgICAgICAud2hlcmUoYHNlcXVlbmNlID4gJHtkYi5xdW90ZShzZXF1ZW5jZSl9YClcbiAgICAgICAgLm9yZGVyKFwic2VxdWVuY2UgQVNDXCIpXG5cbiAgICAgIGlmICh0eXBlb2YgdXBUb1NlcXVlbmNlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHF1ZXJ5LndoZXJlKGBzZXF1ZW5jZSA8PSAke2RiLnF1b3RlKHVwVG9TZXF1ZW5jZSl9YClcbiAgICAgIH1cblxuICAgICAgY29uc3Qgcm93cyA9IC8qKiBAdHlwZSB7V2Vic29ja2V0RXZlbnRSb3dbXX0gKi8gKGF3YWl0IHF1ZXJ5LnJlc3VsdHMoKSlcblxuICAgICAgcmV0dXJuIHJvd3MubWFwKChyb3cpID0+IHRoaXMuX25vcm1hbGl6ZUV2ZW50Um93KHJvdykpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNsZWFudXAgZXhwaXJlZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IFthcmdzXSAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7RGF0ZX0gW2FyZ3Mubm93XSAtIENsZWFudXAgcmVmZXJlbmNlIHRpbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY2xlYW51cCBjb21wbGV0ZXMuXG4gICAqL1xuICBhc3luYyBjbGVhbnVwRXhwaXJlZCh7bm93ID0gbmV3IERhdGUoKX0gPSB7fSkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlUmVhZHkoKVxuXG4gICAgY29uc3QgY3V0b2ZmID0gbmV3IERhdGUobm93LmdldFRpbWUoKSAtIHRoaXMucmV0ZW50aW9uTXMpXG5cbiAgICBhd2FpdCB0aGlzLl93aXRoRGIoYXN5bmMgKGRiKSA9PiB7XG4gICAgICBjb25zdCBleHBpcmVkRXZlbnRSb3dzID0gLyoqIEB0eXBlIHtBcnJheTx7aWQ6IHN0cmluZ30+fSAqLyAoYXdhaXQgZGJcbiAgICAgICAgLm5ld1F1ZXJ5KClcbiAgICAgICAgLmZyb20oRVZFTlRTX1RBQkxFKVxuICAgICAgICAud2hlcmUoYGNyZWF0ZWRfYXQgPD0gJHtkYi5xdW90ZShjdXRvZmYpfWApXG4gICAgICAgIC5yZXN1bHRzKCkpXG4gICAgICBjb25zdCBleHBpcmVkUmVwbGF5Q2hhbm5lbFJvd3MgPSAvKiogQHR5cGUge1dlYnNvY2tldFJlcGxheUNoYW5uZWxSb3dbXX0gKi8gKGF3YWl0IGRiXG4gICAgICAgIC5uZXdRdWVyeSgpXG4gICAgICAgIC5mcm9tKFJFUExBWV9DSEFOTkVMU19UQUJMRSlcbiAgICAgICAgLndoZXJlKGBpbnRlcmVzdGVkX3VudGlsIDw9ICR7ZGIucXVvdGUobm93KX1gKVxuICAgICAgICAucmVzdWx0cygpKVxuXG4gICAgICBmb3IgKGNvbnN0IGV4cGlyZWRFdmVudFJvdyBvZiBleHBpcmVkRXZlbnRSb3dzKSB7XG4gICAgICAgIGF3YWl0IGRiLmRlbGV0ZSh7XG4gICAgICAgICAgdGFibGVOYW1lOiBFVkVOVFNfVEFCTEUsXG4gICAgICAgICAgY29uZGl0aW9uczoge2lkOiBleHBpcmVkRXZlbnRSb3cuaWR9XG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZXhwaXJlZFJlcGxheUNoYW5uZWxSb3cgb2YgZXhwaXJlZFJlcGxheUNoYW5uZWxSb3dzKSB7XG4gICAgICAgIGF3YWl0IGRiLmRlbGV0ZSh7XG4gICAgICAgICAgdGFibGVOYW1lOiBSRVBMQVlfQ0hBTk5FTFNfVEFCTEUsXG4gICAgICAgICAgY29uZGl0aW9uczoge2NoYW5uZWw6IGV4cGlyZWRSZXBsYXlDaGFubmVsUm93LmNoYW5uZWx9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIF9lbnN1cmVTY2hlbWEoKSB7XG4gICAgYXdhaXQgdGhpcy5fd2l0aERiKGFzeW5jIChkYikgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5fZW5zdXJlRXZlbnRzVGFibGUoZGIpXG4gICAgICBhd2FpdCB0aGlzLl9lbnN1cmVSZXBsYXlDaGFubmVsc1RhYmxlKGRiKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBlbnN1cmUgZXZlbnRzIHRhYmxlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBkYiAtIERhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfZW5zdXJlRXZlbnRzVGFibGUoZGIpIHtcbiAgICBpZiAoYXdhaXQgZGIudGFibGVFeGlzdHMoRVZFTlRTX1RBQkxFKSkge1xuICAgICAgYXdhaXQgdGhpcy5fZW5zdXJlRXZlbnRzVGFibGVDb2x1bW5zKGRiKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5sb2dnZXIuaW5mbyhcIkFwcGx5aW5nIHdlYnNvY2tldCBldmVudC1sb2cgc2NoZW1hXCIpXG5cbiAgICBjb25zdCBldmVudFRhYmxlID0gbmV3IFRhYmxlRGF0YShFVkVOVFNfVEFCTEUsIHtpZk5vdEV4aXN0czogdHJ1ZX0pXG5cbiAgICBldmVudFRhYmxlLmludGVnZXIoXCJzZXF1ZW5jZVwiLCB7YXV0b0luY3JlbWVudDogdHJ1ZSwgbnVsbDogZmFsc2UsIHByaW1hcnlLZXk6IHRydWV9KVxuICAgIGV2ZW50VGFibGUuc3RyaW5nKFwiaWRcIiwge2luZGV4OiB0cnVlLCBudWxsOiBmYWxzZX0pXG4gICAgZXZlbnRUYWJsZS5zdHJpbmcoXCJjaGFubmVsXCIsIHtpbmRleDogdHJ1ZSwgbnVsbDogZmFsc2V9KVxuICAgIGV2ZW50VGFibGUudGV4dChcInBhcmFtc19qc29uXCIsIHtudWxsOiB0cnVlfSlcbiAgICBldmVudFRhYmxlLnRleHQoXCJwYXlsb2FkX2pzb25cIiwge251bGw6IGZhbHNlfSlcbiAgICBldmVudFRhYmxlLmRhdGV0aW1lKFwiY3JlYXRlZF9hdFwiLCB7aW5kZXg6IHRydWUsIG51bGw6IGZhbHNlfSlcblxuICAgIGF3YWl0IGRiLmNyZWF0ZVRhYmxlKGV2ZW50VGFibGUpXG4gIH1cblxuICAvKipcbiAgICogQWRkcyBjb2x1bW5zIHRoZSBjdXJyZW50IHNjaGVtYSByZXF1aXJlcyB0byBhbiBldmVudHMgdGFibGUgY3JlYXRlZCBieSBhblxuICAgKiBvbGRlciBmcmFtZXdvcmsgdmVyc2lvbiwgc28gdXBncmFkZXMga2VlcCB3b3JraW5nIHdpdGhvdXQgYSBtYW51YWwgQUxURVIuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGRiIC0gRGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiB0aGUgZXZlbnRzIHRhYmxlIHNjaGVtYSBpcyBjdXJyZW50LlxuICAgKi9cbiAgYXN5bmMgX2Vuc3VyZUV2ZW50c1RhYmxlQ29sdW1ucyhkYikge1xuICAgIGlmIChhd2FpdCB0aGlzLl9jb2x1bW5QcmVzZW50KGRiLCBFVkVOVFNfVEFCTEUsIFwicGFyYW1zX2pzb25cIikpIHJldHVyblxuXG4gICAgdGhpcy5sb2dnZXIuaW5mbyhcIkFkZGluZyBwYXJhbXNfanNvbiBjb2x1bW4gdG8gd2Vic29ja2V0IGV2ZW50LWxvZyB0YWJsZVwiKVxuXG4gICAgY29uc3QgdGFibGVEYXRhID0gbmV3IFRhYmxlRGF0YShFVkVOVFNfVEFCTEUpXG5cbiAgICB0YWJsZURhdGEuYWRkQ29sdW1uKFwicGFyYW1zX2pzb25cIiwge2lzTmV3Q29sdW1uOiB0cnVlLCBudWxsOiB0cnVlLCB0eXBlOiBcInRleHRcIn0pXG5cbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBzcWwgb2YgYXdhaXQgZGIuYWx0ZXJUYWJsZVNRTHModGFibGVEYXRhKSkge1xuICAgICAgICBhd2FpdCBkYi5xdWVyeShzcWwpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEEgY29uY3VycmVudCBwcm9jZXNzIGNhbiBhZGQgdGhlIGNvbHVtbiBiZXR3ZWVuIHRoZSBwcmVzZW5jZSBjaGVja1xuICAgICAgLy8gYW5kIHRoZSBBTFRFUiAobXVsdGktd29ya2VyIG9yIHJvbGxpbmcgdXBncmFkZSk7IHRoZVxuICAgICAgLy8gZHVwbGljYXRlLWNvbHVtbiBmYWlsdXJlIGlzIHRoZW4gdGhlIGV4cGVjdGVkIG91dGNvbWUsIG5vdCBhIHJlYWxcbiAgICAgIC8vIGVycm9yLiBBbnl0aGluZyBlbHNlIHJlLWNoZWNrcyBhcyBhYnNlbnQgYW5kIHJldGhyb3dzLlxuICAgICAgaWYgKGF3YWl0IHRoaXMuX2NvbHVtblByZXNlbnQoZGIsIEVWRU5UU19UQUJMRSwgXCJwYXJhbXNfanNvblwiKSkgcmV0dXJuXG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZW5zdXJlIHJlcGxheSBjaGFubmVscyB0YWJsZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gZGIgLSBEYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX2Vuc3VyZVJlcGxheUNoYW5uZWxzVGFibGUoZGIpIHtcbiAgICBpZiAoYXdhaXQgZGIudGFibGVFeGlzdHMoUkVQTEFZX0NIQU5ORUxTX1RBQkxFKSkgcmV0dXJuXG5cbiAgICBjb25zdCByZXBsYXlDaGFubmVsVGFibGUgPSBuZXcgVGFibGVEYXRhKFJFUExBWV9DSEFOTkVMU19UQUJMRSwge2lmTm90RXhpc3RzOiB0cnVlfSlcblxuICAgIHJlcGxheUNoYW5uZWxUYWJsZS5zdHJpbmcoXCJjaGFubmVsXCIsIHtudWxsOiBmYWxzZSwgcHJpbWFyeUtleTogdHJ1ZX0pXG4gICAgcmVwbGF5Q2hhbm5lbFRhYmxlLmRhdGV0aW1lKFwiaW50ZXJlc3RlZF91bnRpbFwiLCB7aW5kZXg6IHRydWUsIG51bGw6IGZhbHNlfSlcblxuICAgIGF3YWl0IGRiLmNyZWF0ZVRhYmxlKHJlcGxheUNoYW5uZWxUYWJsZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBldmVudCBieSBpZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBhcmdzLmRiIC0gRGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuaWQgLSBFdmVudCBpZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8V2Vic29ja2V0UGVyc2lzdGVkRXZlbnQgfCBudWxsPn0gLSBFdmVudCByb3cgb3IgbnVsbC5cbiAgICovXG4gIGFzeW5jIF9nZXRFdmVudEJ5SWQoe2NoYW5uZWwsIGRiLCBpZH0pIHtcbiAgICBjb25zdCByb3dzID0gLyoqIEB0eXBlIHtXZWJzb2NrZXRFdmVudFJvd1tdfSAqLyAoYXdhaXQgZGJcbiAgICAgIC5uZXdRdWVyeSgpXG4gICAgICAuZnJvbShFVkVOVFNfVEFCTEUpXG4gICAgICAud2hlcmUoe2NoYW5uZWwsIGlkfSlcbiAgICAgIC5saW1pdCgxKVxuICAgICAgLnJlc3VsdHMoKSlcblxuICAgIGlmICghcm93c1swXSkgcmV0dXJuIG51bGxcblxuICAgIHJldHVybiB0aGlzLl9ub3JtYWxpemVFdmVudFJvdyhyb3dzWzBdKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbm9ybWFsaXplIGV2ZW50IHJvdy5cbiAgICogQHBhcmFtIHtXZWJzb2NrZXRFdmVudFJvd30gcm93IC0gUmF3IHJvdy5cbiAgICogQHJldHVybnMge1dlYnNvY2tldFBlcnNpc3RlZEV2ZW50fSAtIE5vcm1hbGl6ZWQgcm93LlxuICAgKi9cbiAgX25vcm1hbGl6ZUV2ZW50Um93KHJvdykge1xuICAgIGNvbnN0IGNyZWF0ZWRBdFZhbHVlID0gcm93LmNyZWF0ZWRfYXRcblxuICAgIHJldHVybiB7XG4gICAgICBjaGFubmVsOiByb3cuY2hhbm5lbCxcbiAgICAgIGNyZWF0ZWRBdDogY3JlYXRlZEF0VmFsdWUgaW5zdGFuY2VvZiBEYXRlID8gY3JlYXRlZEF0VmFsdWUudG9JU09TdHJpbmcoKSA6IG5ldyBEYXRlKGNyZWF0ZWRBdFZhbHVlKS50b0lTT1N0cmluZygpLFxuICAgICAgaWQ6IHJvdy5pZCxcbiAgICAgIHBhcmFtczogcm93LnBhcmFtc19qc29uID09PSBudWxsIHx8IHJvdy5wYXJhbXNfanNvbiA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IEpTT04ucGFyc2Uocm93LnBhcmFtc19qc29uKSxcbiAgICAgIHBheWxvYWQ6IEpTT04ucGFyc2Uocm93LnBheWxvYWRfanNvbiksXG4gICAgICBzZXF1ZW5jZTogTnVtYmVyKHJvdy5zZXF1ZW5jZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyB1cHNlcnQgcmVwbGF5IGNoYW5uZWwgaW50ZXJlc3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGRiIC0gRGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge0RhdGV9IGFyZ3MuaW50ZXJlc3RlZFVudGlsIC0gUmV0ZW50aW9uIGRlYWRsaW5lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHRoZSByZXBsYXktY2hhbm5lbCByb3cgd2FzIHVwc2VydGVkLlxuICAgKi9cbiAgYXN5bmMgX3Vwc2VydFJlcGxheUNoYW5uZWxJbnRlcmVzdChkYiwge2NoYW5uZWwsIGludGVyZXN0ZWRVbnRpbH0pIHtcbiAgICBhd2FpdCBkYi51cHNlcnQoe1xuICAgICAgY29uZmxpY3RDb2x1bW5zOiBbXCJjaGFubmVsXCJdLFxuICAgICAgZGF0YToge1xuICAgICAgICBjaGFubmVsLFxuICAgICAgICBpbnRlcmVzdGVkX3VudGlsOiBpbnRlcmVzdGVkVW50aWxcbiAgICAgIH0sXG4gICAgICB0YWJsZU5hbWU6IFJFUExBWV9DSEFOTkVMU19UQUJMRSxcbiAgICAgIHVwZGF0ZUNvbHVtbnM6IFtcImludGVyZXN0ZWRfdW50aWxcIl1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgd2l0aCBkYi5cbiAgICogQHBhcmFtIHsoZGI6IGltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0KSA9PiBQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gY2FsbGJhY2sgLSBDYWxsYmFjay5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAtIENhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIF93aXRoRGIoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmVuc3VyZUNvbm5lY3Rpb25zKHtkYXRhYmFzZUlkZW50aWZpZXJzOiBbdGhpcy5kYXRhYmFzZUlkZW50aWZpZXJdLCBuYW1lOiBcIldlYnNvY2tldCBldmVudCBsb2cgc3RvcmVcIn0sIGFzeW5jIChkYnMpID0+IHtcbiAgICAgIGNvbnN0IGRiID0gZGJzW3RoaXMuZGF0YWJhc2VJZGVudGlmaWVyXVxuXG4gICAgICBpZiAoIWRiKSB0aHJvdyBuZXcgRXJyb3IoYE5vIGRhdGFiYXNlIGNvbm5lY3Rpb24gYXZhaWxhYmxlIGZvciBpZGVudGlmaWVyOiAke3RoaXMuZGF0YWJhc2VJZGVudGlmaWVyfWApXG5cbiAgICAgIHJldHVybiBhd2FpdCBjYWxsYmFjayhkYilcbiAgICB9KVxuICB9XG59XG4iXX0=
@@ -77,12 +77,14 @@ export declare class VelociousHttpServerWebsocketEventsHost {
77
77
  * Runs persist v2 event if needed.
78
78
  * @param {object} args - Options.
79
79
  * @param {ReturnType<typeof JSON.parse>} args.body - Event body.
80
+ * @param {Record<string, ReturnType<typeof JSON.parse>>} args.broadcastParams - Routing filter params.
80
81
  * @param {string} args.channel - Channel name.
81
82
  * @param {import("../configuration.js").default} args.configuration - Originating configuration.
82
83
  * @returns {Promise<{createdAt: string, id: string} | null>} - Persisted event metadata when storage is enabled.
83
84
  */
84
- _persistV2EventIfNeeded({ body, channel, configuration }: {
85
+ _persistV2EventIfNeeded({ body, broadcastParams, channel, configuration }: {
85
86
  body: ReturnType<typeof JSON.parse>;
87
+ broadcastParams: Record<string, ReturnType<typeof JSON.parse>>;
86
88
  channel: string;
87
89
  configuration: import("../configuration.js").default;
88
90
  }): Promise<{
@@ -104,14 +106,19 @@ export declare class VelociousHttpServerWebsocketEventsHost {
104
106
  id: string;
105
107
  } | null>;
106
108
  /**
107
- * Runs persist channel event if needed.
109
+ * Runs persist channel event if needed. Persists the broadcast's routing
110
+ * params (sanitized through the channel class's
111
+ * `replayableBroadcastParams`) so replay can re-apply `matches()` per
112
+ * stream instead of delivering the whole channel's log.
108
113
  * @param {object} args - Options object.
114
+ * @param {Record<string, ReturnType<typeof JSON.parse>> | null} [args.broadcastParams] - Broadcast params to persist for stream-scoped replay.
109
115
  * @param {string} args.channel - Channel name.
110
116
  * @param {ReturnType<typeof JSON.parse>} args.payload - Payload data.
111
117
  * @param {import("../configuration.js").default} [args.configuration] - Configuration owning the event store.
112
118
  * @returns {Promise<{createdAt: string, id: string} | null>} - Persisted event metadata.
113
119
  */
114
- _persistChannelEventIfNeeded({ channel, payload, configuration }: {
120
+ _persistChannelEventIfNeeded({ broadcastParams, channel, configuration, payload }: {
121
+ broadcastParams?: Record<string, ReturnType<typeof JSON.parse>> | null;
115
122
  channel: string;
116
123
  payload: ReturnType<typeof JSON.parse>;
117
124
  configuration?: import("../configuration.js").default;
@@ -1 +1 @@
1
- {"version":3,"file":"websocket-events-host.d.ts","sourceRoot":"","sources":["../../../src/http-server/websocket-events-host.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"websocket-events-host.d.ts","sourceRoot":"","sources":["../../../src/http-server/websocket-events-host.js"],"names":[],"mappings":"AAIA,qBAAa,sCAAsC;IAE/C;;kEAE8D;IACzD,QAAQ,EADH,GAAG,CAAC,OAAO,2BAA2B,EAAE,OAAO,CAAC;IAE1D;;8GAE0G;IACrG,gCAAgC,EAD3B,GAAG,CAAC,OAAO,qBAAqB,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,2BAA2B,EAAE,OAAO,CAAC,CAAC;IAEtG;;;;;4CAKwC;IACnC,sBAAsB,EADjB,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAdtC,cAgBC;IAED;;;;;;;;;OASG;IACG,sBAAsB,IAFf,OAAO,CAAC,IAAI,CAAC,CASzB;IAED;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAHL,OAAO,2BAA2B,EAAE,OAG/B,GAFH,MAAM,IAAI,CAqBtB;IAED;;;;;OAKG;IACH,OAAO,CAAC,aAAa,EAJV,MAAM,GAAG,MAIC,EAAE,UAAU,AAH9B,CACA,EADQ,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAGN,GAFpB,IAAI,CAyBhB;IAED;;;;;;;;;;OAUG;IACH,WAAW,CAAC,EAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,EAAC,EANxD;QAAqB,OAAO,EAApB,MAAM,CACd;QAA4D,eAAe,EAAnE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CACrD;QAA4C,IAAI,EAAxC,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CACrC;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO,CAC7C;KAEwD,GAF9C,IAAI,CAgChB;IAED;;;;;;;;;;OAUG;IACH,aAAa,CAAC,EAAC,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,wBAAwB,EAAC,EANtE;QAAkC,QAAQ,EAAlC,MAAM,OAAO,CAAC,IAAI,CAAC,CAC3B;QAAqB,OAAO,EAApB,MAAM,CACd;QAAqB,YAAY,EAAzB,MAAM,CACd;QAAqD,wBAAwB,AAA7E,CACA,EADQ,OAAO,qBAAqB,EAAE,OAAO,CAC7C;KAEsE,GAF5D,IAAI,CAsChB;IAED;;;;;;;;OAQG;IACG,uBAAuB,CAAC,EAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,EAAC,EAN1E;QAA4C,IAAI,EAAxC,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CACrC;QAA4D,eAAe,EAAnE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CACrD;QAAqB,OAAO,EAApB,MAAM,CACd;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO,CAC7C;KAE0E,GAFhE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAC,GAAG,IAAI,CAAC,CAI3D;IAED;;;;;;OAMG;IACG,qBAAqB,CAAC,EAAC,OAAO,EAAE,OAAO,EAAC,EAJ3C;QAAqB,OAAO,EAApB,MAAM,CACd;QAA4C,OAAO,EAA3C,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CACrC;KAE2C,GAFjC,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAC,GAAG,IAAI,CAAC,CAI3D;IAED;;;;;;;;;;;OAWG;IACG,4BAA4B,CAAC,EAAC,eAAsB,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAC,EANzF;QAAoE,eAAe,AAAnF,CACA,EADQ,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAC5D;QAAqB,OAAO,EAApB,MAAM,CACd;QAA4C,OAAO,EAA3C,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CACrC;QAAqD,aAAa,AAAlE,CACA,EADQ,OAAO,qBAAqB,EAAE,OAAO,CAC7C;KAEyF,GAF/E,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAC,GAAG,IAAI,CAAC,CAsB3D;CACF;AAED,QAAA,MAAM,mBAAmB,wCAA+C,CAAA;eAEzD,mBAAmB"}
@@ -104,7 +104,7 @@ export class VelociousHttpServerWebsocketEventsHost {
104
104
  // Other channels chain onto their own tails and are not delayed.
105
105
  this._queuePublish({
106
106
  callback: async () => {
107
- const persistedEvent = await this._persistV2EventIfNeeded({ body, channel, configuration });
107
+ const persistedEvent = await this._persistV2EventIfNeeded({ body, broadcastParams, channel, configuration });
108
108
  const dispatchedTargets = new Set();
109
109
  for (const handler of this.broadcastHandlersByConfiguration.get(configuration) || []) {
110
110
  const dispatchKey = handler.websocketV2BroadcastDispatchKey();
@@ -171,12 +171,13 @@ export class VelociousHttpServerWebsocketEventsHost {
171
171
  * Runs persist v2 event if needed.
172
172
  * @param {object} args - Options.
173
173
  * @param {ReturnType<typeof JSON.parse>} args.body - Event body.
174
+ * @param {Record<string, ReturnType<typeof JSON.parse>>} args.broadcastParams - Routing filter params.
174
175
  * @param {string} args.channel - Channel name.
175
176
  * @param {import("../configuration.js").default} args.configuration - Originating configuration.
176
177
  * @returns {Promise<{createdAt: string, id: string} | null>} - Persisted event metadata when storage is enabled.
177
178
  */
178
- async _persistV2EventIfNeeded({ body, channel, configuration }) {
179
- return await this._persistChannelEventIfNeeded({ channel, payload: body, configuration });
179
+ async _persistV2EventIfNeeded({ body, broadcastParams, channel, configuration }) {
180
+ return await this._persistChannelEventIfNeeded({ broadcastParams, channel, configuration, payload: body });
180
181
  }
181
182
  /**
182
183
  * Runs persist event if needed.
@@ -189,14 +190,18 @@ export class VelociousHttpServerWebsocketEventsHost {
189
190
  return await this._persistChannelEventIfNeeded({ channel, payload });
190
191
  }
191
192
  /**
192
- * Runs persist channel event if needed.
193
+ * Runs persist channel event if needed. Persists the broadcast's routing
194
+ * params (sanitized through the channel class's
195
+ * `replayableBroadcastParams`) so replay can re-apply `matches()` per
196
+ * stream instead of delivering the whole channel's log.
193
197
  * @param {object} args - Options object.
198
+ * @param {Record<string, ReturnType<typeof JSON.parse>> | null} [args.broadcastParams] - Broadcast params to persist for stream-scoped replay.
194
199
  * @param {string} args.channel - Channel name.
195
200
  * @param {ReturnType<typeof JSON.parse>} args.payload - Payload data.
196
201
  * @param {import("../configuration.js").default} [args.configuration] - Configuration owning the event store.
197
202
  * @returns {Promise<{createdAt: string, id: string} | null>} - Persisted event metadata.
198
203
  */
199
- async _persistChannelEventIfNeeded({ channel, payload, configuration }) {
204
+ async _persistChannelEventIfNeeded({ broadcastParams = null, channel, configuration, payload }) {
200
205
  const handler = this.handlers.values().next().value;
201
206
  const eventConfiguration = configuration || handler?.configuration;
202
207
  if (!eventConfiguration)
@@ -205,7 +210,9 @@ export class VelociousHttpServerWebsocketEventsHost {
205
210
  const shouldPersist = await websocketEventLogStore.shouldPersistChannel(channel);
206
211
  if (!shouldPersist)
207
212
  return null;
208
- const persistedEvent = await websocketEventLogStore.appendEvent({ channel, payload });
213
+ const ChannelClass = eventConfiguration.getWebsocketChannelClass(channel);
214
+ const params = ChannelClass ? ChannelClass.replayableBroadcastParams(broadcastParams) : broadcastParams;
215
+ const persistedEvent = await websocketEventLogStore.appendEvent({ channel, params, payload });
209
216
  return {
210
217
  createdAt: persistedEvent.createdAt,
211
218
  id: persistedEvent.id
@@ -214,4 +221,4 @@ export class VelociousHttpServerWebsocketEventsHost {
214
221
  }
215
222
  const websocketEventsHost = new VelociousHttpServerWebsocketEventsHost();
216
223
  export default websocketEventsHost;
217
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWV2ZW50cy1ob3N0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2h0dHAtc2VydmVyL3dlYnNvY2tldC1ldmVudHMtaG9zdC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLHNDQUFzQyxFQUFDLE1BQU0sZ0NBQWdDLENBQUE7QUFFckYsTUFBTSxPQUFPLHNDQUFzQztJQUNqRDtRQUNFOztzRUFFOEQ7UUFDOUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBQ3pCOztrSEFFMEc7UUFDMUcsSUFBSSxDQUFDLGdDQUFnQyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7UUFDakQ7Ozs7O2dEQUt3QztRQUN4QyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUN6QyxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsS0FBSyxDQUFDLHNCQUFzQjtRQUMxQixNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDMUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRWxELEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7WUFDN0IsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLFVBQVU7Z0JBQUUsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFBO1FBQ3ZELENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFFBQVEsQ0FBQyxPQUFPO1FBQ2QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDMUIsSUFBSSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUU1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QUFBO1FBQ25ELE1BQU0sa0JBQWtCLEdBQUcsYUFBYSxJQUFJLE9BQU8sRUFBRSxhQUFhLENBQUE7UUFFbEUsSUFBSSxDQUFDLGtCQUFrQjtZQUFFLE9BQU8sSUFBSSxDQUFBO1FBRXBDLE1BQU0sc0JBQXNCLEdBQUcsc0NBQXNDLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtRQUN6RixNQUFNLGFBQWEsR0FBRyxNQUFNLHNCQUFzQixDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBRWhGLElBQUksQ0FBQyxhQUFhO1lBQUUsT0FBTyxJQUFJLENBQUE7UUFFL0IsTUFBTSxjQUFjLEdBQUcsTUFBTSxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsRUFBQyxPQUFPLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQTtRQUVuRixPQUFPO1lBQ0wsU0FBUyxFQUFFLGNBQWMsQ0FBQyxTQUFTO1lBQ25DLEVBQUUsRUFBRSxjQUFjLENBQUMsRUFBRTtTQUN0QixDQUFBO0lBQ0gsQ0FBQztDQUNGO0FBRUQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLHNDQUFzQyxFQUFFLENBQUE7QUFFeEUsZUFBZSxtQkFBbUIsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge3dlYnNvY2tldEV2ZW50TG9nU3RvcmVGb3JDb25maWd1cmF0aW9ufSBmcm9tIFwiLi93ZWJzb2NrZXQtZXZlbnQtbG9nLXN0b3JlLmpzXCJcblxuZXhwb3J0IGNsYXNzIFZlbG9jaW91c0h0dHBTZXJ2ZXJXZWJzb2NrZXRFdmVudHNIb3N0IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAqIEB0eXBlIHtTZXQ8aW1wb3J0KFwiLi93b3JrZXItaGFuZGxlci9pbmRleC5qc1wiKS5kZWZhdWx0Pn0gKi9cbiAgICB0aGlzLmhhbmRsZXJzID0gbmV3IFNldCgpXG4gICAgLyoqXG4gICAgICogQnJvYWRjYXN0IGhhbmRsZXJzIGdyb3VwZWQgYnkgdGhlIGNvbmZpZ3VyYXRpb24gdGhhdCBvd25zIHRoZW0uXG4gICAgICogQHR5cGUge01hcDxpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIFNldDxpbXBvcnQoXCIuL3dvcmtlci1oYW5kbGVyL2luZGV4LmpzXCIpLmRlZmF1bHQ+Pn0gKi9cbiAgICB0aGlzLmJyb2FkY2FzdEhhbmRsZXJzQnlDb25maWd1cmF0aW9uID0gbmV3IE1hcCgpXG4gICAgLyoqXG4gICAgICogT3JkZXJlZCBwdWJsaXNoIHRhaWxzIGtleWVkIGJ5IGNoYW5uZWwuIEVhY2ggY2hhbm5lbCBwZXJzaXN0cyBhbmRcbiAgICAgKiBkaXNwYXRjaGVzIGJlaGluZCBpdHMgb3duIHRhaWwgc28gYSBzbG93IGNoYW5uZWwgY2Fubm90IGhlYWQtb2YtbGluZVxuICAgICAqIGJsb2NrIHVucmVsYXRlZCBjaGFubmVscy4gQSByZWplY3RlZCB0YWlsIHN0YXlzIGluIHRoZSBtYXAgc28gdGhlXG4gICAgICogY2hhbm5lbCByZW1haW5zIHBvaXNvbmVkIGFuZCBvYnNlcnZhYmxlLlxuICAgICAqIEB0eXBlIHtNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+Pn0gKi9cbiAgICB0aGlzLnB1Ymxpc2hRdWV1ZXNCeUNoYW5uZWwgPSBuZXcgTWFwKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHNldHRsZXMgd2hlbiBldmVyeSBjaGFubmVsIHRhaWwgcGVuZGluZyBhdCBjYWxsXG4gICAqIHRpbWUgaGFzIHNldHRsZWQgKGluY2x1ZGluZyBldmVudC1sb2cgcGVyc2lzdGVuY2UpLiBVc2VmdWwgd2hlbiBhXG4gICAqIHJlcXVlc3QgaGFuZGxlciBuZWVkcyB0byBndWFyYW50ZWUgaXRzIGJyb2FkY2FzdCBpcyBwZXJzaXN0ZWQgYmVmb3JlXG4gICAqIHJlc3BvbmRpbmcg4oCUIHdpdGhvdXQgdGhpcywgdGhlIEhUVFAgcmVzcG9uc2UgY2FuIHJldHVybiBiZWZvcmUgdGhlXG4gICAqIGFzeW5jIGV2ZW50LWxvZyB3cml0ZSBmaW5pc2hlcy4gVGhpcyBpcyBhIHNuYXBzaG90IGJhcnJpZXI6IHdvcmtcbiAgICogZW5xdWV1ZWQgYWZ0ZXIgdGhlIHNuYXBzaG90IGlzIG5vdCBhd2FpdGVkLCBhbmQgdGhlIGZpcnN0IHJlamVjdGlvbiBpblxuICAgKiBzbmFwc2hvdCBvcmRlciBpcyByZXRocm93biBhZnRlciBldmVyeSBzbmFwc2hvdHRlZCB0YWlsIGhhcyBzZXR0bGVkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGF3YWl0UGVuZGluZ0Jyb2FkY2FzdHMoKSB7XG4gICAgY29uc3Qgc25hcHNob3QgPSBbLi4udGhpcy5wdWJsaXNoUXVldWVzQnlDaGFubmVsLnZhbHVlcygpXVxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoc25hcHNob3QpXG5cbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKSB0aHJvdyByZXN1bHQucmVhc29uXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVnaXN0ZXIuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi93b3JrZXItaGFuZGxlci9pbmRleC5qc1wiKS5kZWZhdWx0fSBoYW5kbGVyIC0gSGFuZGxlciBpbnN0YW5jZS5cbiAgICogQHJldHVybnMgeygpID0+IHZvaWR9IC0gVGhlIHJlZ2lzdGVyLlxuICAgKi9cbiAgcmVnaXN0ZXIoaGFuZGxlcikge1xuICAgIHRoaXMuaGFuZGxlcnMuYWRkKGhhbmRsZXIpXG4gICAgbGV0IGNvbmZpZ3VyYXRpb25IYW5kbGVycyA9IHRoaXMuYnJvYWRjYXN0SGFuZGxlcnNCeUNvbmZpZ3VyYXRpb24uZ2V0KGhhbmRsZXIuY29uZmlndXJhdGlvbilcblxuICAgIGlmICghY29uZmlndXJhdGlvbkhhbmRsZXJzKSB7XG4gICAgICBjb25maWd1cmF0aW9uSGFuZGxlcnMgPSBuZXcgU2V0KClcbiAgICAgIHRoaXMuYnJvYWRjYXN0SGFuZGxlcnNCeUNvbmZpZ3VyYXRpb24uc2V0KGhhbmRsZXIuY29uZmlndXJhdGlvbiwgY29uZmlndXJhdGlvbkhhbmRsZXJzKVxuICAgIH1cblxuICAgIGNvbmZpZ3VyYXRpb25IYW5kbGVycy5hZGQoaGFuZGxlcilcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0aGlzLmhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKVxuICAgICAgY29uZmlndXJhdGlvbkhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKVxuXG4gICAgICBpZiAoY29uZmlndXJhdGlvbkhhbmRsZXJzLnNpemUgPT09IDApIHtcbiAgICAgICAgdGhpcy5icm9hZGNhc3RIYW5kbGVyc0J5Q29uZmlndXJhdGlvbi5kZWxldGUoaGFuZGxlci5jb25maWd1cmF0aW9uKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHB1Ymxpc2guXG4gICAqIEBwYXJhbSB7b2JqZWN0IHwgc3RyaW5nfSBjaGFubmVsT3JBcmdzIC0gQ2hhbm5lbCBuYW1lIG9yIG9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBbcGF5bG9hZEFyZ10gLSBQYXlsb2FkIGRhdGEgd2hlbiBjaGFubmVsIGlzIHBhc3NlZCBzZXBhcmF0ZWx5LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBwdWJsaXNoKGNoYW5uZWxPckFyZ3MsIHBheWxvYWRBcmcpIHtcbiAgICBjb25zdCBwdWJsaXNoQXJncyA9IHR5cGVvZiBjaGFubmVsT3JBcmdzID09PSBcInN0cmluZ1wiXG4gICAgICA/IHtjaGFubmVsOiBjaGFubmVsT3JBcmdzLCBwYXlsb2FkOiBwYXlsb2FkQXJnfVxuICAgICAgOiAvKiogQHR5cGUge3tjaGFubmVsOiBzdHJpbmcsIHBheWxvYWQ6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fX0gKi8gKGNoYW5uZWxPckFyZ3MpXG4gICAgY29uc3QgY2hhbm5lbCA9IHB1Ymxpc2hBcmdzLmNoYW5uZWxcbiAgICBjb25zdCBwYXlsb2FkID0gcHVibGlzaEFyZ3MucGF5bG9hZFxuXG4gICAgdGhpcy5fcXVldWVQdWJsaXNoKHtcbiAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBlcnNpc3RlZEV2ZW50ID0gYXdhaXQgdGhpcy5fcGVyc2lzdEV2ZW50SWZOZWVkZWQoe2NoYW5uZWwsIHBheWxvYWR9KVxuXG4gICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiB0aGlzLmhhbmRsZXJzKSB7XG4gICAgICAgICAgaGFuZGxlci5kaXNwYXRjaFdlYnNvY2tldEV2ZW50KHtcbiAgICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgICBjcmVhdGVkQXQ6IHBlcnNpc3RlZEV2ZW50Py5jcmVhdGVkQXQsXG4gICAgICAgICAgICBldmVudElkOiBwZXJzaXN0ZWRFdmVudD8uaWQsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNoYW5uZWwsXG4gICAgICBlcnJvck1lc3NhZ2U6IFwiRmFpbGVkIHRvIHB1Ymxpc2ggd2Vic29ja2V0IGV2ZW50XCJcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEZhbiBhIFYyIGNoYW5uZWwgYnJvYWRjYXN0IG91dCB0byBldmVyeSByZWdpc3RlcmVkIHdvcmtlciBoYW5kbGVyLlxuICAgKiBQZXJzaXN0cyB0aGUgZXZlbnQgdG8gdGhlIGV2ZW50LWxvZyBzdG9yZSAoaWYgdGhlIGNoYW5uZWwgaXMgbWFya2VkXG4gICAqIGludGVyZXN0ZWQpIHNvIGNsaWVudHMgY2FuIHJlc3VtZSBmcm9tIGEgYGxhc3RFdmVudElkYCBjaGVja3BvaW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYXJncy5icm9hZGNhc3RQYXJhbXMgLSBSb3V0aW5nIGZpbHRlciBwYXJhbXMuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGFyZ3MuYm9keSAtIE1lc3NhZ2UgYm9keS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIE9yaWdpbmF0aW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYnJvYWRjYXN0VjIoe2JvZHksIGJyb2FkY2FzdFBhcmFtcywgY2hhbm5lbCwgY29uZmlndXJhdGlvbn0pIHtcbiAgICAvLyBDaGFpbiBvbnRvIHRoZSBjaGFubmVsJ3Mgb3duIHB1Ymxpc2ggdGFpbCBzbyBwZXJzaXN0ZW5jZSBjb21wbGV0ZXNcbiAgICAvLyBiZWZvcmUgdGhlIG5leHQgYnJvYWRjYXN0IG9uIHRoYXQgc2FtZSBjaGFubmVsIOKAlCB3aXRob3V0IHRoaXMsIGFcbiAgICAvLyBzdWJzY3JpYmVyIHRoYXQgY29ubmVjdHMgaW1tZWRpYXRlbHkgYWZ0ZXIgYSBicm9hZGNhc3QgY291bGQgbWlzcyB0aGVcbiAgICAvLyBqdXN0LXBlcnNpc3RlZCBldmVudCB3aGVuIHJlcGxheWluZyBmcm9tIGxhc3RFdmVudElkIG9uIGEgc2xvdyBEQi5cbiAgICAvLyBPdGhlciBjaGFubmVscyBjaGFpbiBvbnRvIHRoZWlyIG93biB0YWlscyBhbmQgYXJlIG5vdCBkZWxheWVkLlxuICAgIHRoaXMuX3F1ZXVlUHVibGlzaCh7XG4gICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwZXJzaXN0ZWRFdmVudCA9IGF3YWl0IHRoaXMuX3BlcnNpc3RWMkV2ZW50SWZOZWVkZWQoe2JvZHksIGNoYW5uZWwsIGNvbmZpZ3VyYXRpb259KVxuICAgICAgICBjb25zdCBkaXNwYXRjaGVkVGFyZ2V0cyA9IG5ldyBTZXQoKVxuXG4gICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiB0aGlzLmJyb2FkY2FzdEhhbmRsZXJzQnlDb25maWd1cmF0aW9uLmdldChjb25maWd1cmF0aW9uKSB8fCBbXSkge1xuICAgICAgICAgIGNvbnN0IGRpc3BhdGNoS2V5ID0gaGFuZGxlci53ZWJzb2NrZXRWMkJyb2FkY2FzdERpc3BhdGNoS2V5KClcblxuICAgICAgICAgIGlmIChkaXNwYXRjaGVkVGFyZ2V0cy5oYXMoZGlzcGF0Y2hLZXkpKSBjb250aW51ZVxuXG4gICAgICAgICAgZGlzcGF0Y2hlZFRhcmdldHMuYWRkKGRpc3BhdGNoS2V5KVxuICAgICAgICAgIGhhbmRsZXIuZGlzcGF0Y2hXZWJzb2NrZXRWMkJyb2FkY2FzdCh7XG4gICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgYnJvYWRjYXN0UGFyYW1zLFxuICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgIGV2ZW50SWQ6IHBlcnNpc3RlZEV2ZW50Py5pZCxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogcGVyc2lzdGVkRXZlbnQ/LmNyZWF0ZWRBdFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBjaGFubmVsLFxuICAgICAgZXJyb3JNZXNzYWdlOiBcIkZhaWxlZCB0byBwZXJzaXN0L2Jyb2FkY2FzdCBWMiBldmVudFwiLFxuICAgICAgb3JpZ2luYXRpbmdDb25maWd1cmF0aW9uOiBjb25maWd1cmF0aW9uXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBRdWV1ZXMgcHVibGlzaCB3b3JrIGJlaGluZCB0aGUgY2hhbm5lbCdzIG93biBvcmRlcmVkIHRhaWwgc28gb25seSB3b3JrXG4gICAqIGZvciB0aGUgc2FtZSBjaGFubmVsIHNlcmlhbGl6ZXMg4oCUIGEgc2xvdyBvciBmYWlsZWQgY2hhbm5lbCBuZXZlclxuICAgKiBoZWFkLW9mLWxpbmUgYmxvY2tzIHVucmVsYXRlZCBjaGFubmVscy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBhcmdzLmNhbGxiYWNrIC0gUHVibGlzaCB3b3JrIHRvIHJ1biBpbiBjaGFubmVsIG9yZGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jaGFubmVsIC0gQ2hhbm5lbCB3aG9zZSBvcmRlcmVkIHRhaWwgdGhlIHdvcmsgY2hhaW5zIG9udG8uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmVycm9yTWVzc2FnZSAtIE1lc3NhZ2UgbG9nZ2VkIHdoZW4gcHVibGlzaCB3b3JrIGZhaWxzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gW2FyZ3Mub3JpZ2luYXRpbmdDb25maWd1cmF0aW9uXSAtIENvbmZpZ3VyYXRpb24gd2hvc2UgY29udGV4dCBvd25zIHRoZSB3b3JrLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9xdWV1ZVB1Ymxpc2goe2NhbGxiYWNrLCBjaGFubmVsLCBlcnJvck1lc3NhZ2UsIG9yaWdpbmF0aW5nQ29uZmlndXJhdGlvbn0pIHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVycy52YWx1ZXMoKS5uZXh0KCkudmFsdWVcbiAgICBjb25zdCBjb25maWd1cmF0aW9uID0gb3JpZ2luYXRpbmdDb25maWd1cmF0aW9uIHx8IGhhbmRsZXI/LmNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCBwcmV2aW91c1RhaWwgPSB0aGlzLnB1Ymxpc2hRdWV1ZXNCeUNoYW5uZWwuZ2V0KGNoYW5uZWwpIHx8IFByb21pc2UucmVzb2x2ZSgpXG4gICAgbGV0IHF1ZXVlZFB1Ymxpc2hcblxuICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICBxdWV1ZWRQdWJsaXNoID0gcHJldmlvdXNUYWlsLnRoZW4oKCkgPT4gY29uZmlndXJhdGlvbi53aXRob3V0Q3VycmVudFRlc3REYXRhYmFzZUFjY2Vzc1Njb3BlKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb24ud2l0aG91dEN1cnJlbnRDb25uZWN0aW9uQ29udGV4dHMoKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBjb25maWd1cmF0aW9uLnJ1bldpdGhUZXN0U2hhcmVkQ29ubmVjdGlvbkNvbnRleHRzKGNhbGxiYWNrKVxuICAgICAgICB9KVxuICAgICAgfSkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXVlZFB1Ymxpc2ggPSBwcmV2aW91c1RhaWwudGhlbihjYWxsYmFjaylcbiAgICB9XG5cbiAgICBjb25zdCB0YWlsID0gcXVldWVkUHVibGlzaFxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yTWVzc2FnZSwgZXJyb3IpXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9KVxuXG4gICAgdGhpcy5wdWJsaXNoUXVldWVzQnlDaGFubmVsLnNldChjaGFubmVsLCB0YWlsKVxuXG4gICAgLy8gUmVtb3ZlIHRoZSB0YWlsIG9uY2UgaXQgc2V0dGxlcyBzdWNjZXNzZnVsbHksIGJ1dCBvbmx5IHdoZW4gaXQgaXNcbiAgICAvLyBzdGlsbCB0aGUgbmV3ZXN0IHRhaWwg4oCUIGFuIG9sZGVyIHNldHRsZWQgdGFpbCBtdXN0IG5ldmVyIGRlbGV0ZSBhXG4gICAgLy8gbmV3ZXIgb25lLiBBIHJlamVjdGVkIHRhaWwgc3RheXMgaW4gdGhlIG1hcCBzbyB0aGUgY2hhbm5lbCByZW1haW5zXG4gICAgLy8gcG9pc29uZWQgYW5kIG9ic2VydmFibGUgdGhyb3VnaCBhd2FpdFBlbmRpbmdCcm9hZGNhc3RzLlxuICAgIHRhaWwudGhlbihcbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucHVibGlzaFF1ZXVlc0J5Q2hhbm5lbC5nZXQoY2hhbm5lbCkgPT09IHRhaWwpIHtcbiAgICAgICAgICB0aGlzLnB1Ymxpc2hRdWV1ZXNCeUNoYW5uZWwuZGVsZXRlKGNoYW5uZWwpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAoKSA9PiB1bmRlZmluZWRcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogUnVucyBwZXJzaXN0IHYyIGV2ZW50IGlmIG5lZWRlZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBhcmdzLmJvZHkgLSBFdmVudCBib2R5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gT3JpZ2luYXRpbmcgY29uZmlndXJhdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8e2NyZWF0ZWRBdDogc3RyaW5nLCBpZDogc3RyaW5nfSB8IG51bGw+fSAtIFBlcnNpc3RlZCBldmVudCBtZXRhZGF0YSB3aGVuIHN0b3JhZ2UgaXMgZW5hYmxlZC5cbiAgICovXG4gIGFzeW5jIF9wZXJzaXN0VjJFdmVudElmTmVlZGVkKHtib2R5LCBjaGFubmVsLCBjb25maWd1cmF0aW9ufSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9wZXJzaXN0Q2hhbm5lbEV2ZW50SWZOZWVkZWQoe2NoYW5uZWwsIHBheWxvYWQ6IGJvZHksIGNvbmZpZ3VyYXRpb259KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcGVyc2lzdCBldmVudCBpZiBuZWVkZWQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGFyZ3MucGF5bG9hZCAtIFBheWxvYWQgZGF0YS5cbiAgICogQHJldHVybnMge1Byb21pc2U8e2NyZWF0ZWRBdDogc3RyaW5nLCBpZDogc3RyaW5nfSB8IG51bGw+fSAtIFBlcnNpc3RlZCBldmVudCBtZXRhZGF0YS5cbiAgICovXG4gIGFzeW5jIF9wZXJzaXN0RXZlbnRJZk5lZWRlZCh7Y2hhbm5lbCwgcGF5bG9hZH0pIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fcGVyc2lzdENoYW5uZWxFdmVudElmTmVlZGVkKHtjaGFubmVsLCBwYXlsb2FkfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHBlcnNpc3QgY2hhbm5lbCBldmVudCBpZiBuZWVkZWQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGFyZ3MucGF5bG9hZCAtIFBheWxvYWQgZGF0YS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IFthcmdzLmNvbmZpZ3VyYXRpb25dIC0gQ29uZmlndXJhdGlvbiBvd25pbmcgdGhlIGV2ZW50IHN0b3JlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7Y3JlYXRlZEF0OiBzdHJpbmcsIGlkOiBzdHJpbmd9IHwgbnVsbD59IC0gUGVyc2lzdGVkIGV2ZW50IG1ldGFkYXRhLlxuICAgKi9cbiAgYXN5bmMgX3BlcnNpc3RDaGFubmVsRXZlbnRJZk5lZWRlZCh7Y2hhbm5lbCwgcGF5bG9hZCwgY29uZmlndXJhdGlvbn0pIHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVycy52YWx1ZXMoKS5uZXh0KCkudmFsdWVcbiAgICBjb25zdCBldmVudENvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uIHx8IGhhbmRsZXI/LmNvbmZpZ3VyYXRpb25cblxuICAgIGlmICghZXZlbnRDb25maWd1cmF0aW9uKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3Qgd2Vic29ja2V0RXZlbnRMb2dTdG9yZSA9IHdlYnNvY2tldEV2ZW50TG9nU3RvcmVGb3JDb25maWd1cmF0aW9uKGV2ZW50Q29uZmlndXJhdGlvbilcbiAgICBjb25zdCBzaG91bGRQZXJzaXN0ID0gYXdhaXQgd2Vic29ja2V0RXZlbnRMb2dTdG9yZS5zaG91bGRQZXJzaXN0Q2hhbm5lbChjaGFubmVsKVxuXG4gICAgaWYgKCFzaG91bGRQZXJzaXN0KSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgcGVyc2lzdGVkRXZlbnQgPSBhd2FpdCB3ZWJzb2NrZXRFdmVudExvZ1N0b3JlLmFwcGVuZEV2ZW50KHtjaGFubmVsLCBwYXlsb2FkfSlcblxuICAgIHJldHVybiB7XG4gICAgICBjcmVhdGVkQXQ6IHBlcnNpc3RlZEV2ZW50LmNyZWF0ZWRBdCxcbiAgICAgIGlkOiBwZXJzaXN0ZWRFdmVudC5pZFxuICAgIH1cbiAgfVxufVxuXG5jb25zdCB3ZWJzb2NrZXRFdmVudHNIb3N0ID0gbmV3IFZlbG9jaW91c0h0dHBTZXJ2ZXJXZWJzb2NrZXRFdmVudHNIb3N0KClcblxuZXhwb3J0IGRlZmF1bHQgd2Vic29ja2V0RXZlbnRzSG9zdFxuIl19
224
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWV2ZW50cy1ob3N0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2h0dHAtc2VydmVyL3dlYnNvY2tldC1ldmVudHMtaG9zdC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLHNDQUFzQyxFQUFDLE1BQU0sZ0NBQWdDLENBQUE7QUFFckYsTUFBTSxPQUFPLHNDQUFzQztJQUNqRDtRQUNFOztzRUFFOEQ7UUFDOUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBQ3pCOztrSEFFMEc7UUFDMUcsSUFBSSxDQUFDLGdDQUFnQyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7UUFDakQ7Ozs7O2dEQUt3QztRQUN4QyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUN6QyxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsS0FBSyxDQUFDLHNCQUFzQjtRQUMxQixNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDMUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRWxELEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7WUFDN0IsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLFVBQVU7Z0JBQUUsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFBO1FBQ3ZELENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFFBQVEsQ0FBQyxPQUFPO1FBQ2QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDMUIsSUFBSSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUU1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QUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQTtRQUNuRCxNQUFNLGtCQUFrQixHQUFHLGFBQWEsSUFBSSxPQUFPLEVBQUUsYUFBYSxDQUFBO1FBRWxFLElBQUksQ0FBQyxrQkFBa0I7WUFBRSxPQUFPLElBQUksQ0FBQTtRQUVwQyxNQUFNLHNCQUFzQixHQUFHLHNDQUFzQyxDQUFDLGtCQUFrQixDQUFDLENBQUE7UUFDekYsTUFBTSxhQUFhLEdBQUcsTUFBTSxzQkFBc0IsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUVoRixJQUFJLENBQUMsYUFBYTtZQUFFLE9BQU8sSUFBSSxDQUFBO1FBRS9CLE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3pFLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLHlCQUF5QixDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUE7UUFFdkcsTUFBTSxjQUFjLEdBQUcsTUFBTSxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsRUFBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUE7UUFFM0YsT0FBTztZQUNMLFNBQVMsRUFBRSxjQUFjLENBQUMsU0FBUztZQUNuQyxFQUFFLEVBQUUsY0FBYyxDQUFDLEVBQUU7U0FDdEIsQ0FBQTtJQUNILENBQUM7Q0FDRjtBQUVELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxzQ0FBc0MsRUFBRSxDQUFBO0FBRXhFLGVBQWUsbUJBQW1CLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHt3ZWJzb2NrZXRFdmVudExvZ1N0b3JlRm9yQ29uZmlndXJhdGlvbn0gZnJvbSBcIi4vd2Vic29ja2V0LWV2ZW50LWxvZy1zdG9yZS5qc1wiXG5cbmV4cG9ydCBjbGFzcyBWZWxvY2lvdXNIdHRwU2VydmVyV2Vic29ja2V0RXZlbnRzSG9zdCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7U2V0PGltcG9ydChcIi4vd29ya2VyLWhhbmRsZXIvaW5kZXguanNcIikuZGVmYXVsdD59ICovXG4gICAgdGhpcy5oYW5kbGVycyA9IG5ldyBTZXQoKVxuICAgIC8qKlxuICAgICAqIEJyb2FkY2FzdCBoYW5kbGVycyBncm91cGVkIGJ5IHRoZSBjb25maWd1cmF0aW9uIHRoYXQgb3ducyB0aGVtLlxuICAgICAqIEB0eXBlIHtNYXA8aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCBTZXQ8aW1wb3J0KFwiLi93b3JrZXItaGFuZGxlci9pbmRleC5qc1wiKS5kZWZhdWx0Pj59ICovXG4gICAgdGhpcy5icm9hZGNhc3RIYW5kbGVyc0J5Q29uZmlndXJhdGlvbiA9IG5ldyBNYXAoKVxuICAgIC8qKlxuICAgICAqIE9yZGVyZWQgcHVibGlzaCB0YWlscyBrZXllZCBieSBjaGFubmVsLiBFYWNoIGNoYW5uZWwgcGVyc2lzdHMgYW5kXG4gICAgICogZGlzcGF0Y2hlcyBiZWhpbmQgaXRzIG93biB0YWlsIHNvIGEgc2xvdyBjaGFubmVsIGNhbm5vdCBoZWFkLW9mLWxpbmVcbiAgICAgKiBibG9jayB1bnJlbGF0ZWQgY2hhbm5lbHMuIEEgcmVqZWN0ZWQgdGFpbCBzdGF5cyBpbiB0aGUgbWFwIHNvIHRoZVxuICAgICAqIGNoYW5uZWwgcmVtYWlucyBwb2lzb25lZCBhbmQgb2JzZXJ2YWJsZS5cbiAgICAgKiBAdHlwZSB7TWFwPHN0cmluZywgUHJvbWlzZTx2b2lkPj59ICovXG4gICAgdGhpcy5wdWJsaXNoUXVldWVzQnlDaGFubmVsID0gbmV3IE1hcCgpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHByb21pc2UgdGhhdCBzZXR0bGVzIHdoZW4gZXZlcnkgY2hhbm5lbCB0YWlsIHBlbmRpbmcgYXQgY2FsbFxuICAgKiB0aW1lIGhhcyBzZXR0bGVkIChpbmNsdWRpbmcgZXZlbnQtbG9nIHBlcnNpc3RlbmNlKS4gVXNlZnVsIHdoZW4gYVxuICAgKiByZXF1ZXN0IGhhbmRsZXIgbmVlZHMgdG8gZ3VhcmFudGVlIGl0cyBicm9hZGNhc3QgaXMgcGVyc2lzdGVkIGJlZm9yZVxuICAgKiByZXNwb25kaW5nIOKAlCB3aXRob3V0IHRoaXMsIHRoZSBIVFRQIHJlc3BvbnNlIGNhbiByZXR1cm4gYmVmb3JlIHRoZVxuICAgKiBhc3luYyBldmVudC1sb2cgd3JpdGUgZmluaXNoZXMuIFRoaXMgaXMgYSBzbmFwc2hvdCBiYXJyaWVyOiB3b3JrXG4gICAqIGVucXVldWVkIGFmdGVyIHRoZSBzbmFwc2hvdCBpcyBub3QgYXdhaXRlZCwgYW5kIHRoZSBmaXJzdCByZWplY3Rpb24gaW5cbiAgICogc25hcHNob3Qgb3JkZXIgaXMgcmV0aHJvd24gYWZ0ZXIgZXZlcnkgc25hcHNob3R0ZWQgdGFpbCBoYXMgc2V0dGxlZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBhd2FpdFBlbmRpbmdCcm9hZGNhc3RzKCkge1xuICAgIGNvbnN0IHNuYXBzaG90ID0gWy4uLnRoaXMucHVibGlzaFF1ZXVlc0J5Q2hhbm5lbC52YWx1ZXMoKV1cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHNuYXBzaG90KVxuXG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIikgdGhyb3cgcmVzdWx0LnJlYXNvblxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlZ2lzdGVyLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vd29ya2VyLWhhbmRsZXIvaW5kZXguanNcIikuZGVmYXVsdH0gaGFuZGxlciAtIEhhbmRsZXIgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHsoKSA9PiB2b2lkfSAtIFRoZSByZWdpc3Rlci5cbiAgICovXG4gIHJlZ2lzdGVyKGhhbmRsZXIpIHtcbiAgICB0aGlzLmhhbmRsZXJzLmFkZChoYW5kbGVyKVxuICAgIGxldCBjb25maWd1cmF0aW9uSGFuZGxlcnMgPSB0aGlzLmJyb2FkY2FzdEhhbmRsZXJzQnlDb25maWd1cmF0aW9uLmdldChoYW5kbGVyLmNvbmZpZ3VyYXRpb24pXG5cbiAgICBpZiAoIWNvbmZpZ3VyYXRpb25IYW5kbGVycykge1xuICAgICAgY29uZmlndXJhdGlvbkhhbmRsZXJzID0gbmV3IFNldCgpXG4gICAgICB0aGlzLmJyb2FkY2FzdEhhbmRsZXJzQnlDb25maWd1cmF0aW9uLnNldChoYW5kbGVyLmNvbmZpZ3VyYXRpb24sIGNvbmZpZ3VyYXRpb25IYW5kbGVycylcbiAgICB9XG5cbiAgICBjb25maWd1cmF0aW9uSGFuZGxlcnMuYWRkKGhhbmRsZXIpXG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5oYW5kbGVycy5kZWxldGUoaGFuZGxlcilcbiAgICAgIGNvbmZpZ3VyYXRpb25IYW5kbGVycy5kZWxldGUoaGFuZGxlcilcblxuICAgICAgaWYgKGNvbmZpZ3VyYXRpb25IYW5kbGVycy5zaXplID09PSAwKSB7XG4gICAgICAgIHRoaXMuYnJvYWRjYXN0SGFuZGxlcnNCeUNvbmZpZ3VyYXRpb24uZGVsZXRlKGhhbmRsZXIuY29uZmlndXJhdGlvbilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBwdWJsaXNoLlxuICAgKiBAcGFyYW0ge29iamVjdCB8IHN0cmluZ30gY2hhbm5lbE9yQXJncyAtIENoYW5uZWwgbmFtZSBvciBvcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gW3BheWxvYWRBcmddIC0gUGF5bG9hZCBkYXRhIHdoZW4gY2hhbm5lbCBpcyBwYXNzZWQgc2VwYXJhdGVseS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgcHVibGlzaChjaGFubmVsT3JBcmdzLCBwYXlsb2FkQXJnKSB7XG4gICAgY29uc3QgcHVibGlzaEFyZ3MgPSB0eXBlb2YgY2hhbm5lbE9yQXJncyA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyB7Y2hhbm5lbDogY2hhbm5lbE9yQXJncywgcGF5bG9hZDogcGF5bG9hZEFyZ31cbiAgICAgIDogLyoqIEB0eXBlIHt7Y2hhbm5lbDogc3RyaW5nLCBwYXlsb2FkOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn19ICovIChjaGFubmVsT3JBcmdzKVxuICAgIGNvbnN0IGNoYW5uZWwgPSBwdWJsaXNoQXJncy5jaGFubmVsXG4gICAgY29uc3QgcGF5bG9hZCA9IHB1Ymxpc2hBcmdzLnBheWxvYWRcblxuICAgIHRoaXMuX3F1ZXVlUHVibGlzaCh7XG4gICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwZXJzaXN0ZWRFdmVudCA9IGF3YWl0IHRoaXMuX3BlcnNpc3RFdmVudElmTmVlZGVkKHtjaGFubmVsLCBwYXlsb2FkfSlcblxuICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5oYW5kbGVycykge1xuICAgICAgICAgIGhhbmRsZXIuZGlzcGF0Y2hXZWJzb2NrZXRFdmVudCh7XG4gICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgY3JlYXRlZEF0OiBwZXJzaXN0ZWRFdmVudD8uY3JlYXRlZEF0LFxuICAgICAgICAgICAgZXZlbnRJZDogcGVyc2lzdGVkRXZlbnQ/LmlkLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBjaGFubmVsLFxuICAgICAgZXJyb3JNZXNzYWdlOiBcIkZhaWxlZCB0byBwdWJsaXNoIHdlYnNvY2tldCBldmVudFwiXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBGYW4gYSBWMiBjaGFubmVsIGJyb2FkY2FzdCBvdXQgdG8gZXZlcnkgcmVnaXN0ZXJlZCB3b3JrZXIgaGFuZGxlci5cbiAgICogUGVyc2lzdHMgdGhlIGV2ZW50IHRvIHRoZSBldmVudC1sb2cgc3RvcmUgKGlmIHRoZSBjaGFubmVsIGlzIG1hcmtlZFxuICAgKiBpbnRlcmVzdGVkKSBzbyBjbGllbnRzIGNhbiByZXN1bWUgZnJvbSBhIGBsYXN0RXZlbnRJZGAgY2hlY2twb2ludC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGFyZ3MuYnJvYWRjYXN0UGFyYW1zIC0gUm91dGluZyBmaWx0ZXIgcGFyYW1zLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBhcmdzLmJvZHkgLSBNZXNzYWdlIGJvZHkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBPcmlnaW5hdGluZyBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGJyb2FkY2FzdFYyKHtib2R5LCBicm9hZGNhc3RQYXJhbXMsIGNoYW5uZWwsIGNvbmZpZ3VyYXRpb259KSB7XG4gICAgLy8gQ2hhaW4gb250byB0aGUgY2hhbm5lbCdzIG93biBwdWJsaXNoIHRhaWwgc28gcGVyc2lzdGVuY2UgY29tcGxldGVzXG4gICAgLy8gYmVmb3JlIHRoZSBuZXh0IGJyb2FkY2FzdCBvbiB0aGF0IHNhbWUgY2hhbm5lbCDigJQgd2l0aG91dCB0aGlzLCBhXG4gICAgLy8gc3Vic2NyaWJlciB0aGF0IGNvbm5lY3RzIGltbWVkaWF0ZWx5IGFmdGVyIGEgYnJvYWRjYXN0IGNvdWxkIG1pc3MgdGhlXG4gICAgLy8ganVzdC1wZXJzaXN0ZWQgZXZlbnQgd2hlbiByZXBsYXlpbmcgZnJvbSBsYXN0RXZlbnRJZCBvbiBhIHNsb3cgREIuXG4gICAgLy8gT3RoZXIgY2hhbm5lbHMgY2hhaW4gb250byB0aGVpciBvd24gdGFpbHMgYW5kIGFyZSBub3QgZGVsYXllZC5cbiAgICB0aGlzLl9xdWV1ZVB1Ymxpc2goe1xuICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcGVyc2lzdGVkRXZlbnQgPSBhd2FpdCB0aGlzLl9wZXJzaXN0VjJFdmVudElmTmVlZGVkKHtib2R5LCBicm9hZGNhc3RQYXJhbXMsIGNoYW5uZWwsIGNvbmZpZ3VyYXRpb259KVxuICAgICAgICBjb25zdCBkaXNwYXRjaGVkVGFyZ2V0cyA9IG5ldyBTZXQoKVxuXG4gICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiB0aGlzLmJyb2FkY2FzdEhhbmRsZXJzQnlDb25maWd1cmF0aW9uLmdldChjb25maWd1cmF0aW9uKSB8fCBbXSkge1xuICAgICAgICAgIGNvbnN0IGRpc3BhdGNoS2V5ID0gaGFuZGxlci53ZWJzb2NrZXRWMkJyb2FkY2FzdERpc3BhdGNoS2V5KClcblxuICAgICAgICAgIGlmIChkaXNwYXRjaGVkVGFyZ2V0cy5oYXMoZGlzcGF0Y2hLZXkpKSBjb250aW51ZVxuXG4gICAgICAgICAgZGlzcGF0Y2hlZFRhcmdldHMuYWRkKGRpc3BhdGNoS2V5KVxuICAgICAgICAgIGhhbmRsZXIuZGlzcGF0Y2hXZWJzb2NrZXRWMkJyb2FkY2FzdCh7XG4gICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgYnJvYWRjYXN0UGFyYW1zLFxuICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgIGV2ZW50SWQ6IHBlcnNpc3RlZEV2ZW50Py5pZCxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogcGVyc2lzdGVkRXZlbnQ/LmNyZWF0ZWRBdFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBjaGFubmVsLFxuICAgICAgZXJyb3JNZXNzYWdlOiBcIkZhaWxlZCB0byBwZXJzaXN0L2Jyb2FkY2FzdCBWMiBldmVudFwiLFxuICAgICAgb3JpZ2luYXRpbmdDb25maWd1cmF0aW9uOiBjb25maWd1cmF0aW9uXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBRdWV1ZXMgcHVibGlzaCB3b3JrIGJlaGluZCB0aGUgY2hhbm5lbCdzIG93biBvcmRlcmVkIHRhaWwgc28gb25seSB3b3JrXG4gICAqIGZvciB0aGUgc2FtZSBjaGFubmVsIHNlcmlhbGl6ZXMg4oCUIGEgc2xvdyBvciBmYWlsZWQgY2hhbm5lbCBuZXZlclxuICAgKiBoZWFkLW9mLWxpbmUgYmxvY2tzIHVucmVsYXRlZCBjaGFubmVscy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBhcmdzLmNhbGxiYWNrIC0gUHVibGlzaCB3b3JrIHRvIHJ1biBpbiBjaGFubmVsIG9yZGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jaGFubmVsIC0gQ2hhbm5lbCB3aG9zZSBvcmRlcmVkIHRhaWwgdGhlIHdvcmsgY2hhaW5zIG9udG8uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmVycm9yTWVzc2FnZSAtIE1lc3NhZ2UgbG9nZ2VkIHdoZW4gcHVibGlzaCB3b3JrIGZhaWxzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gW2FyZ3Mub3JpZ2luYXRpbmdDb25maWd1cmF0aW9uXSAtIENvbmZpZ3VyYXRpb24gd2hvc2UgY29udGV4dCBvd25zIHRoZSB3b3JrLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9xdWV1ZVB1Ymxpc2goe2NhbGxiYWNrLCBjaGFubmVsLCBlcnJvck1lc3NhZ2UsIG9yaWdpbmF0aW5nQ29uZmlndXJhdGlvbn0pIHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVycy52YWx1ZXMoKS5uZXh0KCkudmFsdWVcbiAgICBjb25zdCBjb25maWd1cmF0aW9uID0gb3JpZ2luYXRpbmdDb25maWd1cmF0aW9uIHx8IGhhbmRsZXI/LmNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCBwcmV2aW91c1RhaWwgPSB0aGlzLnB1Ymxpc2hRdWV1ZXNCeUNoYW5uZWwuZ2V0KGNoYW5uZWwpIHx8IFByb21pc2UucmVzb2x2ZSgpXG4gICAgbGV0IHF1ZXVlZFB1Ymxpc2hcblxuICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICBxdWV1ZWRQdWJsaXNoID0gcHJldmlvdXNUYWlsLnRoZW4oKCkgPT4gY29uZmlndXJhdGlvbi53aXRob3V0Q3VycmVudFRlc3REYXRhYmFzZUFjY2Vzc1Njb3BlKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb24ud2l0aG91dEN1cnJlbnRDb25uZWN0aW9uQ29udGV4dHMoKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBjb25maWd1cmF0aW9uLnJ1bldpdGhUZXN0U2hhcmVkQ29ubmVjdGlvbkNvbnRleHRzKGNhbGxiYWNrKVxuICAgICAgICB9KVxuICAgICAgfSkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXVlZFB1Ymxpc2ggPSBwcmV2aW91c1RhaWwudGhlbihjYWxsYmFjaylcbiAgICB9XG5cbiAgICBjb25zdCB0YWlsID0gcXVldWVkUHVibGlzaFxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yTWVzc2FnZSwgZXJyb3IpXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9KVxuXG4gICAgdGhpcy5wdWJsaXNoUXVldWVzQnlDaGFubmVsLnNldChjaGFubmVsLCB0YWlsKVxuXG4gICAgLy8gUmVtb3ZlIHRoZSB0YWlsIG9uY2UgaXQgc2V0dGxlcyBzdWNjZXNzZnVsbHksIGJ1dCBvbmx5IHdoZW4gaXQgaXNcbiAgICAvLyBzdGlsbCB0aGUgbmV3ZXN0IHRhaWwg4oCUIGFuIG9sZGVyIHNldHRsZWQgdGFpbCBtdXN0IG5ldmVyIGRlbGV0ZSBhXG4gICAgLy8gbmV3ZXIgb25lLiBBIHJlamVjdGVkIHRhaWwgc3RheXMgaW4gdGhlIG1hcCBzbyB0aGUgY2hhbm5lbCByZW1haW5zXG4gICAgLy8gcG9pc29uZWQgYW5kIG9ic2VydmFibGUgdGhyb3VnaCBhd2FpdFBlbmRpbmdCcm9hZGNhc3RzLlxuICAgIHRhaWwudGhlbihcbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucHVibGlzaFF1ZXVlc0J5Q2hhbm5lbC5nZXQoY2hhbm5lbCkgPT09IHRhaWwpIHtcbiAgICAgICAgICB0aGlzLnB1Ymxpc2hRdWV1ZXNCeUNoYW5uZWwuZGVsZXRlKGNoYW5uZWwpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAoKSA9PiB1bmRlZmluZWRcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogUnVucyBwZXJzaXN0IHYyIGV2ZW50IGlmIG5lZWRlZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBhcmdzLmJvZHkgLSBFdmVudCBib2R5LlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYXJncy5icm9hZGNhc3RQYXJhbXMgLSBSb3V0aW5nIGZpbHRlciBwYXJhbXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBPcmlnaW5hdGluZyBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7Y3JlYXRlZEF0OiBzdHJpbmcsIGlkOiBzdHJpbmd9IHwgbnVsbD59IC0gUGVyc2lzdGVkIGV2ZW50IG1ldGFkYXRhIHdoZW4gc3RvcmFnZSBpcyBlbmFibGVkLlxuICAgKi9cbiAgYXN5bmMgX3BlcnNpc3RWMkV2ZW50SWZOZWVkZWQoe2JvZHksIGJyb2FkY2FzdFBhcmFtcywgY2hhbm5lbCwgY29uZmlndXJhdGlvbn0pIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fcGVyc2lzdENoYW5uZWxFdmVudElmTmVlZGVkKHticm9hZGNhc3RQYXJhbXMsIGNoYW5uZWwsIGNvbmZpZ3VyYXRpb24sIHBheWxvYWQ6IGJvZHl9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcGVyc2lzdCBldmVudCBpZiBuZWVkZWQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGFyZ3MucGF5bG9hZCAtIFBheWxvYWQgZGF0YS5cbiAgICogQHJldHVybnMge1Byb21pc2U8e2NyZWF0ZWRBdDogc3RyaW5nLCBpZDogc3RyaW5nfSB8IG51bGw+fSAtIFBlcnNpc3RlZCBldmVudCBtZXRhZGF0YS5cbiAgICovXG4gIGFzeW5jIF9wZXJzaXN0RXZlbnRJZk5lZWRlZCh7Y2hhbm5lbCwgcGF5bG9hZH0pIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fcGVyc2lzdENoYW5uZWxFdmVudElmTmVlZGVkKHtjaGFubmVsLCBwYXlsb2FkfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHBlcnNpc3QgY2hhbm5lbCBldmVudCBpZiBuZWVkZWQuIFBlcnNpc3RzIHRoZSBicm9hZGNhc3QncyByb3V0aW5nXG4gICAqIHBhcmFtcyAoc2FuaXRpemVkIHRocm91Z2ggdGhlIGNoYW5uZWwgY2xhc3Mnc1xuICAgKiBgcmVwbGF5YWJsZUJyb2FkY2FzdFBhcmFtc2ApIHNvIHJlcGxheSBjYW4gcmUtYXBwbHkgYG1hdGNoZXMoKWAgcGVyXG4gICAqIHN0cmVhbSBpbnN0ZWFkIG9mIGRlbGl2ZXJpbmcgdGhlIHdob2xlIGNoYW5uZWwncyBsb2cuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+IHwgbnVsbH0gW2FyZ3MuYnJvYWRjYXN0UGFyYW1zXSAtIEJyb2FkY2FzdCBwYXJhbXMgdG8gcGVyc2lzdCBmb3Igc3RyZWFtLXNjb3BlZCByZXBsYXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNoYW5uZWwgLSBDaGFubmVsIG5hbWUuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGFyZ3MucGF5bG9hZCAtIFBheWxvYWQgZGF0YS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IFthcmdzLmNvbmZpZ3VyYXRpb25dIC0gQ29uZmlndXJhdGlvbiBvd25pbmcgdGhlIGV2ZW50IHN0b3JlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7Y3JlYXRlZEF0OiBzdHJpbmcsIGlkOiBzdHJpbmd9IHwgbnVsbD59IC0gUGVyc2lzdGVkIGV2ZW50IG1ldGFkYXRhLlxuICAgKi9cbiAgYXN5bmMgX3BlcnNpc3RDaGFubmVsRXZlbnRJZk5lZWRlZCh7YnJvYWRjYXN0UGFyYW1zID0gbnVsbCwgY2hhbm5lbCwgY29uZmlndXJhdGlvbiwgcGF5bG9hZH0pIHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVycy52YWx1ZXMoKS5uZXh0KCkudmFsdWVcbiAgICBjb25zdCBldmVudENvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uIHx8IGhhbmRsZXI/LmNvbmZpZ3VyYXRpb25cblxuICAgIGlmICghZXZlbnRDb25maWd1cmF0aW9uKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3Qgd2Vic29ja2V0RXZlbnRMb2dTdG9yZSA9IHdlYnNvY2tldEV2ZW50TG9nU3RvcmVGb3JDb25maWd1cmF0aW9uKGV2ZW50Q29uZmlndXJhdGlvbilcbiAgICBjb25zdCBzaG91bGRQZXJzaXN0ID0gYXdhaXQgd2Vic29ja2V0RXZlbnRMb2dTdG9yZS5zaG91bGRQZXJzaXN0Q2hhbm5lbChjaGFubmVsKVxuXG4gICAgaWYgKCFzaG91bGRQZXJzaXN0KSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgQ2hhbm5lbENsYXNzID0gZXZlbnRDb25maWd1cmF0aW9uLmdldFdlYnNvY2tldENoYW5uZWxDbGFzcyhjaGFubmVsKVxuICAgIGNvbnN0IHBhcmFtcyA9IENoYW5uZWxDbGFzcyA/IENoYW5uZWxDbGFzcy5yZXBsYXlhYmxlQnJvYWRjYXN0UGFyYW1zKGJyb2FkY2FzdFBhcmFtcykgOiBicm9hZGNhc3RQYXJhbXNcblxuICAgIGNvbnN0IHBlcnNpc3RlZEV2ZW50ID0gYXdhaXQgd2Vic29ja2V0RXZlbnRMb2dTdG9yZS5hcHBlbmRFdmVudCh7Y2hhbm5lbCwgcGFyYW1zLCBwYXlsb2FkfSlcblxuICAgIHJldHVybiB7XG4gICAgICBjcmVhdGVkQXQ6IHBlcnNpc3RlZEV2ZW50LmNyZWF0ZWRBdCxcbiAgICAgIGlkOiBwZXJzaXN0ZWRFdmVudC5pZFxuICAgIH1cbiAgfVxufVxuXG5jb25zdCB3ZWJzb2NrZXRFdmVudHNIb3N0ID0gbmV3IFZlbG9jaW91c0h0dHBTZXJ2ZXJXZWJzb2NrZXRFdmVudHNIb3N0KClcblxuZXhwb3J0IGRlZmF1bHQgd2Vic29ja2V0RXZlbnRzSG9zdFxuIl19
@@ -1,52 +1,2 @@
1
- /**
2
- * Runs object containing.
3
- * @param {ReturnType<typeof JSON.parse>} value - Value.
4
- * @returns {{__velociousMatcher: string, value: ReturnType<typeof JSON.parse>}} - Matcher wrapper.
5
- */
6
- declare function objectContaining(value: ReturnType<typeof JSON.parse>): {
7
- __velociousMatcher: string;
8
- value: ReturnType<typeof JSON.parse>;
9
- };
10
- /**
11
- * Runs array containing.
12
- * @param {ReturnType<typeof JSON.parse>} value - Value.
13
- * @returns {{__velociousMatcher: string, value: ReturnType<typeof JSON.parse>}} - Matcher wrapper.
14
- */
15
- declare function arrayContaining(value: ReturnType<typeof JSON.parse>): {
16
- __velociousMatcher: string;
17
- value: ReturnType<typeof JSON.parse>;
18
- };
19
- /**
20
- * Runs is array containing.
21
- * @param {ReturnType<typeof JSON.parse>} value - Value.
22
- * @returns {boolean} - Whether arrayContaining matcher.
23
- */
24
- declare function isArrayContaining(value: ReturnType<typeof JSON.parse>): boolean;
25
- /**
26
- * Runs is object containing.
27
- * @param {ReturnType<typeof JSON.parse>} value - Value.
28
- * @returns {boolean} - Whether objectContaining matcher.
29
- */
30
- declare function isObjectContaining(value: ReturnType<typeof JSON.parse>): boolean;
31
- /**
32
- * Runs match object.
33
- * @param {ReturnType<typeof JSON.parse>} actual - Actual value.
34
- * @param {Record<string, ReturnType<typeof JSON.parse>> | Array<ReturnType<typeof JSON.parse>>} expected - Expected value.
35
- * @returns {{matches: boolean, differences: Record<string, Array<ReturnType<typeof JSON.parse>>>}} - Match result.
36
- */
37
- declare function matchObject(actual: ReturnType<typeof JSON.parse>, expected: Record<string, ReturnType<typeof JSON.parse>> | Array<ReturnType<typeof JSON.parse>>): {
38
- matches: boolean;
39
- differences: Record<string, Array<ReturnType<typeof JSON.parse>>>;
40
- };
41
- /**
42
- * Runs match array containing.
43
- * @param {ReturnType<typeof JSON.parse>} actual - Actual value.
44
- * @param {Array<ReturnType<typeof JSON.parse>>} expected - Expected values.
45
- * @returns {{matches: boolean, differences: Record<string, Array<ReturnType<typeof JSON.parse>>>}} - Match result.
46
- */
47
- declare function matchArrayContaining(actual: ReturnType<typeof JSON.parse>, expected: Array<ReturnType<typeof JSON.parse>>): {
48
- matches: boolean;
49
- differences: Record<string, Array<ReturnType<typeof JSON.parse>>>;
50
- };
51
- export { arrayContaining, isArrayContaining, isObjectContaining, matchArrayContaining, matchObject, objectContaining };
1
+ export { arrayContaining, isArrayContaining, isObjectContaining, matchArrayContaining, matchObject, objectContaining } from "@velocious/testing";
52
2
  //# sourceMappingURL=expect-utils.d.ts.map