bullmq 5.47.1 → 5.47.3

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 (58) hide show
  1. package/dist/cjs/classes/async-fifo-queue.js.map +1 -1
  2. package/dist/cjs/classes/child.js.map +1 -1
  3. package/dist/cjs/classes/job-scheduler.js +1 -1
  4. package/dist/cjs/classes/job-scheduler.js.map +1 -1
  5. package/dist/cjs/classes/queue-base.js.map +1 -1
  6. package/dist/cjs/classes/queue-keys.js.map +1 -1
  7. package/dist/cjs/classes/repeat.js +1 -1
  8. package/dist/cjs/classes/repeat.js.map +1 -1
  9. package/dist/cjs/classes/scripts.js +1 -1
  10. package/dist/cjs/classes/scripts.js.map +1 -1
  11. package/dist/cjs/classes/worker.js.map +1 -1
  12. package/dist/cjs/commands/includes/{moveParentToFailedIfNeeded.lua → moveChildFromDependenciesIfNeeded.lua} +40 -29
  13. package/dist/cjs/commands/includes/moveParentToWaitIfNeeded.lua +2 -2
  14. package/dist/cjs/commands/moveStalledJobsToWait-9.lua +2 -31
  15. package/dist/cjs/commands/moveToFinished-14.lua +3 -23
  16. package/dist/cjs/commands/moveToWaitingChildren-8.lua +2 -32
  17. package/dist/cjs/scripts/addDelayedJob-6.js +2 -2
  18. package/dist/cjs/scripts/addParentJob-4.js +2 -2
  19. package/dist/cjs/scripts/addPrioritizedJob-8.js +2 -2
  20. package/dist/cjs/scripts/addStandardJob-8.js +2 -2
  21. package/dist/cjs/scripts/moveStalledJobsToWait-9.js +42 -60
  22. package/dist/cjs/scripts/moveStalledJobsToWait-9.js.map +1 -1
  23. package/dist/cjs/scripts/moveToFinished-14.js +43 -52
  24. package/dist/cjs/scripts/moveToFinished-14.js.map +1 -1
  25. package/dist/cjs/scripts/moveToWaitingChildren-8.js +42 -62
  26. package/dist/cjs/scripts/moveToWaitingChildren-8.js.map +1 -1
  27. package/dist/cjs/tsconfig-cjs.tsbuildinfo +1 -1
  28. package/dist/cjs/version.js +1 -1
  29. package/dist/esm/classes/async-fifo-queue.js.map +1 -1
  30. package/dist/esm/classes/child.js.map +1 -1
  31. package/dist/esm/classes/job-scheduler.js +1 -1
  32. package/dist/esm/classes/job-scheduler.js.map +1 -1
  33. package/dist/esm/classes/queue-base.js.map +1 -1
  34. package/dist/esm/classes/queue-keys.js.map +1 -1
  35. package/dist/esm/classes/repeat.js +1 -1
  36. package/dist/esm/classes/repeat.js.map +1 -1
  37. package/dist/esm/classes/scripts.js +1 -1
  38. package/dist/esm/classes/scripts.js.map +1 -1
  39. package/dist/esm/classes/worker.js.map +1 -1
  40. package/dist/esm/commands/includes/{moveParentToFailedIfNeeded.lua → moveChildFromDependenciesIfNeeded.lua} +40 -29
  41. package/dist/esm/commands/includes/moveParentToWaitIfNeeded.lua +2 -2
  42. package/dist/esm/commands/moveStalledJobsToWait-9.lua +2 -31
  43. package/dist/esm/commands/moveToFinished-14.lua +3 -23
  44. package/dist/esm/commands/moveToWaitingChildren-8.lua +2 -32
  45. package/dist/esm/scripts/addDelayedJob-6.js +2 -2
  46. package/dist/esm/scripts/addParentJob-4.js +2 -2
  47. package/dist/esm/scripts/addPrioritizedJob-8.js +2 -2
  48. package/dist/esm/scripts/addStandardJob-8.js +2 -2
  49. package/dist/esm/scripts/moveStalledJobsToWait-9.js +42 -60
  50. package/dist/esm/scripts/moveStalledJobsToWait-9.js.map +1 -1
  51. package/dist/esm/scripts/moveToFinished-14.js +43 -52
  52. package/dist/esm/scripts/moveToFinished-14.js.map +1 -1
  53. package/dist/esm/scripts/moveToWaitingChildren-8.js +42 -62
  54. package/dist/esm/scripts/moveToWaitingChildren-8.js.map +1 -1
  55. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  56. package/dist/esm/version.d.ts +1 -1
  57. package/dist/esm/version.js +1 -1
  58. package/package.json +1 -1
@@ -26,7 +26,7 @@ local rcall = redis.call
26
26
  --- @include "includes/addJobInTargetList"
27
27
  --- @include "includes/batches"
28
28
  --- @include "includes/getTargetQueueList"
29
- --- @include "includes/moveParentToFailedIfNeeded"
29
+ --- @include "includes/moveChildFromDependenciesIfNeeded"
30
30
  --- @include "includes/moveParentToWaitIfNeeded"
31
31
  --- @include "includes/moveParentToWait"
32
32
  --- @include "includes/removeDeduplicationKeyIfNeeded"
@@ -93,36 +93,7 @@ if (#stalling > 0) then
93
93
  rcall("XADD", eventStreamKey, "*", "event", "failed", "jobId", jobId, 'prev', 'active',
94
94
  'failedReason', failedReason)
95
95
 
96
- if rawParentData then
97
- if opts['fpof'] or opts['cpof'] then
98
- local parentData = cjson.decode(rawParentData)
99
- -- TODO: need to remove this job from dependencies set in next breaking change
100
- -- no for now as it would imply a breaking change
101
- local parentKey = parentData['queueKey'] .. ':' .. parentData['id']
102
- local unsuccesssfulSet = parentKey .. ":unsuccessful"
103
- rcall("ZADD", unsuccesssfulSet, timestamp, jobKey)
104
-
105
- if opts['fpof'] then
106
- moveParentToFailedIfNeeded(parentData['queueKey'],
107
- parentData['queueKey'] .. ':' .. parentData['id'], parentData['id'], jobKey,
108
- timestamp)
109
- elseif opts['cpof'] then
110
- moveParentToWait(parentData['queueKey'], parentKey, parentData['id'], timestamp)
111
- end
112
- elseif opts['idof'] or opts['rdof'] then
113
- local parentData = cjson.decode(rawParentData)
114
- local parentKey = parentData['queueKey'] .. ':' .. parentData['id']
115
- local dependenciesSet = parentKey .. ":dependencies"
116
- if rcall("SREM", dependenciesSet, jobKey) == 1 then
117
- moveParentToWaitIfNeeded(parentData['queueKey'], dependenciesSet, parentKey,
118
- parentData['id'], timestamp)
119
- if opts['idof'] then
120
- local failedSet = parentKey .. ":failed"
121
- rcall("HSET", failedSet, jobKey, failedReason)
122
- end
123
- end
124
- end
125
- end
96
+ moveChildFromDependenciesIfNeeded(rawParentData, jobKey, failedReason, timestamp)
126
97
 
127
98
  removeJobsOnFail(queueKeyPrefix, failedKey, jobId, opts, timestamp)
128
99
 
@@ -64,7 +64,7 @@ local rcall = redis.call
64
64
  --- @include "includes/getRateLimitTTL"
65
65
  --- @include "includes/getTargetQueueList"
66
66
  --- @include "includes/moveJobFromPriorityToActive"
67
- --- @include "includes/moveParentToFailedIfNeeded"
67
+ --- @include "includes/moveChildFromDependenciesIfNeeded"
68
68
  --- @include "includes/moveParentToWait"
69
69
  --- @include "includes/moveParentToWaitIfNeeded"
70
70
  --- @include "includes/prepareJobForProcessing"
@@ -109,7 +109,7 @@ if rcall("EXISTS", jobIdKey) == 1 then -- Make sure job exists
109
109
  local parentKey = jobAttributes[1] or ""
110
110
  local parentId = ""
111
111
  local parentQueueKey = ""
112
- if jobAttributes[2] then
112
+ if jobAttributes[2] then -- TODO: need to revisit this logic if it's still needed
113
113
  local jsonDecodedParent = cjson.decode(jobAttributes[2])
114
114
  parentId = jsonDecodedParent['id']
115
115
  parentQueueKey = jsonDecodedParent['queueKey']
@@ -152,27 +152,7 @@ if rcall("EXISTS", jobIdKey) == 1 then -- Make sure job exists
152
152
  timestamp)
153
153
  end
154
154
  else
155
- if opts['fpof'] or opts['cpof'] then
156
- local unsuccesssfulSet = parentKey .. ":unsuccessful"
157
- rcall("ZADD", unsuccesssfulSet, timestamp, jobIdKey)
158
-
159
- if opts['fpof'] then
160
- moveParentToFailedIfNeeded(parentQueueKey, parentKey, parentId, jobIdKey, timestamp)
161
- elseif opts['cpof'] then
162
- local failedSet = parentKey .. ":failed"
163
- rcall("HSET", failedSet, jobIdKey, ARGV[4])
164
- moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
165
- end
166
- elseif opts['idof'] or opts['rdof'] then
167
- local dependenciesSet = parentKey .. ":dependencies"
168
- if rcall("SREM", dependenciesSet, jobIdKey) == 1 then
169
- moveParentToWaitIfNeeded(parentQueueKey, dependenciesSet, parentKey, parentId, timestamp)
170
- if opts['idof'] then
171
- local failedSet = parentKey .. ":failed"
172
- rcall("HSET", failedSet, jobIdKey, ARGV[4])
173
- end
174
- end
175
- end
155
+ moveChildFromDependenciesIfNeeded(jobAttributes[2], jobIdKey, ARGV[4], timestamp)
176
156
  end
177
157
  end
178
158
 
@@ -36,7 +36,7 @@ local timestamp = ARGV[3]
36
36
  local jobId = ARGV[4]
37
37
 
38
38
  --- Includes
39
- --- @include "includes/moveParentToFailedIfNeeded"
39
+ --- @include "includes/moveChildFromDependenciesIfNeeded"
40
40
  --- @include "includes/moveParentToWait"
41
41
  --- @include "includes/moveParentToWaitIfNeeded"
42
42
  --- @include "includes/removeDeduplicationKeyIfNeeded"
@@ -75,37 +75,7 @@ if rcall("EXISTS", jobKey) == 1 then
75
75
  local rawOpts = jobAttributes[3]
76
76
  local opts = cjson.decode(rawOpts)
77
77
 
78
- if rawParentData ~= false then
79
- if opts['fpof'] or opts['cpof'] then
80
- local parentData = cjson.decode(rawParentData)
81
- local parentKey = parentData['queueKey'] .. ':' .. parentData['id']
82
- local parentUnsuccesssful = parentKey .. ":unsuccessful"
83
- rcall("ZADD", parentUnsuccesssful, timestamp, jobKey)
84
- if opts['fpof'] then
85
- moveParentToFailedIfNeeded(
86
- parentData['queueKey'],
87
- parentData['queueKey'] .. ':' .. parentData['id'],
88
- parentData['id'],
89
- jobKey,
90
- timestamp
91
- )
92
- elseif opts['cpof'] then
93
- moveParentToWait(parentData['queueKey'], parentKey, parentData['id'], timestamp)
94
- end
95
- elseif opts['idof'] or opts['rdof'] then
96
- local parentData = cjson.decode(rawParentData)
97
- local parentKey = parentData['queueKey'] .. ':' .. parentData['id']
98
- local dependenciesSet = parentKey .. ":dependencies"
99
- if rcall("SREM", dependenciesSet, jobKey) == 1 then
100
- moveParentToWaitIfNeeded(parentData['queueKey'], dependenciesSet,
101
- parentKey, parentData['id'], timestamp)
102
- if opts['idof'] then
103
- local failedSet = parentKey .. ":failed"
104
- rcall("HSET", failedSet, jobKey, failedReason)
105
- end
106
- end
107
- end
108
- end
78
+ moveChildFromDependenciesIfNeeded(rawParentData, jobKey, failedReason, timestamp)
109
79
 
110
80
  removeJobsOnFail(ARGV[5], failedKey, jobId, opts, timestamp)
111
81
 
@@ -273,8 +273,8 @@ local function moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
273
273
  end
274
274
  end
275
275
  local function moveParentToWaitIfNeeded(parentQueueKey, parentDependenciesKey, parentKey, parentId, timestamp)
276
- local hasPendingDependencies = rcall("SCARD", parentDependenciesKey) == 0
277
- if hasPendingDependencies then
276
+ local doNotHavePendingDependencies = rcall("SCARD", parentDependenciesKey) == 0
277
+ if doNotHavePendingDependencies then
278
278
  moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
279
279
  end
280
280
  end
@@ -229,8 +229,8 @@ local function moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
229
229
  end
230
230
  end
231
231
  local function moveParentToWaitIfNeeded(parentQueueKey, parentDependenciesKey, parentKey, parentId, timestamp)
232
- local hasPendingDependencies = rcall("SCARD", parentDependenciesKey) == 0
233
- if hasPendingDependencies then
232
+ local doNotHavePendingDependencies = rcall("SCARD", parentDependenciesKey) == 0
233
+ if doNotHavePendingDependencies then
234
234
  moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
235
235
  end
236
236
  end
@@ -266,8 +266,8 @@ local function moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
266
266
  end
267
267
  end
268
268
  local function moveParentToWaitIfNeeded(parentQueueKey, parentDependenciesKey, parentKey, parentId, timestamp)
269
- local hasPendingDependencies = rcall("SCARD", parentDependenciesKey) == 0
270
- if hasPendingDependencies then
269
+ local doNotHavePendingDependencies = rcall("SCARD", parentDependenciesKey) == 0
270
+ if doNotHavePendingDependencies then
271
271
  moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
272
272
  end
273
273
  end
@@ -239,8 +239,8 @@ local function moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
239
239
  end
240
240
  end
241
241
  local function moveParentToWaitIfNeeded(parentQueueKey, parentDependenciesKey, parentKey, parentId, timestamp)
242
- local hasPendingDependencies = rcall("SCARD", parentDependenciesKey) == 0
243
- if hasPendingDependencies then
242
+ local doNotHavePendingDependencies = rcall("SCARD", parentDependenciesKey) == 0
243
+ if doNotHavePendingDependencies then
244
244
  moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
245
245
  end
246
246
  end
@@ -178,8 +178,8 @@ local function moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
178
178
  end
179
179
  end
180
180
  local function moveParentToWaitIfNeeded(parentQueueKey, parentDependenciesKey, parentKey, parentId, timestamp)
181
- local hasPendingDependencies = rcall("SCARD", parentDependenciesKey) == 0
182
- if hasPendingDependencies then
181
+ local doNotHavePendingDependencies = rcall("SCARD", parentDependenciesKey) == 0
182
+ if doNotHavePendingDependencies then
183
183
  moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
184
184
  end
185
185
  end
@@ -365,7 +365,9 @@ local function removeJobsOnFail(queueKeyPrefix, failedKey, jobId, opts, timestam
365
365
  end
366
366
  end
367
367
  end
368
- local function moveParentToFailedIfNeeded(parentQueueKey, parentKey, parentId, jobIdKey, timestamp)
368
+ local moveParentToFailedIfNeeded
369
+ local moveChildFromDependenciesIfNeeded
370
+ moveParentToFailedIfNeeded = function (parentQueueKey, parentKey, parentId, jobIdKey, timestamp)
369
371
  if rcall("EXISTS", parentKey) == 1 then
370
372
  local parentWaitingChildrenKey = parentQueueKey .. ":waiting-children"
371
373
  local parentDelayedKey = parentQueueKey .. ":delayed"
@@ -393,34 +395,7 @@ local function moveParentToFailedIfNeeded(parentQueueKey, parentKey, parentId, j
393
395
  failedReason, "prev", prevState)
394
396
  local jobAttributes = rcall("HMGET", parentKey, "parent", "deid", "opts")
395
397
  removeDeduplicationKeyIfNeeded(parentQueueKey .. ":", jobAttributes[2])
396
- if jobAttributes[1] then
397
- local parentData = cjson.decode(jobAttributes[1])
398
- local grandParentKey = parentData['queueKey'] .. ':' .. parentData['id']
399
- local grandParentUnsuccesssful = grandParentKey .. ":unsuccessful"
400
- rcall("ZADD", grandParentUnsuccesssful, timestamp, parentKey)
401
- if parentData['fpof'] then
402
- moveParentToFailedIfNeeded(
403
- parentData['queueKey'],
404
- parentData['queueKey'] .. ':' .. parentData['id'],
405
- parentData['id'],
406
- parentKey,
407
- timestamp
408
- )
409
- elseif parentData['cpof'] then
410
- moveParentToWait(parentData['queueKey'], parentKey, parentData['id'], timestamp)
411
- elseif parentData['idof'] or parentData['rdof'] then
412
- local grandParentKey = parentData['queueKey'] .. ':' .. parentData['id']
413
- local grandParentDependenciesSet = grandParentKey .. ":dependencies"
414
- if rcall("SREM", grandParentDependenciesSet, parentKey) == 1 then
415
- moveParentToWaitIfNeeded(parentData['queueKey'], grandParentDependenciesSet,
416
- grandParentKey, parentData['id'], timestamp)
417
- if parentData['idof'] then
418
- local grandParentFailedSet = grandParentKey .. ":failed"
419
- rcall("HSET", grandParentFailedSet, parentKey, failedReason)
420
- end
421
- end
422
- end
423
- end
398
+ moveChildFromDependenciesIfNeeded(jobAttributes[1], parentKey, failedReason, timestamp)
424
399
  local parentRawOpts = jobAttributes[3]
425
400
  local parentOpts = cjson.decode(parentRawOpts)
426
401
  removeJobsOnFail(parentQueuePrefix, parentFailedKey, parentId, parentOpts, timestamp)
@@ -433,6 +408,41 @@ local function moveParentToFailedIfNeeded(parentQueueKey, parentKey, parentId, j
433
408
  end
434
409
  end
435
410
  end
411
+ moveChildFromDependenciesIfNeeded = function (rawParentData, childKey, failedReason, timestamp)
412
+ if rawParentData then
413
+ local parentData = cjson.decode(rawParentData)
414
+ local parentKey = parentData['queueKey'] .. ':' .. parentData['id']
415
+ local parentDependenciesChildrenKey = parentKey .. ":dependencies"
416
+ if parentData['fpof'] then
417
+ if rcall("SREM", parentDependenciesChildrenKey, childKey) == 1 then
418
+ local parentUnsuccesssfulChildrenKey = parentKey .. ":unsuccessful"
419
+ rcall("ZADD", parentUnsuccesssfulChildrenKey, timestamp, childKey)
420
+ moveParentToFailedIfNeeded(
421
+ parentData['queueKey'],
422
+ parentKey,
423
+ parentData['id'],
424
+ childKey,
425
+ timestamp
426
+ )
427
+ end
428
+ elseif parentData['cpof'] then
429
+ if rcall("SREM", parentDependenciesChildrenKey, childKey) == 1 then
430
+ local parentFailedChildrenKey = parentKey .. ":failed"
431
+ rcall("HSET", parentFailedChildrenKey, childKey, failedReason)
432
+ moveParentToWait(parentData['queueKey'], parentKey, parentData['id'], timestamp)
433
+ end
434
+ elseif parentData['idof'] or parentData['rdof'] then
435
+ if rcall("SREM", parentDependenciesChildrenKey, childKey) == 1 then
436
+ moveParentToWaitIfNeeded(parentData['queueKey'], parentDependenciesChildrenKey,
437
+ parentKey, parentData['id'], timestamp)
438
+ if parentData['idof'] then
439
+ local parentFailedChildrenKey = parentKey .. ":failed"
440
+ rcall("HSET", parentFailedChildrenKey, childKey, failedReason)
441
+ end
442
+ end
443
+ end
444
+ end
445
+ end
436
446
  --[[
437
447
  Function to trim events, default 10000.
438
448
  ]]
@@ -507,35 +517,7 @@ if (#stalling > 0) then
507
517
  rcall("HMSET", jobKey, "failedReason", failedReason, "finishedOn", timestamp)
508
518
  rcall("XADD", eventStreamKey, "*", "event", "failed", "jobId", jobId, 'prev', 'active',
509
519
  'failedReason', failedReason)
510
- if rawParentData then
511
- if opts['fpof'] or opts['cpof'] then
512
- local parentData = cjson.decode(rawParentData)
513
- -- TODO: need to remove this job from dependencies set in next breaking change
514
- -- no for now as it would imply a breaking change
515
- local parentKey = parentData['queueKey'] .. ':' .. parentData['id']
516
- local unsuccesssfulSet = parentKey .. ":unsuccessful"
517
- rcall("ZADD", unsuccesssfulSet, timestamp, jobKey)
518
- if opts['fpof'] then
519
- moveParentToFailedIfNeeded(parentData['queueKey'],
520
- parentData['queueKey'] .. ':' .. parentData['id'], parentData['id'], jobKey,
521
- timestamp)
522
- elseif opts['cpof'] then
523
- moveParentToWait(parentData['queueKey'], parentKey, parentData['id'], timestamp)
524
- end
525
- elseif opts['idof'] or opts['rdof'] then
526
- local parentData = cjson.decode(rawParentData)
527
- local parentKey = parentData['queueKey'] .. ':' .. parentData['id']
528
- local dependenciesSet = parentKey .. ":dependencies"
529
- if rcall("SREM", dependenciesSet, jobKey) == 1 then
530
- moveParentToWaitIfNeeded(parentData['queueKey'], dependenciesSet, parentKey,
531
- parentData['id'], timestamp)
532
- if opts['idof'] then
533
- local failedSet = parentKey .. ":failed"
534
- rcall("HSET", failedSet, jobKey, failedReason)
535
- end
536
- end
537
- end
538
- end
520
+ moveChildFromDependenciesIfNeeded(rawParentData, jobKey, failedReason, timestamp)
539
521
  removeJobsOnFail(queueKeyPrefix, failedKey, jobId, opts, timestamp)
540
522
  table.insert(failed, jobId)
541
523
  else
@@ -1 +1 @@
1
- {"version":3,"file":"moveStalledJobsToWait-9.js","sourceRoot":"","sources":["../../../src/scripts/moveStalledJobsToWait-9.ts"],"names":[],"mappings":";;;AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+iBf,CAAC;AACW,QAAA,qBAAqB,GAAG;IACnC,IAAI,EAAE,uBAAuB;IAC7B,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}
1
+ {"version":3,"file":"moveStalledJobsToWait-9.js","sourceRoot":"","sources":["../../../src/scripts/moveStalledJobsToWait-9.ts"],"names":[],"mappings":";;;AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6hBf,CAAC;AACW,QAAA,qBAAqB,GAAG;IACnC,IAAI,EAAE,uBAAuB;IAC7B,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}
@@ -274,8 +274,8 @@ local function moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
274
274
  end
275
275
  end
276
276
  local function moveParentToWaitIfNeeded(parentQueueKey, parentDependenciesKey, parentKey, parentId, timestamp)
277
- local hasPendingDependencies = rcall("SCARD", parentDependenciesKey) == 0
278
- if hasPendingDependencies then
277
+ local doNotHavePendingDependencies = rcall("SCARD", parentDependenciesKey) == 0
278
+ if doNotHavePendingDependencies then
279
279
  moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
280
280
  end
281
281
  end
@@ -461,7 +461,9 @@ local function removeJobsOnFail(queueKeyPrefix, failedKey, jobId, opts, timestam
461
461
  end
462
462
  end
463
463
  end
464
- local function moveParentToFailedIfNeeded(parentQueueKey, parentKey, parentId, jobIdKey, timestamp)
464
+ local moveParentToFailedIfNeeded
465
+ local moveChildFromDependenciesIfNeeded
466
+ moveParentToFailedIfNeeded = function (parentQueueKey, parentKey, parentId, jobIdKey, timestamp)
465
467
  if rcall("EXISTS", parentKey) == 1 then
466
468
  local parentWaitingChildrenKey = parentQueueKey .. ":waiting-children"
467
469
  local parentDelayedKey = parentQueueKey .. ":delayed"
@@ -489,34 +491,7 @@ local function moveParentToFailedIfNeeded(parentQueueKey, parentKey, parentId, j
489
491
  failedReason, "prev", prevState)
490
492
  local jobAttributes = rcall("HMGET", parentKey, "parent", "deid", "opts")
491
493
  removeDeduplicationKeyIfNeeded(parentQueueKey .. ":", jobAttributes[2])
492
- if jobAttributes[1] then
493
- local parentData = cjson.decode(jobAttributes[1])
494
- local grandParentKey = parentData['queueKey'] .. ':' .. parentData['id']
495
- local grandParentUnsuccesssful = grandParentKey .. ":unsuccessful"
496
- rcall("ZADD", grandParentUnsuccesssful, timestamp, parentKey)
497
- if parentData['fpof'] then
498
- moveParentToFailedIfNeeded(
499
- parentData['queueKey'],
500
- parentData['queueKey'] .. ':' .. parentData['id'],
501
- parentData['id'],
502
- parentKey,
503
- timestamp
504
- )
505
- elseif parentData['cpof'] then
506
- moveParentToWait(parentData['queueKey'], parentKey, parentData['id'], timestamp)
507
- elseif parentData['idof'] or parentData['rdof'] then
508
- local grandParentKey = parentData['queueKey'] .. ':' .. parentData['id']
509
- local grandParentDependenciesSet = grandParentKey .. ":dependencies"
510
- if rcall("SREM", grandParentDependenciesSet, parentKey) == 1 then
511
- moveParentToWaitIfNeeded(parentData['queueKey'], grandParentDependenciesSet,
512
- grandParentKey, parentData['id'], timestamp)
513
- if parentData['idof'] then
514
- local grandParentFailedSet = grandParentKey .. ":failed"
515
- rcall("HSET", grandParentFailedSet, parentKey, failedReason)
516
- end
517
- end
518
- end
519
- end
494
+ moveChildFromDependenciesIfNeeded(jobAttributes[1], parentKey, failedReason, timestamp)
520
495
  local parentRawOpts = jobAttributes[3]
521
496
  local parentOpts = cjson.decode(parentRawOpts)
522
497
  removeJobsOnFail(parentQueuePrefix, parentFailedKey, parentId, parentOpts, timestamp)
@@ -529,6 +504,41 @@ local function moveParentToFailedIfNeeded(parentQueueKey, parentKey, parentId, j
529
504
  end
530
505
  end
531
506
  end
507
+ moveChildFromDependenciesIfNeeded = function (rawParentData, childKey, failedReason, timestamp)
508
+ if rawParentData then
509
+ local parentData = cjson.decode(rawParentData)
510
+ local parentKey = parentData['queueKey'] .. ':' .. parentData['id']
511
+ local parentDependenciesChildrenKey = parentKey .. ":dependencies"
512
+ if parentData['fpof'] then
513
+ if rcall("SREM", parentDependenciesChildrenKey, childKey) == 1 then
514
+ local parentUnsuccesssfulChildrenKey = parentKey .. ":unsuccessful"
515
+ rcall("ZADD", parentUnsuccesssfulChildrenKey, timestamp, childKey)
516
+ moveParentToFailedIfNeeded(
517
+ parentData['queueKey'],
518
+ parentKey,
519
+ parentData['id'],
520
+ childKey,
521
+ timestamp
522
+ )
523
+ end
524
+ elseif parentData['cpof'] then
525
+ if rcall("SREM", parentDependenciesChildrenKey, childKey) == 1 then
526
+ local parentFailedChildrenKey = parentKey .. ":failed"
527
+ rcall("HSET", parentFailedChildrenKey, childKey, failedReason)
528
+ moveParentToWait(parentData['queueKey'], parentKey, parentData['id'], timestamp)
529
+ end
530
+ elseif parentData['idof'] or parentData['rdof'] then
531
+ if rcall("SREM", parentDependenciesChildrenKey, childKey) == 1 then
532
+ moveParentToWaitIfNeeded(parentData['queueKey'], parentDependenciesChildrenKey,
533
+ parentKey, parentData['id'], timestamp)
534
+ if parentData['idof'] then
535
+ local parentFailedChildrenKey = parentKey .. ":failed"
536
+ rcall("HSET", parentFailedChildrenKey, childKey, failedReason)
537
+ end
538
+ end
539
+ end
540
+ end
541
+ end
532
542
  --[[
533
543
  Function to move job from wait state to active.
534
544
  Input:
@@ -685,7 +695,7 @@ if rcall("EXISTS", jobIdKey) == 1 then -- Make sure job exists
685
695
  local parentKey = jobAttributes[1] or ""
686
696
  local parentId = ""
687
697
  local parentQueueKey = ""
688
- if jobAttributes[2] then
698
+ if jobAttributes[2] then -- TODO: need to revisit this logic if it's still needed
689
699
  local jsonDecodedParent = cjson.decode(jobAttributes[2])
690
700
  parentId = jsonDecodedParent['id']
691
701
  parentQueueKey = jsonDecodedParent['queueKey']
@@ -720,26 +730,7 @@ if rcall("EXISTS", jobIdKey) == 1 then -- Make sure job exists
720
730
  timestamp)
721
731
  end
722
732
  else
723
- if opts['fpof'] or opts['cpof'] then
724
- local unsuccesssfulSet = parentKey .. ":unsuccessful"
725
- rcall("ZADD", unsuccesssfulSet, timestamp, jobIdKey)
726
- if opts['fpof'] then
727
- moveParentToFailedIfNeeded(parentQueueKey, parentKey, parentId, jobIdKey, timestamp)
728
- elseif opts['cpof'] then
729
- local failedSet = parentKey .. ":failed"
730
- rcall("HSET", failedSet, jobIdKey, ARGV[4])
731
- moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
732
- end
733
- elseif opts['idof'] or opts['rdof'] then
734
- local dependenciesSet = parentKey .. ":dependencies"
735
- if rcall("SREM", dependenciesSet, jobIdKey) == 1 then
736
- moveParentToWaitIfNeeded(parentQueueKey, dependenciesSet, parentKey, parentId, timestamp)
737
- if opts['idof'] then
738
- local failedSet = parentKey .. ":failed"
739
- rcall("HSET", failedSet, jobIdKey, ARGV[4])
740
- end
741
- end
742
- end
733
+ moveChildFromDependenciesIfNeeded(jobAttributes[2], jobIdKey, ARGV[4], timestamp)
743
734
  end
744
735
  end
745
736
  local attemptsMade = rcall("HINCRBY", jobIdKey, "atm", 1)
@@ -1 +1 @@
1
- {"version":3,"file":"moveToFinished-14.js","sourceRoot":"","sources":["../../../src/scripts/moveToFinished-14.ts"],"names":[],"mappings":";;;AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAu0Bf,CAAC;AACW,QAAA,cAAc,GAAG;IAC5B,IAAI,EAAE,gBAAgB;IACtB,OAAO;IACP,IAAI,EAAE,EAAE;CACT,CAAC"}
1
+ {"version":3,"file":"moveToFinished-14.js","sourceRoot":"","sources":["../../../src/scripts/moveToFinished-14.ts"],"names":[],"mappings":";;;AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8zBf,CAAC;AACW,QAAA,cAAc,GAAG;IAC5B,IAAI,EAAE,gBAAgB;IACtB,OAAO;IACP,IAAI,EAAE,EAAE;CACT,CAAC"}
@@ -175,8 +175,8 @@ local function moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
175
175
  end
176
176
  end
177
177
  local function moveParentToWaitIfNeeded(parentQueueKey, parentDependenciesKey, parentKey, parentId, timestamp)
178
- local hasPendingDependencies = rcall("SCARD", parentDependenciesKey) == 0
179
- if hasPendingDependencies then
178
+ local doNotHavePendingDependencies = rcall("SCARD", parentDependenciesKey) == 0
179
+ if doNotHavePendingDependencies then
180
180
  moveParentToWait(parentQueueKey, parentKey, parentId, timestamp)
181
181
  end
182
182
  end
@@ -362,7 +362,9 @@ local function removeJobsOnFail(queueKeyPrefix, failedKey, jobId, opts, timestam
362
362
  end
363
363
  end
364
364
  end
365
- local function moveParentToFailedIfNeeded(parentQueueKey, parentKey, parentId, jobIdKey, timestamp)
365
+ local moveParentToFailedIfNeeded
366
+ local moveChildFromDependenciesIfNeeded
367
+ moveParentToFailedIfNeeded = function (parentQueueKey, parentKey, parentId, jobIdKey, timestamp)
366
368
  if rcall("EXISTS", parentKey) == 1 then
367
369
  local parentWaitingChildrenKey = parentQueueKey .. ":waiting-children"
368
370
  local parentDelayedKey = parentQueueKey .. ":delayed"
@@ -390,34 +392,7 @@ local function moveParentToFailedIfNeeded(parentQueueKey, parentKey, parentId, j
390
392
  failedReason, "prev", prevState)
391
393
  local jobAttributes = rcall("HMGET", parentKey, "parent", "deid", "opts")
392
394
  removeDeduplicationKeyIfNeeded(parentQueueKey .. ":", jobAttributes[2])
393
- if jobAttributes[1] then
394
- local parentData = cjson.decode(jobAttributes[1])
395
- local grandParentKey = parentData['queueKey'] .. ':' .. parentData['id']
396
- local grandParentUnsuccesssful = grandParentKey .. ":unsuccessful"
397
- rcall("ZADD", grandParentUnsuccesssful, timestamp, parentKey)
398
- if parentData['fpof'] then
399
- moveParentToFailedIfNeeded(
400
- parentData['queueKey'],
401
- parentData['queueKey'] .. ':' .. parentData['id'],
402
- parentData['id'],
403
- parentKey,
404
- timestamp
405
- )
406
- elseif parentData['cpof'] then
407
- moveParentToWait(parentData['queueKey'], parentKey, parentData['id'], timestamp)
408
- elseif parentData['idof'] or parentData['rdof'] then
409
- local grandParentKey = parentData['queueKey'] .. ':' .. parentData['id']
410
- local grandParentDependenciesSet = grandParentKey .. ":dependencies"
411
- if rcall("SREM", grandParentDependenciesSet, parentKey) == 1 then
412
- moveParentToWaitIfNeeded(parentData['queueKey'], grandParentDependenciesSet,
413
- grandParentKey, parentData['id'], timestamp)
414
- if parentData['idof'] then
415
- local grandParentFailedSet = grandParentKey .. ":failed"
416
- rcall("HSET", grandParentFailedSet, parentKey, failedReason)
417
- end
418
- end
419
- end
420
- end
395
+ moveChildFromDependenciesIfNeeded(jobAttributes[1], parentKey, failedReason, timestamp)
421
396
  local parentRawOpts = jobAttributes[3]
422
397
  local parentOpts = cjson.decode(parentRawOpts)
423
398
  removeJobsOnFail(parentQueuePrefix, parentFailedKey, parentId, parentOpts, timestamp)
@@ -430,6 +405,41 @@ local function moveParentToFailedIfNeeded(parentQueueKey, parentKey, parentId, j
430
405
  end
431
406
  end
432
407
  end
408
+ moveChildFromDependenciesIfNeeded = function (rawParentData, childKey, failedReason, timestamp)
409
+ if rawParentData then
410
+ local parentData = cjson.decode(rawParentData)
411
+ local parentKey = parentData['queueKey'] .. ':' .. parentData['id']
412
+ local parentDependenciesChildrenKey = parentKey .. ":dependencies"
413
+ if parentData['fpof'] then
414
+ if rcall("SREM", parentDependenciesChildrenKey, childKey) == 1 then
415
+ local parentUnsuccesssfulChildrenKey = parentKey .. ":unsuccessful"
416
+ rcall("ZADD", parentUnsuccesssfulChildrenKey, timestamp, childKey)
417
+ moveParentToFailedIfNeeded(
418
+ parentData['queueKey'],
419
+ parentKey,
420
+ parentData['id'],
421
+ childKey,
422
+ timestamp
423
+ )
424
+ end
425
+ elseif parentData['cpof'] then
426
+ if rcall("SREM", parentDependenciesChildrenKey, childKey) == 1 then
427
+ local parentFailedChildrenKey = parentKey .. ":failed"
428
+ rcall("HSET", parentFailedChildrenKey, childKey, failedReason)
429
+ moveParentToWait(parentData['queueKey'], parentKey, parentData['id'], timestamp)
430
+ end
431
+ elseif parentData['idof'] or parentData['rdof'] then
432
+ if rcall("SREM", parentDependenciesChildrenKey, childKey) == 1 then
433
+ moveParentToWaitIfNeeded(parentData['queueKey'], parentDependenciesChildrenKey,
434
+ parentKey, parentData['id'], timestamp)
435
+ if parentData['idof'] then
436
+ local parentFailedChildrenKey = parentKey .. ":failed"
437
+ rcall("HSET", parentFailedChildrenKey, childKey, failedReason)
438
+ end
439
+ end
440
+ end
441
+ end
442
+ end
433
443
  local function removeLock(jobKey, stalledKey, token, jobId)
434
444
  if token ~= "0" then
435
445
  local lockKey = jobKey .. ':lock'
@@ -472,37 +482,7 @@ if rcall("EXISTS", jobKey) == 1 then
472
482
  local rawParentData = jobAttributes[1]
473
483
  local rawOpts = jobAttributes[3]
474
484
  local opts = cjson.decode(rawOpts)
475
- if rawParentData ~= false then
476
- if opts['fpof'] or opts['cpof'] then
477
- local parentData = cjson.decode(rawParentData)
478
- local parentKey = parentData['queueKey'] .. ':' .. parentData['id']
479
- local parentUnsuccesssful = parentKey .. ":unsuccessful"
480
- rcall("ZADD", parentUnsuccesssful, timestamp, jobKey)
481
- if opts['fpof'] then
482
- moveParentToFailedIfNeeded(
483
- parentData['queueKey'],
484
- parentData['queueKey'] .. ':' .. parentData['id'],
485
- parentData['id'],
486
- jobKey,
487
- timestamp
488
- )
489
- elseif opts['cpof'] then
490
- moveParentToWait(parentData['queueKey'], parentKey, parentData['id'], timestamp)
491
- end
492
- elseif opts['idof'] or opts['rdof'] then
493
- local parentData = cjson.decode(rawParentData)
494
- local parentKey = parentData['queueKey'] .. ':' .. parentData['id']
495
- local dependenciesSet = parentKey .. ":dependencies"
496
- if rcall("SREM", dependenciesSet, jobKey) == 1 then
497
- moveParentToWaitIfNeeded(parentData['queueKey'], dependenciesSet,
498
- parentKey, parentData['id'], timestamp)
499
- if opts['idof'] then
500
- local failedSet = parentKey .. ":failed"
501
- rcall("HSET", failedSet, jobKey, failedReason)
502
- end
503
- end
504
- end
505
- end
485
+ moveChildFromDependenciesIfNeeded(rawParentData, jobKey, failedReason, timestamp)
506
486
  removeJobsOnFail(ARGV[5], failedKey, jobId, opts, timestamp)
507
487
  return 0
508
488
  else
@@ -1 +1 @@
1
- {"version":3,"file":"moveToWaitingChildren-8.js","sourceRoot":"","sources":["../../../src/scripts/moveToWaitingChildren-8.ts"],"names":[],"mappings":";;;AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+gBf,CAAC;AACW,QAAA,qBAAqB,GAAG;IACnC,IAAI,EAAE,uBAAuB;IAC7B,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}
1
+ {"version":3,"file":"moveToWaitingChildren-8.js","sourceRoot":"","sources":["../../../src/scripts/moveToWaitingChildren-8.ts"],"names":[],"mappings":";;;AAAA,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2ff,CAAC;AACW,QAAA,qBAAqB,GAAG;IACnC,IAAI,EAAE,uBAAuB;IAC7B,OAAO;IACP,IAAI,EAAE,CAAC;CACR,CAAC"}