bullmq 5.47.1 → 5.47.2
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.
- package/dist/cjs/classes/scripts.js +1 -1
- package/dist/cjs/classes/scripts.js.map +1 -1
- package/dist/cjs/commands/includes/{moveParentToFailedIfNeeded.lua → moveChildFromDependenciesIfNeeded.lua} +40 -29
- package/dist/cjs/commands/includes/moveParentToWaitIfNeeded.lua +2 -2
- package/dist/cjs/commands/moveStalledJobsToWait-9.lua +2 -31
- package/dist/cjs/commands/moveToFinished-14.lua +3 -23
- package/dist/cjs/commands/moveToWaitingChildren-8.lua +2 -32
- package/dist/cjs/scripts/addDelayedJob-6.js +2 -2
- package/dist/cjs/scripts/addParentJob-4.js +2 -2
- package/dist/cjs/scripts/addPrioritizedJob-8.js +2 -2
- package/dist/cjs/scripts/addStandardJob-8.js +2 -2
- package/dist/cjs/scripts/moveStalledJobsToWait-9.js +42 -60
- package/dist/cjs/scripts/moveStalledJobsToWait-9.js.map +1 -1
- package/dist/cjs/scripts/moveToFinished-14.js +43 -52
- package/dist/cjs/scripts/moveToFinished-14.js.map +1 -1
- package/dist/cjs/scripts/moveToWaitingChildren-8.js +42 -62
- package/dist/cjs/scripts/moveToWaitingChildren-8.js.map +1 -1
- package/dist/cjs/tsconfig-cjs.tsbuildinfo +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/classes/scripts.js +1 -1
- package/dist/esm/classes/scripts.js.map +1 -1
- package/dist/esm/commands/includes/{moveParentToFailedIfNeeded.lua → moveChildFromDependenciesIfNeeded.lua} +40 -29
- package/dist/esm/commands/includes/moveParentToWaitIfNeeded.lua +2 -2
- package/dist/esm/commands/moveStalledJobsToWait-9.lua +2 -31
- package/dist/esm/commands/moveToFinished-14.lua +3 -23
- package/dist/esm/commands/moveToWaitingChildren-8.lua +2 -32
- package/dist/esm/scripts/addDelayedJob-6.js +2 -2
- package/dist/esm/scripts/addParentJob-4.js +2 -2
- package/dist/esm/scripts/addPrioritizedJob-8.js +2 -2
- package/dist/esm/scripts/addStandardJob-8.js +2 -2
- package/dist/esm/scripts/moveStalledJobsToWait-9.js +42 -60
- package/dist/esm/scripts/moveStalledJobsToWait-9.js.map +1 -1
- package/dist/esm/scripts/moveToFinished-14.js +43 -52
- package/dist/esm/scripts/moveToFinished-14.js.map +1 -1
- package/dist/esm/scripts/moveToWaitingChildren-8.js +42 -62
- package/dist/esm/scripts/moveToWaitingChildren-8.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/package.json +1 -1
@@ -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
|
278
|
-
if
|
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
|
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
|
-
|
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
|
-
|
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
|
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
|
179
|
-
if
|
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
|
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
|
-
|
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
|
-
|
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
|
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"}
|