@relaybus/testing 0.3.1 → 0.4.1

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/contract/contract-fixtures.ts","../src/contract/append-and-claim.ts","../src/contract/fencing-and-retries.ts","../src/contract/queries-and-purge.ts","../src/contract/ordering-and-leases.ts","../src/contract/completion.ts","../src/contract/lost-leases.ts","../src/event-store-contract.ts","../src/fake-clock.ts","../src/in-memory-transport.ts"],"names":["createUuidV7","beforeEach","describe","it","expect","afterEach"],"mappings":"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","file":"index.cjs","sourcesContent":["import { createUuidV7, type EventEnvelope, type NewDelivery } from '@relaybus/core';\n\n// The fixed clock, events and deliveries of the store contract suite.\n\nexport interface Deferred {\n readonly promise: Promise<void>;\n readonly resolve: () => void;\n}\n\nexport function createDeferred(): Deferred {\n let resolve!: () => void;\n const promise = new Promise<void>((onResolve) => {\n resolve = onResolve;\n });\n return { promise, resolve };\n}\n\nconst BASE_TIME = Date.parse('2026-01-01T00:00:00.000Z');\nexport const LEASE_MS = 30_000;\n\nexport function at(offsetMs: number): Date {\n return new Date(BASE_TIME + offsetMs);\n}\n\nexport function createEnvelope(overrides: Partial<EventEnvelope> = {}): EventEnvelope {\n return {\n id: createUuidV7(),\n type: 'contract.event.v1',\n source: 'contract-suite',\n key: null,\n payload: { value: 1 },\n headers: {},\n correlationId: null,\n causationId: null,\n occurredAt: at(0),\n ...overrides,\n };\n}\n\nexport function createDelivery(handler: string, availableAt: Date = at(0)): NewDelivery {\n return { id: createUuidV7(), handler, availableAt };\n}\n","import { createUuidV7, type ClaimedDelivery, type EventStore } from '@relaybus/core';\nimport { beforeEach, describe, expect, it } from 'vitest';\nimport { at, createEnvelope, createDelivery, LEASE_MS } from './contract-fixtures.js';\nimport type { ContractSuite } from './contract-suite.js';\n\n/** Setup, append and claim. */\nexport function appendAndClaimContract<TTransaction>(suite: ContractSuite<TTransaction>): void {\n const { append, claim } = suite;\n let store!: EventStore<TTransaction>;\n\n beforeEach(() => {\n store = suite.store();\n });\n\n describe('setup', () => {\n it('can run more than once', async () => {\n await store.setup?.();\n await store.setup?.();\n expect(await store.statistics(at(0))).toMatchObject({ pending: 0 });\n });\n });\n\n describe('append', () => {\n it('stores events and deliveries when the transaction commits', async () => {\n const event = createEnvelope();\n const result = await append([\n { event, deliveries: [createDelivery('handler-a'), createDelivery('handler-b')] },\n ]);\n expect(result).toEqual({\n appendedEventIds: [event.id],\n duplicateEventIds: [],\n appendedDeliveryCount: 2,\n });\n const records = await store.listDeliveries({ eventId: event.id });\n expect(records.map((record) => record.handler).sort()).toEqual(['handler-a', 'handler-b']);\n expect(records.every((record) => record.status === 'pending' && record.attempts === 0)).toBe(\n true,\n );\n });\n\n it('stores nothing when the transaction rolls back', async () => {\n const event = createEnvelope();\n const failure = new Error('rollback');\n await expect(\n store.transaction(async (transaction) => {\n await store.append(\n transaction,\n [{ event, deliveries: [createDelivery('handler-a')] }],\n at(0),\n );\n throw failure;\n }),\n ).rejects.toBe(failure);\n expect(await store.listDeliveries({})).toEqual([]);\n expect(await claim(['handler-a'])).toEqual([]);\n });\n\n it('returns the value of the transaction work', async () => {\n await expect(store.transaction(async () => 'result')).resolves.toBe('result');\n });\n\n it('round-trips the envelope exactly as JSON would', async () => {\n const event = createEnvelope({\n key: 'order-42',\n payload: { text: 'çğıöşü 🚀', nested: { list: [1, 'two', null, true] }, amount: 12.5 },\n headers: { traceparent: '00-abc-def-01', tenant: 'acme' },\n correlationId: createUuidV7(),\n causationId: createUuidV7(),\n occurredAt: new Date('2026-03-04T05:06:07.089Z'),\n });\n await append([{ event, deliveries: [createDelivery('handler-a')] }]);\n const [claimed] = await claim(['handler-a']);\n expect(claimed!.event).toEqual(event);\n expect(claimed!.event.occurredAt).toBeInstanceOf(Date);\n });\n\n it('skips an event id that already exists but adds its missing deliveries', async () => {\n const event = createEnvelope();\n await append([{ event, deliveries: [createDelivery('handler-a')] }]);\n const result = await append([\n { event, deliveries: [createDelivery('handler-a'), createDelivery('handler-b')] },\n ]);\n expect(result).toEqual({\n appendedEventIds: [],\n duplicateEventIds: [event.id],\n appendedDeliveryCount: 1,\n });\n const records = await store.listDeliveries({ eventId: event.id });\n expect(records.map((record) => record.handler).sort()).toEqual(['handler-a', 'handler-b']);\n });\n\n it('deduplicates repeated events and handlers inside one call', async () => {\n const event = createEnvelope();\n const result = await append([\n { event, deliveries: [createDelivery('handler-a'), createDelivery('handler-a')] },\n { event, deliveries: [createDelivery('handler-a')] },\n ]);\n expect(result.appendedEventIds).toEqual([event.id]);\n expect(result.duplicateEventIds).toEqual([event.id]);\n expect(result.appendedDeliveryCount).toBe(1);\n expect(await store.listDeliveries({})).toHaveLength(1);\n });\n\n it('keeps events written by concurrent transactions apart', async () => {\n const events = Array.from({ length: 20 }, () => createEnvelope());\n await Promise.all(\n events.map((event) => append([{ event, deliveries: [createDelivery('handler-a')] }])),\n );\n expect(await store.listDeliveries({ limit: 1_000 })).toHaveLength(20);\n });\n });\n\n describe('claim', () => {\n it('leases due deliveries of the requested handlers and counts the attempt', async () => {\n const event = createEnvelope();\n await append([\n { event, deliveries: [createDelivery('handler-a'), createDelivery('handler-b')] },\n ]);\n const claimed = await claim(['handler-a'], at(1_000));\n expect(claimed).toHaveLength(1);\n expect(claimed[0]).toMatchObject({\n handler: 'handler-a',\n attempt: 1,\n leaseExpiresAt: at(1_000 + LEASE_MS),\n });\n expect(claimed[0]!.leaseToken).toEqual(expect.any(String));\n const [record] = await store.listDeliveries({ handler: 'handler-a' });\n expect(record).toMatchObject({ status: 'processing', attempts: 1, leaseOwner: 'worker-1' });\n expect(record!.leaseExpiresAt).toEqual(at(1_000 + LEASE_MS));\n });\n\n it('ignores deliveries that are not due yet', async () => {\n await append([\n { event: createEnvelope(), deliveries: [createDelivery('handler-a', at(5_000))] },\n ]);\n expect(await claim(['handler-a'], at(4_999))).toEqual([]);\n expect(await claim(['handler-a'], at(5_000))).toHaveLength(1);\n });\n\n it('returns nothing for an empty handler list', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n expect(await claim([])).toEqual([]);\n });\n\n it('respects the limit and claims the earliest due first', async () => {\n const late = createEnvelope();\n const early = createEnvelope();\n const middle = createEnvelope();\n await append([\n { event: late, deliveries: [createDelivery('handler-a', at(300))] },\n { event: early, deliveries: [createDelivery('handler-a', at(100))] },\n { event: middle, deliveries: [createDelivery('handler-a', at(200))] },\n ]);\n const first = await claim(['handler-a'], at(1_000), 2);\n expect(first.map((delivery) => delivery.event.id)).toEqual([early.id, middle.id]);\n const second = await claim(['handler-a'], at(1_000), 2);\n expect(second.map((delivery) => delivery.event.id)).toEqual([late.id]);\n });\n\n it('breaks ties between equally due deliveries by delivery id', async () => {\n const ids = [createUuidV7(), createUuidV7(), createUuidV7()].sort();\n await append([\n {\n event: createEnvelope(),\n deliveries: [{ id: ids[2]!, handler: 'handler-a', availableAt: at(0) }],\n },\n {\n event: createEnvelope(),\n deliveries: [{ id: ids[0]!, handler: 'handler-a', availableAt: at(0) }],\n },\n {\n event: createEnvelope(),\n deliveries: [{ id: ids[1]!, handler: 'handler-a', availableAt: at(0) }],\n },\n ]);\n const claimed = await claim(['handler-a'], at(0), 3);\n expect(claimed.map((delivery) => delivery.deliveryId)).toEqual(ids);\n });\n\n it('does not hand out a leased delivery until its lease expires', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [first] = await claim(['handler-a'], at(0));\n expect(await claim(['handler-a'], at(LEASE_MS - 1), 100, 'worker-2')).toEqual([]);\n const [second] = await claim(['handler-a'], at(LEASE_MS), 100, 'worker-2');\n expect(second).toMatchObject({ deliveryId: first!.deliveryId, attempt: 2 });\n expect(second!.leaseToken).not.toBe(first!.leaseToken);\n });\n\n it('never gives the same delivery to two concurrent claimers', async () => {\n const entries = Array.from({ length: 40 }, () => ({\n event: createEnvelope(),\n deliveries: [createDelivery('handler-a')],\n }));\n await append(entries);\n // A store may lease groups of deliveries to one claimer at a time, so a claimer that\n // keeps claiming is what drains the workload; whatever nobody holds is left for a late one.\n const batches = await Promise.all(\n Array.from({ length: 8 }, async (_, index) => {\n const own: ClaimedDelivery[] = [];\n for (;;) {\n const batch = await claim(['handler-a'], at(0), 10, `worker-${index}`);\n if (batch.length === 0) {\n return own;\n }\n own.push(...batch);\n }\n }),\n );\n const leftovers = await claim(['handler-a'], at(0), 100, 'worker-late');\n const claimedIds = [...batches.flat(), ...leftovers].map((delivery) => delivery.deliveryId);\n expect(new Set(claimedIds).size).toBe(claimedIds.length);\n expect(claimedIds).toHaveLength(40);\n });\n });\n}\n","import { createUuidV7, type EventStore } from '@relaybus/core';\nimport { beforeEach, describe, expect, it } from 'vitest';\nimport { at, createEnvelope, createDelivery, LEASE_MS } from './contract-fixtures.js';\nimport type { ContractSuite } from './contract-suite.js';\n\n/** Fencing by lease token, retries, dead letters and ordering keys. */\nexport function fencingContract<TTransaction>(suite: ContractSuite<TTransaction>): void {\n const { append, claim, keepsCompleted } = suite;\n let store!: EventStore<TTransaction>;\n\n beforeEach(() => {\n store = suite.store();\n });\n\n describe('fencing', () => {\n it('completes a delivery only with its current lease', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [stale] = await claim(['handler-a'], at(0));\n const [current] = await claim(['handler-a'], at(LEASE_MS), 100, 'worker-2');\n expect(await store.complete(stale!, at(LEASE_MS + 1))).toBe(false);\n expect(await store.extendLease(stale!, at(LEASE_MS * 3), at(LEASE_MS + 1))).toBe(false);\n expect(\n await store.reschedule(stale!, at(0), { name: 'Error', message: 'x' }, at(LEASE_MS + 1)),\n ).toBe(false);\n expect(await store.bury(stale!, { name: 'Error', message: 'x' }, at(LEASE_MS + 1))).toBe(\n false,\n );\n expect(await store.complete(current!, at(LEASE_MS + 2))).toBe(true);\n if (!keepsCompleted) {\n expect(await store.listDeliveries({})).toEqual([]);\n return;\n }\n const [record] = await store.listDeliveries({});\n expect(record).toMatchObject({\n status: 'completed',\n leaseOwner: null,\n leaseExpiresAt: null,\n });\n expect(record!.completedAt).toEqual(at(LEASE_MS + 2));\n });\n\n it('refuses to complete twice', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [delivery] = await claim(['handler-a']);\n expect(await store.complete(delivery!, at(1))).toBe(true);\n expect(await store.complete(delivery!, at(2))).toBe(false);\n });\n\n it('refuses leases of unknown deliveries', async () => {\n const lease = { deliveryId: createUuidV7(), leaseToken: createUuidV7() };\n expect(await store.complete(lease, at(0))).toBe(false);\n expect(await store.extendLease(lease, at(1), at(0))).toBe(false);\n });\n\n it('extends a held lease', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [delivery] = await claim(['handler-a']);\n expect(await store.extendLease(delivery!, at(LEASE_MS * 2), at(10))).toBe(true);\n expect(await claim(['handler-a'], at(LEASE_MS + 1), 100, 'worker-2')).toEqual([]);\n const [record] = await store.listDeliveries({});\n expect(record!.leaseExpiresAt).toEqual(at(LEASE_MS * 2));\n });\n\n it('completes inside a transaction together with it', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [delivery] = await claim(['handler-a']);\n await expect(\n store.transaction(async (transaction) => {\n expect(await store.complete(delivery!, at(1), transaction)).toBe(true);\n throw new Error('rollback');\n }),\n ).rejects.toThrow('rollback');\n expect((await store.listDeliveries({}))[0]!.status).toBe('processing');\n await store.transaction(async (transaction) => {\n expect(await store.complete(delivery!, at(2), transaction)).toBe(true);\n });\n if (keepsCompleted) {\n expect((await store.listDeliveries({}))[0]!.status).toBe('completed');\n } else {\n expect(await store.listDeliveries({})).toEqual([]);\n }\n });\n\n it('refuses a transactional completion with a lost lease', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [stale] = await claim(['handler-a'], at(0));\n await claim(['handler-a'], at(LEASE_MS), 100, 'worker-2');\n await store.transaction(async (transaction) => {\n expect(await store.complete(stale!, at(LEASE_MS + 1), transaction)).toBe(false);\n });\n expect((await store.listDeliveries({}))[0]!.status).toBe('processing');\n });\n });\n\n describe('retries and dead letters', () => {\n it('reschedules a delivery with its error', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [delivery] = await claim(['handler-a']);\n const error = { name: 'TypeError', message: 'boom', stack: 'TypeError: boom\\n at x' };\n expect(await store.reschedule(delivery!, at(10_000), error, at(5))).toBe(true);\n const [record] = await store.listDeliveries({});\n expect(record).toMatchObject({\n status: 'pending',\n attempts: 1,\n lastError: error,\n leaseOwner: null,\n });\n expect(record!.availableAt).toEqual(at(10_000));\n expect(await claim(['handler-a'], at(9_999))).toEqual([]);\n const [retry] = await claim(['handler-a'], at(10_000));\n expect(retry!.attempt).toBe(2);\n });\n\n it('buries a delivery so it is never claimed again', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [delivery] = await claim(['handler-a']);\n const error = { name: 'Error', message: 'fatal' };\n expect(await store.bury(delivery!, error, at(5))).toBe(true);\n expect(await claim(['handler-a'], at(LEASE_MS * 10))).toEqual([]);\n const [record] = await store.listDeliveries({ status: 'dead' });\n expect(record).toMatchObject({ status: 'dead', lastError: error });\n expect(record!.updatedAt).toEqual(at(5));\n });\n\n it('requeues only dead deliveries, with a fresh attempt budget', async () => {\n const event = createEnvelope();\n await append([\n { event, deliveries: [createDelivery('handler-a'), createDelivery('handler-b')] },\n ]);\n const [dead] = await claim(['handler-a']);\n await store.bury(dead!, { name: 'Error', message: 'fatal' }, at(1));\n const [pending] = await store.listDeliveries({ handler: 'handler-b' });\n const moved = await store.requeue(\n [dead!.deliveryId, dead!.deliveryId, pending!.id, createUuidV7()],\n at(100),\n );\n expect(moved).toBe(1);\n const [record] = await store.listDeliveries({ handler: 'handler-a' });\n expect(record).toMatchObject({ status: 'pending', attempts: 0 });\n expect(record!.availableAt).toEqual(at(100));\n const [again] = await claim(['handler-a'], at(100));\n expect(again!.attempt).toBe(1);\n });\n });\n\n describe('ordering keys', () => {\n async function appendKeyed(key: string, count: number, handlers = ['handler-a']) {\n const events = Array.from({ length: count }, () => createEnvelope({ key }));\n for (const event of events) {\n await append([{ event, deliveries: handlers.map((handler) => createDelivery(handler)) }]);\n }\n return events;\n }\n\n it('hands out one delivery per handler and key, in publish order', async () => {\n const [first, second, third] = await appendKeyed('order-1', 3);\n const batch1 = await claim(['handler-a']);\n expect(batch1.map((delivery) => delivery.event.id)).toEqual([first!.id]);\n expect(await claim(['handler-a'])).toEqual([]);\n await store.complete(batch1[0]!, at(1));\n const batch2 = await claim(['handler-a']);\n expect(batch2.map((delivery) => delivery.event.id)).toEqual([second!.id]);\n await store.complete(batch2[0]!, at(2));\n expect((await claim(['handler-a'])).map((delivery) => delivery.event.id)).toEqual([\n third!.id,\n ]);\n });\n\n it('keeps later events waiting while the head is retrying', async () => {\n const [first, second] = await appendKeyed('order-1', 2);\n const [head] = await claim(['handler-a']);\n await store.reschedule(head!, at(60_000), { name: 'Error', message: 'retry' }, at(1));\n expect(await claim(['handler-a'], at(30_000))).toEqual([]);\n const [retried] = await claim(['handler-a'], at(60_000));\n expect(retried!.event.id).toBe(first!.id);\n await store.complete(retried!, at(60_001));\n expect((await claim(['handler-a'], at(60_002)))[0]!.event.id).toBe(second!.id);\n });\n\n it('releases the key when the head is dead-lettered', async () => {\n const [, second] = await appendKeyed('order-1', 2);\n const [head] = await claim(['handler-a']);\n await store.bury(head!, { name: 'Error', message: 'fatal' }, at(1));\n expect((await claim(['handler-a']))[0]!.event.id).toBe(second!.id);\n });\n\n it('orders each handler independently', async () => {\n const [first, second] = await appendKeyed('order-1', 2, ['handler-a', 'handler-b']);\n const [fromA] = await claim(['handler-a']);\n await store.complete(fromA!, at(1));\n const [nextA] = await claim(['handler-a']);\n expect(nextA!.event.id).toBe(second!.id);\n const [fromB] = await claim(['handler-b']);\n expect(fromB!.event.id).toBe(first!.id);\n });\n\n it('runs different keys and unkeyed events in parallel', async () => {\n await appendKeyed('order-1', 2);\n await appendKeyed('order-2', 2);\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n expect(await claim(['handler-a'])).toHaveLength(3);\n });\n\n it('orders concurrent publishers of the same key by commit', async () => {\n const events = Array.from({ length: 10 }, (_, index) =>\n createEnvelope({ key: 'shared', payload: { index } }),\n );\n await Promise.all(\n events.map((event) => append([{ event, deliveries: [createDelivery('handler-a')] }])),\n );\n const seen: string[] = [];\n for (let round = 0; round < 10; round += 1) {\n const batch = await claim(['handler-a']);\n expect(batch).toHaveLength(1);\n seen.push(batch[0]!.event.id);\n await store.complete(batch[0]!, at(round + 1));\n }\n expect(new Set(seen).size).toBe(10);\n });\n });\n}\n","import type { EventStore } from '@relaybus/core';\nimport { beforeEach, describe, expect, it } from 'vitest';\nimport {\n at,\n createEnvelope,\n createDelivery,\n createDeferred,\n LEASE_MS,\n} from './contract-fixtures.js';\nimport type { ContractSuite } from './contract-suite.js';\n\n/** Queries, purge, release and appends of transactions still in flight. */\nexport function maintenanceContract<TTransaction>(suite: ContractSuite<TTransaction>): void {\n const { append, claim, keepsCompleted } = suite;\n let store!: EventStore<TTransaction>;\n\n beforeEach(() => {\n store = suite.store();\n });\n\n describe('queries', () => {\n it('filters deliveries and applies the limit in creation order', async () => {\n const first = createEnvelope({ type: 'contract.first.v1' });\n const second = createEnvelope({ type: 'contract.second.v1' });\n await append([{ event: first, deliveries: [createDelivery('handler-a')] }], at(1));\n await append(\n [\n {\n event: second,\n deliveries: [createDelivery('handler-a'), createDelivery('handler-b')],\n },\n ],\n at(2),\n );\n expect(await store.listDeliveries({ eventType: 'contract.second.v1' })).toHaveLength(2);\n expect(await store.listDeliveries({ handler: 'handler-b' })).toHaveLength(1);\n expect(await store.listDeliveries({ status: 'pending', handler: 'handler-a' })).toHaveLength(\n 2,\n );\n expect(await store.listDeliveries({ status: 'dead' })).toEqual([]);\n const limited = await store.listDeliveries({ limit: 1 });\n expect(limited).toHaveLength(1);\n expect(limited[0]!.event.id).toBe(first.id);\n expect(limited[0]!.createdAt).toEqual(at(1));\n });\n\n it('reports counts and the oldest due delivery', async () => {\n await append([\n { event: createEnvelope(), deliveries: [createDelivery('handler-a', at(100))] },\n { event: createEnvelope(), deliveries: [createDelivery('handler-a', at(200))] },\n { event: createEnvelope(), deliveries: [createDelivery('handler-b', at(50_000))] },\n { event: createEnvelope(), deliveries: [createDelivery('handler-c', at(0))] },\n ]);\n const [processing] = await claim(['handler-c'], at(0));\n const [dead] = await claim(['handler-a'], at(100), 1);\n await store.bury(dead!, { name: 'Error', message: 'x' }, at(101));\n expect(await store.statistics(at(1_000))).toEqual({\n pending: 2,\n processing: 1,\n completed: 0,\n dead: 1,\n oldestDueAt: at(200),\n });\n expect((await store.statistics(at(LEASE_MS))).oldestDueAt).toEqual(at(200));\n await store.complete(processing!, at(1));\n expect(await store.statistics(at(0))).toMatchObject({\n completed: keepsCompleted ? 1 : 0,\n processing: 0,\n oldestDueAt: null,\n });\n });\n\n it('counts an expired lease as due', async () => {\n await append([\n { event: createEnvelope(), deliveries: [createDelivery('handler-a', at(LEASE_MS * 5))] },\n ]);\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-b')] }]);\n await claim(['handler-b'], at(0));\n expect((await store.statistics(at(LEASE_MS + 1))).oldestDueAt).toEqual(at(LEASE_MS));\n });\n });\n\n describe('purge', () => {\n async function appendDoneFailedShared() {\n const done = createEnvelope();\n const failed = createEnvelope();\n const shared = createEnvelope();\n await append([\n { event: done, deliveries: [createDelivery('handler-a')] },\n { event: failed, deliveries: [createDelivery('handler-b')] },\n { event: shared, deliveries: [createDelivery('handler-c'), createDelivery('handler-d')] },\n ]);\n const [doneDelivery] = await claim(['handler-a']);\n await store.complete(doneDelivery!, at(10));\n const [failedDelivery] = await claim(['handler-b']);\n await store.bury(failedDelivery!, { name: 'Error', message: 'x' }, at(10));\n const [sharedDelivery] = await claim(['handler-c']);\n await store.complete(sharedDelivery!, at(10));\n return { shared };\n }\n\n it.runIf(keepsCompleted)(\n 'deletes old completed and dead deliveries and their orphaned events',\n async () => {\n const { shared } = await appendDoneFailedShared();\n expect(await store.purge({})).toEqual({ deletedDeliveries: 0, deletedEvents: 0 });\n expect(await store.purge({ completedBefore: at(10) })).toEqual({\n deletedDeliveries: 0,\n deletedEvents: 0,\n });\n expect(await store.purge({ completedBefore: at(11) })).toEqual({\n deletedDeliveries: 2,\n deletedEvents: 1,\n });\n expect(await store.purge({ deadBefore: at(11) })).toEqual({\n deletedDeliveries: 1,\n deletedEvents: 1,\n });\n const remaining = await store.listDeliveries({});\n expect(remaining.map((record) => record.handler)).toEqual(['handler-d']);\n expect(remaining[0]!.event.id).toBe(shared.id);\n },\n );\n\n it.runIf(!keepsCompleted)(\n 'deletes old dead deliveries and the events no delivery references any more',\n async () => {\n const { shared } = await appendDoneFailedShared();\n // Completed deliveries are already gone: only their event is left behind.\n expect(await store.purge({})).toEqual({ deletedDeliveries: 0, deletedEvents: 0 });\n expect(await store.purge({ completedBefore: at(0) })).toEqual({\n deletedDeliveries: 0,\n deletedEvents: 0,\n });\n expect(await store.purge({ completedBefore: at(11) })).toEqual({\n deletedDeliveries: 0,\n deletedEvents: 1,\n });\n expect(await store.purge({ deadBefore: at(11) })).toEqual({\n deletedDeliveries: 1,\n deletedEvents: 1,\n });\n const remaining = await store.listDeliveries({});\n expect(remaining.map((record) => record.handler)).toEqual(['handler-d']);\n expect(remaining[0]!.event.id).toBe(shared.id);\n },\n );\n\n it('lets a purged event id be appended again', async () => {\n const event = createEnvelope();\n await append([{ event, deliveries: [createDelivery('handler-a')] }]);\n const [delivery] = await claim(['handler-a']);\n await store.complete(delivery!, at(1));\n await store.purge({ completedBefore: at(2) });\n const result = await append([{ event, deliveries: [createDelivery('handler-a')] }]);\n expect(result.appendedEventIds).toEqual([event.id]);\n });\n });\n\n describe('release', () => {\n it('gives a leased delivery back without counting the attempt', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [delivery] = await claim(['handler-a'], at(0));\n expect(await store.release(delivery!, at(500))).toBe(true);\n const [record] = await store.listDeliveries({});\n expect(record).toMatchObject({\n status: 'pending',\n attempts: 0,\n leaseOwner: null,\n leaseExpiresAt: null,\n });\n expect(record!.availableAt).toEqual(at(500));\n expect(record!.updatedAt).toEqual(at(500));\n expect(await store.release(delivery!, at(501))).toBe(false);\n const [again] = await claim(['handler-a'], at(500));\n expect(again!.attempt).toBe(1);\n });\n });\n\n describe('transactions in flight', () => {\n it('hides uncommitted appends from every reader', async () => {\n const inside = createDeferred();\n const finish = createDeferred();\n const event = createEnvelope();\n const open = store.transaction(async (transaction) => {\n await store.append(\n transaction,\n [{ event, deliveries: [createDelivery('handler-a')] }],\n at(0),\n );\n inside.resolve();\n await finish.promise;\n });\n await inside.promise;\n expect(await claim(['handler-a'])).toEqual([]);\n expect(await store.listDeliveries({})).toEqual([]);\n expect((await store.statistics(at(0))).pending).toBe(0);\n finish.resolve();\n await open;\n expect(await claim(['handler-a'])).toHaveLength(1);\n });\n\n it('orders same-key events by commit, not by first write', async () => {\n const first = createEnvelope({ key: 'race' });\n const second = createEnvelope({ key: 'race' });\n const firstWritten = createDeferred();\n const releaseFirst = createDeferred();\n const firstTransaction = store.transaction(async (transaction) => {\n await store.append(\n transaction,\n [{ event: first, deliveries: [createDelivery('handler-a')] }],\n at(0),\n );\n firstWritten.resolve();\n await releaseFirst.promise;\n });\n await firstWritten.promise;\n const secondTransaction = store.transaction((transaction) =>\n store.append(\n transaction,\n [{ event: second, deliveries: [createDelivery('handler-a')] }],\n at(0),\n ),\n );\n await new Promise((resolve) => setTimeout(resolve, 50));\n releaseFirst.resolve();\n await firstTransaction;\n await secondTransaction;\n const [head] = await claim(['handler-a']);\n expect(head!.event.id).toBe(first.id);\n await store.complete(head!, at(1));\n expect((await claim(['handler-a']))[0]!.event.id).toBe(second.id);\n });\n\n it('stores an event id written by two concurrent transactions once', async () => {\n const event = createEnvelope({ key: 'same' });\n const results = await Promise.all([\n append([{ event, deliveries: [createDelivery('handler-a')] }]),\n append([{ event, deliveries: [createDelivery('handler-a'), createDelivery('handler-b')] }]),\n ]);\n const appended = results.flatMap((result) => result.appendedEventIds);\n expect(appended).toEqual([event.id]);\n const records = await store.listDeliveries({});\n expect(records.map((record) => record.handler).sort()).toEqual(['handler-a', 'handler-b']);\n });\n });\n}\n","import { createUuidV7, type EventStore } from '@relaybus/core';\nimport { beforeEach, describe, expect, it } from 'vitest';\nimport { at, createEnvelope, createDelivery, LEASE_MS } from './contract-fixtures.js';\nimport type { ContractSuite } from './contract-suite.js';\n\n/** Ordering under load, requeued keyed dead letters, lease semantics and data fidelity. */\nexport function orderingAndLeasesContract<TTransaction>(suite: ContractSuite<TTransaction>): void {\n const { append, claim } = suite;\n let store!: EventStore<TTransaction>;\n\n beforeEach(() => {\n store = suite.store();\n });\n\n describe('ordering keys under load', () => {\n it('does not let a blocked key starve unrelated deliveries', async () => {\n const blocked = Array.from({ length: 120 }, () => ({\n event: createEnvelope({ key: 'hot' }),\n deliveries: [createDelivery('handler-a', at(0))],\n }));\n await append(blocked);\n const unrelated = Array.from({ length: 5 }, () => ({\n event: createEnvelope(),\n deliveries: [createDelivery('handler-a', at(10))],\n }));\n await append(unrelated);\n const claimed = await claim(['handler-a'], at(100), 10);\n expect(claimed).toHaveLength(6);\n expect(claimed.filter((delivery) => delivery.event.key === 'hot')).toHaveLength(1);\n });\n\n it('keeps successors blocked behind an expired, delayed or requeued head', async () => {\n const head = createEnvelope({ key: 'k' });\n const next = createEnvelope({ key: 'k' });\n await append([{ event: head, deliveries: [createDelivery('handler-a')] }]);\n await append([{ event: next, deliveries: [createDelivery('handler-a')] }]);\n const [claimedHead] = await claim(['handler-a'], at(0));\n const reclaimed = await claim(['handler-a'], at(LEASE_MS), 100, 'worker-2');\n expect(reclaimed.map((delivery) => delivery.event.id)).toEqual([head.id]);\n expect(\n await store.reschedule(\n reclaimed[0]!,\n at(LEASE_MS * 10),\n { name: 'Error', message: 'x' },\n at(LEASE_MS),\n ),\n ).toBe(true);\n expect(await claim(['handler-a'], at(LEASE_MS * 5))).toEqual([]);\n const [delayedHead] = await claim(['handler-a'], at(LEASE_MS * 10));\n await store.bury(delayedHead!, { name: 'Error', message: 'x' }, at(LEASE_MS * 10));\n expect(await store.requeue([delayedHead!.deliveryId], at(LEASE_MS * 11))).toBe(1);\n const [requeuedHead] = await claim(['handler-a'], at(LEASE_MS * 11));\n expect(requeuedHead!.event.id).toBe(head.id);\n expect(await claim(['handler-a'], at(LEASE_MS * 11))).toEqual([]);\n expect(claimedHead).toBeDefined();\n });\n });\n\n describe('requeued keyed dead letters', () => {\n it('never runs a requeued dead letter alongside its running successor', async () => {\n const first = createEnvelope({ key: 'k' });\n const second = createEnvelope({ key: 'k' });\n await append([{ event: first, deliveries: [createDelivery('handler-a')] }]);\n await append([{ event: second, deliveries: [createDelivery('handler-a')] }]);\n const [head] = await claim(['handler-a'], at(0));\n await store.bury(head!, { name: 'Error', message: 'x' }, at(1));\n const [successor] = await claim(['handler-a'], at(2));\n expect(successor!.event.id).toBe(second.id);\n expect(await store.requeue([head!.deliveryId], at(3))).toBe(1);\n expect(await claim(['handler-a'], at(4))).toEqual([]);\n await store.complete(successor!, at(5));\n const [requeued] = await claim(['handler-a'], at(6));\n expect(requeued!.event.id).toBe(first.id);\n });\n\n it('recovers when the running successor crashes after the requeue', async () => {\n const first = createEnvelope({ key: 'k' });\n const second = createEnvelope({ key: 'k' });\n await append([{ event: first, deliveries: [createDelivery('handler-a')] }]);\n await append([{ event: second, deliveries: [createDelivery('handler-a')] }]);\n const [head] = await claim(['handler-a'], at(0));\n await store.bury(head!, { name: 'Error', message: 'x' }, at(1));\n await claim(['handler-a'], at(2));\n await store.requeue([head!.deliveryId], at(3));\n const recovered = await claim(['handler-a'], at(2 + LEASE_MS));\n expect(recovered.map((delivery) => delivery.event.id)).toEqual([first.id]);\n await store.complete(recovered[0]!, at(3 + LEASE_MS));\n const [retried] = await claim(['handler-a'], at(4 + LEASE_MS));\n expect(retried).toMatchObject({ attempt: 2 });\n expect(retried!.event.id).toBe(second.id);\n });\n });\n\n describe('lease semantics', () => {\n it('confirms a repeated renewal with identical values', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [delivery] = await claim(['handler-a'], at(0));\n expect(await store.extendLease(delivery!, at(LEASE_MS * 2), at(10))).toBe(true);\n expect(await store.extendLease(delivery!, at(LEASE_MS * 2), at(10))).toBe(true);\n });\n\n it('accepts an expired lease that nobody reclaimed', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [delivery] = await claim(['handler-a'], at(0));\n expect(await store.extendLease(delivery!, at(LEASE_MS * 3), at(LEASE_MS * 2))).toBe(true);\n expect(await store.complete(delivery!, at(LEASE_MS * 2))).toBe(true);\n });\n\n it('rejects every lease operation once the delivery left processing', async () => {\n const error = { name: 'Error', message: 'x' };\n await append([\n {\n event: createEnvelope(),\n deliveries: [createDelivery('a'), createDelivery('b'), createDelivery('c')],\n },\n ]);\n const [completed] = await claim(['a']);\n await store.complete(completed!, at(1));\n const [buried] = await claim(['b']);\n await store.bury(buried!, error, at(1));\n const [rescheduled] = await claim(['c']);\n await store.reschedule(rescheduled!, at(100), error, at(1));\n for (const lease of [completed!, buried!, rescheduled!]) {\n expect(await store.extendLease(lease, at(LEASE_MS), at(2))).toBe(false);\n expect(await store.reschedule(lease, at(3), error, at(2))).toBe(false);\n expect(await store.bury(lease, error, at(2))).toBe(false);\n expect(await store.release(lease, at(2))).toBe(false);\n expect(await store.complete(lease, at(2))).toBe(false);\n }\n });\n\n it('rejects made-up leases on pending deliveries and requeues only dead ones', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('a')] }]);\n const [pending] = await store.listDeliveries({});\n const fake = { deliveryId: pending!.id, leaseToken: createUuidV7() };\n expect(await store.reschedule(fake, at(1), { name: 'Error', message: 'x' }, at(1))).toBe(\n false,\n );\n expect(await store.bury(fake, { name: 'Error', message: 'x' }, at(1))).toBe(false);\n const [processing] = await claim(['a']);\n expect(await store.requeue([processing!.deliveryId], at(1))).toBe(0);\n expect(await store.purge({ completedBefore: at(1e9), deadBefore: at(1e9) })).toEqual({\n deletedDeliveries: 0,\n deletedEvents: 0,\n });\n expect(await store.listDeliveries({})).toHaveLength(1);\n });\n });\n\n describe('data fidelity', () => {\n it.each([null, 0, 42.5, 'text', [1, { two: 2 }], { deep: { list: [] } }, true])(\n 'round-trips the payload %j',\n async (payload) => {\n const event = createEnvelope({ payload });\n await append([{ event, deliveries: [createDelivery('handler-a')] }]);\n const [claimed] = await claim(['handler-a']);\n expect(claimed!.event.payload).toEqual(payload);\n },\n );\n\n it('accepts long identifiers and non-UUID event ids', async () => {\n const handler = 'h'.repeat(255);\n const event = createEnvelope({\n id: `order-42:placed:${'x'.repeat(200)}`,\n key: 'k'.repeat(255),\n type: 't'.repeat(255),\n });\n await append([{ event, deliveries: [createDelivery(handler)] }]);\n const [claimed] = await claim([handler]);\n expect(claimed!.event).toEqual(event);\n expect(claimed!.handler).toBe(handler);\n });\n\n it('lists at most 100 deliveries by default', async () => {\n await append(\n Array.from({ length: 101 }, () => ({\n event: createEnvelope(),\n deliveries: [createDelivery('handler-a')],\n })),\n );\n expect(await store.listDeliveries({})).toHaveLength(100);\n });\n\n it('hands out copies that callers cannot use to change stored data', async () => {\n const event = createEnvelope({ payload: { amount: 1 }, headers: { a: '1' } });\n await append([{ event, deliveries: [createDelivery('handler-a')] }]);\n const [claimed] = await claim(['handler-a']);\n (claimed!.event.payload as { amount: number }).amount = 999;\n (claimed!.event.headers as Record<string, string>)['a'] = 'changed';\n const [listed] = await store.listDeliveries({});\n expect(listed!.event.payload).toEqual({ amount: 1 });\n expect(listed!.event.headers).toEqual({ a: '1' });\n });\n });\n}\n","import type { EventStore } from '@relaybus/core';\nimport { beforeEach, describe, expect, it } from 'vitest';\nimport { at, createEnvelope, createDelivery, LEASE_MS } from './contract-fixtures.js';\nimport type { ContractSuite } from './contract-suite.js';\n\n/** Completion, stale leases of one delivery and retention of the deduplication record. */\nexport function completionContract<TTransaction>(suite: ContractSuite<TTransaction>): void {\n const { append, claim, completeMany, keepsCompleted } = suite;\n let store!: EventStore<TTransaction>;\n\n beforeEach(() => {\n store = suite.store();\n });\n\n describe('completion', () => {\n it('removes a completed delivery from every listing', async () => {\n const event = createEnvelope();\n await append([\n { event, deliveries: [createDelivery('handler-a'), createDelivery('handler-b')] },\n ]);\n const [delivery] = await claim(['handler-a']);\n expect(await store.complete(delivery!, at(5))).toBe(true);\n const records = await store.listDeliveries({ eventId: event.id });\n if (keepsCompleted) {\n expect(records.map((record) => [record.handler, record.status]).sort()).toEqual([\n ['handler-a', 'completed'],\n ['handler-b', 'pending'],\n ]);\n const [completed] = await store.listDeliveries({ status: 'completed' });\n expect(completed).toMatchObject({ handler: 'handler-a', attempts: 1 });\n expect(completed!.completedAt).toEqual(at(5));\n } else {\n expect(records.map((record) => [record.handler, record.status])).toEqual([\n ['handler-b', 'pending'],\n ]);\n expect(await store.listDeliveries({ status: 'completed' })).toEqual([]);\n }\n expect(await claim(['handler-a'], at(LEASE_MS * 10))).toEqual([]);\n expect(await store.statistics(at(0))).toMatchObject({\n pending: 1,\n processing: 0,\n completed: keepsCompleted ? 1 : 0,\n });\n });\n\n it('does not create the delivery of a handler that already completed again', async () => {\n const event = createEnvelope();\n await append([{ event, deliveries: [createDelivery('handler-a')] }]);\n const [delivery] = await claim(['handler-a']);\n await store.complete(delivery!, at(1));\n // A broker redelivery or a publish retry carries the same event id: handler-a must not run twice.\n const result = await append([\n { event, deliveries: [createDelivery('handler-a'), createDelivery('handler-b')] },\n ]);\n expect(result).toEqual({\n appendedEventIds: [],\n duplicateEventIds: [event.id],\n appendedDeliveryCount: 1,\n });\n expect(await claim(['handler-a'], at(LEASE_MS * 10))).toEqual([]);\n expect(await claim(['handler-b'], at(LEASE_MS * 10))).toHaveLength(1);\n const again = await append([{ event, deliveries: [createDelivery('handler-a')] }]);\n expect(again.appendedDeliveryCount).toBe(0);\n });\n\n it('completes many leases at once and reports each one', async () => {\n await append(\n Array.from({ length: 5 }, () => ({\n event: createEnvelope(),\n deliveries: [createDelivery('handler-a')],\n })),\n );\n const claimed = await claim(['handler-a']);\n expect(claimed).toHaveLength(5);\n expect(await completeMany(store, [], at(1))).toEqual([]);\n expect(await completeMany(store, claimed.slice(0, 3), at(1))).toEqual([true, true, true]);\n expect(await store.statistics(at(2))).toMatchObject({ processing: 2, pending: 0 });\n expect(await completeMany(store, claimed, at(2))).toEqual([false, false, false, true, true]);\n expect(await store.statistics(at(3))).toMatchObject({ processing: 0, pending: 0 });\n });\n\n it('completes a lease listed twice only once', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [delivery] = await claim(['handler-a']);\n expect(await completeMany(store, [delivery!, delivery!], at(1))).toEqual([true, false]);\n });\n\n it('fences every lease of a batch on its own', async () => {\n await append(\n Array.from({ length: 3 }, () => ({\n event: createEnvelope(),\n deliveries: [createDelivery('handler-a')],\n })),\n );\n const stale = await claim(['handler-a'], at(0));\n const current = await claim(['handler-a'], at(LEASE_MS), 100, 'worker-2');\n expect(current).toHaveLength(3);\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }], at(1));\n const [fresh] = await claim(['handler-a'], at(LEASE_MS + 1), 100, 'worker-2');\n expect(\n await completeMany(store, [stale[0]!, fresh!, stale[1]!, current[2]!], at(LEASE_MS + 2)),\n ).toEqual([false, true, false, true]);\n expect(await store.statistics(at(LEASE_MS + 3))).toMatchObject({ processing: 2 });\n });\n\n it('does not complete a lease of a delivery that went back to pending', async () => {\n const error = { name: 'Error', message: 'x' };\n await append([\n { event: createEnvelope(), deliveries: [createDelivery('a'), createDelivery('b')] },\n ]);\n const [retrying] = await claim(['a']);\n const [released] = await claim(['b']);\n await store.reschedule(retrying!, at(1_000), error, at(1));\n await store.release(released!, at(1));\n expect(await completeMany(store, [retrying!, released!], at(2))).toEqual([false, false]);\n expect(await store.statistics(at(2))).toMatchObject({ pending: 2, processing: 0 });\n });\n });\n\n describe('stale leases of one delivery', () => {\n const error = { name: 'Error', message: 'x' };\n\n it('refuses the lease of an attempt that was released when the same owner claims it again', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [stale] = await claim(['handler-a'], at(0), 100, 'worker-1');\n expect(await store.release(stale!, at(1))).toBe(true);\n const [current] = await claim(['handler-a'], at(2), 100, 'worker-1');\n expect(current!.deliveryId).toBe(stale!.deliveryId);\n expect(current!.leaseToken).not.toBe(stale!.leaseToken);\n expect(await store.complete(stale!, at(3))).toBe(false);\n expect(await store.bury(stale!, error, at(3))).toBe(false);\n expect(await store.reschedule(stale!, at(9), error, at(3))).toBe(false);\n expect(await store.release(stale!, at(3))).toBe(false);\n expect(await store.extendLease(stale!, at(LEASE_MS * 3), at(3))).toBe(false);\n expect(await store.complete(current!, at(4))).toBe(true);\n });\n\n it('refuses the lease of an attempt that was rescheduled when the same owner claims it again', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [stale] = await claim(['handler-a'], at(0), 100, 'worker-1');\n expect(await store.reschedule(stale!, at(10), error, at(1))).toBe(true);\n const [current] = await claim(['handler-a'], at(10), 100, 'worker-1');\n expect(current).toMatchObject({ deliveryId: stale!.deliveryId, attempt: 2 });\n expect(await store.complete(stale!, at(11))).toBe(false);\n expect(await store.bury(stale!, error, at(11))).toBe(false);\n expect(await completeMany(store, [stale!], at(11))).toEqual([false]);\n expect(await store.complete(current!, at(12))).toBe(true);\n });\n\n it('matches the results of completeMany to the lease, not to the delivery id', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [stale] = await claim(['handler-a'], at(0), 100, 'worker-1');\n await store.release(stale!, at(1));\n const [current] = await claim(['handler-a'], at(2), 100, 'worker-1');\n expect(await completeMany(store, [stale!, current!], at(3))).toEqual([false, true]);\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-b')] }]);\n const [staleB] = await claim(['handler-b'], at(4), 100, 'worker-1');\n await store.release(staleB!, at(5));\n const [currentB] = await claim(['handler-b'], at(6), 100, 'worker-1');\n expect(await completeMany(store, [currentB!, staleB!], at(7))).toEqual([true, false]);\n });\n });\n\n describe('retention of the deduplication record', () => {\n const DAY = 86_400_000;\n\n it('keeps an event for the retention window after its last delivery completed, however old it is', async () => {\n const event = createEnvelope();\n await append([{ event, deliveries: [createDelivery('handler-a')] }]);\n const [delivery] = await claim(['handler-a'], at(30 * DAY));\n expect(await store.complete(delivery!, at(30 * DAY + 1))).toBe(true);\n // The event is 30 days old but completed just now: a 29 day completed retention must not take it.\n expect(await store.purge({ completedBefore: at(29 * DAY) })).toMatchObject({\n deletedEvents: 0,\n });\n const again = await append(\n [{ event, deliveries: [createDelivery('handler-a')] }],\n at(30 * DAY + 2),\n );\n expect(again.appendedDeliveryCount).toBe(0);\n expect(await store.purge({ completedBefore: at(31 * DAY) })).toMatchObject({\n deletedEvents: 1,\n });\n const afterwards = await append(\n [{ event, deliveries: [createDelivery('handler-a')] }],\n at(31 * DAY),\n );\n expect(afterwards.appendedEventIds).toEqual([event.id]);\n });\n\n it('keeps the later completion time of an event when completions are recorded out of order', async () => {\n const event = createEnvelope();\n await append([\n { event, deliveries: [createDelivery('handler-a'), createDelivery('handler-b')] },\n ]);\n const claimed = await claim(['handler-a', 'handler-b']);\n expect(claimed).toHaveLength(2);\n const [first, second] = claimed.sort((left, right) =>\n left.handler.localeCompare(right.handler),\n );\n expect(await store.complete(first!, at(200))).toBe(true);\n // A worker with a slow clock records an earlier time afterwards: it must not move the event back.\n expect(await store.complete(second!, at(100))).toBe(true);\n expect(await store.purge({ completedBefore: at(150) })).toMatchObject({ deletedEvents: 0 });\n const again = await append(\n [{ event, deliveries: [createDelivery('handler-a'), createDelivery('handler-b')] }],\n at(201),\n );\n expect(again.appendedDeliveryCount).toBe(0);\n });\n\n it('remembers every handler of an event appended twice in one transaction', async () => {\n const event = createEnvelope();\n const result = await store.transaction(async (transaction) => {\n await store.append(\n transaction,\n [{ event, deliveries: [createDelivery('handler-a')] }],\n at(0),\n );\n return store.append(\n transaction,\n [{ event, deliveries: [createDelivery('handler-b')] }],\n at(0),\n );\n });\n expect(result).toMatchObject({ duplicateEventIds: [event.id], appendedDeliveryCount: 1 });\n const claimed = await claim(['handler-a', 'handler-b']);\n expect(claimed).toHaveLength(2);\n for (const delivery of claimed) {\n expect(await store.complete(delivery, at(1))).toBe(true);\n }\n const again = await append(\n [{ event, deliveries: [createDelivery('handler-a'), createDelivery('handler-b')] }],\n at(2),\n );\n expect(again).toMatchObject({ duplicateEventIds: [event.id], appendedDeliveryCount: 0 });\n });\n\n it('does not let the dead-letter cutoff remove events whose deliveries completed', async () => {\n const event = createEnvelope();\n await append([{ event, deliveries: [createDelivery('handler-a')] }]);\n const [delivery] = await claim(['handler-a']);\n await store.complete(delivery!, at(1));\n expect(await store.purge({ deadBefore: at(100 * DAY) })).toMatchObject({\n deletedEvents: 0,\n });\n const again = await append([{ event, deliveries: [createDelivery('handler-a')] }], at(2));\n expect(again.appendedDeliveryCount).toBe(0);\n });\n });\n}\n","import type { EventStore } from '@relaybus/core';\nimport { afterEach, beforeEach, describe, expect, it } from 'vitest';\nimport { at, createEnvelope, createDelivery, LEASE_MS } from './contract-fixtures.js';\nimport type { ContractSuite } from './contract-suite.js';\n\n/** Lost leases, relinquish and stores across instances. */\nexport function lostLeasesContract<TTransaction>(suite: ContractSuite<TTransaction>): void {\n const { append, claim, completeMany, options } = suite;\n let store!: EventStore<TTransaction>;\n\n beforeEach(() => {\n store = suite.store();\n });\n\n describe('lost leases', () => {\n it('hands a delivery of a crashed worker to the next claimer with the attempt counted', async () => {\n await append(\n Array.from({ length: 4 }, () => ({\n event: createEnvelope(),\n deliveries: [createDelivery('handler-a')],\n })),\n );\n const first = await claim(['handler-a'], at(0), 100, 'worker-1');\n expect(first.map((delivery) => delivery.attempt)).toEqual([1, 1, 1, 1]);\n expect(await claim(['handler-a'], at(LEASE_MS - 1), 100, 'worker-2')).toEqual([]);\n const second = await claim(['handler-a'], at(LEASE_MS), 100, 'worker-2');\n expect(second.map((delivery) => delivery.deliveryId).sort()).toEqual(\n first.map((delivery) => delivery.deliveryId).sort(),\n );\n expect(second.map((delivery) => delivery.attempt)).toEqual([2, 2, 2, 2]);\n for (const stale of first) {\n expect(await store.complete(stale, at(LEASE_MS + 1))).toBe(false);\n }\n expect(await completeMany(store, first, at(LEASE_MS + 1))).toEqual([\n false,\n false,\n false,\n false,\n ]);\n expect(await completeMany(store, second, at(LEASE_MS + 2))).toEqual([true, true, true, true]);\n });\n\n it('keeps counting attempts of a poison delivery until it is dead-lettered', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n for (let crash = 0; crash < 4; crash += 1) {\n const [delivery] = await claim(['handler-a'], at(crash * LEASE_MS), 100, `worker-${crash}`);\n expect(delivery!.attempt).toBe(crash + 1);\n }\n const [last] = await claim(['handler-a'], at(4 * LEASE_MS), 100, 'worker-4');\n expect(last!.attempt).toBe(5);\n expect(await store.bury(last!, { name: 'Error', message: 'poison' }, at(4 * LEASE_MS))).toBe(\n true,\n );\n const [dead] = await store.listDeliveries({ status: 'dead' });\n expect(dead).toMatchObject({ attempts: 5, lastError: { message: 'poison' } });\n expect(await claim(['handler-a'], at(100 * LEASE_MS))).toEqual([]);\n });\n\n it('does not count an attempt that was reported as failed twice', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [delivery] = await claim(['handler-a'], at(0), 100, 'worker-1');\n await store.reschedule(delivery!, at(10), { name: 'Error', message: 'x' }, at(1));\n const [retry] = await claim(['handler-a'], at(LEASE_MS), 100, 'worker-2');\n expect(retry!.attempt).toBe(2);\n const [afterCrash] = await claim(['handler-a'], at(LEASE_MS * 2), 100, 'worker-3');\n expect(afterCrash!.attempt).toBe(3);\n });\n\n it('keeps the order of a key across a takeover', async () => {\n const [head, next] = await (async () => {\n const events = [createEnvelope({ key: 'k' }), createEnvelope({ key: 'k' })];\n for (const event of events) {\n await append([{ event, deliveries: [createDelivery('handler-a')] }]);\n }\n return events;\n })();\n const [stale] = await claim(['handler-a'], at(0), 100, 'worker-1');\n expect(stale!.event.id).toBe(head!.id);\n const taken = await claim(['handler-a'], at(LEASE_MS), 100, 'worker-2');\n expect(taken.map((delivery) => delivery.event.id)).toEqual([head!.id]);\n expect(await store.complete(stale!, at(LEASE_MS + 1))).toBe(false);\n expect(await store.complete(taken[0]!, at(LEASE_MS + 2))).toBe(true);\n const [following] = await claim(['handler-a'], at(LEASE_MS + 3), 100, 'worker-2');\n expect(following!.event.id).toBe(next!.id);\n });\n\n it('lets every worker see only deliveries nobody else holds, and none twice', async () => {\n await append(\n Array.from({ length: 30 }, () => ({\n event: createEnvelope(),\n deliveries: [createDelivery('handler-a')],\n })),\n );\n const seen: string[] = [];\n for (let round = 0; round < 40; round += 1) {\n const owners = ['worker-1', 'worker-2', 'worker-3'];\n const batches = await Promise.all(\n owners.map((owner) => claim(['handler-a'], at(round), 4, owner)),\n );\n for (const batch of batches) {\n seen.push(...batch.map((delivery) => delivery.deliveryId));\n expect(await completeMany(store, batch, at(round))).toEqual(batch.map(() => true));\n }\n }\n expect(seen).toHaveLength(30);\n expect(new Set(seen).size).toBe(30);\n });\n });\n\n describe('relinquish', () => {\n it('hands idle leases to other workers at once and keeps leases with running work', async (context) => {\n if (store.relinquish === undefined) {\n return context.skip();\n }\n await append([\n { event: createEnvelope(), deliveries: [createDelivery('handler-a')] },\n { event: createEnvelope(), deliveries: [createDelivery('handler-a')] },\n ]);\n const claimed = await claim(['handler-a'], at(0), 100, 'worker-1');\n expect(claimed).toHaveLength(2);\n await store.relinquish('worker-1', at(1));\n expect(await store.complete(claimed[0]!, at(2))).toBe(true);\n expect(await store.complete(claimed[1]!, at(2))).toBe(true);\n await store.relinquish('worker-1', at(3));\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }], at(4));\n expect(await claim(['handler-a'], at(4), 100, 'worker-2')).toHaveLength(1);\n });\n\n it('does not give away a delivery that is still running', async (context) => {\n if (store.relinquish === undefined) {\n return context.skip();\n }\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [running] = await claim(['handler-a'], at(0), 100, 'worker-1');\n await store.relinquish('worker-1', at(1));\n expect(await claim(['handler-a'], at(2), 100, 'worker-2')).toEqual([]);\n expect(await store.complete(running!, at(3))).toBe(true);\n });\n });\n\n describe.skipIf(options.createPeerStore === undefined)('across store instances', () => {\n let peer: EventStore<TTransaction>;\n\n beforeEach(async () => {\n peer = await options.createPeerStore!(store);\n });\n\n afterEach(async () => {\n await options.destroyStore?.(peer);\n });\n\n it('never gives one delivery to claimers in different processes', async () => {\n await append(\n Array.from({ length: 60 }, (_, index) => ({\n event: createEnvelope({ key: index % 3 === 0 ? `key-${index % 9}` : null }),\n deliveries: [createDelivery('handler-a')],\n })),\n );\n const request = (owner: string) => ({\n handlers: ['handler-a'],\n limit: 7,\n leaseOwner: owner,\n leaseExpiresAt: at(LEASE_MS),\n now: at(0),\n });\n const batches = await Promise.all([\n ...Array.from({ length: 5 }, (_, index) => store.claim(request(`primary-${index}`))),\n ...Array.from({ length: 5 }, (_, index) => peer.claim(request(`peer-${index}`))),\n ]);\n const claimed = batches.flat();\n expect(new Set(claimed.map((delivery) => delivery.deliveryId)).size).toBe(claimed.length);\n const keys = claimed.map((delivery) => delivery.event.key).filter((key) => key !== null);\n expect(new Set(keys).size).toBe(keys.length);\n });\n\n it('fences a lease taken over by another process', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [stale] = await claim(['handler-a'], at(0));\n const [current] = await peer.claim({\n handlers: ['handler-a'],\n limit: 1,\n leaseOwner: 'peer',\n leaseExpiresAt: at(LEASE_MS * 2),\n now: at(LEASE_MS),\n });\n expect(await store.complete(stale!, at(LEASE_MS + 1))).toBe(false);\n expect(await peer.complete(current!, at(LEASE_MS + 1))).toBe(true);\n });\n\n it('completes batches in either process and fences the one that lost its lease', async () => {\n await append(\n Array.from({ length: 6 }, () => ({\n event: createEnvelope(),\n deliveries: [createDelivery('handler-a')],\n })),\n );\n const request = (owner: string, now: Date) => ({\n handlers: ['handler-a'],\n limit: 100,\n leaseOwner: owner,\n leaseExpiresAt: new Date(now.getTime() + LEASE_MS),\n now,\n });\n const stale = await store.claim(request('primary', at(0)));\n const current = await peer.claim(request('peer', at(LEASE_MS)));\n expect(current).toHaveLength(6);\n expect(await completeMany(store, stale, at(LEASE_MS + 1))).toEqual(stale.map(() => false));\n expect(await completeMany(peer, current, at(LEASE_MS + 1))).toEqual(current.map(() => true));\n expect(await store.statistics(at(LEASE_MS + 2))).toMatchObject({\n pending: 0,\n processing: 0,\n });\n });\n });\n}\n","import type { AppendEntry, ClaimedDelivery, EventStore, LeaseReference } from '@relaybus/core';\nimport { afterEach, beforeEach, describe } from 'vitest';\nimport { appendAndClaimContract } from './contract/append-and-claim.js';\nimport { fencingContract } from './contract/fencing-and-retries.js';\nimport { maintenanceContract } from './contract/queries-and-purge.js';\nimport { orderingAndLeasesContract } from './contract/ordering-and-leases.js';\nimport { completionContract } from './contract/completion.js';\nimport { lostLeasesContract } from './contract/lost-leases.js';\nimport { LEASE_MS, at } from './contract/contract-fixtures.js';\nimport type { ContractSuite } from './contract/contract-suite.js';\n\nexport { at, createDelivery, createEnvelope } from './contract/contract-fixtures.js';\n\nexport interface EventStoreContractOptions<TTransaction> {\n /** Creates an empty, set-up store. Called before every test. */\n readonly createStore: () => Promise<EventStore<TTransaction>>;\n /** Releases the store. Called after every test. */\n readonly destroyStore?: (store: EventStore<TTransaction>) => Promise<void>;\n /**\n * Creates a second store instance on the same database with its own\n * connections, simulating another process. Enables cross-instance tests.\n * Stores without shared state across instances (in-memory) omit it.\n */\n readonly createPeerStore?: (\n primary: EventStore<TTransaction>,\n ) => Promise<EventStore<TTransaction>>;\n /**\n * Whether the stores `createStore` returns keep a record of completed\n * deliveries (completion history). Default false: a completed delivery is\n * deleted. Run the contract once for each mode a store supports.\n */\n readonly keepsCompletedRecords?: boolean;\n}\n\n/**\n * Behaviour every {@link EventStore} must have. Call it inside a test file of\n * the store package:\n *\n * ```ts\n * eventStoreContract('PostgresEventStore', { createStore: async () => ... });\n * ```\n */\nexport function eventStoreContract<TTransaction>(\n name: string,\n options: EventStoreContractOptions<TTransaction>,\n): void {\n const keepsCompleted = options.keepsCompletedRecords ?? false;\n describe(`${name} satisfies the EventStore contract`, () => {\n let store: EventStore<TTransaction>;\n\n beforeEach(async () => {\n store = await options.createStore();\n });\n\n afterEach(async () => {\n await options.destroyStore?.(store);\n });\n\n async function append(entries: AppendEntry[], now: Date = at(0)) {\n return store.transaction((transaction) => store.append(transaction, entries, now));\n }\n\n /** `completeMany` is optional on the port: stores without it complete one by one, in order. */\n async function completeMany(\n target: EventStore<TTransaction>,\n leases: readonly LeaseReference[],\n now: Date,\n ): Promise<boolean[]> {\n if (target.completeMany !== undefined) {\n return target.completeMany(leases, now);\n }\n const outcomes: boolean[] = [];\n for (const lease of leases) {\n outcomes.push(await target.complete(lease, now));\n }\n return outcomes;\n }\n\n async function claim(\n handlers: string[],\n now: Date = at(0),\n limit = 100,\n owner = 'worker-1',\n ): Promise<ClaimedDelivery[]> {\n return store.claim({\n handlers,\n limit,\n leaseOwner: owner,\n leaseExpiresAt: new Date(now.getTime() + LEASE_MS),\n now,\n });\n }\n\n const suite: ContractSuite<TTransaction> = {\n options,\n keepsCompleted,\n store: () => store,\n append,\n claim,\n completeMany,\n };\n appendAndClaimContract(suite);\n fencingContract(suite);\n maintenanceContract(suite);\n orderingAndLeasesContract(suite);\n completionContract(suite);\n lostLeasesContract(suite);\n });\n}\n","import type { Clock } from '@relaybus/core';\n\ntype ScheduledTask = Parameters<NonNullable<Clock['schedule']>>[0];\n\ninterface PendingTimer {\n readonly task: ScheduledTask;\n dueAt: number;\n /** Order of scheduling, so timers due at the same time run in the order they were set. */\n readonly sequence: number;\n}\n\n/**\n * Clock that only moves when told to. With `controlTimers: true` it also owns relaybus's timers\n * (polling, retries, heartbeats, retention, timeouts): they run inside {@link FakeClock.advance}\n * when their time comes instead of on the platform timers. Without it, timers stay real.\n */\nexport class FakeClock implements Clock {\n #now: number;\n readonly #timers = new Set<PendingTimer>();\n #sequence = 0;\n /** Present only with `controlTimers: true`; see {@link Clock.schedule}. */\n readonly schedule?: (task: ScheduledTask) => () => void;\n\n constructor(\n start: Date | string | number = '2026-01-01T00:00:00.000Z',\n options: { readonly controlTimers?: boolean } = {},\n ) {\n this.#now = new Date(start).getTime();\n if (options.controlTimers === true) {\n this.schedule = (task) => this.#schedule(task);\n }\n }\n\n now(): Date {\n return new Date(this.#now);\n }\n\n /** Moves the clock forward, running every controlled timer that falls due on the way, in time order. */\n advance(milliseconds: number): Date {\n const target = this.#now + milliseconds;\n for (let timer = this.#nextDue(target); timer !== undefined; timer = this.#nextDue(target)) {\n this.#now = Math.max(this.#now, timer.dueAt);\n if (timer.task.repeat === true) {\n timer.dueAt += Math.max(1, timer.task.delayMs);\n } else {\n this.#timers.delete(timer);\n }\n timer.task.run();\n }\n this.#now = target;\n return this.now();\n }\n\n set(instant: Date | string | number): Date {\n this.#now = new Date(instant).getTime();\n return this.now();\n }\n\n /** Controlled timers still waiting to run. */\n get pendingTimers(): number {\n return this.#timers.size;\n }\n\n #schedule(task: ScheduledTask): () => void {\n const timer: PendingTimer = {\n task,\n dueAt: this.#now + Math.max(0, task.delayMs),\n sequence: this.#sequence++,\n };\n this.#timers.add(timer);\n return () => {\n this.#timers.delete(timer);\n };\n }\n\n #nextDue(limit: number): PendingTimer | undefined {\n let next: PendingTimer | undefined;\n for (const timer of this.#timers) {\n if (\n timer.dueAt <= limit &&\n (next === undefined ||\n timer.dueAt < next.dueAt ||\n (timer.dueAt === next.dueAt && timer.sequence < next.sequence))\n ) {\n next = timer;\n }\n }\n return next;\n }\n}\n","import type { EventEnvelope, Transport, TransportMessageHandler } from '@relaybus/core';\n\nexport interface PublishedMessage {\n readonly destination: string;\n readonly envelope: EventEnvelope;\n}\n\n/**\n * Transport that keeps messages in memory. `deliver` pushes a message to the\n * subscribers of its destination and, like a broker, redelivers it on failure\n * up to `maxRedeliveries` times.\n */\nexport class InMemoryTransport implements Transport {\n readonly name: string;\n readonly published: PublishedMessage[] = [];\n readonly #subscribers = new Map<string, TransportMessageHandler[]>();\n #failNextPublishes = 0;\n connected = false;\n closed = false;\n\n constructor(name = 'memory') {\n this.name = name;\n }\n\n async connect(): Promise<void> {\n this.connected = true;\n }\n\n /** Makes the next `count` publishes reject, simulating a broker outage. */\n failNextPublishes(count: number): void {\n this.#failNextPublishes = count;\n }\n\n async publish(envelope: EventEnvelope, destination: string): Promise<void> {\n if (this.#failNextPublishes > 0) {\n this.#failNextPublishes -= 1;\n throw new Error(`InMemoryTransport refused publish to ${destination}`);\n }\n this.published.push({ destination, envelope });\n }\n\n async subscribe(\n destinations: readonly string[],\n onMessage: TransportMessageHandler,\n ): Promise<void> {\n for (const destination of destinations) {\n const handlers = this.#subscribers.get(destination) ?? [];\n handlers.push(onMessage);\n this.#subscribers.set(destination, handlers);\n }\n }\n\n /**\n * Delivers a message to every subscriber of `destination`, redelivering it to\n * a subscriber that rejects up to `maxRedeliveries` times. Resolves with the\n * total number of handler calls.\n */\n // eslint-disable-next-line relaybus/max-two-params -- public InMemoryTransport.deliver signature\n async deliver(\n destination: string,\n envelope: EventEnvelope,\n maxRedeliveries = 0,\n ): Promise<number> {\n let calls = 0;\n for (const handler of this.#subscribers.get(destination) ?? []) {\n calls += await deliverWithRedeliveries(handler, { envelope, destination, maxRedeliveries });\n }\n return calls;\n }\n\n async close(): Promise<void> {\n this.closed = true;\n }\n}\n\n/** Hands `envelope` to one handler, again after each failure up to `maxRedeliveries` times; returns the calls. */\nasync function deliverWithRedeliveries(\n handler: TransportMessageHandler,\n delivery: {\n readonly envelope: EventEnvelope;\n readonly destination: string;\n readonly maxRedeliveries: number;\n },\n): Promise<number> {\n for (let attempt = 0; ; attempt += 1) {\n try {\n await handler(delivery.envelope, { destination: delivery.destination });\n return attempt + 1;\n } catch (error) {\n if (attempt >= delivery.maxRedeliveries) {\n throw error;\n }\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/contract/contract-fixtures.ts","../src/contract/append-and-claim.ts","../src/contract/fencing-and-retries.ts","../src/contract/queries-and-purge.ts","../src/contract/ordering-and-leases.ts","../src/contract/completion.ts","../src/contract/lost-leases.ts","../src/contract/payload-fidelity.ts","../src/event-store-contract.ts","../src/fake-clock.ts","../src/in-memory-transport.ts","../src/codec-contract/vitest.ts"],"names":["createUuidV7","beforeEach","describe","it","expect","afterEach","registerKafkaCodecContract","registerRabbitMqCodecContract"],"mappings":";;;;;;AASO,SAAS,cAAA,GAA2B;AACzC,EAAA,IAAI,OAAA;AACJ,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAc,CAAC,SAAA,KAAc;AAC/C,IAAA,OAAA,GAAU,SAAA;AAAA,EACZ,CAAC,CAAA;AACD,EAAA,OAAO,EAAE,SAAS,OAAA,EAAQ;AAC5B;AAEA,IAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,0BAA0B,CAAA;AAChD,IAAM,QAAA,GAAW,GAAA;AAEjB,SAAS,GAAG,QAAA,EAAwB;AACzC,EAAA,OAAO,IAAI,IAAA,CAAK,SAAA,GAAY,QAAQ,CAAA;AACtC;AAEO,SAAS,cAAA,CAAe,SAAA,GAAoC,EAAC,EAAkB;AACpF,EAAA,OAAO;AAAA,IACL,IAAIA,iBAAA,EAAa;AAAA,IACjB,IAAA,EAAM,mBAAA;AAAA,IACN,MAAA,EAAQ,gBAAA;AAAA,IACR,GAAA,EAAK,IAAA;AAAA,IACL,OAAA,EAAS,EAAE,KAAA,EAAO,CAAA,EAAE;AAAA,IACpB,SAAS,EAAC;AAAA,IACV,aAAA,EAAe,IAAA;AAAA,IACf,WAAA,EAAa,IAAA;AAAA,IACb,UAAA,EAAY,GAAG,CAAC,CAAA;AAAA,IAChB,GAAG;AAAA,GACL;AACF;AAEO,SAAS,cAAA,CAAe,OAAA,EAAiB,WAAA,GAAoB,EAAA,CAAG,CAAC,CAAA,EAAgB;AACtF,EAAA,OAAO,EAAE,EAAA,EAAIA,iBAAA,EAAa,EAAG,SAAS,WAAA,EAAY;AACpD;;;ACnCO,SAAS,uBAAqC,KAAA,EAA0C;AAC7F,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,KAAA;AAC1B,EAAA,IAAI,KAAA;AAEJ,EAAAC,iBAAA,CAAW,MAAM;AACf,IAAA,KAAA,GAAQ,MAAM,KAAA,EAAM;AAAA,EACtB,CAAC,CAAA;AAED,EAAAC,eAAA,CAAS,SAAS,MAAM;AACtB,IAAAC,SAAA,CAAG,0BAA0B,YAAY;AACvC,MAAA,MAAM,MAAM,KAAA,IAAQ;AACpB,MAAA,MAAM,MAAM,KAAA,IAAQ;AACpB,MAAAC,aAAA,CAAO,MAAM,KAAA,CAAM,UAAA,CAAW,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,aAAA,CAAc,EAAE,OAAA,EAAS,CAAA,EAAG,CAAA;AAAA,IACpE,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAAF,eAAA,CAAS,UAAU,MAAM;AACvB,IAAAC,SAAA,CAAG,6DAA6D,YAAY;AAC1E,MAAA,MAAM,QAAQ,cAAA,EAAe;AAC7B,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO;AAAA,QAC1B,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAA,EAAG,cAAA,CAAe,WAAW,CAAC,CAAA;AAAE,OACjF,CAAA;AACD,MAAAC,aAAA,CAAO,MAAM,EAAE,OAAA,CAAQ;AAAA,QACrB,gBAAA,EAAkB,CAAC,KAAA,CAAM,EAAE,CAAA;AAAA,QAC3B,mBAAmB,EAAC;AAAA,QACpB,qBAAA,EAAuB;AAAA,OACxB,CAAA;AACD,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,cAAA,CAAe,EAAE,OAAA,EAAS,KAAA,CAAM,IAAI,CAAA;AAChE,MAAAA,aAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW,OAAO,OAAO,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,WAAA,EAAa,WAAW,CAAC,CAAA;AACzF,MAAAA,aAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,CAAC,MAAA,KAAW,MAAA,CAAO,MAAA,KAAW,SAAA,IAAa,MAAA,CAAO,QAAA,KAAa,CAAC,CAAC,CAAA,CAAE,IAAA;AAAA,QACtF;AAAA,OACF;AAAA,IACF,CAAC,CAAA;AAED,IAAAD,SAAA,CAAG,kDAAkD,YAAY;AAC/D,MAAA,MAAM,QAAQ,cAAA,EAAe;AAC7B,MAAA,MAAM,OAAA,GAAU,IAAI,KAAA,CAAM,UAAU,CAAA;AACpC,MAAA,MAAMC,aAAA;AAAA,QACJ,KAAA,CAAM,WAAA,CAAY,OAAO,WAAA,KAAgB;AACvC,UAAA,MAAM,KAAA,CAAM,MAAA;AAAA,YACV,WAAA;AAAA,YACA,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAA;AAAA,YACrD,GAAG,CAAC;AAAA,WACN;AACA,UAAA,MAAM,OAAA;AAAA,QACR,CAAC;AAAA,OACH,CAAE,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA;AACtB,MAAAA,aAAA,CAAO,MAAM,MAAM,cAAA,CAAe,EAAE,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AACjD,MAAAA,aAAA,CAAO,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,IAC/C,CAAC,CAAA;AAED,IAAAD,SAAA,CAAG,6CAA6C,YAAY;AAC1D,MAAA,MAAMC,aAAA,CAAO,MAAM,WAAA,CAAY,YAAY,QAAQ,CAAC,CAAA,CAAE,QAAA,CAAS,IAAA,CAAK,QAAQ,CAAA;AAAA,IAC9E,CAAC,CAAA;AAED,IAAAD,SAAA,CAAG,kDAAkD,YAAY;AAC/D,MAAA,MAAM,QAAQ,cAAA,CAAe;AAAA,QAC3B,GAAA,EAAK,UAAA;AAAA,QACL,OAAA,EAAS,EAAE,IAAA,EAAM,0CAAA,EAAa,QAAQ,EAAE,IAAA,EAAM,CAAC,CAAA,EAAG,OAAO,IAAA,EAAM,IAAI,CAAA,EAAE,EAAG,QAAQ,IAAA,EAAK;AAAA,QACrF,OAAA,EAAS,EAAE,WAAA,EAAa,eAAA,EAAiB,QAAQ,MAAA,EAAO;AAAA,QACxD,eAAeH,iBAAAA,EAAa;AAAA,QAC5B,aAAaA,iBAAAA,EAAa;AAAA,QAC1B,UAAA,kBAAY,IAAI,IAAA,CAAK,0BAA0B;AAAA,OAChD,CAAA;AACD,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACnE,MAAA,MAAM,CAAC,OAAO,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA;AAC3C,MAAAI,aAAA,CAAO,OAAA,CAAS,KAAK,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAA;AACpC,MAAAA,aAAA,CAAO,OAAA,CAAS,KAAA,CAAM,UAAU,CAAA,CAAE,eAAe,IAAI,CAAA;AAAA,IACvD,CAAC,CAAA;AAED,IAAAD,SAAA,CAAG,yEAAyE,YAAY;AACtF,MAAA,MAAM,QAAQ,cAAA,EAAe;AAC7B,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACnE,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO;AAAA,QAC1B,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAA,EAAG,cAAA,CAAe,WAAW,CAAC,CAAA;AAAE,OACjF,CAAA;AACD,MAAAC,aAAA,CAAO,MAAM,EAAE,OAAA,CAAQ;AAAA,QACrB,kBAAkB,EAAC;AAAA,QACnB,iBAAA,EAAmB,CAAC,KAAA,CAAM,EAAE,CAAA;AAAA,QAC5B,qBAAA,EAAuB;AAAA,OACxB,CAAA;AACD,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,cAAA,CAAe,EAAE,OAAA,EAAS,KAAA,CAAM,IAAI,CAAA;AAChE,MAAAA,aAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW,OAAO,OAAO,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,WAAA,EAAa,WAAW,CAAC,CAAA;AAAA,IAC3F,CAAC,CAAA;AAED,IAAAD,SAAA,CAAG,6DAA6D,YAAY;AAC1E,MAAA,MAAM,QAAQ,cAAA,EAAe;AAC7B,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO;AAAA,QAC1B,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAA,EAAG,cAAA,CAAe,WAAW,CAAC,CAAA,EAAE;AAAA,QAChF,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA;AAAE,OACpD,CAAA;AACD,MAAAC,aAAA,CAAO,OAAO,gBAAgB,CAAA,CAAE,QAAQ,CAAC,KAAA,CAAM,EAAE,CAAC,CAAA;AAClD,MAAAA,aAAA,CAAO,OAAO,iBAAiB,CAAA,CAAE,QAAQ,CAAC,KAAA,CAAM,EAAE,CAAC,CAAA;AACnD,MAAAA,aAAA,CAAO,MAAA,CAAO,qBAAqB,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA;AAC3C,MAAAA,aAAA,CAAO,MAAM,MAAM,cAAA,CAAe,EAAE,CAAC,CAAA,CAAE,aAAa,CAAC,CAAA;AAAA,IACvD,CAAC,CAAA;AAED,IAAAD,SAAA,CAAG,yDAAyD,YAAY;AACtE,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAE,QAAQ,EAAA,EAAG,EAAG,MAAM,cAAA,EAAgB,CAAA;AAChE,MAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,QACZ,OAAO,GAAA,CAAI,CAAC,KAAA,KAAU,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,eAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAC;AAAA,OACtF;AACA,MAAAC,aAAA,CAAO,MAAM,KAAA,CAAM,cAAA,CAAe,EAAE,KAAA,EAAO,KAAO,CAAC,CAAA,CAAE,YAAA,CAAa,EAAE,CAAA;AAAA,IACtE,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAAF,eAAA,CAAS,SAAS,MAAM;AACtB,IAAAC,SAAA,CAAG,0EAA0E,YAAY;AACvF,MAAA,MAAM,QAAQ,cAAA,EAAe;AAC7B,MAAA,MAAM,MAAA,CAAO;AAAA,QACX,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAA,EAAG,cAAA,CAAe,WAAW,CAAC,CAAA;AAAE,OACjF,CAAA;AACD,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,GAAK,CAAC,CAAA;AACpD,MAAAC,aAAA,CAAO,OAAO,CAAA,CAAE,YAAA,CAAa,CAAC,CAAA;AAC9B,MAAAA,aAAA,CAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAE,aAAA,CAAc;AAAA,QAC/B,OAAA,EAAS,WAAA;AAAA,QACT,OAAA,EAAS,CAAA;AAAA,QACT,cAAA,EAAgB,EAAA,CAAG,GAAA,GAAQ,QAAQ;AAAA,OACpC,CAAA;AACD,MAAAA,aAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,CAAG,UAAU,EAAE,OAAA,CAAQA,aAAA,CAAO,GAAA,CAAI,MAAM,CAAC,CAAA;AACzD,MAAA,MAAM,CAAC,MAAM,CAAA,GAAI,MAAM,MAAM,cAAA,CAAe,EAAE,OAAA,EAAS,WAAA,EAAa,CAAA;AACpE,MAAAA,aAAA,CAAO,MAAM,CAAA,CAAE,aAAA,CAAc,EAAE,MAAA,EAAQ,cAAc,QAAA,EAAU,CAAA,EAAG,UAAA,EAAY,UAAA,EAAY,CAAA;AAC1F,MAAAA,aAAA,CAAO,OAAQ,cAAc,CAAA,CAAE,QAAQ,EAAA,CAAG,GAAA,GAAQ,QAAQ,CAAC,CAAA;AAAA,IAC7D,CAAC,CAAA;AAED,IAAAD,SAAA,CAAG,2CAA2C,YAAY;AACxD,MAAA,MAAM,MAAA,CAAO;AAAA,QACX,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,UAAA,EAAY,CAAC,cAAA,CAAe,WAAA,EAAa,EAAA,CAAG,GAAK,CAAC,CAAC,CAAA;AAAE,OACjF,CAAA;AACD,MAAAC,aAAA,CAAO,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,IAAK,CAAC,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AACxD,MAAAA,aAAA,CAAO,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,GAAK,CAAC,CAAC,CAAA,CAAE,YAAA,CAAa,CAAC,CAAA;AAAA,IAC9D,CAAC,CAAA;AAED,IAAAD,SAAA,CAAG,6CAA6C,YAAY;AAC1D,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACrF,MAAAC,aAAA,CAAO,MAAM,MAAM,EAAE,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,IACpC,CAAC,CAAA;AAED,IAAAD,SAAA,CAAG,wDAAwD,YAAY;AACrE,MAAA,MAAM,OAAO,cAAA,EAAe;AAC5B,MAAA,MAAM,QAAQ,cAAA,EAAe;AAC7B,MAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,MAAA,MAAM,MAAA,CAAO;AAAA,QACX,EAAE,KAAA,EAAO,IAAA,EAAM,UAAA,EAAY,CAAC,cAAA,CAAe,WAAA,EAAa,EAAA,CAAG,GAAG,CAAC,CAAC,CAAA,EAAE;AAAA,QAClE,EAAE,KAAA,EAAO,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAA,EAAa,EAAA,CAAG,GAAG,CAAC,CAAC,CAAA,EAAE;AAAA,QACnE,EAAE,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAY,CAAC,cAAA,CAAe,WAAA,EAAa,EAAA,CAAG,GAAG,CAAC,CAAC,CAAA;AAAE,OACrE,CAAA;AACD,MAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,GAAK,CAAA,EAAG,CAAC,CAAA;AACrD,MAAAC,aAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAC,QAAA,KAAa,SAAS,KAAA,CAAM,EAAE,CAAC,CAAA,CAAE,QAAQ,CAAC,KAAA,CAAM,EAAA,EAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAChF,MAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,GAAK,CAAA,EAAG,CAAC,CAAA;AACtD,MAAAA,aAAA,CAAO,MAAA,CAAO,GAAA,CAAI,CAAC,QAAA,KAAa,QAAA,CAAS,KAAA,CAAM,EAAE,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAC,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IACvE,CAAC,CAAA;AAED,IAAAD,SAAA,CAAG,6DAA6D,YAAY;AAC1E,MAAA,MAAM,GAAA,GAAM,CAACH,iBAAAA,EAAa,EAAGA,mBAAa,EAAGA,iBAAAA,EAAc,CAAA,CAAE,IAAA,EAAK;AAClE,MAAA,MAAM,MAAA,CAAO;AAAA,QACX;AAAA,UACE,OAAO,cAAA,EAAe;AAAA,UACtB,UAAA,EAAY,CAAC,EAAE,EAAA,EAAI,GAAA,CAAI,CAAC,CAAA,EAAI,OAAA,EAAS,WAAA,EAAa,WAAA,EAAa,EAAA,CAAG,CAAC,GAAG;AAAA,SACxE;AAAA,QACA;AAAA,UACE,OAAO,cAAA,EAAe;AAAA,UACtB,UAAA,EAAY,CAAC,EAAE,EAAA,EAAI,GAAA,CAAI,CAAC,CAAA,EAAI,OAAA,EAAS,WAAA,EAAa,WAAA,EAAa,EAAA,CAAG,CAAC,GAAG;AAAA,SACxE;AAAA,QACA;AAAA,UACE,OAAO,cAAA,EAAe;AAAA,UACtB,UAAA,EAAY,CAAC,EAAE,EAAA,EAAI,GAAA,CAAI,CAAC,CAAA,EAAI,OAAA,EAAS,WAAA,EAAa,WAAA,EAAa,EAAA,CAAG,CAAC,GAAG;AAAA;AACxE,OACD,CAAA;AACD,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,CAAC,CAAA;AACnD,MAAAI,aAAA,CAAO,OAAA,CAAQ,IAAI,CAAC,QAAA,KAAa,SAAS,UAAU,CAAC,CAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAAA,IACpE,CAAC,CAAA;AAED,IAAAD,SAAA,CAAG,+DAA+D,YAAY;AAC5E,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACrF,MAAA,MAAM,CAAC,KAAK,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAChD,MAAAC,aAAA,CAAO,MAAM,KAAA,CAAM,CAAC,WAAW,GAAG,EAAA,CAAG,QAAA,GAAW,CAAC,CAAA,EAAG,KAAK,UAAU,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAChF,MAAA,MAAM,CAAC,MAAM,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,QAAQ,CAAA,EAAG,GAAA,EAAK,UAAU,CAAA;AACzE,MAAAA,aAAA,CAAO,MAAM,EAAE,aAAA,CAAc,EAAE,YAAY,KAAA,CAAO,UAAA,EAAY,OAAA,EAAS,CAAA,EAAG,CAAA;AAC1E,MAAAA,aAAA,CAAO,OAAQ,UAAU,CAAA,CAAE,GAAA,CAAI,IAAA,CAAK,MAAO,UAAU,CAAA;AAAA,IACvD,CAAC,CAAA;AAED,IAAAD,SAAA,CAAG,4DAA4D,YAAY;AACzE,MAAA,MAAM,UAAU,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,EAAA,IAAM,OAAO;AAAA,QAChD,OAAO,cAAA,EAAe;AAAA,QACtB,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC;AAAA,OAC1C,CAAE,CAAA;AACF,MAAA,MAAM,OAAO,OAAO,CAAA;AAGpB,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,QAC5B,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,GAAE,EAAG,OAAO,GAAG,KAAA,KAAU;AAC5C,UAAA,MAAM,MAAyB,EAAC;AAChC,UAAA,WAAS;AACP,YAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,EAAI,CAAA,OAAA,EAAU,KAAK,CAAA,CAAE,CAAA;AACrE,YAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,cAAA,OAAO,GAAA;AAAA,YACT;AACA,YAAA,GAAA,CAAI,IAAA,CAAK,GAAG,KAAK,CAAA;AAAA,UACnB;AAAA,QACF,CAAC;AAAA,OACH;AACA,MAAA,MAAM,SAAA,GAAY,MAAM,KAAA,CAAM,CAAC,WAAW,GAAG,EAAA,CAAG,CAAC,CAAA,EAAG,GAAA,EAAK,aAAa,CAAA;AACtE,MAAA,MAAM,UAAA,GAAa,CAAC,GAAG,OAAA,CAAQ,IAAA,EAAK,EAAG,GAAG,SAAS,CAAA,CAAE,GAAA,CAAI,CAAC,QAAA,KAAa,SAAS,UAAU,CAAA;AAC1F,MAAAC,aAAA,CAAO,IAAI,IAAI,UAAU,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,WAAW,MAAM,CAAA;AACvD,MAAAA,aAAA,CAAO,UAAU,CAAA,CAAE,YAAA,CAAa,EAAE,CAAA;AAAA,IACpC,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AChNO,SAAS,gBAA8B,KAAA,EAA0C;AACtF,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,cAAA,EAAe,GAAI,KAAA;AAC1C,EAAA,IAAI,KAAA;AAEJ,EAAAH,kBAAW,MAAM;AACf,IAAA,KAAA,GAAQ,MAAM,KAAA,EAAM;AAAA,EACtB,CAAC,CAAA;AAED,EAAAC,eAAAA,CAAS,WAAW,MAAM;AACxB,IAAAC,SAAAA,CAAG,oDAAoD,YAAY;AACjE,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACrF,MAAA,MAAM,CAAC,KAAK,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAChD,MAAA,MAAM,CAAC,OAAO,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,QAAQ,CAAA,EAAG,GAAA,EAAK,UAAU,CAAA;AAC1E,MAAAC,aAAAA,CAAO,MAAM,KAAA,CAAM,QAAA,CAAS,KAAA,EAAQ,EAAA,CAAG,QAAA,GAAW,CAAC,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AACjE,MAAAA,cAAO,MAAM,KAAA,CAAM,WAAA,CAAY,KAAA,EAAQ,GAAG,QAAA,GAAW,CAAC,CAAA,EAAG,EAAA,CAAG,WAAW,CAAC,CAAC,CAAC,CAAA,CAAE,KAAK,KAAK,CAAA;AACtF,MAAAA,aAAAA;AAAA,QACE,MAAM,KAAA,CAAM,UAAA,CAAW,KAAA,EAAQ,EAAA,CAAG,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,GAAA,EAAI,EAAG,EAAA,CAAG,QAAA,GAAW,CAAC,CAAC;AAAA,OACzF,CAAE,KAAK,KAAK,CAAA;AACZ,MAAAA,cAAO,MAAM,KAAA,CAAM,IAAA,CAAK,KAAA,EAAQ,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,GAAA,IAAO,EAAA,CAAG,QAAA,GAAW,CAAC,CAAC,CAAC,CAAA,CAAE,IAAA;AAAA,QAClF;AAAA,OACF;AACA,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,QAAA,CAAS,OAAA,EAAU,EAAA,CAAG,QAAA,GAAW,CAAC,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAClE,MAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,QAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,cAAA,CAAe,EAAE,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AACjD,QAAA;AAAA,MACF;AACA,MAAA,MAAM,CAAC,MAAM,CAAA,GAAI,MAAM,KAAA,CAAM,cAAA,CAAe,EAAE,CAAA;AAC9C,MAAAA,aAAAA,CAAO,MAAM,CAAA,CAAE,aAAA,CAAc;AAAA,QAC3B,MAAA,EAAQ,WAAA;AAAA,QACR,UAAA,EAAY,IAAA;AAAA,QACZ,cAAA,EAAgB;AAAA,OACjB,CAAA;AACD,MAAAA,aAAAA,CAAO,OAAQ,WAAW,CAAA,CAAE,QAAQ,EAAA,CAAG,QAAA,GAAW,CAAC,CAAC,CAAA;AAAA,IACtD,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,6BAA6B,YAAY;AAC1C,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACrF,MAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA;AAC5C,MAAAC,aAAAA,CAAO,MAAM,KAAA,CAAM,QAAA,CAAS,QAAA,EAAW,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACxD,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,QAAA,CAAS,QAAA,EAAW,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AAAA,IAC3D,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,wCAAwC,YAAY;AACrD,MAAA,MAAM,QAAQ,EAAE,UAAA,EAAYH,mBAAa,EAAG,UAAA,EAAYA,mBAAa,EAAE;AACvE,MAAAI,aAAAA,CAAO,MAAM,KAAA,CAAM,QAAA,CAAS,KAAA,EAAO,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AACrD,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,WAAA,CAAY,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,KAAK,KAAK,CAAA;AAAA,IACjE,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,wBAAwB,YAAY;AACrC,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACrF,MAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA;AAC5C,MAAAC,aAAAA,CAAO,MAAM,KAAA,CAAM,WAAA,CAAY,UAAW,EAAA,CAAG,QAAA,GAAW,CAAC,CAAA,EAAG,GAAG,EAAE,CAAC,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AAC9E,MAAAA,cAAO,MAAM,KAAA,CAAM,CAAC,WAAW,GAAG,EAAA,CAAG,QAAA,GAAW,CAAC,CAAA,EAAG,KAAK,UAAU,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAChF,MAAA,MAAM,CAAC,MAAM,CAAA,GAAI,MAAM,KAAA,CAAM,cAAA,CAAe,EAAE,CAAA;AAC9C,MAAAA,aAAAA,CAAO,OAAQ,cAAc,CAAA,CAAE,QAAQ,EAAA,CAAG,QAAA,GAAW,CAAC,CAAC,CAAA;AAAA,IACzD,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,mDAAmD,YAAY;AAChE,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACrF,MAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA;AAC5C,MAAA,MAAMC,aAAAA;AAAA,QACJ,KAAA,CAAM,WAAA,CAAY,OAAO,WAAA,KAAgB;AACvC,UAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,QAAA,CAAS,QAAA,EAAW,EAAA,CAAG,CAAC,CAAA,EAAG,WAAW,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACrE,UAAA,MAAM,IAAI,MAAM,UAAU,CAAA;AAAA,QAC5B,CAAC;AAAA,OACH,CAAE,OAAA,CAAQ,OAAA,CAAQ,UAAU,CAAA;AAC5B,MAAAA,aAAAA,CAAAA,CAAQ,MAAM,KAAA,CAAM,cAAA,CAAe,EAAE,CAAA,EAAG,CAAC,CAAA,CAAG,MAAM,CAAA,CAAE,IAAA,CAAK,YAAY,CAAA;AACrE,MAAA,MAAM,KAAA,CAAM,WAAA,CAAY,OAAO,WAAA,KAAgB;AAC7C,QAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,QAAA,CAAS,QAAA,EAAW,EAAA,CAAG,CAAC,CAAA,EAAG,WAAW,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAAA,MACvE,CAAC,CAAA;AACD,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAAA,aAAAA,CAAAA,CAAQ,MAAM,KAAA,CAAM,cAAA,CAAe,EAAE,CAAA,EAAG,CAAC,CAAA,CAAG,MAAM,CAAA,CAAE,IAAA,CAAK,WAAW,CAAA;AAAA,MACtE,CAAA,MAAO;AACL,QAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,cAAA,CAAe,EAAE,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,MACnD;AAAA,IACF,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,wDAAwD,YAAY;AACrE,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACrF,MAAA,MAAM,CAAC,KAAK,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAChD,MAAA,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,GAAG,QAAQ,CAAA,EAAG,KAAK,UAAU,CAAA;AACxD,MAAA,MAAM,KAAA,CAAM,WAAA,CAAY,OAAO,WAAA,KAAgB;AAC7C,QAAAC,aAAAA,CAAO,MAAM,KAAA,CAAM,QAAA,CAAS,KAAA,EAAQ,EAAA,CAAG,QAAA,GAAW,CAAC,CAAA,EAAG,WAAW,CAAC,CAAA,CAAE,KAAK,KAAK,CAAA;AAAA,MAChF,CAAC,CAAA;AACD,MAAAA,aAAAA,CAAAA,CAAQ,MAAM,KAAA,CAAM,cAAA,CAAe,EAAE,CAAA,EAAG,CAAC,CAAA,CAAG,MAAM,CAAA,CAAE,IAAA,CAAK,YAAY,CAAA;AAAA,IACvE,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAAF,eAAAA,CAAS,4BAA4B,MAAM;AACzC,IAAAC,SAAAA,CAAG,yCAAyC,YAAY;AACtD,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACrF,MAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA;AAC5C,MAAA,MAAM,QAAQ,EAAE,IAAA,EAAM,aAAa,OAAA,EAAS,MAAA,EAAQ,OAAO,2BAAA,EAA4B;AACvF,MAAAC,aAAAA,CAAO,MAAM,KAAA,CAAM,UAAA,CAAW,UAAW,EAAA,CAAG,GAAM,CAAA,EAAG,KAAA,EAAO,GAAG,CAAC,CAAC,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AAC7E,MAAA,MAAM,CAAC,MAAM,CAAA,GAAI,MAAM,KAAA,CAAM,cAAA,CAAe,EAAE,CAAA;AAC9C,MAAAA,aAAAA,CAAO,MAAM,CAAA,CAAE,aAAA,CAAc;AAAA,QAC3B,MAAA,EAAQ,SAAA;AAAA,QACR,QAAA,EAAU,CAAA;AAAA,QACV,SAAA,EAAW,KAAA;AAAA,QACX,UAAA,EAAY;AAAA,OACb,CAAA;AACD,MAAAA,cAAO,MAAA,CAAQ,WAAW,EAAE,OAAA,CAAQ,EAAA,CAAG,GAAM,CAAC,CAAA;AAC9C,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,IAAK,CAAC,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AACxD,MAAA,MAAM,CAAC,KAAK,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,GAAM,CAAC,CAAA;AACrD,MAAAA,aAAAA,CAAO,KAAA,CAAO,OAAO,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,IAC/B,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,kDAAkD,YAAY;AAC/D,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACrF,MAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA;AAC5C,MAAA,MAAM,KAAA,GAAQ,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,OAAA,EAAQ;AAChD,MAAAC,aAAAA,CAAO,MAAM,KAAA,CAAM,IAAA,CAAK,QAAA,EAAW,KAAA,EAAO,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC3D,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,QAAA,GAAW,EAAE,CAAC,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAChE,MAAA,MAAM,CAAC,MAAM,CAAA,GAAI,MAAM,MAAM,cAAA,CAAe,EAAE,MAAA,EAAQ,MAAA,EAAQ,CAAA;AAC9D,MAAAA,aAAAA,CAAO,MAAM,CAAA,CAAE,aAAA,CAAc,EAAE,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAO,CAAA;AACjE,MAAAA,cAAO,MAAA,CAAQ,SAAS,EAAE,OAAA,CAAQ,EAAA,CAAG,CAAC,CAAC,CAAA;AAAA,IACzC,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,8DAA8D,YAAY;AAC3E,MAAA,MAAM,QAAQ,cAAA,EAAe;AAC7B,MAAA,MAAM,MAAA,CAAO;AAAA,QACX,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAA,EAAG,cAAA,CAAe,WAAW,CAAC,CAAA;AAAE,OACjF,CAAA;AACD,MAAA,MAAM,CAAC,IAAI,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA;AACxC,MAAA,MAAM,KAAA,CAAM,IAAA,CAAK,IAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,OAAA,EAAQ,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAClE,MAAA,MAAM,CAAC,OAAO,CAAA,GAAI,MAAM,MAAM,cAAA,CAAe,EAAE,OAAA,EAAS,WAAA,EAAa,CAAA;AACrE,MAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,OAAA;AAAA,QACxB,CAAC,KAAM,UAAA,EAAY,IAAA,CAAM,YAAY,OAAA,CAAS,EAAA,EAAIH,mBAAc,CAAA;AAAA,QAChE,GAAG,GAAG;AAAA,OACR;AACA,MAAAI,aAAAA,CAAO,KAAK,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA;AACpB,MAAA,MAAM,CAAC,MAAM,CAAA,GAAI,MAAM,MAAM,cAAA,CAAe,EAAE,OAAA,EAAS,WAAA,EAAa,CAAA;AACpE,MAAAA,aAAAA,CAAO,MAAM,CAAA,CAAE,aAAA,CAAc,EAAE,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,CAAA,EAAG,CAAA;AAC/D,MAAAA,cAAO,MAAA,CAAQ,WAAW,EAAE,OAAA,CAAQ,EAAA,CAAG,GAAG,CAAC,CAAA;AAC3C,MAAA,MAAM,CAAC,KAAK,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,GAAG,CAAC,CAAA;AAClD,MAAAA,aAAAA,CAAO,KAAA,CAAO,OAAO,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,IAC/B,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAAF,eAAAA,CAAS,iBAAiB,MAAM;AAC9B,IAAA,eAAe,YAAY,GAAA,EAAa,KAAA,EAAe,QAAA,GAAW,CAAC,WAAW,CAAA,EAAG;AAC/E,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAG,MAAM,cAAA,CAAe,EAAE,GAAA,EAAK,CAAC,CAAA;AAC1E,MAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,QAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,YAAY,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAAY,cAAA,CAAe,OAAO,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,MAC1F;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAAC,SAAAA,CAAG,gEAAgE,YAAY;AAC7E,MAAA,MAAM,CAAC,OAAO,MAAA,EAAQ,KAAK,IAAI,MAAM,WAAA,CAAY,WAAW,CAAC,CAAA;AAC7D,MAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA;AACxC,MAAAC,aAAAA,CAAO,MAAA,CAAO,GAAA,CAAI,CAAC,aAAa,QAAA,CAAS,KAAA,CAAM,EAAE,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAC,KAAA,CAAO,EAAE,CAAC,CAAA;AACvE,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAC7C,MAAA,MAAM,MAAM,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,EAAI,EAAA,CAAG,CAAC,CAAC,CAAA;AACtC,MAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA;AACxC,MAAAA,aAAAA,CAAO,MAAA,CAAO,GAAA,CAAI,CAAC,aAAa,QAAA,CAAS,KAAA,CAAM,EAAE,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAC,MAAA,CAAQ,EAAE,CAAC,CAAA;AACxE,MAAA,MAAM,MAAM,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,EAAI,EAAA,CAAG,CAAC,CAAC,CAAA;AACtC,MAAAA,aAAAA,CAAAA,CAAQ,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA,EAAG,GAAA,CAAI,CAAC,aAAa,QAAA,CAAS,KAAA,CAAM,EAAE,CAAC,EAAE,OAAA,CAAQ;AAAA,QAChF,KAAA,CAAO;AAAA,OACR,CAAA;AAAA,IACH,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,yDAAyD,YAAY;AACtE,MAAA,MAAM,CAAC,KAAA,EAAO,MAAM,IAAI,MAAM,WAAA,CAAY,WAAW,CAAC,CAAA;AACtD,MAAA,MAAM,CAAC,IAAI,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA;AACxC,MAAA,MAAM,KAAA,CAAM,UAAA,CAAW,IAAA,EAAO,EAAA,CAAG,GAAM,CAAA,EAAG,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,OAAA,EAAQ,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACpF,MAAAC,aAAAA,CAAO,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,GAAM,CAAC,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AACzD,MAAA,MAAM,CAAC,OAAO,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,GAAM,CAAC,CAAA;AACvD,MAAAA,cAAO,OAAA,CAAS,KAAA,CAAM,EAAE,CAAA,CAAE,IAAA,CAAK,MAAO,EAAE,CAAA;AACxC,MAAA,MAAM,KAAA,CAAM,QAAA,CAAS,OAAA,EAAU,EAAA,CAAG,KAAM,CAAC,CAAA;AACzC,MAAAA,eAAQ,MAAM,KAAA,CAAM,CAAC,WAAW,GAAG,EAAA,CAAG,KAAM,CAAC,CAAA,EAAG,CAAC,CAAA,CAAG,KAAA,CAAM,EAAE,CAAA,CAAE,IAAA,CAAK,OAAQ,EAAE,CAAA;AAAA,IAC/E,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,mDAAmD,YAAY;AAChE,MAAA,MAAM,GAAG,MAAM,IAAI,MAAM,WAAA,CAAY,WAAW,CAAC,CAAA;AACjD,MAAA,MAAM,CAAC,IAAI,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA;AACxC,MAAA,MAAM,KAAA,CAAM,IAAA,CAAK,IAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,OAAA,EAAQ,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAClE,MAAAC,aAAAA,CAAAA,CAAQ,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA,CAAG,KAAA,CAAM,EAAE,CAAA,CAAE,IAAA,CAAK,OAAQ,EAAE,CAAA;AAAA,IACnE,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,qCAAqC,YAAY;AAClD,MAAA,MAAM,CAAC,KAAA,EAAO,MAAM,CAAA,GAAI,MAAM,WAAA,CAAY,SAAA,EAAW,CAAA,EAAG,CAAC,WAAA,EAAa,WAAW,CAAC,CAAA;AAClF,MAAA,MAAM,CAAC,KAAK,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA;AACzC,MAAA,MAAM,KAAA,CAAM,QAAA,CAAS,KAAA,EAAQ,EAAA,CAAG,CAAC,CAAC,CAAA;AAClC,MAAA,MAAM,CAAC,KAAK,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA;AACzC,MAAAC,cAAO,KAAA,CAAO,KAAA,CAAM,EAAE,CAAA,CAAE,IAAA,CAAK,OAAQ,EAAE,CAAA;AACvC,MAAA,MAAM,CAAC,KAAK,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA;AACzC,MAAAA,cAAO,KAAA,CAAO,KAAA,CAAM,EAAE,CAAA,CAAE,IAAA,CAAK,MAAO,EAAE,CAAA;AAAA,IACxC,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,sDAAsD,YAAY;AACnE,MAAA,MAAM,WAAA,CAAY,WAAW,CAAC,CAAA;AAC9B,MAAA,MAAM,WAAA,CAAY,WAAW,CAAC,CAAA;AAC9B,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACrF,MAAAC,aAAAA,CAAO,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAC,CAAA,CAAE,YAAA,CAAa,CAAC,CAAA;AAAA,IACnD,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,0DAA0D,YAAY;AACvE,MAAA,MAAM,SAAS,KAAA,CAAM,IAAA;AAAA,QAAK,EAAE,QAAQ,EAAA,EAAG;AAAA,QAAG,CAAC,CAAA,EAAG,KAAA,KAC5C,cAAA,CAAe,EAAE,GAAA,EAAK,QAAA,EAAU,OAAA,EAAS,EAAE,KAAA,EAAM,EAAG;AAAA,OACtD;AACA,MAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,QACZ,OAAO,GAAA,CAAI,CAAC,KAAA,KAAU,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,eAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAC;AAAA,OACtF;AACA,MAAA,MAAM,OAAiB,EAAC;AACxB,MAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,EAAA,EAAI,SAAS,CAAA,EAAG;AAC1C,QAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA;AACvC,QAAAC,aAAAA,CAAO,KAAK,CAAA,CAAE,YAAA,CAAa,CAAC,CAAA;AAC5B,QAAA,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAG,MAAM,EAAE,CAAA;AAC5B,QAAA,MAAM,KAAA,CAAM,SAAS,KAAA,CAAM,CAAC,GAAI,EAAA,CAAG,KAAA,GAAQ,CAAC,CAAC,CAAA;AAAA,MAC/C;AACA,MAAAA,aAAAA,CAAO,IAAI,GAAA,CAAI,IAAI,EAAE,IAAI,CAAA,CAAE,KAAK,EAAE,CAAA;AAAA,IACpC,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AChNO,SAAS,oBAAkC,KAAA,EAA0C;AAC1F,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,cAAA,EAAe,GAAI,KAAA;AAC1C,EAAA,IAAI,KAAA;AAEJ,EAAAH,kBAAW,MAAM;AACf,IAAA,KAAA,GAAQ,MAAM,KAAA,EAAM;AAAA,EACtB,CAAC,CAAA;AAED,EAAAC,eAAAA,CAAS,WAAW,MAAM;AACxB,IAAAC,SAAAA,CAAG,8DAA8D,YAAY;AAC3E,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,EAAE,IAAA,EAAM,qBAAqB,CAAA;AAC1D,MAAA,MAAM,MAAA,GAAS,cAAA,CAAe,EAAE,IAAA,EAAM,sBAAsB,CAAA;AAC5D,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,OAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACjF,MAAA,MAAM,MAAA;AAAA,QACJ;AAAA,UACE;AAAA,YACE,KAAA,EAAO,MAAA;AAAA,YACP,YAAY,CAAC,cAAA,CAAe,WAAW,CAAA,EAAG,cAAA,CAAe,WAAW,CAAC;AAAA;AACvE,SACF;AAAA,QACA,GAAG,CAAC;AAAA,OACN;AACA,MAAAC,aAAAA,CAAO,MAAM,KAAA,CAAM,cAAA,CAAe,EAAE,SAAA,EAAW,oBAAA,EAAsB,CAAC,CAAA,CAAE,YAAA,CAAa,CAAC,CAAA;AACtF,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,cAAA,CAAe,EAAE,OAAA,EAAS,WAAA,EAAa,CAAC,CAAA,CAAE,YAAA,CAAa,CAAC,CAAA;AAC3E,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,cAAA,CAAe,EAAE,MAAA,EAAQ,SAAA,EAAW,OAAA,EAAS,WAAA,EAAa,CAAC,CAAA,CAAE,YAAA;AAAA,QAC9E;AAAA,OACF;AACA,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,cAAA,CAAe,EAAE,MAAA,EAAQ,MAAA,EAAQ,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AACjE,MAAA,MAAM,UAAU,MAAM,KAAA,CAAM,eAAe,EAAE,KAAA,EAAO,GAAG,CAAA;AACvD,MAAAA,aAAAA,CAAO,OAAO,CAAA,CAAE,YAAA,CAAa,CAAC,CAAA;AAC9B,MAAAA,aAAAA,CAAO,QAAQ,CAAC,CAAA,CAAG,MAAM,EAAE,CAAA,CAAE,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA;AAC1C,MAAAA,aAAAA,CAAO,QAAQ,CAAC,CAAA,CAAG,SAAS,CAAA,CAAE,OAAA,CAAQ,EAAA,CAAG,CAAC,CAAC,CAAA;AAAA,IAC7C,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,8CAA8C,YAAY;AAC3D,MAAA,MAAM,MAAA,CAAO;AAAA,QACX,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,UAAA,EAAY,CAAC,cAAA,CAAe,WAAA,EAAa,EAAA,CAAG,GAAG,CAAC,CAAC,CAAA,EAAE;AAAA,QAC9E,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,UAAA,EAAY,CAAC,cAAA,CAAe,WAAA,EAAa,EAAA,CAAG,GAAG,CAAC,CAAC,CAAA,EAAE;AAAA,QAC9E,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,UAAA,EAAY,CAAC,cAAA,CAAe,WAAA,EAAa,EAAA,CAAG,GAAM,CAAC,CAAC,CAAA,EAAE;AAAA,QACjF,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,UAAA,EAAY,CAAC,cAAA,CAAe,WAAA,EAAa,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA;AAAE,OAC7E,CAAA;AACD,MAAA,MAAM,CAAC,UAAU,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACrD,MAAA,MAAM,CAAC,IAAI,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,GAAG,CAAA,EAAG,CAAC,CAAA;AACpD,MAAA,MAAM,KAAA,CAAM,IAAA,CAAK,IAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,GAAA,EAAI,EAAG,EAAA,CAAG,GAAG,CAAC,CAAA;AAChE,MAAAC,aAAAA,CAAO,MAAM,KAAA,CAAM,UAAA,CAAW,GAAG,GAAK,CAAC,CAAC,CAAA,CAAE,OAAA,CAAQ;AAAA,QAChD,OAAA,EAAS,CAAA;AAAA,QACT,UAAA,EAAY,CAAA;AAAA,QACZ,SAAA,EAAW,CAAA;AAAA,QACX,IAAA,EAAM,CAAA;AAAA,QACN,WAAA,EAAa,GAAG,GAAG;AAAA,OACpB,CAAA;AACD,MAAAA,aAAAA,CAAAA,CAAQ,MAAM,KAAA,CAAM,UAAA,CAAW,EAAA,CAAG,QAAQ,CAAC,CAAA,EAAG,WAAW,CAAA,CAAE,OAAA,CAAQ,EAAA,CAAG,GAAG,CAAC,CAAA;AAC1E,MAAA,MAAM,KAAA,CAAM,QAAA,CAAS,UAAA,EAAa,EAAA,CAAG,CAAC,CAAC,CAAA;AACvC,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,UAAA,CAAW,GAAG,CAAC,CAAC,CAAC,CAAA,CAAE,aAAA,CAAc;AAAA,QAClD,SAAA,EAAW,iBAAiB,CAAA,GAAI,CAAA;AAAA,QAChC,UAAA,EAAY,CAAA;AAAA,QACZ,WAAA,EAAa;AAAA,OACd,CAAA;AAAA,IACH,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,kCAAkC,YAAY;AAC/C,MAAA,MAAM,MAAA,CAAO;AAAA,QACX,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,UAAA,EAAY,CAAC,cAAA,CAAe,WAAA,EAAa,EAAA,CAAG,QAAA,GAAW,CAAC,CAAC,CAAC,CAAA;AAAE,OACxF,CAAA;AACD,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACrF,MAAA,MAAM,MAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAChC,MAAAC,aAAAA,CAAAA,CAAQ,MAAM,KAAA,CAAM,UAAA,CAAW,GAAG,QAAA,GAAW,CAAC,CAAC,CAAA,EAAG,WAAW,CAAA,CAAE,OAAA,CAAQ,EAAA,CAAG,QAAQ,CAAC,CAAA;AAAA,IACrF,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAAF,eAAAA,CAAS,SAAS,MAAM;AACtB,IAAA,eAAe,sBAAA,GAAyB;AACtC,MAAA,MAAM,OAAO,cAAA,EAAe;AAC5B,MAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,MAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,MAAA,MAAM,MAAA,CAAO;AAAA,QACX,EAAE,OAAO,IAAA,EAAM,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAE;AAAA,QACzD,EAAE,OAAO,MAAA,EAAQ,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAE;AAAA,QAC3D,EAAE,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAA,EAAG,cAAA,CAAe,WAAW,CAAC,CAAA;AAAE,OACzF,CAAA;AACD,MAAA,MAAM,CAAC,YAAY,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA;AAChD,MAAA,MAAM,KAAA,CAAM,QAAA,CAAS,YAAA,EAAe,EAAA,CAAG,EAAE,CAAC,CAAA;AAC1C,MAAA,MAAM,CAAC,cAAc,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA;AAClD,MAAA,MAAM,KAAA,CAAM,IAAA,CAAK,cAAA,EAAiB,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,GAAA,EAAI,EAAG,EAAA,CAAG,EAAE,CAAC,CAAA;AACzE,MAAA,MAAM,CAAC,cAAc,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA;AAClD,MAAA,MAAM,KAAA,CAAM,QAAA,CAAS,cAAA,EAAiB,EAAA,CAAG,EAAE,CAAC,CAAA;AAC5C,MAAA,OAAO,EAAE,MAAA,EAAO;AAAA,IAClB;AAEA,IAAAC,SAAAA,CAAG,MAAM,cAAc,CAAA;AAAA,MACrB,qEAAA;AAAA,MACA,YAAY;AACV,QAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,sBAAA,EAAuB;AAChD,QAAAC,aAAAA,CAAO,MAAM,KAAA,CAAM,KAAA,CAAM,EAAE,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAE,iBAAA,EAAmB,CAAA,EAAG,aAAA,EAAe,GAAG,CAAA;AAChF,QAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,KAAA,CAAM,EAAE,eAAA,EAAiB,EAAA,CAAG,EAAE,CAAA,EAAG,CAAC,CAAA,CAAE,OAAA,CAAQ;AAAA,UAC7D,iBAAA,EAAmB,CAAA;AAAA,UACnB,aAAA,EAAe;AAAA,SAChB,CAAA;AACD,QAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,KAAA,CAAM,EAAE,eAAA,EAAiB,EAAA,CAAG,EAAE,CAAA,EAAG,CAAC,CAAA,CAAE,OAAA,CAAQ;AAAA,UAC7D,iBAAA,EAAmB,CAAA;AAAA,UACnB,aAAA,EAAe;AAAA,SAChB,CAAA;AACD,QAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,KAAA,CAAM,EAAE,UAAA,EAAY,EAAA,CAAG,EAAE,CAAA,EAAG,CAAC,CAAA,CAAE,OAAA,CAAQ;AAAA,UACxD,iBAAA,EAAmB,CAAA;AAAA,UACnB,aAAA,EAAe;AAAA,SAChB,CAAA;AACD,QAAA,MAAM,SAAA,GAAY,MAAM,KAAA,CAAM,cAAA,CAAe,EAAE,CAAA;AAC/C,QAAAA,aAAAA,CAAO,SAAA,CAAU,GAAA,CAAI,CAAC,MAAA,KAAW,MAAA,CAAO,OAAO,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAC,WAAW,CAAC,CAAA;AACvE,QAAAA,aAAAA,CAAO,UAAU,CAAC,CAAA,CAAG,MAAM,EAAE,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,EAAE,CAAA;AAAA,MAC/C;AAAA,KACF;AAEA,IAAAD,SAAAA,CAAG,KAAA,CAAM,CAAC,cAAc,CAAA;AAAA,MACtB,4EAAA;AAAA,MACA,YAAY;AACV,QAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,sBAAA,EAAuB;AAEhD,QAAAC,aAAAA,CAAO,MAAM,KAAA,CAAM,KAAA,CAAM,EAAE,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAE,iBAAA,EAAmB,CAAA,EAAG,aAAA,EAAe,GAAG,CAAA;AAChF,QAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,KAAA,CAAM,EAAE,eAAA,EAAiB,EAAA,CAAG,CAAC,CAAA,EAAG,CAAC,CAAA,CAAE,OAAA,CAAQ;AAAA,UAC5D,iBAAA,EAAmB,CAAA;AAAA,UACnB,aAAA,EAAe;AAAA,SAChB,CAAA;AACD,QAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,KAAA,CAAM,EAAE,eAAA,EAAiB,EAAA,CAAG,EAAE,CAAA,EAAG,CAAC,CAAA,CAAE,OAAA,CAAQ;AAAA,UAC7D,iBAAA,EAAmB,CAAA;AAAA,UACnB,aAAA,EAAe;AAAA,SAChB,CAAA;AACD,QAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,KAAA,CAAM,EAAE,UAAA,EAAY,EAAA,CAAG,EAAE,CAAA,EAAG,CAAC,CAAA,CAAE,OAAA,CAAQ;AAAA,UACxD,iBAAA,EAAmB,CAAA;AAAA,UACnB,aAAA,EAAe;AAAA,SAChB,CAAA;AACD,QAAA,MAAM,SAAA,GAAY,MAAM,KAAA,CAAM,cAAA,CAAe,EAAE,CAAA;AAC/C,QAAAA,aAAAA,CAAO,SAAA,CAAU,GAAA,CAAI,CAAC,MAAA,KAAW,MAAA,CAAO,OAAO,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAC,WAAW,CAAC,CAAA;AACvE,QAAAA,aAAAA,CAAO,UAAU,CAAC,CAAA,CAAG,MAAM,EAAE,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,EAAE,CAAA;AAAA,MAC/C;AAAA,KACF;AAEA,IAAAD,SAAAA,CAAG,4CAA4C,YAAY;AACzD,MAAA,MAAM,QAAQ,cAAA,EAAe;AAC7B,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACnE,MAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA;AAC5C,MAAA,MAAM,KAAA,CAAM,QAAA,CAAS,QAAA,EAAW,EAAA,CAAG,CAAC,CAAC,CAAA;AACrC,MAAA,MAAM,MAAM,KAAA,CAAM,EAAE,iBAAiB,EAAA,CAAG,CAAC,GAAG,CAAA;AAC5C,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AAClF,MAAAC,aAAAA,CAAO,OAAO,gBAAgB,CAAA,CAAE,QAAQ,CAAC,KAAA,CAAM,EAAE,CAAC,CAAA;AAAA,IACpD,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAAF,eAAAA,CAAS,WAAW,MAAM;AACxB,IAAAC,SAAAA,CAAG,6DAA6D,YAAY;AAC1E,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACrF,MAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACnD,MAAAC,aAAAA,CAAO,MAAM,KAAA,CAAM,OAAA,CAAQ,QAAA,EAAW,EAAA,CAAG,GAAG,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACzD,MAAA,MAAM,CAAC,MAAM,CAAA,GAAI,MAAM,KAAA,CAAM,cAAA,CAAe,EAAE,CAAA;AAC9C,MAAAA,aAAAA,CAAO,MAAM,CAAA,CAAE,aAAA,CAAc;AAAA,QAC3B,MAAA,EAAQ,SAAA;AAAA,QACR,QAAA,EAAU,CAAA;AAAA,QACV,UAAA,EAAY,IAAA;AAAA,QACZ,cAAA,EAAgB;AAAA,OACjB,CAAA;AACD,MAAAA,cAAO,MAAA,CAAQ,WAAW,EAAE,OAAA,CAAQ,EAAA,CAAG,GAAG,CAAC,CAAA;AAC3C,MAAAA,cAAO,MAAA,CAAQ,SAAS,EAAE,OAAA,CAAQ,EAAA,CAAG,GAAG,CAAC,CAAA;AACzC,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,OAAA,CAAQ,QAAA,EAAW,EAAA,CAAG,GAAG,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AAC1D,MAAA,MAAM,CAAC,KAAK,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,GAAG,CAAC,CAAA;AAClD,MAAAA,aAAAA,CAAO,KAAA,CAAO,OAAO,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,IAC/B,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAAF,eAAAA,CAAS,0BAA0B,MAAM;AACvC,IAAAC,SAAAA,CAAG,+CAA+C,YAAY;AAC5D,MAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,MAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,MAAA,MAAM,QAAQ,cAAA,EAAe;AAC7B,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,WAAA,CAAY,OAAO,WAAA,KAAgB;AACpD,QAAA,MAAM,KAAA,CAAM,MAAA;AAAA,UACV,WAAA;AAAA,UACA,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAA;AAAA,UACrD,GAAG,CAAC;AAAA,SACN;AACA,QAAA,MAAA,CAAO,OAAA,EAAQ;AACf,QAAA,MAAM,MAAA,CAAO,OAAA;AAAA,MACf,CAAC,CAAA;AACD,MAAA,MAAM,MAAA,CAAO,OAAA;AACb,MAAAC,aAAAA,CAAO,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAC7C,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,cAAA,CAAe,EAAE,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AACjD,MAAAA,aAAAA,CAAAA,CAAQ,MAAM,KAAA,CAAM,UAAA,CAAW,EAAA,CAAG,CAAC,CAAC,CAAA,EAAG,OAAO,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA;AACtD,MAAA,MAAA,CAAO,OAAA,EAAQ;AACf,MAAA,MAAM,IAAA;AACN,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAC,CAAA,CAAE,YAAA,CAAa,CAAC,CAAA;AAAA,IACnD,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,wDAAwD,YAAY;AACrE,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,EAAE,GAAA,EAAK,QAAQ,CAAA;AAC5C,MAAA,MAAM,MAAA,GAAS,cAAA,CAAe,EAAE,GAAA,EAAK,QAAQ,CAAA;AAC7C,MAAA,MAAM,eAAe,cAAA,EAAe;AACpC,MAAA,MAAM,eAAe,cAAA,EAAe;AACpC,MAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,WAAA,CAAY,OAAO,WAAA,KAAgB;AAChE,QAAA,MAAM,KAAA,CAAM,MAAA;AAAA,UACV,WAAA;AAAA,UACA,CAAC,EAAE,KAAA,EAAO,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAA;AAAA,UAC5D,GAAG,CAAC;AAAA,SACN;AACA,QAAA,YAAA,CAAa,OAAA,EAAQ;AACrB,QAAA,MAAM,YAAA,CAAa,OAAA;AAAA,MACrB,CAAC,CAAA;AACD,MAAA,MAAM,YAAA,CAAa,OAAA;AACnB,MAAA,MAAM,oBAAoB,KAAA,CAAM,WAAA;AAAA,QAAY,CAAC,gBAC3C,KAAA,CAAM,MAAA;AAAA,UACJ,WAAA;AAAA,UACA,CAAC,EAAE,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAA;AAAA,UAC7D,GAAG,CAAC;AAAA;AACN,OACF;AACA,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACtD,MAAA,YAAA,CAAa,OAAA,EAAQ;AACrB,MAAA,MAAM,gBAAA;AACN,MAAA,MAAM,iBAAA;AACN,MAAA,MAAM,CAAC,IAAI,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA;AACxC,MAAAC,cAAO,IAAA,CAAM,KAAA,CAAM,EAAE,CAAA,CAAE,IAAA,CAAK,MAAM,EAAE,CAAA;AACpC,MAAA,MAAM,KAAA,CAAM,QAAA,CAAS,IAAA,EAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AACjC,MAAAA,aAAAA,CAAAA,CAAQ,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA,CAAG,KAAA,CAAM,EAAE,CAAA,CAAE,IAAA,CAAK,OAAO,EAAE,CAAA;AAAA,IAClE,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,kEAAkE,YAAY;AAC/E,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,EAAE,GAAA,EAAK,QAAQ,CAAA;AAC5C,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,QAChC,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,QAC7D,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,YAAY,CAAC,cAAA,CAAe,WAAW,CAAA,EAAG,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC;AAAA,OAC3F,CAAA;AACD,MAAA,MAAM,WAAW,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,KAAW,OAAO,gBAAgB,CAAA;AACpE,MAAAC,cAAO,QAAQ,CAAA,CAAE,QAAQ,CAAC,KAAA,CAAM,EAAE,CAAC,CAAA;AACnC,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,cAAA,CAAe,EAAE,CAAA;AAC7C,MAAAA,aAAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,WAAW,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,WAAA,EAAa,WAAW,CAAC,CAAA;AAAA,IAC3F,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AChPO,SAAS,0BAAwC,KAAA,EAA0C;AAChG,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,KAAA;AAC1B,EAAA,IAAI,KAAA;AAEJ,EAAAH,kBAAW,MAAM;AACf,IAAA,KAAA,GAAQ,MAAM,KAAA,EAAM;AAAA,EACtB,CAAC,CAAA;AAED,EAAAC,eAAAA,CAAS,4BAA4B,MAAM;AACzC,IAAAC,SAAAA,CAAG,0DAA0D,YAAY;AACvE,MAAA,MAAM,UAAU,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,GAAA,IAAO,OAAO;AAAA,QACjD,KAAA,EAAO,cAAA,CAAe,EAAE,GAAA,EAAK,OAAO,CAAA;AAAA,QACpC,YAAY,CAAC,cAAA,CAAe,aAAa,EAAA,CAAG,CAAC,CAAC,CAAC;AAAA,OACjD,CAAE,CAAA;AACF,MAAA,MAAM,OAAO,OAAO,CAAA;AACpB,MAAA,MAAM,YAAY,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,IAAK,OAAO;AAAA,QACjD,OAAO,cAAA,EAAe;AAAA,QACtB,YAAY,CAAC,cAAA,CAAe,aAAa,EAAA,CAAG,EAAE,CAAC,CAAC;AAAA,OAClD,CAAE,CAAA;AACF,MAAA,MAAM,OAAO,SAAS,CAAA;AACtB,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,GAAG,CAAA,EAAG,EAAE,CAAA;AACtD,MAAAC,aAAAA,CAAO,OAAO,CAAA,CAAE,YAAA,CAAa,CAAC,CAAA;AAC9B,MAAAA,aAAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,QAAA,KAAa,QAAA,CAAS,KAAA,CAAM,GAAA,KAAQ,KAAK,CAAC,CAAA,CAAE,YAAA,CAAa,CAAC,CAAA;AAAA,IACnF,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,wEAAwE,YAAY;AACrF,MAAA,MAAM,IAAA,GAAO,cAAA,CAAe,EAAE,GAAA,EAAK,KAAK,CAAA;AACxC,MAAA,MAAM,IAAA,GAAO,cAAA,CAAe,EAAE,GAAA,EAAK,KAAK,CAAA;AACxC,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,IAAA,EAAM,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACzE,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,IAAA,EAAM,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACzE,MAAA,MAAM,CAAC,WAAW,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACtD,MAAA,MAAM,SAAA,GAAY,MAAM,KAAA,CAAM,CAAC,WAAW,GAAG,EAAA,CAAG,QAAQ,CAAA,EAAG,GAAA,EAAK,UAAU,CAAA;AAC1E,MAAAC,aAAAA,CAAO,SAAA,CAAU,GAAA,CAAI,CAAC,aAAa,QAAA,CAAS,KAAA,CAAM,EAAE,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAC,IAAA,CAAK,EAAE,CAAC,CAAA;AACxE,MAAAA,aAAAA;AAAA,QACE,MAAM,KAAA,CAAM,UAAA;AAAA,UACV,UAAU,CAAC,CAAA;AAAA,UACX,EAAA,CAAG,WAAW,EAAE,CAAA;AAAA,UAChB,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,GAAA,EAAI;AAAA,UAC9B,GAAG,QAAQ;AAAA;AACb,OACF,CAAE,KAAK,IAAI,CAAA;AACX,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,QAAA,GAAW,CAAC,CAAC,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAC/D,MAAA,MAAM,CAAC,WAAW,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,QAAA,GAAW,EAAE,CAAC,CAAA;AAClE,MAAA,MAAM,KAAA,CAAM,IAAA,CAAK,WAAA,EAAc,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,GAAA,EAAI,EAAG,EAAA,CAAG,QAAA,GAAW,EAAE,CAAC,CAAA;AACjF,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,OAAA,CAAQ,CAAC,WAAA,CAAa,UAAU,CAAA,EAAG,EAAA,CAAG,WAAW,EAAE,CAAC,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA;AAChF,MAAA,MAAM,CAAC,YAAY,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,QAAA,GAAW,EAAE,CAAC,CAAA;AACnE,MAAAA,cAAO,YAAA,CAAc,KAAA,CAAM,EAAE,CAAA,CAAE,IAAA,CAAK,KAAK,EAAE,CAAA;AAC3C,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,QAAA,GAAW,EAAE,CAAC,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAChE,MAAAA,aAAAA,CAAO,WAAW,CAAA,CAAE,WAAA,EAAY;AAAA,IAClC,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAAF,eAAAA,CAAS,+BAA+B,MAAM;AAC5C,IAAAC,SAAAA,CAAG,qEAAqE,YAAY;AAClF,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,EAAE,GAAA,EAAK,KAAK,CAAA;AACzC,MAAA,MAAM,MAAA,GAAS,cAAA,CAAe,EAAE,GAAA,EAAK,KAAK,CAAA;AAC1C,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AAC1E,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AAC3E,MAAA,MAAM,CAAC,IAAI,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAC/C,MAAA,MAAM,KAAA,CAAM,IAAA,CAAK,IAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,GAAA,EAAI,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAC9D,MAAA,MAAM,CAAC,SAAS,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACpD,MAAAC,cAAO,SAAA,CAAW,KAAA,CAAM,EAAE,CAAA,CAAE,IAAA,CAAK,OAAO,EAAE,CAAA;AAC1C,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,CAAM,UAAU,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA;AAC7D,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AACpD,MAAA,MAAM,KAAA,CAAM,QAAA,CAAS,SAAA,EAAY,EAAA,CAAG,CAAC,CAAC,CAAA;AACtC,MAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACnD,MAAAA,cAAO,QAAA,CAAU,KAAA,CAAM,EAAE,CAAA,CAAE,IAAA,CAAK,MAAM,EAAE,CAAA;AAAA,IAC1C,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,iEAAiE,YAAY;AAC9E,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,EAAE,GAAA,EAAK,KAAK,CAAA;AACzC,MAAA,MAAM,MAAA,GAAS,cAAA,CAAe,EAAE,GAAA,EAAK,KAAK,CAAA;AAC1C,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AAC1E,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AAC3E,MAAA,MAAM,CAAC,IAAI,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAC/C,MAAA,MAAM,KAAA,CAAM,IAAA,CAAK,IAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,GAAA,EAAI,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAC9D,MAAA,MAAM,MAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAChC,MAAA,MAAM,KAAA,CAAM,QAAQ,CAAC,IAAA,CAAM,UAAU,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAC7C,MAAA,MAAM,SAAA,GAAY,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,QAAQ,CAAC,CAAA;AAC7D,MAAAC,aAAAA,CAAO,SAAA,CAAU,GAAA,CAAI,CAAC,aAAa,QAAA,CAAS,KAAA,CAAM,EAAE,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAC,KAAA,CAAM,EAAE,CAAC,CAAA;AACzE,MAAA,MAAM,KAAA,CAAM,SAAS,SAAA,CAAU,CAAC,GAAI,EAAA,CAAG,CAAA,GAAI,QAAQ,CAAC,CAAA;AACpD,MAAA,MAAM,CAAC,OAAO,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,QAAQ,CAAC,CAAA;AAC7D,MAAAA,cAAO,OAAO,CAAA,CAAE,cAAc,EAAE,OAAA,EAAS,GAAG,CAAA;AAC5C,MAAAA,cAAO,OAAA,CAAS,KAAA,CAAM,EAAE,CAAA,CAAE,IAAA,CAAK,OAAO,EAAE,CAAA;AAAA,IAC1C,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAAF,eAAAA,CAAS,mBAAmB,MAAM;AAChC,IAAAC,SAAAA,CAAG,qDAAqD,YAAY;AAClE,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACrF,MAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACnD,MAAAC,aAAAA,CAAO,MAAM,KAAA,CAAM,WAAA,CAAY,UAAW,EAAA,CAAG,QAAA,GAAW,CAAC,CAAA,EAAG,GAAG,EAAE,CAAC,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AAC9E,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,WAAA,CAAY,UAAW,EAAA,CAAG,QAAA,GAAW,CAAC,CAAA,EAAG,GAAG,EAAE,CAAC,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,IAChF,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,kDAAkD,YAAY;AAC/D,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACrF,MAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACnD,MAAAC,cAAO,MAAM,KAAA,CAAM,WAAA,CAAY,QAAA,EAAW,GAAG,QAAA,GAAW,CAAC,CAAA,EAAG,EAAA,CAAG,WAAW,CAAC,CAAC,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AACxF,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,QAAA,CAAS,QAAA,EAAW,EAAA,CAAG,QAAA,GAAW,CAAC,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAAA,IACrE,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,mEAAmE,YAAY;AAChF,MAAA,MAAM,KAAA,GAAQ,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,GAAA,EAAI;AAC5C,MAAA,MAAM,MAAA,CAAO;AAAA,QACX;AAAA,UACE,OAAO,cAAA,EAAe;AAAA,UACtB,UAAA,EAAY,CAAC,cAAA,CAAe,GAAG,CAAA,EAAG,eAAe,GAAG,CAAA,EAAG,cAAA,CAAe,GAAG,CAAC;AAAA;AAC5E,OACD,CAAA;AACD,MAAA,MAAM,CAAC,SAAS,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,GAAG,CAAC,CAAA;AACrC,MAAA,MAAM,KAAA,CAAM,QAAA,CAAS,SAAA,EAAY,EAAA,CAAG,CAAC,CAAC,CAAA;AACtC,MAAA,MAAM,CAAC,MAAM,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,GAAG,CAAC,CAAA;AAClC,MAAA,MAAM,MAAM,IAAA,CAAK,MAAA,EAAS,KAAA,EAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AACtC,MAAA,MAAM,CAAC,WAAW,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,GAAG,CAAC,CAAA;AACvC,MAAA,MAAM,KAAA,CAAM,WAAW,WAAA,EAAc,EAAA,CAAG,GAAG,CAAA,EAAG,KAAA,EAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AAC1D,MAAA,KAAA,MAAW,KAAA,IAAS,CAAC,SAAA,EAAY,MAAA,EAAS,WAAY,CAAA,EAAG;AACvD,QAAAC,aAAAA,CAAO,MAAM,KAAA,CAAM,WAAA,CAAY,OAAO,EAAA,CAAG,QAAQ,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,KAAK,KAAK,CAAA;AACtE,QAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,UAAA,CAAW,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,KAAA,EAAO,GAAG,CAAC,CAAC,CAAC,CAAA,CAAE,KAAK,KAAK,CAAA;AACrE,QAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AACxD,QAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AACpD,QAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,QAAA,CAAS,KAAA,EAAO,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AAAA,MACvD;AAAA,IACF,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,4EAA4E,YAAY;AACzF,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,UAAA,EAAY,CAAC,cAAA,CAAe,GAAG,CAAC,CAAA,EAAG,CAAC,CAAA;AAC7E,MAAA,MAAM,CAAC,OAAO,CAAA,GAAI,MAAM,KAAA,CAAM,cAAA,CAAe,EAAE,CAAA;AAC/C,MAAA,MAAM,OAAO,EAAE,UAAA,EAAY,QAAS,EAAA,EAAI,UAAA,EAAYH,mBAAa,EAAE;AACnE,MAAAI,cAAO,MAAM,KAAA,CAAM,WAAW,IAAA,EAAM,EAAA,CAAG,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,GAAA,EAAI,EAAG,GAAG,CAAC,CAAC,CAAC,CAAA,CAAE,IAAA;AAAA,QAClF;AAAA,OACF;AACA,MAAAA,cAAO,MAAM,KAAA,CAAM,IAAA,CAAK,IAAA,EAAM,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,GAAA,IAAO,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,KAAK,KAAK,CAAA;AACjF,MAAA,MAAM,CAAC,UAAU,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,GAAG,CAAC,CAAA;AACtC,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,OAAA,CAAQ,CAAC,UAAA,CAAY,UAAU,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA;AACnE,MAAAA,cAAO,MAAM,KAAA,CAAM,KAAA,CAAM,EAAE,iBAAiB,EAAA,CAAG,GAAG,CAAA,EAAG,UAAA,EAAY,GAAG,GAAG,CAAA,EAAG,CAAC,EAAE,OAAA,CAAQ;AAAA,QACnF,iBAAA,EAAmB,CAAA;AAAA,QACnB,aAAA,EAAe;AAAA,OAChB,CAAA;AACD,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,cAAA,CAAe,EAAE,CAAC,CAAA,CAAE,YAAA,CAAa,CAAC,CAAA;AAAA,IACvD,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAAF,eAAAA,CAAS,iBAAiB,MAAM;AAC9B,IAAAC,SAAAA,CAAG,KAAK,CAAC,IAAA,EAAM,GAAG,IAAA,EAAM,MAAA,EAAQ,CAAC,CAAA,EAAG,EAAE,GAAA,EAAK,GAAG,CAAA,EAAG,EAAE,IAAA,EAAM,EAAE,IAAA,EAAM,EAAC,EAAE,EAAE,EAAG,IAAI,CAAC,CAAA;AAAA,MAC5E,4BAAA;AAAA,MACA,OAAO,OAAA,KAAY;AACjB,QAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,EAAE,OAAA,EAAS,CAAA;AACxC,QAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACnE,QAAA,MAAM,CAAC,OAAO,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA;AAC3C,QAAAC,cAAO,OAAA,CAAS,KAAA,CAAM,OAAO,CAAA,CAAE,QAAQ,OAAO,CAAA;AAAA,MAChD;AAAA,KACF;AAEA,IAAAD,SAAAA,CAAG,mDAAmD,YAAY;AAChE,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA;AAC9B,MAAA,MAAM,QAAQ,cAAA,CAAe;AAAA,QAC3B,EAAA,EAAI,CAAA,gBAAA,EAAmB,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAAA,QACtC,GAAA,EAAK,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA;AAAA,QACnB,IAAA,EAAM,GAAA,CAAI,MAAA,CAAO,GAAG;AAAA,OACrB,CAAA;AACD,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,OAAO,CAAC,CAAA,EAAG,CAAC,CAAA;AAC/D,MAAA,MAAM,CAAC,OAAO,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,OAAO,CAAC,CAAA;AACvC,MAAAC,aAAAA,CAAO,OAAA,CAAS,KAAK,CAAA,CAAE,QAAQ,KAAK,CAAA;AACpC,MAAAA,aAAAA,CAAO,OAAA,CAAS,OAAO,CAAA,CAAE,KAAK,OAAO,CAAA;AAAA,IACvC,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,2CAA2C,YAAY;AACxD,MAAA,MAAM,MAAA;AAAA,QACJ,MAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,GAAA,IAAO,OAAO;AAAA,UACjC,OAAO,cAAA,EAAe;AAAA,UACtB,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC;AAAA,SAC1C,CAAE;AAAA,OACJ;AACA,MAAAC,aAAAA,CAAO,MAAM,KAAA,CAAM,cAAA,CAAe,EAAE,CAAC,CAAA,CAAE,YAAA,CAAa,GAAG,CAAA;AAAA,IACzD,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,kEAAkE,YAAY;AAC/E,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,EAAE,OAAA,EAAS,EAAE,MAAA,EAAQ,CAAA,EAAE,EAAG,OAAA,EAAS,EAAE,CAAA,EAAG,GAAA,IAAO,CAAA;AAC5E,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACnE,MAAA,MAAM,CAAC,OAAO,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA;AAC3C,MAAC,OAAA,CAAS,KAAA,CAAM,OAAA,CAA+B,MAAA,GAAS,GAAA;AACxD,MAAC,OAAA,CAAS,KAAA,CAAM,OAAA,CAAmC,GAAG,CAAA,GAAI,SAAA;AAC1D,MAAA,MAAM,CAAC,MAAM,CAAA,GAAI,MAAM,KAAA,CAAM,cAAA,CAAe,EAAE,CAAA;AAC9C,MAAAC,aAAAA,CAAO,OAAQ,KAAA,CAAM,OAAO,EAAE,OAAA,CAAQ,EAAE,MAAA,EAAQ,CAAA,EAAG,CAAA;AACnD,MAAAA,aAAAA,CAAO,OAAQ,KAAA,CAAM,OAAO,EAAE,OAAA,CAAQ,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA;AAAA,IAClD,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AC5LO,SAAS,mBAAiC,KAAA,EAA0C;AACzF,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,YAAA,EAAc,gBAAe,GAAI,KAAA;AACxD,EAAA,IAAI,KAAA;AAEJ,EAAAH,kBAAW,MAAM;AACf,IAAA,KAAA,GAAQ,MAAM,KAAA,EAAM;AAAA,EACtB,CAAC,CAAA;AAED,EAAAC,eAAAA,CAAS,cAAc,MAAM;AAC3B,IAAAC,SAAAA,CAAG,mDAAmD,YAAY;AAChE,MAAA,MAAM,QAAQ,cAAA,EAAe;AAC7B,MAAA,MAAM,MAAA,CAAO;AAAA,QACX,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAA,EAAG,cAAA,CAAe,WAAW,CAAC,CAAA;AAAE,OACjF,CAAA;AACD,MAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA;AAC5C,MAAAC,aAAAA,CAAO,MAAM,KAAA,CAAM,QAAA,CAAS,QAAA,EAAW,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACxD,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,cAAA,CAAe,EAAE,OAAA,EAAS,KAAA,CAAM,IAAI,CAAA;AAChE,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAAA,aAAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,WAAW,CAAC,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,MAAM,CAAC,CAAA,CAAE,IAAA,EAAM,EAAE,OAAA,CAAQ;AAAA,UAC9E,CAAC,aAAa,WAAW,CAAA;AAAA,UACzB,CAAC,aAAa,SAAS;AAAA,SACxB,CAAA;AACD,QAAA,MAAM,CAAC,SAAS,CAAA,GAAI,MAAM,MAAM,cAAA,CAAe,EAAE,MAAA,EAAQ,WAAA,EAAa,CAAA;AACtE,QAAAA,aAAAA,CAAO,SAAS,CAAA,CAAE,aAAA,CAAc,EAAE,OAAA,EAAS,WAAA,EAAa,QAAA,EAAU,CAAA,EAAG,CAAA;AACrE,QAAAA,cAAO,SAAA,CAAW,WAAW,EAAE,OAAA,CAAQ,EAAA,CAAG,CAAC,CAAC,CAAA;AAAA,MAC9C,CAAA,MAAO;AACL,QAAAA,aAAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW,CAAC,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,MAAM,CAAC,CAAC,EAAE,OAAA,CAAQ;AAAA,UACvE,CAAC,aAAa,SAAS;AAAA,SACxB,CAAA;AACD,QAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,cAAA,CAAe,EAAE,MAAA,EAAQ,WAAA,EAAa,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,MACxE;AACA,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,QAAA,GAAW,EAAE,CAAC,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAChE,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,UAAA,CAAW,GAAG,CAAC,CAAC,CAAC,CAAA,CAAE,aAAA,CAAc;AAAA,QAClD,OAAA,EAAS,CAAA;AAAA,QACT,UAAA,EAAY,CAAA;AAAA,QACZ,SAAA,EAAW,iBAAiB,CAAA,GAAI;AAAA,OACjC,CAAA;AAAA,IACH,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,0EAA0E,YAAY;AACvF,MAAA,MAAM,QAAQ,cAAA,EAAe;AAC7B,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACnE,MAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA;AAC5C,MAAA,MAAM,KAAA,CAAM,QAAA,CAAS,QAAA,EAAW,EAAA,CAAG,CAAC,CAAC,CAAA;AAErC,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO;AAAA,QAC1B,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAA,EAAG,cAAA,CAAe,WAAW,CAAC,CAAA;AAAE,OACjF,CAAA;AACD,MAAAC,aAAAA,CAAO,MAAM,CAAA,CAAE,OAAA,CAAQ;AAAA,QACrB,kBAAkB,EAAC;AAAA,QACnB,iBAAA,EAAmB,CAAC,KAAA,CAAM,EAAE,CAAA;AAAA,QAC5B,qBAAA,EAAuB;AAAA,OACxB,CAAA;AACD,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,QAAA,GAAW,EAAE,CAAC,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAChE,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,QAAA,GAAW,EAAE,CAAC,CAAC,CAAA,CAAE,aAAa,CAAC,CAAA;AACpE,MAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACjF,MAAAA,aAAAA,CAAO,KAAA,CAAM,qBAAqB,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,IAC5C,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,sDAAsD,YAAY;AACnE,MAAA,MAAM,MAAA;AAAA,QACJ,MAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,IAAK,OAAO;AAAA,UAC/B,OAAO,cAAA,EAAe;AAAA,UACtB,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC;AAAA,SAC1C,CAAE;AAAA,OACJ;AACA,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA;AACzC,MAAAC,aAAAA,CAAO,OAAO,CAAA,CAAE,YAAA,CAAa,CAAC,CAAA;AAC9B,MAAAA,aAAAA,CAAO,MAAM,YAAA,CAAa,KAAA,EAAO,EAAC,EAAG,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AACvD,MAAAA,cAAO,MAAM,YAAA,CAAa,OAAO,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAC,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAC,IAAA,EAAM,IAAA,EAAM,IAAI,CAAC,CAAA;AACxF,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,UAAA,CAAW,GAAG,CAAC,CAAC,CAAC,CAAA,CAAE,cAAc,EAAE,UAAA,EAAY,CAAA,EAAG,OAAA,EAAS,GAAG,CAAA;AACjF,MAAAA,cAAO,MAAM,YAAA,CAAa,KAAA,EAAO,OAAA,EAAS,GAAG,CAAC,CAAC,CAAC,CAAA,CAAE,QAAQ,CAAC,KAAA,EAAO,OAAO,KAAA,EAAO,IAAA,EAAM,IAAI,CAAC,CAAA;AAC3F,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,UAAA,CAAW,GAAG,CAAC,CAAC,CAAC,CAAA,CAAE,cAAc,EAAE,UAAA,EAAY,CAAA,EAAG,OAAA,EAAS,GAAG,CAAA;AAAA,IACnF,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,4CAA4C,YAAY;AACzD,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACrF,MAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA;AAC5C,MAAAC,cAAO,MAAM,YAAA,CAAa,KAAA,EAAO,CAAC,UAAW,QAAS,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,QAAQ,CAAC,IAAA,EAAM,KAAK,CAAC,CAAA;AAAA,IACxF,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,4CAA4C,YAAY;AACzD,MAAA,MAAM,MAAA;AAAA,QACJ,MAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,IAAK,OAAO;AAAA,UAC/B,OAAO,cAAA,EAAe;AAAA,UACtB,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC;AAAA,SAC1C,CAAE;AAAA,OACJ;AACA,MAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAC9C,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,CAAC,WAAW,GAAG,EAAA,CAAG,QAAQ,CAAA,EAAG,GAAA,EAAK,UAAU,CAAA;AACxE,MAAAC,aAAAA,CAAO,OAAO,CAAA,CAAE,YAAA,CAAa,CAAC,CAAA;AAC9B,MAAA,MAAM,OAAO,CAAC,EAAE,KAAA,EAAO,cAAA,IAAkB,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAC5F,MAAA,MAAM,CAAC,KAAK,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,QAAA,GAAW,CAAC,CAAA,EAAG,KAAK,UAAU,CAAA;AAC5E,MAAAA,aAAAA;AAAA,QACE,MAAM,YAAA,CAAa,KAAA,EAAO,CAAC,KAAA,CAAM,CAAC,GAAI,KAAA,EAAQ,KAAA,CAAM,CAAC,CAAA,EAAI,QAAQ,CAAC,CAAE,GAAG,EAAA,CAAG,QAAA,GAAW,CAAC,CAAC;AAAA,QACvF,OAAA,CAAQ,CAAC,OAAO,IAAA,EAAM,KAAA,EAAO,IAAI,CAAC,CAAA;AACpC,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,UAAA,CAAW,GAAG,QAAA,GAAW,CAAC,CAAC,CAAC,CAAA,CAAE,aAAA,CAAc,EAAE,UAAA,EAAY,GAAG,CAAA;AAAA,IAClF,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,qEAAqE,YAAY;AAClF,MAAA,MAAM,KAAA,GAAQ,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,GAAA,EAAI;AAC5C,MAAA,MAAM,MAAA,CAAO;AAAA,QACX,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,UAAA,EAAY,CAAC,cAAA,CAAe,GAAG,CAAA,EAAG,cAAA,CAAe,GAAG,CAAC,CAAA;AAAE,OACnF,CAAA;AACD,MAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,GAAG,CAAC,CAAA;AACpC,MAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,GAAG,CAAC,CAAA;AACpC,MAAA,MAAM,KAAA,CAAM,WAAW,QAAA,EAAW,EAAA,CAAG,GAAK,CAAA,EAAG,KAAA,EAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AACzD,MAAA,MAAM,KAAA,CAAM,OAAA,CAAQ,QAAA,EAAW,EAAA,CAAG,CAAC,CAAC,CAAA;AACpC,MAAAC,cAAO,MAAM,YAAA,CAAa,KAAA,EAAO,CAAC,UAAW,QAAS,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,QAAQ,CAAC,KAAA,EAAO,KAAK,CAAC,CAAA;AACvF,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,UAAA,CAAW,GAAG,CAAC,CAAC,CAAC,CAAA,CAAE,cAAc,EAAE,OAAA,EAAS,CAAA,EAAG,UAAA,EAAY,GAAG,CAAA;AAAA,IACnF,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAAF,eAAAA,CAAS,gCAAgC,MAAM;AAC7C,IAAA,MAAM,KAAA,GAAQ,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,GAAA,EAAI;AAE5C,IAAAC,SAAAA,CAAG,yFAAyF,YAAY;AACtG,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACrF,MAAA,MAAM,CAAC,KAAK,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,GAAA,EAAK,UAAU,CAAA;AACjE,MAAAC,aAAAA,CAAO,MAAM,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAQ,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACpD,MAAA,MAAM,CAAC,OAAO,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,GAAA,EAAK,UAAU,CAAA;AACnE,MAAAA,cAAO,OAAA,CAAS,UAAU,CAAA,CAAE,IAAA,CAAK,MAAO,UAAU,CAAA;AAClD,MAAAA,cAAO,OAAA,CAAS,UAAU,EAAE,GAAA,CAAI,IAAA,CAAK,MAAO,UAAU,CAAA;AACtD,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,QAAA,CAAS,KAAA,EAAQ,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AACtD,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,IAAA,CAAK,KAAA,EAAQ,KAAA,EAAO,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AACzD,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,UAAA,CAAW,OAAQ,EAAA,CAAG,CAAC,CAAA,EAAG,KAAA,EAAO,GAAG,CAAC,CAAC,CAAC,CAAA,CAAE,KAAK,KAAK,CAAA;AACtE,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAQ,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AACrD,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,WAAA,CAAY,OAAQ,EAAA,CAAG,QAAA,GAAW,CAAC,CAAA,EAAG,GAAG,CAAC,CAAC,CAAC,CAAA,CAAE,KAAK,KAAK,CAAA;AAC3E,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,QAAA,CAAS,OAAA,EAAU,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAAA,IACzD,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,4FAA4F,YAAY;AACzG,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACrF,MAAA,MAAM,CAAC,KAAK,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,GAAA,EAAK,UAAU,CAAA;AACjE,MAAAC,aAAAA,CAAO,MAAM,KAAA,CAAM,UAAA,CAAW,OAAQ,EAAA,CAAG,EAAE,CAAA,EAAG,KAAA,EAAO,GAAG,CAAC,CAAC,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AACtE,MAAA,MAAM,CAAC,OAAO,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,EAAE,CAAA,EAAG,GAAA,EAAK,UAAU,CAAA;AACpE,MAAAA,aAAAA,CAAO,OAAO,CAAA,CAAE,aAAA,CAAc,EAAE,YAAY,KAAA,CAAO,UAAA,EAAY,OAAA,EAAS,CAAA,EAAG,CAAA;AAC3E,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,QAAA,CAAS,KAAA,EAAQ,EAAA,CAAG,EAAE,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AACvD,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,IAAA,CAAK,KAAA,EAAQ,KAAA,EAAO,EAAA,CAAG,EAAE,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AAC1D,MAAAA,aAAAA,CAAO,MAAM,YAAA,CAAa,KAAA,EAAO,CAAC,KAAM,CAAA,EAAG,EAAA,CAAG,EAAE,CAAC,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAC,KAAK,CAAC,CAAA;AACnE,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,QAAA,CAAS,OAAA,EAAU,EAAA,CAAG,EAAE,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAAA,IAC1D,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,4EAA4E,YAAY;AACzF,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACrF,MAAA,MAAM,CAAC,KAAK,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,GAAA,EAAK,UAAU,CAAA;AACjE,MAAA,MAAM,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAQ,EAAA,CAAG,CAAC,CAAC,CAAA;AACjC,MAAA,MAAM,CAAC,OAAO,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,GAAA,EAAK,UAAU,CAAA;AACnE,MAAAC,cAAO,MAAM,YAAA,CAAa,KAAA,EAAO,CAAC,OAAQ,OAAQ,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,QAAQ,CAAC,KAAA,EAAO,IAAI,CAAC,CAAA;AAClF,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACrF,MAAA,MAAM,CAAC,MAAM,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,GAAA,EAAK,UAAU,CAAA;AAClE,MAAA,MAAM,KAAA,CAAM,OAAA,CAAQ,MAAA,EAAS,EAAA,CAAG,CAAC,CAAC,CAAA;AAClC,MAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,GAAA,EAAK,UAAU,CAAA;AACpE,MAAAA,cAAO,MAAM,YAAA,CAAa,KAAA,EAAO,CAAC,UAAW,MAAO,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,QAAQ,CAAC,IAAA,EAAM,KAAK,CAAC,CAAA;AAAA,IACtF,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAAF,eAAAA,CAAS,yCAAyC,MAAM;AACtD,IAAA,MAAM,GAAA,GAAM,KAAA;AAEZ,IAAAC,SAAAA,CAAG,gGAAgG,YAAY;AAC7G,MAAA,MAAM,QAAQ,cAAA,EAAe;AAC7B,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACnE,MAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,EAAA,GAAK,GAAG,CAAC,CAAA;AAC1D,MAAAC,aAAAA,CAAO,MAAM,KAAA,CAAM,QAAA,CAAS,QAAA,EAAW,EAAA,CAAG,EAAA,GAAK,GAAA,GAAM,CAAC,CAAC,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AAEnE,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,KAAA,CAAM,EAAE,eAAA,EAAiB,EAAA,CAAG,EAAA,GAAK,GAAG,CAAA,EAAG,CAAC,EAAE,aAAA,CAAc;AAAA,QACzE,aAAA,EAAe;AAAA,OAChB,CAAA;AACD,MAAA,MAAM,QAAQ,MAAM,MAAA;AAAA,QAClB,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAA;AAAA,QACrD,EAAA,CAAG,EAAA,GAAK,GAAA,GAAM,CAAC;AAAA,OACjB;AACA,MAAAA,aAAAA,CAAO,KAAA,CAAM,qBAAqB,CAAA,CAAE,KAAK,CAAC,CAAA;AAC1C,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,KAAA,CAAM,EAAE,eAAA,EAAiB,EAAA,CAAG,EAAA,GAAK,GAAG,CAAA,EAAG,CAAC,EAAE,aAAA,CAAc;AAAA,QACzE,aAAA,EAAe;AAAA,OAChB,CAAA;AACD,MAAA,MAAM,aAAa,MAAM,MAAA;AAAA,QACvB,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAA;AAAA,QACrD,EAAA,CAAG,KAAK,GAAG;AAAA,OACb;AACA,MAAAA,aAAAA,CAAO,WAAW,gBAAgB,CAAA,CAAE,QAAQ,CAAC,KAAA,CAAM,EAAE,CAAC,CAAA;AAAA,IACxD,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,0FAA0F,YAAY;AACvG,MAAA,MAAM,QAAQ,cAAA,EAAe;AAC7B,MAAA,MAAM,MAAA,CAAO;AAAA,QACX,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAA,EAAG,cAAA,CAAe,WAAW,CAAC,CAAA;AAAE,OACjF,CAAA;AACD,MAAA,MAAM,UAAU,MAAM,KAAA,CAAM,CAAC,WAAA,EAAa,WAAW,CAAC,CAAA;AACtD,MAAAC,aAAAA,CAAO,OAAO,CAAA,CAAE,YAAA,CAAa,CAAC,CAAA;AAC9B,MAAA,MAAM,CAAC,KAAA,EAAO,MAAM,CAAA,GAAI,OAAA,CAAQ,IAAA;AAAA,QAAK,CAAC,IAAA,EAAM,KAAA,KAC1C,KAAK,OAAA,CAAQ,aAAA,CAAc,MAAM,OAAO;AAAA,OAC1C;AACA,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,QAAA,CAAS,KAAA,EAAQ,EAAA,CAAG,GAAG,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAEvD,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,QAAA,CAAS,MAAA,EAAS,EAAA,CAAG,GAAG,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACxD,MAAAA,cAAO,MAAM,KAAA,CAAM,KAAA,CAAM,EAAE,iBAAiB,EAAA,CAAG,GAAG,CAAA,EAAG,CAAC,CAAA,CAAE,aAAA,CAAc,EAAE,aAAA,EAAe,GAAG,CAAA;AAC1F,MAAA,MAAM,QAAQ,MAAM,MAAA;AAAA,QAClB,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAA,EAAG,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAA;AAAA,QAClF,GAAG,GAAG;AAAA,OACR;AACA,MAAAA,aAAAA,CAAO,KAAA,CAAM,qBAAqB,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,IAC5C,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,yEAAyE,YAAY;AACtF,MAAA,MAAM,QAAQ,cAAA,EAAe;AAC7B,MAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,WAAA,CAAY,OAAO,WAAA,KAAgB;AAC5D,QAAA,MAAM,KAAA,CAAM,MAAA;AAAA,UACV,WAAA;AAAA,UACA,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAA;AAAA,UACrD,GAAG,CAAC;AAAA,SACN;AACA,QAAA,OAAO,KAAA,CAAM,MAAA;AAAA,UACX,WAAA;AAAA,UACA,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAA;AAAA,UACrD,GAAG,CAAC;AAAA,SACN;AAAA,MACF,CAAC,CAAA;AACD,MAAAC,aAAAA,CAAO,MAAM,CAAA,CAAE,aAAA,CAAc,EAAE,iBAAA,EAAmB,CAAC,KAAA,CAAM,EAAE,CAAA,EAAG,qBAAA,EAAuB,CAAA,EAAG,CAAA;AACxF,MAAA,MAAM,UAAU,MAAM,KAAA,CAAM,CAAC,WAAA,EAAa,WAAW,CAAC,CAAA;AACtD,MAAAA,aAAAA,CAAO,OAAO,CAAA,CAAE,YAAA,CAAa,CAAC,CAAA;AAC9B,MAAA,KAAA,MAAW,YAAY,OAAA,EAAS;AAC9B,QAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,QAAA,CAAS,QAAA,EAAU,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAAA,MACzD;AACA,MAAA,MAAM,QAAQ,MAAM,MAAA;AAAA,QAClB,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAA,EAAG,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAA;AAAA,QAClF,GAAG,CAAC;AAAA,OACN;AACA,MAAAA,aAAAA,CAAO,KAAK,CAAA,CAAE,aAAA,CAAc,EAAE,iBAAA,EAAmB,CAAC,KAAA,CAAM,EAAE,CAAA,EAAG,qBAAA,EAAuB,CAAA,EAAG,CAAA;AAAA,IACzF,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,gFAAgF,YAAY;AAC7F,MAAA,MAAM,QAAQ,cAAA,EAAe;AAC7B,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACnE,MAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA;AAC5C,MAAA,MAAM,KAAA,CAAM,QAAA,CAAS,QAAA,EAAW,EAAA,CAAG,CAAC,CAAC,CAAA;AACrC,MAAAC,aAAAA,CAAO,MAAM,KAAA,CAAM,KAAA,CAAM,EAAE,UAAA,EAAY,EAAA,CAAG,GAAA,GAAM,GAAG,CAAA,EAAG,CAAC,EAAE,aAAA,CAAc;AAAA,QACrE,aAAA,EAAe;AAAA,OAChB,CAAA;AACD,MAAA,MAAM,QAAQ,MAAM,MAAA,CAAO,CAAC,EAAE,OAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACxF,MAAAA,aAAAA,CAAO,KAAA,CAAM,qBAAqB,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,IAC5C,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;ACpPO,SAAS,mBAAiC,KAAA,EAA0C;AACzF,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,YAAA,EAAc,SAAQ,GAAI,KAAA;AACjD,EAAA,IAAI,KAAA;AAEJ,EAAAH,kBAAW,MAAM;AACf,IAAA,KAAA,GAAQ,MAAM,KAAA,EAAM;AAAA,EACtB,CAAC,CAAA;AAED,EAAAC,eAAAA,CAAS,eAAe,MAAM;AAC5B,IAAAC,SAAAA,CAAG,qFAAqF,YAAY;AAClG,MAAA,MAAM,MAAA;AAAA,QACJ,MAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,IAAK,OAAO;AAAA,UAC/B,OAAO,cAAA,EAAe;AAAA,UACtB,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC;AAAA,SAC1C,CAAE;AAAA,OACJ;AACA,MAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,CAAC,WAAW,GAAG,EAAA,CAAG,CAAC,CAAA,EAAG,GAAA,EAAK,UAAU,CAAA;AAC/D,MAAAC,aAAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAC,aAAa,QAAA,CAAS,OAAO,CAAC,CAAA,CAAE,QAAQ,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AACtE,MAAAA,cAAO,MAAM,KAAA,CAAM,CAAC,WAAW,GAAG,EAAA,CAAG,QAAA,GAAW,CAAC,CAAA,EAAG,KAAK,UAAU,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAChF,MAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,CAAC,WAAW,GAAG,EAAA,CAAG,QAAQ,CAAA,EAAG,GAAA,EAAK,UAAU,CAAA;AACvE,MAAAA,aAAAA,CAAO,MAAA,CAAO,GAAA,CAAI,CAAC,QAAA,KAAa,SAAS,UAAU,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,OAAA;AAAA,QAC3D,MAAM,GAAA,CAAI,CAAC,aAAa,QAAA,CAAS,UAAU,EAAE,IAAA;AAAK,OACpD;AACA,MAAAA,aAAAA,CAAO,MAAA,CAAO,GAAA,CAAI,CAAC,aAAa,QAAA,CAAS,OAAO,CAAC,CAAA,CAAE,QAAQ,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AACvE,MAAA,KAAA,MAAW,SAAS,KAAA,EAAO;AACzB,QAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,QAAA,CAAS,KAAA,EAAO,EAAA,CAAG,QAAA,GAAW,CAAC,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AAAA,MAClE;AACA,MAAAA,aAAAA,CAAO,MAAM,YAAA,CAAa,KAAA,EAAO,KAAA,EAAO,EAAA,CAAG,QAAA,GAAW,CAAC,CAAC,CAAC,CAAA,CAAE,OAAA,CAAQ;AAAA,QACjE,KAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA;AAAA,QACA;AAAA,OACD,CAAA;AACD,MAAAA,cAAO,MAAM,YAAA,CAAa,KAAA,EAAO,MAAA,EAAQ,GAAG,QAAA,GAAW,CAAC,CAAC,CAAC,EAAE,OAAA,CAAQ,CAAC,MAAM,IAAA,EAAM,IAAA,EAAM,IAAI,CAAC,CAAA;AAAA,IAC9F,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,0EAA0E,YAAY;AACvF,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACrF,MAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,CAAA,EAAG,SAAS,CAAA,EAAG;AACzC,QAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,MAAM,MAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,QAAQ,QAAQ,CAAA,EAAG,GAAA,EAAK,CAAA,OAAA,EAAU,KAAK,CAAA,CAAE,CAAA;AAC1F,QAAAC,cAAO,QAAA,CAAU,OAAO,CAAA,CAAE,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,MAC1C;AACA,MAAA,MAAM,CAAC,IAAI,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,QAAQ,CAAA,EAAG,KAAK,UAAU,CAAA;AAC3E,MAAAA,aAAAA,CAAO,IAAA,CAAM,OAAO,CAAA,CAAE,KAAK,CAAC,CAAA;AAC5B,MAAAA,cAAO,MAAM,KAAA,CAAM,IAAA,CAAK,IAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,QAAA,IAAY,EAAA,CAAG,CAAA,GAAI,QAAQ,CAAC,CAAC,CAAA,CAAE,IAAA;AAAA,QACtF;AAAA,OACF;AACA,MAAA,MAAM,CAAC,IAAI,CAAA,GAAI,MAAM,MAAM,cAAA,CAAe,EAAE,MAAA,EAAQ,MAAA,EAAQ,CAAA;AAC5D,MAAAA,aAAAA,CAAO,IAAI,CAAA,CAAE,aAAA,CAAc,EAAE,QAAA,EAAU,CAAA,EAAG,SAAA,EAAW,EAAE,OAAA,EAAS,QAAA,EAAS,EAAG,CAAA;AAC5E,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,GAAA,GAAM,QAAQ,CAAC,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,IACnE,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,+DAA+D,YAAY;AAC5E,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACrF,MAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,GAAA,EAAK,UAAU,CAAA;AACpE,MAAA,MAAM,KAAA,CAAM,UAAA,CAAW,QAAA,EAAW,EAAA,CAAG,EAAE,CAAA,EAAG,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,GAAA,EAAI,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAChF,MAAA,MAAM,CAAC,KAAK,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,QAAQ,CAAA,EAAG,GAAA,EAAK,UAAU,CAAA;AACxE,MAAAC,aAAAA,CAAO,KAAA,CAAO,OAAO,CAAA,CAAE,KAAK,CAAC,CAAA;AAC7B,MAAA,MAAM,CAAC,UAAU,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,QAAA,GAAW,CAAC,CAAA,EAAG,KAAK,UAAU,CAAA;AACjF,MAAAA,aAAAA,CAAO,UAAA,CAAY,OAAO,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,IACpC,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,8CAA8C,YAAY;AAC3D,MAAA,MAAM,CAAC,IAAA,EAAM,IAAI,CAAA,GAAI,OAAO,YAAY;AACtC,QAAA,MAAM,MAAA,GAAS,CAAC,cAAA,CAAe,EAAE,GAAA,EAAK,GAAA,EAAK,CAAA,EAAG,cAAA,CAAe,EAAE,GAAA,EAAK,GAAA,EAAK,CAAC,CAAA;AAC1E,QAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,UAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,QACrE;AACA,QAAA,OAAO,MAAA;AAAA,MACT,CAAA,GAAG;AACH,MAAA,MAAM,CAAC,KAAK,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,GAAA,EAAK,UAAU,CAAA;AACjE,MAAAC,cAAO,KAAA,CAAO,KAAA,CAAM,EAAE,CAAA,CAAE,IAAA,CAAK,KAAM,EAAE,CAAA;AACrC,MAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,CAAC,WAAW,GAAG,EAAA,CAAG,QAAQ,CAAA,EAAG,GAAA,EAAK,UAAU,CAAA;AACtE,MAAAA,aAAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAC,aAAa,QAAA,CAAS,KAAA,CAAM,EAAE,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAC,IAAA,CAAM,EAAE,CAAC,CAAA;AACrE,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,QAAA,CAAS,KAAA,EAAQ,EAAA,CAAG,QAAA,GAAW,CAAC,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AACjE,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,QAAA,CAAS,MAAM,CAAC,CAAA,EAAI,EAAA,CAAG,QAAA,GAAW,CAAC,CAAC,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AACnE,MAAA,MAAM,CAAC,SAAS,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,QAAA,GAAW,CAAC,CAAA,EAAG,KAAK,UAAU,CAAA;AAChF,MAAAA,cAAO,SAAA,CAAW,KAAA,CAAM,EAAE,CAAA,CAAE,IAAA,CAAK,KAAM,EAAE,CAAA;AAAA,IAC3C,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,2EAA2E,YAAY;AACxF,MAAA,MAAM,MAAA;AAAA,QACJ,MAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,EAAA,IAAM,OAAO;AAAA,UAChC,OAAO,cAAA,EAAe;AAAA,UACtB,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC;AAAA,SAC1C,CAAE;AAAA,OACJ;AACA,MAAA,MAAM,OAAiB,EAAC;AACxB,MAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,EAAA,EAAI,SAAS,CAAA,EAAG;AAC1C,QAAA,MAAM,MAAA,GAAS,CAAC,UAAA,EAAY,UAAA,EAAY,UAAU,CAAA;AAClD,QAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,UAC5B,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,KAAK,CAAA,EAAG,CAAA,EAAG,KAAK,CAAC;AAAA,SACjE;AACA,QAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,UAAA,IAAA,CAAK,IAAA,CAAK,GAAG,KAAA,CAAM,GAAA,CAAI,CAAC,QAAA,KAAa,QAAA,CAAS,UAAU,CAAC,CAAA;AACzD,UAAAC,aAAAA,CAAO,MAAM,YAAA,CAAa,KAAA,EAAO,OAAO,EAAA,CAAG,KAAK,CAAC,CAAC,EAAE,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,MAAM,IAAI,CAAC,CAAA;AAAA,QACnF;AAAA,MACF;AACA,MAAAA,aAAAA,CAAO,IAAI,CAAA,CAAE,YAAA,CAAa,EAAE,CAAA;AAC5B,MAAAA,aAAAA,CAAO,IAAI,GAAA,CAAI,IAAI,EAAE,IAAI,CAAA,CAAE,KAAK,EAAE,CAAA;AAAA,IACpC,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAAF,eAAAA,CAAS,cAAc,MAAM;AAC3B,IAAAC,SAAAA,CAAG,+EAAA,EAAiF,OAAO,OAAA,KAAY;AACrG,MAAA,IAAI,KAAA,CAAM,eAAe,MAAA,EAAW;AAClC,QAAA,OAAO,QAAQ,IAAA,EAAK;AAAA,MACtB;AACA,MAAA,MAAM,MAAA,CAAO;AAAA,QACX,EAAE,OAAO,cAAA,EAAe,EAAG,YAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAE;AAAA,QACrE,EAAE,OAAO,cAAA,EAAe,EAAG,YAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA;AAAE,OACtE,CAAA;AACD,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,CAAC,WAAW,GAAG,EAAA,CAAG,CAAC,CAAA,EAAG,GAAA,EAAK,UAAU,CAAA;AACjE,MAAAC,aAAAA,CAAO,OAAO,CAAA,CAAE,YAAA,CAAa,CAAC,CAAA;AAC9B,MAAA,MAAM,KAAA,CAAM,UAAA,CAAW,UAAA,EAAY,EAAA,CAAG,CAAC,CAAC,CAAA;AACxC,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,EAAI,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AAC1D,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,EAAI,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AAC1D,MAAA,MAAM,KAAA,CAAM,UAAA,CAAW,UAAA,EAAY,EAAA,CAAG,CAAC,CAAC,CAAA;AACxC,MAAA,MAAM,OAAO,CAAC,EAAE,KAAA,EAAO,cAAA,IAAkB,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAC5F,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,GAAA,EAAK,UAAU,CAAC,CAAA,CAAE,aAAa,CAAC,CAAA;AAAA,IAC3E,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,qDAAA,EAAuD,OAAO,OAAA,KAAY;AAC3E,MAAA,IAAI,KAAA,CAAM,eAAe,MAAA,EAAW;AAClC,QAAA,OAAO,QAAQ,IAAA,EAAK;AAAA,MACtB;AACA,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACrF,MAAA,MAAM,CAAC,OAAO,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,GAAA,EAAK,UAAU,CAAA;AACnE,MAAA,MAAM,KAAA,CAAM,UAAA,CAAW,UAAA,EAAY,EAAA,CAAG,CAAC,CAAC,CAAA;AACxC,MAAAC,aAAAA,CAAO,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,KAAK,UAAU,CAAC,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AACrE,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,QAAA,CAAS,OAAA,EAAU,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAAA,IACzD,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAAF,gBAAS,MAAA,CAAO,OAAA,CAAQ,oBAAoB,MAAS,CAAA,CAAE,0BAA0B,MAAM;AACrF,IAAA,IAAI,IAAA;AAEJ,IAAAD,kBAAW,YAAY;AACrB,MAAA,IAAA,GAAO,MAAM,OAAA,CAAQ,eAAA,CAAiB,KAAK,CAAA;AAAA,IAC7C,CAAC,CAAA;AAED,IAAAI,gBAAA,CAAU,YAAY;AACpB,MAAA,MAAM,OAAA,CAAQ,eAAe,IAAI,CAAA;AAAA,IACnC,CAAC,CAAA;AAED,IAAAF,SAAAA,CAAG,+DAA+D,YAAY;AAC5E,MAAA,MAAM,MAAA;AAAA,QACJ,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,IAAG,EAAG,CAAC,GAAG,KAAA,MAAW;AAAA,UACxC,KAAA,EAAO,cAAA,CAAe,EAAE,GAAA,EAAK,KAAA,GAAQ,CAAA,KAAM,CAAA,GAAI,CAAA,IAAA,EAAO,KAAA,GAAQ,CAAC,CAAA,CAAA,GAAK,IAAA,EAAM,CAAA;AAAA,UAC1E,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC;AAAA,SAC1C,CAAE;AAAA,OACJ;AACA,MAAA,MAAM,OAAA,GAAU,CAAC,KAAA,MAAmB;AAAA,QAClC,QAAA,EAAU,CAAC,WAAW,CAAA;AAAA,QACtB,KAAA,EAAO,CAAA;AAAA,QACP,UAAA,EAAY,KAAA;AAAA,QACZ,cAAA,EAAgB,GAAG,QAAQ,CAAA;AAAA,QAC3B,GAAA,EAAK,GAAG,CAAC;AAAA,OACX,CAAA;AACA,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,QAChC,GAAG,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,GAAE,EAAG,CAAC,CAAA,EAAG,KAAA,KAAU,MAAM,KAAA,CAAM,OAAA,CAAQ,WAAW,KAAK,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,QACnF,GAAG,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,GAAE,EAAG,CAAC,CAAA,EAAG,KAAA,KAAU,KAAK,KAAA,CAAM,OAAA,CAAQ,QAAQ,KAAK,CAAA,CAAE,CAAC,CAAC;AAAA,OAChF,CAAA;AACD,MAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,EAAK;AAC7B,MAAAC,aAAAA,CAAO,IAAI,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAC,QAAA,KAAa,QAAA,CAAS,UAAU,CAAC,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,QAAQ,MAAM,CAAA;AACxF,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,QAAA,KAAa,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,CAAC,GAAA,KAAQ,QAAQ,IAAI,CAAA;AACvF,MAAAA,aAAAA,CAAO,IAAI,GAAA,CAAI,IAAI,EAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAAA,IAC7C,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,gDAAgD,YAAY;AAC7D,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,cAAA,EAAe,EAAG,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACrF,MAAA,MAAM,CAAC,KAAK,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAChD,MAAA,MAAM,CAAC,OAAO,CAAA,GAAI,MAAM,KAAK,KAAA,CAAM;AAAA,QACjC,QAAA,EAAU,CAAC,WAAW,CAAA;AAAA,QACtB,KAAA,EAAO,CAAA;AAAA,QACP,UAAA,EAAY,MAAA;AAAA,QACZ,cAAA,EAAgB,EAAA,CAAG,QAAA,GAAW,CAAC,CAAA;AAAA,QAC/B,GAAA,EAAK,GAAG,QAAQ;AAAA,OACjB,CAAA;AACD,MAAAC,aAAAA,CAAO,MAAM,KAAA,CAAM,QAAA,CAAS,KAAA,EAAQ,EAAA,CAAG,QAAA,GAAW,CAAC,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AACjE,MAAAA,aAAAA,CAAO,MAAM,IAAA,CAAK,QAAA,CAAS,OAAA,EAAU,EAAA,CAAG,QAAA,GAAW,CAAC,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAAA,IACnE,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,8EAA8E,YAAY;AAC3F,MAAA,MAAM,MAAA;AAAA,QACJ,MAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,IAAK,OAAO;AAAA,UAC/B,OAAO,cAAA,EAAe;AAAA,UACtB,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC;AAAA,SAC1C,CAAE;AAAA,OACJ;AACA,MAAA,MAAM,OAAA,GAAU,CAAC,KAAA,EAAe,GAAA,MAAe;AAAA,QAC7C,QAAA,EAAU,CAAC,WAAW,CAAA;AAAA,QACtB,KAAA,EAAO,GAAA;AAAA,QACP,UAAA,EAAY,KAAA;AAAA,QACZ,gBAAgB,IAAI,IAAA,CAAK,GAAA,CAAI,OAAA,KAAY,QAAQ,CAAA;AAAA,QACjD;AAAA,OACF,CAAA;AACA,MAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,KAAA,CAAM,QAAQ,SAAA,EAAW,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA;AACzD,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,KAAA,CAAM,QAAQ,MAAA,EAAQ,EAAA,CAAG,QAAQ,CAAC,CAAC,CAAA;AAC9D,MAAAC,aAAAA,CAAO,OAAO,CAAA,CAAE,YAAA,CAAa,CAAC,CAAA;AAC9B,MAAAA,cAAO,MAAM,YAAA,CAAa,KAAA,EAAO,KAAA,EAAO,GAAG,QAAA,GAAW,CAAC,CAAC,CAAC,EAAE,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,MAAM,KAAK,CAAC,CAAA;AACzF,MAAAA,cAAO,MAAM,YAAA,CAAa,IAAA,EAAM,OAAA,EAAS,GAAG,QAAA,GAAW,CAAC,CAAC,CAAC,EAAE,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,MAAM,IAAI,CAAC,CAAA;AAC3F,MAAAA,aAAAA,CAAO,MAAM,KAAA,CAAM,UAAA,CAAW,EAAA,CAAG,WAAW,CAAC,CAAC,CAAC,CAAA,CAAE,aAAA,CAAc;AAAA,QAC7D,OAAA,EAAS,CAAA;AAAA,QACT,UAAA,EAAY;AAAA,OACb,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AC7MA,SAAS,eAAA,GAA2C;AAClD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,mBAAA;AAAA,IACN,CAAA,EAAG,EAAE,MAAA,EAAQ,CAAC,EAAE,IAAI,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA,EAAG,MAAM,CAAA,EAAG,IAAA,EAAK,EAAE,EAAG,EAAC,EAAG,EAAE,CAAA,EAAG,KAAA,EAAO,EAAC,EAAE;AAAA,IAC5E,qBAAA,EAAuB,CAAA;AAAA,IACvB,CAAA,EAAG,kEAAA;AAAA,IAEH,QAAA,EAAU,IAAA;AAAA,IACV,IAAA,EAAM,MAAA;AAAA,IACN,UAAU,GAAA,GAAM,GAAA;AAAA,IAChB,QAAA,EAAU,KAAA;AAAA,IACV,SAAS,MAAA,CAAO,gBAAA;AAAA,IAChB,SAAS,MAAA,CAAO,gBAAA;AAAA,IAChB,aAAa,EAAC;AAAA,IACd,YAAY,EAAC;AAAA,IACb,GAAA,EAAK,kBAAA;AAAA,IACL,KAAA,EAAO,CAAC,GAAA,EAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE,EAAG,CAAA,EAAG,KAAA,EAAO,IAAI;AAAA,GAC7C;AACF;AAGO,SAAS,wBAAsC,KAAA,EAA0C;AAC9F,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,KAAA;AAE1B,EAAAF,eAAAA,CAAS,oBAAoB,MAAM;AACjC,IAAAC,SAAAA,CAAG,wEAAwE,YAAY;AACrF,MAAA,MAAM,QAAQ,cAAA,CAAe;AAAA,QAC3B,SAAS,eAAA,EAAgB;AAAA,QACzB,OAAA,EAAS,EAAE,EAAA,EAAI,MAAA,EAAQ,aAAa,eAAA,EAAiB,CAAA,EAAG,OAAA,EAAS,MAAA,EAAQ,MAAA;AAAO,OACjF,CAAA;AACD,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACnE,MAAA,MAAM,CAAC,OAAO,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA;AAC3C,MAAAC,aAAAA,CAAO,IAAA,CAAK,SAAA,CAAU,OAAA,CAAS,KAAA,CAAM,OAAO,CAAC,CAAA,CAAE,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,OAAO,CAAC,CAAA;AACjF,MAAAA,aAAAA,CAAO,IAAA,CAAK,SAAA,CAAU,OAAA,CAAS,KAAA,CAAM,OAAO,CAAC,CAAA,CAAE,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,IACnF,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,6EAA6E,YAAY;AAC1F,MAAA,MAAM,SAAS,cAAA,CAAe,EAAE,OAAA,EAAS,eAAA,IAAmB,CAAA;AAC5D,MAAA,MAAM,OAAO,cAAA,CAAe,EAAE,SAAS,CAAC,EAAE,IAAI,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE,IAAK,GAAA,EAAK,IAAI,GAAG,CAAA;AAClF,MAAA,MAAM,MAAA,GAAS,cAAA,CAAe,EAAE,OAAA,EAAS,cAAc,CAAA;AACvD,MAAA,MAAM,MAAA,CAAO;AAAA,QACX,EAAE,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAY,CAAC,cAAA,CAAe,WAAA,EAAa,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,EAAE;AAAA,QAClE,EAAE,KAAA,EAAO,IAAA,EAAM,UAAA,EAAY,CAAC,cAAA,CAAe,WAAA,EAAa,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA,EAAE;AAAA,QAChE,EAAE,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAY,CAAC,cAAA,CAAe,WAAA,EAAa,EAAA,CAAG,CAAC,CAAC,CAAC,CAAA;AAAE,OACnE,CAAA;AACD,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,CAAC,WAAW,CAAA,EAAG,EAAA,CAAG,EAAE,CAAC,CAAA;AACjD,MAAAC,aAAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,QAAA,KAAa,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,KAAA,CAAM,OAAO,CAAC,CAAC,CAAA,CAAE,OAAA;AAAA,QACxE,CAAC,MAAA,EAAQ,IAAA,EAAM,MAAM,CAAA,CAAE,GAAA,CAAI,CAAC,KAAA,KAAU,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,OAAO,CAAC;AAAA,OACrE;AAAA,IACF,CAAC,CAAA;AAED,IAAAD,SAAAA,CAAG,uEAAuE,YAAY;AACpF,MAAA,MAAM,QAAQ,cAAA,CAAe,EAAE,OAAA,EAAS,eAAA,IAAmB,CAAA;AAC3D,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACnE,MAAA,MAAM,MAAA,CAAO,CAAC,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,CAAC,CAAA;AACnE,MAAA,MAAM,CAAC,OAAO,CAAA,GAAI,MAAM,KAAA,CAAM,CAAC,WAAW,CAAC,CAAA;AAC3C,MAAAC,aAAAA,CAAO,IAAA,CAAK,SAAA,CAAU,OAAA,CAAS,KAAA,CAAM,OAAO,CAAC,CAAA,CAAE,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,IACnF,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;;;ACzBO,SAAS,kBAAA,CACd,MACA,OAAA,EACM;AACN,EAAA,MAAM,cAAA,GAAiB,QAAQ,qBAAA,IAAyB,KAAA;AACxD,EAAAF,eAAAA,CAAS,CAAA,EAAG,IAAI,CAAA,kCAAA,CAAA,EAAsC,MAAM;AAC1D,IAAA,IAAI,KAAA;AAEJ,IAAAD,kBAAW,YAAY;AACrB,MAAA,KAAA,GAAQ,MAAM,QAAQ,WAAA,EAAY;AAAA,IACpC,CAAC,CAAA;AAED,IAAAI,iBAAU,YAAY;AACpB,MAAA,MAAM,OAAA,CAAQ,eAAe,KAAK,CAAA;AAAA,IACpC,CAAC,CAAA;AAED,IAAA,eAAe,MAAA,CAAO,OAAA,EAAwB,GAAA,GAAY,EAAA,CAAG,CAAC,CAAA,EAAG;AAC/D,MAAA,OAAO,KAAA,CAAM,YAAY,CAAC,WAAA,KAAgB,MAAM,MAAA,CAAO,WAAA,EAAa,OAAA,EAAS,GAAG,CAAC,CAAA;AAAA,IACnF;AAGA,IAAA,eAAe,YAAA,CACb,MAAA,EACA,MAAA,EACA,GAAA,EACoB;AACpB,MAAA,IAAI,MAAA,CAAO,iBAAiB,MAAA,EAAW;AACrC,QAAA,OAAO,MAAA,CAAO,YAAA,CAAa,MAAA,EAAQ,GAAG,CAAA;AAAA,MACxC;AACA,MAAA,MAAM,WAAsB,EAAC;AAC7B,MAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,QAAA,QAAA,CAAS,KAAK,MAAM,MAAA,CAAO,QAAA,CAAS,KAAA,EAAO,GAAG,CAAC,CAAA;AAAA,MACjD;AACA,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,eAAe,KAAA,CACb,UACA,GAAA,GAAY,EAAA,CAAG,CAAC,CAAA,EAChB,KAAA,GAAQ,GAAA,EACR,KAAA,GAAQ,UAAA,EACoB;AAC5B,MAAA,OAAO,MAAM,KAAA,CAAM;AAAA,QACjB,QAAA;AAAA,QACA,KAAA;AAAA,QACA,UAAA,EAAY,KAAA;AAAA,QACZ,gBAAgB,IAAI,IAAA,CAAK,GAAA,CAAI,OAAA,KAAY,QAAQ,CAAA;AAAA,QACjD;AAAA,OACD,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,KAAA,GAAqC;AAAA,MACzC,OAAA;AAAA,MACA,cAAA;AAAA,MACA,OAAO,MAAM,KAAA;AAAA,MACb,MAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,sBAAA,CAAuB,KAAK,CAAA;AAC5B,IAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,IAAA,mBAAA,CAAoB,KAAK,CAAA;AACzB,IAAA,yBAAA,CAA0B,KAAK,CAAA;AAC/B,IAAA,kBAAA,CAAmB,KAAK,CAAA;AACxB,IAAA,kBAAA,CAAmB,KAAK,CAAA;AACxB,IAAA,uBAAA,CAAwB,KAAK,CAAA;AAAA,EAC/B,CAAC,CAAA;AACH;;;AC9FO,IAAM,YAAN,MAAiC;AAAA,EACtC,IAAA;AAAA,EACS,OAAA,uBAAc,GAAA,EAAkB;AAAA,EACzC,SAAA,GAAY,CAAA;AAAA;AAAA,EAEH,QAAA;AAAA,EAET,WAAA,CACE,KAAA,GAAgC,0BAAA,EAChC,OAAA,GAAgD,EAAC,EACjD;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,IAAA,CAAK,KAAK,EAAE,OAAA,EAAQ;AACpC,IAAA,IAAI,OAAA,CAAQ,kBAAkB,IAAA,EAAM;AAClC,MAAA,IAAA,CAAK,QAAA,GAAW,CAAC,IAAA,KAAS,IAAA,CAAK,UAAU,IAAI,CAAA;AAAA,IAC/C;AAAA,EACF;AAAA,EAEA,GAAA,GAAY;AACV,IAAA,OAAO,IAAI,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA;AAAA,EAC3B;AAAA;AAAA,EAGA,QAAQ,YAAA,EAA4B;AAClC,IAAA,MAAM,MAAA,GAAS,KAAK,IAAA,GAAO,YAAA;AAC3B,IAAA,KAAA,IAAS,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG,KAAA,KAAU,MAAA,EAAW,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG;AAC1F,MAAA,IAAA,CAAK,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,MAAM,KAAK,CAAA;AAC3C,MAAA,IAAI,KAAA,CAAM,IAAA,CAAK,MAAA,KAAW,IAAA,EAAM;AAC9B,QAAA,KAAA,CAAM,SAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,CAAM,KAAK,OAAO,CAAA;AAAA,MAC/C,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA,MAC3B;AACA,MAAA,KAAA,CAAM,KAAK,GAAA,EAAI;AAAA,IACjB;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,MAAA;AACZ,IAAA,OAAO,KAAK,GAAA,EAAI;AAAA,EAClB;AAAA,EAEA,IAAI,OAAA,EAAuC;AACzC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,IAAA,CAAK,OAAO,EAAE,OAAA,EAAQ;AACtC,IAAA,OAAO,KAAK,GAAA,EAAI;AAAA,EAClB;AAAA;AAAA,EAGA,IAAI,aAAA,GAAwB;AAC1B,IAAA,OAAO,KAAK,OAAA,CAAQ,IAAA;AAAA,EACtB;AAAA,EAEA,UAAU,IAAA,EAAiC;AACzC,IAAA,MAAM,KAAA,GAAsB;AAAA,MAC1B,IAAA;AAAA,MACA,OAAO,IAAA,CAAK,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,OAAO,CAAA;AAAA,MAC3C,UAAU,IAAA,CAAK,SAAA;AAAA,KACjB;AACA,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,KAAK,CAAA;AACtB,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA,IAC3B,CAAA;AAAA,EACF;AAAA,EAEA,SAAS,KAAA,EAAyC;AAChD,IAAA,IAAI,IAAA;AACJ,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,OAAA,EAAS;AAChC,MAAA,IACE,MAAM,KAAA,IAAS,KAAA,KACd,IAAA,KAAS,MAAA,IACR,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,IAClB,KAAA,CAAM,UAAU,IAAA,CAAK,KAAA,IAAS,KAAA,CAAM,QAAA,GAAW,KAAK,QAAA,CAAA,EACvD;AACA,QAAA,IAAA,GAAO,KAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;AC7EO,IAAM,oBAAN,MAA6C;AAAA,EACzC,IAAA;AAAA,EACA,YAAgC,EAAC;AAAA,EACjC,YAAA,uBAAmB,GAAA,EAAuC;AAAA,EACnE,kBAAA,GAAqB,CAAA;AAAA,EACrB,SAAA,GAAY,KAAA;AAAA,EACZ,MAAA,GAAS,KAAA;AAAA,EAET,WAAA,CAAY,OAAO,QAAA,EAAU;AAC3B,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AAAA,EAEA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,EACnB;AAAA;AAAA,EAGA,kBAAkB,KAAA,EAAqB;AACrC,IAAA,IAAA,CAAK,kBAAA,GAAqB,KAAA;AAAA,EAC5B;AAAA,EAEA,MAAM,OAAA,CAAQ,QAAA,EAAyB,WAAA,EAAoC;AACzE,IAAA,IAAI,IAAA,CAAK,qBAAqB,CAAA,EAAG;AAC/B,MAAA,IAAA,CAAK,kBAAA,IAAsB,CAAA;AAC3B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwC,WAAW,CAAA,CAAE,CAAA;AAAA,IACvE;AACA,IAAA,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,EAAE,WAAA,EAAa,UAAU,CAAA;AAAA,EAC/C;AAAA,EAEA,MAAM,SAAA,CACJ,YAAA,EACA,SAAA,EACe;AACf,IAAA,KAAA,MAAW,eAAe,YAAA,EAAc;AACtC,MAAA,MAAM,WAAW,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,WAAW,KAAK,EAAC;AACxD,MAAA,QAAA,CAAS,KAAK,SAAS,CAAA;AACvB,MAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,WAAA,EAAa,QAAQ,CAAA;AAAA,IAC7C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAA,CACJ,WAAA,EACA,QAAA,EACA,kBAAkB,CAAA,EACD;AACjB,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,WAAW,IAAA,CAAK,YAAA,CAAa,IAAI,WAAW,CAAA,IAAK,EAAC,EAAG;AAC9D,MAAA,KAAA,IAAS,MAAM,uBAAA,CAAwB,OAAA,EAAS,EAAE,QAAA,EAAU,WAAA,EAAa,iBAAiB,CAAA;AAAA,IAC5F;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAAA,EAChB;AACF;AAGA,eAAe,uBAAA,CACb,SACA,QAAA,EAKiB;AACjB,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,IAAK,OAAA,IAAW,CAAA,EAAG;AACpC,IAAA,IAAI;AACF,MAAA,MAAM,QAAQ,QAAA,CAAS,QAAA,EAAU,EAAE,WAAA,EAAa,QAAA,CAAS,aAAa,CAAA;AACtE,MAAA,OAAO,OAAA,GAAU,CAAA;AAAA,IACnB,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,OAAA,IAAW,SAAS,eAAA,EAAiB;AACvC,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;ACvFO,SAAS,kBAAA,CAAmB,MAAc,OAAA,EAA0C;AACzF,EAAAC,4CAAA,CAA2B,EAAE,UAAAJ,eAAAA,EAAU,EAAA,EAAAC,WAAG,EAAG,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AAChE;AAGO,SAAS,qBAAA,CAAsB,MAAc,OAAA,EAA6C;AAC/F,EAAAI,+CAAA,CAA8B,EAAE,UAAAL,eAAAA,EAAU,EAAA,EAAAC,WAAG,EAAG,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AACnE","file":"index.cjs","sourcesContent":["import { createUuidV7, type EventEnvelope, type NewDelivery } from '@relaybus/core';\n\n// The fixed clock, events and deliveries of the store contract suite.\n\nexport interface Deferred {\n readonly promise: Promise<void>;\n readonly resolve: () => void;\n}\n\nexport function createDeferred(): Deferred {\n let resolve!: () => void;\n const promise = new Promise<void>((onResolve) => {\n resolve = onResolve;\n });\n return { promise, resolve };\n}\n\nconst BASE_TIME = Date.parse('2026-01-01T00:00:00.000Z');\nexport const LEASE_MS = 30_000;\n\nexport function at(offsetMs: number): Date {\n return new Date(BASE_TIME + offsetMs);\n}\n\nexport function createEnvelope(overrides: Partial<EventEnvelope> = {}): EventEnvelope {\n return {\n id: createUuidV7(),\n type: 'contract.event.v1',\n source: 'contract-suite',\n key: null,\n payload: { value: 1 },\n headers: {},\n correlationId: null,\n causationId: null,\n occurredAt: at(0),\n ...overrides,\n };\n}\n\nexport function createDelivery(handler: string, availableAt: Date = at(0)): NewDelivery {\n return { id: createUuidV7(), handler, availableAt };\n}\n","import { createUuidV7, type ClaimedDelivery, type EventStore } from '@relaybus/core';\nimport { beforeEach, describe, expect, it } from 'vitest';\nimport { at, createEnvelope, createDelivery, LEASE_MS } from './contract-fixtures.js';\nimport type { ContractSuite } from './contract-suite.js';\n\n/** Setup, append and claim. */\nexport function appendAndClaimContract<TTransaction>(suite: ContractSuite<TTransaction>): void {\n const { append, claim } = suite;\n let store!: EventStore<TTransaction>;\n\n beforeEach(() => {\n store = suite.store();\n });\n\n describe('setup', () => {\n it('can run more than once', async () => {\n await store.setup?.();\n await store.setup?.();\n expect(await store.statistics(at(0))).toMatchObject({ pending: 0 });\n });\n });\n\n describe('append', () => {\n it('stores events and deliveries when the transaction commits', async () => {\n const event = createEnvelope();\n const result = await append([\n { event, deliveries: [createDelivery('handler-a'), createDelivery('handler-b')] },\n ]);\n expect(result).toEqual({\n appendedEventIds: [event.id],\n duplicateEventIds: [],\n appendedDeliveryCount: 2,\n });\n const records = await store.listDeliveries({ eventId: event.id });\n expect(records.map((record) => record.handler).sort()).toEqual(['handler-a', 'handler-b']);\n expect(records.every((record) => record.status === 'pending' && record.attempts === 0)).toBe(\n true,\n );\n });\n\n it('stores nothing when the transaction rolls back', async () => {\n const event = createEnvelope();\n const failure = new Error('rollback');\n await expect(\n store.transaction(async (transaction) => {\n await store.append(\n transaction,\n [{ event, deliveries: [createDelivery('handler-a')] }],\n at(0),\n );\n throw failure;\n }),\n ).rejects.toBe(failure);\n expect(await store.listDeliveries({})).toEqual([]);\n expect(await claim(['handler-a'])).toEqual([]);\n });\n\n it('returns the value of the transaction work', async () => {\n await expect(store.transaction(async () => 'result')).resolves.toBe('result');\n });\n\n it('round-trips the envelope exactly as JSON would', async () => {\n const event = createEnvelope({\n key: 'order-42',\n payload: { text: 'çğıöşü 🚀', nested: { list: [1, 'two', null, true] }, amount: 12.5 },\n headers: { traceparent: '00-abc-def-01', tenant: 'acme' },\n correlationId: createUuidV7(),\n causationId: createUuidV7(),\n occurredAt: new Date('2026-03-04T05:06:07.089Z'),\n });\n await append([{ event, deliveries: [createDelivery('handler-a')] }]);\n const [claimed] = await claim(['handler-a']);\n expect(claimed!.event).toEqual(event);\n expect(claimed!.event.occurredAt).toBeInstanceOf(Date);\n });\n\n it('skips an event id that already exists but adds its missing deliveries', async () => {\n const event = createEnvelope();\n await append([{ event, deliveries: [createDelivery('handler-a')] }]);\n const result = await append([\n { event, deliveries: [createDelivery('handler-a'), createDelivery('handler-b')] },\n ]);\n expect(result).toEqual({\n appendedEventIds: [],\n duplicateEventIds: [event.id],\n appendedDeliveryCount: 1,\n });\n const records = await store.listDeliveries({ eventId: event.id });\n expect(records.map((record) => record.handler).sort()).toEqual(['handler-a', 'handler-b']);\n });\n\n it('deduplicates repeated events and handlers inside one call', async () => {\n const event = createEnvelope();\n const result = await append([\n { event, deliveries: [createDelivery('handler-a'), createDelivery('handler-a')] },\n { event, deliveries: [createDelivery('handler-a')] },\n ]);\n expect(result.appendedEventIds).toEqual([event.id]);\n expect(result.duplicateEventIds).toEqual([event.id]);\n expect(result.appendedDeliveryCount).toBe(1);\n expect(await store.listDeliveries({})).toHaveLength(1);\n });\n\n it('keeps events written by concurrent transactions apart', async () => {\n const events = Array.from({ length: 20 }, () => createEnvelope());\n await Promise.all(\n events.map((event) => append([{ event, deliveries: [createDelivery('handler-a')] }])),\n );\n expect(await store.listDeliveries({ limit: 1_000 })).toHaveLength(20);\n });\n });\n\n describe('claim', () => {\n it('leases due deliveries of the requested handlers and counts the attempt', async () => {\n const event = createEnvelope();\n await append([\n { event, deliveries: [createDelivery('handler-a'), createDelivery('handler-b')] },\n ]);\n const claimed = await claim(['handler-a'], at(1_000));\n expect(claimed).toHaveLength(1);\n expect(claimed[0]).toMatchObject({\n handler: 'handler-a',\n attempt: 1,\n leaseExpiresAt: at(1_000 + LEASE_MS),\n });\n expect(claimed[0]!.leaseToken).toEqual(expect.any(String));\n const [record] = await store.listDeliveries({ handler: 'handler-a' });\n expect(record).toMatchObject({ status: 'processing', attempts: 1, leaseOwner: 'worker-1' });\n expect(record!.leaseExpiresAt).toEqual(at(1_000 + LEASE_MS));\n });\n\n it('ignores deliveries that are not due yet', async () => {\n await append([\n { event: createEnvelope(), deliveries: [createDelivery('handler-a', at(5_000))] },\n ]);\n expect(await claim(['handler-a'], at(4_999))).toEqual([]);\n expect(await claim(['handler-a'], at(5_000))).toHaveLength(1);\n });\n\n it('returns nothing for an empty handler list', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n expect(await claim([])).toEqual([]);\n });\n\n it('respects the limit and claims the earliest due first', async () => {\n const late = createEnvelope();\n const early = createEnvelope();\n const middle = createEnvelope();\n await append([\n { event: late, deliveries: [createDelivery('handler-a', at(300))] },\n { event: early, deliveries: [createDelivery('handler-a', at(100))] },\n { event: middle, deliveries: [createDelivery('handler-a', at(200))] },\n ]);\n const first = await claim(['handler-a'], at(1_000), 2);\n expect(first.map((delivery) => delivery.event.id)).toEqual([early.id, middle.id]);\n const second = await claim(['handler-a'], at(1_000), 2);\n expect(second.map((delivery) => delivery.event.id)).toEqual([late.id]);\n });\n\n it('breaks ties between equally due deliveries by delivery id', async () => {\n const ids = [createUuidV7(), createUuidV7(), createUuidV7()].sort();\n await append([\n {\n event: createEnvelope(),\n deliveries: [{ id: ids[2]!, handler: 'handler-a', availableAt: at(0) }],\n },\n {\n event: createEnvelope(),\n deliveries: [{ id: ids[0]!, handler: 'handler-a', availableAt: at(0) }],\n },\n {\n event: createEnvelope(),\n deliveries: [{ id: ids[1]!, handler: 'handler-a', availableAt: at(0) }],\n },\n ]);\n const claimed = await claim(['handler-a'], at(0), 3);\n expect(claimed.map((delivery) => delivery.deliveryId)).toEqual(ids);\n });\n\n it('does not hand out a leased delivery until its lease expires', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [first] = await claim(['handler-a'], at(0));\n expect(await claim(['handler-a'], at(LEASE_MS - 1), 100, 'worker-2')).toEqual([]);\n const [second] = await claim(['handler-a'], at(LEASE_MS), 100, 'worker-2');\n expect(second).toMatchObject({ deliveryId: first!.deliveryId, attempt: 2 });\n expect(second!.leaseToken).not.toBe(first!.leaseToken);\n });\n\n it('never gives the same delivery to two concurrent claimers', async () => {\n const entries = Array.from({ length: 40 }, () => ({\n event: createEnvelope(),\n deliveries: [createDelivery('handler-a')],\n }));\n await append(entries);\n // A store may lease groups of deliveries to one claimer at a time, so a claimer that\n // keeps claiming is what drains the workload; whatever nobody holds is left for a late one.\n const batches = await Promise.all(\n Array.from({ length: 8 }, async (_, index) => {\n const own: ClaimedDelivery[] = [];\n for (;;) {\n const batch = await claim(['handler-a'], at(0), 10, `worker-${index}`);\n if (batch.length === 0) {\n return own;\n }\n own.push(...batch);\n }\n }),\n );\n const leftovers = await claim(['handler-a'], at(0), 100, 'worker-late');\n const claimedIds = [...batches.flat(), ...leftovers].map((delivery) => delivery.deliveryId);\n expect(new Set(claimedIds).size).toBe(claimedIds.length);\n expect(claimedIds).toHaveLength(40);\n });\n });\n}\n","import { createUuidV7, type EventStore } from '@relaybus/core';\nimport { beforeEach, describe, expect, it } from 'vitest';\nimport { at, createEnvelope, createDelivery, LEASE_MS } from './contract-fixtures.js';\nimport type { ContractSuite } from './contract-suite.js';\n\n/** Fencing by lease token, retries, dead letters and ordering keys. */\nexport function fencingContract<TTransaction>(suite: ContractSuite<TTransaction>): void {\n const { append, claim, keepsCompleted } = suite;\n let store!: EventStore<TTransaction>;\n\n beforeEach(() => {\n store = suite.store();\n });\n\n describe('fencing', () => {\n it('completes a delivery only with its current lease', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [stale] = await claim(['handler-a'], at(0));\n const [current] = await claim(['handler-a'], at(LEASE_MS), 100, 'worker-2');\n expect(await store.complete(stale!, at(LEASE_MS + 1))).toBe(false);\n expect(await store.extendLease(stale!, at(LEASE_MS * 3), at(LEASE_MS + 1))).toBe(false);\n expect(\n await store.reschedule(stale!, at(0), { name: 'Error', message: 'x' }, at(LEASE_MS + 1)),\n ).toBe(false);\n expect(await store.bury(stale!, { name: 'Error', message: 'x' }, at(LEASE_MS + 1))).toBe(\n false,\n );\n expect(await store.complete(current!, at(LEASE_MS + 2))).toBe(true);\n if (!keepsCompleted) {\n expect(await store.listDeliveries({})).toEqual([]);\n return;\n }\n const [record] = await store.listDeliveries({});\n expect(record).toMatchObject({\n status: 'completed',\n leaseOwner: null,\n leaseExpiresAt: null,\n });\n expect(record!.completedAt).toEqual(at(LEASE_MS + 2));\n });\n\n it('refuses to complete twice', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [delivery] = await claim(['handler-a']);\n expect(await store.complete(delivery!, at(1))).toBe(true);\n expect(await store.complete(delivery!, at(2))).toBe(false);\n });\n\n it('refuses leases of unknown deliveries', async () => {\n const lease = { deliveryId: createUuidV7(), leaseToken: createUuidV7() };\n expect(await store.complete(lease, at(0))).toBe(false);\n expect(await store.extendLease(lease, at(1), at(0))).toBe(false);\n });\n\n it('extends a held lease', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [delivery] = await claim(['handler-a']);\n expect(await store.extendLease(delivery!, at(LEASE_MS * 2), at(10))).toBe(true);\n expect(await claim(['handler-a'], at(LEASE_MS + 1), 100, 'worker-2')).toEqual([]);\n const [record] = await store.listDeliveries({});\n expect(record!.leaseExpiresAt).toEqual(at(LEASE_MS * 2));\n });\n\n it('completes inside a transaction together with it', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [delivery] = await claim(['handler-a']);\n await expect(\n store.transaction(async (transaction) => {\n expect(await store.complete(delivery!, at(1), transaction)).toBe(true);\n throw new Error('rollback');\n }),\n ).rejects.toThrow('rollback');\n expect((await store.listDeliveries({}))[0]!.status).toBe('processing');\n await store.transaction(async (transaction) => {\n expect(await store.complete(delivery!, at(2), transaction)).toBe(true);\n });\n if (keepsCompleted) {\n expect((await store.listDeliveries({}))[0]!.status).toBe('completed');\n } else {\n expect(await store.listDeliveries({})).toEqual([]);\n }\n });\n\n it('refuses a transactional completion with a lost lease', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [stale] = await claim(['handler-a'], at(0));\n await claim(['handler-a'], at(LEASE_MS), 100, 'worker-2');\n await store.transaction(async (transaction) => {\n expect(await store.complete(stale!, at(LEASE_MS + 1), transaction)).toBe(false);\n });\n expect((await store.listDeliveries({}))[0]!.status).toBe('processing');\n });\n });\n\n describe('retries and dead letters', () => {\n it('reschedules a delivery with its error', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [delivery] = await claim(['handler-a']);\n const error = { name: 'TypeError', message: 'boom', stack: 'TypeError: boom\\n at x' };\n expect(await store.reschedule(delivery!, at(10_000), error, at(5))).toBe(true);\n const [record] = await store.listDeliveries({});\n expect(record).toMatchObject({\n status: 'pending',\n attempts: 1,\n lastError: error,\n leaseOwner: null,\n });\n expect(record!.availableAt).toEqual(at(10_000));\n expect(await claim(['handler-a'], at(9_999))).toEqual([]);\n const [retry] = await claim(['handler-a'], at(10_000));\n expect(retry!.attempt).toBe(2);\n });\n\n it('buries a delivery so it is never claimed again', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [delivery] = await claim(['handler-a']);\n const error = { name: 'Error', message: 'fatal' };\n expect(await store.bury(delivery!, error, at(5))).toBe(true);\n expect(await claim(['handler-a'], at(LEASE_MS * 10))).toEqual([]);\n const [record] = await store.listDeliveries({ status: 'dead' });\n expect(record).toMatchObject({ status: 'dead', lastError: error });\n expect(record!.updatedAt).toEqual(at(5));\n });\n\n it('requeues only dead deliveries, with a fresh attempt budget', async () => {\n const event = createEnvelope();\n await append([\n { event, deliveries: [createDelivery('handler-a'), createDelivery('handler-b')] },\n ]);\n const [dead] = await claim(['handler-a']);\n await store.bury(dead!, { name: 'Error', message: 'fatal' }, at(1));\n const [pending] = await store.listDeliveries({ handler: 'handler-b' });\n const moved = await store.requeue(\n [dead!.deliveryId, dead!.deliveryId, pending!.id, createUuidV7()],\n at(100),\n );\n expect(moved).toBe(1);\n const [record] = await store.listDeliveries({ handler: 'handler-a' });\n expect(record).toMatchObject({ status: 'pending', attempts: 0 });\n expect(record!.availableAt).toEqual(at(100));\n const [again] = await claim(['handler-a'], at(100));\n expect(again!.attempt).toBe(1);\n });\n });\n\n describe('ordering keys', () => {\n async function appendKeyed(key: string, count: number, handlers = ['handler-a']) {\n const events = Array.from({ length: count }, () => createEnvelope({ key }));\n for (const event of events) {\n await append([{ event, deliveries: handlers.map((handler) => createDelivery(handler)) }]);\n }\n return events;\n }\n\n it('hands out one delivery per handler and key, in publish order', async () => {\n const [first, second, third] = await appendKeyed('order-1', 3);\n const batch1 = await claim(['handler-a']);\n expect(batch1.map((delivery) => delivery.event.id)).toEqual([first!.id]);\n expect(await claim(['handler-a'])).toEqual([]);\n await store.complete(batch1[0]!, at(1));\n const batch2 = await claim(['handler-a']);\n expect(batch2.map((delivery) => delivery.event.id)).toEqual([second!.id]);\n await store.complete(batch2[0]!, at(2));\n expect((await claim(['handler-a'])).map((delivery) => delivery.event.id)).toEqual([\n third!.id,\n ]);\n });\n\n it('keeps later events waiting while the head is retrying', async () => {\n const [first, second] = await appendKeyed('order-1', 2);\n const [head] = await claim(['handler-a']);\n await store.reschedule(head!, at(60_000), { name: 'Error', message: 'retry' }, at(1));\n expect(await claim(['handler-a'], at(30_000))).toEqual([]);\n const [retried] = await claim(['handler-a'], at(60_000));\n expect(retried!.event.id).toBe(first!.id);\n await store.complete(retried!, at(60_001));\n expect((await claim(['handler-a'], at(60_002)))[0]!.event.id).toBe(second!.id);\n });\n\n it('releases the key when the head is dead-lettered', async () => {\n const [, second] = await appendKeyed('order-1', 2);\n const [head] = await claim(['handler-a']);\n await store.bury(head!, { name: 'Error', message: 'fatal' }, at(1));\n expect((await claim(['handler-a']))[0]!.event.id).toBe(second!.id);\n });\n\n it('orders each handler independently', async () => {\n const [first, second] = await appendKeyed('order-1', 2, ['handler-a', 'handler-b']);\n const [fromA] = await claim(['handler-a']);\n await store.complete(fromA!, at(1));\n const [nextA] = await claim(['handler-a']);\n expect(nextA!.event.id).toBe(second!.id);\n const [fromB] = await claim(['handler-b']);\n expect(fromB!.event.id).toBe(first!.id);\n });\n\n it('runs different keys and unkeyed events in parallel', async () => {\n await appendKeyed('order-1', 2);\n await appendKeyed('order-2', 2);\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n expect(await claim(['handler-a'])).toHaveLength(3);\n });\n\n it('orders concurrent publishers of the same key by commit', async () => {\n const events = Array.from({ length: 10 }, (_, index) =>\n createEnvelope({ key: 'shared', payload: { index } }),\n );\n await Promise.all(\n events.map((event) => append([{ event, deliveries: [createDelivery('handler-a')] }])),\n );\n const seen: string[] = [];\n for (let round = 0; round < 10; round += 1) {\n const batch = await claim(['handler-a']);\n expect(batch).toHaveLength(1);\n seen.push(batch[0]!.event.id);\n await store.complete(batch[0]!, at(round + 1));\n }\n expect(new Set(seen).size).toBe(10);\n });\n });\n}\n","import type { EventStore } from '@relaybus/core';\nimport { beforeEach, describe, expect, it } from 'vitest';\nimport {\n at,\n createEnvelope,\n createDelivery,\n createDeferred,\n LEASE_MS,\n} from './contract-fixtures.js';\nimport type { ContractSuite } from './contract-suite.js';\n\n/** Queries, purge, release and appends of transactions still in flight. */\nexport function maintenanceContract<TTransaction>(suite: ContractSuite<TTransaction>): void {\n const { append, claim, keepsCompleted } = suite;\n let store!: EventStore<TTransaction>;\n\n beforeEach(() => {\n store = suite.store();\n });\n\n describe('queries', () => {\n it('filters deliveries and applies the limit in creation order', async () => {\n const first = createEnvelope({ type: 'contract.first.v1' });\n const second = createEnvelope({ type: 'contract.second.v1' });\n await append([{ event: first, deliveries: [createDelivery('handler-a')] }], at(1));\n await append(\n [\n {\n event: second,\n deliveries: [createDelivery('handler-a'), createDelivery('handler-b')],\n },\n ],\n at(2),\n );\n expect(await store.listDeliveries({ eventType: 'contract.second.v1' })).toHaveLength(2);\n expect(await store.listDeliveries({ handler: 'handler-b' })).toHaveLength(1);\n expect(await store.listDeliveries({ status: 'pending', handler: 'handler-a' })).toHaveLength(\n 2,\n );\n expect(await store.listDeliveries({ status: 'dead' })).toEqual([]);\n const limited = await store.listDeliveries({ limit: 1 });\n expect(limited).toHaveLength(1);\n expect(limited[0]!.event.id).toBe(first.id);\n expect(limited[0]!.createdAt).toEqual(at(1));\n });\n\n it('reports counts and the oldest due delivery', async () => {\n await append([\n { event: createEnvelope(), deliveries: [createDelivery('handler-a', at(100))] },\n { event: createEnvelope(), deliveries: [createDelivery('handler-a', at(200))] },\n { event: createEnvelope(), deliveries: [createDelivery('handler-b', at(50_000))] },\n { event: createEnvelope(), deliveries: [createDelivery('handler-c', at(0))] },\n ]);\n const [processing] = await claim(['handler-c'], at(0));\n const [dead] = await claim(['handler-a'], at(100), 1);\n await store.bury(dead!, { name: 'Error', message: 'x' }, at(101));\n expect(await store.statistics(at(1_000))).toEqual({\n pending: 2,\n processing: 1,\n completed: 0,\n dead: 1,\n oldestDueAt: at(200),\n });\n expect((await store.statistics(at(LEASE_MS))).oldestDueAt).toEqual(at(200));\n await store.complete(processing!, at(1));\n expect(await store.statistics(at(0))).toMatchObject({\n completed: keepsCompleted ? 1 : 0,\n processing: 0,\n oldestDueAt: null,\n });\n });\n\n it('counts an expired lease as due', async () => {\n await append([\n { event: createEnvelope(), deliveries: [createDelivery('handler-a', at(LEASE_MS * 5))] },\n ]);\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-b')] }]);\n await claim(['handler-b'], at(0));\n expect((await store.statistics(at(LEASE_MS + 1))).oldestDueAt).toEqual(at(LEASE_MS));\n });\n });\n\n describe('purge', () => {\n async function appendDoneFailedShared() {\n const done = createEnvelope();\n const failed = createEnvelope();\n const shared = createEnvelope();\n await append([\n { event: done, deliveries: [createDelivery('handler-a')] },\n { event: failed, deliveries: [createDelivery('handler-b')] },\n { event: shared, deliveries: [createDelivery('handler-c'), createDelivery('handler-d')] },\n ]);\n const [doneDelivery] = await claim(['handler-a']);\n await store.complete(doneDelivery!, at(10));\n const [failedDelivery] = await claim(['handler-b']);\n await store.bury(failedDelivery!, { name: 'Error', message: 'x' }, at(10));\n const [sharedDelivery] = await claim(['handler-c']);\n await store.complete(sharedDelivery!, at(10));\n return { shared };\n }\n\n it.runIf(keepsCompleted)(\n 'deletes old completed and dead deliveries and their orphaned events',\n async () => {\n const { shared } = await appendDoneFailedShared();\n expect(await store.purge({})).toEqual({ deletedDeliveries: 0, deletedEvents: 0 });\n expect(await store.purge({ completedBefore: at(10) })).toEqual({\n deletedDeliveries: 0,\n deletedEvents: 0,\n });\n expect(await store.purge({ completedBefore: at(11) })).toEqual({\n deletedDeliveries: 2,\n deletedEvents: 1,\n });\n expect(await store.purge({ deadBefore: at(11) })).toEqual({\n deletedDeliveries: 1,\n deletedEvents: 1,\n });\n const remaining = await store.listDeliveries({});\n expect(remaining.map((record) => record.handler)).toEqual(['handler-d']);\n expect(remaining[0]!.event.id).toBe(shared.id);\n },\n );\n\n it.runIf(!keepsCompleted)(\n 'deletes old dead deliveries and the events no delivery references any more',\n async () => {\n const { shared } = await appendDoneFailedShared();\n // Completed deliveries are already gone: only their event is left behind.\n expect(await store.purge({})).toEqual({ deletedDeliveries: 0, deletedEvents: 0 });\n expect(await store.purge({ completedBefore: at(0) })).toEqual({\n deletedDeliveries: 0,\n deletedEvents: 0,\n });\n expect(await store.purge({ completedBefore: at(11) })).toEqual({\n deletedDeliveries: 0,\n deletedEvents: 1,\n });\n expect(await store.purge({ deadBefore: at(11) })).toEqual({\n deletedDeliveries: 1,\n deletedEvents: 1,\n });\n const remaining = await store.listDeliveries({});\n expect(remaining.map((record) => record.handler)).toEqual(['handler-d']);\n expect(remaining[0]!.event.id).toBe(shared.id);\n },\n );\n\n it('lets a purged event id be appended again', async () => {\n const event = createEnvelope();\n await append([{ event, deliveries: [createDelivery('handler-a')] }]);\n const [delivery] = await claim(['handler-a']);\n await store.complete(delivery!, at(1));\n await store.purge({ completedBefore: at(2) });\n const result = await append([{ event, deliveries: [createDelivery('handler-a')] }]);\n expect(result.appendedEventIds).toEqual([event.id]);\n });\n });\n\n describe('release', () => {\n it('gives a leased delivery back without counting the attempt', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [delivery] = await claim(['handler-a'], at(0));\n expect(await store.release(delivery!, at(500))).toBe(true);\n const [record] = await store.listDeliveries({});\n expect(record).toMatchObject({\n status: 'pending',\n attempts: 0,\n leaseOwner: null,\n leaseExpiresAt: null,\n });\n expect(record!.availableAt).toEqual(at(500));\n expect(record!.updatedAt).toEqual(at(500));\n expect(await store.release(delivery!, at(501))).toBe(false);\n const [again] = await claim(['handler-a'], at(500));\n expect(again!.attempt).toBe(1);\n });\n });\n\n describe('transactions in flight', () => {\n it('hides uncommitted appends from every reader', async () => {\n const inside = createDeferred();\n const finish = createDeferred();\n const event = createEnvelope();\n const open = store.transaction(async (transaction) => {\n await store.append(\n transaction,\n [{ event, deliveries: [createDelivery('handler-a')] }],\n at(0),\n );\n inside.resolve();\n await finish.promise;\n });\n await inside.promise;\n expect(await claim(['handler-a'])).toEqual([]);\n expect(await store.listDeliveries({})).toEqual([]);\n expect((await store.statistics(at(0))).pending).toBe(0);\n finish.resolve();\n await open;\n expect(await claim(['handler-a'])).toHaveLength(1);\n });\n\n it('orders same-key events by commit, not by first write', async () => {\n const first = createEnvelope({ key: 'race' });\n const second = createEnvelope({ key: 'race' });\n const firstWritten = createDeferred();\n const releaseFirst = createDeferred();\n const firstTransaction = store.transaction(async (transaction) => {\n await store.append(\n transaction,\n [{ event: first, deliveries: [createDelivery('handler-a')] }],\n at(0),\n );\n firstWritten.resolve();\n await releaseFirst.promise;\n });\n await firstWritten.promise;\n const secondTransaction = store.transaction((transaction) =>\n store.append(\n transaction,\n [{ event: second, deliveries: [createDelivery('handler-a')] }],\n at(0),\n ),\n );\n await new Promise((resolve) => setTimeout(resolve, 50));\n releaseFirst.resolve();\n await firstTransaction;\n await secondTransaction;\n const [head] = await claim(['handler-a']);\n expect(head!.event.id).toBe(first.id);\n await store.complete(head!, at(1));\n expect((await claim(['handler-a']))[0]!.event.id).toBe(second.id);\n });\n\n it('stores an event id written by two concurrent transactions once', async () => {\n const event = createEnvelope({ key: 'same' });\n const results = await Promise.all([\n append([{ event, deliveries: [createDelivery('handler-a')] }]),\n append([{ event, deliveries: [createDelivery('handler-a'), createDelivery('handler-b')] }]),\n ]);\n const appended = results.flatMap((result) => result.appendedEventIds);\n expect(appended).toEqual([event.id]);\n const records = await store.listDeliveries({});\n expect(records.map((record) => record.handler).sort()).toEqual(['handler-a', 'handler-b']);\n });\n });\n}\n","import { createUuidV7, type EventStore } from '@relaybus/core';\nimport { beforeEach, describe, expect, it } from 'vitest';\nimport { at, createEnvelope, createDelivery, LEASE_MS } from './contract-fixtures.js';\nimport type { ContractSuite } from './contract-suite.js';\n\n/** Ordering under load, requeued keyed dead letters, lease semantics and data fidelity. */\nexport function orderingAndLeasesContract<TTransaction>(suite: ContractSuite<TTransaction>): void {\n const { append, claim } = suite;\n let store!: EventStore<TTransaction>;\n\n beforeEach(() => {\n store = suite.store();\n });\n\n describe('ordering keys under load', () => {\n it('does not let a blocked key starve unrelated deliveries', async () => {\n const blocked = Array.from({ length: 120 }, () => ({\n event: createEnvelope({ key: 'hot' }),\n deliveries: [createDelivery('handler-a', at(0))],\n }));\n await append(blocked);\n const unrelated = Array.from({ length: 5 }, () => ({\n event: createEnvelope(),\n deliveries: [createDelivery('handler-a', at(10))],\n }));\n await append(unrelated);\n const claimed = await claim(['handler-a'], at(100), 10);\n expect(claimed).toHaveLength(6);\n expect(claimed.filter((delivery) => delivery.event.key === 'hot')).toHaveLength(1);\n });\n\n it('keeps successors blocked behind an expired, delayed or requeued head', async () => {\n const head = createEnvelope({ key: 'k' });\n const next = createEnvelope({ key: 'k' });\n await append([{ event: head, deliveries: [createDelivery('handler-a')] }]);\n await append([{ event: next, deliveries: [createDelivery('handler-a')] }]);\n const [claimedHead] = await claim(['handler-a'], at(0));\n const reclaimed = await claim(['handler-a'], at(LEASE_MS), 100, 'worker-2');\n expect(reclaimed.map((delivery) => delivery.event.id)).toEqual([head.id]);\n expect(\n await store.reschedule(\n reclaimed[0]!,\n at(LEASE_MS * 10),\n { name: 'Error', message: 'x' },\n at(LEASE_MS),\n ),\n ).toBe(true);\n expect(await claim(['handler-a'], at(LEASE_MS * 5))).toEqual([]);\n const [delayedHead] = await claim(['handler-a'], at(LEASE_MS * 10));\n await store.bury(delayedHead!, { name: 'Error', message: 'x' }, at(LEASE_MS * 10));\n expect(await store.requeue([delayedHead!.deliveryId], at(LEASE_MS * 11))).toBe(1);\n const [requeuedHead] = await claim(['handler-a'], at(LEASE_MS * 11));\n expect(requeuedHead!.event.id).toBe(head.id);\n expect(await claim(['handler-a'], at(LEASE_MS * 11))).toEqual([]);\n expect(claimedHead).toBeDefined();\n });\n });\n\n describe('requeued keyed dead letters', () => {\n it('never runs a requeued dead letter alongside its running successor', async () => {\n const first = createEnvelope({ key: 'k' });\n const second = createEnvelope({ key: 'k' });\n await append([{ event: first, deliveries: [createDelivery('handler-a')] }]);\n await append([{ event: second, deliveries: [createDelivery('handler-a')] }]);\n const [head] = await claim(['handler-a'], at(0));\n await store.bury(head!, { name: 'Error', message: 'x' }, at(1));\n const [successor] = await claim(['handler-a'], at(2));\n expect(successor!.event.id).toBe(second.id);\n expect(await store.requeue([head!.deliveryId], at(3))).toBe(1);\n expect(await claim(['handler-a'], at(4))).toEqual([]);\n await store.complete(successor!, at(5));\n const [requeued] = await claim(['handler-a'], at(6));\n expect(requeued!.event.id).toBe(first.id);\n });\n\n it('recovers when the running successor crashes after the requeue', async () => {\n const first = createEnvelope({ key: 'k' });\n const second = createEnvelope({ key: 'k' });\n await append([{ event: first, deliveries: [createDelivery('handler-a')] }]);\n await append([{ event: second, deliveries: [createDelivery('handler-a')] }]);\n const [head] = await claim(['handler-a'], at(0));\n await store.bury(head!, { name: 'Error', message: 'x' }, at(1));\n await claim(['handler-a'], at(2));\n await store.requeue([head!.deliveryId], at(3));\n const recovered = await claim(['handler-a'], at(2 + LEASE_MS));\n expect(recovered.map((delivery) => delivery.event.id)).toEqual([first.id]);\n await store.complete(recovered[0]!, at(3 + LEASE_MS));\n const [retried] = await claim(['handler-a'], at(4 + LEASE_MS));\n expect(retried).toMatchObject({ attempt: 2 });\n expect(retried!.event.id).toBe(second.id);\n });\n });\n\n describe('lease semantics', () => {\n it('confirms a repeated renewal with identical values', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [delivery] = await claim(['handler-a'], at(0));\n expect(await store.extendLease(delivery!, at(LEASE_MS * 2), at(10))).toBe(true);\n expect(await store.extendLease(delivery!, at(LEASE_MS * 2), at(10))).toBe(true);\n });\n\n it('accepts an expired lease that nobody reclaimed', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [delivery] = await claim(['handler-a'], at(0));\n expect(await store.extendLease(delivery!, at(LEASE_MS * 3), at(LEASE_MS * 2))).toBe(true);\n expect(await store.complete(delivery!, at(LEASE_MS * 2))).toBe(true);\n });\n\n it('rejects every lease operation once the delivery left processing', async () => {\n const error = { name: 'Error', message: 'x' };\n await append([\n {\n event: createEnvelope(),\n deliveries: [createDelivery('a'), createDelivery('b'), createDelivery('c')],\n },\n ]);\n const [completed] = await claim(['a']);\n await store.complete(completed!, at(1));\n const [buried] = await claim(['b']);\n await store.bury(buried!, error, at(1));\n const [rescheduled] = await claim(['c']);\n await store.reschedule(rescheduled!, at(100), error, at(1));\n for (const lease of [completed!, buried!, rescheduled!]) {\n expect(await store.extendLease(lease, at(LEASE_MS), at(2))).toBe(false);\n expect(await store.reschedule(lease, at(3), error, at(2))).toBe(false);\n expect(await store.bury(lease, error, at(2))).toBe(false);\n expect(await store.release(lease, at(2))).toBe(false);\n expect(await store.complete(lease, at(2))).toBe(false);\n }\n });\n\n it('rejects made-up leases on pending deliveries and requeues only dead ones', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('a')] }]);\n const [pending] = await store.listDeliveries({});\n const fake = { deliveryId: pending!.id, leaseToken: createUuidV7() };\n expect(await store.reschedule(fake, at(1), { name: 'Error', message: 'x' }, at(1))).toBe(\n false,\n );\n expect(await store.bury(fake, { name: 'Error', message: 'x' }, at(1))).toBe(false);\n const [processing] = await claim(['a']);\n expect(await store.requeue([processing!.deliveryId], at(1))).toBe(0);\n expect(await store.purge({ completedBefore: at(1e9), deadBefore: at(1e9) })).toEqual({\n deletedDeliveries: 0,\n deletedEvents: 0,\n });\n expect(await store.listDeliveries({})).toHaveLength(1);\n });\n });\n\n describe('data fidelity', () => {\n it.each([null, 0, 42.5, 'text', [1, { two: 2 }], { deep: { list: [] } }, true])(\n 'round-trips the payload %j',\n async (payload) => {\n const event = createEnvelope({ payload });\n await append([{ event, deliveries: [createDelivery('handler-a')] }]);\n const [claimed] = await claim(['handler-a']);\n expect(claimed!.event.payload).toEqual(payload);\n },\n );\n\n it('accepts long identifiers and non-UUID event ids', async () => {\n const handler = 'h'.repeat(255);\n const event = createEnvelope({\n id: `order-42:placed:${'x'.repeat(200)}`,\n key: 'k'.repeat(255),\n type: 't'.repeat(255),\n });\n await append([{ event, deliveries: [createDelivery(handler)] }]);\n const [claimed] = await claim([handler]);\n expect(claimed!.event).toEqual(event);\n expect(claimed!.handler).toBe(handler);\n });\n\n it('lists at most 100 deliveries by default', async () => {\n await append(\n Array.from({ length: 101 }, () => ({\n event: createEnvelope(),\n deliveries: [createDelivery('handler-a')],\n })),\n );\n expect(await store.listDeliveries({})).toHaveLength(100);\n });\n\n it('hands out copies that callers cannot use to change stored data', async () => {\n const event = createEnvelope({ payload: { amount: 1 }, headers: { a: '1' } });\n await append([{ event, deliveries: [createDelivery('handler-a')] }]);\n const [claimed] = await claim(['handler-a']);\n (claimed!.event.payload as { amount: number }).amount = 999;\n (claimed!.event.headers as Record<string, string>)['a'] = 'changed';\n const [listed] = await store.listDeliveries({});\n expect(listed!.event.payload).toEqual({ amount: 1 });\n expect(listed!.event.headers).toEqual({ a: '1' });\n });\n });\n}\n","import type { EventStore } from '@relaybus/core';\nimport { beforeEach, describe, expect, it } from 'vitest';\nimport { at, createEnvelope, createDelivery, LEASE_MS } from './contract-fixtures.js';\nimport type { ContractSuite } from './contract-suite.js';\n\n/** Completion, stale leases of one delivery and retention of the deduplication record. */\nexport function completionContract<TTransaction>(suite: ContractSuite<TTransaction>): void {\n const { append, claim, completeMany, keepsCompleted } = suite;\n let store!: EventStore<TTransaction>;\n\n beforeEach(() => {\n store = suite.store();\n });\n\n describe('completion', () => {\n it('removes a completed delivery from every listing', async () => {\n const event = createEnvelope();\n await append([\n { event, deliveries: [createDelivery('handler-a'), createDelivery('handler-b')] },\n ]);\n const [delivery] = await claim(['handler-a']);\n expect(await store.complete(delivery!, at(5))).toBe(true);\n const records = await store.listDeliveries({ eventId: event.id });\n if (keepsCompleted) {\n expect(records.map((record) => [record.handler, record.status]).sort()).toEqual([\n ['handler-a', 'completed'],\n ['handler-b', 'pending'],\n ]);\n const [completed] = await store.listDeliveries({ status: 'completed' });\n expect(completed).toMatchObject({ handler: 'handler-a', attempts: 1 });\n expect(completed!.completedAt).toEqual(at(5));\n } else {\n expect(records.map((record) => [record.handler, record.status])).toEqual([\n ['handler-b', 'pending'],\n ]);\n expect(await store.listDeliveries({ status: 'completed' })).toEqual([]);\n }\n expect(await claim(['handler-a'], at(LEASE_MS * 10))).toEqual([]);\n expect(await store.statistics(at(0))).toMatchObject({\n pending: 1,\n processing: 0,\n completed: keepsCompleted ? 1 : 0,\n });\n });\n\n it('does not create the delivery of a handler that already completed again', async () => {\n const event = createEnvelope();\n await append([{ event, deliveries: [createDelivery('handler-a')] }]);\n const [delivery] = await claim(['handler-a']);\n await store.complete(delivery!, at(1));\n // A broker redelivery or a publish retry carries the same event id: handler-a must not run twice.\n const result = await append([\n { event, deliveries: [createDelivery('handler-a'), createDelivery('handler-b')] },\n ]);\n expect(result).toEqual({\n appendedEventIds: [],\n duplicateEventIds: [event.id],\n appendedDeliveryCount: 1,\n });\n expect(await claim(['handler-a'], at(LEASE_MS * 10))).toEqual([]);\n expect(await claim(['handler-b'], at(LEASE_MS * 10))).toHaveLength(1);\n const again = await append([{ event, deliveries: [createDelivery('handler-a')] }]);\n expect(again.appendedDeliveryCount).toBe(0);\n });\n\n it('completes many leases at once and reports each one', async () => {\n await append(\n Array.from({ length: 5 }, () => ({\n event: createEnvelope(),\n deliveries: [createDelivery('handler-a')],\n })),\n );\n const claimed = await claim(['handler-a']);\n expect(claimed).toHaveLength(5);\n expect(await completeMany(store, [], at(1))).toEqual([]);\n expect(await completeMany(store, claimed.slice(0, 3), at(1))).toEqual([true, true, true]);\n expect(await store.statistics(at(2))).toMatchObject({ processing: 2, pending: 0 });\n expect(await completeMany(store, claimed, at(2))).toEqual([false, false, false, true, true]);\n expect(await store.statistics(at(3))).toMatchObject({ processing: 0, pending: 0 });\n });\n\n it('completes a lease listed twice only once', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [delivery] = await claim(['handler-a']);\n expect(await completeMany(store, [delivery!, delivery!], at(1))).toEqual([true, false]);\n });\n\n it('fences every lease of a batch on its own', async () => {\n await append(\n Array.from({ length: 3 }, () => ({\n event: createEnvelope(),\n deliveries: [createDelivery('handler-a')],\n })),\n );\n const stale = await claim(['handler-a'], at(0));\n const current = await claim(['handler-a'], at(LEASE_MS), 100, 'worker-2');\n expect(current).toHaveLength(3);\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }], at(1));\n const [fresh] = await claim(['handler-a'], at(LEASE_MS + 1), 100, 'worker-2');\n expect(\n await completeMany(store, [stale[0]!, fresh!, stale[1]!, current[2]!], at(LEASE_MS + 2)),\n ).toEqual([false, true, false, true]);\n expect(await store.statistics(at(LEASE_MS + 3))).toMatchObject({ processing: 2 });\n });\n\n it('does not complete a lease of a delivery that went back to pending', async () => {\n const error = { name: 'Error', message: 'x' };\n await append([\n { event: createEnvelope(), deliveries: [createDelivery('a'), createDelivery('b')] },\n ]);\n const [retrying] = await claim(['a']);\n const [released] = await claim(['b']);\n await store.reschedule(retrying!, at(1_000), error, at(1));\n await store.release(released!, at(1));\n expect(await completeMany(store, [retrying!, released!], at(2))).toEqual([false, false]);\n expect(await store.statistics(at(2))).toMatchObject({ pending: 2, processing: 0 });\n });\n });\n\n describe('stale leases of one delivery', () => {\n const error = { name: 'Error', message: 'x' };\n\n it('refuses the lease of an attempt that was released when the same owner claims it again', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [stale] = await claim(['handler-a'], at(0), 100, 'worker-1');\n expect(await store.release(stale!, at(1))).toBe(true);\n const [current] = await claim(['handler-a'], at(2), 100, 'worker-1');\n expect(current!.deliveryId).toBe(stale!.deliveryId);\n expect(current!.leaseToken).not.toBe(stale!.leaseToken);\n expect(await store.complete(stale!, at(3))).toBe(false);\n expect(await store.bury(stale!, error, at(3))).toBe(false);\n expect(await store.reschedule(stale!, at(9), error, at(3))).toBe(false);\n expect(await store.release(stale!, at(3))).toBe(false);\n expect(await store.extendLease(stale!, at(LEASE_MS * 3), at(3))).toBe(false);\n expect(await store.complete(current!, at(4))).toBe(true);\n });\n\n it('refuses the lease of an attempt that was rescheduled when the same owner claims it again', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [stale] = await claim(['handler-a'], at(0), 100, 'worker-1');\n expect(await store.reschedule(stale!, at(10), error, at(1))).toBe(true);\n const [current] = await claim(['handler-a'], at(10), 100, 'worker-1');\n expect(current).toMatchObject({ deliveryId: stale!.deliveryId, attempt: 2 });\n expect(await store.complete(stale!, at(11))).toBe(false);\n expect(await store.bury(stale!, error, at(11))).toBe(false);\n expect(await completeMany(store, [stale!], at(11))).toEqual([false]);\n expect(await store.complete(current!, at(12))).toBe(true);\n });\n\n it('matches the results of completeMany to the lease, not to the delivery id', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [stale] = await claim(['handler-a'], at(0), 100, 'worker-1');\n await store.release(stale!, at(1));\n const [current] = await claim(['handler-a'], at(2), 100, 'worker-1');\n expect(await completeMany(store, [stale!, current!], at(3))).toEqual([false, true]);\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-b')] }]);\n const [staleB] = await claim(['handler-b'], at(4), 100, 'worker-1');\n await store.release(staleB!, at(5));\n const [currentB] = await claim(['handler-b'], at(6), 100, 'worker-1');\n expect(await completeMany(store, [currentB!, staleB!], at(7))).toEqual([true, false]);\n });\n });\n\n describe('retention of the deduplication record', () => {\n const DAY = 86_400_000;\n\n it('keeps an event for the retention window after its last delivery completed, however old it is', async () => {\n const event = createEnvelope();\n await append([{ event, deliveries: [createDelivery('handler-a')] }]);\n const [delivery] = await claim(['handler-a'], at(30 * DAY));\n expect(await store.complete(delivery!, at(30 * DAY + 1))).toBe(true);\n // The event is 30 days old but completed just now: a 29 day completed retention must not take it.\n expect(await store.purge({ completedBefore: at(29 * DAY) })).toMatchObject({\n deletedEvents: 0,\n });\n const again = await append(\n [{ event, deliveries: [createDelivery('handler-a')] }],\n at(30 * DAY + 2),\n );\n expect(again.appendedDeliveryCount).toBe(0);\n expect(await store.purge({ completedBefore: at(31 * DAY) })).toMatchObject({\n deletedEvents: 1,\n });\n const afterwards = await append(\n [{ event, deliveries: [createDelivery('handler-a')] }],\n at(31 * DAY),\n );\n expect(afterwards.appendedEventIds).toEqual([event.id]);\n });\n\n it('keeps the later completion time of an event when completions are recorded out of order', async () => {\n const event = createEnvelope();\n await append([\n { event, deliveries: [createDelivery('handler-a'), createDelivery('handler-b')] },\n ]);\n const claimed = await claim(['handler-a', 'handler-b']);\n expect(claimed).toHaveLength(2);\n const [first, second] = claimed.sort((left, right) =>\n left.handler.localeCompare(right.handler),\n );\n expect(await store.complete(first!, at(200))).toBe(true);\n // A worker with a slow clock records an earlier time afterwards: it must not move the event back.\n expect(await store.complete(second!, at(100))).toBe(true);\n expect(await store.purge({ completedBefore: at(150) })).toMatchObject({ deletedEvents: 0 });\n const again = await append(\n [{ event, deliveries: [createDelivery('handler-a'), createDelivery('handler-b')] }],\n at(201),\n );\n expect(again.appendedDeliveryCount).toBe(0);\n });\n\n it('remembers every handler of an event appended twice in one transaction', async () => {\n const event = createEnvelope();\n const result = await store.transaction(async (transaction) => {\n await store.append(\n transaction,\n [{ event, deliveries: [createDelivery('handler-a')] }],\n at(0),\n );\n return store.append(\n transaction,\n [{ event, deliveries: [createDelivery('handler-b')] }],\n at(0),\n );\n });\n expect(result).toMatchObject({ duplicateEventIds: [event.id], appendedDeliveryCount: 1 });\n const claimed = await claim(['handler-a', 'handler-b']);\n expect(claimed).toHaveLength(2);\n for (const delivery of claimed) {\n expect(await store.complete(delivery, at(1))).toBe(true);\n }\n const again = await append(\n [{ event, deliveries: [createDelivery('handler-a'), createDelivery('handler-b')] }],\n at(2),\n );\n expect(again).toMatchObject({ duplicateEventIds: [event.id], appendedDeliveryCount: 0 });\n });\n\n it('does not let the dead-letter cutoff remove events whose deliveries completed', async () => {\n const event = createEnvelope();\n await append([{ event, deliveries: [createDelivery('handler-a')] }]);\n const [delivery] = await claim(['handler-a']);\n await store.complete(delivery!, at(1));\n expect(await store.purge({ deadBefore: at(100 * DAY) })).toMatchObject({\n deletedEvents: 0,\n });\n const again = await append([{ event, deliveries: [createDelivery('handler-a')] }], at(2));\n expect(again.appendedDeliveryCount).toBe(0);\n });\n });\n}\n","import type { EventStore } from '@relaybus/core';\nimport { afterEach, beforeEach, describe, expect, it } from 'vitest';\nimport { at, createEnvelope, createDelivery, LEASE_MS } from './contract-fixtures.js';\nimport type { ContractSuite } from './contract-suite.js';\n\n/** Lost leases, relinquish and stores across instances. */\nexport function lostLeasesContract<TTransaction>(suite: ContractSuite<TTransaction>): void {\n const { append, claim, completeMany, options } = suite;\n let store!: EventStore<TTransaction>;\n\n beforeEach(() => {\n store = suite.store();\n });\n\n describe('lost leases', () => {\n it('hands a delivery of a crashed worker to the next claimer with the attempt counted', async () => {\n await append(\n Array.from({ length: 4 }, () => ({\n event: createEnvelope(),\n deliveries: [createDelivery('handler-a')],\n })),\n );\n const first = await claim(['handler-a'], at(0), 100, 'worker-1');\n expect(first.map((delivery) => delivery.attempt)).toEqual([1, 1, 1, 1]);\n expect(await claim(['handler-a'], at(LEASE_MS - 1), 100, 'worker-2')).toEqual([]);\n const second = await claim(['handler-a'], at(LEASE_MS), 100, 'worker-2');\n expect(second.map((delivery) => delivery.deliveryId).sort()).toEqual(\n first.map((delivery) => delivery.deliveryId).sort(),\n );\n expect(second.map((delivery) => delivery.attempt)).toEqual([2, 2, 2, 2]);\n for (const stale of first) {\n expect(await store.complete(stale, at(LEASE_MS + 1))).toBe(false);\n }\n expect(await completeMany(store, first, at(LEASE_MS + 1))).toEqual([\n false,\n false,\n false,\n false,\n ]);\n expect(await completeMany(store, second, at(LEASE_MS + 2))).toEqual([true, true, true, true]);\n });\n\n it('keeps counting attempts of a poison delivery until it is dead-lettered', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n for (let crash = 0; crash < 4; crash += 1) {\n const [delivery] = await claim(['handler-a'], at(crash * LEASE_MS), 100, `worker-${crash}`);\n expect(delivery!.attempt).toBe(crash + 1);\n }\n const [last] = await claim(['handler-a'], at(4 * LEASE_MS), 100, 'worker-4');\n expect(last!.attempt).toBe(5);\n expect(await store.bury(last!, { name: 'Error', message: 'poison' }, at(4 * LEASE_MS))).toBe(\n true,\n );\n const [dead] = await store.listDeliveries({ status: 'dead' });\n expect(dead).toMatchObject({ attempts: 5, lastError: { message: 'poison' } });\n expect(await claim(['handler-a'], at(100 * LEASE_MS))).toEqual([]);\n });\n\n it('does not count an attempt that was reported as failed twice', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [delivery] = await claim(['handler-a'], at(0), 100, 'worker-1');\n await store.reschedule(delivery!, at(10), { name: 'Error', message: 'x' }, at(1));\n const [retry] = await claim(['handler-a'], at(LEASE_MS), 100, 'worker-2');\n expect(retry!.attempt).toBe(2);\n const [afterCrash] = await claim(['handler-a'], at(LEASE_MS * 2), 100, 'worker-3');\n expect(afterCrash!.attempt).toBe(3);\n });\n\n it('keeps the order of a key across a takeover', async () => {\n const [head, next] = await (async () => {\n const events = [createEnvelope({ key: 'k' }), createEnvelope({ key: 'k' })];\n for (const event of events) {\n await append([{ event, deliveries: [createDelivery('handler-a')] }]);\n }\n return events;\n })();\n const [stale] = await claim(['handler-a'], at(0), 100, 'worker-1');\n expect(stale!.event.id).toBe(head!.id);\n const taken = await claim(['handler-a'], at(LEASE_MS), 100, 'worker-2');\n expect(taken.map((delivery) => delivery.event.id)).toEqual([head!.id]);\n expect(await store.complete(stale!, at(LEASE_MS + 1))).toBe(false);\n expect(await store.complete(taken[0]!, at(LEASE_MS + 2))).toBe(true);\n const [following] = await claim(['handler-a'], at(LEASE_MS + 3), 100, 'worker-2');\n expect(following!.event.id).toBe(next!.id);\n });\n\n it('lets every worker see only deliveries nobody else holds, and none twice', async () => {\n await append(\n Array.from({ length: 30 }, () => ({\n event: createEnvelope(),\n deliveries: [createDelivery('handler-a')],\n })),\n );\n const seen: string[] = [];\n for (let round = 0; round < 40; round += 1) {\n const owners = ['worker-1', 'worker-2', 'worker-3'];\n const batches = await Promise.all(\n owners.map((owner) => claim(['handler-a'], at(round), 4, owner)),\n );\n for (const batch of batches) {\n seen.push(...batch.map((delivery) => delivery.deliveryId));\n expect(await completeMany(store, batch, at(round))).toEqual(batch.map(() => true));\n }\n }\n expect(seen).toHaveLength(30);\n expect(new Set(seen).size).toBe(30);\n });\n });\n\n describe('relinquish', () => {\n it('hands idle leases to other workers at once and keeps leases with running work', async (context) => {\n if (store.relinquish === undefined) {\n return context.skip();\n }\n await append([\n { event: createEnvelope(), deliveries: [createDelivery('handler-a')] },\n { event: createEnvelope(), deliveries: [createDelivery('handler-a')] },\n ]);\n const claimed = await claim(['handler-a'], at(0), 100, 'worker-1');\n expect(claimed).toHaveLength(2);\n await store.relinquish('worker-1', at(1));\n expect(await store.complete(claimed[0]!, at(2))).toBe(true);\n expect(await store.complete(claimed[1]!, at(2))).toBe(true);\n await store.relinquish('worker-1', at(3));\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }], at(4));\n expect(await claim(['handler-a'], at(4), 100, 'worker-2')).toHaveLength(1);\n });\n\n it('does not give away a delivery that is still running', async (context) => {\n if (store.relinquish === undefined) {\n return context.skip();\n }\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [running] = await claim(['handler-a'], at(0), 100, 'worker-1');\n await store.relinquish('worker-1', at(1));\n expect(await claim(['handler-a'], at(2), 100, 'worker-2')).toEqual([]);\n expect(await store.complete(running!, at(3))).toBe(true);\n });\n });\n\n describe.skipIf(options.createPeerStore === undefined)('across store instances', () => {\n let peer: EventStore<TTransaction>;\n\n beforeEach(async () => {\n peer = await options.createPeerStore!(store);\n });\n\n afterEach(async () => {\n await options.destroyStore?.(peer);\n });\n\n it('never gives one delivery to claimers in different processes', async () => {\n await append(\n Array.from({ length: 60 }, (_, index) => ({\n event: createEnvelope({ key: index % 3 === 0 ? `key-${index % 9}` : null }),\n deliveries: [createDelivery('handler-a')],\n })),\n );\n const request = (owner: string) => ({\n handlers: ['handler-a'],\n limit: 7,\n leaseOwner: owner,\n leaseExpiresAt: at(LEASE_MS),\n now: at(0),\n });\n const batches = await Promise.all([\n ...Array.from({ length: 5 }, (_, index) => store.claim(request(`primary-${index}`))),\n ...Array.from({ length: 5 }, (_, index) => peer.claim(request(`peer-${index}`))),\n ]);\n const claimed = batches.flat();\n expect(new Set(claimed.map((delivery) => delivery.deliveryId)).size).toBe(claimed.length);\n const keys = claimed.map((delivery) => delivery.event.key).filter((key) => key !== null);\n expect(new Set(keys).size).toBe(keys.length);\n });\n\n it('fences a lease taken over by another process', async () => {\n await append([{ event: createEnvelope(), deliveries: [createDelivery('handler-a')] }]);\n const [stale] = await claim(['handler-a'], at(0));\n const [current] = await peer.claim({\n handlers: ['handler-a'],\n limit: 1,\n leaseOwner: 'peer',\n leaseExpiresAt: at(LEASE_MS * 2),\n now: at(LEASE_MS),\n });\n expect(await store.complete(stale!, at(LEASE_MS + 1))).toBe(false);\n expect(await peer.complete(current!, at(LEASE_MS + 1))).toBe(true);\n });\n\n it('completes batches in either process and fences the one that lost its lease', async () => {\n await append(\n Array.from({ length: 6 }, () => ({\n event: createEnvelope(),\n deliveries: [createDelivery('handler-a')],\n })),\n );\n const request = (owner: string, now: Date) => ({\n handlers: ['handler-a'],\n limit: 100,\n leaseOwner: owner,\n leaseExpiresAt: new Date(now.getTime() + LEASE_MS),\n now,\n });\n const stale = await store.claim(request('primary', at(0)));\n const current = await peer.claim(request('peer', at(LEASE_MS)));\n expect(current).toHaveLength(6);\n expect(await completeMany(store, stale, at(LEASE_MS + 1))).toEqual(stale.map(() => false));\n expect(await completeMany(peer, current, at(LEASE_MS + 1))).toEqual(current.map(() => true));\n expect(await store.statistics(at(LEASE_MS + 2))).toMatchObject({\n pending: 0,\n processing: 0,\n });\n });\n });\n}\n","import { describe, expect, it } from 'vitest';\nimport { at, createDelivery, createEnvelope } from './contract-fixtures.js';\nimport type { ContractSuite } from './contract-suite.js';\n\n/**\n * A payload whose serialized form a store that normalizes JSON would change: keys out of\n * alphabetical and length order at every depth, arrays of objects, unicode, numbers JSON writes in\n * exponent form, the largest safe integer, and empty containers.\n */\nfunction unsortedPayload(): Record<string, unknown> {\n return {\n zulu: 'last letter first',\n b: { yankee: [{ zz: 1, a: 2, mm: { q: null, c: true } }, [], {}], alpha: {} },\n longestKeyOfTheObject: 1.0,\n a: 'çğıöşü 🚀 
 \"quoted\" \\\\ tab\\t',\n exponent: 1e21,\n tiny: 5e-324,\n fraction: 0.1 + 0.2,\n negative: -42.5,\n maxSafe: Number.MAX_SAFE_INTEGER,\n minSafe: Number.MIN_SAFE_INTEGER,\n emptyObject: {},\n emptyArray: [],\n '7': 'integer-like key',\n mixed: ['z', { d: 4, c: 3 }, 0, false, null],\n };\n}\n\n/** The payload and headers a store hands back must serialize byte for byte as they were published. */\nexport function payloadFidelityContract<TTransaction>(suite: ContractSuite<TTransaction>): void {\n const { append, claim } = suite;\n\n describe('payload fidelity', () => {\n it('hands out the payload and headers with their key order, as published', async () => {\n const event = createEnvelope({\n payload: unsortedPayload(),\n headers: { zz: 'last', traceparent: '00-abc-def-01', a: 'first', tenant: 'acme' },\n });\n await append([{ event, deliveries: [createDelivery('handler-a')] }]);\n const [claimed] = await claim(['handler-a']);\n expect(JSON.stringify(claimed!.event.payload)).toBe(JSON.stringify(event.payload));\n expect(JSON.stringify(claimed!.event.headers)).toBe(JSON.stringify(event.headers));\n });\n\n it('keeps the order of a payload appended in a batch and of a top-level array', async () => {\n const object = createEnvelope({ payload: unsortedPayload() });\n const list = createEnvelope({ payload: [{ zz: 1, a: { y: 2, b: 1 } }, 'x', 1e21] });\n const scalar = createEnvelope({ payload: 'plain text' });\n await append([\n { event: object, deliveries: [createDelivery('handler-a', at(1))] },\n { event: list, deliveries: [createDelivery('handler-a', at(2))] },\n { event: scalar, deliveries: [createDelivery('handler-a', at(3))] },\n ]);\n const claimed = await claim(['handler-a'], at(10));\n expect(claimed.map((delivery) => JSON.stringify(delivery.event.payload))).toEqual(\n [object, list, scalar].map((event) => JSON.stringify(event.payload)),\n );\n });\n\n it('keeps the order for a handler added to an event that already exists', async () => {\n const event = createEnvelope({ payload: unsortedPayload() });\n await append([{ event, deliveries: [createDelivery('handler-a')] }]);\n await append([{ event, deliveries: [createDelivery('handler-b')] }]);\n const [claimed] = await claim(['handler-b']);\n expect(JSON.stringify(claimed!.event.payload)).toBe(JSON.stringify(event.payload));\n });\n });\n}\n","import type { AppendEntry, ClaimedDelivery, EventStore, LeaseReference } from '@relaybus/core';\nimport { afterEach, beforeEach, describe } from 'vitest';\nimport { appendAndClaimContract } from './contract/append-and-claim.js';\nimport { fencingContract } from './contract/fencing-and-retries.js';\nimport { maintenanceContract } from './contract/queries-and-purge.js';\nimport { orderingAndLeasesContract } from './contract/ordering-and-leases.js';\nimport { completionContract } from './contract/completion.js';\nimport { lostLeasesContract } from './contract/lost-leases.js';\nimport { payloadFidelityContract } from './contract/payload-fidelity.js';\nimport { LEASE_MS, at } from './contract/contract-fixtures.js';\nimport type { ContractSuite } from './contract/contract-suite.js';\n\nexport { at, createDelivery, createEnvelope } from './contract/contract-fixtures.js';\n\nexport interface EventStoreContractOptions<TTransaction> {\n /** Creates an empty, set-up store. Called before every test. */\n readonly createStore: () => Promise<EventStore<TTransaction>>;\n /** Releases the store. Called after every test. */\n readonly destroyStore?: (store: EventStore<TTransaction>) => Promise<void>;\n /**\n * Creates a second store instance on the same database with its own\n * connections, simulating another process. Enables cross-instance tests.\n * Stores without shared state across instances (in-memory) omit it.\n */\n readonly createPeerStore?: (\n primary: EventStore<TTransaction>,\n ) => Promise<EventStore<TTransaction>>;\n /**\n * Whether the stores `createStore` returns keep a record of completed\n * deliveries (completion history). Default false: a completed delivery is\n * deleted. Run the contract once for each mode a store supports.\n */\n readonly keepsCompletedRecords?: boolean;\n}\n\n/**\n * Behaviour every {@link EventStore} must have. Call it inside a test file of\n * the store package:\n *\n * ```ts\n * eventStoreContract('PostgresEventStore', { createStore: async () => ... });\n * ```\n */\nexport function eventStoreContract<TTransaction>(\n name: string,\n options: EventStoreContractOptions<TTransaction>,\n): void {\n const keepsCompleted = options.keepsCompletedRecords ?? false;\n describe(`${name} satisfies the EventStore contract`, () => {\n let store: EventStore<TTransaction>;\n\n beforeEach(async () => {\n store = await options.createStore();\n });\n\n afterEach(async () => {\n await options.destroyStore?.(store);\n });\n\n async function append(entries: AppendEntry[], now: Date = at(0)) {\n return store.transaction((transaction) => store.append(transaction, entries, now));\n }\n\n /** `completeMany` is optional on the port: stores without it complete one by one, in order. */\n async function completeMany(\n target: EventStore<TTransaction>,\n leases: readonly LeaseReference[],\n now: Date,\n ): Promise<boolean[]> {\n if (target.completeMany !== undefined) {\n return target.completeMany(leases, now);\n }\n const outcomes: boolean[] = [];\n for (const lease of leases) {\n outcomes.push(await target.complete(lease, now));\n }\n return outcomes;\n }\n\n async function claim(\n handlers: string[],\n now: Date = at(0),\n limit = 100,\n owner = 'worker-1',\n ): Promise<ClaimedDelivery[]> {\n return store.claim({\n handlers,\n limit,\n leaseOwner: owner,\n leaseExpiresAt: new Date(now.getTime() + LEASE_MS),\n now,\n });\n }\n\n const suite: ContractSuite<TTransaction> = {\n options,\n keepsCompleted,\n store: () => store,\n append,\n claim,\n completeMany,\n };\n appendAndClaimContract(suite);\n fencingContract(suite);\n maintenanceContract(suite);\n orderingAndLeasesContract(suite);\n completionContract(suite);\n lostLeasesContract(suite);\n payloadFidelityContract(suite);\n });\n}\n","import type { Clock } from '@relaybus/core';\n\ntype ScheduledTask = Parameters<NonNullable<Clock['schedule']>>[0];\n\ninterface PendingTimer {\n readonly task: ScheduledTask;\n dueAt: number;\n /** Order of scheduling, so timers due at the same time run in the order they were set. */\n readonly sequence: number;\n}\n\n/**\n * Clock that only moves when told to. With `controlTimers: true` it also owns relaybus's timers\n * (polling, retries, heartbeats, retention, timeouts): they run inside {@link FakeClock.advance}\n * when their time comes instead of on the platform timers. Without it, timers stay real.\n */\nexport class FakeClock implements Clock {\n #now: number;\n readonly #timers = new Set<PendingTimer>();\n #sequence = 0;\n /** Present only with `controlTimers: true`; see {@link Clock.schedule}. */\n readonly schedule?: (task: ScheduledTask) => () => void;\n\n constructor(\n start: Date | string | number = '2026-01-01T00:00:00.000Z',\n options: { readonly controlTimers?: boolean } = {},\n ) {\n this.#now = new Date(start).getTime();\n if (options.controlTimers === true) {\n this.schedule = (task) => this.#schedule(task);\n }\n }\n\n now(): Date {\n return new Date(this.#now);\n }\n\n /** Moves the clock forward, running every controlled timer that falls due on the way, in time order. */\n advance(milliseconds: number): Date {\n const target = this.#now + milliseconds;\n for (let timer = this.#nextDue(target); timer !== undefined; timer = this.#nextDue(target)) {\n this.#now = Math.max(this.#now, timer.dueAt);\n if (timer.task.repeat === true) {\n timer.dueAt += Math.max(1, timer.task.delayMs);\n } else {\n this.#timers.delete(timer);\n }\n timer.task.run();\n }\n this.#now = target;\n return this.now();\n }\n\n set(instant: Date | string | number): Date {\n this.#now = new Date(instant).getTime();\n return this.now();\n }\n\n /** Controlled timers still waiting to run. */\n get pendingTimers(): number {\n return this.#timers.size;\n }\n\n #schedule(task: ScheduledTask): () => void {\n const timer: PendingTimer = {\n task,\n dueAt: this.#now + Math.max(0, task.delayMs),\n sequence: this.#sequence++,\n };\n this.#timers.add(timer);\n return () => {\n this.#timers.delete(timer);\n };\n }\n\n #nextDue(limit: number): PendingTimer | undefined {\n let next: PendingTimer | undefined;\n for (const timer of this.#timers) {\n if (\n timer.dueAt <= limit &&\n (next === undefined ||\n timer.dueAt < next.dueAt ||\n (timer.dueAt === next.dueAt && timer.sequence < next.sequence))\n ) {\n next = timer;\n }\n }\n return next;\n }\n}\n","import type { EventEnvelope, Transport, TransportMessageHandler } from '@relaybus/core';\n\nexport interface PublishedMessage {\n readonly destination: string;\n readonly envelope: EventEnvelope;\n}\n\n/**\n * Transport that keeps messages in memory. `deliver` pushes a message to the\n * subscribers of its destination and, like a broker, redelivers it on failure\n * up to `maxRedeliveries` times.\n */\nexport class InMemoryTransport implements Transport {\n readonly name: string;\n readonly published: PublishedMessage[] = [];\n readonly #subscribers = new Map<string, TransportMessageHandler[]>();\n #failNextPublishes = 0;\n connected = false;\n closed = false;\n\n constructor(name = 'memory') {\n this.name = name;\n }\n\n async connect(): Promise<void> {\n this.connected = true;\n }\n\n /** Makes the next `count` publishes reject, simulating a broker outage. */\n failNextPublishes(count: number): void {\n this.#failNextPublishes = count;\n }\n\n async publish(envelope: EventEnvelope, destination: string): Promise<void> {\n if (this.#failNextPublishes > 0) {\n this.#failNextPublishes -= 1;\n throw new Error(`InMemoryTransport refused publish to ${destination}`);\n }\n this.published.push({ destination, envelope });\n }\n\n async subscribe(\n destinations: readonly string[],\n onMessage: TransportMessageHandler,\n ): Promise<void> {\n for (const destination of destinations) {\n const handlers = this.#subscribers.get(destination) ?? [];\n handlers.push(onMessage);\n this.#subscribers.set(destination, handlers);\n }\n }\n\n /**\n * Delivers a message to every subscriber of `destination`, redelivering it to\n * a subscriber that rejects up to `maxRedeliveries` times. Resolves with the\n * total number of handler calls.\n */\n // eslint-disable-next-line relaybus/max-two-params -- public InMemoryTransport.deliver signature\n async deliver(\n destination: string,\n envelope: EventEnvelope,\n maxRedeliveries = 0,\n ): Promise<number> {\n let calls = 0;\n for (const handler of this.#subscribers.get(destination) ?? []) {\n calls += await deliverWithRedeliveries(handler, { envelope, destination, maxRedeliveries });\n }\n return calls;\n }\n\n async close(): Promise<void> {\n this.closed = true;\n }\n}\n\n/** Hands `envelope` to one handler, again after each failure up to `maxRedeliveries` times; returns the calls. */\nasync function deliverWithRedeliveries(\n handler: TransportMessageHandler,\n delivery: {\n readonly envelope: EventEnvelope;\n readonly destination: string;\n readonly maxRedeliveries: number;\n },\n): Promise<number> {\n for (let attempt = 0; ; attempt += 1) {\n try {\n await handler(delivery.envelope, { destination: delivery.destination });\n return attempt + 1;\n } catch (error) {\n if (attempt >= delivery.maxRedeliveries) {\n throw error;\n }\n }\n }\n}\n","import { describe, it } from 'vitest';\nimport { registerKafkaCodecContract, type KafkaCodecContractOptions } from './kafka.js';\nimport { registerRabbitMqCodecContract, type RabbitMqCodecContractOptions } from './rabbitmq.js';\n\n// The codec contract registered with Vitest, as `@relaybus/testing` has exported it since 0.4.0.\n\n/** Registers one Vitest test per captured Kafka record (see `registerKafkaCodecContract`). */\nexport function kafkaCodecContract(name: string, options: KafkaCodecContractOptions): void {\n registerKafkaCodecContract({ describe, it }, { name, options });\n}\n\n/** Registers one Vitest test per captured RabbitMQ message (see `registerRabbitMqCodecContract`). */\nexport function rabbitMqCodecContract(name: string, options: RabbitMqCodecContractOptions): void {\n registerRabbitMqCodecContract({ describe, it }, { name, options });\n}\n"]}