velocious 1.0.538 → 1.0.540

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.
@@ -261,11 +261,16 @@ export default class BackgroundJobsScheduler {
261
261
  */
262
262
  async enqueueScheduledJob({jobConfiguration, jobKey}) {
263
263
  try {
264
+ // De-duplicate scheduled enqueues by default: a periodic job still pending from an earlier
265
+ // tick is not enqueued again, which is what let the background_jobs table fill with thousands
266
+ // of identical scheduled jobs when the queue backed up. Dedup is by job identity (see the
267
+ // store), so the job keeps its queue-derived concurrency cap. A schedule can opt out with
268
+ // `deduplicateWhileQueued: false`.
264
269
  await this.enqueueJob({
265
270
  args: Array.isArray(jobConfiguration.args) ? jobConfiguration.args : [],
266
271
  jobClass: jobConfiguration.class,
267
272
  jobKey,
268
- options: jobConfiguration.options || {}
273
+ options: {deduplicateWhileQueued: true, ...(jobConfiguration.options || {})}
269
274
  })
270
275
  } catch (error) {
271
276
  await this.logger.error(() => ["Failed to enqueue scheduled background job", {jobKey, jobName: jobConfiguration.class.jobName()}, error])
@@ -144,12 +144,16 @@ export default class BackgroundJobsStore {
144
144
  let resultJobId = jobId
145
145
 
146
146
  await this._withDb(async (db) => {
147
- if (options?.deduplicateWhileQueued && concurrency?.concurrencyKey) {
147
+ if (options?.deduplicateWhileQueued) {
148
+ // Dedupe on the job's identity (name + args + queue), NOT its concurrency key, so a job
149
+ // keeps whatever concurrency it resolves to — in particular a scheduled job that relies on
150
+ // its queue-derived `queue:<name>` cap still participates in that cluster-wide cap instead
151
+ // of being pulled onto a private per-job key.
148
152
  const existing = await db
149
153
  .newQuery()
150
154
  .from(JOBS_TABLE)
151
155
  .select("id")
152
- .where({status: "queued", concurrency_key: concurrency.concurrencyKey})
156
+ .where({status: "queued", job_name: jobName, args_json: argsJson, queue})
153
157
  .limit(1)
154
158
  .results()
155
159
 
@@ -472,6 +476,7 @@ export default class BackgroundJobsStore {
472
476
  if (!job) return false
473
477
  if (!this._shouldAcceptReport({job, handoffId, workerId, handedOffAtMs})) return false
474
478
 
479
+ await this._lockConcurrencyRow(db, job.concurrencyKey)
475
480
  const affectedRows = await this._updateAffectedRows(db, {
476
481
  tableName: JOBS_TABLE,
477
482
  data: {
@@ -500,6 +505,7 @@ export default class BackgroundJobsStore {
500
505
  await this._withDb(async (db) => await db.transaction(async () => {
501
506
  const job = await this._getJobRowById(db, jobId)
502
507
  if (!job || job.handoffId !== handoffId || job.status !== "handed_off") return
508
+ await this._lockConcurrencyRow(db, job.concurrencyKey)
503
509
  const affectedRows = await this._updateAffectedRows(db, {
504
510
  tableName: JOBS_TABLE,
505
511
  data: {
@@ -719,6 +725,9 @@ export default class BackgroundJobsStore {
719
725
  return await this._withDb(async (db) => await this._transactionResult(db, async () => {
720
726
  const job = await this._getJobRowById(db, jobId)
721
727
  if (!job || (job.status !== "queued" && job.status !== "handed_off")) return false
728
+ // Only a handed_off job holds a concurrency reservation, so only that case touches the
729
+ // shared counter row and needs the concurrency-then-job lock ordering.
730
+ if (job.status === "handed_off") await this._lockConcurrencyRow(db, job.concurrencyKey)
722
731
  const affectedRows = await this._updateAffectedRows(db, {tableName: JOBS_TABLE, data: {status: "cancelled"}, conditions: {id: job.id, status: job.status}})
723
732
  if (affectedRows !== 1) return false
724
733
  if (job.status === "handed_off") await this._releaseConcurrency(db, job.concurrencyKey)
@@ -1194,6 +1203,7 @@ export default class BackgroundJobsStore {
1194
1203
  shouldRetry
1195
1204
  })
1196
1205
 
1206
+ await this._lockConcurrencyRow(db, job.concurrencyKey)
1197
1207
  const affectedRows = await this._updateAffectedRows(db, {
1198
1208
  tableName: JOBS_TABLE,
1199
1209
  data: update,
@@ -1469,6 +1479,28 @@ export default class BackgroundJobsStore {
1469
1479
  if (this._normalizeNumber(configured.max_concurrency) !== maxConcurrency) throw new Error(`Conflicting maxConcurrency for background job concurrencyKey: ${concurrencyKey}`)
1470
1480
  }
1471
1481
 
1482
+ /**
1483
+ * Locks the concurrency counter row so a job-release transaction acquires it *before* the job
1484
+ * row. {@link markHandedOff} reserves capacity (locking the counter row) before it updates the
1485
+ * job, so it locks concurrency-then-job; the release paths update the job before releasing
1486
+ * capacity, which is job-then-concurrency. Those opposite orders on the same shared counter row
1487
+ * are what deadlock (AB-BA) under a draining worker. Taking this lock first gives every
1488
+ * transaction a single concurrency-then-job order and removes the cycle.
1489
+ *
1490
+ * Uses a value-preserving `UPDATE` rather than `SELECT ... FOR UPDATE` so it stays portable
1491
+ * across drivers without row-level locking reads (e.g. SQLite); on row-locking engines the
1492
+ * matched row is write-locked for the rest of the transaction even though its value is unchanged.
1493
+ * @param {import("../database/drivers/base.js").default} db - Database connection.
1494
+ * @param {string | null} concurrencyKey - Concurrency key.
1495
+ * @returns {Promise<void>} - Resolves when the counter row is locked.
1496
+ */
1497
+ async _lockConcurrencyRow(db, concurrencyKey) {
1498
+ if (!concurrencyKey) return
1499
+ const table = db.quoteTable(CONCURRENCY_TABLE)
1500
+ const count = db.quoteColumn("active_count")
1501
+ await db.query(`UPDATE ${table} SET ${count} = ${count} WHERE ${db.quoteColumn("concurrency_key")} = ${db.quote(concurrencyKey)}`)
1502
+ }
1503
+
1472
1504
  /**
1473
1505
  * Atomically reserves capacity for a key.
1474
1506
  * @param {import("../database/drivers/base.js").default} db - Database connection.
@@ -15,7 +15,7 @@
15
15
  * @property {string} [queue] - Queue name. Defaults to `"default"`. When the queue has a configured cap in `backgroundJobs.queues`, that cap is enforced cluster-wide.
16
16
  * @property {string} [concurrencyKey] - Opaque non-empty key used to share a concurrency cap. Overrides any queue-derived cap.
17
17
  * @property {number} [maxConcurrency] - Positive integer cap; must be paired with `concurrencyKey`.
18
- * @property {boolean} [deduplicateWhileQueued] - When true (requires `concurrencyKey`), skip the enqueue if a still-queued job with the same `concurrencyKey` already exists, returning that job's id. Keeps an interval-scheduled recurring job (e.g. retention pruning) from piling up redundant queued rows when it runs slower than its interval or no worker is free.
18
+ * @property {boolean} [deduplicateWhileQueued] - When true, skip the enqueue if an identical still-queued job (same job name, args and queue) already exists, returning that job's id. Deduplication is by job identity and independent of `concurrencyKey`, so the job keeps its normal (e.g. queue-derived) concurrency cap. Keeps an interval-scheduled recurring job (e.g. retention pruning) from piling up redundant queued rows when it runs slower than its interval or no worker is free.
19
19
  * @property {number} [scheduledAtMs] - Epoch timestamp in milliseconds when the job becomes eligible for dispatch. Defaults to enqueue time.
20
20
  */
21
21
  /**
@@ -64,6 +64,9 @@
64
64
  * @property {string} [databaseCharset] - Default character set applied by `db:create` via mysql/mariadb `CREATE DATABASE ... CHARACTER SET`. Distinct from `charset`, which is the client connection charset forwarded to the mysql2 driver.
65
65
  * @property {string} [databaseCollation] - Default collation applied by `db:create` via mysql/mariadb `CREATE DATABASE ... COLLATE`.
66
66
  * @property {string} [database] - Database name for this connection.
67
+ * @property {number} [deadlockMaxRetries] - Maximum attempts for the outermost transaction when it keeps hitting deadlocks. Defaults to 8.
68
+ * @property {number} [deadlockBaseWaitMs] - Base delay (ms) for the deadlock retry backoff; the per-attempt ceiling doubles from here. Defaults to 50.
69
+ * @property {number} [deadlockMaxWaitMs] - Cap (ms) on the deadlock retry backoff ceiling so the jittered wait stays bounded. Defaults to 1000.
67
70
  * @property {typeof import("./database/drivers/base.js").default} [driver] - Driver class to use for this database.
68
71
  * @property {typeof import("./database/pool/base.js").default} [poolType] - Pool class to use for this database.
69
72
  * @property {function() : ?} [getConnection] - Custom connection factory override.
@@ -122,6 +122,7 @@ import TableData from "../table-data/index.js"
122
122
  import TableColumn from "../table-data/table-column.js"
123
123
  import TableForeignKey from "../table-data/table-foreign-key.js"
124
124
  import wait from "awaitery/build/wait.js"
125
+ import {optionalPositiveInteger} from "typanic"
125
126
 
126
127
  /**
127
128
  * Runs now ms.
@@ -864,7 +865,10 @@ export default class VelociousDatabaseDriversBase {
864
865
  return await this._runTransactionAttempt(callback)
865
866
  }
866
867
 
867
- const maxAttempts = 5
868
+ const args = this.getArgs()
869
+ const maxAttempts = optionalPositiveInteger(args.deadlockMaxRetries, "deadlockMaxRetries") ?? 8
870
+ const configuredBaseWaitMs = optionalPositiveInteger(args.deadlockBaseWaitMs, "deadlockBaseWaitMs")
871
+ const deadlockMaxWaitMs = optionalPositiveInteger(args.deadlockMaxWaitMs, "deadlockMaxWaitMs") ?? 1000
868
872
  let attempt = 0
869
873
 
870
874
  while (true) {
@@ -876,10 +880,22 @@ export default class VelociousDatabaseDriversBase {
876
880
  const retryInfo = error instanceof Error ? this.retryableDatabaseError(error) : {retry: false, reconnect: false}
877
881
 
878
882
  if (retryInfo.deadlock && attempt < maxAttempts && this._transactionsCount == 0) {
879
- const baseWaitMs = typeof retryInfo.waitMs == "number" && retryInfo.waitMs > 0 ? retryInfo.waitMs : 50
883
+ // An explicitly-configured base wins so the tuning knob is effective even on drivers
884
+ // whose classifier supplies its own `waitMs` (MySQL/MariaDB return a fixed 50ms for
885
+ // deadlocks); otherwise honor that classifier hint, then fall back to 50ms.
886
+ const baseWaitMs = configuredBaseWaitMs ?? (typeof retryInfo.waitMs == "number" && retryInfo.waitMs > 0 ? retryInfo.waitMs : 50)
887
+
888
+ // Full-jitter exponential backoff: wait a uniform-random duration in
889
+ // [0, min(base * 2^(attempt-1), cap)]. The doubling ceiling spreads retries out as
890
+ // contention persists, and the jitter de-correlates transactions that deadlocked in
891
+ // lockstep so they stop re-colliding on the same wait (the linear `base * attempt`
892
+ // this replaces had every victim retry after an identical delay). `attempt` is
893
+ // 1-based here, so 2^(attempt-1) is 1, 2, 4, ... The cap keeps the tail sub-second.
894
+ const ceilingWaitMs = Math.min(baseWaitMs * (2 ** (attempt - 1)), deadlockMaxWaitMs)
895
+ const jitteredWaitMs = Math.floor(Math.random() * (ceilingWaitMs + 1))
880
896
 
881
897
  this.logger.warn(`Retrying transaction after deadlock (attempt ${attempt}/${maxAttempts})`)
882
- await wait(baseWaitMs * attempt)
898
+ await this._waitMs(jitteredWaitMs)
883
899
  continue
884
900
  }
885
901
 
@@ -888,6 +904,16 @@ export default class VelociousDatabaseDriversBase {
888
904
  }
889
905
  }
890
906
 
907
+ /**
908
+ * Waits `ms` milliseconds. Isolated in its own method so tests can observe (and skip) the
909
+ * deadlock-retry backoff without a real timer.
910
+ * @param {number} ms - Milliseconds to wait.
911
+ * @returns {Promise<void>} - Resolves after the delay.
912
+ */
913
+ async _waitMs(ms) {
914
+ await wait(ms)
915
+ }
916
+
891
917
  /**
892
918
  * Runs a single transaction attempt: starts a transaction (or a savepoint when nested), runs
893
919
  * `callback`, and commits — rolling back on error. {@link transaction} wraps this with deadlock
@@ -1 +1 @@
1
- {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../../src/background-jobs/scheduler.js"],"names":[],"mappings":"AAuBA;;+DAE+D;AAE/D;;;;;GAKG;AACH,8CAJW,MAAM,GAAG,MAAM,aACf,MAAM,GACJ,MAAM,CA8BlB;AAED,0DAA0D;AAC1D;IACE;;;;;OAKG;IACH,2CAHG;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO;QAC6H,UAAU,EAA5K,CAAS,IAAiI,EAAjI;YAAC,IAAI,EAAE,KAAK,CAAC,OAAC,CAAC,CAAC;YAAC,QAAQ,EAAE,cAAc,UAAU,EAAE,OAAO,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,OAAO,YAAY,EAAE,oBAAoB,CAAA;SAAC,KAAI,OAAO,CAAC,IAAI,CAAC;KACrK,EAoBA;IAlBC,qDAAkC;IAClC,mBAJkB;QAAC,IAAI,EAAE,KAAK,CAAC,OAAC,CAAC,CAAC;QAAC,QAAQ,EAAE,cAAc,UAAU,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,YAAY,EAAE,oBAAoB,CAAA;KAAC,KAAI,OAAO,CAAC,IAAI,CAAC,CAIxI;IAC5B,eAA8B;IAC9B;;uDAEmD;IACnD,aADU,KAAK,CAAC,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAC1B;IACrB;;sDAEkD;IAClD,YADU,KAAK,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAC1B;IACpB,gFAAgF;IAChF,iBADW,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CACG;IAChC;;;OAGG;IACH,SAFU,OAAO,CAEG;IAGtB;;kCAE8B;IAC9B,SADa,OAAO,CAAC,IAAI,CAAC,CAmBzB;IAED;;;OAGG;IACH,QAFa,OAAO,CAAC,IAAI,CAAC,CAiBzB;IAED;;;;;;OAMG;IACH,0CAJG;QAAsF,gBAAgB,EAA9F,OAAO,2BAA2B,EAAE,mCAAmC;QAC1D,MAAM,EAAnB,MAAM;KACd,GAAU,IAAI,CAsBhB;IAED;;;;;;OAMG;IACH,+CAJG;QAAsF,gBAAgB,EAA9F,OAAO,2BAA2B,EAAE,mCAAmC;QAC1D,MAAM,EAAnB,MAAM;KACd,GAAU,IAAI,CAuBhB;IAED;;;;;;;;;OASG;IACH,8CAJG;QAAsF,gBAAgB,EAA9F,OAAO,2BAA2B,EAAE,mCAAmC;QAC1D,MAAM,EAAnB,MAAM;KACd,GAAU,IAAI,CA+BhB;IAED;;;;;;OAMG;IACH,8CAJG;QAAsF,gBAAgB,EAA9F,OAAO,2BAA2B,EAAE,mCAAmC;QAC1D,MAAM,EAAnB,MAAM;KACd,GAAU,OAAO,CAAC,IAAI,CAAC,CAWzB;IAED;;;;;;OAMG;IACH,kDAJG;QAAsF,gBAAgB,EAA9F,OAAO,2BAA2B,EAAE,mCAAmC;QAC1D,MAAM,EAAnB,MAAM;KACd,GAAU,OAAO,CAAC,IAAI,CAAC,CAazB;IAED;;;;OAIG;IACH,sBAHW,WAAW,CAAC,OAAO,2BAA2B,EAAE,mCAAmC,CAAC,OAAO,CAAC,CAAC,GAC3F;QAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAC,CAczE;CACF;;;;2BA3QY,MAAM,OAAO,oBAAoB;mBAvB3B,cAAc"}
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../../src/background-jobs/scheduler.js"],"names":[],"mappings":"AAuBA;;+DAE+D;AAE/D;;;;;GAKG;AACH,8CAJW,MAAM,GAAG,MAAM,aACf,MAAM,GACJ,MAAM,CA8BlB;AAED,0DAA0D;AAC1D;IACE;;;;;OAKG;IACH,2CAHG;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO;QAC6H,UAAU,EAA5K,CAAS,IAAiI,EAAjI;YAAC,IAAI,EAAE,KAAK,CAAC,OAAC,CAAC,CAAC;YAAC,QAAQ,EAAE,cAAc,UAAU,EAAE,OAAO,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,OAAO,YAAY,EAAE,oBAAoB,CAAA;SAAC,KAAI,OAAO,CAAC,IAAI,CAAC;KACrK,EAoBA;IAlBC,qDAAkC;IAClC,mBAJkB;QAAC,IAAI,EAAE,KAAK,CAAC,OAAC,CAAC,CAAC;QAAC,QAAQ,EAAE,cAAc,UAAU,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,YAAY,EAAE,oBAAoB,CAAA;KAAC,KAAI,OAAO,CAAC,IAAI,CAAC,CAIxI;IAC5B,eAA8B;IAC9B;;uDAEmD;IACnD,aADU,KAAK,CAAC,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAC1B;IACrB;;sDAEkD;IAClD,YADU,KAAK,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAC1B;IACpB,gFAAgF;IAChF,iBADW,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CACG;IAChC;;;OAGG;IACH,SAFU,OAAO,CAEG;IAGtB;;kCAE8B;IAC9B,SADa,OAAO,CAAC,IAAI,CAAC,CAmBzB;IAED;;;OAGG;IACH,QAFa,OAAO,CAAC,IAAI,CAAC,CAiBzB;IAED;;;;;;OAMG;IACH,0CAJG;QAAsF,gBAAgB,EAA9F,OAAO,2BAA2B,EAAE,mCAAmC;QAC1D,MAAM,EAAnB,MAAM;KACd,GAAU,IAAI,CAsBhB;IAED;;;;;;OAMG;IACH,+CAJG;QAAsF,gBAAgB,EAA9F,OAAO,2BAA2B,EAAE,mCAAmC;QAC1D,MAAM,EAAnB,MAAM;KACd,GAAU,IAAI,CAuBhB;IAED;;;;;;;;;OASG;IACH,8CAJG;QAAsF,gBAAgB,EAA9F,OAAO,2BAA2B,EAAE,mCAAmC;QAC1D,MAAM,EAAnB,MAAM;KACd,GAAU,IAAI,CA+BhB;IAED;;;;;;OAMG;IACH,8CAJG;QAAsF,gBAAgB,EAA9F,OAAO,2BAA2B,EAAE,mCAAmC;QAC1D,MAAM,EAAnB,MAAM;KACd,GAAU,OAAO,CAAC,IAAI,CAAC,CAWzB;IAED;;;;;;OAMG;IACH,kDAJG;QAAsF,gBAAgB,EAA9F,OAAO,2BAA2B,EAAE,mCAAmC;QAC1D,MAAM,EAAnB,MAAM;KACd,GAAU,OAAO,CAAC,IAAI,CAAC,CAkBzB;IAED;;;;OAIG;IACH,sBAHW,WAAW,CAAC,OAAO,2BAA2B,EAAE,mCAAmC,CAAC,OAAO,CAAC,CAAC,GAC3F;QAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAC,CAczE;CACF;;;;2BAhRY,MAAM,OAAO,oBAAoB;mBAvB3B,cAAc"}
@@ -219,11 +219,16 @@ export default class BackgroundJobsScheduler {
219
219
  */
220
220
  async enqueueScheduledJob({ jobConfiguration, jobKey }) {
221
221
  try {
222
+ // De-duplicate scheduled enqueues by default: a periodic job still pending from an earlier
223
+ // tick is not enqueued again, which is what let the background_jobs table fill with thousands
224
+ // of identical scheduled jobs when the queue backed up. Dedup is by job identity (see the
225
+ // store), so the job keeps its queue-derived concurrency cap. A schedule can opt out with
226
+ // `deduplicateWhileQueued: false`.
222
227
  await this.enqueueJob({
223
228
  args: Array.isArray(jobConfiguration.args) ? jobConfiguration.args : [],
224
229
  jobClass: jobConfiguration.class,
225
230
  jobKey,
226
- options: jobConfiguration.options || {}
231
+ options: { deduplicateWhileQueued: true, ...(jobConfiguration.options || {}) }
227
232
  });
228
233
  }
229
234
  catch (error) {
@@ -246,4 +251,4 @@ export default class BackgroundJobsScheduler {
246
251
  return { everyValue: every };
247
252
  }
248
253
  }
249
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tncm91bmQtam9icy9zY2hlZHVsZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sTUFBTSxNQUFNLGNBQWMsQ0FBQTtBQUNqQyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQTtBQUUxRSxNQUFNLG9CQUFvQixHQUFHO0lBQzNCLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJO0lBQ3RCLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJO0lBQ3hCLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJO0lBQ3pCLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUk7SUFDakIsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSTtJQUNwQixLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJO0lBQ3JCLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSTtJQUNaLE1BQU0sRUFBRSxFQUFFLEdBQUcsSUFBSTtJQUNqQixPQUFPLEVBQUUsRUFBRSxHQUFHLElBQUk7SUFDbEIsRUFBRSxFQUFFLENBQUM7SUFDTCxDQUFDLEVBQUUsSUFBSTtJQUNQLE1BQU0sRUFBRSxJQUFJO0lBQ1osT0FBTyxFQUFFLElBQUk7SUFDYixDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUk7SUFDMUIsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJO0lBQzdCLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSTtDQUMvQixDQUFBO0FBQ0Q7OytE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QUNmLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyw0Q0FBNEMsRUFBRSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtRQUMzSSxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsS0FBSztRQUNsQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixNQUFNLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxHQUFHLEtBQUssQ0FBQTtZQUV4QyxJQUFJLENBQUMsWUFBWSxJQUFJLE9BQU8sWUFBWSxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7Z0JBQ3JGLE9BQU8sRUFBQyxVQUFVLEVBQUMsQ0FBQTtZQUNyQixDQUFDO1lBRUQsT0FBTyxFQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsWUFBWSxDQUFDLE9BQU8sRUFBQyxDQUFBO1FBQ3pELENBQUM7UUFFRCxPQUFPLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBQyxDQUFBO0lBQzVCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi9sb2dnZXIuanNcIlxuaW1wb3J0IHtuZXh0Q3JvbkZpcmVEYXRlLCBwYXJzZUNyb25FeHByZXNzaW9ufSBmcm9tIFwiLi9jcm9uLWV4cHJlc3Npb24uanNcIlxuXG5jb25zdCBEVVJBVElPTl9NVUxUSVBMSUVSUyA9IHtcbiAgZDogMjQgKiA2MCAqIDYwICogMTAwMCxcbiAgZGF5OiAyNCAqIDYwICogNjAgKiAxMDAwLFxuICBkYXlzOiAyNCAqIDYwICogNjAgKiAxMDAwLFxuICBoOiA2MCAqIDYwICogMTAwMCxcbiAgaG91cjogNjAgKiA2MCAqIDEwMDAsXG4gIGhvdXJzOiA2MCAqIDYwICogMTAwMCxcbiAgbTogNjAgKiAxMDAwLFxuICBtaW51dGU6IDYwICogMTAwMCxcbiAgbWludXRlczogNjAgKiAxMDAwLFxuICBtczogMSxcbiAgczogMTAwMCxcbiAgc2Vjb25kOiAxMDAwLFxuICBzZWNvbmRzOiAxMDAwLFxuICB3OiA3ICogMjQgKiA2MCAqIDYwICogMTAwMCxcbiAgd2VlazogNyAqIDI0ICogNjAgKiA2MCAqIDEwMDAsXG4gIHdlZWtzOiA3ICogMjQgKiA2MCAqIDYwICogMTAwMFxufVxuLyoqXG4gKiBEdXJhdGlvblVuaXQgdHlwZS5cbiAqIEB0eXBlZGVmIHtrZXlvZiB0eXBlb2YgRFVSQVRJT05fTVVMVElQTElFUlN9IER1cmF0aW9uVW5pdCAqL1xuXG4vKipcbiAqIFJ1bnMgdGhlIHBhcnNlU2NoZWR1bGVkRHVyYXRpb24gaGVscGVyLlxuICogQHBhcmFtIHtudW1iZXIgfCBzdHJpbmd9IHZhbHVlIC0gRHVyYXRpb24gdmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGROYW1lIC0gRmllbGQgbmFtZSBmb3IgZXJyb3JzLlxuICogQHJldHVybnMge251bWJlcn0gLSBEdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNjaGVkdWxlZER1cmF0aW9uKHZhbHVlLCBmaWVsZE5hbWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbHVlKSB8fCB2YWx1ZSA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2NoZWR1bGVkIGJhY2tncm91bmQgam9iICR7ZmllbGROYW1lfSBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy5gKVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIiB8fCAhdmFsdWUudHJpbSgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTY2hlZHVsZWQgYmFja2dyb3VuZCBqb2IgJHtmaWVsZE5hbWV9IG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nIG9yIG51bWJlci5gKVxuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZFZhbHVlID0gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKClcbiAgY29uc3QgbWF0Y2ggPSBub3JtYWxpemVkVmFsdWUubWF0Y2goL14oXFxkKyg/OlxcLlxcZCspPylcXHMqKG1zfHN8bXxofGR8d3xzZWNvbmR8c2Vjb25kc3xtaW51dGV8bWludXRlc3xob3VyfGhvdXJzfGRheXxkYXlzfHdlZWt8d2Vla3MpJC8pXG5cbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzY2hlZHVsZWQgYmFja2dyb3VuZCBqb2IgJHtmaWVsZE5hbWV9OiAke3ZhbHVlfWApXG4gIH1cblxuICBjb25zdCBudW1lcmljVmFsdWUgPSBOdW1iZXIobWF0Y2hbMV0pXG4gIGNvbnN0IG11bHRpcGxpZXIgPSBEVVJBVElPTl9NVUxUSVBMSUVSU1svKiogQHR5cGUge0R1cmF0aW9uVW5pdH0gKi8gKG1hdGNoWzJdKV1cblxuICBpZiAoIW11bHRpcGxpZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2NoZWR1bGVkIGJhY2tncm91bmQgam9iICR7ZmllbGROYW1lfTogJHt2YWx1ZX1gKVxuICB9XG5cbiAgcmV0dXJuIE1hdGgucm91bmQobnVtZXJpY1ZhbHVlICogbXVsdGlwbGllcilcbn1cblxuLyoqIFJ1bnMgY29uZmlndXJlZCByZWN1cnJpbmcgYmFja2dyb3VuZCBqb2Igc2NoZWR1bGVzLiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFja2dyb3VuZEpvYnNTY2hlZHVsZXIge1xuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtmdW5jdGlvbih7YXJnczogQXJyYXk8Pz4sIGpvYkNsYXNzOiB0eXBlb2YgaW1wb3J0KFwiLi9qb2IuanNcIikuZGVmYXVsdCwgam9iS2V5OiBzdHJpbmcsIG9wdGlvbnM6IGltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYk9wdGlvbnN9KSA6IFByb21pc2U8dm9pZD59IGFyZ3MuZW5xdWV1ZUpvYiAtIEVucXVldWUgY2FsbGJhY2suXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29uZmlndXJhdGlvbiwgZW5xdWV1ZUpvYn0pIHtcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5lbnF1ZXVlSm9iID0gZW5xdWV1ZUpvYlxuICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlcih0aGlzKVxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+Pn0gKi9cbiAgICB0aGlzLmludGVydmFsSWRzID0gW11cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge0FycmF5PFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+Pn0gKi9cbiAgICB0aGlzLnRpbWVvdXRJZHMgPSBbXVxuICAgIC8qKiBAdHlwZSB7U2V0PFByb21pc2U8dm9pZD4+fSAtIFNjaGVkdWxlZCBlbnF1ZXVlcyB0aGF0IHNodXRkb3duIG11c3QgZHJhaW4uICovXG4gICAgdGhpcy5wZW5kaW5nRW5xdWV1ZXMgPSBuZXcgU2V0KClcbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59IC0gVHJ1ZSBiZXR3ZWVuIHN0b3AoKSBhbmQgdGhlIG5leHQgc3RhcnQoKTsgY3JvbiBzZWxmLXJlc2NoZWR1bGVyIGNoZWNrcyB0aGlzIHNvIGEgc3RvcCgpIGR1cmluZyBhbiBpbi1mbGlnaHQgZW5xdWV1ZSBkb2Vzbid0IGltbWVkaWF0ZWx5IHJlLWFybS5cbiAgICAgKi9cbiAgICB0aGlzLnN0b3BwZWQgPSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc3RhcnQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBzdGFydCgpIHtcbiAgICB0aGlzLnN0b3BwZWQgPSBmYWxzZVxuXG4gICAgY29uc3Qgc2NoZWR1bGVkQmFja2dyb3VuZEpvYnNDb25maWcgPSBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0U2NoZWR1bGVkQmFja2dyb3VuZEpvYnNDb25maWcoKVxuXG4gICAgaWYgKCFzY2hlZHVsZWRCYWNrZ3JvdW5kSm9ic0NvbmZpZz8uam9icykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBqb2JLZXkgb2YgT2JqZWN0LmtleXMoc2NoZWR1bGVkQmFja2dyb3VuZEpvYnNDb25maWcuam9icykpIHtcbiAgICAgIGNvbnN0IGpvYkNvbmZpZ3VyYXRpb24gPSBzY2hlZHVsZWRCYWNrZ3JvdW5kSm9ic0NvbmZpZy5qb2JzW2pvYktleV1cblxuICAgICAgaWYgKCFqb2JDb25maWd1cmF0aW9uIHx8IGpvYkNvbmZpZ3VyYXRpb24uZW5hYmxlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgdGhpcy5zY2hlZHVsZUpvYih7am9iQ29uZmlndXJhdGlvbiwgam9iS2V5fSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBzdG9wLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgYWZ0ZXIgaW4tZmxpZ2h0IHNjaGVkdWxlZCBlbnF1ZXVlcyBmaW5pc2guXG4gICAqL1xuICBhc3luYyBzdG9wKCkge1xuICAgIHRoaXMuc3RvcHBlZCA9IHRydWVcblxuICAgIGZvciAoY29uc3QgaW50ZXJ2YWxJZCBvZiB0aGlzLmludGVydmFsSWRzKSB7XG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB0aW1lb3V0SWQgb2YgdGhpcy50aW1lb3V0SWRzKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKVxuICAgIH1cblxuICAgIHRoaXMuaW50ZXJ2YWxJZHMgPSBbXVxuICAgIHRoaXMudGltZW91dElkcyA9IFtdXG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLnBlbmRpbmdFbnF1ZXVlcylcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNjaGVkdWxlIGpvYi5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuU2NoZWR1bGVkQmFja2dyb3VuZEpvYkNvbmZpZ3VyYXRpb259IGFyZ3Muam9iQ29uZmlndXJhdGlvbiAtIEpvYiBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5qb2JLZXkgLSBKb2Iga2V5LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNjaGVkdWxlSm9iKHtqb2JDb25maWd1cmF0aW9uLCBqb2JLZXl9KSB7XG4gICAgaWYgKCFqb2JDb25maWd1cmF0aW9uLmNsYXNzIHx8IHR5cGVvZiBqb2JDb25maWd1cmF0aW9uLmNsYXNzLnBlcmZvcm1MYXRlcldpdGhPcHRpb25zICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2NoZWR1bGVkIGJhY2tncm91bmQgam9iICR7am9iS2V5fSBtdXN0IGRlZmluZSBhIGpvYiBjbGFzcy5gKVxuICAgIH1cblxuICAgIGlmIChqb2JDb25maWd1cmF0aW9uLmNyb24gIT09IHVuZGVmaW5lZCAmJiBqb2JDb25maWd1cmF0aW9uLmV2ZXJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2NoZWR1bGVkIGJhY2tncm91bmQgam9iICR7am9iS2V5fSBtdXN0IGRlZmluZSBlaXRoZXIgXCJldmVyeVwiIG9yIFwiY3JvblwiLCBub3QgYm90aC5gKVxuICAgIH1cblxuICAgIGlmIChqb2JDb25maWd1cmF0aW9uLmNyb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zY2hlZHVsZUNyb25Kb2Ioe2pvYkNvbmZpZ3VyYXRpb24sIGpvYktleX0pXG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChqb2JDb25maWd1cmF0aW9uLmV2ZXJ5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2NoZWR1bGVkIGJhY2tncm91bmQgam9iICR7am9iS2V5fSBtdXN0IGRlZmluZSBlaXRoZXIgXCJldmVyeVwiIG9yIFwiY3JvblwiLmApXG4gICAgfVxuXG4gICAgdGhpcy5zY2hlZHVsZUV2ZXJ5Sm9iKHtqb2JDb25maWd1cmF0aW9uLCBqb2JLZXl9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2NoZWR1bGUgZXZlcnkgam9iLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5TY2hlZHVsZWRCYWNrZ3JvdW5kSm9iQ29uZmlndXJhdGlvbn0gYXJncy5qb2JDb25maWd1cmF0aW9uIC0gSm9iIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmpvYktleSAtIEpvYiBrZXkuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2NoZWR1bGVFdmVyeUpvYih7am9iQ29uZmlndXJhdGlvbiwgam9iS2V5fSkge1xuICAgIGNvbnN0IGV2ZXJ5Q29uZmlnID0gLyoqIEB0eXBlIHtOb25OdWxsYWJsZTx0eXBlb2Ygam9iQ29uZmlndXJhdGlvbi5ldmVyeT59ICovIChqb2JDb25maWd1cmF0aW9uLmV2ZXJ5KVxuICAgIGNvbnN0IHtldmVyeVZhbHVlLCBmaXJzdEluVmFsdWV9ID0gdGhpcy5ub3JtYWxpemVFdmVyeShldmVyeUNvbmZpZylcbiAgICBjb25zdCBpbnRlcnZhbE1zID0gcGFyc2VTY2hlZHVsZWREdXJhdGlvbihldmVyeVZhbHVlLCBgJHtqb2JLZXl9LmV2ZXJ5YClcbiAgICBjb25zdCBmaXJzdEluTXMgPSBmaXJzdEluVmFsdWUgIT09IHVuZGVmaW5lZCA/IHBhcnNlU2NoZWR1bGVkRHVyYXRpb24oZmlyc3RJblZhbHVlLCBgJHtqb2JLZXl9LmZpcnN0SW5gKSA6IGludGVydmFsTXNcblxuICAgIGlmIChpbnRlcnZhbE1zIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTY2hlZHVsZWQgYmFja2dyb3VuZCBqb2IgJHtqb2JLZXl9LmV2ZXJ5IG11c3QgYmUgYXQgbGVhc3QgMSBtaWxsaXNlY29uZC5gKVxuICAgIH1cblxuICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdm9pZCB0aGlzLnJ1blNjaGVkdWxlZEpvYih7am9iQ29uZmlndXJhdGlvbiwgam9iS2V5fSlcblxuICAgICAgY29uc3QgaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgdm9pZCB0aGlzLnJ1blNjaGVkdWxlZEpvYih7am9iQ29uZmlndXJhdGlvbiwgam9iS2V5fSlcbiAgICAgIH0sIGludGVydmFsTXMpXG5cbiAgICAgIHRoaXMuaW50ZXJ2YWxJZHMucHVzaChpbnRlcnZhbElkKVxuICAgIH0sIGZpcnN0SW5NcylcblxuICAgIHRoaXMudGltZW91dElkcy5wdXNoKHRpbWVvdXRJZClcbiAgfVxuXG4gIC8qKlxuICAgKiBDcm9udGFiIHNjaGVkdWxlcyBkb24ndCBoYXZlIGEgY29uc3RhbnQgaW50ZXJ2YWwgKGAwIDkgKiAqIDEtNWBcbiAgICogZmlyZXMgb25jZSBwZXIgd2Vla2RheSBhdCA5IEFNLCB3aXRoIGdhcHMgb2YgdmFyeWluZyBsZW5ndGgpLCBzb1xuICAgKiB3ZSBzZWxmLXJlc2NoZWR1bGUgd2l0aCBgc2V0VGltZW91dGAgYWZ0ZXIgZXZlcnkgZmlyZSBpbnN0ZWFkIG9mXG4gICAqIHVzaW5nIGBzZXRJbnRlcnZhbGAuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLlNjaGVkdWxlZEJhY2tncm91bmRKb2JDb25maWd1cmF0aW9ufSBhcmdzLmpvYkNvbmZpZ3VyYXRpb24gLSBKb2IgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muam9iS2V5IC0gSm9iIGtleS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzY2hlZHVsZUNyb25Kb2Ioe2pvYkNvbmZpZ3VyYXRpb24sIGpvYktleX0pIHtcbiAgICBjb25zdCBjcm9uRXhwcmVzc2lvbiA9IGpvYkNvbmZpZ3VyYXRpb24uY3JvblxuXG4gICAgaWYgKHR5cGVvZiBjcm9uRXhwcmVzc2lvbiAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTY2hlZHVsZWQgYmFja2dyb3VuZCBqb2IgJHtqb2JLZXl9LmNyb24gbXVzdCBiZSBhIHN0cmluZy5gKVxuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlQ3JvbkV4cHJlc3Npb24oY3JvbkV4cHJlc3Npb24pXG4gICAgY29uc3Qgc2NoZWR1bGVOZXh0ID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuc3RvcHBlZCkgcmV0dXJuXG5cbiAgICAgIGNvbnN0IG5leHREYXRlID0gbmV4dENyb25GaXJlRGF0ZShwYXJzZWQsIG5ldyBEYXRlKCkpXG4gICAgICBjb25zdCBkZWxheU1zID0gTWF0aC5tYXgoMSwgbmV4dERhdGUuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKSlcbiAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5zdG9wcGVkKSByZXR1cm5cblxuICAgICAgICBhd2FpdCB0aGlzLnJ1blNjaGVkdWxlZEpvYih7am9iQ29uZmlndXJhdGlvbiwgam9iS2V5fSlcblxuICAgICAgICAvLyBUaGUgYXdhaXQgYWJvdmUgY2FuIHlpZWxkIHRvIGEgc3RvcCgpIGNhbGwuIFJlLWNoZWNrIGJlZm9yZVxuICAgICAgICAvLyByZS1hcm1pbmcgc28gd2UgZG9uJ3Qga2VlcCBmaXJpbmcgYWZ0ZXIgc2h1dGRvd24uXG4gICAgICAgIGlmICh0aGlzLnN0b3BwZWQpIHJldHVyblxuXG4gICAgICAgIHNjaGVkdWxlTmV4dCgpXG4gICAgICB9LCBkZWxheU1zKVxuXG4gICAgICB0aGlzLnRpbWVvdXRJZHMucHVzaCh0aW1lb3V0SWQpXG4gICAgfVxuXG4gICAgc2NoZWR1bGVOZXh0KClcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFja3MgYSBzY2hlZHVsZWQgZW5xdWV1ZSBzbyBzdG9wKCkgY2Fubm90IHJldHVybiB3aGlsZSBpdCBjYW4gc3RpbGwgbXV0YXRlIHRoZSBzdG9yZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuU2NoZWR1bGVkQmFja2dyb3VuZEpvYkNvbmZpZ3VyYXRpb259IGFyZ3Muam9iQ29uZmlndXJhdGlvbiAtIEpvYiBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5qb2JLZXkgLSBKb2Iga2V5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciB0aGUgZW5xdWV1ZSBhdHRlbXB0IGZpbmlzaGVzLlxuICAgKi9cbiAgYXN5bmMgcnVuU2NoZWR1bGVkSm9iKHtqb2JDb25maWd1cmF0aW9uLCBqb2JLZXl9KSB7XG4gICAgY29uc3QgcGVuZGluZ0VucXVldWUgPSB0aGlzLmVucXVldWVTY2hlZHVsZWRKb2Ioe2pvYkNvbmZpZ3VyYXRpb24sIGpvYktleX0pXG4gICAgdGhpcy5wZW5kaW5nRW5xdWV1ZXMuYWRkKHBlbmRpbmdFbnF1ZXVlKVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHBlbmRpbmdFbnF1ZXVlXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMucGVuZGluZ0VucXVldWVzLmRlbGV0ZShwZW5kaW5nRW5xdWV1ZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBlbnF1ZXVlIHNjaGVkdWxlZCBqb2IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLlNjaGVkdWxlZEJhY2tncm91bmRKb2JDb25maWd1cmF0aW9ufSBhcmdzLmpvYkNvbmZpZ3VyYXRpb24gLSBKb2IgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muam9iS2V5IC0gSm9iIGtleS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBlbnF1ZXVlU2NoZWR1bGVkSm9iKHtqb2JDb25maWd1cmF0aW9uLCBqb2JLZXl9KSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZW5xdWV1ZUpvYih7XG4gICAgICAgIGFyZ3M6IEFycmF5LmlzQXJyYXkoam9iQ29uZmlndXJhdGlvbi5hcmdzKSA/IGpvYkNvbmZpZ3VyYXRpb24uYXJncyA6IFtdLFxuICAgICAgICBqb2JDbGFzczogam9iQ29uZmlndXJhdGlvbi5jbGFzcyxcbiAgICAgICAgam9iS2V5LFxuICAgICAgICBvcHRpb25zOiBqb2JDb25maWd1cmF0aW9uLm9wdGlvbnMgfHwge31cbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtcIkZhaWxlZCB0byBlbnF1ZXVlIHNjaGVkdWxlZCBiYWNrZ3JvdW5kIGpvYlwiLCB7am9iS2V5LCBqb2JOYW1lOiBqb2JDb25maWd1cmF0aW9uLmNsYXNzLmpvYk5hbWUoKX0sIGVycm9yXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBub3JtYWxpemUgZXZlcnkuXG4gICAqIEBwYXJhbSB7Tm9uTnVsbGFibGU8aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5TY2hlZHVsZWRCYWNrZ3JvdW5kSm9iQ29uZmlndXJhdGlvbltcImV2ZXJ5XCJdPn0gZXZlcnkgLSBFdmVyeSBjb25maWcgKGNhbGxlciBtdXN0IGd1YXJhbnRlZSBub3QgdW5kZWZpbmVkKS5cbiAgICogQHJldHVybnMge3tldmVyeVZhbHVlOiBudW1iZXIgfCBzdHJpbmcsIGZpcnN0SW5WYWx1ZT86IG51bWJlciB8IHN0cmluZ319IC0gTm9ybWFsaXplZCBpbnRlcnZhbCBhbmQgZmlyc3QtcnVuIGRlbGF5IHZhbHVlcy5cbiAgICovXG4gIG5vcm1hbGl6ZUV2ZXJ5KGV2ZXJ5KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZXZlcnkpKSB7XG4gICAgICBjb25zdCBbZXZlcnlWYWx1ZSwgZXZlcnlPcHRpb25zXSA9IGV2ZXJ5XG5cbiAgICAgIGlmICghZXZlcnlPcHRpb25zIHx8IHR5cGVvZiBldmVyeU9wdGlvbnMgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShldmVyeU9wdGlvbnMpKSB7XG4gICAgICAgIHJldHVybiB7ZXZlcnlWYWx1ZX1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtldmVyeVZhbHVlLCBmaXJzdEluVmFsdWU6IGV2ZXJ5T3B0aW9ucy5maXJzdElufVxuICAgIH1cblxuICAgIHJldHVybiB7ZXZlcnlWYWx1ZTogZXZlcnl9XG4gIH1cbn1cbiJdfQ==
254
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tncm91bmQtam9icy9zY2hlZHVsZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sTUFBTSxNQUFNLGNBQWMsQ0FBQTtBQUNqQyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQTtBQUUxRSxNQUFNLG9CQUFvQixHQUFHO0lBQzNCLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJO0lBQ3RCLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJO0lBQ3hCLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJO0lBQ3pCLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUk7SUFDakIsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSTtJQUNwQixLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJO0lBQ3JCLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSTtJQUNaLE1BQU0sRUFBRSxFQUFFLEdBQUcsSUFBSTtJQUNqQixPQUFPLEVBQUUsRUFBRSxHQUFHLElBQUk7SUFDbEIsRUFBRSxFQUFFLENBQUM7SUFDTCxDQUFDLEVBQUUsSUFBSTtJQUNQLE1BQU0sRUFBRSxJQUFJO0lBQ1osT0FBTyxFQUFFLElBQUk7SUFDYixDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUk7SUFDMUIsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJO0lBQzdCLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSTtDQUMvQixDQUFBO0FBQ0Q7OytE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QUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLEVBQUM7YUFDN0UsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsNENBQTRDLEVBQUUsRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDM0ksQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsY0FBYyxDQUFDLEtBQUs7UUFDbEIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsTUFBTSxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsR0FBRyxLQUFLLENBQUE7WUFFeEMsSUFBSSxDQUFDLFlBQVksSUFBSSxPQUFPLFlBQVksS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO2dCQUNyRixPQUFPLEVBQUMsVUFBVSxFQUFDLENBQUE7WUFDckIsQ0FBQztZQUVELE9BQU8sRUFBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxPQUFPLEVBQUMsQ0FBQTtRQUN6RCxDQUFDO1FBRUQsT0FBTyxFQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUMsQ0FBQTtJQUM1QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vbG9nZ2VyLmpzXCJcbmltcG9ydCB7bmV4dENyb25GaXJlRGF0ZSwgcGFyc2VDcm9uRXhwcmVzc2lvbn0gZnJvbSBcIi4vY3Jvbi1leHByZXNzaW9uLmpzXCJcblxuY29uc3QgRFVSQVRJT05fTVVMVElQTElFUlMgPSB7XG4gIGQ6IDI0ICogNjAgKiA2MCAqIDEwMDAsXG4gIGRheTogMjQgKiA2MCAqIDYwICogMTAwMCxcbiAgZGF5czogMjQgKiA2MCAqIDYwICogMTAwMCxcbiAgaDogNjAgKiA2MCAqIDEwMDAsXG4gIGhvdXI6IDYwICogNjAgKiAxMDAwLFxuICBob3VyczogNjAgKiA2MCAqIDEwMDAsXG4gIG06IDYwICogMTAwMCxcbiAgbWludXRlOiA2MCAqIDEwMDAsXG4gIG1pbnV0ZXM6IDYwICogMTAwMCxcbiAgbXM6IDEsXG4gIHM6IDEwMDAsXG4gIHNlY29uZDogMTAwMCxcbiAgc2Vjb25kczogMTAwMCxcbiAgdzogNyAqIDI0ICogNjAgKiA2MCAqIDEwMDAsXG4gIHdlZWs6IDcgKiAyNCAqIDYwICogNjAgKiAxMDAwLFxuICB3ZWVrczogNyAqIDI0ICogNjAgKiA2MCAqIDEwMDBcbn1cbi8qKlxuICogRHVyYXRpb25Vbml0IHR5cGUuXG4gKiBAdHlwZWRlZiB7a2V5b2YgdHlwZW9mIERVUkFUSU9OX01VTFRJUExJRVJTfSBEdXJhdGlvblVuaXQgKi9cblxuLyoqXG4gKiBSdW5zIHRoZSBwYXJzZVNjaGVkdWxlZER1cmF0aW9uIGhlbHBlci5cbiAqIEBwYXJhbSB7bnVtYmVyIHwgc3RyaW5nfSB2YWx1ZSAtIER1cmF0aW9uIHZhbHVlLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTmFtZSAtIEZpZWxkIG5hbWUgZm9yIGVycm9ycy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IC0gRHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTY2hlZHVsZWREdXJhdGlvbih2YWx1ZSwgZmllbGROYW1lKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgfHwgdmFsdWUgPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNjaGVkdWxlZCBiYWNrZ3JvdW5kIGpvYiAke2ZpZWxkTmFtZX0gbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciBvZiBtaWxsaXNlY29uZHMuYClcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgfHwgIXZhbHVlLnRyaW0oKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgU2NoZWR1bGVkIGJhY2tncm91bmQgam9iICR7ZmllbGROYW1lfSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZyBvciBudW1iZXIuYClcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IHZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpXG4gIGNvbnN0IG1hdGNoID0gbm9ybWFsaXplZFZhbHVlLm1hdGNoKC9eKFxcZCsoPzpcXC5cXGQrKT8pXFxzKihtc3xzfG18aHxkfHd8c2Vjb25kfHNlY29uZHN8bWludXRlfG1pbnV0ZXN8aG91cnxob3Vyc3xkYXl8ZGF5c3x3ZWVrfHdlZWtzKSQvKVxuXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2NoZWR1bGVkIGJhY2tncm91bmQgam9iICR7ZmllbGROYW1lfTogJHt2YWx1ZX1gKVxuICB9XG5cbiAgY29uc3QgbnVtZXJpY1ZhbHVlID0gTnVtYmVyKG1hdGNoWzFdKVxuICBjb25zdCBtdWx0aXBsaWVyID0gRFVSQVRJT05fTVVMVElQTElFUlNbLyoqIEB0eXBlIHtEdXJhdGlvblVuaXR9ICovIChtYXRjaFsyXSldXG5cbiAgaWYgKCFtdWx0aXBsaWVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNjaGVkdWxlZCBiYWNrZ3JvdW5kIGpvYiAke2ZpZWxkTmFtZX06ICR7dmFsdWV9YClcbiAgfVxuXG4gIHJldHVybiBNYXRoLnJvdW5kKG51bWVyaWNWYWx1ZSAqIG11bHRpcGxpZXIpXG59XG5cbi8qKiBSdW5zIGNvbmZpZ3VyZWQgcmVjdXJyaW5nIGJhY2tncm91bmQgam9iIHNjaGVkdWxlcy4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhY2tncm91bmRKb2JzU2NoZWR1bGVyIHtcbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oe2FyZ3M6IEFycmF5PD8+LCBqb2JDbGFzczogdHlwZW9mIGltcG9ydChcIi4vam9iLmpzXCIpLmRlZmF1bHQsIGpvYktleTogc3RyaW5nLCBvcHRpb25zOiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JPcHRpb25zfSkgOiBQcm9taXNlPHZvaWQ+fSBhcmdzLmVucXVldWVKb2IgLSBFbnF1ZXVlIGNhbGxiYWNrLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIGVucXVldWVKb2J9KSB7XG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblxuICAgIHRoaXMuZW5xdWV1ZUpvYiA9IGVucXVldWVKb2JcbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcylcbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICogQHR5cGUge0FycmF5PFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPj59ICovXG4gICAgdGhpcy5pbnRlcnZhbElkcyA9IFtdXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAqIEB0eXBlIHtBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0Pj59ICovXG4gICAgdGhpcy50aW1lb3V0SWRzID0gW11cbiAgICAvKiogQHR5cGUge1NldDxQcm9taXNlPHZvaWQ+Pn0gLSBTY2hlZHVsZWQgZW5xdWV1ZXMgdGhhdCBzaHV0ZG93biBtdXN0IGRyYWluLiAqL1xuICAgIHRoaXMucGVuZGluZ0VucXVldWVzID0gbmV3IFNldCgpXG4gICAgLyoqXG4gICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAqIEB0eXBlIHtib29sZWFufSAtIFRydWUgYmV0d2VlbiBzdG9wKCkgYW5kIHRoZSBuZXh0IHN0YXJ0KCk7IGNyb24gc2VsZi1yZXNjaGVkdWxlciBjaGVja3MgdGhpcyBzbyBhIHN0b3AoKSBkdXJpbmcgYW4gaW4tZmxpZ2h0IGVucXVldWUgZG9lc24ndCBpbW1lZGlhdGVseSByZS1hcm0uXG4gICAgICovXG4gICAgdGhpcy5zdG9wcGVkID0gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHN0YXJ0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgdGhpcy5zdG9wcGVkID0gZmFsc2VcblxuICAgIGNvbnN0IHNjaGVkdWxlZEJhY2tncm91bmRKb2JzQ29uZmlnID0gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmdldFNjaGVkdWxlZEJhY2tncm91bmRKb2JzQ29uZmlnKClcblxuICAgIGlmICghc2NoZWR1bGVkQmFja2dyb3VuZEpvYnNDb25maWc/LmpvYnMpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgam9iS2V5IG9mIE9iamVjdC5rZXlzKHNjaGVkdWxlZEJhY2tncm91bmRKb2JzQ29uZmlnLmpvYnMpKSB7XG4gICAgICBjb25zdCBqb2JDb25maWd1cmF0aW9uID0gc2NoZWR1bGVkQmFja2dyb3VuZEpvYnNDb25maWcuam9ic1tqb2JLZXldXG5cbiAgICAgIGlmICgham9iQ29uZmlndXJhdGlvbiB8fCBqb2JDb25maWd1cmF0aW9uLmVuYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2NoZWR1bGVKb2Ioe2pvYkNvbmZpZ3VyYXRpb24sIGpvYktleX0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc3RvcC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIGFmdGVyIGluLWZsaWdodCBzY2hlZHVsZWQgZW5xdWV1ZXMgZmluaXNoLlxuICAgKi9cbiAgYXN5bmMgc3RvcCgpIHtcbiAgICB0aGlzLnN0b3BwZWQgPSB0cnVlXG5cbiAgICBmb3IgKGNvbnN0IGludGVydmFsSWQgb2YgdGhpcy5pbnRlcnZhbElkcykge1xuICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgdGltZW91dElkIG9mIHRoaXMudGltZW91dElkcykge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZClcbiAgICB9XG5cbiAgICB0aGlzLmludGVydmFsSWRzID0gW11cbiAgICB0aGlzLnRpbWVvdXRJZHMgPSBbXVxuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5wZW5kaW5nRW5xdWV1ZXMpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzY2hlZHVsZSBqb2IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLlNjaGVkdWxlZEJhY2tncm91bmRKb2JDb25maWd1cmF0aW9ufSBhcmdzLmpvYkNvbmZpZ3VyYXRpb24gLSBKb2IgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muam9iS2V5IC0gSm9iIGtleS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzY2hlZHVsZUpvYih7am9iQ29uZmlndXJhdGlvbiwgam9iS2V5fSkge1xuICAgIGlmICgham9iQ29uZmlndXJhdGlvbi5jbGFzcyB8fCB0eXBlb2Ygam9iQ29uZmlndXJhdGlvbi5jbGFzcy5wZXJmb3JtTGF0ZXJXaXRoT3B0aW9ucyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNjaGVkdWxlZCBiYWNrZ3JvdW5kIGpvYiAke2pvYktleX0gbXVzdCBkZWZpbmUgYSBqb2IgY2xhc3MuYClcbiAgICB9XG5cbiAgICBpZiAoam9iQ29uZmlndXJhdGlvbi5jcm9uICE9PSB1bmRlZmluZWQgJiYgam9iQ29uZmlndXJhdGlvbi5ldmVyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNjaGVkdWxlZCBiYWNrZ3JvdW5kIGpvYiAke2pvYktleX0gbXVzdCBkZWZpbmUgZWl0aGVyIFwiZXZlcnlcIiBvciBcImNyb25cIiwgbm90IGJvdGguYClcbiAgICB9XG5cbiAgICBpZiAoam9iQ29uZmlndXJhdGlvbi5jcm9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2NoZWR1bGVDcm9uSm9iKHtqb2JDb25maWd1cmF0aW9uLCBqb2JLZXl9KVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoam9iQ29uZmlndXJhdGlvbi5ldmVyeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNjaGVkdWxlZCBiYWNrZ3JvdW5kIGpvYiAke2pvYktleX0gbXVzdCBkZWZpbmUgZWl0aGVyIFwiZXZlcnlcIiBvciBcImNyb25cIi5gKVxuICAgIH1cblxuICAgIHRoaXMuc2NoZWR1bGVFdmVyeUpvYih7am9iQ29uZmlndXJhdGlvbiwgam9iS2V5fSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNjaGVkdWxlIGV2ZXJ5IGpvYi5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuU2NoZWR1bGVkQmFja2dyb3VuZEpvYkNvbmZpZ3VyYXRpb259IGFyZ3Muam9iQ29uZmlndXJhdGlvbiAtIEpvYiBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5qb2JLZXkgLSBKb2Iga2V5LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNjaGVkdWxlRXZlcnlKb2Ioe2pvYkNvbmZpZ3VyYXRpb24sIGpvYktleX0pIHtcbiAgICBjb25zdCBldmVyeUNvbmZpZyA9IC8qKiBAdHlwZSB7Tm9uTnVsbGFibGU8dHlwZW9mIGpvYkNvbmZpZ3VyYXRpb24uZXZlcnk+fSAqLyAoam9iQ29uZmlndXJhdGlvbi5ldmVyeSlcbiAgICBjb25zdCB7ZXZlcnlWYWx1ZSwgZmlyc3RJblZhbHVlfSA9IHRoaXMubm9ybWFsaXplRXZlcnkoZXZlcnlDb25maWcpXG4gICAgY29uc3QgaW50ZXJ2YWxNcyA9IHBhcnNlU2NoZWR1bGVkRHVyYXRpb24oZXZlcnlWYWx1ZSwgYCR7am9iS2V5fS5ldmVyeWApXG4gICAgY29uc3QgZmlyc3RJbk1zID0gZmlyc3RJblZhbHVlICE9PSB1bmRlZmluZWQgPyBwYXJzZVNjaGVkdWxlZER1cmF0aW9uKGZpcnN0SW5WYWx1ZSwgYCR7am9iS2V5fS5maXJzdEluYCkgOiBpbnRlcnZhbE1zXG5cbiAgICBpZiAoaW50ZXJ2YWxNcyA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2NoZWR1bGVkIGJhY2tncm91bmQgam9iICR7am9iS2V5fS5ldmVyeSBtdXN0IGJlIGF0IGxlYXN0IDEgbWlsbGlzZWNvbmQuYClcbiAgICB9XG5cbiAgICBjb25zdCB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHZvaWQgdGhpcy5ydW5TY2hlZHVsZWRKb2Ioe2pvYkNvbmZpZ3VyYXRpb24sIGpvYktleX0pXG5cbiAgICAgIGNvbnN0IGludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIHZvaWQgdGhpcy5ydW5TY2hlZHVsZWRKb2Ioe2pvYkNvbmZpZ3VyYXRpb24sIGpvYktleX0pXG4gICAgICB9LCBpbnRlcnZhbE1zKVxuXG4gICAgICB0aGlzLmludGVydmFsSWRzLnB1c2goaW50ZXJ2YWxJZClcbiAgICB9LCBmaXJzdEluTXMpXG5cbiAgICB0aGlzLnRpbWVvdXRJZHMucHVzaCh0aW1lb3V0SWQpXG4gIH1cblxuICAvKipcbiAgICogQ3JvbnRhYiBzY2hlZHVsZXMgZG9uJ3QgaGF2ZSBhIGNvbnN0YW50IGludGVydmFsIChgMCA5ICogKiAxLTVgXG4gICAqIGZpcmVzIG9uY2UgcGVyIHdlZWtkYXkgYXQgOSBBTSwgd2l0aCBnYXBzIG9mIHZhcnlpbmcgbGVuZ3RoKSwgc29cbiAgICogd2Ugc2VsZi1yZXNjaGVkdWxlIHdpdGggYHNldFRpbWVvdXRgIGFmdGVyIGV2ZXJ5IGZpcmUgaW5zdGVhZCBvZlxuICAgKiB1c2luZyBgc2V0SW50ZXJ2YWxgLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5TY2hlZHVsZWRCYWNrZ3JvdW5kSm9iQ29uZmlndXJhdGlvbn0gYXJncy5qb2JDb25maWd1cmF0aW9uIC0gSm9iIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmpvYktleSAtIEpvYiBrZXkuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2NoZWR1bGVDcm9uSm9iKHtqb2JDb25maWd1cmF0aW9uLCBqb2JLZXl9KSB7XG4gICAgY29uc3QgY3JvbkV4cHJlc3Npb24gPSBqb2JDb25maWd1cmF0aW9uLmNyb25cblxuICAgIGlmICh0eXBlb2YgY3JvbkV4cHJlc3Npb24gIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2NoZWR1bGVkIGJhY2tncm91bmQgam9iICR7am9iS2V5fS5jcm9uIG11c3QgYmUgYSBzdHJpbmcuYClcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUNyb25FeHByZXNzaW9uKGNyb25FeHByZXNzaW9uKVxuICAgIGNvbnN0IHNjaGVkdWxlTmV4dCA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnN0b3BwZWQpIHJldHVyblxuXG4gICAgICBjb25zdCBuZXh0RGF0ZSA9IG5leHRDcm9uRmlyZURhdGUocGFyc2VkLCBuZXcgRGF0ZSgpKVxuICAgICAgY29uc3QgZGVsYXlNcyA9IE1hdGgubWF4KDEsIG5leHREYXRlLmdldFRpbWUoKSAtIERhdGUubm93KCkpXG4gICAgICBjb25zdCB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuc3RvcHBlZCkgcmV0dXJuXG5cbiAgICAgICAgYXdhaXQgdGhpcy5ydW5TY2hlZHVsZWRKb2Ioe2pvYkNvbmZpZ3VyYXRpb24sIGpvYktleX0pXG5cbiAgICAgICAgLy8gVGhlIGF3YWl0IGFib3ZlIGNhbiB5aWVsZCB0byBhIHN0b3AoKSBjYWxsLiBSZS1jaGVjayBiZWZvcmVcbiAgICAgICAgLy8gcmUtYXJtaW5nIHNvIHdlIGRvbid0IGtlZXAgZmlyaW5nIGFmdGVyIHNodXRkb3duLlxuICAgICAgICBpZiAodGhpcy5zdG9wcGVkKSByZXR1cm5cblxuICAgICAgICBzY2hlZHVsZU5leHQoKVxuICAgICAgfSwgZGVsYXlNcylcblxuICAgICAgdGhpcy50aW1lb3V0SWRzLnB1c2godGltZW91dElkKVxuICAgIH1cblxuICAgIHNjaGVkdWxlTmV4dCgpXG4gIH1cblxuICAvKipcbiAgICogVHJhY2tzIGEgc2NoZWR1bGVkIGVucXVldWUgc28gc3RvcCgpIGNhbm5vdCByZXR1cm4gd2hpbGUgaXQgY2FuIHN0aWxsIG11dGF0ZSB0aGUgc3RvcmUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLlNjaGVkdWxlZEJhY2tncm91bmRKb2JDb25maWd1cmF0aW9ufSBhcmdzLmpvYkNvbmZpZ3VyYXRpb24gLSBKb2IgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muam9iS2V5IC0gSm9iIGtleS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgdGhlIGVucXVldWUgYXR0ZW1wdCBmaW5pc2hlcy5cbiAgICovXG4gIGFzeW5jIHJ1blNjaGVkdWxlZEpvYih7am9iQ29uZmlndXJhdGlvbiwgam9iS2V5fSkge1xuICAgIGNvbnN0IHBlbmRpbmdFbnF1ZXVlID0gdGhpcy5lbnF1ZXVlU2NoZWR1bGVkSm9iKHtqb2JDb25maWd1cmF0aW9uLCBqb2JLZXl9KVxuICAgIHRoaXMucGVuZGluZ0VucXVldWVzLmFkZChwZW5kaW5nRW5xdWV1ZSlcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBwZW5kaW5nRW5xdWV1ZVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnBlbmRpbmdFbnF1ZXVlcy5kZWxldGUocGVuZGluZ0VucXVldWUpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZW5xdWV1ZSBzY2hlZHVsZWQgam9iLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5TY2hlZHVsZWRCYWNrZ3JvdW5kSm9iQ29uZmlndXJhdGlvbn0gYXJncy5qb2JDb25maWd1cmF0aW9uIC0gSm9iIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmpvYktleSAtIEpvYiBrZXkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZW5xdWV1ZVNjaGVkdWxlZEpvYih7am9iQ29uZmlndXJhdGlvbiwgam9iS2V5fSkge1xuICAgIHRyeSB7XG4gICAgICAvLyBEZS1kdXBsaWNhdGUgc2NoZWR1bGVkIGVucXVldWVzIGJ5IGRlZmF1bHQ6IGEgcGVyaW9kaWMgam9iIHN0aWxsIHBlbmRpbmcgZnJvbSBhbiBlYXJsaWVyXG4gICAgICAvLyB0aWNrIGlzIG5vdCBlbnF1ZXVlZCBhZ2Fpbiwgd2hpY2ggaXMgd2hhdCBsZXQgdGhlIGJhY2tncm91bmRfam9icyB0YWJsZSBmaWxsIHdpdGggdGhvdXNhbmRzXG4gICAgICAvLyBvZiBpZGVudGljYWwgc2NoZWR1bGVkIGpvYnMgd2hlbiB0aGUgcXVldWUgYmFja2VkIHVwLiBEZWR1cCBpcyBieSBqb2IgaWRlbnRpdHkgKHNlZSB0aGVcbiAgICAgIC8vIHN0b3JlKSwgc28gdGhlIGpvYiBrZWVwcyBpdHMgcXVldWUtZGVyaXZlZCBjb25jdXJyZW5jeSBjYXAuIEEgc2NoZWR1bGUgY2FuIG9wdCBvdXQgd2l0aFxuICAgICAgLy8gYGRlZHVwbGljYXRlV2hpbGVRdWV1ZWQ6IGZhbHNlYC5cbiAgICAgIGF3YWl0IHRoaXMuZW5xdWV1ZUpvYih7XG4gICAgICAgIGFyZ3M6IEFycmF5LmlzQXJyYXkoam9iQ29uZmlndXJhdGlvbi5hcmdzKSA/IGpvYkNvbmZpZ3VyYXRpb24uYXJncyA6IFtdLFxuICAgICAgICBqb2JDbGFzczogam9iQ29uZmlndXJhdGlvbi5jbGFzcyxcbiAgICAgICAgam9iS2V5LFxuICAgICAgICBvcHRpb25zOiB7ZGVkdXBsaWNhdGVXaGlsZVF1ZXVlZDogdHJ1ZSwgLi4uKGpvYkNvbmZpZ3VyYXRpb24ub3B0aW9ucyB8fCB7fSl9XG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCB0aGlzLmxvZ2dlci5lcnJvcigoKSA9PiBbXCJGYWlsZWQgdG8gZW5xdWV1ZSBzY2hlZHVsZWQgYmFja2dyb3VuZCBqb2JcIiwge2pvYktleSwgam9iTmFtZTogam9iQ29uZmlndXJhdGlvbi5jbGFzcy5qb2JOYW1lKCl9LCBlcnJvcl0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbm9ybWFsaXplIGV2ZXJ5LlxuICAgKiBAcGFyYW0ge05vbk51bGxhYmxlPGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuU2NoZWR1bGVkQmFja2dyb3VuZEpvYkNvbmZpZ3VyYXRpb25bXCJldmVyeVwiXT59IGV2ZXJ5IC0gRXZlcnkgY29uZmlnIChjYWxsZXIgbXVzdCBndWFyYW50ZWUgbm90IHVuZGVmaW5lZCkuXG4gICAqIEByZXR1cm5zIHt7ZXZlcnlWYWx1ZTogbnVtYmVyIHwgc3RyaW5nLCBmaXJzdEluVmFsdWU/OiBudW1iZXIgfCBzdHJpbmd9fSAtIE5vcm1hbGl6ZWQgaW50ZXJ2YWwgYW5kIGZpcnN0LXJ1biBkZWxheSB2YWx1ZXMuXG4gICAqL1xuICBub3JtYWxpemVFdmVyeShldmVyeSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGV2ZXJ5KSkge1xuICAgICAgY29uc3QgW2V2ZXJ5VmFsdWUsIGV2ZXJ5T3B0aW9uc10gPSBldmVyeVxuXG4gICAgICBpZiAoIWV2ZXJ5T3B0aW9ucyB8fCB0eXBlb2YgZXZlcnlPcHRpb25zICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZXZlcnlPcHRpb25zKSkge1xuICAgICAgICByZXR1cm4ge2V2ZXJ5VmFsdWV9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7ZXZlcnlWYWx1ZSwgZmlyc3RJblZhbHVlOiBldmVyeU9wdGlvbnMuZmlyc3RJbn1cbiAgICB9XG5cbiAgICByZXR1cm4ge2V2ZXJ5VmFsdWU6IGV2ZXJ5fVxuICB9XG59XG4iXX0=
@@ -502,6 +502,22 @@ export default class BackgroundJobsStore {
502
502
  concurrencyKey: string;
503
503
  maxConcurrency: number;
504
504
  }): Promise<void>;
505
+ /**
506
+ * Locks the concurrency counter row so a job-release transaction acquires it *before* the job
507
+ * row. {@link markHandedOff} reserves capacity (locking the counter row) before it updates the
508
+ * job, so it locks concurrency-then-job; the release paths update the job before releasing
509
+ * capacity, which is job-then-concurrency. Those opposite orders on the same shared counter row
510
+ * are what deadlock (AB-BA) under a draining worker. Taking this lock first gives every
511
+ * transaction a single concurrency-then-job order and removes the cycle.
512
+ *
513
+ * Uses a value-preserving `UPDATE` rather than `SELECT ... FOR UPDATE` so it stays portable
514
+ * across drivers without row-level locking reads (e.g. SQLite); on row-locking engines the
515
+ * matched row is write-locked for the rest of the transaction even though its value is unchanged.
516
+ * @param {import("../database/drivers/base.js").default} db - Database connection.
517
+ * @param {string | null} concurrencyKey - Concurrency key.
518
+ * @returns {Promise<void>} - Resolves when the counter row is locked.
519
+ */
520
+ _lockConcurrencyRow(db: import("../database/drivers/base.js").default, concurrencyKey: string | null): Promise<void>;
505
521
  /**
506
522
  * Atomically reserves capacity for a key.
507
523
  * @param {import("../database/drivers/base.js").default} db - Database connection.
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/background-jobs/store.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/background-jobs/store.js"],"names":[],"mappings":"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"}