velocious 1.0.558 → 1.0.560

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 (87) hide show
  1. package/README.md +8 -3
  2. package/build/background-jobs/store.js +262 -16
  3. package/build/background-jobs/web/authorization.js +5 -4
  4. package/build/background-jobs/web/controller.js +13 -16
  5. package/build/background-jobs/web/counts-channel.js +79 -0
  6. package/build/background-jobs/web/index.js +2 -0
  7. package/build/background-jobs/web/registry.js +1 -1
  8. package/build/database/drivers/base.js +9 -2
  9. package/build/database/drivers/mysql/index.js +11 -2
  10. package/build/database/drivers/mysql/query.js +198 -22
  11. package/build/database/query/index.js +16 -1
  12. package/build/database/query/model-class-query.js +3 -2
  13. package/build/database/query/query-data.js +75 -7
  14. package/build/database/query/with-count.js +64 -28
  15. package/build/database/query-aborted-error.js +24 -0
  16. package/build/http-server/client/websocket-session.js +134 -28
  17. package/build/src/background-jobs/store.d.ts +79 -0
  18. package/build/src/background-jobs/store.d.ts.map +1 -1
  19. package/build/src/background-jobs/store.js +235 -17
  20. package/build/src/background-jobs/web/authorization.d.ts +5 -3
  21. package/build/src/background-jobs/web/authorization.d.ts.map +1 -1
  22. package/build/src/background-jobs/web/authorization.js +6 -5
  23. package/build/src/background-jobs/web/controller.d.ts.map +1 -1
  24. package/build/src/background-jobs/web/controller.js +14 -15
  25. package/build/src/background-jobs/web/counts-channel.d.ts +31 -0
  26. package/build/src/background-jobs/web/counts-channel.d.ts.map +1 -0
  27. package/build/src/background-jobs/web/counts-channel.js +71 -0
  28. package/build/src/background-jobs/web/index.d.ts.map +1 -1
  29. package/build/src/background-jobs/web/index.js +3 -1
  30. package/build/src/background-jobs/web/registry.d.ts +1 -1
  31. package/build/src/background-jobs/web/registry.d.ts.map +1 -1
  32. package/build/src/background-jobs/web/registry.js +2 -2
  33. package/build/src/database/drivers/base.d.ts +6 -1
  34. package/build/src/database/drivers/base.d.ts.map +1 -1
  35. package/build/src/database/drivers/base.js +10 -3
  36. package/build/src/database/drivers/mssql/index.d.ts +6 -0
  37. package/build/src/database/drivers/mssql/index.d.ts.map +1 -1
  38. package/build/src/database/drivers/mysql/index.d.ts.map +1 -1
  39. package/build/src/database/drivers/mysql/index.js +12 -3
  40. package/build/src/database/drivers/mysql/query.d.ts +13 -3
  41. package/build/src/database/drivers/mysql/query.d.ts.map +1 -1
  42. package/build/src/database/drivers/mysql/query.js +172 -23
  43. package/build/src/database/drivers/pgsql/index.d.ts +6 -0
  44. package/build/src/database/drivers/pgsql/index.d.ts.map +1 -1
  45. package/build/src/database/drivers/sqlite/index.d.ts +6 -0
  46. package/build/src/database/drivers/sqlite/index.d.ts.map +1 -1
  47. package/build/src/database/drivers/sqlite/index.native.d.ts +6 -0
  48. package/build/src/database/drivers/sqlite/index.native.d.ts.map +1 -1
  49. package/build/src/database/drivers/sqlite/index.web.d.ts +6 -0
  50. package/build/src/database/drivers/sqlite/index.web.d.ts.map +1 -1
  51. package/build/src/database/query/index.d.ts +13 -1
  52. package/build/src/database/query/index.d.ts.map +1 -1
  53. package/build/src/database/query/index.js +15 -3
  54. package/build/src/database/query/model-class-query.d.ts.map +1 -1
  55. package/build/src/database/query/model-class-query.js +4 -3
  56. package/build/src/database/query/query-data.d.ts.map +1 -1
  57. package/build/src/database/query/query-data.js +69 -8
  58. package/build/src/database/query/with-count.d.ts.map +1 -1
  59. package/build/src/database/query/with-count.js +60 -26
  60. package/build/src/database/query-aborted-error.d.ts +23 -0
  61. package/build/src/database/query-aborted-error.d.ts.map +1 -0
  62. package/build/src/database/query-aborted-error.js +23 -0
  63. package/build/src/http-server/client/websocket-session.d.ts +31 -3
  64. package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
  65. package/build/src/http-server/client/websocket-session.js +112 -26
  66. package/build/src/tenants/tenant-aggregator.d.ts +4 -0
  67. package/build/src/tenants/tenant-aggregator.d.ts.map +1 -1
  68. package/build/src/tenants/tenant-aggregator.js +4 -3
  69. package/build/tenants/tenant-aggregator.js +3 -2
  70. package/build/tsconfig.tsbuildinfo +1 -1
  71. package/package.json +3 -1
  72. package/src/background-jobs/store.js +262 -16
  73. package/src/background-jobs/web/authorization.js +5 -4
  74. package/src/background-jobs/web/controller.js +13 -16
  75. package/src/background-jobs/web/counts-channel.js +79 -0
  76. package/src/background-jobs/web/index.js +2 -0
  77. package/src/background-jobs/web/registry.js +1 -1
  78. package/src/database/drivers/base.js +9 -2
  79. package/src/database/drivers/mysql/index.js +11 -2
  80. package/src/database/drivers/mysql/query.js +198 -22
  81. package/src/database/query/index.js +16 -1
  82. package/src/database/query/model-class-query.js +3 -2
  83. package/src/database/query/query-data.js +75 -7
  84. package/src/database/query/with-count.js +64 -28
  85. package/src/database/query-aborted-error.js +24 -0
  86. package/src/http-server/client/websocket-session.js +134 -28
  87. package/src/tenants/tenant-aggregator.js +3 -2
@@ -163,21 +163,47 @@ export async function runQueryData({ rootModelClass, rootModels, entries }) {
163
163
  return;
164
164
  const primaryKey = rootModelClass.primaryKey();
165
165
  const rootIds = rootModels.map((model) => /** @type {string | number} */ (model.readColumn(primaryKey)));
166
- for (const entry of entries) {
167
- await runEntry({ entry, primaryKey, rootIds, rootModelClass, rootModels });
166
+ const preparedEntries = entries.map((entry, entryIndex) => prepareEntry({ entry, entryIndex, primaryKey, rootIds, rootModelClass }));
167
+ /**
168
+ * Compatible query groups.
169
+ * @type {Array<{aliases: Set<string>, query: import("./model-class-query.js").default, signature: string}>} */
170
+ const queryGroups = [];
171
+ for (const preparedEntry of preparedEntries) {
172
+ const compatibleGroup = queryGroups.find((group, groupIndex) => {
173
+ if (group.signature !== preparedEntry.signature)
174
+ return false;
175
+ if (queryGroups.slice(groupIndex + 1).some((interveningGroup) => (preparedEntry.aliases.some((alias) => interveningGroup.aliases.has(alias)))))
176
+ return false;
177
+ return preparedEntry.aliases.every((alias) => !group.aliases.has(alias));
178
+ });
179
+ if (compatibleGroup) {
180
+ compatibleGroup.query.select(preparedEntry.query.getSelects().slice(1));
181
+ for (const alias of preparedEntry.aliases)
182
+ compatibleGroup.aliases.add(alias);
183
+ }
184
+ else {
185
+ queryGroups.push({
186
+ aliases: new Set(preparedEntry.aliases),
187
+ query: preparedEntry.query,
188
+ signature: preparedEntry.signature
189
+ });
190
+ }
191
+ }
192
+ for (const { query } of queryGroups) {
193
+ await executeEntryQuery({ primaryKey, query, rootModels });
168
194
  }
169
195
  }
170
196
  /**
171
- * Runs run entry.
197
+ * Prepares one queryData entry and its compatibility metadata.
172
198
  * @param {object} args - Options.
173
199
  * @param {QueryDataEntry} args.entry - Entry being evaluated.
200
+ * @param {number} args.entryIndex - Stable position used to isolate opaque projections.
174
201
  * @param {string} args.primaryKey - Root model primary key column.
175
202
  * @param {Array<string | number>} args.rootIds - Root primary-key values.
176
203
  * @param {typeof import("../record/index.js").default} args.rootModelClass - Root model class.
177
- * @param {import("../record/index.js").default[]} args.rootModels - Loaded root records.
178
- * @returns {Promise<void>}
204
+ * @returns {{aliases: string[], query: import("./model-class-query.js").default, signature: string}} - Prepared entry.
179
205
  */
180
- async function runEntry({ entry, primaryKey, rootIds, rootModelClass, rootModels }) {
206
+ function prepareEntry({ entry, entryIndex, primaryKey, rootIds, rootModelClass }) {
181
207
  const targetModelClass = resolveTargetModelClass(rootModelClass, entry.chain);
182
208
  const fn = targetModelClass.getQueryDataByName(entry.fnName);
183
209
  if (!fn) {
@@ -187,7 +213,7 @@ async function runEntry({ entry, primaryKey, rootIds, rootModelClass, rootModels
187
213
  const query = rootModelClass._newQuery();
188
214
  // Empty out any defaults the query factory added — queryData runs
189
215
  // a bare aggregate, not a full model load.
190
- query._selects = [];
216
+ query.reselect();
191
217
  query._preload = {};
192
218
  // Force the root WHERE to qualify by table name so it survives the
193
219
  // joins the fn may add later (otherwise a child table sharing the
@@ -223,6 +249,41 @@ async function runEntry({ entry, primaryKey, rootIds, rootModelClass, rootModels
223
249
  query,
224
250
  tableName: targetTableRef
225
251
  });
252
+ const aliases = selectedAliases(query);
253
+ const signatureQuery = query.clone();
254
+ signatureQuery.reselect(signatureQuery.getSelects().slice(0, 1));
255
+ return {
256
+ aliases: aliases || [],
257
+ query,
258
+ signature: aliases ? signatureQuery.toSql() : `opaque:${entryIndex}`
259
+ };
260
+ }
261
+ /**
262
+ * Returns explicit aliases selected after the reserved parent id.
263
+ * Entries with an opaque select stay isolated by receiving a unique compatibility alias.
264
+ * @param {import("./model-class-query.js").default} query - Prepared queryData query.
265
+ * @returns {string[] | null} - Selected aliases, or null for an opaque projection.
266
+ */
267
+ function selectedAliases(query) {
268
+ const aliases = [];
269
+ for (const select of query.getSelects().slice(1)) {
270
+ const sql = select.toSql();
271
+ const match = sql.match(/\sAS\s+([^\s]+)\s*$/iu);
272
+ if (!match)
273
+ return null;
274
+ aliases.push(match[1].replace(/^["[`]|["`\]]$/gu, ""));
275
+ }
276
+ return aliases;
277
+ }
278
+ /**
279
+ * Executes one compatible queryData group and attaches every selected alias.
280
+ * @param {object} args - Options.
281
+ * @param {string} args.primaryKey - Root model primary key column.
282
+ * @param {import("./model-class-query.js").default} args.query - Prepared grouped query.
283
+ * @param {import("../record/index.js").default[]} args.rootModels - Loaded root records.
284
+ * @returns {Promise<void>}
285
+ */
286
+ async function executeEntryQuery({ primaryKey, query, rootModels }) {
226
287
  const rows = /** @type {Array<Record<string, ?>>} */ (await query._executeQuery());
227
288
  const byParent = new Map();
228
289
  for (const row of rows) {
@@ -248,4 +309,4 @@ async function runEntry({ entry, primaryKey, rootIds, rootModelClass, rootModels
248
309
  }
249
310
  }
250
311
  }
251
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktZGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS9xdWVyeS9xdWVyeS1kYXRhLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUE7QUFFN0M7Ozs7O0dBS0c7QUFFSDs7O0dBR0c7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7O0dBR0c7QUFFSDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUFDLElBQUksRUFBRSxLQUFLLEdBQUcsRUFBRTtJQUNyRCxJQUFJLElBQUksSUFBSSxJQUFJO1FBQUUsT0FBTyxFQUFFLENBQUE7SUFFM0IsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM3QixPQUFPLENBQUMsRUFBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO0lBQzVDLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN4Qjs7c0NBRThCO1FBQzlCLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQTtRQUVsQixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3hCLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzdCLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO2dCQUMvQyxTQUFRO1lBQ1YsQ0FBQztZQUVELElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3hCLEtBQUssTUFBTSxNQUFNLElBQUksc0JBQXNCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJ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UUFDN0UsbUVBQW1FO1FBQ25FLGlFQUFpRTtRQUNqRSxpQ0FBaUM7UUFDakMsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7WUFDL0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO1lBQ3ZCLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO1FBRWpDLElBQUksQ0FBQyxHQUFHO1lBQUUsU0FBUTtRQUVsQixLQUFLLE1BQU0sQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RELElBQUksVUFBVSxLQUFLLFdBQVc7Z0JBQUUsU0FBUTtZQUV4QyxLQUFLLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUN4QyxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtpc1BsYWluT2JqZWN0fSBmcm9tIFwiaXMtcGxhaW4tb2JqZWN0XCJcblxuLyoqXG4gKiBRdWVyeURhdGFFbnRyeSB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gUXVlcnlEYXRhRW50cnlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGNoYWluIC0gUmVsYXRpb25zaGlwIGNoYWluIGZyb20gdGhlIHJvb3QgbW9kZWwgdG8gdGhlIG1vZGVsIHRoYXQgZGVjbGFyZXMgdGhlIGZuLiBFbXB0eSBmb3IgYSByb290LWxldmVsIGVudHJ5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZuTmFtZSAtIElkZW50aWZpZXIgdW5kZXIgd2hpY2ggdGhlIGZuIGlzIHJlZ2lzdGVyZWQgb24gdGhlIGRlY2xhcmluZyBtb2RlbC5cbiAqL1xuXG4vKipcbiAqIERlZmluZXMgdGhpcyB0eXBlZGVmLlxuICogQHR5cGVkZWYge3N0cmluZyB8IEFycmF5PHN0cmluZyB8IFJlY29yZDxzdHJpbmcsID8+PiB8IHtba2V5OiBzdHJpbmddOiB0cnVlIHwgZmFsc2UgfCBzdHJpbmcgfCBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsID8+fX0gUXVlcnlEYXRhU3BlY1xuICovXG5cbi8qKlxuICogUXVlcnlEYXRhQ2FsbGJhY2tBcmdzIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBRdWVyeURhdGFDYWxsYmFja0FyZ3NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lIC0gTmFtZSB1bmRlciB3aGljaCB0aGUgZm4gd2FzIHJlZ2lzdGVyZWQuIENvbnZlbmllbnQgd2hlbiBhIGZuIGlzIHJldXNlZCBhY3Jvc3MgYWxpYXNlcy5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGRyaXZlciAtIEFjdGl2ZSBkYXRhYmFzZSBkcml2ZXIsIGZvciBxdW90aW5nIGhlbHBlcnMgYW5kIHR5cGUtc3BlY2lmaWMgU1FMLlxuICogQHByb3BlcnR5IHt0eXBlb2YgaW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcyB0aGUgZm4gaXMgcmVnaXN0ZXJlZCBvbiAodGhlIGNoYWluJ3MgdGFyZ2V0KS5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8c3RyaW5nIHwgbnVtYmVyPn0gcGFyZW50SWRzIC0gUHJpbWFyeS1rZXkgdmFsdWVzIG9mIHRoZSBsb2FkZWQgcm9vdCByZWNvcmRzLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IHF1ZXJ5IC0gR3JvdXBlZCBxdWVyeSBhbHJlYWR5IGpvaW5lZCBkb3duIHRoZSBjaGFpbiwgZmlsdGVyZWQgYnkgYHBhcmVudElkc2AsIHdpdGggYHBhcmVudF9pZGAgcHJlLXNlbGVjdGVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRhYmxlTmFtZSAtIFVucXVvdGVkIHRhYmxlIHJlZmVyZW5jZSAoYWxpYXMgb3IgdGFibGUgbmFtZSkgZm9yIHRoZSBjaGFpbidzIHRhcmdldCwgcmVhZHkgdG8gcGFzdGUgaW50byBTUUwuXG4gKi9cblxuLyoqXG4gKiBRdWVyeURhdGFGbiB0eXBlLlxuICogQHR5cGVkZWYgeyhhcmdzOiBRdWVyeURhdGFDYWxsYmFja0FyZ3MpID0+IHZvaWQgfCBpbXBvcnQoXCIuL21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IFF1ZXJ5RGF0YUZuXG4gKi9cblxuLyoqXG4gKiBOb3JtYWxpemUgYSB1c2VyLXN1cHBsaWVkIHF1ZXJ5RGF0YSBzcGVjIGludG8gYSBmbGF0IGxpc3Qgb2YgZW50cmllc1xuICogdGhlIHJ1bm5lciBjYW4gY29uc3VtZS4gVGhlIHNwZWMgbWlycm9ycyB0aGUgc2hhcGUgb2YgYHByZWxvYWRgLCB3aXRoXG4gKiB0aGUgaW1wb3J0YW50IGRpc3RpbmN0aW9uIHRoYXQgKipsZWFmIHN0cmluZ3MgYXJlIGZuIG5hbWVzKiosIG5vdFxuICogZnVydGhlciByZWxhdGlvbnNoaXAgc2VnbWVudHMuIE5lc3RlZCBrZXlzIGFyZSByZWxhdGlvbnNoaXAgbmFtZXNcbiAqIGFsb25nIHRoZSBqb2luIGNoYWluIGZyb20gdGhlIHJvb3QgbW9kZWwgdG8gdGhlIGRlY2xhcmluZyBtb2RlbC5cbiAqXG4gKiBBY2NlcHRlZCBzaGFwZXMgKGFsbCB5aWVsZCB0aGUgc2FtZSBmbGF0IGVudHJpZXMpOlxuICogICBcImZvb1wiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDihpIgW3tjaGFpbjogW10sIGZuTmFtZTogXCJmb29cIn1dXG4gKiAgIFtcImZvb1wiLCBcImJhclwiXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4oaSIFt7Y2hhaW46IFtdLCBmbk5hbWU6IFwiZm9vXCJ9LCB7Y2hhaW46IFtdLCBmbk5hbWU6IFwiYmFyXCJ9XVxuICogICB7Zm9vOiB0cnVlfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4oaSIFt7Y2hhaW46IFtdLCBmbk5hbWU6IFwiZm9vXCJ9XVxuICogICB7cHJvamVjdHM6IFtcInRhc2tzQ291bnRcIl19ICAgICAgICAgICAgICAgICDihpIgW3tjaGFpbjogW1wicHJvamVjdHNcIl0sIGZuTmFtZTogXCJ0YXNrc0NvdW50XCJ9XVxuICogICB7cHJvamVjdHM6IHt0YXNrczogW1widHJhbnNwb3J0U2Vjb25kc1N1bVwiLCB7dGltZWxvZ3M6IFtcInRpbWVTZWNvbmRzU3VtXCJdfV19fVxuICogICAgIOKGkiBbe2NoYWluOiBbXCJwcm9qZWN0c1wiLFwidGFza3NcIl0sIGZuTmFtZTogXCJ0cmFuc3BvcnRTZWNvbmRzU3VtXCJ9LFxuICogICAgICAgIHtjaGFpbjogW1wicHJvamVjdHNcIixcInRhc2tzXCIsXCJ0aW1lbG9nc1wiXSwgZm5OYW1lOiBcInRpbWVTZWNvbmRzU3VtXCJ9XVxuICogQHBhcmFtIHtRdWVyeURhdGFTcGVjfSBzcGVjIC0gVXNlci1zdXBwbGllZCBzcGVjLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gW2NoYWluXSAtIEN1cnJlbnQgY2hhaW4gKGludGVybmFsIHJlY3Vyc2lvbikuXG4gKiBAcmV0dXJucyB7UXVlcnlEYXRhRW50cnlbXX0gLSBGbGF0IGxpc3Qgb2YgZW50cmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVF1ZXJ5RGF0YVNwZWMoc3BlYywgY2hhaW4gPSBbXSkge1xuICBpZiAoc3BlYyA9PSBudWxsKSByZXR1cm4gW11cblxuICBpZiAodHlwZW9mIHNwZWMgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gW3tjaGFpbjogWy4uLmNoYWluXSwgZm5OYW1lOiBzcGVjfV1cbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHNwZWMpKSB7XG4gICAgLyoqXG4gICAgICogRW50cmllcy5cbiAgICAgKiBAdHlwZSB7UXVlcnlEYXRhRW50cnlbXX0gKi9cbiAgICBjb25zdCBlbnRyaWVzID0gW11cblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBzcGVjKSB7XG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgZW50cmllcy5wdXNoKHtjaGFpbjogWy4uLmNoYWluXSwgZm5OYW1lOiBpdGVtfSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGlzUGxhaW5PYmplY3QoaXRlbSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBuZXN0ZWQgb2Ygbm9ybWFsaXplUXVlcnlEYXRhU3BlYygvKiogQHR5cGUgez99ICovIChpdGVtKSwgY2hhaW4pKSB7XG4gICAgICAgICAgZW50cmllcy5wdXNoKG5lc3RlZClcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcXVlcnlEYXRhIGFycmF5IGVudHJ5OiAke3R5cGVvZiBpdGVtfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGVudHJpZXNcbiAgfVxuXG4gIGlmIChpc1BsYWluT2JqZWN0KHNwZWMpKSB7XG4gICAgLyoqXG4gICAgICogRW50cmllcy5cbiAgICAgKiBAdHlwZSB7UXVlcnlEYXRhRW50cnlbXX0gKi9cbiAgICBjb25zdCBlbnRyaWVzID0gW11cblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNwZWMpKSB7XG4gICAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgZW50cmllcy5wdXNoKHtjaGFpbjogWy4uLmNoYWluXSwgZm5OYW1lOiBrZXl9KVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUgPT09IGZhbHNlKSBjb250aW51ZVxuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpIHx8IGlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgICAgIGZvciAoY29uc3QgbmVzdGVkIG9mIG5vcm1hbGl6ZVF1ZXJ5RGF0YVNwZWMoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpLCBbLi4uY2hhaW4sIGtleV0pKSB7XG4gICAgICAgICAgZW50cmllcy5wdXNoKG5lc3RlZClcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcXVlcnlEYXRhIHZhbHVlIGZvciBcIiR7a2V5fVwiOiAke3R5cGVvZiB2YWx1ZX1gKVxuICAgIH1cblxuICAgIHJldHVybiBlbnRyaWVzXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcXVlcnlEYXRhIHNwZWM6ICR7dHlwZW9mIHNwZWN9YClcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgbmVzdGVkIGBqb2lucyguLi4pYCBkZXNjcmlwdG9yIGZvciBhIGNoYWluIG9mIHJlbGF0aW9uc2hpcCBuYW1lcy5cbiAqIGBbXCJwcm9qZWN0c1wiLCBcInRhc2tzXCJdYCDihpIgYHtwcm9qZWN0czoge3Rhc2tzOiB0cnVlfX1gLiBVc2VkIGludGVybmFsbHkgc29cbiAqIHRoZSBydW5uZXIgY2FuIHJldXNlIHRoZSBleGlzdGluZyBgam9pbnNgIHBhdGgtcmVnaXN0cmF0aW9uIG1hY2hpbmVyeVxuICogKEpvaW5UcmFja2VyLCBhbGlhcyBnZW5lcmF0aW9uLCBzY29wZSBhcHBsaWNhdGlvbikuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBjaGFpbiAtIFJlbGF0aW9uc2hpcCBjaGFpbi5cbiAqIEByZXR1cm5zIHt0cnVlIHwgUmVjb3JkPHN0cmluZywgPz59IC0gTmVzdGVkIGpvaW4gZGVzY3JpcHRvciwgb3IgYHRydWVgIHdoZW4gdGhlIGNoYWluIGlzIGVtcHR5LlxuICovXG5mdW5jdGlvbiBidWlsZE5lc3RlZEpvaW5EZXNjcmlwdG9yKGNoYWluKSB7XG4gIGlmIChjaGFpbi5sZW5ndGggPT09IDApIHJldHVybiB0cnVlXG5cbiAgLyoqXG4gICAqIE9iai5cbiAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqL1xuICBjb25zdCBvYmogPSB7fVxuICBsZXQgY3Vyc29yID0gb2JqXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFpbi5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IHNlZyA9IGNoYWluW2ldXG4gICAgY29uc3QgaXNMYXN0ID0gaSA9PT0gY2hhaW4ubGVuZ3RoIC0gMVxuXG4gICAgY3Vyc29yW3NlZ10gPSBpc0xhc3QgPyB0cnVlIDoge31cblxuICAgIGlmICghaXNMYXN0KSBjdXJzb3IgPSBjdXJzb3Jbc2VnXVxuICB9XG5cbiAgcmV0dXJuIG9ialxufVxuXG4vKipcbiAqIFdhbGsgYSByZWxhdGlvbnNoaXAgY2hhaW4gZnJvbSB0aGUgcm9vdCBtb2RlbCBhbmQgcmV0dXJuIHRoZSBtb2RlbFxuICogY2xhc3MgYXQgaXRzIHRhaWwuIFRocm93cyB3aXRoIGEgY2xlYXIgbWVzc2FnZSB3aGVuIGFueSBzZWdtZW50IGlzXG4gKiB1bmtub3duLlxuICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IHJvb3RNb2RlbENsYXNzIC0gUm9vdCBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nW119IGNoYWluIC0gUmVsYXRpb25zaGlwIGNoYWluLlxuICogQHJldHVybnMge3R5cGVvZiBpbXBvcnQoXCIuLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gLSBUYXJnZXQgbW9kZWwgY2xhc3MuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVUYXJnZXRNb2RlbENsYXNzKHJvb3RNb2RlbENsYXNzLCBjaGFpbikge1xuICBsZXQgbW9kZWxDbGFzcyA9IHJvb3RNb2RlbENsYXNzXG5cbiAgZm9yIChjb25zdCBzZWdtZW50IG9mIGNoYWluKSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwID0gbW9kZWxDbGFzcy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUoc2VnbWVudClcbiAgICBjb25zdCB0YXJnZXQgPSByZWxhdGlvbnNoaXAuZ2V0VGFyZ2V0TW9kZWxDbGFzcygpXG5cbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBxdWVyeURhdGE6IGNvdWxkIG5vdCByZXNvbHZlIHRhcmdldCBtb2RlbCBmb3IgJHttb2RlbENsYXNzLm5hbWV9IyR7c2VnbWVudH1gKVxuICAgIH1cblxuICAgIG1vZGVsQ2xhc3MgPSB0YXJnZXRcbiAgfVxuXG4gIHJldHVybiBtb2RlbENsYXNzXG59XG5cbi8qKlxuICogUnVuIGV2ZXJ5IHF1ZXJ5RGF0YSBlbnRyeSBhZ2FpbnN0IHRoZSBsb2FkZWQgcm9vdCByZWNvcmRzLCBhdHRhY2hpbmdcbiAqIHRoZSByZXN1bHRpbmcgdmFsdWVzIGFzIHF1ZXJ5RGF0YSBlbnRyaWVzIG9uIGVhY2ggcm9vdCByZWNvcmQuXG4gKlxuICogT25lIGdyb3VwZWQgcXVlcnkgcGVyIGVudHJ5OiB0aGUgcnVubmVyIGJ1aWxkcyBhIGZyZXNoIHF1ZXJ5IG92ZXIgdGhlXG4gKiByb290IG1vZGVsLCBqb2lucyBkb3duIHRoZSBjaGFpbiwgZ3JvdXBzIGJ5IHRoZSByb290IHRhYmxlJ3MgcHJpbWFyeVxuICoga2V5LCBhbmQgaW52b2tlcyB0aGUgcmVnaXN0ZXJlZCBmbiB0byBhZGQgaXRzIG93biBTRUxFQ1QgKGFuZCBhbnlcbiAqIGFkZGl0aW9uYWwgam9pbnMvd2hlcmUpLiBSZXN1bHRzIGFyZSBtYXBwZWQgYmFjayB0byByb290IG1vZGVscyBieVxuICogcHJpbWFyeSBrZXkgYW5kIGF0dGFjaGVkIHZpYSBgX3NldFF1ZXJ5RGF0YShuYW1lLCB2YWx1ZSlgIGZvciBldmVyeVxuICogc2VsZWN0ZWQgYWxpYXMgKGV4Y2VwdCB0aGUgcmVzZXJ2ZWQgYHBhcmVudF9pZGApLiBSb3dzIG1pc3NpbmcgZnJvbVxuICogdGhlIHJlc3VsdCBrZWVwIGBudWxsYCDigJQgbWF0Y2hlcyB0aGUgZmVhdHVyZSdzIGRvY3VtZW50ZWQgZGVmYXVsdC5cbiAqXG4gKiBNaXJyb3JzIHRoZSBzaGFwZSBvZiBgcnVuV2l0aENvdW50YDogb25lIHF1ZXJ5IHBlciBlbnRyeSwgYSBzZXBhcmF0ZVxuICogc3RvcmFnZSBtYXAgb24gdGhlIHJlY29yZCwgbmV2ZXIgdG91Y2hlcyBgX2F0dHJpYnV0ZXNgLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3Mucm9vdE1vZGVsQ2xhc3MgLSBSb290IG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdFtdfSBhcmdzLnJvb3RNb2RlbHMgLSBMb2FkZWQgcm9vdCByZWNvcmRzLlxuICogQHBhcmFtIHtRdWVyeURhdGFFbnRyeVtdfSBhcmdzLmVudHJpZXMgLSBOb3JtYWxpemVkIHF1ZXJ5RGF0YSBlbnRyaWVzLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5RdWVyeURhdGEoe3Jvb3RNb2RlbENsYXNzLCByb290TW9kZWxzLCBlbnRyaWVzfSkge1xuICBpZiAocm9vdE1vZGVscy5sZW5ndGggPT09IDAgfHwgZW50cmllcy5sZW5ndGggPT09IDApIHJldHVyblxuXG4gIGNvbnN0IHByaW1hcnlLZXkgPSByb290TW9kZWxDbGFzcy5wcmltYXJ5S2V5KClcbiAgY29uc3Qgcm9vdElkcyA9IHJvb3RNb2RlbHMubWFwKChtb2RlbCkgPT4gLyoqIEB0eXBlIHtzdHJpbmcgfCBudW1iZXJ9ICovIChtb2RlbC5yZWFkQ29sdW1uKHByaW1hcnlLZXkpKSlcblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBhd2FpdCBydW5FbnRyeSh7ZW50cnksIHByaW1hcnlLZXksIHJvb3RJZHMsIHJvb3RNb2RlbENsYXNzLCByb290TW9kZWxzfSlcbiAgfVxufVxuXG4vKipcbiAqIFJ1bnMgcnVuIGVudHJ5LlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICogQHBhcmFtIHtRdWVyeURhdGFFbnRyeX0gYXJncy5lbnRyeSAtIEVudHJ5IGJlaW5nIGV2YWx1YXRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnByaW1hcnlLZXkgLSBSb290IG1vZGVsIHByaW1hcnkga2V5IGNvbHVtbi5cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgbnVtYmVyPn0gYXJncy5yb290SWRzIC0gUm9vdCBwcmltYXJ5LWtleSB2YWx1ZXMuXG4gKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5yb290TW9kZWxDbGFzcyAtIFJvb3QgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0W119IGFyZ3Mucm9vdE1vZGVscyAtIExvYWRlZCByb290IHJlY29yZHMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuRW50cnkoe2VudHJ5LCBwcmltYXJ5S2V5LCByb290SWRzLCByb290TW9kZWxDbGFzcywgcm9vdE1vZGVsc30pIHtcbiAgY29uc3QgdGFyZ2V0TW9kZWxDbGFzcyA9IHJlc29sdmVUYXJnZXRNb2RlbENsYXNzKHJvb3RNb2RlbENsYXNzLCBlbnRyeS5jaGFpbilcbiAgY29uc3QgZm4gPSB0YXJnZXRNb2RlbENsYXNzLmdldFF1ZXJ5RGF0YUJ5TmFtZShlbnRyeS5mbk5hbWUpXG5cbiAgaWYgKCFmbikge1xuICAgIHRocm93IG5ldyBFcnJvcihgcXVlcnlEYXRhOiAke3RhcmdldE1vZGVsQ2xhc3MubmFtZX0gaGFzIG5vIGVudHJ5IHJlZ2lzdGVyZWQgYXMgJHtKU09OLnN0cmluZ2lmeShlbnRyeS5mbk5hbWUpfS4gYCArXG4gICAgICBgRGVjbGFyZSBpdCB3aXRoICR7dGFyZ2V0TW9kZWxDbGFzcy5uYW1lfS5xdWVyeURhdGEoJHtKU09OLnN0cmluZ2lmeShlbnRyeS5mbk5hbWUpfSwgKHtxdWVyeSwgdGFibGVOYW1lfSkgPT4gcXVlcnkuc2VsZWN0KC4uLikpYClcbiAgfVxuXG4gIGNvbnN0IHF1ZXJ5ID0gcm9vdE1vZGVsQ2xhc3MuX25ld1F1ZXJ5KClcblxuICAvLyBFbXB0eSBvdXQgYW55IGRlZmF1bHRzIHRoZSBxdWVyeSBmYWN0b3J5IGFkZGVkIOKAlCBxdWVyeURhdGEgcnVuc1xuICAvLyBhIGJhcmUgYWdncmVnYXRlLCBub3QgYSBmdWxsIG1vZGVsIGxvYWQuXG4gIHF1ZXJ5Ll9zZWxlY3RzID0gW11cbiAgcXVlcnkuX3ByZWxvYWQgPSB7fVxuXG4gIC8vIEZvcmNlIHRoZSByb290IFdIRVJFIHRvIHF1YWxpZnkgYnkgdGFibGUgbmFtZSBzbyBpdCBzdXJ2aXZlcyB0aGVcbiAgLy8gam9pbnMgdGhlIGZuIG1heSBhZGQgbGF0ZXIgKG90aGVyd2lzZSBhIGNoaWxkIHRhYmxlIHNoYXJpbmcgdGhlXG4gIC8vIHJvb3QgUEsgY29sdW1uIG5hbWUsIGUuZy4gYGlkYCwgbWFrZXMgdGhlIGNsYXVzZSBhbWJpZ3VvdXMpLlxuICBxdWVyeS5fZm9yY2VRdWFsaWZ5QmFzZVRhYmxlID0gdHJ1ZVxuXG4gIGNvbnN0IGRyaXZlciA9IHF1ZXJ5LmRyaXZlclxuICBjb25zdCByb290VGFibGUgPSByb290TW9kZWxDbGFzcy50YWJsZU5hbWUoKVxuICBjb25zdCByb290UGtTcWwgPSBgJHtkcml2ZXIucXVvdGVUYWJsZShyb290VGFibGUpfS4ke2RyaXZlci5xdW90ZUNvbHVtbihwcmltYXJ5S2V5KX1gXG5cbiAgLyoqXG4gICAqIFJvb3Qgd2hlcmUuXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi9cbiAgY29uc3Qgcm9vdFdoZXJlID0ge31cbiAgcm9vdFdoZXJlW3ByaW1hcnlLZXldID0gcm9vdElkc1xuICBxdWVyeS53aGVyZShyb290V2hlcmUpXG5cbiAgY29uc3Qgam9pbkRlc2NyaXB0b3IgPSBidWlsZE5lc3RlZEpvaW5EZXNjcmlwdG9yKGVudHJ5LmNoYWluKVxuXG4gIGlmIChqb2luRGVzY3JpcHRvciAhPT0gdHJ1ZSkge1xuICAgIHF1ZXJ5LmpvaW5zKGpvaW5EZXNjcmlwdG9yKVxuICB9XG5cbiAgcXVlcnkuZ3JvdXAocm9vdFBrU3FsKVxuICBxdWVyeS5zZWxlY3QoYCR7cm9vdFBrU3FsfSBBUyBwYXJlbnRfaWRgKVxuXG4gIGNvbnN0IHRhcmdldFRhYmxlUmVmID0gZW50cnkuY2hhaW4ubGVuZ3RoID09PSAwXG4gICAgPyByb290VGFibGVcbiAgICA6IHF1ZXJ5LmdldFRhYmxlUmVmZXJlbmNlRm9ySm9pbiguLi5lbnRyeS5jaGFpbilcblxuICAvLyBOQjogd2UgaW50ZW50aW9uYWxseSBsZWF2ZSBgX2pvaW5CYXNlUGF0aGAgYXQgW10gc28gdGhlIG91dGVyIGNoYWluXG4gIC8vIGpvaW5zIGNvbnRpbnVlIHRvIHJlc29sdmUgZnJvbSB0aGUgcm9vdCBtb2RlbCBhdCByZW5kZXIgdGltZS4gVGhlXG4gIC8vIGZuIGdldHMgYHRhYmxlTmFtZWAgZm9yIHNlbGYtcmVmZXJlbmNlOyBhZGRpdGlvbmFsIGpvaW5zIGZyb21cbiAgLy8gbmVzdGVkIGxldmVscyBzaG91bGQgdXNlIGZ1bGwgcGF0aHMgZnJvbSB0aGUgcm9vdC5cbiAgZm4oe1xuICAgIGF0dHJpYnV0ZU5hbWU6IGVudHJ5LmZuTmFtZSxcbiAgICBkcml2ZXIsXG4gICAgbW9kZWxDbGFzczogdGFyZ2V0TW9kZWxDbGFzcyxcbiAgICBwYXJlbnRJZHM6IHJvb3RJZHMsXG4gICAgcXVlcnksXG4gICAgdGFibGVOYW1lOiB0YXJnZXRUYWJsZVJlZlxuICB9KVxuXG4gIGNvbnN0IHJvd3MgPSAvKiogQHR5cGUge0FycmF5PFJlY29yZDxzdHJpbmcsID8+Pn0gKi8gKGF3YWl0IHF1ZXJ5Ll9leGVjdXRlUXVlcnkoKSlcbiAgY29uc3QgYnlQYXJlbnQgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgY29uc3QgcGFyZW50SWQgPSByb3cucGFyZW50X2lkXG5cbiAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgY29udGludWVcblxuICAgIGJ5UGFyZW50LnNldChwYXJlbnRJZCwgcm93KVxuICB9XG5cbiAgZm9yIChjb25zdCBtb2RlbCBvZiByb290TW9kZWxzKSB7XG4gICAgY29uc3QgbW9kZWxJZCA9IC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVtYmVyfSAqLyAobW9kZWwucmVhZENvbHVtbihwcmltYXJ5S2V5KSlcbiAgICAvLyBEcml2ZXItdHlwZSB0b2xlcmFuY2U6IE15U1FMIGNhbiByZXR1cm4gUEtzIGFzIHN0cmluZ3MgZXZlbiB3aGVuXG4gICAgLy8gdGhlIGNvbHVtbiBpcyBudW1lcmljLiBGYWxsIGJhY2sgdG8gYSBzdHJpbmcgbG9va3VwIHNvIHJlc3VsdHNcbiAgICAvLyBzdGlsbCBsYW5kIG9uIHRoZSByaWdodCBtb2RlbC5cbiAgICBjb25zdCByb3cgPSBieVBhcmVudC5oYXMobW9kZWxJZClcbiAgICAgID8gYnlQYXJlbnQuZ2V0KG1vZGVsSWQpXG4gICAgICA6IGJ5UGFyZW50LmdldChTdHJpbmcobW9kZWxJZCkpXG5cbiAgICBpZiAoIXJvdykgY29udGludWVcblxuICAgIGZvciAoY29uc3QgW2NvbHVtbk5hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyb3cpKSB7XG4gICAgICBpZiAoY29sdW1uTmFtZSA9PT0gXCJwYXJlbnRfaWRcIikgY29udGludWVcblxuICAgICAgbW9kZWwuX3NldFF1ZXJ5RGF0YShjb2x1bW5OYW1lLCB2YWx1ZSlcbiAgICB9XG4gIH1cbn1cbiJdfQ==
312
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktZGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS9xdWVyeS9xdWVyeS1kYXRhLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUE7QUFFN0M7Ozs7O0dBS0c7QUFFSDs7O0dBR0c7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7O0dBR0c7QUFFSDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUFDLElBQUksRUFBRSxLQUFLLEdBQUcsRUFBRTtJQUNyRCxJQUFJLElBQUksSUFBSSxJQUFJO1FBQUUsT0FBTyxFQUFFLENBQUE7SUFFM0IsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM3QixPQUFPLENBQUMsRUFBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO0lBQzVDLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN4Qjs7c0NBRThCO1FBQzlCLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQTtRQUVsQixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3hCLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzdCLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO2dCQUMvQyxTQUFRO1lBQ1YsQ0FBQztZQUVELElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3hCLEtBQUssTUFBTSxNQUFNLElBQUksc0JBQXNCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJ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LElBQUksSUFBSTtZQUFFLFNBQVE7UUFFOUIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUE7SUFDN0IsQ0FBQztJQUVELEtBQUssTUFBTSxLQUFLLElBQUksVUFBVSxFQUFFLENBQUM7UUFDL0IsTUFBTSxPQUFPLEdBQUcsOEJBQThCLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7UUFDN0UsbUVBQW1FO1FBQ25FLGlFQUFpRTtRQUNqRSxpQ0FBaUM7UUFDakMsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7WUFDL0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO1lBQ3ZCLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO1FBRWpDLElBQUksQ0FBQyxHQUFHO1lBQUUsU0FBUTtRQUVsQixLQUFLLE1BQU0sQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RELElBQUksVUFBVSxLQUFLLFdBQVc7Z0JBQUUsU0FBUTtZQUV4QyxLQUFLLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUN4QyxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtpc1BsYWluT2JqZWN0fSBmcm9tIFwiaXMtcGxhaW4tb2JqZWN0XCJcblxuLyoqXG4gKiBRdWVyeURhdGFFbnRyeSB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gUXVlcnlEYXRhRW50cnlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGNoYWluIC0gUmVsYXRpb25zaGlwIGNoYWluIGZyb20gdGhlIHJvb3QgbW9kZWwgdG8gdGhlIG1vZGVsIHRoYXQgZGVjbGFyZXMgdGhlIGZuLiBFbXB0eSBmb3IgYSByb290LWxldmVsIGVudHJ5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZuTmFtZSAtIElkZW50aWZpZXIgdW5kZXIgd2hpY2ggdGhlIGZuIGlzIHJlZ2lzdGVyZWQgb24gdGhlIGRlY2xhcmluZyBtb2RlbC5cbiAqL1xuXG4vKipcbiAqIERlZmluZXMgdGhpcyB0eXBlZGVmLlxuICogQHR5cGVkZWYge3N0cmluZyB8IEFycmF5PHN0cmluZyB8IFJlY29yZDxzdHJpbmcsID8+PiB8IHtba2V5OiBzdHJpbmddOiB0cnVlIHwgZmFsc2UgfCBzdHJpbmcgfCBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsID8+fX0gUXVlcnlEYXRhU3BlY1xuICovXG5cbi8qKlxuICogUXVlcnlEYXRhQ2FsbGJhY2tBcmdzIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBRdWVyeURhdGFDYWxsYmFja0FyZ3NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lIC0gTmFtZSB1bmRlciB3aGljaCB0aGUgZm4gd2FzIHJlZ2lzdGVyZWQuIENvbnZlbmllbnQgd2hlbiBhIGZuIGlzIHJldXNlZCBhY3Jvc3MgYWxpYXNlcy5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGRyaXZlciAtIEFjdGl2ZSBkYXRhYmFzZSBkcml2ZXIsIGZvciBxdW90aW5nIGhlbHBlcnMgYW5kIHR5cGUtc3BlY2lmaWMgU1FMLlxuICogQHByb3BlcnR5IHt0eXBlb2YgaW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcyB0aGUgZm4gaXMgcmVnaXN0ZXJlZCBvbiAodGhlIGNoYWluJ3MgdGFyZ2V0KS5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8c3RyaW5nIHwgbnVtYmVyPn0gcGFyZW50SWRzIC0gUHJpbWFyeS1rZXkgdmFsdWVzIG9mIHRoZSBsb2FkZWQgcm9vdCByZWNvcmRzLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IHF1ZXJ5IC0gR3JvdXBlZCBxdWVyeSBhbHJlYWR5IGpvaW5lZCBkb3duIHRoZSBjaGFpbiwgZmlsdGVyZWQgYnkgYHBhcmVudElkc2AsIHdpdGggYHBhcmVudF9pZGAgcHJlLXNlbGVjdGVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRhYmxlTmFtZSAtIFVucXVvdGVkIHRhYmxlIHJlZmVyZW5jZSAoYWxpYXMgb3IgdGFibGUgbmFtZSkgZm9yIHRoZSBjaGFpbidzIHRhcmdldCwgcmVhZHkgdG8gcGFzdGUgaW50byBTUUwuXG4gKi9cblxuLyoqXG4gKiBRdWVyeURhdGFGbiB0eXBlLlxuICogQHR5cGVkZWYgeyhhcmdzOiBRdWVyeURhdGFDYWxsYmFja0FyZ3MpID0+IHZvaWQgfCBpbXBvcnQoXCIuL21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IFF1ZXJ5RGF0YUZuXG4gKi9cblxuLyoqXG4gKiBOb3JtYWxpemUgYSB1c2VyLXN1cHBsaWVkIHF1ZXJ5RGF0YSBzcGVjIGludG8gYSBmbGF0IGxpc3Qgb2YgZW50cmllc1xuICogdGhlIHJ1bm5lciBjYW4gY29uc3VtZS4gVGhlIHNwZWMgbWlycm9ycyB0aGUgc2hhcGUgb2YgYHByZWxvYWRgLCB3aXRoXG4gKiB0aGUgaW1wb3J0YW50IGRpc3RpbmN0aW9uIHRoYXQgKipsZWFmIHN0cmluZ3MgYXJlIGZuIG5hbWVzKiosIG5vdFxuICogZnVydGhlciByZWxhdGlvbnNoaXAgc2VnbWVudHMuIE5lc3RlZCBrZXlzIGFyZSByZWxhdGlvbnNoaXAgbmFtZXNcbiAqIGFsb25nIHRoZSBqb2luIGNoYWluIGZyb20gdGhlIHJvb3QgbW9kZWwgdG8gdGhlIGRlY2xhcmluZyBtb2RlbC5cbiAqXG4gKiBBY2NlcHRlZCBzaGFwZXMgKGFsbCB5aWVsZCB0aGUgc2FtZSBmbGF0IGVudHJpZXMpOlxuICogICBcImZvb1wiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDihpIgW3tjaGFpbjogW10sIGZuTmFtZTogXCJmb29cIn1dXG4gKiAgIFtcImZvb1wiLCBcImJhclwiXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4oaSIFt7Y2hhaW46IFtdLCBmbk5hbWU6IFwiZm9vXCJ9LCB7Y2hhaW46IFtdLCBmbk5hbWU6IFwiYmFyXCJ9XVxuICogICB7Zm9vOiB0cnVlfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4oaSIFt7Y2hhaW46IFtdLCBmbk5hbWU6IFwiZm9vXCJ9XVxuICogICB7cHJvamVjdHM6IFtcInRhc2tzQ291bnRcIl19ICAgICAgICAgICAgICAgICDihpIgW3tjaGFpbjogW1wicHJvamVjdHNcIl0sIGZuTmFtZTogXCJ0YXNrc0NvdW50XCJ9XVxuICogICB7cHJvamVjdHM6IHt0YXNrczogW1widHJhbnNwb3J0U2Vjb25kc1N1bVwiLCB7dGltZWxvZ3M6IFtcInRpbWVTZWNvbmRzU3VtXCJdfV19fVxuICogICAgIOKGkiBbe2NoYWluOiBbXCJwcm9qZWN0c1wiLFwidGFza3NcIl0sIGZuTmFtZTogXCJ0cmFuc3BvcnRTZWNvbmRzU3VtXCJ9LFxuICogICAgICAgIHtjaGFpbjogW1wicHJvamVjdHNcIixcInRhc2tzXCIsXCJ0aW1lbG9nc1wiXSwgZm5OYW1lOiBcInRpbWVTZWNvbmRzU3VtXCJ9XVxuICogQHBhcmFtIHtRdWVyeURhdGFTcGVjfSBzcGVjIC0gVXNlci1zdXBwbGllZCBzcGVjLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gW2NoYWluXSAtIEN1cnJlbnQgY2hhaW4gKGludGVybmFsIHJlY3Vyc2lvbikuXG4gKiBAcmV0dXJucyB7UXVlcnlEYXRhRW50cnlbXX0gLSBGbGF0IGxpc3Qgb2YgZW50cmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVF1ZXJ5RGF0YVNwZWMoc3BlYywgY2hhaW4gPSBbXSkge1xuICBpZiAoc3BlYyA9PSBudWxsKSByZXR1cm4gW11cblxuICBpZiAodHlwZW9mIHNwZWMgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gW3tjaGFpbjogWy4uLmNoYWluXSwgZm5OYW1lOiBzcGVjfV1cbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHNwZWMpKSB7XG4gICAgLyoqXG4gICAgICogRW50cmllcy5cbiAgICAgKiBAdHlwZSB7UXVlcnlEYXRhRW50cnlbXX0gKi9cbiAgICBjb25zdCBlbnRyaWVzID0gW11cblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBzcGVjKSB7XG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgZW50cmllcy5wdXNoKHtjaGFpbjogWy4uLmNoYWluXSwgZm5OYW1lOiBpdGVtfSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGlzUGxhaW5PYmplY3QoaXRlbSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBuZXN0ZWQgb2Ygbm9ybWFsaXplUXVlcnlEYXRhU3BlYygvKiogQHR5cGUgez99ICovIChpdGVtKSwgY2hhaW4pKSB7XG4gICAgICAgICAgZW50cmllcy5wdXNoKG5lc3RlZClcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcXVlcnlEYXRhIGFycmF5IGVudHJ5OiAke3R5cGVvZiBpdGVtfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGVudHJpZXNcbiAgfVxuXG4gIGlmIChpc1BsYWluT2JqZWN0KHNwZWMpKSB7XG4gICAgLyoqXG4gICAgICogRW50cmllcy5cbiAgICAgKiBAdHlwZSB7UXVlcnlEYXRhRW50cnlbXX0gKi9cbiAgICBjb25zdCBlbnRyaWVzID0gW11cblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNwZWMpKSB7XG4gICAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgZW50cmllcy5wdXNoKHtjaGFpbjogWy4uLmNoYWluXSwgZm5OYW1lOiBrZXl9KVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUgPT09IGZhbHNlKSBjb250aW51ZVxuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpIHx8IGlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgICAgIGZvciAoY29uc3QgbmVzdGVkIG9mIG5vcm1hbGl6ZVF1ZXJ5RGF0YVNwZWMoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpLCBbLi4uY2hhaW4sIGtleV0pKSB7XG4gICAgICAgICAgZW50cmllcy5wdXNoKG5lc3RlZClcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcXVlcnlEYXRhIHZhbHVlIGZvciBcIiR7a2V5fVwiOiAke3R5cGVvZiB2YWx1ZX1gKVxuICAgIH1cblxuICAgIHJldHVybiBlbnRyaWVzXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcXVlcnlEYXRhIHNwZWM6ICR7dHlwZW9mIHNwZWN9YClcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgbmVzdGVkIGBqb2lucyguLi4pYCBkZXNjcmlwdG9yIGZvciBhIGNoYWluIG9mIHJlbGF0aW9uc2hpcCBuYW1lcy5cbiAqIGBbXCJwcm9qZWN0c1wiLCBcInRhc2tzXCJdYCDihpIgYHtwcm9qZWN0czoge3Rhc2tzOiB0cnVlfX1gLiBVc2VkIGludGVybmFsbHkgc29cbiAqIHRoZSBydW5uZXIgY2FuIHJldXNlIHRoZSBleGlzdGluZyBgam9pbnNgIHBhdGgtcmVnaXN0cmF0aW9uIG1hY2hpbmVyeVxuICogKEpvaW5UcmFja2VyLCBhbGlhcyBnZW5lcmF0aW9uLCBzY29wZSBhcHBsaWNhdGlvbikuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBjaGFpbiAtIFJlbGF0aW9uc2hpcCBjaGFpbi5cbiAqIEByZXR1cm5zIHt0cnVlIHwgUmVjb3JkPHN0cmluZywgPz59IC0gTmVzdGVkIGpvaW4gZGVzY3JpcHRvciwgb3IgYHRydWVgIHdoZW4gdGhlIGNoYWluIGlzIGVtcHR5LlxuICovXG5mdW5jdGlvbiBidWlsZE5lc3RlZEpvaW5EZXNjcmlwdG9yKGNoYWluKSB7XG4gIGlmIChjaGFpbi5sZW5ndGggPT09IDApIHJldHVybiB0cnVlXG5cbiAgLyoqXG4gICAqIE9iai5cbiAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqL1xuICBjb25zdCBvYmogPSB7fVxuICBsZXQgY3Vyc29yID0gb2JqXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFpbi5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IHNlZyA9IGNoYWluW2ldXG4gICAgY29uc3QgaXNMYXN0ID0gaSA9PT0gY2hhaW4ubGVuZ3RoIC0gMVxuXG4gICAgY3Vyc29yW3NlZ10gPSBpc0xhc3QgPyB0cnVlIDoge31cblxuICAgIGlmICghaXNMYXN0KSBjdXJzb3IgPSBjdXJzb3Jbc2VnXVxuICB9XG5cbiAgcmV0dXJuIG9ialxufVxuXG4vKipcbiAqIFdhbGsgYSByZWxhdGlvbnNoaXAgY2hhaW4gZnJvbSB0aGUgcm9vdCBtb2RlbCBhbmQgcmV0dXJuIHRoZSBtb2RlbFxuICogY2xhc3MgYXQgaXRzIHRhaWwuIFRocm93cyB3aXRoIGEgY2xlYXIgbWVzc2FnZSB3aGVuIGFueSBzZWdtZW50IGlzXG4gKiB1bmtub3duLlxuICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IHJvb3RNb2RlbENsYXNzIC0gUm9vdCBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nW119IGNoYWluIC0gUmVsYXRpb25zaGlwIGNoYWluLlxuICogQHJldHVybnMge3R5cGVvZiBpbXBvcnQoXCIuLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gLSBUYXJnZXQgbW9kZWwgY2xhc3MuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVUYXJnZXRNb2RlbENsYXNzKHJvb3RNb2RlbENsYXNzLCBjaGFpbikge1xuICBsZXQgbW9kZWxDbGFzcyA9IHJvb3RNb2RlbENsYXNzXG5cbiAgZm9yIChjb25zdCBzZWdtZW50IG9mIGNoYWluKSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwID0gbW9kZWxDbGFzcy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUoc2VnbWVudClcbiAgICBjb25zdCB0YXJnZXQgPSByZWxhdGlvbnNoaXAuZ2V0VGFyZ2V0TW9kZWxDbGFzcygpXG5cbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBxdWVyeURhdGE6IGNvdWxkIG5vdCByZXNvbHZlIHRhcmdldCBtb2RlbCBmb3IgJHttb2RlbENsYXNzLm5hbWV9IyR7c2VnbWVudH1gKVxuICAgIH1cblxuICAgIG1vZGVsQ2xhc3MgPSB0YXJnZXRcbiAgfVxuXG4gIHJldHVybiBtb2RlbENsYXNzXG59XG5cbi8qKlxuICogUnVuIGV2ZXJ5IHF1ZXJ5RGF0YSBlbnRyeSBhZ2FpbnN0IHRoZSBsb2FkZWQgcm9vdCByZWNvcmRzLCBhdHRhY2hpbmdcbiAqIHRoZSByZXN1bHRpbmcgdmFsdWVzIGFzIHF1ZXJ5RGF0YSBlbnRyaWVzIG9uIGVhY2ggcm9vdCByZWNvcmQuXG4gKlxuICogT25lIGdyb3VwZWQgcXVlcnkgcGVyIGVudHJ5OiB0aGUgcnVubmVyIGJ1aWxkcyBhIGZyZXNoIHF1ZXJ5IG92ZXIgdGhlXG4gKiByb290IG1vZGVsLCBqb2lucyBkb3duIHRoZSBjaGFpbiwgZ3JvdXBzIGJ5IHRoZSByb290IHRhYmxlJ3MgcHJpbWFyeVxuICoga2V5LCBhbmQgaW52b2tlcyB0aGUgcmVnaXN0ZXJlZCBmbiB0byBhZGQgaXRzIG93biBTRUxFQ1QgKGFuZCBhbnlcbiAqIGFkZGl0aW9uYWwgam9pbnMvd2hlcmUpLiBSZXN1bHRzIGFyZSBtYXBwZWQgYmFjayB0byByb290IG1vZGVscyBieVxuICogcHJpbWFyeSBrZXkgYW5kIGF0dGFjaGVkIHZpYSBgX3NldFF1ZXJ5RGF0YShuYW1lLCB2YWx1ZSlgIGZvciBldmVyeVxuICogc2VsZWN0ZWQgYWxpYXMgKGV4Y2VwdCB0aGUgcmVzZXJ2ZWQgYHBhcmVudF9pZGApLiBSb3dzIG1pc3NpbmcgZnJvbVxuICogdGhlIHJlc3VsdCBrZWVwIGBudWxsYCDigJQgbWF0Y2hlcyB0aGUgZmVhdHVyZSdzIGRvY3VtZW50ZWQgZGVmYXVsdC5cbiAqXG4gKiBNaXJyb3JzIHRoZSBzaGFwZSBvZiBgcnVuV2l0aENvdW50YDogb25lIHF1ZXJ5IHBlciBlbnRyeSwgYSBzZXBhcmF0ZVxuICogc3RvcmFnZSBtYXAgb24gdGhlIHJlY29yZCwgbmV2ZXIgdG91Y2hlcyBgX2F0dHJpYnV0ZXNgLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3Mucm9vdE1vZGVsQ2xhc3MgLSBSb290IG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdFtdfSBhcmdzLnJvb3RNb2RlbHMgLSBMb2FkZWQgcm9vdCByZWNvcmRzLlxuICogQHBhcmFtIHtRdWVyeURhdGFFbnRyeVtdfSBhcmdzLmVudHJpZXMgLSBOb3JtYWxpemVkIHF1ZXJ5RGF0YSBlbnRyaWVzLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5RdWVyeURhdGEoe3Jvb3RNb2RlbENsYXNzLCByb290TW9kZWxzLCBlbnRyaWVzfSkge1xuICBpZiAocm9vdE1vZGVscy5sZW5ndGggPT09IDAgfHwgZW50cmllcy5sZW5ndGggPT09IDApIHJldHVyblxuXG4gIGNvbnN0IHByaW1hcnlLZXkgPSByb290TW9kZWxDbGFzcy5wcmltYXJ5S2V5KClcbiAgY29uc3Qgcm9vdElkcyA9IHJvb3RNb2RlbHMubWFwKChtb2RlbCkgPT4gLyoqIEB0eXBlIHtzdHJpbmcgfCBudW1iZXJ9ICovIChtb2RlbC5yZWFkQ29sdW1uKHByaW1hcnlLZXkpKSlcbiAgY29uc3QgcHJlcGFyZWRFbnRyaWVzID0gZW50cmllcy5tYXAoKGVudHJ5LCBlbnRyeUluZGV4KSA9PiBwcmVwYXJlRW50cnkoe2VudHJ5LCBlbnRyeUluZGV4LCBwcmltYXJ5S2V5LCByb290SWRzLCByb290TW9kZWxDbGFzc30pKVxuICAvKipcbiAgICogQ29tcGF0aWJsZSBxdWVyeSBncm91cHMuXG4gICAqIEB0eXBlIHtBcnJheTx7YWxpYXNlczogU2V0PHN0cmluZz4sIHF1ZXJ5OiBpbXBvcnQoXCIuL21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHQsIHNpZ25hdHVyZTogc3RyaW5nfT59ICovXG4gIGNvbnN0IHF1ZXJ5R3JvdXBzID0gW11cblxuICBmb3IgKGNvbnN0IHByZXBhcmVkRW50cnkgb2YgcHJlcGFyZWRFbnRyaWVzKSB7XG4gICAgY29uc3QgY29tcGF0aWJsZUdyb3VwID0gcXVlcnlHcm91cHMuZmluZCgoZ3JvdXAsIGdyb3VwSW5kZXgpID0+IHtcbiAgICAgIGlmIChncm91cC5zaWduYXR1cmUgIT09IHByZXBhcmVkRW50cnkuc2lnbmF0dXJlKSByZXR1cm4gZmFsc2VcbiAgICAgIGlmIChxdWVyeUdyb3Vwcy5zbGljZShncm91cEluZGV4ICsgMSkuc29tZSgoaW50ZXJ2ZW5pbmdHcm91cCkgPT4gKFxuICAgICAgICBwcmVwYXJlZEVudHJ5LmFsaWFzZXMuc29tZSgoYWxpYXMpID0+IGludGVydmVuaW5nR3JvdXAuYWxpYXNlcy5oYXMoYWxpYXMpKVxuICAgICAgKSkpIHJldHVybiBmYWxzZVxuXG4gICAgICByZXR1cm4gcHJlcGFyZWRFbnRyeS5hbGlhc2VzLmV2ZXJ5KChhbGlhcykgPT4gIWdyb3VwLmFsaWFzZXMuaGFzKGFsaWFzKSlcbiAgICB9KVxuXG4gICAgaWYgKGNvbXBhdGlibGVHcm91cCkge1xuICAgICAgY29tcGF0aWJsZUdyb3VwLnF1ZXJ5LnNlbGVjdChwcmVwYXJlZEVudHJ5LnF1ZXJ5LmdldFNlbGVjdHMoKS5zbGljZSgxKSlcbiAgICAgIGZvciAoY29uc3QgYWxpYXMgb2YgcHJlcGFyZWRFbnRyeS5hbGlhc2VzKSBjb21wYXRpYmxlR3JvdXAuYWxpYXNlcy5hZGQoYWxpYXMpXG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5R3JvdXBzLnB1c2goe1xuICAgICAgICBhbGlhc2VzOiBuZXcgU2V0KHByZXBhcmVkRW50cnkuYWxpYXNlcyksXG4gICAgICAgIHF1ZXJ5OiBwcmVwYXJlZEVudHJ5LnF1ZXJ5LFxuICAgICAgICBzaWduYXR1cmU6IHByZXBhcmVkRW50cnkuc2lnbmF0dXJlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qge3F1ZXJ5fSBvZiBxdWVyeUdyb3Vwcykge1xuICAgIGF3YWl0IGV4ZWN1dGVFbnRyeVF1ZXJ5KHtwcmltYXJ5S2V5LCBxdWVyeSwgcm9vdE1vZGVsc30pXG4gIH1cbn1cblxuLyoqXG4gKiBQcmVwYXJlcyBvbmUgcXVlcnlEYXRhIGVudHJ5IGFuZCBpdHMgY29tcGF0aWJpbGl0eSBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7UXVlcnlEYXRhRW50cnl9IGFyZ3MuZW50cnkgLSBFbnRyeSBiZWluZyBldmFsdWF0ZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gYXJncy5lbnRyeUluZGV4IC0gU3RhYmxlIHBvc2l0aW9uIHVzZWQgdG8gaXNvbGF0ZSBvcGFxdWUgcHJvamVjdGlvbnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5wcmltYXJ5S2V5IC0gUm9vdCBtb2RlbCBwcmltYXJ5IGtleSBjb2x1bW4uXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZyB8IG51bWJlcj59IGFyZ3Mucm9vdElkcyAtIFJvb3QgcHJpbWFyeS1rZXkgdmFsdWVzLlxuICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3Mucm9vdE1vZGVsQ2xhc3MgLSBSb290IG1vZGVsIGNsYXNzLlxuICogQHJldHVybnMge3thbGlhc2VzOiBzdHJpbmdbXSwgcXVlcnk6IGltcG9ydChcIi4vbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdCwgc2lnbmF0dXJlOiBzdHJpbmd9fSAtIFByZXBhcmVkIGVudHJ5LlxuICovXG5mdW5jdGlvbiBwcmVwYXJlRW50cnkoe2VudHJ5LCBlbnRyeUluZGV4LCBwcmltYXJ5S2V5LCByb290SWRzLCByb290TW9kZWxDbGFzc30pIHtcbiAgY29uc3QgdGFyZ2V0TW9kZWxDbGFzcyA9IHJlc29sdmVUYXJnZXRNb2RlbENsYXNzKHJvb3RNb2RlbENsYXNzLCBlbnRyeS5jaGFpbilcbiAgY29uc3QgZm4gPSB0YXJnZXRNb2RlbENsYXNzLmdldFF1ZXJ5RGF0YUJ5TmFtZShlbnRyeS5mbk5hbWUpXG5cbiAgaWYgKCFmbikge1xuICAgIHRocm93IG5ldyBFcnJvcihgcXVlcnlEYXRhOiAke3RhcmdldE1vZGVsQ2xhc3MubmFtZX0gaGFzIG5vIGVudHJ5IHJlZ2lzdGVyZWQgYXMgJHtKU09OLnN0cmluZ2lmeShlbnRyeS5mbk5hbWUpfS4gYCArXG4gICAgICBgRGVjbGFyZSBpdCB3aXRoICR7dGFyZ2V0TW9kZWxDbGFzcy5uYW1lfS5xdWVyeURhdGEoJHtKU09OLnN0cmluZ2lmeShlbnRyeS5mbk5hbWUpfSwgKHtxdWVyeSwgdGFibGVOYW1lfSkgPT4gcXVlcnkuc2VsZWN0KC4uLikpYClcbiAgfVxuXG4gIGNvbnN0IHF1ZXJ5ID0gcm9vdE1vZGVsQ2xhc3MuX25ld1F1ZXJ5KClcblxuICAvLyBFbXB0eSBvdXQgYW55IGRlZmF1bHRzIHRoZSBxdWVyeSBmYWN0b3J5IGFkZGVkIOKAlCBxdWVyeURhdGEgcnVuc1xuICAvLyBhIGJhcmUgYWdncmVnYXRlLCBub3QgYSBmdWxsIG1vZGVsIGxvYWQuXG4gIHF1ZXJ5LnJlc2VsZWN0KClcbiAgcXVlcnkuX3ByZWxvYWQgPSB7fVxuXG4gIC8vIEZvcmNlIHRoZSByb290IFdIRVJFIHRvIHF1YWxpZnkgYnkgdGFibGUgbmFtZSBzbyBpdCBzdXJ2aXZlcyB0aGVcbiAgLy8gam9pbnMgdGhlIGZuIG1heSBhZGQgbGF0ZXIgKG90aGVyd2lzZSBhIGNoaWxkIHRhYmxlIHNoYXJpbmcgdGhlXG4gIC8vIHJvb3QgUEsgY29sdW1uIG5hbWUsIGUuZy4gYGlkYCwgbWFrZXMgdGhlIGNsYXVzZSBhbWJpZ3VvdXMpLlxuICBxdWVyeS5fZm9yY2VRdWFsaWZ5QmFzZVRhYmxlID0gdHJ1ZVxuXG4gIGNvbnN0IGRyaXZlciA9IHF1ZXJ5LmRyaXZlclxuICBjb25zdCByb290VGFibGUgPSByb290TW9kZWxDbGFzcy50YWJsZU5hbWUoKVxuICBjb25zdCByb290UGtTcWwgPSBgJHtkcml2ZXIucXVvdGVUYWJsZShyb290VGFibGUpfS4ke2RyaXZlci5xdW90ZUNvbHVtbihwcmltYXJ5S2V5KX1gXG5cbiAgLyoqXG4gICAqIFJvb3Qgd2hlcmUuXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi9cbiAgY29uc3Qgcm9vdFdoZXJlID0ge31cbiAgcm9vdFdoZXJlW3ByaW1hcnlLZXldID0gcm9vdElkc1xuICBxdWVyeS53aGVyZShyb290V2hlcmUpXG5cbiAgY29uc3Qgam9pbkRlc2NyaXB0b3IgPSBidWlsZE5lc3RlZEpvaW5EZXNjcmlwdG9yKGVudHJ5LmNoYWluKVxuXG4gIGlmIChqb2luRGVzY3JpcHRvciAhPT0gdHJ1ZSkge1xuICAgIHF1ZXJ5LmpvaW5zKGpvaW5EZXNjcmlwdG9yKVxuICB9XG5cbiAgcXVlcnkuZ3JvdXAocm9vdFBrU3FsKVxuICBxdWVyeS5zZWxlY3QoYCR7cm9vdFBrU3FsfSBBUyBwYXJlbnRfaWRgKVxuXG4gIGNvbnN0IHRhcmdldFRhYmxlUmVmID0gZW50cnkuY2hhaW4ubGVuZ3RoID09PSAwXG4gICAgPyByb290VGFibGVcbiAgICA6IHF1ZXJ5LmdldFRhYmxlUmVmZXJlbmNlRm9ySm9pbiguLi5lbnRyeS5jaGFpbilcblxuICAvLyBOQjogd2UgaW50ZW50aW9uYWxseSBsZWF2ZSBgX2pvaW5CYXNlUGF0aGAgYXQgW10gc28gdGhlIG91dGVyIGNoYWluXG4gIC8vIGpvaW5zIGNvbnRpbnVlIHRvIHJlc29sdmUgZnJvbSB0aGUgcm9vdCBtb2RlbCBhdCByZW5kZXIgdGltZS4gVGhlXG4gIC8vIGZuIGdldHMgYHRhYmxlTmFtZWAgZm9yIHNlbGYtcmVmZXJlbmNlOyBhZGRpdGlvbmFsIGpvaW5zIGZyb21cbiAgLy8gbmVzdGVkIGxldmVscyBzaG91bGQgdXNlIGZ1bGwgcGF0aHMgZnJvbSB0aGUgcm9vdC5cbiAgZm4oe1xuICAgIGF0dHJpYnV0ZU5hbWU6IGVudHJ5LmZuTmFtZSxcbiAgICBkcml2ZXIsXG4gICAgbW9kZWxDbGFzczogdGFyZ2V0TW9kZWxDbGFzcyxcbiAgICBwYXJlbnRJZHM6IHJvb3RJZHMsXG4gICAgcXVlcnksXG4gICAgdGFibGVOYW1lOiB0YXJnZXRUYWJsZVJlZlxuICB9KVxuXG4gIGNvbnN0IGFsaWFzZXMgPSBzZWxlY3RlZEFsaWFzZXMocXVlcnkpXG4gIGNvbnN0IHNpZ25hdHVyZVF1ZXJ5ID0gcXVlcnkuY2xvbmUoKVxuICBzaWduYXR1cmVRdWVyeS5yZXNlbGVjdChzaWduYXR1cmVRdWVyeS5nZXRTZWxlY3RzKCkuc2xpY2UoMCwgMSkpXG5cbiAgcmV0dXJuIHtcbiAgICBhbGlhc2VzOiBhbGlhc2VzIHx8IFtdLFxuICAgIHF1ZXJ5LFxuICAgIHNpZ25hdHVyZTogYWxpYXNlcyA/IHNpZ25hdHVyZVF1ZXJ5LnRvU3FsKCkgOiBgb3BhcXVlOiR7ZW50cnlJbmRleH1gXG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGV4cGxpY2l0IGFsaWFzZXMgc2VsZWN0ZWQgYWZ0ZXIgdGhlIHJlc2VydmVkIHBhcmVudCBpZC5cbiAqIEVudHJpZXMgd2l0aCBhbiBvcGFxdWUgc2VsZWN0IHN0YXkgaXNvbGF0ZWQgYnkgcmVjZWl2aW5nIGEgdW5pcXVlIGNvbXBhdGliaWxpdHkgYWxpYXMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0gcXVlcnkgLSBQcmVwYXJlZCBxdWVyeURhdGEgcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nW10gfCBudWxsfSAtIFNlbGVjdGVkIGFsaWFzZXMsIG9yIG51bGwgZm9yIGFuIG9wYXF1ZSBwcm9qZWN0aW9uLlxuICovXG5mdW5jdGlvbiBzZWxlY3RlZEFsaWFzZXMocXVlcnkpIHtcbiAgY29uc3QgYWxpYXNlcyA9IFtdXG5cbiAgZm9yIChjb25zdCBzZWxlY3Qgb2YgcXVlcnkuZ2V0U2VsZWN0cygpLnNsaWNlKDEpKSB7XG4gICAgY29uc3Qgc3FsID0gc2VsZWN0LnRvU3FsKClcbiAgICBjb25zdCBtYXRjaCA9IHNxbC5tYXRjaCgvXFxzQVNcXHMrKFteXFxzXSspXFxzKiQvaXUpXG5cbiAgICBpZiAoIW1hdGNoKSByZXR1cm4gbnVsbFxuXG4gICAgYWxpYXNlcy5wdXNoKG1hdGNoWzFdLnJlcGxhY2UoL15bXCJbYF18W1wiYFxcXV0kL2d1LCBcIlwiKSlcbiAgfVxuXG4gIHJldHVybiBhbGlhc2VzXG59XG5cbi8qKlxuICogRXhlY3V0ZXMgb25lIGNvbXBhdGlibGUgcXVlcnlEYXRhIGdyb3VwIGFuZCBhdHRhY2hlcyBldmVyeSBzZWxlY3RlZCBhbGlhcy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnByaW1hcnlLZXkgLSBSb290IG1vZGVsIHByaW1hcnkga2V5IGNvbHVtbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0fSBhcmdzLnF1ZXJ5IC0gUHJlcGFyZWQgZ3JvdXBlZCBxdWVyeS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHRbXX0gYXJncy5yb290TW9kZWxzIC0gTG9hZGVkIHJvb3QgcmVjb3Jkcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlRW50cnlRdWVyeSh7cHJpbWFyeUtleSwgcXVlcnksIHJvb3RNb2RlbHN9KSB7XG4gIGNvbnN0IHJvd3MgPSAvKiogQHR5cGUge0FycmF5PFJlY29yZDxzdHJpbmcsID8+Pn0gKi8gKGF3YWl0IHF1ZXJ5Ll9leGVjdXRlUXVlcnkoKSlcbiAgY29uc3QgYnlQYXJlbnQgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgY29uc3QgcGFyZW50SWQgPSByb3cucGFyZW50X2lkXG5cbiAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgY29udGludWVcblxuICAgIGJ5UGFyZW50LnNldChwYXJlbnRJZCwgcm93KVxuICB9XG5cbiAgZm9yIChjb25zdCBtb2RlbCBvZiByb290TW9kZWxzKSB7XG4gICAgY29uc3QgbW9kZWxJZCA9IC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVtYmVyfSAqLyAobW9kZWwucmVhZENvbHVtbihwcmltYXJ5S2V5KSlcbiAgICAvLyBEcml2ZXItdHlwZSB0b2xlcmFuY2U6IE15U1FMIGNhbiByZXR1cm4gUEtzIGFzIHN0cmluZ3MgZXZlbiB3aGVuXG4gICAgLy8gdGhlIGNvbHVtbiBpcyBudW1lcmljLiBGYWxsIGJhY2sgdG8gYSBzdHJpbmcgbG9va3VwIHNvIHJlc3VsdHNcbiAgICAvLyBzdGlsbCBsYW5kIG9uIHRoZSByaWdodCBtb2RlbC5cbiAgICBjb25zdCByb3cgPSBieVBhcmVudC5oYXMobW9kZWxJZClcbiAgICAgID8gYnlQYXJlbnQuZ2V0KG1vZGVsSWQpXG4gICAgICA6IGJ5UGFyZW50LmdldChTdHJpbmcobW9kZWxJZCkpXG5cbiAgICBpZiAoIXJvdykgY29udGludWVcblxuICAgIGZvciAoY29uc3QgW2NvbHVtbk5hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyb3cpKSB7XG4gICAgICBpZiAoY29sdW1uTmFtZSA9PT0gXCJwYXJlbnRfaWRcIikgY29udGludWVcblxuICAgICAgbW9kZWwuX3NldFF1ZXJ5RGF0YShjb2x1bW5OYW1lLCB2YWx1ZSlcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"version":3,"file":"with-count.d.ts","sourceRoot":"","sources":["../../../../src/database/query/with-count.js"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH;;;GAGG;AAEH;;;;;;;;;;;;;GAaG;AACH,yCAHW,aAAa,GACX,cAAc,EAAE,CAuD5B;AAeD;;;;;;;;;;GAUG;AACH,8DALG;IAAqD,MAAM,EAAnD,OAAO,oBAAoB,EAAE,OAAO,EAAE;IACY,UAAU,EAA5D,cAAc,oBAAoB,EAAE,OAAO;IACpB,OAAO,EAA9B,cAAc,EAAE;CACxB,GAAU,OAAO,CAAC,IAAI,CAAC,CA2BzB;;;;;;;;mBAhIa,MAAM;;;;sBACN,MAAM;;;;WACN,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,GAAG,SAAS;;;;;4BAK9B,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAA;CAAC,CAAC"}
1
+ {"version":3,"file":"with-count.d.ts","sourceRoot":"","sources":["../../../../src/database/query/with-count.js"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH;;;GAGG;AAEH;;;;;;;;;;;;;GAaG;AACH,yCAHW,aAAa,GACX,cAAc,EAAE,CAuD5B;AAeD;;;;;;;;;;GAUG;AACH,8DALG;IAAqD,MAAM,EAAnD,OAAO,oBAAoB,EAAE,OAAO,EAAE;IACY,UAAU,EAA5D,cAAc,oBAAoB,EAAE,OAAO;IACpB,OAAO,EAA9B,cAAc,EAAE;CACxB,GAAU,OAAO,CAAC,IAAI,CAAC,CA0BzB;;;;;;;;mBA/Ha,MAAM;;;;sBACN,MAAM;;;;WACN,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,GAAG,SAAS;;;;;4BAK9B,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAA;CAAC,CAAC"}
@@ -97,35 +97,33 @@ export async function runWithCount({ models, modelClass, entries }) {
97
97
  return;
98
98
  const primaryKey = modelClass.primaryKey();
99
99
  const parentIds = models.map((model) => /** @type {string | number} */ (model.readColumn(primaryKey)));
100
+ const queryGroups = new Map();
100
101
  for (const entry of entries) {
101
- const counts = await countForEntry({ entries, entry, modelClass, parentIds });
102
- for (const model of models) {
103
- const modelPrimaryKeyValue = /** @type {string | number} */ (model.readColumn(primaryKey));
104
- // Tolerate driver differences in numeric return types: SQLite
105
- // returns integers as JS numbers, but MySQL's raw driver can
106
- // return count primary keys as strings. Try both.
107
- const resolvedCount = counts.has(modelPrimaryKeyValue)
108
- ? /** @type {number} */ (counts.get(modelPrimaryKeyValue))
109
- : Number(counts.get(String(modelPrimaryKeyValue)) ?? 0);
110
- // Counts go on the record's dedicated association-count map,
111
- // NOT on `_attributes`, so a virtual `tasksCount` can't shadow a
112
- // real `tasks_count` column (e.g. a counter_cache) nor leak into
113
- // attribute-level serialization / change tracking.
114
- model._setAssociationCount(entry.attributeName, resolvedCount);
102
+ const countQuery = queryForEntry({ entry, modelClass, parentIds });
103
+ const sql = countQuery.toSql();
104
+ const existingGroup = queryGroups.get(sql);
105
+ if (existingGroup) {
106
+ existingGroup.entries.push(entry);
115
107
  }
108
+ else {
109
+ queryGroups.set(sql, { countQuery, entries: [entry] });
110
+ }
111
+ }
112
+ for (const { countQuery, entries: groupedEntries } of queryGroups.values()) {
113
+ const counts = await executeCountQuery(countQuery);
114
+ for (const entry of groupedEntries)
115
+ attachCounts({ counts, entry, models, primaryKey });
116
116
  }
117
117
  }
118
118
  /**
119
- * Runs count for entry.
119
+ * Builds the grouped count query for an entry.
120
120
  * @param {object} args - Options.
121
- * @param {WithCountEntry[]} args.entries - All entries, used for error context only.
122
121
  * @param {WithCountEntry} args.entry - Entry being evaluated.
123
122
  * @param {typeof import("../record/index.js").default} args.modelClass - Parent model class.
124
123
  * @param {Array<string | number>} args.parentIds - Primary keys of the loaded parents.
125
- * @returns {Promise<Map<string | number, number>>} - Map of parent pk → count.
124
+ * @returns {import("./model-class-query.js").default} - Prepared count query.
126
125
  */
127
- async function countForEntry({ entries, entry, modelClass, parentIds }) {
128
- void entries;
126
+ function queryForEntry({ entry, modelClass, parentIds }) {
129
127
  const relationship = modelClass.getRelationshipByName(entry.relationshipName);
130
128
  if (!relationship) {
131
129
  throw new Error(`${modelClass.name} has no relationship named ${JSON.stringify(entry.relationshipName)} (withCount attribute ${JSON.stringify(entry.attributeName)})`);
@@ -149,16 +147,27 @@ async function countForEntry({ entries, entry, modelClass, parentIds }) {
149
147
  if (entry.where) {
150
148
  Object.assign(whereConditions, entry.where);
151
149
  }
152
- const countQuery = targetModelClass
153
- .where(whereConditions)
154
- .group(foreignKey);
150
+ const baseQuery = targetModelClass._newQuery();
151
+ baseQuery._forceQualifyBaseTable = true;
152
+ baseQuery.where(whereConditions);
153
+ const countQuery = relationship.applyScope(baseQuery);
155
154
  countQuery._preload = {};
156
- countQuery._selects = [];
155
+ countQuery.reselect();
157
156
  const driver = countQuery.driver;
158
- const quotedTable = driver.quoteTable(targetModelClass.tableName());
157
+ const quotedTable = driver.quoteTable(countQuery.rootTableReference());
159
158
  const quotedFk = driver.quoteColumn(foreignKey);
160
- countQuery.select(`${quotedTable}.${quotedFk} AS parent_id`);
159
+ const qualifiedForeignKey = `${quotedTable}.${quotedFk}`;
160
+ countQuery.group(qualifiedForeignKey);
161
+ countQuery.select(`${qualifiedForeignKey} AS parent_id`);
161
162
  countQuery.select("COUNT(*) AS count_value");
163
+ return countQuery;
164
+ }
165
+ /**
166
+ * Executes a prepared grouped count query.
167
+ * @param {import("./model-class-query.js").default} countQuery - Prepared count query.
168
+ * @returns {Promise<Map<string | number, number>>} - Map of parent pk → count.
169
+ */
170
+ async function executeCountQuery(countQuery) {
162
171
  const rows = /** @type {Array<{parent_id: string | number, count_value: string | number}>} */ (await countQuery._executeQuery());
163
172
  /**
164
173
  * Counts.
@@ -171,4 +180,29 @@ async function countForEntry({ entries, entry, modelClass, parentIds }) {
171
180
  }
172
181
  return counts;
173
182
  }
174
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1jb3VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS9xdWVyeS93aXRoLWNvdW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7Ozs7O0dBTUc7QUFFSDs7O0dBR0c7QUFFSDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLElBQUk7SUFDckMsSUFBSSxJQUFJLElBQUksSUFBSTtRQUFFLE9BQU8sRUFBRSxDQUFBO0lBRTNCLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDN0IsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQzlCLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN4QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUMzQixJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxPQUFPLElBQUksRUFBRSxDQUFDLENBQUE7WUFDaEYsQ0FBQztZQUVELE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzVCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDN0I7O3NDQUU4QjtRQUM5QixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUE7UUFFbEIsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNoRCxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDbkIsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFD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QUFBO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIFdpdGhDb3VudEVudHJ5IHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBXaXRoQ291bnRFbnRyeVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWUgLSBBdHRyaWJ1dGUgdG8gc2V0IG9uIGVhY2ggcGFyZW50IHJlY29yZCBob2xkaW5nIHRoZSBjb3VudC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZWxhdGlvbnNoaXBOYW1lIC0gSGFzLW1hbnkgcmVsYXRpb25zaGlwIHdob3NlIHJvd3MgYXJlIGNvdW50ZWQuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsID8+IHwgdW5kZWZpbmVkfSB3aGVyZSAtIE9wdGlvbmFsIGV4dHJhIHdoZXJlIGNsYXVzZSBhcHBsaWVkIHRvIHRoZSBjb3VudCBxdWVyeS5cbiAqL1xuXG4vKipcbiAqIERlZmluZXMgdGhpcyB0eXBlZGVmLlxuICogQHR5cGVkZWYge3N0cmluZyB8IHN0cmluZ1tdIHwgUmVjb3JkPHN0cmluZywgYm9vbGVhbiB8IHtyZWxhdGlvbnNoaXA/OiBzdHJpbmcsIHdoZXJlPzogUmVjb3JkPHN0cmluZywgPz59Pn0gV2l0aENvdW50U3BlY1xuICovXG5cbi8qKlxuICogTm9ybWFsaXplIHRoZSBmbGV4aWJsZSB1c2VyLWZhY2luZyBgLndpdGhDb3VudCguLi4pYCBhcmd1bWVudCBpbnRvIHRoZVxuICogc3RyaWN0IGludGVybmFsIGxpc3Qgb2Yge2F0dHJpYnV0ZU5hbWUsIHJlbGF0aW9uc2hpcE5hbWUsIHdoZXJlfSBlbnRyaWVzXG4gKiB0aGUgcnVubmVyIGNvbnN1bWVzLlxuICpcbiAqIEFjY2VwdGVkIHNoYXBlczpcbiAqICAgXCJwcm9qZWN0c1wiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDihpIgb25lIGVudHJ5XG4gKiAgIFtcInByb2plY3RzXCIsIFwidGltZWxvZ3NcIl0gICAgICAgICAgICAgICAgICAgICAgICAgICDihpIgb25lIGVudHJ5IHBlciBuYW1lXG4gKiAgIHtwcm9qZWN0czogdHJ1ZX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKGkiBvbmUgZW50cnkgKGF0dHIgPSBcInByb2plY3RzQ291bnRcIilcbiAqICAge2FjdGl2ZU1lbWJlcnNDb3VudDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4oaSIGN1c3RvbSBhdHRyaWJ1dGUgbmFtZVxuICogICAgIHtyZWxhdGlvbnNoaXA6IFwidXNlcnNcIiwgd2hlcmU6IHthY3RpdmU6IHRydWV9fX1cbiAqIEBwYXJhbSB7V2l0aENvdW50U3BlY30gc3BlYyAtIFVzZXItc3VwcGxpZWQgc3BlYy5cbiAqIEByZXR1cm5zIHtXaXRoQ291bnRFbnRyeVtdfSAtIE5vcm1hbGl6ZWQgZW50cmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVdpdGhDb3VudChzcGVjKSB7XG4gIGlmIChzcGVjID09IG51bGwpIHJldHVybiBbXVxuXG4gIGlmICh0eXBlb2Ygc3BlYyA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBbZW50cnlGcm9tTmFtZShzcGVjKV1cbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHNwZWMpKSB7XG4gICAgcmV0dXJuIHNwZWMuZmxhdE1hcCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBpdGVtICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgd2l0aENvdW50IGFycmF5IGVudHJpZXMgbXVzdCBiZSBzdHJpbmdzOyBnb3QgJHt0eXBlb2YgaXRlbX1gKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZW50cnlGcm9tTmFtZShpdGVtKVxuICAgIH0pXG4gIH1cblxuICBpZiAodHlwZW9mIHNwZWMgPT09IFwib2JqZWN0XCIpIHtcbiAgICAvKipcbiAgICAgKiBFbnRyaWVzLlxuICAgICAqIEB0eXBlIHtXaXRoQ291bnRFbnRyeVtdfSAqL1xuICAgIGNvbnN0IGVudHJpZXMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc3BlYykpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICBlbnRyaWVzLnB1c2goZW50cnlGcm9tTmFtZShrZXkpKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE9wdGlvbnMuXG4gICAgICAgICAqIEB0eXBlIHt7cmVsYXRpb25zaGlwPzogc3RyaW5nLCB3aGVyZT86IFJlY29yZDxzdHJpbmcsID8+fX0gKi9cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHZhbHVlXG4gICAgICAgIGVudHJpZXMucHVzaCh7XG4gICAgICAgICAgYXR0cmlidXRlTmFtZToga2V5LFxuICAgICAgICAgIHJlbGF0aW9uc2hpcE5hbWU6IG9wdGlvbnMucmVsYXRpb25zaGlwIHx8IGtleSxcbiAgICAgICAgICB3aGVyZTogb3B0aW9ucy53aGVyZVxuICAgICAgICB9KVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgd2l0aENvdW50IHZhbHVlIGZvciAke2tleX06ICR7dHlwZW9mIHZhbHVlfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGVudHJpZXNcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB3aXRoQ291bnQgc3BlYzogJHt0eXBlb2Ygc3BlY31gKVxufVxuXG4vKipcbiAqIFJ1bnMgZW50cnkgZnJvbSBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBSZWxhdGlvbnNoaXAgbmFtZSAoYXR0cmlidXRlIG5hbWUgaXMgZGVyaXZlZCBieSBhcHBlbmRpbmcgXCJDb3VudFwiKS5cbiAqIEByZXR1cm5zIHtXaXRoQ291bnRFbnRyeX0gLSBOb3JtYWxpemVkIGFzc29jaWF0aW9uLWNvdW50IGVudHJ5LlxuICovXG5mdW5jdGlvbiBlbnRyeUZyb21OYW1lKG5hbWUpIHtcbiAgcmV0dXJuIHtcbiAgICBhdHRyaWJ1dGVOYW1lOiBgJHtuYW1lfUNvdW50YCxcbiAgICByZWxhdGlvbnNoaXBOYW1lOiBuYW1lLFxuICAgIHdoZXJlOiB1bmRlZmluZWRcbiAgfVxufVxuXG4vKipcbiAqIFJ1biBldmVyeSB3aXRoQ291bnQgZW50cnkgYWdhaW5zdCB0aGUgbG9hZGVkIHBhcmVudCByZWNvcmRzLCBhdHRhY2hpbmdcbiAqIHRoZSByZXN1bHRpbmcgY291bnRzIGFzIGF0dHJpYnV0ZXMgb24gZWFjaCByZWNvcmQuIE1pcnJvcnMgdGhlXG4gKiBQcmVsb2FkZXIncyBkYXRhLWZsb3cgc2hhcGUg4oCUIG9uZSBncm91cGVkIGNvdW50IHF1ZXJ5IHBlciBlbnRyeSwgdGhlblxuICogYHNldEF0dHJpYnV0ZWAgb24gZWFjaCBwYXJlbnQuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0W119IGFyZ3MubW9kZWxzIC0gTG9hZGVkIHBhcmVudCByZWNvcmRzLlxuICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MubW9kZWxDbGFzcyAtIFBhcmVudCBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7V2l0aENvdW50RW50cnlbXX0gYXJncy5lbnRyaWVzIC0gTm9ybWFsaXplZCB3aXRoQ291bnQgZW50cmllcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2l0aENvdW50KHttb2RlbHMsIG1vZGVsQ2xhc3MsIGVudHJpZXN9KSB7XG4gIGlmIChtb2RlbHMubGVuZ3RoID09PSAwIHx8IGVudHJpZXMubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICBjb25zdCBwcmltYXJ5S2V5ID0gbW9kZWxDbGFzcy5wcmltYXJ5S2V5KClcbiAgY29uc3QgcGFyZW50SWRzID0gbW9kZWxzLm1hcCgobW9kZWwpID0+IC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVtYmVyfSAqLyAobW9kZWwucmVhZENvbHVtbihwcmltYXJ5S2V5KSkpXG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3QgY291bnRzID0gYXdhaXQgY291bnRGb3JFbnRyeSh7ZW50cmllcywgZW50cnksIG1vZGVsQ2xhc3MsIHBhcmVudElkc30pXG5cbiAgICBmb3IgKGNvbnN0IG1vZGVsIG9mIG1vZGVscykge1xuICAgICAgY29uc3QgbW9kZWxQcmltYXJ5S2V5VmFsdWUgPSAvKiogQHR5cGUge3N0cmluZyB8IG51bWJlcn0gKi8gKG1vZGVsLnJlYWRDb2x1bW4ocHJpbWFyeUtleSkpXG4gICAgICAvLyBUb2xlcmF0ZSBkcml2ZXIgZGlmZmVyZW5jZXMgaW4gbnVtZXJpYyByZXR1cm4gdHlwZXM6IFNRTGl0ZVxuICAgICAgLy8gcmV0dXJucyBpbnRlZ2VycyBhcyBKUyBudW1iZXJzLCBidXQgTXlTUUwncyByYXcgZHJpdmVyIGNhblxuICAgICAgLy8gcmV0dXJuIGNvdW50IHByaW1hcnkga2V5cyBhcyBzdHJpbmdzLiBUcnkgYm90aC5cbiAgICAgIGNvbnN0IHJlc29sdmVkQ291bnQgPSBjb3VudHMuaGFzKG1vZGVsUHJpbWFyeUtleVZhbHVlKVxuICAgICAgICA/IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoY291bnRzLmdldChtb2RlbFByaW1hcnlLZXlWYWx1ZSkpXG4gICAgICAgIDogTnVtYmVyKGNvdW50cy5nZXQoU3RyaW5nKG1vZGVsUHJpbWFyeUtleVZhbHVlKSkgPz8gMClcblxuICAgICAgLy8gQ291bnRzIGdvIG9uIHRoZSByZWNvcmQncyBkZWRpY2F0ZWQgYXNzb2NpYXRpb24tY291bnQgbWFwLFxuICAgICAgLy8gTk9UIG9uIGBfYXR0cmlidXRlc2AsIHNvIGEgdmlydHVhbCBgdGFza3NDb3VudGAgY2FuJ3Qgc2hhZG93IGFcbiAgICAgIC8vIHJlYWwgYHRhc2tzX2NvdW50YCBjb2x1bW4gKGUuZy4gYSBjb3VudGVyX2NhY2hlKSBub3IgbGVhayBpbnRvXG4gICAgICAvLyBhdHRyaWJ1dGUtbGV2ZWwgc2VyaWFsaXphdGlvbiAvIGNoYW5nZSB0cmFja2luZy5cbiAgICAgIG1vZGVsLl9zZXRBc3NvY2lhdGlvbkNvdW50KGVudHJ5LmF0dHJpYnV0ZU5hbWUsIHJlc29sdmVkQ291bnQpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUnVucyBjb3VudCBmb3IgZW50cnkuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge1dpdGhDb3VudEVudHJ5W119IGFyZ3MuZW50cmllcyAtIEFsbCBlbnRyaWVzLCB1c2VkIGZvciBlcnJvciBjb250ZXh0IG9ubHkuXG4gKiBAcGFyYW0ge1dpdGhDb3VudEVudHJ5fSBhcmdzLmVudHJ5IC0gRW50cnkgYmVpbmcgZXZhbHVhdGVkLlxuICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MubW9kZWxDbGFzcyAtIFBhcmVudCBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgbnVtYmVyPn0gYXJncy5wYXJlbnRJZHMgLSBQcmltYXJ5IGtleXMgb2YgdGhlIGxvYWRlZCBwYXJlbnRzLlxuICogQHJldHVybnMge1Byb21pc2U8TWFwPHN0cmluZyB8IG51bWJlciwgbnVtYmVyPj59IC0gTWFwIG9mIHBhcmVudCBwayDihpIgY291bnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvdW50Rm9yRW50cnkoe2VudHJpZXMsIGVudHJ5LCBtb2RlbENsYXNzLCBwYXJlbnRJZHN9KSB7XG4gIHZvaWQgZW50cmllc1xuXG4gIGNvbnN0IHJlbGF0aW9uc2hpcCA9IG1vZGVsQ2xhc3MuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKGVudHJ5LnJlbGF0aW9uc2hpcE5hbWUpXG5cbiAgaWYgKCFyZWxhdGlvbnNoaXApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bW9kZWxDbGFzcy5uYW1lfSBoYXMgbm8gcmVsYXRpb25zaGlwIG5hbWVkICR7SlNPTi5zdHJpbmdpZnkoZW50cnkucmVsYXRpb25zaGlwTmFtZSl9ICh3aXRoQ291bnQgYXR0cmlidXRlICR7SlNPTi5zdHJpbmdpZnkoZW50cnkuYXR0cmlidXRlTmFtZSl9KWApXG4gIH1cblxuICBpZiAocmVsYXRpb25zaGlwLnR5cGUgIT09IFwiaGFzTWFueVwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB3aXRoQ291bnQgY3VycmVudGx5IHN1cHBvcnRzIG9ubHkgaGFzTWFueSByZWxhdGlvbnNoaXBzOyAke21vZGVsQ2xhc3MubmFtZX0jJHtlbnRyeS5yZWxhdGlvbnNoaXBOYW1lfSBpcyAke3JlbGF0aW9uc2hpcC50eXBlfWApXG4gIH1cblxuICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gcmVsYXRpb25zaGlwLmdldFRhcmdldE1vZGVsQ2xhc3MoKVxuXG4gIGlmICghdGFyZ2V0TW9kZWxDbGFzcykge1xuICAgIHRocm93IG5ldyBFcnJvcihgd2l0aENvdW50OiBjb3VsZCBub3QgcmVzb2x2ZSB0YXJnZXQgbW9kZWwgZm9yICR7bW9kZWxDbGFzcy5uYW1lfSMke2VudHJ5LnJlbGF0aW9uc2hpcE5hbWV9YClcbiAgfVxuXG4gIGNvbnN0IGZvcmVpZ25LZXkgPSByZWxhdGlvbnNoaXAuZ2V0Rm9yZWlnbktleSgpXG4gIC8qKlxuICAgKiBXaGVyZSBjb25kaXRpb25zLlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovXG4gIGNvbnN0IHdoZXJlQ29uZGl0aW9ucyA9IHtbZm9yZWlnbktleV06IHBhcmVudElkc31cblxuICBpZiAocmVsYXRpb25zaGlwLmdldFBvbHltb3JwaGljICYmIHJlbGF0aW9uc2hpcC5nZXRQb2x5bW9ycGhpYygpKSB7XG4gICAgY29uc3QgdHlwZUNvbHVtbiA9IHJlbGF0aW9uc2hpcC5nZXRQb2x5bW9ycGhpY1R5cGVDb2x1bW4oKVxuICAgIHdoZXJlQ29uZGl0aW9uc1t0eXBlQ29sdW1uXSA9IG1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKClcbiAgfVxuXG4gIGlmIChlbnRyeS53aGVyZSkge1xuICAgIE9iamVjdC5hc3NpZ24od2hlcmVDb25kaXRpb25zLCBlbnRyeS53aGVyZSlcbiAgfVxuXG4gIGNvbnN0IGNvdW50UXVlcnkgPSB0YXJnZXRNb2RlbENsYXNzXG4gICAgLndoZXJlKHdoZXJlQ29uZGl0aW9ucylcbiAgICAuZ3JvdXAoZm9yZWlnbktleSlcblxuICBjb3VudFF1ZXJ5Ll9wcmVsb2FkID0ge31cbiAgY291bnRRdWVyeS5fc2VsZWN0cyA9IFtdXG5cbiAgY29uc3QgZHJpdmVyID0gY291bnRRdWVyeS5kcml2ZXJcbiAgY29uc3QgcXVvdGVkVGFibGUgPSBkcml2ZXIucXVvdGVUYWJsZSh0YXJnZXRNb2RlbENsYXNzLnRhYmxlTmFtZSgpKVxuICBjb25zdCBxdW90ZWRGayA9IGRyaXZlci5xdW90ZUNvbHVtbihmb3JlaWduS2V5KVxuXG4gIGNvdW50UXVlcnkuc2VsZWN0KGAke3F1b3RlZFRhYmxlfS4ke3F1b3RlZEZrfSBBUyBwYXJlbnRfaWRgKVxuICBjb3VudFF1ZXJ5LnNlbGVjdChcIkNPVU5UKCopIEFTIGNvdW50X3ZhbHVlXCIpXG5cbiAgY29uc3Qgcm93cyA9IC8qKiBAdHlwZSB7QXJyYXk8e3BhcmVudF9pZDogc3RyaW5nIHwgbnVtYmVyLCBjb3VudF92YWx1ZTogc3RyaW5nIHwgbnVtYmVyfT59ICovIChcbiAgICBhd2FpdCBjb3VudFF1ZXJ5Ll9leGVjdXRlUXVlcnkoKVxuICApXG5cbiAgLyoqXG4gICAqIENvdW50cy5cbiAgICogQHR5cGUge01hcDxzdHJpbmcgfCBudW1iZXIsIG51bWJlcj59ICovXG4gIGNvbnN0IGNvdW50cyA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICBjb25zdCBwYXJlbnRJZCA9IC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVtYmVyfSAqLyAocm93LnBhcmVudF9pZClcbiAgICBjb25zdCBjb3VudFZhbHVlID0gTnVtYmVyKHJvdy5jb3VudF92YWx1ZSkgfHwgMFxuICAgIGNvdW50cy5zZXQocGFyZW50SWQsIGNvdW50VmFsdWUpXG4gIH1cblxuICByZXR1cm4gY291bnRzXG59XG4iXX0=
183
+ /**
184
+ * Attaches one entry's resolved counts to the loaded models.
185
+ * @param {object} args - Options.
186
+ * @param {Map<string | number, number>} args.counts - Counts keyed by parent primary key.
187
+ * @param {WithCountEntry} args.entry - Entry whose alias receives the counts.
188
+ * @param {import("../record/index.js").default[]} args.models - Loaded parent records.
189
+ * @param {string} args.primaryKey - Parent primary key column.
190
+ * @returns {void}
191
+ */
192
+ function attachCounts({ counts, entry, models, primaryKey }) {
193
+ for (const model of models) {
194
+ const modelPrimaryKeyValue = /** @type {string | number} */ (model.readColumn(primaryKey));
195
+ // Tolerate driver differences in numeric return types: SQLite
196
+ // returns integers as JS numbers, but MySQL's raw driver can
197
+ // return count primary keys as strings. Try both.
198
+ const resolvedCount = counts.has(modelPrimaryKeyValue)
199
+ ? /** @type {number} */ (counts.get(modelPrimaryKeyValue))
200
+ : Number(counts.get(String(modelPrimaryKeyValue)) ?? 0);
201
+ // Counts go on the record's dedicated association-count map,
202
+ // NOT on `_attributes`, so a virtual `tasksCount` can't shadow a
203
+ // real `tasks_count` column (e.g. a counter_cache) nor leak into
204
+ // attribute-level serialization / change tracking.
205
+ model._setAssociationCount(entry.attributeName, resolvedCount);
206
+ }
207
+ }
208
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1jb3VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS9xdWVyeS93aXRoLWNvdW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7Ozs7O0dBTUc7QUFFSDs7O0dBR0c7QUFFSDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLElBQUk7SUFDckMsSUFBSSxJQUFJLElBQUksSUFBSTtRQUFFLE9BQU8sRUFBRSxDQUFBO0lBRTNCLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDN0IsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQzlCLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN4QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUMzQixJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxPQUFPLElBQUksRUFBRSxDQUFDLENBQUE7WUFDaEYsQ0FBQztZQUVELE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzVCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDN0I7O3NDQUU4QjtRQUM5QixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUE7UUFFbEIsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNoRCxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDbkIsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFD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QUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBXaXRoQ291bnRFbnRyeSB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gV2l0aENvdW50RW50cnlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lIC0gQXR0cmlidXRlIHRvIHNldCBvbiBlYWNoIHBhcmVudCByZWNvcmQgaG9sZGluZyB0aGUgY291bnQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVsYXRpb25zaGlwTmFtZSAtIEhhcy1tYW55IHJlbGF0aW9uc2hpcCB3aG9zZSByb3dzIGFyZSBjb3VudGVkLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCA/PiB8IHVuZGVmaW5lZH0gd2hlcmUgLSBPcHRpb25hbCBleHRyYSB3aGVyZSBjbGF1c2UgYXBwbGllZCB0byB0aGUgY291bnQgcXVlcnkuXG4gKi9cblxuLyoqXG4gKiBEZWZpbmVzIHRoaXMgdHlwZWRlZi5cbiAqIEB0eXBlZGVmIHtzdHJpbmcgfCBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4gfCB7cmVsYXRpb25zaGlwPzogc3RyaW5nLCB3aGVyZT86IFJlY29yZDxzdHJpbmcsID8+fT59IFdpdGhDb3VudFNwZWNcbiAqL1xuXG4vKipcbiAqIE5vcm1hbGl6ZSB0aGUgZmxleGlibGUgdXNlci1mYWNpbmcgYC53aXRoQ291bnQoLi4uKWAgYXJndW1lbnQgaW50byB0aGVcbiAqIHN0cmljdCBpbnRlcm5hbCBsaXN0IG9mIHthdHRyaWJ1dGVOYW1lLCByZWxhdGlvbnNoaXBOYW1lLCB3aGVyZX0gZW50cmllc1xuICogdGhlIHJ1bm5lciBjb25zdW1lcy5cbiAqXG4gKiBBY2NlcHRlZCBzaGFwZXM6XG4gKiAgIFwicHJvamVjdHNcIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4oaSIG9uZSBlbnRyeVxuICogICBbXCJwcm9qZWN0c1wiLCBcInRpbWVsb2dzXCJdICAgICAgICAgICAgICAgICAgICAgICAgICAg4oaSIG9uZSBlbnRyeSBwZXIgbmFtZVxuICogICB7cHJvamVjdHM6IHRydWV9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDihpIgb25lIGVudHJ5IChhdHRyID0gXCJwcm9qZWN0c0NvdW50XCIpXG4gKiAgIHthY3RpdmVNZW1iZXJzQ291bnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKGkiBjdXN0b20gYXR0cmlidXRlIG5hbWVcbiAqICAgICB7cmVsYXRpb25zaGlwOiBcInVzZXJzXCIsIHdoZXJlOiB7YWN0aXZlOiB0cnVlfX19XG4gKiBAcGFyYW0ge1dpdGhDb3VudFNwZWN9IHNwZWMgLSBVc2VyLXN1cHBsaWVkIHNwZWMuXG4gKiBAcmV0dXJucyB7V2l0aENvdW50RW50cnlbXX0gLSBOb3JtYWxpemVkIGVudHJpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVXaXRoQ291bnQoc3BlYykge1xuICBpZiAoc3BlYyA9PSBudWxsKSByZXR1cm4gW11cblxuICBpZiAodHlwZW9mIHNwZWMgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gW2VudHJ5RnJvbU5hbWUoc3BlYyldXG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShzcGVjKSkge1xuICAgIHJldHVybiBzcGVjLmZsYXRNYXAoKGl0ZW0pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgaXRlbSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHdpdGhDb3VudCBhcnJheSBlbnRyaWVzIG11c3QgYmUgc3RyaW5nczsgZ290ICR7dHlwZW9mIGl0ZW19YClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVudHJ5RnJvbU5hbWUoaXRlbSlcbiAgICB9KVxuICB9XG5cbiAgaWYgKHR5cGVvZiBzcGVjID09PSBcIm9iamVjdFwiKSB7XG4gICAgLyoqXG4gICAgICogRW50cmllcy5cbiAgICAgKiBAdHlwZSB7V2l0aENvdW50RW50cnlbXX0gKi9cbiAgICBjb25zdCBlbnRyaWVzID0gW11cblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNwZWMpKSB7XG4gICAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgZW50cmllcy5wdXNoKGVudHJ5RnJvbU5hbWUoa2V5KSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBPcHRpb25zLlxuICAgICAgICAgKiBAdHlwZSB7e3JlbGF0aW9uc2hpcD86IHN0cmluZywgd2hlcmU/OiBSZWNvcmQ8c3RyaW5nLCA/Pn19ICovXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB2YWx1ZVxuICAgICAgICBlbnRyaWVzLnB1c2goe1xuICAgICAgICAgIGF0dHJpYnV0ZU5hbWU6IGtleSxcbiAgICAgICAgICByZWxhdGlvbnNoaXBOYW1lOiBvcHRpb25zLnJlbGF0aW9uc2hpcCB8fCBrZXksXG4gICAgICAgICAgd2hlcmU6IG9wdGlvbnMud2hlcmVcbiAgICAgICAgfSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHdpdGhDb3VudCB2YWx1ZSBmb3IgJHtrZXl9OiAke3R5cGVvZiB2YWx1ZX1gKVxuICAgIH1cblxuICAgIHJldHVybiBlbnRyaWVzXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgd2l0aENvdW50IHNwZWM6ICR7dHlwZW9mIHNwZWN9YClcbn1cblxuLyoqXG4gKiBSdW5zIGVudHJ5IGZyb20gbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gUmVsYXRpb25zaGlwIG5hbWUgKGF0dHJpYnV0ZSBuYW1lIGlzIGRlcml2ZWQgYnkgYXBwZW5kaW5nIFwiQ291bnRcIikuXG4gKiBAcmV0dXJucyB7V2l0aENvdW50RW50cnl9IC0gTm9ybWFsaXplZCBhc3NvY2lhdGlvbi1jb3VudCBlbnRyeS5cbiAqL1xuZnVuY3Rpb24gZW50cnlGcm9tTmFtZShuYW1lKSB7XG4gIHJldHVybiB7XG4gICAgYXR0cmlidXRlTmFtZTogYCR7bmFtZX1Db3VudGAsXG4gICAgcmVsYXRpb25zaGlwTmFtZTogbmFtZSxcbiAgICB3aGVyZTogdW5kZWZpbmVkXG4gIH1cbn1cblxuLyoqXG4gKiBSdW4gZXZlcnkgd2l0aENvdW50IGVudHJ5IGFnYWluc3QgdGhlIGxvYWRlZCBwYXJlbnQgcmVjb3JkcywgYXR0YWNoaW5nXG4gKiB0aGUgcmVzdWx0aW5nIGNvdW50cyBhcyBhdHRyaWJ1dGVzIG9uIGVhY2ggcmVjb3JkLiBNaXJyb3JzIHRoZVxuICogUHJlbG9hZGVyJ3MgZGF0YS1mbG93IHNoYXBlIOKAlCBvbmUgZ3JvdXBlZCBjb3VudCBxdWVyeSBwZXIgZW50cnksIHRoZW5cbiAqIGBzZXRBdHRyaWJ1dGVgIG9uIGVhY2ggcGFyZW50LlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdFtdfSBhcmdzLm1vZGVscyAtIExvYWRlZCBwYXJlbnQgcmVjb3Jkcy5cbiAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLm1vZGVsQ2xhc3MgLSBQYXJlbnQgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge1dpdGhDb3VudEVudHJ5W119IGFyZ3MuZW50cmllcyAtIE5vcm1hbGl6ZWQgd2l0aENvdW50IGVudHJpZXMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhDb3VudCh7bW9kZWxzLCBtb2RlbENsYXNzLCBlbnRyaWVzfSkge1xuICBpZiAobW9kZWxzLmxlbmd0aCA9PT0gMCB8fCBlbnRyaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgY29uc3QgcHJpbWFyeUtleSA9IG1vZGVsQ2xhc3MucHJpbWFyeUtleSgpXG4gIGNvbnN0IHBhcmVudElkcyA9IG1vZGVscy5tYXAoKG1vZGVsKSA9PiAvKiogQHR5cGUge3N0cmluZyB8IG51bWJlcn0gKi8gKG1vZGVsLnJlYWRDb2x1bW4ocHJpbWFyeUtleSkpKVxuICBjb25zdCBxdWVyeUdyb3VwcyA9IG5ldyBNYXAoKVxuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGNvbnN0IGNvdW50UXVlcnkgPSBxdWVyeUZvckVudHJ5KHtlbnRyeSwgbW9kZWxDbGFzcywgcGFyZW50SWRzfSlcbiAgICBjb25zdCBzcWwgPSBjb3VudFF1ZXJ5LnRvU3FsKClcbiAgICBjb25zdCBleGlzdGluZ0dyb3VwID0gcXVlcnlHcm91cHMuZ2V0KHNxbClcblxuICAgIGlmIChleGlzdGluZ0dyb3VwKSB7XG4gICAgICBleGlzdGluZ0dyb3VwLmVudHJpZXMucHVzaChlbnRyeSlcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnlHcm91cHMuc2V0KHNxbCwge2NvdW50UXVlcnksIGVudHJpZXM6IFtlbnRyeV19KVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qge2NvdW50UXVlcnksIGVudHJpZXM6IGdyb3VwZWRFbnRyaWVzfSBvZiBxdWVyeUdyb3Vwcy52YWx1ZXMoKSkge1xuICAgIGNvbnN0IGNvdW50cyA9IGF3YWl0IGV4ZWN1dGVDb3VudFF1ZXJ5KGNvdW50UXVlcnkpXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGdyb3VwZWRFbnRyaWVzKSBhdHRhY2hDb3VudHMoe2NvdW50cywgZW50cnksIG1vZGVscywgcHJpbWFyeUtleX0pXG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGdyb3VwZWQgY291bnQgcXVlcnkgZm9yIGFuIGVudHJ5LlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICogQHBhcmFtIHtXaXRoQ291bnRFbnRyeX0gYXJncy5lbnRyeSAtIEVudHJ5IGJlaW5nIGV2YWx1YXRlZC5cbiAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLm1vZGVsQ2xhc3MgLSBQYXJlbnQgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZyB8IG51bWJlcj59IGFyZ3MucGFyZW50SWRzIC0gUHJpbWFyeSBrZXlzIG9mIHRoZSBsb2FkZWQgcGFyZW50cy5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IC0gUHJlcGFyZWQgY291bnQgcXVlcnkuXG4gKi9cbmZ1bmN0aW9uIHF1ZXJ5Rm9yRW50cnkoe2VudHJ5LCBtb2RlbENsYXNzLCBwYXJlbnRJZHN9KSB7XG4gIGNvbnN0IHJlbGF0aW9uc2hpcCA9IG1vZGVsQ2xhc3MuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKGVudHJ5LnJlbGF0aW9uc2hpcE5hbWUpXG5cbiAgaWYgKCFyZWxhdGlvbnNoaXApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bW9kZWxDbGFzcy5uYW1lfSBoYXMgbm8gcmVsYXRpb25zaGlwIG5hbWVkICR7SlNPTi5zdHJpbmdpZnkoZW50cnkucmVsYXRpb25zaGlwTmFtZSl9ICh3aXRoQ291bnQgYXR0cmlidXRlICR7SlNPTi5zdHJpbmdpZnkoZW50cnkuYXR0cmlidXRlTmFtZSl9KWApXG4gIH1cblxuICBpZiAocmVsYXRpb25zaGlwLnR5cGUgIT09IFwiaGFzTWFueVwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB3aXRoQ291bnQgY3VycmVudGx5IHN1cHBvcnRzIG9ubHkgaGFzTWFueSByZWxhdGlvbnNoaXBzOyAke21vZGVsQ2xhc3MubmFtZX0jJHtlbnRyeS5yZWxhdGlvbnNoaXBOYW1lfSBpcyAke3JlbGF0aW9uc2hpcC50eXBlfWApXG4gIH1cblxuICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gcmVsYXRpb25zaGlwLmdldFRhcmdldE1vZGVsQ2xhc3MoKVxuXG4gIGlmICghdGFyZ2V0TW9kZWxDbGFzcykge1xuICAgIHRocm93IG5ldyBFcnJvcihgd2l0aENvdW50OiBjb3VsZCBub3QgcmVzb2x2ZSB0YXJnZXQgbW9kZWwgZm9yICR7bW9kZWxDbGFzcy5uYW1lfSMke2VudHJ5LnJlbGF0aW9uc2hpcE5hbWV9YClcbiAgfVxuXG4gIGNvbnN0IGZvcmVpZ25LZXkgPSByZWxhdGlvbnNoaXAuZ2V0Rm9yZWlnbktleSgpXG4gIC8qKlxuICAgKiBXaGVyZSBjb25kaXRpb25zLlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovXG4gIGNvbnN0IHdoZXJlQ29uZGl0aW9ucyA9IHtbZm9yZWlnbktleV06IHBhcmVudElkc31cblxuICBpZiAocmVsYXRpb25zaGlwLmdldFBvbHltb3JwaGljICYmIHJlbGF0aW9uc2hpcC5nZXRQb2x5bW9ycGhpYygpKSB7XG4gICAgY29uc3QgdHlwZUNvbHVtbiA9IHJlbGF0aW9uc2hpcC5nZXRQb2x5bW9ycGhpY1R5cGVDb2x1bW4oKVxuICAgIHdoZXJlQ29uZGl0aW9uc1t0eXBlQ29sdW1uXSA9IG1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKClcbiAgfVxuXG4gIGlmIChlbnRyeS53aGVyZSkge1xuICAgIE9iamVjdC5hc3NpZ24od2hlcmVDb25kaXRpb25zLCBlbnRyeS53aGVyZSlcbiAgfVxuXG4gIGNvbnN0IGJhc2VRdWVyeSA9IHRhcmdldE1vZGVsQ2xhc3MuX25ld1F1ZXJ5KClcbiAgYmFzZVF1ZXJ5Ll9mb3JjZVF1YWxpZnlCYXNlVGFibGUgPSB0cnVlXG4gIGJhc2VRdWVyeS53aGVyZSh3aGVyZUNvbmRpdGlvbnMpXG5cbiAgY29uc3QgY291bnRRdWVyeSA9IHJlbGF0aW9uc2hpcC5hcHBseVNjb3BlKGJhc2VRdWVyeSlcblxuICBjb3VudFF1ZXJ5Ll9wcmVsb2FkID0ge31cbiAgY291bnRRdWVyeS5yZXNlbGVjdCgpXG5cbiAgY29uc3QgZHJpdmVyID0gY291bnRRdWVyeS5kcml2ZXJcbiAgY29uc3QgcXVvdGVkVGFibGUgPSBkcml2ZXIucXVvdGVUYWJsZShjb3VudFF1ZXJ5LnJvb3RUYWJsZVJlZmVyZW5jZSgpKVxuICBjb25zdCBxdW90ZWRGayA9IGRyaXZlci5xdW90ZUNvbHVtbihmb3JlaWduS2V5KVxuICBjb25zdCBxdWFsaWZpZWRGb3JlaWduS2V5ID0gYCR7cXVvdGVkVGFibGV9LiR7cXVvdGVkRmt9YFxuXG4gIGNvdW50UXVlcnkuZ3JvdXAocXVhbGlmaWVkRm9yZWlnbktleSlcbiAgY291bnRRdWVyeS5zZWxlY3QoYCR7cXVhbGlmaWVkRm9yZWlnbktleX0gQVMgcGFyZW50X2lkYClcbiAgY291bnRRdWVyeS5zZWxlY3QoXCJDT1VOVCgqKSBBUyBjb3VudF92YWx1ZVwiKVxuXG4gIHJldHVybiBjb3VudFF1ZXJ5XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYSBwcmVwYXJlZCBncm91cGVkIGNvdW50IHF1ZXJ5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IGNvdW50UXVlcnkgLSBQcmVwYXJlZCBjb3VudCBxdWVyeS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPE1hcDxzdHJpbmcgfCBudW1iZXIsIG51bWJlcj4+fSAtIE1hcCBvZiBwYXJlbnQgcGsg4oaSIGNvdW50LlxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlQ291bnRRdWVyeShjb3VudFF1ZXJ5KSB7XG4gIGNvbnN0IHJvd3MgPSAvKiogQHR5cGUge0FycmF5PHtwYXJlbnRfaWQ6IHN0cmluZyB8IG51bWJlciwgY291bnRfdmFsdWU6IHN0cmluZyB8IG51bWJlcn0+fSAqLyAoXG4gICAgYXdhaXQgY291bnRRdWVyeS5fZXhlY3V0ZVF1ZXJ5KClcbiAgKVxuXG4gIC8qKlxuICAgKiBDb3VudHMuXG4gICAqIEB0eXBlIHtNYXA8c3RyaW5nIHwgbnVtYmVyLCBudW1iZXI+fSAqL1xuICBjb25zdCBjb3VudHMgPSBuZXcgTWFwKClcblxuICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgY29uc3QgcGFyZW50SWQgPSAvKiogQHR5cGUge3N0cmluZyB8IG51bWJlcn0gKi8gKHJvdy5wYXJlbnRfaWQpXG4gICAgY29uc3QgY291bnRWYWx1ZSA9IE51bWJlcihyb3cuY291bnRfdmFsdWUpIHx8IDBcbiAgICBjb3VudHMuc2V0KHBhcmVudElkLCBjb3VudFZhbHVlKVxuICB9XG5cbiAgcmV0dXJuIGNvdW50c1xufVxuXG4vKipcbiAqIEF0dGFjaGVzIG9uZSBlbnRyeSdzIHJlc29sdmVkIGNvdW50cyB0byB0aGUgbG9hZGVkIG1vZGVscy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZyB8IG51bWJlciwgbnVtYmVyPn0gYXJncy5jb3VudHMgLSBDb3VudHMga2V5ZWQgYnkgcGFyZW50IHByaW1hcnkga2V5LlxuICogQHBhcmFtIHtXaXRoQ291bnRFbnRyeX0gYXJncy5lbnRyeSAtIEVudHJ5IHdob3NlIGFsaWFzIHJlY2VpdmVzIHRoZSBjb3VudHMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0W119IGFyZ3MubW9kZWxzIC0gTG9hZGVkIHBhcmVudCByZWNvcmRzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucHJpbWFyeUtleSAtIFBhcmVudCBwcmltYXJ5IGtleSBjb2x1bW4uXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gYXR0YWNoQ291bnRzKHtjb3VudHMsIGVudHJ5LCBtb2RlbHMsIHByaW1hcnlLZXl9KSB7XG4gIGZvciAoY29uc3QgbW9kZWwgb2YgbW9kZWxzKSB7XG4gICAgY29uc3QgbW9kZWxQcmltYXJ5S2V5VmFsdWUgPSAvKiogQHR5cGUge3N0cmluZyB8IG51bWJlcn0gKi8gKG1vZGVsLnJlYWRDb2x1bW4ocHJpbWFyeUtleSkpXG4gICAgLy8gVG9sZXJhdGUgZHJpdmVyIGRpZmZlcmVuY2VzIGluIG51bWVyaWMgcmV0dXJuIHR5cGVzOiBTUUxpdGVcbiAgICAvLyByZXR1cm5zIGludGVnZXJzIGFzIEpTIG51bWJlcnMsIGJ1dCBNeVNRTCdzIHJhdyBkcml2ZXIgY2FuXG4gICAgLy8gcmV0dXJuIGNvdW50IHByaW1hcnkga2V5cyBhcyBzdHJpbmdzLiBUcnkgYm90aC5cbiAgICBjb25zdCByZXNvbHZlZENvdW50ID0gY291bnRzLmhhcyhtb2RlbFByaW1hcnlLZXlWYWx1ZSlcbiAgICAgID8gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChjb3VudHMuZ2V0KG1vZGVsUHJpbWFyeUtleVZhbHVlKSlcbiAgICAgIDogTnVtYmVyKGNvdW50cy5nZXQoU3RyaW5nKG1vZGVsUHJpbWFyeUtleVZhbHVlKSkgPz8gMClcblxuICAgIC8vIENvdW50cyBnbyBvbiB0aGUgcmVjb3JkJ3MgZGVkaWNhdGVkIGFzc29jaWF0aW9uLWNvdW50IG1hcCxcbiAgICAvLyBOT1Qgb24gYF9hdHRyaWJ1dGVzYCwgc28gYSB2aXJ0dWFsIGB0YXNrc0NvdW50YCBjYW4ndCBzaGFkb3cgYVxuICAgIC8vIHJlYWwgYHRhc2tzX2NvdW50YCBjb2x1bW4gKGUuZy4gYSBjb3VudGVyX2NhY2hlKSBub3IgbGVhayBpbnRvXG4gICAgLy8gYXR0cmlidXRlLWxldmVsIHNlcmlhbGl6YXRpb24gLyBjaGFuZ2UgdHJhY2tpbmcuXG4gICAgbW9kZWwuX3NldEFzc29jaWF0aW9uQ291bnQoZW50cnkuYXR0cmlidXRlTmFtZSwgcmVzb2x2ZWRDb3VudClcbiAgfVxufVxuIl19
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Thrown when a query is aborted via its `AbortSignal`/deadline. This is a
3
+ * terminal, non-retryable outcome whether cancellation happened before checkout
4
+ * or after an in-flight connection had to be destroyed.
5
+ */
6
+ export default class QueryAbortedError extends Error {
7
+ /**
8
+ * Runs constructor.
9
+ * @param {object} [args] - Options.
10
+ * @param {unknown} [args.cause] - Error cause.
11
+ * @param {boolean} [args.connectionDestroyed] - Whether cancellation destroyed an in-flight connection.
12
+ * @param {string} [args.sql] - The SQL that was aborted.
13
+ */
14
+ constructor({ cause, connectionDestroyed, sql }?: {
15
+ cause?: unknown;
16
+ connectionDestroyed?: boolean | undefined;
17
+ sql?: string | undefined;
18
+ });
19
+ code: string;
20
+ connectionDestroyed: boolean;
21
+ sql: string | undefined;
22
+ }
23
+ //# sourceMappingURL=query-aborted-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-aborted-error.d.ts","sourceRoot":"","sources":["../../../src/database/query-aborted-error.js"],"names":[],"mappings":"AAEA;;;;GAIG;AACH;IACE;;;;;;OAMG;IACH,kDAJG;QAAuB,KAAK,GAApB,OAAO;QACQ,mBAAmB;QACpB,GAAG;KAC3B,EAQA;IAHC,aAAqC;IACrC,6BAA8C;IAC9C,wBAAc;CAEjB"}
@@ -0,0 +1,23 @@
1
+ // @ts-check
2
+ /**
3
+ * Thrown when a query is aborted via its `AbortSignal`/deadline. This is a
4
+ * terminal, non-retryable outcome whether cancellation happened before checkout
5
+ * or after an in-flight connection had to be destroyed.
6
+ */
7
+ export default class QueryAbortedError extends Error {
8
+ /**
9
+ * Runs constructor.
10
+ * @param {object} [args] - Options.
11
+ * @param {unknown} [args.cause] - Error cause.
12
+ * @param {boolean} [args.connectionDestroyed] - Whether cancellation destroyed an in-flight connection.
13
+ * @param {string} [args.sql] - The SQL that was aborted.
14
+ */
15
+ constructor({ cause, connectionDestroyed = false, sql } = {}) {
16
+ super("Query aborted before it completed", { cause });
17
+ this.name = "QueryAbortedError";
18
+ this.code = "VELOCIOUS_QUERY_ABORTED";
19
+ this.connectionDestroyed = connectionDestroyed;
20
+ this.sql = sql;
21
+ }
22
+ }
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktYWJvcnRlZC1lcnJvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kYXRhYmFzZS9xdWVyeS1hYm9ydGVkLWVycm9yLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBTyxpQkFBa0IsU0FBUSxLQUFLO0lBQ2xEOzs7Ozs7T0FNRztJQUNILFlBQVksRUFBQyxLQUFLLEVBQUUsbUJBQW1CLEdBQUcsS0FBSyxFQUFFLEdBQUcsRUFBQyxHQUFHLEVBQUU7UUFDeEQsS0FBSyxDQUFDLG1DQUFtQyxFQUFFLEVBQUMsS0FBSyxFQUFDLENBQUMsQ0FBQTtRQUVuRCxJQUFJLENBQUMsSUFBSSxHQUFHLG1CQUFtQixDQUFBO1FBQy9CLElBQUksQ0FBQyxJQUFJLEdBQUcseUJBQXlCLENBQUE7UUFDckMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLG1CQUFtQixDQUFBO1FBQzlDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFBO0lBQ2hCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIFRocm93biB3aGVuIGEgcXVlcnkgaXMgYWJvcnRlZCB2aWEgaXRzIGBBYm9ydFNpZ25hbGAvZGVhZGxpbmUuIFRoaXMgaXMgYVxuICogdGVybWluYWwsIG5vbi1yZXRyeWFibGUgb3V0Y29tZSB3aGV0aGVyIGNhbmNlbGxhdGlvbiBoYXBwZW5lZCBiZWZvcmUgY2hlY2tvdXRcbiAqIG9yIGFmdGVyIGFuIGluLWZsaWdodCBjb25uZWN0aW9uIGhhZCB0byBiZSBkZXN0cm95ZWQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFF1ZXJ5QWJvcnRlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IFthcmdzXSAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gW2FyZ3MuY2F1c2VdIC0gRXJyb3IgY2F1c2UuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuY29ubmVjdGlvbkRlc3Ryb3llZF0gLSBXaGV0aGVyIGNhbmNlbGxhdGlvbiBkZXN0cm95ZWQgYW4gaW4tZmxpZ2h0IGNvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5zcWxdIC0gVGhlIFNRTCB0aGF0IHdhcyBhYm9ydGVkLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NhdXNlLCBjb25uZWN0aW9uRGVzdHJveWVkID0gZmFsc2UsIHNxbH0gPSB7fSkge1xuICAgIHN1cGVyKFwiUXVlcnkgYWJvcnRlZCBiZWZvcmUgaXQgY29tcGxldGVkXCIsIHtjYXVzZX0pXG5cbiAgICB0aGlzLm5hbWUgPSBcIlF1ZXJ5QWJvcnRlZEVycm9yXCJcbiAgICB0aGlzLmNvZGUgPSBcIlZFTE9DSU9VU19RVUVSWV9BQk9SVEVEXCJcbiAgICB0aGlzLmNvbm5lY3Rpb25EZXN0cm95ZWQgPSBjb25uZWN0aW9uRGVzdHJveWVkXG4gICAgdGhpcy5zcWwgPSBzcWxcbiAgfVxufVxuIl19
@@ -26,7 +26,12 @@ export default class VelociousHttpServerClientWebsocketSession {
26
26
  * Message queue.
27
27
  * @type {WebsocketSessionMessage[]} */
28
28
  messageQueue: WebsocketSessionMessage[];
29
- buffer: Buffer<ArrayBuffer>;
29
+ /** @type {Buffer[]} */
30
+ _bufferChunks: Buffer[];
31
+ _bufferChunkIndex: number;
32
+ _bufferChunkOffset: number;
33
+ _bufferedBytes: number;
34
+ _bufferedFrameCopyBytes: number;
30
35
  client: import("./index.js").default;
31
36
  configuration: import("../../configuration.js").default;
32
37
  upgradeRequest: WebsocketRequest | import("./request.js").default | undefined;
@@ -224,6 +229,29 @@ export default class VelociousHttpServerClientWebsocketSession {
224
229
  * @returns {void} - No return value.
225
230
  */
226
231
  _processBuffer(): void;
232
+ /**
233
+ * Copies the leading buffered bytes without consuming them. Header
234
+ * inspection is bounded to the websocket header size.
235
+ * @param {number} byteCount - Number of leading bytes to inspect.
236
+ * @returns {Buffer} - Copied prefix.
237
+ */
238
+ _peekBufferedBytes(byteCount: number): Buffer;
239
+ /**
240
+ * Consumes a complete frame from the chunk queue with one bounded copy.
241
+ * @param {number} byteCount - Complete frame byte count.
242
+ * @returns {Buffer} - Contiguous frame bytes.
243
+ */
244
+ _consumeBufferedBytes(byteCount: number): Buffer;
245
+ /**
246
+ * Drops all incomplete frame chunks.
247
+ * @returns {void}
248
+ */
249
+ _clearBufferedFrameChunks(): void;
250
+ /**
251
+ * Closes after an inbound buffering limit and releases all parser-owned input.
252
+ * @returns {void}
253
+ */
254
+ _closeForInboundLimit(): void;
227
255
  /**
228
256
  * Appends a continuation-frame payload to the in-progress
229
257
  * fragmented message. Returns true when the fragment was accepted
@@ -506,9 +534,9 @@ export default class VelociousHttpServerClientWebsocketSession {
506
534
  * Runs unmask payload.
507
535
  * @param {Buffer} payload - Payload data.
508
536
  * @param {Buffer} mask - Mask.
509
- * @returns {Buffer} - The unmask payload.
537
+ * @returns {void} - No return value.
510
538
  */
511
- _unmaskPayload(payload: Buffer, mask: Buffer): Buffer;
539
+ _unmaskPayload(payload: Buffer, mask: Buffer): void;
512
540
  _runMessageHandlerOpen(): Promise<void>;
513
541
  /**
514
542
  * Runs run message handler message.
@@ -1 +1 @@
1
- {"version":3,"file":"websocket-session.d.ts","sourceRoot":"","sources":["../../../../src/http-server/client/websocket-session.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"websocket-session.d.ts","sourceRoot":"","sources":["../../../../src/http-server/client/websocket-session.js"],"names":[],"mappings":"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"}