@ibgib/space-gib 0.0.9 → 0.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/README.md +1 -0
- package/dist/client/bootstrap.mjs +33 -33
- package/dist/client/bootstrap.mjs.map +3 -3
- package/dist/client/chunk-ROJZUPPE.mjs +19 -0
- package/dist/client/chunk-ROJZUPPE.mjs.map +7 -0
- package/dist/client/chunk-WJHRARK6.mjs +2329 -0
- package/dist/client/chunk-WJHRARK6.mjs.map +7 -0
- package/dist/client/index.mjs +22 -1
- package/dist/client/index.mjs.map +4 -4
- package/dist/client/script.mjs +1 -1
- package/dist/server/server.mjs +19147 -18210
- package/dist/server/server.mjs.map +4 -4
- package/package.json +4 -4
- package/space-gib.localhost-1785337158142.log +75 -0
- package/src/client/AUTO-GENERATED-version.mts +1 -1
- package/src/client/README.md +1 -1
- package/src/client/api/space-gib-api-bridge.mts +8 -224
- package/src/client/ui/shell/space-gib-shell-service.mts +68 -18
- package/src/common/keystone-policies.mts +1 -1
- package/src/server/README.md +3 -2
- package/src/server/server.mts +13 -32
- package/src/server/test.json +0 -0
- package/dist/client/chunk-ACIGPCQW.mjs +0 -2407
- package/dist/client/chunk-ACIGPCQW.mjs.map +0 -7
- package/dist/client/chunk-QRMTJE6M.mjs +0 -42
- package/dist/client/chunk-QRMTJE6M.mjs.map +0 -7
- package/space-gib.localhost-1783713259760.log +0 -45
- package/src/client/components/identity-header/IMPLEMENTATION.md +0 -45
- package/src/client/components/identity-header/identity-header.css +0 -112
- package/src/client/components/identity-header/identity-header.html +0 -11
- package/src/client/components/identity-header/identity-header.mts +0 -439
- package/src/client/components/identity-manager/IMPLEMENTATION.md +0 -100
- package/src/client/components/identity-manager/identity-manager.css +0 -171
- package/src/client/components/identity-manager/identity-manager.html +0 -19
- package/src/client/components/identity-manager/identity-manager.mts +0 -639
- package/src/client/components/keystone-creator/keystone-creator.css +0 -65
- package/src/client/components/keystone-creator/keystone-creator.html +0 -41
- package/src/client/components/keystone-creator/keystone-creator.mts +0 -443
- package/src/client/components/keystone-details/keystone-details.css +0 -611
- package/src/client/components/keystone-details/keystone-details.html +0 -151
- package/src/client/components/keystone-details/keystone-details.mts +0 -1213
- package/src/client/components/keystone-scrubber/SCRUBBER_IMPLEMENTATION.md +0 -33
- package/src/client/components/keystone-scrubber/keystone-scrubber.css +0 -46
- package/src/client/components/keystone-scrubber/keystone-scrubber.html +0 -15
- package/src/client/components/keystone-scrubber/keystone-scrubber.mts +0 -356
- package/src/server/bootstrap-helper.mts +0 -141
- package/src/server/bootstrap-helper.respec.mts +0 -100
- package/src/server/metaspace-nodeindexedspace/metaspace-nodeindexedspace.mts +0 -85
- package/src/server/path-constants.mts +0 -101
- package/src/server/path-helper.mts +0 -101
- package/src/server/path-helper.respec.mts +0 -99
- package/src/server/serve-gib/CHANGELOG.md +0 -29
- package/src/server/serve-gib/README.md +0 -43
- package/src/server/serve-gib/constants.mts +0 -1
- package/src/server/serve-gib/handlers/api/debug/ws-echo.handler.mts +0 -105
- package/src/server/serve-gib/handlers/api/health.handler.mts +0 -23
- package/src/server/serve-gib/handlers/api/health.respec.mts +0 -51
- package/src/server/serve-gib/handlers/api/ibgib/ibgib-handler-types.mts +0 -49
- package/src/server/serve-gib/handlers/api/ibgib/ibgib.handler.mts +0 -176
- package/src/server/serve-gib/handlers/api/keystone/keystone-evolve.handler.mts +0 -150
- package/src/server/serve-gib/handlers/api/keystone/keystone-genesis.handler.mts +0 -146
- package/src/server/serve-gib/handlers/api/keystone/keystone-get.handler.mts +0 -198
- package/src/server/serve-gib/handlers/api/keystone/keystone-get.respec.mts +0 -107
- package/src/server/serve-gib/handlers/api/keystone/keystone-handler-types.mts +0 -29
- package/src/server/serve-gib/handlers/api/keystone/keystone-post.handler.mts +0 -55
- package/src/server/serve-gib/handlers/api/keystone/keystone-post.respec.mts +0 -130
- package/src/server/serve-gib/handlers/api/keystone/sso-config.handler.mts +0 -66
- package/src/server/serve-gib/handlers/api/keystone/sso-link.handler.mts +0 -140
- package/src/server/serve-gib/handlers/api/keystone/sso-login.handler.mts +0 -190
- package/src/server/serve-gib/handlers/error-handler.mts +0 -36
- package/src/server/serve-gib/handlers/handler-base.mts +0 -383
- package/src/server/serve-gib/handlers/static-handler.mts +0 -82
- package/src/server/serve-gib/handlers/ws/sync-upgrade-handler-base.mts +0 -233
- package/src/server/serve-gib/handlers/ws/sync-upgrade.handler.mts +0 -24
- package/src/server/serve-gib/handlers/ws/ws-helper.mts +0 -216
- package/src/server/serve-gib/handlers/ws/ws-types.mts +0 -53
- package/src/server/serve-gib/serve-gib-helpers.mts +0 -32
- package/src/server/serve-gib/serve-gib-v1.mts +0 -172
- package/src/server/serve-gib/serve-gib.respec.mts +0 -90
- package/src/server/serve-gib/types.mts +0 -102
- package/src/server/server-constants.mts +0 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/client/index.mts"],
|
|
4
|
-
"sourcesContent": ["import { extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';\n\nimport { GLOBAL_LOG_A_LOT, APP_CONFIG } from './constants.mjs';\nimport {\n initIbGibStorage,\n initIbGibGlobalThis,\n dynamicallyLoadBootstrapScript,\n} from './helpers.web.mjs';\nimport { initDevTools } from './dev-tools.mjs';\n\ninitIbGibGlobalThis(APP_CONFIG);\n\nconst logalot = GLOBAL_LOG_A_LOT;\n\n/**\n * hmm\n * Initiates startup without blocking DOMContentLoaded.\n *\n * Sequence:\n * 1. Init IndexedDB storage\n * 2. Dynamically import bootstrap.mts \u2014 the heavy ibgib graph loads here\n */\nasync function spinOffStartup(): Promise<void> {\n const lc = `[${spinOffStartup.name}]`;\n try {\n if (logalot) { console.log(`${lc} starting... (I: 3d893846d02c4ff49181f9b8e586eb74)`); }\n console.time(lc);\n\n document.addEventListener('DOMContentLoaded', async () => {\n try {\n console.timeLog(lc, 'DOMContentLoaded fired');\n\n await initIbGibStorage(APP_CONFIG);\n console.timeLog(lc, 'initIbGibStorage complete');\n\n await dynamicallyLoadBootstrapScript('./bootstrap.mjs');\n console.timeLog(lc, 'dynamicallyLoadBootstrapScript complete');\n\n initDevTools();\n console.timeLog(lc, 'initDevTools complete');\n\n console.timeEnd(lc);\n } catch (error) {\n console.error(`${lc} ${extractErrorMsg(error)}`);\n throw error;\n }\n });\n\n } catch (error) {\n console.timeEnd(lc);\n debugger; // error in index.mts \u2014 investigate immediately\n console.error(`${lc} ${extractErrorMsg(error)}`);\n throw error;\n } finally {\n if (logalot) { console.log(`${lc} complete.`); }\n }\n}\n\nspinOffStartup();\n"],
|
|
5
|
-
"mappings": "gGAUAA,EAAoBC,CAAU,EAE9B,IAAMC,EAAUC,EAUhB,eAAeC,GAAgC,CAC3C,IAAMC,EAAK,IAAID,EAAe,IAAI,IAClC,GAAI,CACIF,GAAW,QAAQ,IAAI,GAAGG,CAAE,oDAAoD,EACpF,QAAQ,KAAKA,CAAE,EAEf,SAAS,iBAAiB,mBAAoB,SAAY,CACtD,GAAI,CACA,QAAQ,QAAQA,EAAI,wBAAwB,EAE5C,MAAMC,EAAiBL,CAAU,EACjC,QAAQ,QAAQI,EAAI,2BAA2B,EAE/C,MAAME,EAA+B,iBAAiB,EACtD,QAAQ,QAAQF,EAAI,yCAAyC,EAE7DG,EAAa,EACb,QAAQ,QAAQH,EAAI,uBAAuB,EAE3C,QAAQ,QAAQA,CAAE,CACtB,OAASI,EAAO,CACZ,cAAQ,MAAM,GAAGJ,CAAE,IAAIK,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,CACJ,CAAC,CAEL,OAASA,EAAO,CACZ,QAAQ,QAAQJ,CAAE,EAClB,SACA,cAAQ,MAAM,GAAGA,CAAE,IAAIK,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,QAAE,CACMP,GAAW,QAAQ,IAAI,GAAGG,CAAE,YAAY,CAChD,CACJ,CAlCeM,EAAAP,EAAA,kBAoCfA,EAAe",
|
|
6
|
-
"names": ["initIbGibGlobalThis", "APP_CONFIG", "logalot", "GLOBAL_LOG_A_LOT", "spinOffStartup", "lc", "initIbGibStorage", "dynamicallyLoadBootstrapScript", "initDevTools", "error", "extractErrorMsg", "__name"]
|
|
3
|
+
"sources": ["../../../../libs/core-gib/src/sync/sync-constants.mts", "../../../../libs/core-gib/src/sync/sync-types.mts", "../../../../libs/core-gib/src/witness/space/reconciliation-space/reconciliation-space-helper.mts", "../../../../libs/core-gib/src/sync/graft-info/graft-info-constants.mts", "../../../../libs/core-gib/src/sync/graft-info/graft-info-helpers.mts", "../../../../libs/core-gib/src/sync/sync-helpers.mts", "../../../../libs/core-gib/src/sync/sync-saga-context/sync-saga-context-constants.mts", "../../../../libs/core-gib/src/sync/sync-saga-context/sync-saga-context-helpers.mts", "../../../../libs/core-gib/src/sync/sync-peer/sync-peer-v1.mts", "../../../../libs/core-gib/src/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-receiver/sync-websocket-peer-helpers.mts", "../../../../libs/core-gib/src/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-constants.mts", "../../../../libs/core-gib/src/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.mts", "../../../../libs/core-gib/src/sync/sync-saga-message/sync-saga-message-constants.mts", "../../../../libs/core-gib/src/sync/sync-saga-message/sync-saga-message-helpers.mts", "../../../../libs/core-gib/src/sync/sync-saga-coordinator.mts", "../../src/common/keystone-policies.json", "../../src/common/keystone-policies.mts", "../../src/client/api/space-gib-api-bridge.mts", "../../src/client/dev-tools/common.mts", "../../src/client/dev-tools/base-tools.mts", "../../src/client/dev-tools/phase-1.mts", "../../src/client/dev-tools/phase-2.mts", "../../src/client/dev-tools/phase-3.mts", "../../src/client/dev-tools/phase-4-1.mts", "../../src/client/dev-tools/phase-4-2.mts", "../../src/client/dev-tools/phase-4-3.mts", "../../src/client/dev-tools/phase-4-4.mts", "../../src/client/dev-tools/phase-4-5.mts", "../../src/client/dev-tools/phase-4-6.mts", "../../src/client/dev-tools/phase-4-7.mts", "../../src/client/dev-tools/phase-4-8.mts", "../../src/client/dev-tools/phase-4-9.mts", "../../src/client/dev-tools/phase-4-10.mts", "../../src/client/dev-tools.mts", "../../src/client/index.mts"],
|
|
4
|
+
"sourcesContent": ["// import { ROOT_ADDR } from \"@ibgib/ts-gib/dist/V1/constants.mjs\";\r\n\r\nexport const SYNC_ATOM = \"sync\";\r\n\r\nexport const SYNC_MSG_REL8N_NAME = \"syncmsg\";\r\n/**\r\n * payload addrs should be domain-only, i.e., we are not including the sync\r\n * saga ibgib, or its message stone.\r\n */\r\nexport const SYNC_SAGA_PAYLOAD_ADDRS_DOMAIN = \"@payloadAddrsDomain\";\r\n\r\n// #region SyncStage\r\nexport const SYNC_STAGE_INIT = \"init\";\r\nexport const SYNC_STAGE_ACK = \"ack\";\r\nexport const SYNC_STAGE_DELTA = \"delta\";\r\nexport const SYNC_STAGE_COMMIT = \"commit\";\r\n\r\nexport type SyncStage =\r\n | typeof SYNC_STAGE_INIT\r\n | typeof SYNC_STAGE_ACK\r\n | typeof SYNC_STAGE_DELTA\r\n | typeof SYNC_STAGE_COMMIT;\r\n\r\nexport const SyncStage = {\r\n /**\r\n * first frame\r\n */\r\n init: SYNC_STAGE_INIT,\r\n /**\r\n * 2nd frame, response to init\r\n */\r\n ack: SYNC_STAGE_ACK,\r\n /**\r\n * exchanging/negotiating ibgibs\r\n */\r\n delta: SYNC_STAGE_DELTA,\r\n /**\r\n * final phases of sync\r\n */\r\n commit: SYNC_STAGE_COMMIT,\r\n} satisfies { [key: string]: SyncStage };\r\nexport const SYNC_STAGE_VALID_VALUES = Object.values(SyncStage);\r\n// #endregion SyncStage\r\n\r\n// #region SyncConflictStrategy\r\nexport const SYNC_CONFLICT_STRATEGY_ABORT = 'abort';\r\nexport const SYNC_CONFLICT_STRATEGY_OPTIMISTIC_GRAFT_LCS = 'optimistic-graft-longest-common-subsequence';\r\n// export const SYNC_CONFLICT_STRATEGY_MANUAL = 'manual'; // not implemented yet\r\nexport type SyncConflictStrategy =\r\n | typeof SYNC_CONFLICT_STRATEGY_ABORT\r\n | typeof SYNC_CONFLICT_STRATEGY_OPTIMISTIC_GRAFT_LCS\r\n // | typeof SYNC_CONFLICT_STRATEGY_MANUAL // not implemented yet\r\n ;\r\n/**\r\n * @see {@link SyncOptions.conflictStrategy}\r\n */\r\nexport const SyncConflictStrategy = {\r\n /**\r\n * As soon as a conflict is detected, the sync aborts and fails completely.\r\n */\r\n abort: SYNC_CONFLICT_STRATEGY_ABORT,\r\n /**\r\n * * Optimistic: do something even if its wrong\r\n * * LCS: Longest common subsequence algorithm used when encountering\r\n * data.text differences.\r\n *\r\n * ## notes\r\n *\r\n * If we are making changes to text, then we will try to merge that text\r\n * instead of last-one-wins.\r\n */\r\n optimisticWithLCS: SYNC_CONFLICT_STRATEGY_OPTIMISTIC_GRAFT_LCS,\r\n // manual: SYNC_CONFLICT_STRATEGY_MANUAL, // not implemented yet\r\n} satisfies { [key: string]: SyncConflictStrategy };\r\nexport const SYNC_CONFLICT_STRATEGY_VALID_VALUES = Object.values(SyncConflictStrategy);\r\nexport function isValidSyncConflictStrategy(strategy: string): strategy is SyncConflictStrategy {\r\n return SYNC_CONFLICT_STRATEGY_VALID_VALUES.includes(strategy as SyncConflictStrategy);\r\n}\r\n// #endregion SyncConflictStrategy\r\n", "import { IbGibAddr } from \"@ibgib/ts-gib/dist/types.mjs\";\r\nimport { IbGib_V1, IbGibData_V1, IbGibRel8ns_V1 } from \"@ibgib/ts-gib/dist/V1/types.mjs\";\r\nimport { KeystoneIbGib_V1 } from \"../keystone/keystone-types.mjs\";\r\n\r\nimport { SubjectWitness } from \"../common/pubsub/subject/subject-types.mjs\";\r\nimport { SyncSagaContextIbGib_V1 } from \"./sync-saga-context/sync-saga-context-types.mjs\";\r\nimport { SYNC_ATOM, SYNC_MSG_REL8N_NAME, SyncConflictStrategy, } from \"./sync-constants.mjs\";\r\nimport { FlatIbGibGraph } from \"../common/other/graph-types.mjs\";\r\nimport { SyncSagaMessageIbGib_V1 } from \"./sync-saga-message/sync-saga-message-types.mjs\";\r\n\r\n\r\n// #region SyncMode\r\nexport const SYNC_MODE_PUSH = 'push';\r\nexport const SYNC_MODE_PULL = 'pull';\r\nexport const SYNC_MODE_SYNC = 'sync';\r\nexport type SyncMode =\r\n | typeof SYNC_MODE_PUSH\r\n | typeof SYNC_MODE_PULL\r\n | typeof SYNC_MODE_SYNC;\r\nexport const SyncMode = {\r\n push: SYNC_MODE_PUSH,\r\n pull: SYNC_MODE_PULL,\r\n sync: SYNC_MODE_SYNC,\r\n} satisfies { [key in SyncMode]: SyncMode };\r\nexport const SYNC_MODE_VALID_VALUES = Object.values(SyncMode);\r\nexport function isValidSyncMode(mode: string): mode is SyncMode {\r\n return SYNC_MODE_VALID_VALUES.includes(mode as SyncMode);\r\n}\r\n// #endregion SyncMode\r\n\r\n// #region SyncSagaFrameOrigin\r\nexport const SYNC_SAGA_FRAME_ORIGIN_SENDER = 'sender';\r\nexport const SYNC_SAGA_FRAME_ORIGIN_RECEIVER = 'receiver';\r\nexport type SyncSagaFrameOrigin =\r\n | typeof SYNC_SAGA_FRAME_ORIGIN_SENDER\r\n | typeof SYNC_SAGA_FRAME_ORIGIN_RECEIVER\r\n ;\r\n/**\r\n * if the frame was created by the original sender (the initiator of the sync\r\n * saga operation) or the other party, the \"receiver\" (the one responding).\r\n *\r\n * This is driven by looking at the latest value of `sagaFrame.data.n` value.\r\n */\r\nexport const SyncSagaFrameOrigin = {\r\n /**\r\n * The frame was created on the initial location that started the sync.\r\n */\r\n sender: SYNC_SAGA_FRAME_ORIGIN_SENDER,\r\n /**\r\n * The frame was created on the receiving end, which is either a physically\r\n * different location or is the logical \"receiver\" of an in-memory sync\r\n * execution.\r\n */\r\n receiver: SYNC_SAGA_FRAME_ORIGIN_RECEIVER,\r\n} satisfies { [key in SyncSagaFrameOrigin]: SyncSagaFrameOrigin };\r\nexport const SYNC_SAGA_FRAME_ORIGIN_VALID_VALUES = Object.values(SyncSagaFrameOrigin);\r\nexport function isValidSyncSagaFrameOrigin(sagaFrameOrigin: string): sagaFrameOrigin is SyncSagaFrameOrigin {\r\n return SYNC_SAGA_FRAME_ORIGIN_VALID_VALUES.includes(sagaFrameOrigin as SyncSagaFrameOrigin);\r\n}\r\n// #endregion SyncConflictStrategy\r\n\r\nexport interface NextSagaFrameInfo_Frame {\r\n frame: SyncIbGib_V1;\r\n payloadIbGibsDomain?: IbGib_V1[];\r\n sagaComplete?: undefined;\r\n}\r\nexport interface NextSagaFrameInfo_SagaComplete {\r\n frame?: never;\r\n payloadIbGibsDomain?: never;\r\n conflictInfos?: never;\r\n sagaComplete: true;\r\n}\r\n/**\r\n * Result of handling a saga frame.\r\n *\r\n * ## notes\r\n *\r\n * After commit, this may have been a null response, so `frame` will not be\r\n * defined, thus the discriminated union type.\r\n */\r\nexport type NextSagaFrameInfo =\r\n NextSagaFrameInfo_Frame | NextSagaFrameInfo_SagaComplete;\r\n\r\nexport interface HandleSagaResponseContextResult_Base {\r\n /**\r\n * if truthy, handling saga context failed, else it succeeded.\r\n */\r\n errorMsg?: string;\r\n /**\r\n * inner handling of the frame itself\r\n */\r\n nextFrameInfo?: NextSagaFrameInfo;\r\n}\r\nexport interface HandleSagaResponseContextResult_Frame extends HandleSagaResponseContextResult_Base {\r\n nextFrameInfo: NextSagaFrameInfo;\r\n}\r\nexport interface HandleSagaResponseContextResult_Error extends HandleSagaResponseContextResult_Base {\r\n errorMsg: string;\r\n}\r\nexport type HandleSagaResponseContextResult = HandleSagaResponseContextResult_Frame | HandleSagaResponseContextResult_Error;\r\n\r\nexport interface SyncSagaInfo {\r\n /**\r\n * The unique ID of the saga.\r\n */\r\n sagaId: string;\r\n\r\n /**\r\n * Observable stream of context updates happening during the saga.\r\n *\r\n * Subscribe to this to receive real-time progress throughout the sync\r\n * process, whenever the sync ibgib is evolved (including when receiving a\r\n * response from the peer).\r\n */\r\n updates$: SubjectWitness<SyncSagaContextIbGib_V1>;\r\n\r\n /**\r\n * Promise that resolves when the saga completes successfully.\r\n */\r\n done: Promise<void>;\r\n}\r\n\r\nexport interface SyncSagaFrameDependencyGraph {\r\n sagaIbGib: SyncIbGib_V1;\r\n msgStones: SyncSagaMessageIbGib_V1[];\r\n}\r\n\r\n/**\r\n * given some group of domain ibgibs, this is info extracted from them.\r\n */\r\nexport interface DomainIbGibAnalysisInfo {\r\n /**\r\n * flat array of stones (ibgibs without dna)\r\n */\r\n stones: IbGib_V1[];\r\n /**\r\n * map of tjp -> sorted timeline ibgib\r\n */\r\n timelinesMap: { [tjp: string]: IbGib_V1[] };\r\n /**\r\n * sorted by dependency/interdependency\r\n */\r\n topologicallySortedTjpAddrs: IbGibAddr[];\r\n /**\r\n * full dependency graph of domain ibgibs\r\n */\r\n fullGraph: FlatIbGibGraph;\r\n}\r\n\r\n// #region Sync Ib, Data, Rel8ns, IbGib\r\nexport interface SyncIb_V1 {\r\n atom: typeof SYNC_ATOM;\r\n uuid: string;\r\n}\r\n\r\nexport interface SyncData_V1 extends IbGibData_V1 {\r\n /**\r\n * Unique ID for this sync saga. This should correspond to sagaId.\r\n *\r\n * Corresponds to `uuid` in standard IbGibData.\r\n */\r\n uuid: string;\r\n\r\n /**\r\n * Optional verification metadata (e.g. success count).\r\n */\r\n successCount?: number;\r\n /**\r\n * If failed, the reasons why.\r\n */\r\n errors?: string[];\r\n\r\n /**\r\n * Strategy used for resolving conflicts in this saga.\r\n */\r\n conflictStrategy?: SyncConflictStrategy;\r\n\r\n /**\r\n * Optional absolute timestamp (Unix ms) after which this frame should be considered void.\r\n * Useful for:\r\n * 1. Auth Challenges (Login offers expiring).\r\n * 2. Rate limiting / Backpressure (Don't process this old request).\r\n */\r\n expirationTimestamp?: string;\r\n\r\n /**\r\n * If using session identity in the sync saga, this should be set and\r\n * carried over in each saga frame\r\n *\r\n * TODO: IMPLEMENT THIS IN CODE. I HAVE JUST STUBBED THIS PROPERTY BUT IT DOES NOT EXIST IN CODE.\r\n */\r\n sessionIdentityTjpAddr?: IbGibAddr;\r\n}\r\n\r\nexport interface SyncRel8ns_V1 extends IbGibRel8ns_V1 {\r\n /**\r\n * The message stone that contains the information about the particular\r\n * stage of the sync process we are in.\r\n */\r\n [SYNC_MSG_REL8N_NAME]: IbGibAddr[];\r\n}\r\n\r\nexport interface SyncIbGib_V1 extends IbGib_V1<SyncData_V1, SyncRel8ns_V1> { }\r\n\r\n// #endregion Sync Ib, Data, Rel8ns, IbGib\r\n\r\n/**\r\n * A session keystone should have this info in\r\n * `sessionIdentity.data.frameDetails`.\r\n */\r\nexport interface SessionGenesisFrameDetails {\r\n senderIdentityAddr: IbGibAddr;\r\n senderIdentityTjpAddr: IbGibAddr;\r\n targetAddrs?: IbGibAddr[];\r\n}\r\n\r\n/**\r\n * used in authentication/validation/authorization\r\n * basically, **when** are we calling this validation method?\r\n *\r\n * terrible name, probably a code smell, but i'm getting desperate here\r\n * to get this working.\r\n */\r\nexport type StageInProtocol = \"beforeSend\" | \"beforeReceive\";\r\n\r\nexport interface SyncSenderIdentityInfo {\r\n senderIdentity: KeystoneIbGib_V1;\r\n senderDomainAddr: string;\r\n}\r\n", "import { clone, extractErrorMsg } from \"@ibgib/helper-gib/dist/helpers/utils-helper.mjs\";\nimport { getIbGibAddr } from \"@ibgib/ts-gib/dist/helper.mjs\";\nimport {\n IbGibAddr, TransformOpts, TransformOpts_Mut8, TransformOpts_Rel8,\n TransformResult,\n} from \"@ibgib/ts-gib/dist/types.mjs\";\nimport { mut8 } from \"@ibgib/ts-gib/dist/V1/transforms/mut8.mjs\";\nimport { rel8 } from \"@ibgib/ts-gib/dist/V1/transforms/rel8.mjs\";\nimport { IbGib_V1 } from \"@ibgib/ts-gib/dist/V1/types.mjs\";\n\nimport { GLOBAL_LOG_A_LOT } from \"../../../core-constants.mjs\";\n\nconst logalot = GLOBAL_LOG_A_LOT;\n\n/**\n * Takes two dna strands and gets just the tip of the {@link extended} one that\n * is not already contained in the {@link base}.\n *\n */\nexport function getUniqueDnas({\n base,\n extended,\n throwIfExtendedDoesntContainBase,\n}: {\n /**\n * The dna addrs to mask out in the result. This is expected to be contained\n * in {@link extended}.\n *\n * This will be the past dna addrs of an ibgib.\n */\n base: IbGibAddr[],\n /**\n * The \"extended\" part should be the longer section that actually already\n * contains the {@link base} strand.\n *\n * This will be the present (or future relative to past) dna addrs of an ibgib.\n */\n extended: IbGibAddr[],\n /**\n * If true, will check to ensure that {@link extended} is actually a\n * superset of {@link base} and throw if it isn't.\n */\n throwIfExtendedDoesntContainBase: boolean,\n}): IbGibAddr[] {\n const lc = `[${getUniqueDnas.name}]`;\n try {\n if (logalot) { console.log(`${lc} starting... (I: 00d70d79a0249165c2a230389c962526)`); }\n\n let baseIsStartingSubsetOfExtended = true;\n // check to ensure the base is the start\n for (let i = 0; i < base.length; i++) {\n if (base[i] !== extended[i]) {\n baseIsStartingSubsetOfExtended = false;\n break;\n }\n }\n\n if (throwIfExtendedDoesntContainBase && !baseIsStartingSubsetOfExtended) {\n throw new Error(`base addrs do not correspond to extended addrs. We were expecting the base to be the exact start of the extended strand, e.g., base [a, b, c] with extended [a, b, c, d, e]. base: ${base}. extended: ${extended}. (E: fb80b40003289bbf1aaedd4829fa1826)`);\n }\n\n let resultUniqueDnas: IbGibAddr[];\n if (baseIsStartingSubsetOfExtended) {\n // simple\n resultUniqueDnas = extended.slice(base.length);\n } else {\n // caller must have expected this possibility since\n // throwIfExtendedDoesntContainBase was false\n resultUniqueDnas = [];\n for (const extendedAddr of extended) {\n if (!base.includes(extendedAddr)) {\n resultUniqueDnas.push(extendedAddr);\n }\n }\n }\n\n return resultUniqueDnas;\n } catch (error) {\n console.error(`${lc} ${extractErrorMsg(error)}`);\n throw error;\n } finally {\n if (logalot) { console.log(`${lc} complete.`); }\n }\n}\n\n/**\n * iteratively (recursively) apply transforms in\n * `dnaAddrsToApplyToStoreVersion` to the store's version of the ibgib,\n * keeping track of all dependencies used/created. ibgibs that we create\n * along the way that we'll set to createdIbGibs to include dna,\n * intermediate ibGibs, and newer versions of the source.\n *\n * populates the given `createdibGibs_Running` array, INCLUDING THE MOST\n * RECENT IBGIB THAT WILL BE RETURNED BY THE FUNCTION.\n *\n * @returns the final ibgib produced from the transform applications.\n */\nexport async function applyTransforms({\n src,\n createdIbGibs_Running,\n dnaAddrsToApplyToStoreVersion_MUTATES_IN_PLACE,\n allLocalIbGibs,\n}: {\n /**\n * Most recent src to which we will apply the given\n * `dnaAddrsToApplyToStoreVersion`.\n */\n src: IbGib_V1,\n /**\n * This will be populated through recursive iterations while applying\n * dnas. Everything, including new dnas, new intermediate ibgibs, and\n * new \"src\" ibgibs will be added to this before the final recursive\n * call returns the final produced (out) ibgib.\n */\n createdIbGibs_Running: IbGib_V1[],\n /**\n * WARNING!! THIS WILL BE REDUCED BY ONE PER EACH RECURSIVE CALL TO THIS\n * FUNCTION THAT IS MADE, SO YOU SHOULD PROBABLY CONCAT THE INCOMING ARRAY\n * IF YOU WANT TO KEEP IT FOR LATER USE IN YOUR CALLING FUNCTION.\n *\n * Transform addresses whose ibgib will be applied to the given `src`.\n */\n dnaAddrsToApplyToStoreVersion_MUTATES_IN_PLACE: IbGibAddr[],\n /**\n * Should contain the dna ibGibs that are given in\n * `dnaAddrsToApplyToStoreVersion`\n */\n allLocalIbGibs: IbGib_V1[],\n}): Promise<IbGib_V1> {\n const lc = `[${applyTransforms.name}]`;\n try {\n if (dnaAddrsToApplyToStoreVersion_MUTATES_IN_PLACE.length > 0) {\n const dnaAddrToApply = dnaAddrsToApplyToStoreVersion_MUTATES_IN_PLACE.splice(0, 1)[0];\n // we expect this dna ibgib to supplied to us, but need to check\n const dnaIbGib_IntermediateArray =\n allLocalIbGibs.filter(x => getIbGibAddr({ ibGib: x }) === dnaAddrToApply);\n let dnaIbGib: IbGib_V1;\n if (dnaIbGib_IntermediateArray.length > 0) {\n dnaIbGib = dnaIbGib_IntermediateArray[0];\n // NOTE: length > 1 is NOT an error condition because mut8/rel8\n // transforms do not have uuids or timestamps. So if the same\n // mut8/rel8 call occurs, e.g., changing the same field on the\n // same source, then we could have a duplicate dna transform.\n } else {\n throw new Error(`dna ibGib not found in supplied allLocalIbGibs. dnaAddr: ${dnaAddrToApply}. (E: 7f56826852cf48a79ab8af16bf27e284)`);\n }\n\n // we have our dna to apply, so do so against the incoming src\n // any transform options is actually the dna.data plus src info.\n let argTransform = clone(dnaIbGib.data) as TransformOpts<IbGib_V1>;\n argTransform.src = src;\n argTransform.srcAddr = getIbGibAddr({ ibGib: src });\n let resTransform: TransformResult<IbGib_V1>;\n switch (argTransform.type) {\n case 'mut8':\n resTransform = await mut8(argTransform as TransformOpts_Mut8<IbGib_V1, any>);\n break;\n case 'rel8':\n resTransform = await rel8(argTransform as TransformOpts_Rel8<IbGib_V1>);\n break;\n case 'fork':\n throw new Error(`fork transform not expected. atow only a single fork is expected at the beginning of the lifetime of a tjp ibgib. This fork defines the uniqueness of the tjp ibgib. When merging another tjp ibgib, we would only expect update transforms to be mut8 or rel8. (E: f8ad6996ac5545edad2d58a293d37d94)`);\n default:\n throw new Error(`unknown dna argTransform.type (${argTransform.type}) for dna address: ${dnaAddrToApply}. Expecting either mut8 or rel8. (fork transform is known but not expected either.) (E: 52a98db56e934e4cb42c64e2f45fa552)`);\n }\n\n // add intermediate ibgibs (including dna) to createdIbGibs_Running\n (resTransform.intermediateIbGibs ?? []).forEach(x => createdIbGibs_Running.push(x));\n (resTransform.dnas ?? []).forEach(x => createdIbGibs_Running.push(x));\n createdIbGibs_Running.push(resTransform.newIbGib);\n\n // not 100% but I believe the created dna should deep equal our\n // incoming dna that we applied. so we'll ~~warn~~ **throw** if it\n // doesn't. (ibgib addresses matching necessitates deep equal)\n if ((resTransform.dnas ?? []).length > 0) {\n if (!resTransform.dnas!.some(x => getIbGibAddr(x) === dnaAddrToApply)) {\n // console.warn(`${lc}(UNEXPECTED) Expected to generate exact dna that we applied in transform. dnaAddr: ${dnaAddrToApply} (W: 4a364c0b5d8d46c8af6bd540915fd973)`);\n throw new Error(`${lc}(UNEXPECTED) Expected to generate exact dna that we applied in transform. dnaAddr: ${dnaAddrToApply} (E: 4a364c0b5d8d46c8af6bd540915fd973)`);\n }\n } else {\n console.warn(`${lc}(UNEXPECTED) expected resTransform to include generated dna. dnaAddr: ${dnaAddrToApply}(W: 9648e2d5c40d42b7b9fb7efb09c5b13a)`)\n }\n\n\n // call recursively\n return await applyTransforms({\n src: resTransform.newIbGib,\n createdIbGibs_Running,\n dnaAddrsToApplyToStoreVersion_MUTATES_IN_PLACE: dnaAddrsToApplyToStoreVersion_MUTATES_IN_PLACE,\n allLocalIbGibs,\n });\n } else {\n // no more dna to apply.\n // createdIbGibs_Running should be populated\n if (createdIbGibs_Running.length === 0) {\n console.warn(`${lc} no dna transforms to apply but createdIbGibs_Running is empty. Dna is expected to start with at least one transform, otherwise don't call this function. (W: 52c7f2f6bd7e4bd0b31f53611b90268b)(UNEXPECTED)`)\n }\n return src;\n }\n } catch (error) {\n console.error(`${lc} ${extractErrorMsg(error)}`);\n throw error;\n }\n}\n", "import type { GraftInfoRel8ns_V1 } from './graft-info-types.mjs';\r\n\r\nexport const GRAFT_INFO_ATOM = 'graftinfo';\r\nexport const GRAFT_INFO_REL8N_NAME = GRAFT_INFO_ATOM;\r\n\r\n/** @see {@link GraftInfoRel8ns_V1} */\r\nexport const GRAFT_LCA_REL8N_NAME = 'latestcommonaddr';\r\n/** @see {@link GraftInfoRel8ns_V1} */\r\nexport const GRAFT_BASE_REL8N_NAME = 'base';\r\n/** @see {@link GraftInfoRel8ns_V1} */\r\nexport const GRAFT_ORPHAN_REL8N_NAME = 'orphan';\r\n/** @see {@link GraftInfoRel8ns_V1} */\r\nexport const GRAFT_DNAAPPLIED_REL8N_NAME = 'dnaapplied';\r\n\r\n\r\n// #region MergeTextStrategy\r\nexport const MERGE_TEXT_STRATEGY_LCS = 'longest-common-subsequence';\r\nexport type MergeTextStrategy =\r\n | typeof MERGE_TEXT_STRATEGY_LCS\r\n ;\r\nexport const MergeTextStrategy = {\r\n /**\r\n * Longest common subsequence algorithm.\r\n */\r\n lcs: MERGE_TEXT_STRATEGY_LCS,\r\n} satisfies { [key: string]: MergeTextStrategy };\r\nexport const MERGE_TEXT_STRATEGY_VALID_VALUES = Object.values(MergeTextStrategy);\r\nexport function isValidMergeTextStrategy(strategy: string): strategy is MergeTextStrategy {\r\n return MERGE_TEXT_STRATEGY_VALID_VALUES.includes(strategy as MergeTextStrategy);\r\n}\r\n// #endregion MergeTextStrategy", "import { Factory_V1 } from \"@ibgib/ts-gib/dist/V1/factory.mjs\";\r\nimport { IbGib_V1 } from \"@ibgib/ts-gib/dist/V1/types.mjs\";\r\nimport { getIbGibAddr } from \"@ibgib/ts-gib/dist/helper.mjs\";\r\nimport { extractErrorMsg, pretty } from \"@ibgib/helper-gib/dist/helpers/utils-helper.mjs\";\r\nimport { rel8 } from \"@ibgib/ts-gib/dist/V1/transforms/rel8.mjs\";\r\nimport { IbGibAddr, TransformResult } from \"@ibgib/ts-gib/dist/types.mjs\";\r\n\r\nimport { GLOBAL_LOG_A_LOT } from \"../../core-constants.mjs\";\r\nimport { IbGibSpaceAny } from \"../../witness/space/space-base-v1.mjs\";\r\nimport { getFromSpace, persistTransformResult, putInSpace, registerNewIbGib } from \"../../witness/space/space-helper.mjs\";\r\nimport { applyTransforms, getUniqueDnas } from \"../../witness/space/reconciliation-space/reconciliation-space-helper.mjs\";\r\nimport {\r\n GRAFT_INFO_ATOM, GRAFT_BASE_REL8N_NAME, GRAFT_ORPHAN_REL8N_NAME,\r\n GRAFT_INFO_REL8N_NAME, GRAFT_LCA_REL8N_NAME, GRAFT_DNAAPPLIED_REL8N_NAME,\r\n MergeTextStrategy\r\n} from \"./graft-info-constants.mjs\";\r\nimport { AddlGraftDetails, BasicMergeTextAddlGraftDetails, GraftInfoData_V1, GraftInfoIbGib_V1, GraftInfoIb_V1, GraftInfoRel8ns_V1, GraftTimelinesResult } from \"./graft-info-types.mjs\";\r\nimport { getIbGibsFromCache_fallbackToSpaces, getTimelinesGroupedByTjp, getTimestampInfo, splitPerTjpAndOrDna } from \"../../common/other/ibgib-helper.mjs\";\r\nimport { FlatIbGibGraph } from \"../../common/other/graph-types.mjs\";\r\nimport {\r\n isValidSyncConflictStrategy, SYNC_CONFLICT_STRATEGY_VALID_VALUES,\r\n SyncConflictStrategy,\r\n} from \"../sync-constants.mjs\";\r\nimport { mut8 } from \"@ibgib/ts-gib/dist/V1/transforms/mut8.mjs\";\r\nimport { CommentData_V1 } from \"../../common/comment/comment-types.mjs\";\r\n\r\nconst logalot = GLOBAL_LOG_A_LOT || true;\r\nconst lc = `[graft-info-helpers]`;\r\n\r\n/**\r\n * Validates and constructs the `ib` object for a Graft Info ibGib.\r\n */\r\nexport async function getGraftInfoIb({\r\n data\r\n}: {\r\n data: GraftInfoData_V1\r\n}): Promise<string> {\r\n if (!data.conflictStrategy) { throw new Error(`(UNEXPECTED) data.conflictStrategy required for GraftInfoIb (E: 2c0968a0dac8d0ab3d67da9756d6df26)`); }\r\n if (!isValidSyncConflictStrategy(data.conflictStrategy)) { throw new Error(`invalid data.conflictStrategy (${data.conflictStrategy}). valid conflict strategies: ${SYNC_CONFLICT_STRATEGY_VALID_VALUES} (E: 41e2680089786d4d28046b4c0884bd26)`); }\r\n\r\n return [\r\n GRAFT_INFO_ATOM,\r\n data.conflictStrategy\r\n ].join(' ');\r\n}\r\n\r\n/**\r\n * Parses a standard Graft Info 'ib' string.\r\n */\r\nexport async function parseGraftInfoIb({\r\n ib\r\n}: {\r\n ib: string\r\n}): Promise<GraftInfoIb_V1> {\r\n try {\r\n const parts = ib.split(' ');\r\n if (parts[0] !== GRAFT_INFO_ATOM) { throw new Error(`Atom mismatch. Expected ${GRAFT_INFO_ATOM} (E: 8f03c92a95144b618821915632599266)`); }\r\n if (parts.length < 2) { throw new Error(`Invalid graft info ib. Expected at least 2 parts. (E: 9c2b4c8a6d34469f8263544710183355)`); }\r\n\r\n const [\r\n atom,\r\n conflictStrategy\r\n ] = parts;\r\n\r\n if (!isValidSyncConflictStrategy(conflictStrategy)) { throw new Error(`invalid conflictStrategy (${conflictStrategy}). valid conflict strategies: ${SYNC_CONFLICT_STRATEGY_VALID_VALUES} (E: 353da80a0f1843c0bbd9d5a1730a7826)`); }\r\n\r\n return {\r\n atom,\r\n conflictStrategy,\r\n };\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Creates a new GraftInfo ibGib.\r\n */\r\nexport async function createGraftInfo({\r\n conflictStrategy,\r\n details,\r\n addlGraftDetails,\r\n latestCommonFrameAddr,\r\n baseAddrsSinceLCA,\r\n orphanAddrsSinceLCA,\r\n dnaAddrsApplied,\r\n}: {\r\n conflictStrategy: SyncConflictStrategy,\r\n details: string,\r\n addlGraftDetails: AddlGraftDetails[] | undefined,\r\n latestCommonFrameAddr: IbGibAddr,\r\n baseAddrsSinceLCA: IbGibAddr[],\r\n orphanAddrsSinceLCA: IbGibAddr[],\r\n dnaAddrsApplied: IbGibAddr[],\r\n}): Promise<GraftInfoIbGib_V1> {\r\n const lc = `[${createGraftInfo.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: 0030f62cbae28cf5882f87981edc3826)`); }\r\n\r\n if (baseAddrsSinceLCA.length === 0) { throw new Error(`(UNEXPECTED) baseAddrsSinceLCA empty? (E: 005f8449a9236d445902a148f59fc826)`); }\r\n if (orphanAddrsSinceLCA.length === 0) { throw new Error(`(UNEXPECTED) orphanAddrsSinceLCA empty? (E: 19e4082e82c67759c880392aca186826)`); }\r\n\r\n const data: GraftInfoData_V1 = {\r\n conflictStrategy,\r\n description: details,\r\n };\r\n if (addlGraftDetails) { data.addlGraftDetails = addlGraftDetails; }\r\n\r\n const rel8ns: GraftInfoRel8ns_V1 = {\r\n [GRAFT_LCA_REL8N_NAME]: [latestCommonFrameAddr],\r\n [GRAFT_BASE_REL8N_NAME]: baseAddrsSinceLCA.concat(),\r\n [GRAFT_ORPHAN_REL8N_NAME]: orphanAddrsSinceLCA.concat(),\r\n [GRAFT_DNAAPPLIED_REL8N_NAME]: dnaAddrsApplied.concat(),\r\n };\r\n\r\n const ib = await getGraftInfoIb({ data });\r\n\r\n const res = await Factory_V1.stone({\r\n parentPrimitiveIb: GRAFT_INFO_ATOM,\r\n ib, data, rel8ns,\r\n uuid: true,\r\n });\r\n\r\n return res as GraftInfoIbGib_V1;\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n}\r\n\r\n/**\r\n * Naive line-by-line text merge using LCS.\r\n *\r\n * ## notes\r\n *\r\n * A lot of magic short vars/constants/algo here. testing works AFAICT though.\r\n */\r\nexport async function mergeTextByLongestCommonSubsequence({\r\n textA,\r\n textB,\r\n}: {\r\n textA: string,\r\n textB: string,\r\n}): Promise<string> {\r\n\r\n if (textA === textB) { return textA; }\r\n if (textA === '') { return textB; }\r\n if (textB === '') { return textA; }\r\n\r\n interface LongestCommonSubsequenceMatch {\r\n line: string;\r\n indexA: number;\r\n indexB: number;\r\n }\r\n function longestCommonSubsequence(a: string[], b: string[]): LongestCommonSubsequenceMatch[] {\r\n const m = a.length;\r\n const n = b.length;\r\n const dp: number[][] = Array(m + 1).fill(0).map(() => Array(n + 1).fill(0));\r\n\r\n // Fill DP table\r\n for (let i = 1; i <= m; i++) {\r\n for (let j = 1; j <= n; j++) {\r\n if (a[i - 1] === b[j - 1]) {\r\n dp[i][j] = dp[i - 1][j - 1] + 1;\r\n } else {\r\n dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);\r\n }\r\n }\r\n }\r\n\r\n // Backtrack to find LCS\r\n let i = m, j = n;\r\n const lcs: LongestCommonSubsequenceMatch[] = [];\r\n while (i > 0 && j > 0) {\r\n if (a[i - 1] === b[j - 1]) {\r\n lcs.unshift({ line: a[i - 1], indexA: i - 1, indexB: j - 1 });\r\n i--;\r\n j--;\r\n } else if (dp[i - 1][j] > dp[i][j - 1]) {\r\n i--;\r\n } else {\r\n j--;\r\n }\r\n }\r\n return lcs;\r\n }\r\n\r\n const linesA = textA.split('\\n');\r\n const linesB = textB.split('\\n');\r\n\r\n const common = longestCommonSubsequence(linesA, linesB); // Array of { line, indexA, indexB }\r\n\r\n let resultLines: string[] = [];\r\n let currentA = 0;\r\n let currentB = 0;\r\n\r\n for (const match of common) {\r\n // Add unique lines from A (before this match)\r\n while (currentA < match.indexA) {\r\n resultLines.push(linesA[currentA]);\r\n currentA++;\r\n }\r\n // Add unique lines from B (before this match)\r\n while (currentB < match.indexB) {\r\n resultLines.push(linesB[currentB]);\r\n currentB++;\r\n }\r\n // Add the common line\r\n resultLines.push(match.line);\r\n currentA++;\r\n currentB++;\r\n }\r\n\r\n // Add remaining unique lines from A\r\n while (currentA < linesA.length) {\r\n resultLines.push(linesA[currentA]);\r\n currentA++;\r\n }\r\n // Add remaining unique lines from B\r\n while (currentB < linesB.length) {\r\n resultLines.push(linesB[currentB]);\r\n currentB++;\r\n }\r\n\r\n return resultLines.join('\\n');\r\n}\r\n\r\n\r\n/**\r\n * Grafts two divergent timelines by splicing missing DNA from one branch\r\n * (Orphan) onto another (Base).\r\n *\r\n * Logic:\r\n * 1. Determine latestCommonFrameAddr if not provided (validates if it is\r\n * provided), and organizes branchA and branchB (since LCA, i.e., excludes\r\n * LCA itself and all other previous past).\r\n * 2. Determine which to use as base/orphan by timestamp info: Earlier = Base,\r\n * Later = Orphan.\r\n * 3. Replay DNA from Orphan's branch (since LCA) onto Base, starting with base\r\n * tip.\r\n * 4. Merge Base tip and Orphan tip `data.text` fields (if applicable).\r\n * 5. Create/append GraftInfo describing this entire graft process (to\r\n * completely preserve original context of each branch).\r\n *\r\n * @returns the newly created ibgibs that were created in the graft. The last in\r\n * this array will be the new tip\r\n */\r\nexport async function graftTimelines({\r\n timelineAddrsA,\r\n timelineAddrsB,\r\n latestCommonFrameAddr,\r\n conflictStrategy,\r\n ibGibReadCache,\r\n space,\r\n}: {\r\n /**\r\n * stored in graft info.\r\n */\r\n conflictStrategy: SyncConflictStrategy,\r\n /**\r\n * One of the divergent timeline branches.\r\n */\r\n timelineAddrsA: IbGibAddr[],\r\n /**\r\n * the other divergent timeline.\r\n */\r\n timelineAddrsB: IbGibAddr[],\r\n /**\r\n * not strictly necessary I don't think, as we can re-calculate it, but we\r\n * already have this\r\n */\r\n latestCommonFrameAddr?: IbGibAddr,\r\n /**\r\n * simple bucket to look in before looking in {@link space}\r\n *\r\n * ## intent\r\n *\r\n * when calling this function, I already have payload ibgibs available. I\r\n * _think_ that all the relevant ibgibs will be in this, but if not, we can\r\n * look in {@link space}\r\n */\r\n ibGibReadCache: FlatIbGibGraph,\r\n /**\r\n * @see {@link ibGibReadCache}\r\n */\r\n space: IbGibSpaceAny,\r\n}): Promise<GraftTimelinesResult> {\r\n const lc = `[${graftTimelines.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: 3b4c3e8e59c883d9d3c352efd6380826)`); }\r\n\r\n /**\r\n * This will be our running list that contains ALL ibgibs in the\r\n * grafted timeline itself (i.e. does NOT contain any dna). We will use\r\n * this to compose the `result.intermediateIbGibs`.\r\n *\r\n * ## notes\r\n *\r\n * I'm doing this because I don't want to continually shift the newIbGib\r\n * out of the running list of ibgibs (result.intermediateIbGibs must NOT\r\n * contain newIbGib/tip), and I already have this implemented.\r\n *\r\n * any NEW dna created in this graft will be added directly to the result.dnas\r\n */\r\n const newGraftedIntermediateIbGibs_ordered: IbGib_V1[] = [];\r\n /**\r\n * does NOT contain **replayed** dna from the orphan branch. Those\r\n * should already be stored in the tempSpace.\r\n */\r\n const newGraftDnaIbGibs: IbGib_V1[] = [];\r\n\r\n // #region validation/sanity & init\r\n if (timelineAddrsA.length === 0) { throw new Error(`timelineAddrsA empty (E: 93a78cd1cd2a4a16ba99bd4820468f26)`); }\r\n if (timelineAddrsB.length === 0) { throw new Error(`timelineAddrsB empty (E: 76d53848152a66971b734068c3316826)`); }\r\n if (latestCommonFrameAddr) {\r\n // ensure both contain this\r\n if (!timelineAddrsA.includes(latestCommonFrameAddr)) { throw new Error(`timelineAddrsA does not include latestCommonFrameAddr (${latestCommonFrameAddr}). timelineAddrsA: ${timelineAddrsA} (E: c5a9afe371888da2a79963983426e826)`); }\r\n if (!timelineAddrsB.includes(latestCommonFrameAddr)) { throw new Error(`timelineAddrsB does not include latestCommonFrameAddr (${latestCommonFrameAddr}). timelineAddrsB: ${timelineAddrsB} (E: 7e641f67c452b67d582d78484a88c826)`); }\r\n } else {\r\n latestCommonFrameAddr = timelineAddrsA.findLast(addrA => timelineAddrsB.includes(addrA));\r\n if (!latestCommonFrameAddr) { throw new Error(`timelines do not share a common frame. A: ${timelineAddrsA}. B: ${timelineAddrsB} (E: 4c0e78a88a375d8588736668573f1e26)`); }\r\n }\r\n if (timelineAddrsA.at(-1) === latestCommonFrameAddr) {\r\n debugger;\r\n throw new Error(`timelineAddrsA.at(-1) === latestCommonFrameAddr. Graft requires a branch BEYOND the LCA (E: 3796fc4074a8c5899d549bb8c2e68826)`);\r\n }\r\n if (timelineAddrsB.at(-1) === latestCommonFrameAddr) { throw new Error(`timelineAddrsB.at(-1) === latestCommonFrameAddr. Graft requires a branch BEYOND the LCA (E: 66fbb86e9e98531549888bf10a344f26)`); }\r\n // #endregion validation/sanity & init\r\n\r\n // #region compose unique branches since LCA\r\n\r\n /** guaranteed above to be existing AND not the last element. */\r\n const indexLCA_A = timelineAddrsA.lastIndexOf(latestCommonFrameAddr);\r\n /** does NOT include LCA */\r\n const addrsA_sinceLCA = timelineAddrsA.slice(indexLCA_A + 1);\r\n const branchA_sinceLCA = await getIbGibsFromCache_fallbackToSpaces({\r\n readCache_graph: ibGibReadCache,\r\n addrs: addrsA_sinceLCA,\r\n space,\r\n });\r\n const tipA = branchA_sinceLCA.at(-1)!;\r\n\r\n /** guaranteed above to be existing AND not the last element. */\r\n const indexLCA_B = timelineAddrsB.lastIndexOf(latestCommonFrameAddr);\r\n /** does NOT include LCA */\r\n const addrsB_sinceLCA = timelineAddrsB.slice(indexLCA_B + 1);\r\n const branchB_sinceLCA = await getIbGibsFromCache_fallbackToSpaces({\r\n readCache_graph: ibGibReadCache,\r\n addrs: addrsB_sinceLCA,\r\n space,\r\n });\r\n const tipB = branchB_sinceLCA.at(-1)!;\r\n\r\n // at this point, we have gathered unique branch slices. however, it's\r\n // possible that we are trying to merge two branches that don't have\r\n // DNA. For now, let's just throw if this is the case.\r\n function throwIfUnexpected(someIbGibs: IbGib_V1[]): void {\r\n const lcThrow = `${lc}[${throwIfUnexpected.name}]`;\r\n for (const someIbGib of someIbGibs) {\r\n if (!someIbGib.rel8ns) { throw new Error(`(UNEXPECTED) ${lcThrow} someIbGib.rel8ns falsy? All ibgibs with mergeable timelines are expected to have rel8ns. addr: ${getIbGibAddr({ ibGib: someIbGib })} (E: 5534a478cd183a5ee27b28487448b226)`); }\r\n if (!someIbGib.rel8ns.dna) { throw new Error(`(UNEXPECTED) someIbGib.rel8ns.dna falsy? We only have implemented grafting for dna. addr: ${getIbGibAddr({ ibGib: someIbGib })} (there should be another route for merging for non-dna timelines) (E: d86b388c627afd613f897e3819d8ab26)`); }\r\n if (someIbGib.rel8ns.dna.length === 0) { throw new Error(`(UNEXPECTED) someIbGib.rel8ns.dna.length === 0? We only have implemented grafting for dna. addr: ${getIbGibAddr({ ibGib: someIbGib })} (there should be another route for merging for non-dna timelines) (E: bf973662a0689dd9089912b861af2826)`); }\r\n }\r\n }\r\n throwIfUnexpected(branchA_sinceLCA);\r\n throwIfUnexpected(branchB_sinceLCA);\r\n\r\n // #endregion compose unique branches since LCA\r\n\r\n // So we now have two timeline slices. We need to decide which one we\r\n // will graft onto the other, i.e., which one is the base and continued,\r\n // and which one will ultimately be orphaned.\r\n\r\n // #region Determine Base and Orphan based on timestamp\r\n\r\n /**\r\n * tip of the branch which we will graft onto\r\n */\r\n let baseTip: IbGib_V1;\r\n let baseBranch: IbGib_V1[];\r\n /**\r\n * tip of the branch that gets orphaned.\r\n */\r\n let orphanTip: IbGib_V1;\r\n /**\r\n * we will use these ibgib's dna to graft onto {@link baseTip}\r\n */\r\n let orphanBranch: IbGib_V1[];\r\n\r\n const timestampInfoA = getTimestampInfo({ ibGib: tipA, });\r\n const ticksA = timestampInfoA.valid ?\r\n Number.parseInt(timestampInfoA.ticks) :\r\n Number.MAX_SAFE_INTEGER;\r\n const msA = timestampInfoA.valid ? (timestampInfoA.ms ?? 0) : 0;\r\n const timestampInfoB = getTimestampInfo({ ibGib: tipB, });\r\n const ticksB = timestampInfoB.valid ?\r\n Number.parseInt(timestampInfoB.ticks) :\r\n Number.MAX_SAFE_INTEGER;\r\n const msB = timestampInfoB.valid ? (timestampInfoB.ms ?? 0) : 0;\r\n if (ticksA < ticksB) {\r\n // A is earlier, use A as base\r\n baseTip = tipA;\r\n baseBranch = branchA_sinceLCA;\r\n orphanTip = tipB;\r\n orphanBranch = branchB_sinceLCA;\r\n } else if (ticksA > ticksB) {\r\n // B is earlier, use B as base\r\n baseTip = tipB;\r\n baseBranch = branchB_sinceLCA;\r\n orphanTip = tipA;\r\n orphanBranch = branchA_sinceLCA;\r\n } else {\r\n // equal ticks, use ms as tiebreak\r\n if (msA <= msB) {\r\n // A is earlier (or equal), use A as base\r\n baseTip = tipA;\r\n baseBranch = branchA_sinceLCA;\r\n orphanTip = tipB;\r\n orphanBranch = branchB_sinceLCA;\r\n } else {\r\n // B is earlier, use B as base\r\n baseTip = tipB;\r\n baseBranch = branchB_sinceLCA;\r\n orphanTip = tipA;\r\n orphanBranch = branchA_sinceLCA;\r\n }\r\n }\r\n\r\n const baseTipAddr = getIbGibAddr({ ibGib: baseTip });\r\n const baseBranchAddrs = baseBranch.map(x => getIbGibAddr({ ibGib: x }));\r\n const orphanTipAddr = getIbGibAddr({ ibGib: orphanTip })\r\n const orphanBranchAddrs = orphanBranch.map(x => getIbGibAddr({ ibGib: x }));\r\n\r\n if (logalot) { console.log(`${lc} baseTipAddr: ${baseTipAddr} (I: 93353d9b9b68b17088f57958df85e826)`); }\r\n if (logalot) { console.log(`${lc} orphanTipAddr: ${orphanTipAddr} (I: 14df8867adc5dab97ff3c1e989b40e26)`); }\r\n\r\n // #endregion Determine Base and Orphan based on timestamp\r\n\r\n // #region Replay DNA from Orphan onto Base\r\n\r\n // Gather DNA addresses from the Orphan branch that have not yet been\r\n // applied.\r\n\r\n // NOTE: in my prototype, I believe this is where we would decide to\r\n // merge via state or dna, but right now we're just going to throw if it\r\n // doesn't have dna.\r\n\r\n const [latestCommonFrameIbGib] = await getIbGibsFromCache_fallbackToSpaces({\r\n addrs: [latestCommonFrameAddr],\r\n space,\r\n });\r\n // #region sanity/validation\r\n if (!latestCommonFrameIbGib) { throw new Error(`(UNEXPECTED) latestCommonFrameIbGib falsy? (E: ead2020b7ab8e4c4f824573133e33826)`); }\r\n if (!latestCommonFrameIbGib.rel8ns) { throw new Error(`(UNEXPECTED) latestCommonFrameIbGib.rel8ns falsy? (E: b3f338032d19816fc87d3c78af255726)`); }\r\n if (!latestCommonFrameIbGib.rel8ns.dna || latestCommonFrameIbGib.rel8ns.dna.length === 0) { throw new Error(`(UNEXPECTED) latestCommonFrameIbGib.rel8ns.dna falsy/empty? It should at least have the first fork transform. (E: 98fd8c725f484d85c8d23ceb181ce826)`); }\r\n // #endregion sanity/validation\r\n /**\r\n * we want to apply each unique dna per orphan frame. so we start with the LCF dna and iterate through each orphan frame, tacking on that frame's unique dna.\r\n */\r\n const dnaAddrsAlreadyAccountedFor: IbGibAddr[] = latestCommonFrameIbGib.rel8ns.dna.concat();\r\n const dnaAddrsToApply: IbGibAddr[] = [];\r\n for (const orphanFrame of orphanBranch) {\r\n if (!orphanFrame.rel8ns) { throw new Error(`(UNEXPECTED) orphanFrame.rel8ns falsy? (E: ed910e3b930b1b5388d87c6f736a4826)`); }\r\n const orphanDnaAddrsToApply = getUniqueDnas({\r\n base: dnaAddrsAlreadyAccountedFor,\r\n extended: orphanFrame.rel8ns.dna ?? [],\r\n throwIfExtendedDoesntContainBase: true,\r\n });\r\n orphanDnaAddrsToApply.forEach(x => dnaAddrsAlreadyAccountedFor.push(x));\r\n if (orphanDnaAddrsToApply.length === 0) { throw new Error(`(UNEXPECTED) orphanDnaAddrsToApply empty? (E: d44ed439e538e5b538d12d71063f0826)`); }\r\n orphanDnaAddrsToApply.forEach(x => dnaAddrsToApply.push(x));\r\n }\r\n\r\n // 3. Fetch the DNA stones\r\n /**\r\n * NOTE: These are in the same exact order as the addrs\r\n */\r\n const dnaIbGibsToApply = await getIbGibsFromCache_fallbackToSpaces({\r\n addrs: dnaAddrsToApply,\r\n readCache_graph: ibGibReadCache,\r\n space,\r\n });\r\n\r\n // 4. Replay Transforms onto Base\r\n /**\r\n * This will contain ALL ibgibs created, including the return new tip\r\n * and all DNA.\r\n */\r\n const createdIbGibs_Running: IbGib_V1[] = [];\r\n /**\r\n * This is the new tip of the graft, but before we have added the graft info metadata.\r\n *\r\n * NOTE: this is not a constant because we may reassign this if we do\r\n * any additional processing before doing that final graft info (which\r\n * will always be the very last part of this graft).\r\n */\r\n let graftTip_sansGraftInfo = await applyTransforms({\r\n src: baseTip,\r\n dnaAddrsToApplyToStoreVersion_MUTATES_IN_PLACE: dnaAddrsToApply.concat(),\r\n allLocalIbGibs: dnaIbGibsToApply,\r\n createdIbGibs_Running,\r\n });\r\n // #region validation/sanity\r\n if (!graftTip_sansGraftInfo.data) { throw new Error(`(UNEXPECTED) graftTip_sansGraftInfo.data falsy? (E: 4792f8e84fc84966e89220fae0657826)`); }\r\n if (!graftTip_sansGraftInfo.data.n) { throw new Error(`(UNEXPECTED) graftTip_sansGraftInfo.data.n falsy? (E: a2b3ca4cdec8d01f282dd3e4ff9eab26)`); }\r\n if (createdIbGibs_Running.length === 0) { throw new Error(`(UNEXPECTED) applyTransforms called but createdIbGibs_Running is empty? This should contain all of the (E: 5b6c788488f5095b08eb8e31d55b1726)`); }\r\n // #endregion validation/sanity\r\n\r\n console.warn(`${lc} START...................... Do we get a bunch of \"already had addr(s)\" messages for dna ibgibs? I'm thinking we will already have the dna ibgibs stored in the space (temp space?) before we do this graft. Maybe it creates new dna, I don't know. remove this later when we decide something to do about it. space.ib: ${space.ib} (W: bb60481ecabaa6f49e14203891824a26)`);\r\n await putInSpace({ space, ibGibs: createdIbGibs_Running }); // probably will already have the dnas?\r\n console.warn(`${lc} END........................ Do we get a bunch of \"already had addr(s)\" messages for dna ibgibs? I'm thinking we will already have the dna ibgibs stored in the space (temp space?) before we do this graft. Maybe it creates new dna, I don't know. remove this later when we decide something to do about it. space.ib: ${space.ib} (W: bb60481ecabaa6f49e14203891824a26)`);\r\n const {\r\n mapWithTjp_NoDna,\r\n mapWithTjp_YesDna: newGraftedIbGibsMap,\r\n mapWithoutTjps: _unusedBcDnaIsAlreadyStoredDontRegister\r\n } = splitPerTjpAndOrDna({ ibGibs: createdIbGibs_Running });\r\n if (Object.keys(mapWithTjp_NoDna).length > 0) { throw new Error(`(UNEXPECTED) mapWithTjp_NoDna is populated? We've just applied the dna from the orphan branch which created ibgibs (and dnas). But we are expected to be executing on an ibgib timeline that has dna. The applyTransforms was not expected to create any other ibgibs than the one in our timeline (with dna) and any corresponding dnas. (E: 236e989fb5e8a4a498a21b98f718c826)`); }\r\n const newGraftedIbGibs_orderNotGuaranteed = Object.values(newGraftedIbGibsMap);\r\n /** guarantees the order of the timeline */\r\n const newGraftedIbGibsByTjp = getTimelinesGroupedByTjp({ ibGibs: newGraftedIbGibs_orderNotGuaranteed });\r\n // #region sanity/validation\r\n if (Object.keys(newGraftedIbGibsByTjp).length === 0) { throw new Error(`(UNEXPECTED) newGraftedIbGibsByTjp has 0 timelines? we expect this to have a single timeline: the one we're grafting. (E: 2b7127bd0c6bfeaec8d66038ba208226)`); }\r\n if (Object.keys(newGraftedIbGibsByTjp).length > 1) { throw new Error(`(UNEXPECTED) newGraftedIbGibsByTjp has more than one timeline? we expect this to have a single timeline: the one we're grafting. (E: 076758885b8ea7c89849a76334222326)`); }\r\n // #endregion sanity/validation\r\n /**\r\n * Running list of ALL ibgibs CREATED ANEW for this graft INCLUDING\r\n * graftTip_sansGraftInfo (the last in the array).\r\n */\r\n Object.values(newGraftedIbGibsByTjp)[0].forEach(x => newGraftedIntermediateIbGibs_ordered.push(x));\r\n for (const newGraftedIbGib of newGraftedIntermediateIbGibs_ordered) {\r\n await registerNewIbGib({ ibGib: newGraftedIbGib, space });\r\n }\r\n\r\n // #endregion Replay DNA from Orphan onto Base\r\n\r\n // we applied the transforms, but what if the two branch tips had\r\n // different data.text values? this means that we're talking about a\r\n // text document/thing where we want to merge the text if possible and\r\n // if it's part of the conflict strategy.\r\n\r\n // I've though about more advanced architecture for this for future\r\n // strategies and yada yada, but I'm just doing a simple check here for\r\n // now.\r\n\r\n // #region merge data.text if applicable\r\n\r\n /**\r\n * if truthy, then we did a post hoc merge of the two branches'\r\n * data.text value. We will need to note this in the graft info.\r\n */\r\n let mergeTextDetails: BasicMergeTextAddlGraftDetails | undefined;\r\n if (conflictStrategy === SyncConflictStrategy.optimisticWithLCS) {\r\n // #region sanity/validation\r\n if (!baseTip.data) { throw new Error(`(UNEXPECTED) baseTip.data falsy? (E: 92623857e19b9b4e081e8c8d9eb45526)`); }\r\n if (!orphanTip.data) { throw new Error(`(UNEXPECTED) orphanTip.data falsy? (E: 2e6828a4c9226ac917ab6fe833672826)`); }\r\n // #endregion sanity/validation\r\n // perform the check/merge\r\n if (\r\n // either has text...\r\n (orphanTip.data.text || baseTip.data.text) &&\r\n // ...but text is not equal\r\n orphanTip.data.text !== baseTip.data.text\r\n ) {\r\n if (logalot) { console.log(`${lc} different data.text found. executing text merge for conflictStrategy ${conflictStrategy} (I: cfb5f9580832040388fc576eb71ac526)`); }\r\n // execute merge on the text itself, best effort\r\n const textA = orphanTip.data.text ?? '';\r\n const textAAddr = orphanTipAddr;\r\n const textB = baseTip.data.text ?? '';\r\n const textBAddr = baseTipAddr;\r\n const newText = await mergeTextByLongestCommonSubsequence({\r\n textA,\r\n textB,\r\n });\r\n const resMut8Text = await mut8({\r\n src: graftTip_sansGraftInfo,\r\n dataToAddOrPatch: { text: newText, } satisfies CommentData_V1,\r\n dna: true,\r\n nCounter: !!graftTip_sansGraftInfo.data.n,\r\n });\r\n // #region sanity/validation\r\n if (resMut8Text.intermediateIbGibs && resMut8Text.intermediateIbGibs.length > 0) { throw new Error(`(UNEXPECTED) resMut8Text.intermediateIbGibs truthy/non-empty? This is expected to only create the newIbGib with no intermediates. (E: 7932a8964a3869accadc9b0d93d23826)`); }\r\n if (!resMut8Text.dnas || resMut8Text.dnas.length === 0) { throw new Error(`(UNEXPECTED) resMut8Text.dnas falsy/empty? We're expected to generate dna from this merge text mut8. (E: fdf03754bf0f8661f80f59ea0701dd26)`); }\r\n if (resMut8Text.dnas.length !== 1) { throw new Error(`(UNEXPECTED) resMut8Text.dnas.length !== 1? we're expecting a single mut8 dna. (E: 9574d86a9108095cb454b049bcca5326)`); }\r\n // #endregion sanity/validation\r\n // add dna/newIbGib to running lists of ibgibs created in graft\r\n newGraftDnaIbGibs.push(resMut8Text.dnas[0]);\r\n newGraftedIntermediateIbGibs_ordered.push(resMut8Text.newIbGib);\r\n await persistTransformResult({ resTransform: resMut8Text, space, });\r\n await registerNewIbGib({ ibGib: resMut8Text.newIbGib, space });\r\n mergeTextDetails = {\r\n mergeTextStrategy: MergeTextStrategy.lcs,\r\n textAAddr,\r\n textBAddr,\r\n };\r\n // update the new graft tip, still sans graft info\r\n graftTip_sansGraftInfo = resMut8Text.newIbGib;\r\n if (!graftTip_sansGraftInfo.data) { throw new Error(`(UNEXPECTED) graftTip_sansGraftInfo.data falsy after mut8 merge text? (E: 6b65d83df6681887686a0098144eea26)`); }\r\n }\r\n }\r\n\r\n // #endregion merge data.text if applicable\r\n\r\n // at this point, we have mechanically created new ibgibs that were the\r\n // result of reapplying the dna of the orphaned branch. Now we will \"cap\r\n // off\" this new merged branch with a metadata ibgib that contains info\r\n // about the graft we performed. This graft info basically describes the\r\n // latest common frame and the two branches and what we did with them.\r\n // Practically speaking, this keeps references to the original orphan\r\n // branch, so we do not lose information due to our opinionated graft,\r\n // and later tooling can examine this graft and make custom repairs as\r\n // needed. This graft info is simply rel8d to the new merged tip we just\r\n // created.\r\n\r\n // #region append final graft info frame to timeline\r\n\r\n const graftInfo = await createGraftInfo({\r\n conflictStrategy,\r\n details: `Replayed ${dnaAddrsToApply.length} transforms from orphan (${orphanTipAddr}) onto base (${baseTipAddr}).`,\r\n addlGraftDetails: mergeTextDetails ? [mergeTextDetails] : undefined,\r\n latestCommonFrameAddr,\r\n baseAddrsSinceLCA: baseBranchAddrs,\r\n orphanAddrsSinceLCA: orphanBranchAddrs,\r\n dnaAddrsApplied: dnaAddrsToApply,\r\n });\r\n if (logalot) { console.log(`${lc} intrinsic graft complete. graftInfo to be appended to timeline:\\n${pretty(graftInfo)} (I: ab9d1e73db9a3ff4f8241f38197bb826)`); }\r\n await putInSpace({ ibGib: graftInfo, space });\r\n const graftInfoAddr = getIbGibAddr({ ibGib: graftInfo });\r\n const resRel8GraftInfo = await rel8({\r\n src: graftTip_sansGraftInfo,\r\n rel8nsToAddByAddr: {\r\n [GRAFT_INFO_REL8N_NAME]: [graftInfoAddr],\r\n },\r\n dna: true,\r\n nCounter: !!graftTip_sansGraftInfo.data.n,\r\n });\r\n // #region sanity/validation\r\n if (resRel8GraftInfo.intermediateIbGibs && resRel8GraftInfo.intermediateIbGibs.length > 0) { throw new Error(`(UNEXPECTED) resRel8GraftInfo.intermediateIbGibs truthy/non-empty? This is expected to only create the newIbGib with no intermediates. (E: 78b928ace4287b4dc82f413fdad60826)`); }\r\n if (!resRel8GraftInfo.dnas || resRel8GraftInfo.dnas.length === 0) { throw new Error(`(UNEXPECTED) resRel8GraftInfo.dnas falsy/empty? We're expected to generate dna from this rel8. (E: 4c8fdde70368d643f86732dfa48c5526)`); }\r\n if (resRel8GraftInfo.dnas.length !== 1) { throw new Error(`(UNEXPECTED) resRel8GraftInfo.dnas.length !== 1? we're expecting a single rel8 dna. (E: c2f5085c1718d7149e04f5c814027926)`); }\r\n // #endregion sanity/validation\r\n\r\n // add dna to running list BUT NOT the newIbGib, because it's NOT an intermediate.\r\n newGraftDnaIbGibs.push(resRel8GraftInfo.dnas[0]);\r\n await persistTransformResult({ resTransform: resRel8GraftInfo, space, });\r\n await registerNewIbGib({ ibGib: resRel8GraftInfo.newIbGib, space });\r\n\r\n // #endregion append final graft info frame to timeline\r\n\r\n const finalGraftTip = resRel8GraftInfo.newIbGib;\r\n if (logalot) { console.log(`${lc} finalGraftTip: ${pretty(finalGraftTip)} (I: 454e72957be8221b96931c289053fc26)`); }\r\n\r\n const result: GraftTimelinesResult = {\r\n dnasReplayed: dnaIbGibsToApply,\r\n dnasCreatedInGraft: newGraftDnaIbGibs,\r\n intermediateIbGibsCreatedInGraft: newGraftedIntermediateIbGibs_ordered,\r\n newGraftTip: finalGraftTip,\r\n graftInfoCreated: graftInfo,\r\n };\r\n\r\n if (logalot) { console.log(`${lc} result... (I: d6a02f95eb2564c621810ef855434226)`); }\r\n if (logalot) { console.dir(result); }\r\n\r\n return result;\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n}\r\n\r\n/**\r\n * Guard that determines if given {@link ibGib} is a {@link GraftInfoIbGib_V1}\r\n * @returns true if {@link ibGib} is a {@link GraftInfoIbGib_V1}, else false\r\n */\r\nexport function isGraftInfo(ibGib: IbGib_V1): ibGib is GraftInfoIbGib_V1 {\r\n const lc = `[${isGraftInfo.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: fe9adfe1a3175d87982507c8851f5826)`); }\r\n // gauntlet style, throws if not an ibGib\r\n if (!ibGib) { throw new Error(`(UNEXPECTED) not a graft info, ibGib falsy? (E: bf06cdd700788e777f72fe5a5bdb0e26)`); }\r\n if (!ibGib.data) { throw new Error(`not a graft info, ibGib.data falsy (E: 5e1b28843ec8571a7623046a06195826)`); }\r\n if (!ibGib.ib.startsWith(GRAFT_INFO_ATOM)) {\r\n throw new Error(`not graft info, ibgib.ib does not start with ${GRAFT_INFO_ATOM} (E: cec6a8e25ff8746aef813e38cbebce26)`);\r\n }\r\n return true;\r\n } catch (error) {\r\n if (logalot) { console.error(`${lc} ${extractErrorMsg(error)}`); }\r\n return false;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n}", "import { extractErrorMsg, getUUID, pretty } from \"@ibgib/helper-gib/dist/helpers/utils-helper.mjs\";\r\nimport { IbGib_V1 } from \"@ibgib/ts-gib/dist/V1/types.mjs\";\r\nimport { Ib, IbGibAddr } from \"@ibgib/ts-gib/dist/types.mjs\";\r\nimport { validateIbGibIntrinsically } from \"@ibgib/ts-gib/dist/V1/validate-helper.mjs\";\r\nimport { isDna, isPrimitive } from \"@ibgib/ts-gib/dist/V1/transforms/transform-helper.mjs\";\r\nimport { getIbGibAddr } from \"@ibgib/ts-gib/dist/helper.mjs\";\r\n\r\nimport { GLOBAL_LOG_A_LOT } from \"../core-constants.mjs\";\r\nimport { SYNC_ATOM, SYNC_MSG_REL8N_NAME, SyncStage } from \"./sync-constants.mjs\";\r\nimport {\r\n SyncData_V1, SyncSagaFrameOrigin, SyncIb_V1, SyncIbGib_V1, SyncSagaFrameDependencyGraph\r\n} from \"./sync-types.mjs\";\r\nimport {\r\n isValidSyncConflictStrategy, SYNC_CONFLICT_STRATEGY_VALID_VALUES,\r\n} from \"./sync-constants.mjs\";\r\nimport { IbGibSpaceAny } from \"../witness/space/space-base-v1.mjs\";\r\nimport { getFromSpace, putInSpace } from \"../witness/space/space-helper.mjs\";\r\nimport { IbGibSpaceResultData, IbGibSpaceResultIbGib, IbGibSpaceResultRel8ns } from \"../witness/space/space-types.mjs\";\r\nimport { SyncSagaConflictInfo, SyncSagaMessageCommitData_V1, SyncSagaMessageDeltaData_V1, SyncSagaMessageIbGib_V1 } from \"./sync-saga-message/sync-saga-message-types.mjs\";\r\nimport { getIbGibsFromCache_fallbackToSpaces } from \"../common/other/ibgib-helper.mjs\";\r\nimport { isGraftInfo } from \"./graft-info/graft-info-helpers.mjs\";\r\nimport { GRAFT_ORPHAN_REL8N_NAME } from \"./graft-info/graft-info-constants.mjs\";\r\nimport { deriveKey } from \"../keystone/kdf/kdf-helpers.mjs\";\r\nimport { KdfStrategy } from \"../keystone/kdf/kdf-constants.mjs\";\r\n\r\nconst logalot = GLOBAL_LOG_A_LOT;\r\n\r\n/**\r\n * Constructs the standard 'ib' string for a Sync frame.\r\n */\r\n/**\r\n * Constructs the standard 'ib' string for a Sync frame.\r\n */\r\nexport async function getSyncIb({\r\n data,\r\n}: {\r\n data: SyncData_V1,\r\n}): Promise<Ib> {\r\n const lc = `[${getSyncIb.name}]`;\r\n try {\r\n // sync uuid\r\n // e.g. \"sync 1234-5678\" (stage removed from ib)\r\n const ib = [\r\n SYNC_ATOM,\r\n data.uuid\r\n ].join(' ');\r\n\r\n return ib;\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Parses a standard Sync 'ib' string.\r\n */\r\nexport async function parseSyncIb({\r\n ib,\r\n}: {\r\n ib: Ib,\r\n}): Promise<SyncIb_V1> {\r\n const lc = `[${parseSyncIb.name}]`;\r\n try {\r\n const parts = ib.split(' ');\r\n if (parts.length !== 2) {\r\n throw new Error(`Invalid sync ib. Expected 2 parts [atom uuid]. Got ${parts.length}. (E: 7db603e0dcf8c35af826cce89a125825)`);\r\n }\r\n const [\r\n atom,\r\n uuid\r\n ] = parts;\r\n\r\n if (atom !== SYNC_ATOM) {\r\n throw new Error(`Atom mismatch. Expected ${SYNC_ATOM}. Got ${atom}. (E: cc6a48143be7de70bafbfdbbc0776826)`);\r\n }\r\n\r\n return { atom, uuid };\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * @returns the name for a tempSpace in the sync\r\n */\r\nexport async function getTempSpaceName(): Promise<string> {\r\n const uuid = await getUUID();\r\n return `tmp_sync_space_${uuid.substring(0, 8)}`;\r\n}\r\n\r\n/**\r\n * UNTESTED\r\n *\r\n * Checks if an {@link olderAddr} is the address of a past frame in the ibgib\r\n * with {@link newerAddr}.\r\n */\r\nexport async function isPastFrame({\r\n olderAddr,\r\n newerAddr,\r\n space,\r\n}: {\r\n olderAddr: string,\r\n newerAddr: string,\r\n space: IbGibSpaceAny,\r\n}): Promise<boolean> {\r\n const lc = `[${isPastFrame.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: 4b3548cbc9a2eb749f447ed82fdcf826)`); }\r\n\r\n // quick check...\r\n if (olderAddr === newerAddr) {\r\n return true; /* <<<< returns early */\r\n }\r\n\r\n // diff, so get the actual ibGib\r\n let newerIbGib: IbGib_V1;\r\n const res = await getFromSpace({ space, addr: newerAddr });\r\n if (res.success && res.ibGibs?.length === 1) {\r\n newerIbGib = res.ibGibs[0];\r\n } else {\r\n throw new Error(`couldn't get newerAddr (${newerAddr}) from space (${space.ib}). (E: 36c758c22b181b2c89a1cd28937a6826)`);\r\n }\r\n\r\n if (!newerIbGib.rel8ns) {\r\n console.warn(`${lc} newerIbGib.rel8ns falsy? newerAddr: ${newerAddr}. (W: 6f920811f7080281189f767813814826)`);\r\n return false; /* <<<< returns early */\r\n }\r\n\r\n const pastAddrs = newerIbGib.rel8ns.past ?? [];\r\n if (pastAddrs.length === 0) {\r\n return false; /* <<<< returns early */\r\n }\r\n\r\n if (pastAddrs.includes(olderAddr)) {\r\n return true; /* <<<< returns early */\r\n }\r\n\r\n // at this point, for most ibgibs we could leave it here. But\r\n // conceivably, the past could be a linked rel8n. so recurse on the\r\n // oldest in the past\r\n\r\n const oldestAddrInThisPast = pastAddrs[0];\r\n const resRecurse = await isPastFrame({\r\n olderAddr,\r\n newerAddr: oldestAddrInThisPast,\r\n space,\r\n });\r\n\r\n return resRecurse;\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n\r\n}\r\n\r\n/**\r\n * Gets a shallow dependency graph for a Sync Saga Frame.\r\n *\r\n * DOES NOT GET THE ENTIRE DEPENDENCY FRAME (INCLUDING PAST).\r\n *\r\n * Unlike standard `getDependencyGraph`, this does NOT traverse `ancestor` (history) or `past`.\r\n * It only retrieves the *content* of the current frame:\r\n * 1. The Frame itself.\r\n * 2. The Message Stone(s) (`rel8ns.msg`).\r\n *\r\n * This is used for efficient transmission of the \"Current Step\" without re-sending the entire history.\r\n */\r\nexport async function getSyncSagaFrameDependencyGraph({\r\n sagaIbGib,\r\n localSpace,\r\n}: {\r\n sagaIbGib: SyncIbGib_V1,\r\n localSpace: IbGibSpaceAny,\r\n}): Promise<SyncSagaFrameDependencyGraph> {\r\n const lc = `[${getSyncSagaFrameDependencyGraph.name}]`;\r\n\r\n // Helper to fetch and push\r\n const fnGet = async (addrs: string[]) => {\r\n const resGet = await getFromSpace({ space: localSpace, addrs });\r\n if (resGet.success && resGet.ibGibs?.length === addrs.length) {\r\n return resGet.ibGibs!;\r\n } else {\r\n const resIbGib =\r\n resGet.rawResultIbGib as IbGibSpaceResultIbGib<IbGib_V1, IbGibSpaceResultData, IbGibSpaceResultRel8ns>\r\n if (!resIbGib.data) { throw new Error(`(UNEXPECTED) resGet.rawResultIbGib.data falsy? (E: c26c681d2f831fc537ba6f48fee36d26)`); }\r\n throw new Error(`(UNEXPECTED) couldn't find addrs? addrsNotFound: ${resIbGib.data.addrsNotFound}? space.ib: ${localSpace.ib} (E: 43b7b5a6ad982715c8f3eed69bfa0d26)`);\r\n }\r\n };\r\n\r\n const validationErrors = await validateSyncSagaFrame({ sagaIbGib });\r\n if (validationErrors.length > 0) {\r\n throw new Error(`invalid sync sagaIbGib. validationErrors: ${validationErrors} (E: 19f9e8c9643858ff41312b62293d2126)`);\r\n }\r\n\r\n if (!sagaIbGib.rel8ns) { throw new Error(`(UNEXPECTED) validated sagaIbGib.rel8ns falsy? (E: 73af48be8bbf271ec5cf78187ce8c826)`); }\r\n\r\n // msg stones\r\n const msgStoneAddrs = sagaIbGib.rel8ns[SYNC_MSG_REL8N_NAME]!;\r\n const msgStones = await fnGet(msgStoneAddrs) as SyncSagaMessageIbGib_V1[];\r\n\r\n return { sagaIbGib, msgStones, };\r\n}\r\n\r\n/**\r\n * gets the {@link SyncSagaFrameDependencyGraph} for each step in the saga,\r\n * including the {@link sagaIbGib} passed in.\r\n * @returns ordered array of saga frame dependency graphs\r\n */\r\nexport async function getFullSyncSagaHistory({\r\n sagaIbGib,\r\n space,\r\n}: {\r\n sagaIbGib: SyncIbGib_V1,\r\n space: IbGibSpaceAny,\r\n}): Promise<SyncSagaFrameDependencyGraph[]> {\r\n const lc = `[${getFullSyncSagaHistory.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: 1ea3f804dd07d1e917a2afaaad497826)`); }\r\n if (!sagaIbGib.data) { throw new Error(`(UNEXPECTED) sagaIbGib.data falsy? (E: fe0a0d0965e87ac852fe7ba4710cc826)`); }\r\n if (!sagaIbGib.rel8ns) { throw new Error(`(UNEXPECTED) sagaIbGib.rel8ns falsy? (E: b79ff82a732346bdf8a9e1eb9ac96826)`); }\r\n\r\n const sagaAddr = getIbGibAddr({ ibGib: sagaIbGib });\r\n\r\n const addrs = sagaIbGib.rel8ns.past && sagaIbGib.rel8ns.past.length > 0 ?\r\n [...sagaIbGib.rel8ns.past, sagaAddr] :\r\n [sagaAddr];\r\n\r\n const resGraphs: SyncSagaFrameDependencyGraph[] = [];\r\n for (const addr of addrs) {\r\n let sagaFrame: SyncIbGib_V1;\r\n let resGet = await getFromSpace({ addr, space });\r\n if (resGet.success && resGet.ibGibs && resGet.ibGibs.length === 1) {\r\n sagaFrame = resGet.ibGibs[0] as SyncIbGib_V1;\r\n } else {\r\n if (logalot) { console.log(`${lc} failed getting full history of sagaIbGib:\\n${pretty(sagaIbGib)} (I: 2a35685bfe038f63182c7db39b44c826)`); }\r\n throw new Error(`couldn't get saga addr (${addr}) from space (${space.ib}) (E: 865b78ecd918c244158813650bea7d26)`);\r\n }\r\n const graph = await getSyncSagaFrameDependencyGraph({\r\n sagaIbGib: sagaFrame, localSpace: space,\r\n });\r\n resGraphs.push(graph);\r\n }\r\n\r\n // the \\n are my my attempt at lining up an indent\r\n if (logalot) { console.log(`${lc} resGraphs:...\\n ${pretty(resGraphs).split('\\n').join('\\n ')}\\n...(I: d8e11827d88a3454d887ff05fb4ff526)`); }\r\n\r\n return resGraphs;\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n}\r\n\r\n/**\r\n * only validates this single frame. does not validate any dependencies or past.\r\n * @returns array of errors, empty if valid\r\n */\r\nexport async function validateSyncSagaFrame({\r\n sagaIbGib\r\n}: {\r\n sagaIbGib: SyncIbGib_V1;\r\n}): Promise<string[]> {\r\n const lc = `[${validateSyncSagaFrame.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: dac978e9ec5820f128fbbff817b82826)`); }\r\n\r\n const errors: string[] = await validateIbGibIntrinsically({ ibGib: sagaIbGib }) ?? [];\r\n\r\n // intrinsic errors are a non-starter\r\n if (errors.length > 0) { return errors; /* <<<< returns early */ }\r\n\r\n if (sagaIbGib.data) {\r\n const { data } = sagaIbGib;\r\n\r\n if (data.uuid) {\r\n // todo: validate uuid\r\n } else {\r\n errors.push(`data.uuid required (E: aa24eeda7b88d22e5832a2e8083c0826)`);\r\n }\r\n if (data.timestamp) {\r\n // todo: validate timestamp\r\n } else {\r\n errors.push(`data.timestamp required (E: 9c82a88548f4b63c38687428754b3826)`);\r\n }\r\n if (data.timestampMs || data.timestampMs === 0) {\r\n // todo: validate timestampMs\r\n } else {\r\n errors.push(`data.timestampMs required (E: 9c82a88548f4b63c38687428754b3826)`);\r\n }\r\n\r\n if (data.conflictStrategy) {\r\n if (!isValidSyncConflictStrategy(data.conflictStrategy)) {\r\n errors.push(`data.conflictStrategy (${data.conflictStrategy}) is invalid. Must be one of \"${SYNC_CONFLICT_STRATEGY_VALID_VALUES}\". (E: 6223a8813b688fa2c8644fa8a491bf26)`)\r\n }\r\n } else {\r\n errors.push(`data.conflictStrategy required (E: 9c82a88548f4b63c38687428754b3826)`);\r\n }\r\n\r\n if (data.expirationTimestamp) {\r\n // todo: validate expirationTimestamp\r\n }\r\n\r\n if (data.errors) {\r\n // todo: validate errors?\r\n }\r\n\r\n if (data.successCount) {\r\n // todo: validate successCount\r\n }\r\n\r\n } else {\r\n errors.push(`sagaIbGib.data falsy (E: 4de5e8de589d0af7245600fb4fe30926)`);\r\n }\r\n\r\n if (sagaIbGib.rel8ns) {\r\n const msgAddrs = sagaIbGib.rel8ns[SYNC_MSG_REL8N_NAME];\r\n if (msgAddrs && msgAddrs.length > 0) {\r\n // todo: validate the syncmsg addr?\r\n } else {\r\n errors.push(`sagaIbGib.rel8ns[SYNC_MSG_REL8N_NAME] required. (E: df648dc18148e718682acb4842ecf826)`);\r\n }\r\n } else {\r\n errors.push(`sagaIbGib.rel8ns falsy (E: da37aa492a7275b68a5e1912c7a5e126)`);\r\n }\r\n\r\n return errors;\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n}\r\n\r\nexport async function validateFullSyncSagaHistory({\r\n history,\r\n}: {\r\n history: SyncSagaFrameDependencyGraph[],\r\n}): Promise<string[]> {\r\n const lc = `[${validateFullSyncSagaHistory.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: df02b802f6989096b8d8f728e2c0a526)`); }\r\n console.error(`${lc} NAG ERROR (NOT THROWN) need to implement more validation on full saga history. (E: 9bfcc9247a1c783fd361a4a8216fef26)`)\r\n return [];\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n}\r\n\r\nexport async function putInSpace_dnasThenNonDnas({\r\n ibGibs,\r\n space,\r\n}: {\r\n ibGibs: IbGib_V1[],\r\n space: IbGibSpaceAny,\r\n}): Promise<{ payload_Dnas: IbGib_V1[], payload_NonDnas: IbGib_V1[] }> {\r\n const lc = `[${putInSpace_dnasThenNonDnas.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: aa3ab828402836b3914800a8ffa1b826)`); }\r\n\r\n const payload_Dnas: IbGib_V1[] = [];\r\n const payload_NonDnas: IbGib_V1[] = [];\r\n\r\n for (const ibGib of ibGibs) {\r\n // never store primitives\r\n if (isPrimitive({ ibGib })) { continue; }\r\n\r\n if (isDna({ ibGib })) {\r\n payload_Dnas.push(ibGib);\r\n } else {\r\n payload_NonDnas.push(ibGib);\r\n }\r\n }\r\n\r\n // dnas are the simplest and we store those first...\r\n if (payload_Dnas.length > 0) {\r\n await putInSpace({ ibGibs: payload_Dnas, isDna: true, space, });\r\n }\r\n\r\n // then put all non-dnas (\"regular\" ibgibs) in the space\r\n if (payload_NonDnas.length > 0) {\r\n await putInSpace({ ibGibs: payload_NonDnas, isDna: false, space, });\r\n }\r\n\r\n return { payload_Dnas, payload_NonDnas };\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n}\r\n\r\n/**\r\n * @see {@link SyncSagaFrameOrigin}\r\n */\r\nexport function getSyncSagaFrameOrigin({\r\n sagaFrame,\r\n}: {\r\n sagaFrame: SyncIbGib_V1,\r\n}): SyncSagaFrameOrigin {\r\n const lc = `[${getSyncSagaFrameOrigin.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: 93521332d0dd2f5e88398b7db95e8126)`); }\r\n if (!sagaFrame) { throw new Error(`(UNEXPECTED) sagaFrame falsy? (E: 01fb28be6668d88ea49bb298c739c926)`); }\r\n if (!sagaFrame.data) { throw new Error(`(UNEXPECTED) sagaFrame.data falsy? (E: 998298eb17685bdb9a85b46488ccd826)`); }\r\n if (!sagaFrame.data.n && sagaFrame.data.n !== 0) { throw new Error(`(UNEXPECTED) sagaFrame.data.n falsy and not 0? (E: 0394919d5b58300ceb09ba6a264ad826)`); }\r\n\r\n const modulo = sagaFrame.data.n % 2;\r\n // even => sender\r\n // odd => receiver\r\n\r\n if (modulo === 0) {\r\n return SyncSagaFrameOrigin.sender;\r\n } else if (modulo === 1) {\r\n return SyncSagaFrameOrigin.receiver;\r\n } else {\r\n throw new Error(`(UNEXPECTED) modulo is neither 0 nor 1? my logic sucks! This was way too defensive on my part... (E: 559488a2eef8d17b57079ca8886ee826)`);\r\n }\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n}\r\n\r\n/**\r\n * @returns the last delta frame's {@link SyncSagaMessageDeltaData_V1.conflicts}\r\n * in the given {@link sagaHistory}.\r\n *\r\n * ## intent\r\n *\r\n * we need to be able to get the final aggregated info on what happened with\r\n * conflicts and their resolutions. ATOW (02/02/2026) This exists in the final\r\n * delta frame in the saga. this is needed, e.g., in `getAllOrphanedAddresses`\r\n *\r\n * @see {@link getAllOrphanedAddresses}\r\n */\r\nexport async function getFinalConflictsInfo({\r\n sagaHistory,\r\n}: {\r\n sagaHistory: SyncSagaFrameDependencyGraph[];\r\n}): Promise<SyncSagaConflictInfo[] | undefined> {\r\n const lc = `[${getFinalConflictsInfo.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: fe93a8f29e5d8ab2c8bd0e08e56f7826)`); }\r\n\r\n const lastDeltaHistorySlice =\r\n sagaHistory.findLast(x => x.msgStones.some(msgStone => msgStone.data.stage === SyncStage.delta));\r\n if (!lastDeltaHistorySlice) {\r\n throw new Error(`(UNEXPECTED) no delta frame? What are we calling this function for? (E: 9b3201207908f79868b93cd893a91626)`);\r\n }\r\n\r\n const deltaStones = lastDeltaHistorySlice.msgStones.filter(x => x.data.stage === SyncStage.delta);\r\n if (deltaStones.length > 1) { throw new Error(`(UNEXPECTED) multiple delta stones in history slice? we're expecting a single delta stone per saga frame. (E: a4bd5860b4aa0743753d4798d3163826)`); }\r\n\r\n const deltaData = deltaStones[0].data as SyncSagaMessageDeltaData_V1;\r\n return deltaData.conflicts;\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n}\r\n\r\nexport async function getAllOrphanedAddresses({\r\n sagaHistory,\r\n myTempSpace,\r\n}: {\r\n sagaHistory: SyncSagaFrameDependencyGraph[];\r\n /**\r\n * we're getting at the graft info, which will be in the temp space that\r\n * the graft was performed in.\r\n */\r\n myTempSpace: IbGibSpaceAny;\r\n}): Promise<IbGibAddr[]> {\r\n const lc = `[${getAllOrphanedAddresses.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: b755627e99c9a221566d86a81b0da526)`); }\r\n\r\n // orphaned addresses should only happenn when we have conflicts and\r\n // merged timelines. the final delta frame should have all conflicts\r\n // resolved with full info. we should be able to work off of that.\r\n const conflicts = await getFinalConflictsInfo({ sagaHistory });\r\n\r\n if (!conflicts || conflicts.length === 0) {\r\n if (logalot) { console.log(`${lc} no conflicts found. returning empty array (I: 5dce98010128a284c8ec92cd466a3826)`); }\r\n return []; /* <<<< returns early */\r\n }\r\n\r\n const resOrphanedAddrs: IbGibAddr[] = [];\r\n\r\n for (const conflict of conflicts) {\r\n if (!conflict.resolved) { throw new Error(`(UNEXPECTED) conflict.resolved falsy? we're expecting all conflicts to be resolved when getting orphaned addresses. (E: 3861e89a18c8ff405eb2117f6d4b9b26)`); }\r\n if (!conflict.graftInfoAddr) { throw new Error(`(UNEXPECTED) conflict.graftInfoAddr falsy? we're expecting a resolved conflict whose final ibgib (graft tip) was the graft info and for this addr to be in conflict.graftInfoAddr. (E: 80d86e333028585908f4757bc4d6f826)`); }\r\n const ibgibsGotten = await getIbGibsFromCache_fallbackToSpaces({\r\n addrs: [conflict.graftInfoAddr],\r\n space: myTempSpace,\r\n });\r\n if (ibgibsGotten.length !== 1) { throw new Error(`(UNEXPECTED) couldn't get conflict.graftInfoAddr (${conflict.graftInfoAddr}) from myTempSpace (${myTempSpace.ib})? (E: cf1fe87096f8ea22f84f250d7ab30226)`); }\r\n const graftInfo = ibgibsGotten[0];\r\n if (!isGraftInfo(graftInfo)) { throw new Error(`(UNEXPECTED) graft info from conflict.graftInfoAddr (${conflict.graftInfoAddr}) does not pass the isGraftInfo guard? We're expecting this addr to point to a valid GraftInfoIbGib_V1 (E: 6aa9ecb9a428d92be8d1bdbe0696f826)`); }\r\n const orphanedAddrs = graftInfo.rel8ns[GRAFT_ORPHAN_REL8N_NAME];\r\n\r\n if (!orphanedAddrs || orphanedAddrs.length === 0) {\r\n throw new Error(`(UNEXPECTED) orphanedAddrs empty for conflict graftInfo (${conflict.graftInfoAddr})? we're expecting a graft to always necessarily orphan one or other branches, otherwise what are we \"grafting\"? (E: 3ed1284f6ca84754582801484d751926)`);\r\n }\r\n\r\n orphanedAddrs.forEach(x => resOrphanedAddrs.push(x));\r\n }\r\n\r\n return resOrphanedAddrs;\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n}\r\n\r\n/**\r\n * Derives a saga-specific session secret from the sender's master secret.\r\n *\r\n * Uses `KDF(senderSecret, sagaId)` via the `recursive_salt_wrap` strategy so\r\n * the session secret is:\r\n * - **Deterministic**: same inputs \u2192 same output (needed for the receiver to\r\n * independently reproduce the session keystone genesis).\r\n * - **Saga-bound**: different sagaId \u2192 completely different sessionSecret \u2192\r\n * completely different session keystone S.\r\n * - **One-way**: knowing S cannot recover `senderSecret`.\r\n *\r\n * @param senderSecret - The sender's plaintext master secret (never transmitted).\r\n * @param sagaId - The unique UUID for this sync saga.\r\n * @returns The derived session secret string.\r\n */\r\nexport async function deriveSessionSecret({\r\n senderSecret,\r\n sagaId,\r\n}: {\r\n senderSecret: string;\r\n sagaId: string;\r\n}): Promise<string> {\r\n const lc = `[${deriveSessionSecret.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: 0de03f8dcd3e32f1fca244e8f2a8a826)`); }\r\n\r\n if (!senderSecret) { throw new Error(`(UNEXPECTED) senderSecret falsy? (E: 8ce053fe59825a6678713128953b9d26)`); }\r\n if (!sagaId) { throw new Error(`(UNEXPECTED) sagaId falsy? (E: 3a17e0c1b2f849de8a42cd15b8ee6826)`); }\r\n\r\n const sessionSecret = await deriveKey({\r\n masterSecret: senderSecret,\r\n kdfOpts: {\r\n strategy: KdfStrategy.recursive_salt_wrap,\r\n salt: sagaId,\r\n rounds: 10000,\r\n algorithm: 'SHA-256',\r\n }\r\n });\r\n\r\n return sessionSecret;\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n}\r\n", "/**\r\n * @module sync saga context constants\r\n */\r\n\r\n/**\r\n * Atom for the sync saga context ibgib.\r\n */\r\nexport const SYNC_SAGA_CONTEXT_ATOM = 'sync_sagacontext';\r\n", "/**\r\n * @module sync saga context helpers\r\n */\r\n\r\nimport { extractErrorMsg, pretty, } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';\r\nimport { getIbGibAddr, } from '@ibgib/ts-gib/dist/helper.mjs';\r\nimport { Ib, } from '@ibgib/ts-gib/dist/types.mjs';\r\nimport { validateIbGibIntrinsically } from '@ibgib/ts-gib/dist/V1/validate-helper.mjs';\r\n\r\nimport { GLOBAL_LOG_A_LOT } from '../../core-constants.mjs';\r\nimport { SYNC_SAGA_CONTEXT_ATOM } from './sync-saga-context-constants.mjs';\r\nimport { SYNC_SAGA_PAYLOAD_ADDRS_DOMAIN, SYNC_MSG_REL8N_NAME } from '../sync-constants.mjs';\r\nimport {\r\n SyncSagaContextData_V1, SyncSagaContextIbGib_V1, SyncSagaContextIb_V1,\r\n} from './sync-saga-context-types.mjs';\r\nimport { IbGibSpaceAny } from '../../witness/space/space-base-v1.mjs';\r\nimport { getFromSpace, getLatestAddrs, getTjpIbGib } from '../../witness/space/space-helper.mjs';\r\nimport { SessionGenesisFrameDetails, } from '../sync-types.mjs';\r\nimport { validateSyncSagaFrame } from '../sync-helpers.mjs';\r\nimport { isIbGibWithAtom, toDto } from '../../common/other/ibgib-helper.mjs';\r\nimport { KeystoneService_V1 } from '../../keystone/keystone-service-v1.mjs';\r\nimport { KeystoneData_V1, KeystoneIbGib_V1 } from '../../keystone/keystone-types.mjs';\r\nimport { KEYSTONE_VERB_SYNC } from '../../keystone/keystone-constants.mjs';\r\n\r\nconst logalot = GLOBAL_LOG_A_LOT;\r\n\r\n/**\r\n * Constructs the standard 'ib' string for a Sync Saga Context stone.\r\n */\r\nexport async function getSyncSagaContextIb({\r\n data,\r\n}: {\r\n data: SyncSagaContextData_V1,\r\n}): Promise<Ib> {\r\n const lc = `[${getSyncSagaContextIb.name}]`;\r\n try {\r\n if (!data) { throw new Error(`data required (E: 839d82138c234b3e89582855594191fe)`); }\r\n\r\n const payloadCount = data['@payloadAddrsDomain'] ? data['@payloadAddrsDomain'].length : 0;\r\n\r\n const ib = [\r\n SYNC_SAGA_CONTEXT_ATOM,\r\n data.sagaN,\r\n payloadCount,\r\n ].join(' ');\r\n\r\n return ib;\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Parses a standard Sync Saga Context 'ib' string.\r\n */\r\nexport async function parseSyncSagaContextIb({\r\n ib,\r\n}: {\r\n ib: Ib,\r\n}): Promise<SyncSagaContextIb_V1> {\r\n const lc = `[${parseSyncSagaContextIb.name}]`;\r\n try {\r\n const parts = ib.split(' ');\r\n if (parts.length !== 2) {\r\n throw new Error(`Invalid sync saga context ib. Expected at least 2 parts [atom, payloadCount]. Got ${parts.length}. (E: 8b06c88820c74f5fb9f21f148459422a)`);\r\n }\r\n const [\r\n atom,\r\n sagaNStr,\r\n payloadCountStr,\r\n ] = parts;\r\n\r\n if (atom !== SYNC_SAGA_CONTEXT_ATOM) {\r\n throw new Error(`Atom mismatch. Expected ${SYNC_SAGA_CONTEXT_ATOM}. Got ${atom}. (E: 67d71fc0f8d04840b178652309f471f5)`);\r\n }\r\n\r\n if (!sagaNStr) { throw new Error(`invalid ib. second piece should be sagaN but is falsy (E: 081ed475aeb8fe25a66f60466b2e5826)`); }\r\n const sagaN = parseInt(sagaNStr);\r\n if (isNaN(sagaN)) {\r\n throw new Error(`sagaNStr is not a number. (E: 3d6b580d5a48c5e03ecec288896e2826)`);\r\n }\r\n\r\n if (!payloadCountStr) { throw new Error(`invalid ib. second piece should be payloadCount but is falsy (E: 0bb7580793d800ca02227828a7294826)`); }\r\n const payloadCount = parseInt(payloadCountStr);\r\n if (isNaN(payloadCount)) {\r\n throw new Error(`payloadCountStr is not a number. (E: 49457814282a44069871630987588722)`);\r\n }\r\n\r\n return { atom, sagaN, payloadCount };\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n }\r\n}\r\n\r\nexport function isSyncSagaContextIbGib(x: any): x is SyncSagaContextIbGib_V1 {\r\n const lc = `[${isSyncSagaContextIbGib.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: 2bfa7f3cf5984b0c78aced881ce95226)`); }\r\n\r\n const hasAtom = isIbGibWithAtom<SyncSagaContextIbGib_V1>(x, SYNC_SAGA_CONTEXT_ATOM);\r\n\r\n // should be good enough in V1\r\n\r\n return hasAtom;\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n}\r\n\r\n/**\r\n * Validates ONLY the {@link context} ibgib itself and saga frame/msg stone(s)\r\n * ({@link SyncSagaContextIbGib_V1.sagaFrame}).\r\n *\r\n * Does NOT...\r\n * * validate authn or authz\r\n * * validate domain payload ibgibs...\r\n * * intrinsically\r\n * * in relation to this context (addrs match up)\r\n *\r\n * @returns empty array if valid, else validation errors\r\n */\r\nexport async function validateContextAndSagaFrame({\r\n context,\r\n}: {\r\n context: SyncSagaContextIbGib_V1,\r\n}): Promise<string[]> {\r\n const lc = `[${validateContextAndSagaFrame.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: 7797f8294bd8f7e5089cb722ad468226)`); }\r\n\r\n const errors: string[] = [];\r\n\r\n // validate just the context first. if this fails we return early.\r\n const intrinsicErrors = await validateIbGibIntrinsically({ ibGib: context });\r\n if (intrinsicErrors && intrinsicErrors.length > 0) {\r\n intrinsicErrors.forEach(x => errors.push(x));\r\n return errors; /* <<<< returns early */\r\n }\r\n\r\n if (context.sagaFrame) {\r\n const sagaFrameErrors =\r\n await validateSyncSagaFrame({ sagaIbGib: context.sagaFrame });\r\n sagaFrameErrors.forEach(x => errors.push(x));\r\n } else {\r\n errors.push(`context.sagaFrame is falsy. (E: b4edd88f4963f493789f83b29ba2df26)`);\r\n }\r\n\r\n if (context.sagaFrameMsg) {\r\n const sagaFrameMsgErrors =\r\n await validateIbGibIntrinsically({ ibGib: context.sagaFrameMsg }) ?? [];\r\n sagaFrameMsgErrors.forEach(x => errors.push(x));\r\n\r\n if (context.sagaFrame) {\r\n const expectedMsgAddr = context.sagaFrame.rel8ns?.[SYNC_MSG_REL8N_NAME]?.[0];\r\n if (expectedMsgAddr) {\r\n const actualMsgAddr = getIbGibAddr({ ibGib: context.sagaFrameMsg });\r\n if (actualMsgAddr !== expectedMsgAddr) {\r\n errors.push(`context.sagaFrameMsg address (${actualMsgAddr}) does not match the stone address referenced in sagaFrame relations (${expectedMsgAddr}). (E: a983b271fcae46bbad7e82098bc24826)`);\r\n }\r\n } else {\r\n errors.push(`context.sagaFrame is missing the message stone relation '${SYNC_MSG_REL8N_NAME}'. (E: da872cf3a8d46dbbad89d0a68d712826)`);\r\n }\r\n }\r\n } else {\r\n errors.push(`context.sagaFrameMsg is falsy. (E: ed405a72ab0d8bbdca7b9605d8f9a26)`);\r\n }\r\n\r\n // if this is already invalid, we could have intrinsic validation\r\n // errors, which are a non-starter.\r\n if (errors.length > 0) { return errors; /* <<<< returns early */ }\r\n\r\n // ~~ensure the non-dto properties on the context object (i.e. props\r\n // that are not ib, gib, data, or rel8ns) match the data in the\r\n // context object~~ NO. THIS WILL BE IN A SEPARATE FUNCTION.\r\n // See `validateContextDomainPayloadIbGibs`\r\n\r\n // throw new Error(`not implemented (E: cb639658e1183fa6c8a4ebca023ba926)`);\r\n\r\n console.error(`${lc} NAG ERROR MSG (NOT THROWN): not fully implemented yet (E: d574d85cb578637648ed403857f7a826)`);\r\n return [];\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n}\r\n\r\n/**\r\n * validates {@link SyncSagaContextIbGib_V1.payloadIbGibsDomain} intrinsically,\r\n * and ensures that these payloadIbGibs also match the expected addrs in\r\n * {@link SyncSagaContextData_V1}[{@link SYNC_SAGA_PAYLOAD_ADDRS_DOMAIN}].\r\n *\r\n * @returns empty array if valid, else validation errors\r\n */\r\nexport async function validateContextDomainPayloadIbGibs({ context }: { context: SyncSagaContextIbGib_V1 }): Promise<string[]> {\r\n const lc = `[${validateContextDomainPayloadIbGibs.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: 9f9fe835bcc80c75aa7fd6d887fc0826)`); }\r\n console.error(`${lc} NAG MESSAGE (NOT THROWN). not implemented (E: bfe02ab36a227291a8f17ffc08f2ef26)`)\r\n return [];\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n}\r\n\r\n/**\r\n * \"Intrinsically\": This authenticates assuming we have already established that\r\n * this context is a valid continuation of previous sync contexts/saga state. It\r\n * does not check that the session identity contained on this context is a valid\r\n * continuation.\r\n *\r\n * ## notes\r\n *\r\n * Say an attacker tries to hijack a legit sync process by capturing previous\r\n * context(s). Then the attacker just either creates its own sessionIdentity\r\n *\r\n * ## implementation notes\r\n *\r\n * This is a HUGE function right now, because there are just a lot of things to\r\n * check. I'm basically going through and just taking every assumption that I\r\n * can think of and encoding it.\r\n *\r\n * We will need to refactor this at some point to neaten it up, but we should\r\n * not remove sections without EXTREMELY good reasoning, as this would reduce\r\n * security.\r\n */\r\nexport async function authenticateContextIntrinsically({\r\n context,\r\n space,\r\n // stageInProtocol,\r\n}: {\r\n context: SyncSagaContextIbGib_V1,\r\n space: IbGibSpaceAny,\r\n // /**\r\n // * @see {@link StageInProtocol}\r\n // */\r\n // stageInProtocol: StageInProtocol,\r\n}): Promise<string[]> {\r\n const lc = `[${authenticateContextIntrinsically.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: 3c34e8f1d6ef965f98725c88459ea926)`); }\r\n\r\n const errors: string[] = [];\r\n\r\n if (!context.data) { throw new Error(`(UNEXPECTED) context.data falsy? (E: 3e4ddd0eb4b828ad489658d88d9a6326)`); }\r\n if (!context.rel8ns) { throw new Error(`(UNEXPECTED) context.rel8ns falsy? (E: 8026589d4fed69c828334ee842074326)`); }\r\n\r\n const { sagaFrame, signedSessionIdentity: currSessionIdentity } = context;\r\n if (!sagaFrame.data) { throw new Error(`(UNEXPECTED) sagaFrame.data falsy? (E: b61cc82d25984c92f75db74a5a855b26)`); }\r\n\r\n // We only sign at the context level.\r\n // If context has no signedSessionIdentity, skip authentication (anonymous or broker response).\r\n if (!currSessionIdentity) {\r\n // check the sync saga to determine if there _should_ be a session\r\n // identity according to the given sagaFrame (which could be\r\n // malicious, remember!!)\r\n // todo: add logic to SET this property when using identity, then (and only then) remove this todo.\r\n console.error(`${lc}[NAG][not thrown] sagaFrame.data.sessionIdentityTjpAddr logic needs to be added in coordinator (E: 4fc47800a1086c917a47381824280826)`);\r\n if (sagaFrame.data.sessionIdentityTjpAddr) {\r\n errors.push('Context has no session identity, but sync saga frame shows a session identity (sagaFrame.data.sessionIdentityTjpAddr is truthy). (E: 69dd6cdc2e1859c0f3d62958c4339826)')\r\n return errors; /* <<<< returns early */\r\n } else if (context.rel8ns.sessionIdentity) {\r\n errors.push('Context has no signed session identity, but context.rel8ns.sessionIdentity is truthy. (E: 96a04a8a6c88ea8bf88118f89ad8e326)')\r\n return errors; /* <<<< returns early */\r\n } else {\r\n // nothing further to authenticate\r\n if (logalot) { console.log(`${lc} context has no signedSessionIdentity and sync saga frame doesn't state there should be session identity. So nothing further to authenticate - returning early with no authentication errors. (I: d708735f9a2899ee98f762b8a09ed826)`); }\r\n return []; /* <<<< returns early */\r\n }\r\n }\r\n const currSessionIdentityAddr = getIbGibAddr({ ibGib: currSessionIdentity });\r\n\r\n // ensure the context rel8ns points to a session identity\r\n const prevSessionIdentityAddrs_accordingToContextRel8ns = context.rel8ns?.sessionIdentity ?? [];\r\n if (prevSessionIdentityAddrs_accordingToContextRel8ns.length === 0) {\r\n errors.push(`context.rel8ns.sessionIdentity is falsy/empty but context.signedSessionIdentity is present. (E: 66f906421eb2468c0b33f908a3cf2826)`);\r\n return errors; /* <<<< returns early */\r\n }\r\n\r\n if (prevSessionIdentityAddrs_accordingToContextRel8ns.length > 1) {\r\n errors.push(`context.rel8ns.sessionIdentity has multiple identity addrs. (E: 489428bfe6fdaa4cd885b938dc4c5826)`);\r\n return errors; /* <<<< returns early */\r\n }\r\n\r\n // ensure the context session identity is the immediate past of the\r\n // current session identity\r\n const prevSessionIdentityAddr = prevSessionIdentityAddrs_accordingToContextRel8ns[0];\r\n\r\n // Confirm previous session identity addr exists in space and that it is\r\n // the most recent in the session keystone's timeline\r\n\r\n const resGetLatestAddr = await getLatestAddrs({ addrs: [prevSessionIdentityAddr], space });\r\n if (!resGetLatestAddr) { throw new Error(`(UNEXPECTED) resGetLatestAddr for prevSessionIdentityAddr in space (${space.ib}) falsy? (E: 7b207e5cbcec9037ea5adbe822ead826)`); }\r\n if (!resGetLatestAddr.data) { throw new Error(`(UNEXPECTED) resGetLatestAddr.data for prevSessionIdentityAddr in space (${space.ib}) falsy? (E: de4eb8d730c8c4dcb59c8b9c79277826)`); }\r\n if (!resGetLatestAddr.data.success) {\r\n throw new Error(`(UNEXPECTED) resGetLatestAddr.data.success falsy? (E: c94298dfd9684ad6a87eb748459aa826)`);\r\n }\r\n const { latestAddrsMap } = resGetLatestAddr.data;\r\n if (!latestAddrsMap) { throw new Error(`(UNEXPECTED) resGetLatestAddr.data.latestAddrsMap falsy? (E: 19f1fd5fe798cf2e5fa923919169d826)`); }\r\n if (Object.keys(latestAddrsMap).length !== 1) {\r\n throw new Error(`(UNEXPECTED) Object.keys(latestAddrsMap).length !== 1? (E: fe526a0747589c6427a8bcc86da34a26)`);\r\n }\r\n const prevSessionIdentityAddr_latest = latestAddrsMap[prevSessionIdentityAddr];\r\n if (!prevSessionIdentityAddr_latest) {\r\n errors.push(`prevSessionIdentityAddr (${prevSessionIdentityAddr}) not found in space (${space.ib}). this should have been the incoming prevSessionIdentityAddr (E: f6d042bd6b54819998653228dee34226)`);\r\n return errors; /* <<<< returns early */\r\n }\r\n if (prevSessionIdentityAddr !== prevSessionIdentityAddr_latest) {\r\n if (prevSessionIdentityAddr_latest === currSessionIdentityAddr) {\r\n // this is ok? if the sender peer is calling this just to validate **before sending**, then this will be the case. If the receiver is calling this code before continuing the sync/at the start of continuing the sync, then this will not hit.\r\n // debugger; // in sync saga context auth, want to know if this hits...this does hit, so my thoughts on the innerspace/sender peer seem to be correct\r\n } else {\r\n // debugger; // in sync saga context auth, want to know if this hits...so far this does NOT hit\r\n errors.push(`context.rel8ns.sessionIdentity does not point to the most recent in the space (${space.ib}). (E: 2f8288f53c87b6aa47bd2178d9df0c26)`)\r\n\r\n // #region debug error keystone\r\n console.log(`context: ${pretty(toDto({ ibGib: context }))}`)\r\n console.log(`prevSessionIdentityAddr (context.rel8ns.sessionIdentity): ${prevSessionIdentityAddr}`)\r\n console.log(`prevSessionIdentityAddr_latest: ${prevSessionIdentityAddr_latest}`)\r\n console.log(`currSessionIdentity (context.signedSessionIdentity): ${pretty(toDto({\r\n ibGib: {\r\n ib: currSessionIdentity.ib,\r\n gib: currSessionIdentity.gib,\r\n rel8ns: currSessionIdentity.rel8ns,\r\n data: {\r\n ...currSessionIdentity.data,\r\n challengePools: currSessionIdentity.data.challengePools.map(p => {\r\n return { ...p, challenges: {} }\r\n }),\r\n } satisfies Partial<KeystoneData_V1>,\r\n\r\n }\r\n }))}`)\r\n console.log(`currSessionIdentityAddr: ${currSessionIdentityAddr}`)\r\n\r\n // #endregion debug error keystone\r\n return errors; /* <<<< returns early */\r\n }\r\n }\r\n\r\n const resGetPrevSessionIdentity = await getFromSpace({ addr: prevSessionIdentityAddr, space });\r\n if (!resGetPrevSessionIdentity.success || resGetPrevSessionIdentity.ibGibs?.length !== 1) {\r\n errors.push(`could not fetch latest sender identity ${prevSessionIdentityAddr} from space (${space.ib}). (E: fd48c3e64c9fa4efd8a1f8280af18226)`);\r\n return errors;\r\n }\r\n const prevSessionIdentity = resGetPrevSessionIdentity.ibGibs[0] as KeystoneIbGib_V1;\r\n\r\n // get the session identity tjp, which has frame details that link back\r\n // to the identity that authorized the session\r\n const sessionIdentityTjp =\r\n await getTjpIbGib({ ibGib: prevSessionIdentity, naive: true, space }) as KeystoneIbGib_V1 | undefined;\r\n if (!sessionIdentityTjp) { throw new Error(`(UNEXPECTED) couldn't get sessionIdentityTjp in space (${space.ib})? we have already gotten the identity itself in the space, so we would expect the entire timeline to exist in it. (E: 9be0382ff1c8a0e77645ea38c096f826)`); }\r\n const sessionIdentityTjpAddr = getIbGibAddr({ ibGib: sessionIdentityTjp });\r\n if (sessionIdentityTjpAddr !== sagaFrame.data.sessionIdentityTjpAddr) {\r\n throw new Error(`(UNEXPECTED) sessionIdentityTjpAddr !== sagaFrame.data.sessionIdentityTjpAddr? (E: c9a4ad5c2728fe38e86afc58e4abaf26)`);\r\n }\r\n\r\n const sessionGenesisFrameDetails = sessionIdentityTjp.data.frameDetails as SessionGenesisFrameDetails;\r\n if (!sessionGenesisFrameDetails) {\r\n errors.push(`Invalid session identity tjp: sessionIdentityTjp.data.frameDetails is falsy. (E: 0187f8f804a84256281720586620b826)`);\r\n return errors; /* <<<< returns early */\r\n }\r\n const { senderIdentityAddr, senderIdentityTjpAddr } = sessionGenesisFrameDetails;\r\n if (!senderIdentityAddr) { throw new Error(`sessionGenesisFrameDetails.senderIdentityAddr falsy (E: 02a0c80a3ead9e3af8af4cf3b156e826)`); }\r\n if (!senderIdentityTjpAddr) { throw new Error(`sessionGenesisFrameDetails.senderIdentityTjpAddr falsy (E: 271928090ff5dc56d4bb63d8d5c68826)`); }\r\n\r\n const resGetLatestAddr_senderIdentity =\r\n await getLatestAddrs({ addrs: [senderIdentityTjpAddr, senderIdentityAddr], space });\r\n if (!resGetLatestAddr_senderIdentity) { throw new Error(`(UNEXPECTED) resGetLatestAddr_senderIdentity for prevSessionIdentityAddr in space (${space.ib}) falsy? (E: 2e4ae8083b6fb7cbb8fae2a519062926)`); }\r\n if (!resGetLatestAddr_senderIdentity.data) { throw new Error(`(UNEXPECTED) resGetLatestAddr_senderIdentity.data for prevSessionIdentityAddr in space (${space.ib}) falsy? (E: 2e231850c2a898cc282b4b2841056826)`); }\r\n if (!resGetLatestAddr_senderIdentity.data.success) {\r\n throw new Error(`(UNEXPECTED) resGetLatestAddr_senderIdentity.data.success falsy? (E: e93508f03e0475925875b00746ffd826)`);\r\n }\r\n const { latestAddrsMap: latestAddrsMap_senderIdentity } = resGetLatestAddr_senderIdentity.data;\r\n if (!latestAddrsMap_senderIdentity) { throw new Error(`(UNEXPECTED) resGetLatestAddr_senderIdentity.data.latestAddrsMap falsy? (E: 87a91e3f9968ad9ba79cdfe8cd878326)`); }\r\n if (Object.keys(latestAddrsMap_senderIdentity).length !== 2 && senderIdentityTjpAddr !== senderIdentityAddr) {\r\n throw new Error(`(UNEXPECTED) Object.keys(latestAddrsMap_senderIdentity).length !== 2 && senderIdentityTjpAddr !== senderIdentityAddr? (E: fe46bd584853d8e1e8e2d11f52012826)`);\r\n }\r\n // these two should be the same, we're just confirming that they're both\r\n // on the same timeline.\r\n const senderIdentityTjpAddr_latest = latestAddrsMap_senderIdentity[senderIdentityTjpAddr];\r\n const senderIdentityAddr_latest = latestAddrsMap_senderIdentity[senderIdentityAddr];\r\n if (!senderIdentityAddr_latest) { throw new Error(`(UNEXPECTED) senderIdentityAddr_latest falsy? (E: e151798ae2e9241578d09948937c4b26)`); }\r\n if (senderIdentityTjpAddr_latest !== senderIdentityAddr_latest) {\r\n throw new Error(`senderIdentityTjpAddr_latest !== senderIdentityAddr_latest (E: 52478a1053589e72665031a853cc1826)`);\r\n }\r\n\r\n // ATOW, we're only allowing a single sync to occur on an identity at\r\n // any given time (which makes sense). We also are assuming that the\r\n // sender identity is not doing anything ELSE at this time, which in\r\n // the (far) future may change. So the user couldn't edit their primary\r\n // identity's profile, description, etc., while the sync is in progress.\r\n // This may ultimately be asking too much though. But for now, we'll\r\n // enforce that the latest senderIdentity addr should be that addr that\r\n // authorized the session keystone.\r\n // if (senderIdentityAddr_latest !== senderIdentityAddr) {\r\n // errors.push(`The senderIdentityAddr referenced in the session keystone's genesis frameDetails (${senderIdentityAddr}) is DIFFERENT than the latest sender identity addr (${senderIdentityAddr_latest}). This means that the sender has done something besides the current sync operation, which isn't supported at this time. (E: a02598271b48cbeb584e45abde121826)`);\r\n // return errors; /* <<<< returns early */\r\n // }\r\n\r\n // now we confirm the other direction: sender identity should have been\r\n // signed with \"sync\" verb and targeting the sessionIdentity tjp\r\n // (genesis) frame.\r\n const resGetSenderIdentity_latest = await getFromSpace({\r\n addr: senderIdentityAddr_latest,\r\n space,\r\n });\r\n if (!resGetSenderIdentity_latest.success || resGetSenderIdentity_latest.ibGibs?.length !== 1) {\r\n errors.push(`could not fetch latest sender identity ${prevSessionIdentityAddr} from space (${space.ib}). (E: 3565ff0ed458f5a2384c40b16e849826)`);\r\n return errors; /* <<<< returns early */\r\n }\r\n const senderIdentity_latest = resGetSenderIdentity_latest.ibGibs[0] as KeystoneIbGib_V1;\r\n if (!senderIdentity_latest.data.proofs) {\r\n errors.push(`Invalid sender identity. Proofs empty/falsy. (E: ebf488853061614d2b5b137828119526)`);\r\n return errors; /* <<<< returns early */\r\n }\r\n const syncClaim = senderIdentity_latest.data.proofs.find(p =>\r\n p.claim.verb === KEYSTONE_VERB_SYNC\r\n )?.claim;\r\n if (!syncClaim) {\r\n errors.push(`Most recent senderIdentity has no proof whose claim.verb === ${KEYSTONE_VERB_SYNC}. (E: b0f488ecccbbfe43d9a0b7c8a29d7826)`);\r\n return errors; /* <<<< returns early */\r\n }\r\n if (syncClaim.target !== sessionIdentityTjpAddr) {\r\n errors.push(`Most recent sender identity claim has claim.verb === ${KEYSTONE_VERB_SYNC} but DOES NOT target expected session identity addr ${prevSessionIdentityAddr}. (E: 3e7f18d99848969be8586423d5ccb826)`);\r\n return errors;\r\n }\r\n\r\n const keystoneSvc = new KeystoneService_V1();\r\n const transitionErrors = await keystoneSvc.validate({\r\n currentIbGib: currSessionIdentity,\r\n prevIbGib: prevSessionIdentity,\r\n });\r\n if (transitionErrors.length > 0) {\r\n errors.push(`Invalid session identity transition: ${transitionErrors.join(', ')} (E: da1c81c6d3c86aec3254f48fe7514226)`);\r\n }\r\n\r\n // we have a valid keystone evolution/signing, but was it specifically\r\n // for this incoming context? verify that the signing targets context.\r\n const contextAddr = getIbGibAddr({ ibGib: context });\r\n const targetsThisContext =\r\n currSessionIdentity.data?.proofs?.some(p => p.claim.target === contextAddr);\r\n if (!targetsThisContext) {\r\n errors.push(`Session identity signature does not target current context ibgib (${contextAddr}). (E: acae68938c287178c878d1b88bebb826)`);\r\n }\r\n\r\n return errors;\r\n } catch (error) {\r\n const emsg = `${lc} ${extractErrorMsg(error)}`;\r\n console.error(emsg);\r\n return [`authentication produced an error: ${emsg} (E: 45e014b82af81993d936611ca6fc4d26)`];\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n}\r\n", "/**\r\n * @module SyncPeer_V1 witness class for base class plumbing of sync peers.\r\n *\r\n * You are expected to implement concrete peer classes for concrete architecture.\r\n */\r\n\r\nimport { extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';\r\nimport { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';\r\nimport { IbGib_V1 } from '@ibgib/ts-gib/dist/V1/types.mjs';\r\n\r\nimport { GLOBAL_LOG_A_LOT } from '../../core-constants.mjs';\r\nimport { SubjectWitness } from '../../common/pubsub/subject/subject-types.mjs';\r\nimport { SyncSagaContextIbGib_V1 } from '../sync-saga-context/sync-saga-context-types.mjs';\r\nimport {\r\n ConnectSyncPeerOpts, InitializeSyncPeerOpts, SyncPeerData_V1,\r\n SyncPeerRel8ns_V1, SyncPeerWitness\r\n} from './sync-peer-types.mjs';\r\nimport { LightWitnessBase_V1 } from '../../witness/light-witness-base-v1.mjs';\r\nimport { newupSubject } from '../../common/pubsub/subject/subject-helper.mjs';\r\nimport { authenticateContextIntrinsically, validateContextAndSagaFrame } from '../sync-saga-context/sync-saga-context-helpers.mjs';\r\nimport { getFromSpace } from '../../witness/space/space-helper.mjs';\r\nimport { getFullSyncSagaHistory, deriveSessionSecret } from '../sync-helpers.mjs';\r\nimport { SessionGenesisFrameDetails, SyncSagaFrameDependencyGraph } from '../sync-types.mjs';\r\nimport { KeystoneService_V1 } from '../../keystone/keystone-service-v1.mjs';\r\nimport { KeystoneIbGib_V1 } from '../../keystone/keystone-types.mjs';\r\nimport { KEYSTONE_VERB_CONNECT, KEYSTONE_VERB_SYNC, POOL_ID_CONNECT, } from '../../keystone/keystone-constants.mjs';\r\nimport { getTjpAddr } from '../../common/other/ibgib-helper.mjs';\r\nimport { IbGibAddr } from '@ibgib/ts-gib/dist/types.mjs';\r\n\r\nconst logalot = GLOBAL_LOG_A_LOT;\r\n\r\n\r\n/**\r\n * Abstract witness for talking to a Sync Peer (e.g. Remote Node or Local Simulator).\r\n *\r\n * Takes a SyncSagaContext (Request) and returns a SyncSagaContext (Response).\r\n *\r\n * Implements the core \"Sync Protocol Transport\" logic. Once connected, does:\r\n * 1. Push Context & Dependencies (Sender -> Receiver)\r\n * 2. Send Request (RPC)\r\n * 3. Pull Response & Dependencies (Receiver -> Sender)\r\n */\r\nexport abstract class SyncPeer_V1<\r\n TConnectOpts extends ConnectSyncPeerOpts = ConnectSyncPeerOpts,\r\n TInitializeOpts extends InitializeSyncPeerOpts = InitializeSyncPeerOpts\r\n> extends LightWitnessBase_V1<SyncPeerData_V1, SyncPeerRel8ns_V1>\r\n implements SyncPeerWitness<TInitializeOpts> {\r\n\r\n protected lc: string = `[${SyncPeer_V1.name}]`;\r\n\r\n public opts: TInitializeOpts | undefined;\r\n public payloadIbGibsDomainReceived$!: SubjectWitness<IbGib_V1>;\r\n public currentSessionIdentity: KeystoneIbGib_V1 | undefined;\r\n public get currentSessionIdentityAddr(): IbGibAddr | undefined {\r\n return this.currentSessionIdentity ?\r\n getIbGibAddr({ ibGib: this.currentSessionIdentity }) :\r\n undefined;\r\n }\r\n\r\n // public getSenderIdentity(): KeystoneIbGib_V1 | undefined {\r\n // return this.opts?.senderIdentity;\r\n // }\r\n\r\n public async signContext({\r\n contextAddr,\r\n }: {\r\n contextAddr: IbGibAddr;\r\n }): Promise<KeystoneIbGib_V1 | undefined> {\r\n const lc = `${this.lc}[${this.signContext.name}]`;\r\n try {\r\n if (!this.currentSessionIdentity) {\r\n return undefined;\r\n }\r\n if (!this.opts) { throw new Error(`opts not initialized. (E: bcf5978aed789b0ebcbdc51971ebe826)`); }\r\n const { fnSenderSecret, sagaId, localMetaspace, localSpace } = this.opts;\r\n if (!fnSenderSecret) { throw new Error(`fnSenderSecret not initialized. (E: 207fd292a2e8c53c05fd0a74a4ae6d26)`); }\r\n if (!sagaId) { throw new Error(`sagaId not initialized. (E: f2e35cc13ed873b638116188119d1826)`); }\r\n\r\n const senderSecret = await fnSenderSecret();\r\n const sessionSecret = await deriveSessionSecret({ senderSecret, sagaId });\r\n\r\n const keystoneSvc = new KeystoneService_V1();\r\n const evolved = await keystoneSvc.sign({\r\n latestKeystone: this.currentSessionIdentity,\r\n masterSecret: sessionSecret,\r\n claim: {\r\n verb: KEYSTONE_VERB_SYNC,\r\n target: contextAddr,\r\n },\r\n metaspace: localMetaspace,\r\n space: localSpace,\r\n });\r\n\r\n this.currentSessionIdentity = evolved;\r\n return evolved;\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Evolves the session identity (S_n -> S_n+1) solving the demanded connect challenges.\r\n */\r\n public async signContextConnect({\r\n challengeUuid,\r\n demandedIds,\r\n }: {\r\n challengeUuid: string;\r\n demandedIds: string[];\r\n }): Promise<KeystoneIbGib_V1 | undefined> {\r\n const lc = `${this.lc}[${this.signContextConnect.name}]`;\r\n try {\r\n if (!this.currentSessionIdentity) {\r\n return undefined;\r\n }\r\n if (!this.opts) { throw new Error(`opts not initialized. (E: bcf5978aed789b0ebcbdc51971ebe826)`); }\r\n const { fnSenderSecret, sagaId, localMetaspace, localSpace } = this.opts;\r\n if (!fnSenderSecret) { throw new Error(`fnSenderSecret not initialized. (E: 207fd292a2e8c53c05fd0a74a4ae6d26)`); }\r\n if (!sagaId) { throw new Error(`sagaId not initialized. (E: f2e35cc13ed873b638116188119d1826)`); }\r\n\r\n const senderSecret = await fnSenderSecret();\r\n const sessionSecret = await deriveSessionSecret({ senderSecret, sagaId });\r\n\r\n const keystoneSvc = new KeystoneService_V1();\r\n const evolved = await keystoneSvc.sign({\r\n latestKeystone: this.currentSessionIdentity,\r\n masterSecret: sessionSecret,\r\n poolId: POOL_ID_CONNECT,\r\n requiredChallengeIds: demandedIds,\r\n claim: {\r\n verb: KEYSTONE_VERB_CONNECT,\r\n target: challengeUuid,\r\n },\r\n metaspace: localMetaspace,\r\n space: localSpace,\r\n });\r\n\r\n this.currentSessionIdentity = evolved;\r\n return evolved;\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n }\r\n }\r\n\r\n\r\n get classname(): string {\r\n if (!this.data) { throw new Error(`(UNEXPECTED) this.data falsy? (E: 1ab1841e9338b54f3aa615fa37024826)`); }\r\n if (!this.data.classname) { throw new Error(`invalid peer. this.data.classname is falsy (E: b0ee28a0abb84a06588d9de7afcef826)`); }\r\n return this.data.classname;\r\n }\r\n\r\n constructor(initialData: SyncPeerData_V1, initialRel8ns?: SyncPeerRel8ns_V1) {\r\n super(initialData, initialRel8ns);\r\n }\r\n\r\n public async initialize(): Promise<void> {\r\n this.payloadIbGibsDomainReceived$ = await newupSubject<IbGib_V1>();\r\n }\r\n\r\n /**\r\n * Establishes the connection context.\r\n *\r\n * This method provides boilerplate error handling and logging,\r\n * delegating the actual connection logic to `connectImpl`.\r\n */\r\n public async connect(opts: TConnectOpts): Promise<void> {\r\n const lc = `${this.lc}[${this.connect.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: ad89d8137351662fb8a30114a1fa4826)`); }\r\n\r\n await this.preConnectCheck(opts);\r\n await this.connectImpl(opts);\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n }\r\n\r\n /**\r\n * Concrete pre-connect check. Should throw if connect conditions are not\r\n * met.\r\n *\r\n * Use this to check what {@link opts} are, as well as any other state per\r\n * concrete sync peer.\r\n *\r\n * @see {@link connect}\r\n * @see {@link connectImpl}\r\n */\r\n protected abstract preConnectCheck(opts: TConnectOpts): Promise<void>;\r\n\r\n /**\r\n * Concrete implementation for establishing the connection context.\r\n *\r\n * This MUST be implemented by subclasses to handle transport-specific\r\n * negotiation (e.g., WebSocket upgrade)\r\n */\r\n protected abstract connectImpl(opts: TConnectOpts): Promise<void>;\r\n\r\n /**\r\n * Pre-connect phase: establishes session identity.\r\n *\r\n * Shared base implementation:\r\n * 1. Derives `sessionSecret = KDF(senderSecret, sagaId)`.\r\n * 2. Creates session keystone genesis S (connect + sync pools) in `localSpace`.\r\n * 3. Evolves `senderIdentity` \u2192 `newSenderIdentity` (I1) with a `sync`\r\n * claim targeting S^Stjp, stored in `localSpace`.\r\n * 4. Delegates posting of both keystones to the receiver via the abstract\r\n * hook {@link postEstablishToReceiver} (peer-specific transport).\r\n *\r\n * Returns `undefined` (no-op) if no `senderIdentity` was provided in opts.\r\n *\r\n * @returns The session keystone genesis (S^Stjp) so the coordinator can\r\n * hold a reference for subsequent per-turn signing. The name\r\n * `newSenderIdentity` (I1) is scoped only within this method.\r\n */\r\n public async establishSessionIdentity(): Promise<void> {\r\n const lc = `${this.lc}[${this.establishSessionIdentity.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: f2a1b3c4d5e6f7a8b9c0d1e2f3a4b526)`); }\r\n\r\n if (!this.opts) { throw new Error(`(UNEXPECTED) this.opts falsy? Call initializeOpts first. (E: a1b2c3d4e5f6a7b8c9d0e1f2a3b4c526)`); }\r\n\r\n const { senderIdentity, fnSenderSecret, senderDomainAddr, sagaId, localMetaspace, localSpace } = this.opts;\r\n\r\n // No identity provided \u2014 anonymous sync, nothing to establish.\r\n if (!senderIdentity || !fnSenderSecret) {\r\n if (logalot) { console.log(`${lc} no senderIdentity/fnSenderSecret \u2014 skipping establish (I: f29348a77d1542326d14043ea4b69126)`); }\r\n return undefined;\r\n }\r\n\r\n if (!senderDomainAddr) {\r\n throw new Error(`(UNEXPECTED) senderDomainAddr falsy but senderIdentity/fnSenderSecret truthy? if identity is used, senderDomainAddr must be provided. (E: c288fa8e9d3d82fc)`);\r\n }\r\n const senderIdentityAddr = getIbGibAddr({ ibGib: senderIdentity });\r\n const senderIdentityTjpAddr = getTjpAddr({ ibGib: senderIdentity });\r\n if (!senderIdentityTjpAddr) { throw new Error(`(UNEXPECTED) senderIdentityTjpAddr falsy? (E: d5d8c3ab25a83a2c127904fe96de1526)`); }\r\n\r\n if (!sagaId) { throw new Error(`(UNEXPECTED) sagaId falsy? Must be set in initializeOpts before calling establishSessionIdentity. (E: c6ba389d51b8af07d82458f875cf9826)`); }\r\n\r\n const senderSecret = await fnSenderSecret();\r\n if (!senderSecret) { throw new Error(`senderSecret falsy. senderSecret required. (E: 1a8b0298bf78cbdf284b7988983b9826)`); }\r\n const sessionSecret = await deriveSessionSecret({ senderSecret, sagaId });\r\n\r\n const keystoneSvc = new KeystoneService_V1();\r\n\r\n // Step 1: Create S genesis in localSpace.\r\n // Pool configs must be provided via opts (set by coordinator before calling establish).\r\n if (!this.opts.sessionConnectPoolConfig) { throw new Error(`(UNEXPECTED) opts.sessionConnectPoolConfig falsy? (E: 3351fd566eb8bbd2f821bb08c4419826)`); }\r\n if (!this.opts.sessionSyncPoolConfig) { throw new Error(`(UNEXPECTED) opts.sessionSyncPoolConfig falsy? (E: dbffa810d9e7ff6079088deb5b8e7826)`); }\r\n\r\n // session genesis keystone should have soft links to both\r\n // targetAddrs and the sender identity that spawned it.\r\n const frameDetails: SessionGenesisFrameDetails = {\r\n senderIdentityAddr,\r\n senderIdentityTjpAddr,\r\n }\r\n if (this.opts.targetAddrs) {\r\n frameDetails.targetAddrs = this.opts.targetAddrs\r\n }\r\n const sessionIdentity = await keystoneSvc.genesis({\r\n masterSecret: sessionSecret,\r\n configs: [this.opts.sessionConnectPoolConfig, this.opts.sessionSyncPoolConfig],\r\n frameDetails,\r\n metaspace: localMetaspace,\r\n space: localSpace,\r\n });\r\n const sessionIdentityAddr = getIbGibAddr({ ibGib: sessionIdentity });\r\n\r\n // Step 2: Evolve senderIdentity \u2192 newSenderIdentity (I1) with sync claim.\r\n const newSenderIdentity = await keystoneSvc.sign({\r\n latestKeystone: senderIdentity,\r\n masterSecret: senderSecret,\r\n claim: {\r\n verb: KEYSTONE_VERB_SYNC,\r\n target: sessionIdentityAddr,\r\n },\r\n metaspace: localMetaspace,\r\n space: localSpace,\r\n });\r\n\r\n // Step 3: Post both to the receiver (peer-specific).\r\n await this.postEstablishToReceiver({ newSenderIdentity, sessionIdentity });\r\n\r\n this.currentSessionIdentity = sessionIdentity;\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n }\r\n\r\n /**\r\n * Peer-specific hook: transmits `newSenderIdentity` (I1) and\r\n * `sessionIdentity` (S) to the receiver's domain registry.\r\n *\r\n * - **Innerspace**: puts both into `receiverMetaspace` / `receiverSpace`.\r\n * - **WebSocket**: HTTP POST to the domain provider's keystone endpoint.\r\n */\r\n protected abstract postEstablishToReceiver(opts: {\r\n newSenderIdentity: KeystoneIbGib_V1;\r\n sessionIdentity: KeystoneIbGib_V1;\r\n }): Promise<void>;\r\n\r\n /**\r\n * base implementation just sets the opts property.\r\n *\r\n * override this in concrete classes for further initialization code\r\n * specific to the sender.\r\n *\r\n * @see {@link SyncPeerWitness.opts}\r\n */\r\n public async initializeOpts(opts: TInitializeOpts): Promise<void> {\r\n const lc = `${this.lc}[${this.initializeOpts.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: 31bd5fda37c89fa37fbaf14daf5fe726)`); }\r\n this.opts = opts;\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n }\r\n\r\n public setOptionalOpts(arg: Partial<TInitializeOpts>): void {\r\n const lc = `${this.lc}[${this.setOptionalOpts.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: ae5ddbd3577db267f84743175a736626)`); }\r\n if (!this.opts) { throw new Error(`(UNEXPECTED) this.opts falsy? (E: 0dd4d6080a6e2f31d86cf4d86e11b826)`); }\r\n\r\n if (logalot) { console.log(`${lc} updating opts. arg keys: ${Object.keys(arg)} (I: 452d78a558f8fc3468c8e2e68c70b226)`); }\r\n\r\n this.opts = { ...this.opts, ...arg };\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n }\r\n\r\n // public setOptionalOpts({\r\n // senderTempSpace,\r\n // }: {\r\n // senderTempSpace: IbGibSpaceAny,\r\n // }): void {\r\n // const lc = `${this.lc}[${this.setOptionalOpts.name}]`;\r\n // try {\r\n // if (logalot) { console.log(`${lc} starting... (I: a17188953e38f07b1884e498ac490b26)`); }\r\n // if (!this.opts) { throw new Error(`(UNEXPECTED) this.opts falsy? (E: bdf00fe4b89b07ea78860d6ebe922e26)`); }\r\n\r\n // this.opts.senderTempSpace = senderTempSpace;\r\n // } catch (error) {\r\n // console.error(`${lc} ${extractErrorMsg(error)}`);\r\n // throw error;\r\n // } finally {\r\n // if (logalot) { console.log(`${lc} complete.`); }\r\n // }\r\n // }\r\n\r\n protected async authenticateAndValidate({\r\n context,\r\n }: {\r\n context: SyncSagaContextIbGib_V1,\r\n }): Promise<void> {\r\n const lc = `${this.lc}[${this.authenticateAndValidate.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: add238055cd84a222c5b8c89913af526)`); }\r\n\r\n if (!this.opts) { throw new Error(`(UNEXPECTED) opts falsy in authenticateValidateAuthorize (E: b7e5a8ad99d84e1ba8d8f7facd288826)`); }\r\n const { localSpace } = this.opts;\r\n\r\n // first authenticate, because invalid authn is a non-starter\r\n // (already validated intrinsically)\r\n const authenticationErrors = await authenticateContextIntrinsically({\r\n context,\r\n space: localSpace,\r\n });\r\n if (authenticationErrors.length > 0) {\r\n throw new Error(`invalid context authentication. authenticationErrors: ${authenticationErrors} (E: da89da5ee1269aeb78952d475d607526)`);\r\n }\r\n // next, we have a valid authn, which should point to the\r\n // context. But is that context and the saga data it contains valid?\r\n // Does the authentication actually point to this context?\r\n const validationErrors = await validateContextAndSagaFrame({ context, });\r\n if (validationErrors.length > 0) {\r\n throw new Error(`invalid context received. validationErrors: ${validationErrors} (E: 8b34c875c968af29bc433138e57a7826)`);\r\n }\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n }\r\n /**\r\n * Witness the synchronization context (Send/Receive).\r\n *\r\n * At this point in code, we are sending the context OUTGOING. The {@link context} should\r\n * have a fully populated {@link SyncSagaContextIbGib_V1.sagaFrame}\r\n *\r\n * @param arg The OUTGOING context (Request).\r\n * @returns The INCOMING context (Response), or undefined if failed/empty.\r\n */\r\n override async witness(context: SyncSagaContextIbGib_V1): Promise<SyncSagaContextIbGib_V1 | undefined> {\r\n const lc = `${this.lc}[${this.witness.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting...`); }\r\n\r\n if (!this.opts) { throw new Error(`(UNEXPECTED) this.opts falsy? Concrete class should have initialized sender opts by now. (E: 0b9e28287318fdf8bf9f5a6886a24826)`); }\r\n\r\n // NOTE: There are three basic types of peers:\r\n // * local-only\r\n // * this peer is both sender/receiver peer\r\n // * for local merges and relatively fast spaces\r\n // * proxy to remote space\r\n // * this peer is both sender/receiver peer\r\n // * works directly with remote/outerspaces via API calls\r\n // * Less efficient over-the-wire xfer due to chatiness\r\n // * symmetric node sender/receiver peers\r\n // * separate sender/receiver classes\r\n // * e.g., SyncPeerClient[Substrate]Sender_V1,\r\n // SyncPeerClient[Substrate]Receiver_V1\r\n // * More efficient over-the-wire xfer\r\n // * Most difficult to mentally model\r\n // * sender.witness does the pushing out\r\n // * what the sender/initiator's coordinator has a reference to\r\n // * receiver.witness does the coming in\r\n // * lives on a server/remote instance with its own coordinator\r\n // instance\r\n // * must do its own validation/authn/authz for possible MITM\r\n // issues\r\n // The following is a sketch where some of these may be blurred\r\n\r\n // persist the context, sagaframe, authentication details ONLY in the receiver's durable space\r\n // if sending domain ibgibs...\r\n // verify the domain ibgibs intrinsically.\r\n // persist the domain ibgibs in the receiver's temp space (push all addrs?)\r\n // await until all domain ibgibs are in receiver's temp space\r\n // process the context with the receiver's coordinator to get a new response context\r\n // analyze the response context\r\n // validate context intrinsically\r\n // persist the response context's dependency graph (context, saga frame and msg(s))\r\n // if response has payload domain ibgibs,\r\n // spin off...\r\n // pull domain ibgibs to local temp space\r\n // publish domain ibgibs to observable\r\n // when all domain ibgibs are pulled, publish complete to the observable\r\n // return resulting context ibgib (which the caller should get BEFORE the domain ibgibs observable completes)\r\n\r\n if (!context.sagaFrame) { throw new Error(`context.sagaFrame falsy. (E: a33dd88aa108e2bad9e885885731ce26)`); }\r\n\r\n // this is not just happening on the client, but this peer may be\r\n // the one receiving the context as well.\r\n\r\n // const sagaHistory_beforeSend = await getFullSyncSagaHistory({\r\n // sagaIbGib: context.sagaFrame,\r\n // space: this.opts.localSpace\r\n // });\r\n\r\n await this.authenticateAndValidate({ context });\r\n\r\n // at this point, we have a valid, authenticated, authorized context\r\n\r\n // execute the transfer of control domain ibgibs & outgoing payload\r\n // ibgibs...\r\n const response = await this.sendContextRequest(context);\r\n\r\n if (response) {\r\n // at this point, all outgoing payload domain ibgibs have been sent.\r\n // we have received the response context, wherein the sync saga\r\n // frame/msg stone(s) should be evolved. Depending\r\n // on the concrete implementation, if there are domain ibgibs to\r\n // receive, they may still be transferring. These will be published\r\n // to this.payloadIbGibsDomainReceived$\r\n\r\n const sagaHistory_afterSend = await getFullSyncSagaHistory({\r\n sagaIbGib: context.sagaFrame,\r\n space: this.opts.localSpace\r\n });\r\n\r\n // NOTE: I think this is the wrong place for this, as we must do this in the peer **before** storing any control ibgibs. This needs to be done in the continueSync I _think_ (not sure yet)\r\n // await this.authenticateValidateAuthorize({\r\n // context, fullSagaHistory: sagaHistory_afterSend,\r\n // });\r\n\r\n return response;\r\n } else {\r\n // response falsy. we could be done, or this could be an error.\r\n if (logalot) { console.log(`${lc} No response from peer. this may be normal if we just sent the very last commit frame. (I: 1855b7728c8898e1f9c001f8170ba826)`); }\r\n\r\n return undefined;\r\n }\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n }\r\n\r\n /**\r\n * At this point, this is a validated, authenticated and authorized context\r\n * to send.\r\n *\r\n * This is responsible for:\r\n *\r\n * * physical sending outgoing {@link context}, the sync saga frame and msg\r\n * stone(s)...\r\n * * AND sending OUTGOING domain ibgibs\r\n * {@link SyncSagaContextIbGib_V1.payloadIbGibsDomain}\r\n * * getting back the other end's resultant context ibgib, sync saga frame\r\n * and msg stone(s) in their entirety...\r\n * * AND stream/receiving the RESPONSE payload domain ibgibs, publishing\r\n * these to this.payloadIbGibsDomainReceived$.\r\n * * BUT this should return as soon as the resultant context ibgib comes\r\n * back.\r\n *\r\n * So this returns the RESPONSE context, possibly BEFORE the response DOMAIN\r\n * ibgibs have been completely received/streamed. The coordinator is\r\n * responsible for awaiting this stream.\r\n *\r\n * @returns next sync saga context if another round, or undefined if we're\r\n * done. (might throw if there's an error?)\r\n */\r\n protected abstract sendContextRequest(context: SyncSagaContextIbGib_V1): Promise<SyncSagaContextIbGib_V1 | undefined>;\r\n\r\n /**\r\n * Abstract accessor to get an IbGib from the Local space/store.\r\n * Needed for inspecting rela8ns during the graph walk.\r\n *\r\n * Default implementation simply looks in senderSpace\r\n */\r\n protected async getLocalIbGib(addr: string): Promise<IbGib_V1 | undefined> {\r\n const lc = `${this.lc}[${this.getLocalIbGib.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: 27b248cb9801eeb2386b71485389a826)`); }\r\n\r\n console.warn(`${lc} possibly a bottleneck here, getLocalIbGib only gets a single ibgib... (W: 2fd448a435480e6b128f6b8bcbef4826)`);\r\n if (!this.opts) { throw new Error(`(UNEXPECTED) this.opts falsy? (E: cfb9431f2fb851f24a6c88e80c3b3326)`); }\r\n\r\n const resGet = await getFromSpace({ space: this.opts.localSpace, addr });\r\n\r\n if (resGet.success && resGet.ibGibs && resGet.ibGibs.length === 1) {\r\n const ibGib = resGet.ibGibs[0];\r\n return ibGib;\r\n } else {\r\n throw new Error(`couldn't get addr (${addr}) from local space ${this.opts.localSpace}. reason: ${resGet.errorMsg ?? 'unknown error (E: 926ef8bf4fcc299ab89dba34ea691a26)'} (E: d8a89807e471d3f8b938ab21df44cb26)`);\r\n }\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n }\r\n}\r\n", "/**\n * @module sync-websocket-peer-helpers\n *\n * Reusable, isomorphic pure validation helper functions and policies for the\n * WebSocket Sync Peer connect process.\n */\n\nimport { HashAlgorithm, extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';\nimport { getIbGibAddr, getIbAndGib } from '@ibgib/ts-gib/dist/helper.mjs';\nimport { IbGibAddr } from '@ibgib/ts-gib/dist/types.mjs';\nimport { validateIbGibAddr, validateIbGibIntrinsically } from '@ibgib/ts-gib/dist/V1/validate-helper.mjs';\nimport { getGibInfo } from '@ibgib/ts-gib/dist/V1/transforms/transform-helper.mjs';\nimport { IbGib_V1 } from '@ibgib/ts-gib/dist/V1/types.mjs';\n\nimport { GLOBAL_LOG_A_LOT } from '../../../../core-constants.mjs';\nimport {\n KeystoneReplenishStrategy, KeystoneChallengeType, KeystoneIbGib_V1,\n KeystoneSolution, KeystoneChallenge,\n KEYSTONE_CLAIM_TYPE_CHANGE_PASSWORD, KEYSTONE_CLAIM_TYPE_ADD_POOL,\n KEYSTONE_CLAIM_TYPE_REMOVE_POOL, KEYSTONE_CLAIM_TYPE_REPLACE_POOL\n} from '../../../../keystone/keystone-types.mjs';\nimport { parseKeystoneIb, validateKeystoneIb } from '../../../../keystone/keystone-helpers.mjs';\nimport { KeystoneStrategyFactory } from '../../../../keystone/strategy/keystone-strategy-factory.mjs';\nimport { KeystoneService_V1 } from '../../../../keystone/keystone-service-v1.mjs';\nimport { IbGibSpaceAny } from '../../../../witness/space/space-base-v1.mjs';\nimport { MetaspaceService } from '../../../../witness/space/metaspace/metaspace-types.mjs';\nimport { POOL_ID_CONNECT, KEYSTONE_VERB_CONNECT, KEYSTONE_VERB_SYNC, KEYSTONE_VERB_MANAGE } from '../../../../keystone/keystone-constants.mjs';\nimport { getTjpAddr } from '../../../../common/other/ibgib-helper.mjs';\n\nconst logalot = GLOBAL_LOG_A_LOT\n\n/**\n * Standard configuration defaults for the Ephemeral Session Keystone.\n */\nexport const SESSION_KEYSTONE_POLICY = {\n COMMON: {\n ALGO: HashAlgorithm.sha_256,\n TYPE: KeystoneChallengeType.hash_reveal_v1,\n ROUNDS: 2,\n REPLENISH: KeystoneReplenishStrategy.topUp,\n },\n CONNECT_POOL: {\n ID: POOL_ID_CONNECT,\n VERB: KEYSTONE_VERB_CONNECT,\n SIZE: 10,\n SELECT_SEQUENTIALLY: 2,\n SELECT_RANDOMLY: 2,\n TARGET_BINDING_COUNT: 0,\n SERVER_DEMAND_COUNT: 3,\n }\n} as const;\n\n/**\n * Resolves the deterministic dynamic upfront pre-filter challenge.\n */\nexport function getConnectChallenge(keystone: KeystoneIbGib_V1): {\n challengeId: string;\n challenge: KeystoneChallenge;\n} {\n const lc = `[${getConnectChallenge.name}]`;\n try {\n if (logalot) { console.log(`${lc} starting... (I: 3c791af2f978a00a087dfdde90884826)`); }\n\n const connectPool = (keystone.data?.challengePools ?? []).find(\n (p) => p.id === SESSION_KEYSTONE_POLICY.CONNECT_POOL.ID\n );\n if (!connectPool) {\n throw new Error(`Keystone missing \"${SESSION_KEYSTONE_POLICY.CONNECT_POOL.ID}\" pool (E: 6382e29260e4ddbac42ed18f49733526)`);\n }\n\n const challengeIds = Object.keys(connectPool.challenges).sort();\n if (challengeIds.length === 0) {\n throw new Error(`Connect pool has no challenges (E: 1ef62fdbda182a790835c8c796475226)`);\n }\n\n const challengeId = challengeIds[0];\n const challenge = connectPool.challenges[challengeId];\n return { challengeId, challenge };\n\n } catch (error) {\n console.error(`${lc} ${extractErrorMsg(error)}`);\n throw error;\n } finally {\n if (logalot) { console.log(`${lc} complete.`); }\n }\n}\n\n/**\n * Validates the upfront solution against the session keystone's first connect\n * challenge.\n */\nexport async function checkConnectSolution(\n keystone: KeystoneIbGib_V1,\n solutionValue: string\n): Promise<boolean> {\n const lc = `[${checkConnectSolution.name}]`;\n try {\n if (logalot) { console.log(`${lc} starting... (I: 166aa101e109194556e6b99575945826)`); }\n\n const connectPool = (keystone.data?.challengePools ?? []).find(\n (p) => p.id === SESSION_KEYSTONE_POLICY.CONNECT_POOL.ID\n );\n if (!connectPool) {\n return false;\n }\n\n const { challengeId, challenge } = getConnectChallenge(keystone);\n const strategy = KeystoneStrategyFactory.create({ config: connectPool.config });\n const solution: KeystoneSolution = {\n type: 'hash-reveal-v1',\n challengeId,\n poolId: SESSION_KEYSTONE_POLICY.CONNECT_POOL.ID,\n value: solutionValue\n };\n\n return await strategy.validateSolution({ solution, challenge });\n } catch (error) {\n console.error(`${lc} ${extractErrorMsg(error)}`);\n throw error;\n } finally {\n if (logalot) { console.log(`${lc} complete.`); }\n }\n}\n\n/**\n * Validates the upfront connect parameter solutions before socket connection upgrades.\n */\nexport async function validateUpfrontConnect({\n sAddr,\n solution,\n space,\n metaspace,\n}: {\n sAddr: string;\n solution: string;\n space: IbGibSpaceAny;\n metaspace: MetaspaceService;\n}): Promise<{ sAddr_tjp: string; authorizedS: KeystoneIbGib_V1 }> {\n const lc = `[${validateUpfrontConnect.name}]`;\n try {\n if (logalot) { console.log(`${lc} starting... (I: 7c21ecaf0b7f59347882bc18d8245826)`); }\n\n // 1. Initial address sanity check\n const addrErrors = validateIbGibAddr({ addr: sAddr }) ?? [];\n if (addrErrors.length > 0) {\n throw new Error(`Invalid sAddr: ${addrErrors.join(', ')} (E: 9a80cea03308ddab721eec08ffe0e826)`);\n }\n\n const { ib } = getIbAndGib({ ibGibAddr: sAddr });\n parseKeystoneIb({ ib });\n\n // 2. Fetch session keystone from storage\n const resGet = await metaspace.get({ addrs: [sAddr], space });\n if (!resGet.success || !resGet.ibGibs || resGet.ibGibs.length !== 1) {\n throw new Error(`Session keystone not found in space: ${sAddr} (E: d381a8269328dbe6b8a9e4f86c2a3626)`);\n }\n\n const authorizedS = resGet.ibGibs[0] as KeystoneIbGib_V1;\n\n // 3. Cryptographically check dynamic solution\n const isValid = await checkConnectSolution(authorizedS, solution);\n if (!isValid) {\n throw new Error(`Upfront connect solution verification failed (E: 67c5b17968b8829058925d8808d09826)`);\n }\n\n // 4. Resolve secure TJP\n const past = authorizedS.rel8ns?.past;\n const sAddr_tjp = (past && past.length > 0) ? past[0] : getIbGibAddr({ ibGib: authorizedS });\n\n return { sAddr_tjp, authorizedS };\n } catch (error) {\n console.error(`${lc} ${extractErrorMsg(error)}`);\n throw error;\n } finally {\n if (logalot) { console.log(`${lc} complete.`); }\n }\n}\n\n/**\n * Verifies the multi-turn evolved Keystone challenge proof frame.\n */\nexport async function verifyConnectProof({\n proofFrame,\n sKeystone_latest,\n challengeUuid,\n demandedIds,\n}: {\n proofFrame: KeystoneIbGib_V1;\n sKeystone_latest: KeystoneIbGib_V1;\n challengeUuid: string;\n demandedIds: string[];\n}): Promise<void> {\n const lc = `[${verifyConnectProof.name}]`;\n try {\n if (logalot) { console.log(`${lc} starting... (I: 4500528dabb80aeb98dabf886d6b2826)`); }\n\n // 1. Validate evolution structure intrinsically\n const keystoneService = new KeystoneService_V1();\n const validationErrors = await keystoneService.validate({\n prevIbGib: sKeystone_latest,\n currentIbGib: proofFrame,\n });\n\n if (validationErrors && validationErrors.length > 0) {\n throw new Error(`Proof validation failed: ${validationErrors.join(', ')} (E: e70278c90dc475a2d80d0ad8bbf1a826)`);\n }\n\n // 2. Validate connect target signature\n const proofs = proofFrame.data.proofs ?? [];\n const proof = proofs.find(p => p.claim?.verb === SESSION_KEYSTONE_POLICY.CONNECT_POOL.VERB);\n if (!proof || proof.claim?.target !== challengeUuid) {\n throw new Error(`Proof target mismatch or missing connect claim (E: e897bba1bb6161b418a630c1e30c5726)`);\n }\n\n // 3. Verify client successfully solved all demanded challenges\n const solvedIds = new Set(proof.solutions?.map(s => s.challengeId) ?? []);\n const missingIds = demandedIds.filter(id => !solvedIds.has(id));\n if (missingIds.length > 0) {\n throw new Error(`Proof is missing demanded solutions: ${missingIds.join(', ')} (E: 161329081aff00f1a8e4cf9330a62326)`);\n }\n } catch (error) {\n console.error(`${lc} ${extractErrorMsg(error)}`);\n throw error;\n } finally {\n if (logalot) { console.log(`${lc} complete.`); }\n }\n}\n\n/**\n * Isomorphic pure function to intrinsically validate, persist, and register\n * posted keystones. Shared between REST API and sync websocket receiver peers.\n */\nexport async function validateAndRegisterPostKeystones({\n ibGibs,\n metaspace,\n space\n}: {\n ibGibs: any[];\n metaspace: MetaspaceService;\n space: IbGibSpaceAny;\n}): Promise<void> {\n const lc = `[${validateAndRegisterPostKeystones.name}]`;\n try {\n if (logalot) { console.log(`${lc} starting... (I: aae81e3412c8c87bc8f3e227d81be826)`); }\n\n // 1. Intrinsic Validation\n for (const ibGib of ibGibs) {\n const errors = await validateIbGibIntrinsically({ ibGib });\n if (errors && errors.length > 0) {\n throw new Error(`Intrinsic validation failed for ${getIbGibAddr({ ibGib })}: ${errors.join(', ')} (E: 4162884c53183b58b3caaa48c26be826)`);\n }\n }\n\n // 2. Keystone-specific checks & Registration\n for (const ibGib of ibGibs) {\n if (ibGib.ib?.startsWith('keystone')) {\n // Registration handles genesis vs evolution internally via metastones\n await metaspace.registerNewIbGib({\n ibGib,\n space\n });\n }\n }\n\n // 3. Persistence\n await metaspace.put({ ibGibs, space });\n } catch (error) {\n console.error(`${lc} ${extractErrorMsg(error)}`);\n throw error;\n } finally {\n if (logalot) { console.log(`${lc} complete.`); }\n }\n}\n\n/**\n * Isomorphic pure function to validate a keystone evolution transition and\n * related S session keystones, and persist them to metaspace. Shared across\n * REST API evolve handlers and future socket evolution channels.\n */\nexport async function validateAndRegisterEvolveKeystone({\n domainAddr,\n keystoneIbGib,\n relatedKeystoneIbGibs = [],\n metaspace,\n space\n}: {\n /**\n * Address of the root parent domain identity keystone.\n */\n domainAddr: string;\n /**\n * The main evolved keystone frame being synchronized.\n */\n keystoneIbGib: KeystoneIbGib_V1;\n /**\n * Array of other keystone frames related to this evolution.\n * Distinction in intent:\n * 1. Ephemeral Session Keystones: Temporary keystones generated to verify\n * WebSocket connection sessions (under 'sync' claims, targeted via\n * claim.target = sAddr).\n * 2. Persistent Delegate Keystones: Long-lived sub-keystones registered in\n * the parent's `delegates` dictionary that are evolved concurrently\n * (e.g., during 'manage' password changes).\n */\n relatedKeystoneIbGibs?: IbGib_V1[];\n /**\n * The MetaspaceService instance.\n */\n metaspace: MetaspaceService;\n /**\n * The active storage space.\n */\n space: IbGibSpaceAny;\n}): Promise<void> {\n const lc = `[${validateAndRegisterEvolveKeystone.name}]`;\n try {\n if (logalot) { console.log(`${lc} starting... (I: 42b826a690881cd5a8fe520cbdfad826)`); }\n\n // 1. Intrinsic hash validation on primary keystone\n const intrinsicErrors = await validateIbGibIntrinsically({ ibGib: keystoneIbGib });\n if (intrinsicErrors && intrinsicErrors.length > 0) {\n throw new Error(`Intrinsic keystone validation failed: ${intrinsicErrors.join(', ')} (E: 38ea984585edc6ee88d2a698c7895826)`);\n }\n\n // 2. Proofs & Verb extraction\n const proofs = keystoneIbGib.data?.proofs ?? [];\n if (proofs.length === 0) {\n throw new Error('No proofs found in evolved keystone data (E: 399f8f51c78d722252ddb2894fdbe25)');\n }\n if (proofs.length !== 1) {\n throw new Error(`evolving keystone with proofs.length !== 1? (E: 14e058a34964dcd7181395382cc60826)`);\n }\n const claim = proofs[0].claim;\n if (!claim) { throw new Error(`proof.claim is falsy (E: 54be88be2c975ef18e571a4286928826)`); }\n const verb = claim.verb;\n if (!verb) { throw new Error(`claim.verb is falsy (E: 92cf38af58db2cd90e7132b8940fe326)`); }\n\n // 3. Load latest root Domain Identity tip in space\n const keystoneService = new KeystoneService_V1();\n let parentKeystone: KeystoneIbGib_V1;\n try {\n parentKeystone = await keystoneService.getLatestKeystone({\n addr: domainAddr,\n metaspace,\n space\n });\n } catch (error) {\n throw new Error(`Could not retrieve root Domain Identity tip for ${domainAddr}: ${extractErrorMsg(error)} (E: b73ed8aeb0d837d248718b487345d326)`);\n }\n\n const parentTjpAddr = getTjpAddr({ ibGib: parentKeystone });\n const incomingTjpAddr = getTjpAddr({ ibGib: keystoneIbGib });\n if (!incomingTjpAddr) {\n throw new Error(`Incoming keystone does not have a TJP address (E: d288fae39b7d825d)`);\n }\n\n const isDelegate = incomingTjpAddr !== parentTjpAddr;\n\n // 4. Primary Verb Branching\n switch (verb) {\n case KEYSTONE_VERB_MANAGE:\n await validateManageEvolveKeystone({\n keystoneIbGib,\n relatedKeystoneIbGibs,\n parentKeystone,\n isDelegate,\n domainAddr,\n metaspace,\n space\n });\n break;\n\n case KEYSTONE_VERB_SYNC:\n await validateSyncEvolveKeystone({\n keystoneIbGib,\n relatedKeystoneIbGibs,\n parentKeystone,\n isDelegate,\n domainAddr,\n metaspace,\n space\n });\n break;\n\n default:\n throw new Error(`Unsupported keystone evolution verb: ${verb} (E: eca4681b05486d1f784c0cb815ef9926)`);\n }\n\n } catch (error) {\n console.error(`${lc} ${extractErrorMsg(error)}`);\n throw error;\n } finally {\n if (logalot) { console.log(`${lc} complete.`); }\n }\n}\n\n/**\n * Validates and registers a keystone evolution authorized by a 'manage' verb claim.\n *\n * ## Assumptions (ATOW 07/2026)\n * - The primary Domain Identity evolution step is authorized by a single proof.\n * - Sub-verb details (`claim.details?.type`) specify the structural management operation\n * (e.g. 'change-password', 'add-pool', 'remove-pool').\n * - Under 'change-password', relatedKeystoneIbGibs contains outward delegate keystones being\n * registered or evolved concurrently.\n * - Delegates evolve independently by design, so `delegateInfo.delegateAddr` in the parent keystone\n * captures historical registration context. Active delegate tip resolution queries the space via\n * `keystoneService.getLatestKeystone({ addr: delegateTjpAddr, metaspace, space })`.\n */\nasync function validateManageEvolveKeystone({\n keystoneIbGib,\n relatedKeystoneIbGibs,\n parentKeystone,\n isDelegate,\n domainAddr,\n metaspace,\n space,\n}: {\n keystoneIbGib: KeystoneIbGib_V1;\n relatedKeystoneIbGibs: IbGib_V1[];\n parentKeystone: KeystoneIbGib_V1;\n isDelegate: boolean;\n domainAddr: IbGibAddr;\n metaspace: MetaspaceService;\n space: IbGibSpaceAny;\n}): Promise<void> {\n const lc = `[validateManageEvolveKeystone]`;\n const keystoneService = new KeystoneService_V1();\n\n // 1. Validate parent Domain Identity keystone transition from current tip in space\n const transitionErrors = await keystoneService.validate({\n currentIbGib: keystoneIbGib,\n prevIbGib: parentKeystone\n });\n if (transitionErrors && transitionErrors.length > 0) {\n throw new Error(`Parent Domain Identity evolution validation failed: ${transitionErrors.join(', ')} (E: 5212f8492ac839953842631834bcd826)`);\n }\n\n const proof = keystoneIbGib.data?.proofs?.[0];\n const claim = proof?.claim;\n const claimType = claim?.details?.type;\n\n const prevDelegates = parentKeystone.data?.delegates ?? {};\n const currDelegates = keystoneIbGib.data?.delegates ?? {};\n\n // 2. Sub-verb branching based on claim details type\n switch (claimType) {\n case KEYSTONE_CLAIM_TYPE_CHANGE_PASSWORD:\n case KEYSTONE_CLAIM_TYPE_ADD_POOL:\n case KEYSTONE_CLAIM_TYPE_REMOVE_POOL:\n case KEYSTONE_CLAIM_TYPE_REPLACE_POOL:\n default:\n // Validate all related delegate keystones provided in cargo\n for (const related of relatedKeystoneIbGibs) {\n const ibIsValid = await validateKeystoneIb({ ib: related.ib });\n if (!ibIsValid) {\n throw new Error(`Invalid related keystone ibgib. related.ib (${related.ib}) is not a valid keystone ib. (E: 89dff2f48fa8c33b449081e2478c6826)`);\n }\n\n const relatedTjp = getTjpAddr({ ibGib: related });\n if (!relatedTjp) {\n throw new Error(`Related keystone in relatedKeystoneIbGibs is missing a TJP address (E: 2fe5a68438e288ab4e86c90d81d142826)`);\n }\n const relatedAddr = getIbGibAddr({ ibGib: related });\n\n // Assert it is registered under the current delegates map of the parent\n const delegateInfo = currDelegates[relatedTjp];\n if (!delegateInfo) {\n throw new Error(`Related keystone (${relatedTjp}) is not a registered delegate under parent Domain Identity (E: 3fe5a68438e288ab4e86c90d81d142826)`);\n }\n\n const delegateIsNewlyRegistered = !prevDelegates[relatedTjp];\n if (delegateIsNewlyRegistered) {\n const delegateKeystone = related as KeystoneIbGib_V1;\n if (delegateKeystone.data?.n !== 0) {\n throw new Error(`Newly registered delegate keystone (${relatedAddr}) has data.n !== 0 (${delegateKeystone.data?.n}). Registering non-genesis delegate keystones is not supported at this time. (E: 4cdd0dee42d7d437ef6af698150cfe26)`);\n }\n const genesisErrors = await keystoneService.validateGenesisKeystone({\n keystoneIbGib: delegateKeystone\n });\n if (genesisErrors && genesisErrors.length > 0) {\n throw new Error(`Genesis validation failed for new delegate keystone ${relatedAddr}: ${genesisErrors.join(', ')} (E: d8afdc1dbed48c000455b35585dc26826)`);\n }\n } else {\n // Transition/Evolution validation against the delegate's active tip in space\n let prevDelegateTip: KeystoneIbGib_V1 | undefined;\n try {\n prevDelegateTip = await keystoneService.getLatestKeystone({\n addr: relatedTjp,\n metaspace,\n space\n });\n } catch (err) {\n throw new Error(`Could not find previous delegate tip for ${relatedTjp} in space: ${extractErrorMsg(err)} (E: 5fe5a68438e288ab4e86c90d81d142826)`);\n }\n\n const evolutionErrors = await keystoneService.validate({\n currentIbGib: related as KeystoneIbGib_V1,\n prevIbGib: prevDelegateTip\n });\n if (evolutionErrors && evolutionErrors.length > 0) {\n throw new Error(`Evolution transition validation failed for delegate keystone ${relatedAddr}: ${evolutionErrors.join(', ')} (E: 6fe5a68438e288ab4e86c90d81d142826)`);\n }\n }\n }\n break;\n }\n\n // Persist parent and related keystones\n await metaspace.put({ ibGibs: [keystoneIbGib, ...relatedKeystoneIbGibs], space });\n await metaspace.registerNewIbGib({ ibGib: keystoneIbGib, space });\n for (const related of relatedKeystoneIbGibs) {\n if (related.ib?.startsWith('keystone')) {\n await metaspace.registerNewIbGib({ ibGib: related, space });\n }\n }\n}\n\n/**\n * Validates and registers a sync delegate keystone evolution and its associated session keystone.\n *\n * ## Assumptions (ATOW 07/2026)\n * - The evolving keystone must be an authorized outward delegate (Root Domain Identity cannot sync directly).\n * - The claim verb is 'sync'.\n * - relatedKeystoneIbGibs contains the newly created session keystone (S^Stjp) target address specified in claim.target.\n */\nasync function validateSyncEvolveKeystone({\n keystoneIbGib,\n relatedKeystoneIbGibs,\n parentKeystone,\n isDelegate,\n domainAddr,\n metaspace,\n space,\n}: {\n keystoneIbGib: KeystoneIbGib_V1;\n relatedKeystoneIbGibs: IbGib_V1[];\n parentKeystone: KeystoneIbGib_V1;\n isDelegate: boolean;\n domainAddr: IbGibAddr;\n metaspace: MetaspaceService;\n space: IbGibSpaceAny;\n}): Promise<void> {\n const lc = `[validateSyncEvolveKeystone]`;\n const keystoneService = new KeystoneService_V1();\n\n if (!isDelegate) {\n throw new Error(`Root Domain Identity (${domainAddr}) is not allowed to sync directly. A delegate must be used. (E: 2c88fae39b7d82fd)`);\n }\n\n const incomingTjpAddr = getTjpAddr({ ibGib: keystoneIbGib });\n if (!incomingTjpAddr) {\n throw new Error(`Incoming delegate keystone missing TJP address (E: d288fae39b7d825e)`);\n }\n\n // Verify delegate is registered under root Domain Identity\n const delegateInfo = parentKeystone.data?.delegates?.[incomingTjpAddr];\n if (!delegateInfo) {\n throw new Error(`Incoming delegate keystone (${incomingTjpAddr}) is not registered under parent Domain Identity (E: c288fae39b7d82fe)`);\n }\n\n // Verify delegate is authorized for sync and has truthy spaceId\n const allowedVerbs = delegateInfo.allowedVerbs ?? [];\n const isSyncDelegate = (delegateInfo as any).role === 'sync-delegate' || allowedVerbs.includes('sync') || allowedVerbs.includes(KEYSTONE_VERB_SYNC);\n if (!allowedVerbs.includes(KEYSTONE_VERB_SYNC) && !isSyncDelegate) {\n throw new Error(`Incoming delegate keystone is not authorized for sync. Allowed verbs: ${allowedVerbs.join(', ')} (E: a288fae39b7d82ff)`);\n }\n\n const delegateSpaceId = delegateInfo.spaceId || (delegateInfo as any).details?.spaceId;\n if (isSyncDelegate && !delegateSpaceId) {\n throw new Error(`Sync delegate (${incomingTjpAddr}) is missing required spaceId (E: b288fae39b7d82fe)`);\n }\n\n // Load delegate's previous tip from space using keystoneService.getLatestKeystone if it exists\n let prevDelegateTip: KeystoneIbGib_V1 | undefined;\n try {\n prevDelegateTip = await keystoneService.getLatestKeystone({\n addr: incomingTjpAddr,\n metaspace,\n space\n });\n } catch (err) {\n // No previous tip found in space yet; will validate graph below\n }\n\n if (prevDelegateTip) {\n const validationErrors = await keystoneService.validate({\n currentIbGib: keystoneIbGib,\n prevIbGib: prevDelegateTip\n });\n if (validationErrors && validationErrors.length > 0) {\n throw new Error(`Delegate keystone evolution validation failed: ${validationErrors.join(', ')} (E: 5212f8492ac839953842631834bcd827)`);\n }\n } else {\n const validationErrors = await keystoneService.validateKeystoneGraph({\n keystoneIbGib,\n getLatest: false,\n invalidIfMoreRecentKeystoneFoundInSpace: false,\n space\n });\n if (validationErrors && validationErrors.length > 0) {\n throw new Error(`Delegate keystone graph validation failed: ${validationErrors.join(', ')} (E: 3a288fae39b7d82f)`);\n }\n }\n\n const proof = keystoneIbGib.data?.proofs?.[0];\n const claim = proof?.claim;\n const sAddr = claim?.target;\n if (!sAddr) {\n throw new Error('No target address found in sync claim');\n }\n\n // Validate S^Stjp (session keystone ibgib) from relatedKeystoneIbGibs\n const sIbGib = relatedKeystoneIbGibs.find(ibGib => getIbGibAddr({ ibGib }) === sAddr) as KeystoneIbGib_V1 | undefined;\n if (!sIbGib) {\n throw new Error(`Session keystone ${sAddr} must be provided in relatedKeystoneIbGibs (E: fe5a68438e288ab4e86c90d81d142826)`);\n }\n\n const sIntrinsicErrors = await validateIbGibIntrinsically({ ibGib: sIbGib });\n if (sIntrinsicErrors && sIntrinsicErrors.length > 0) {\n throw new Error(`Intrinsic validation failed for S^Stjp: ${sIntrinsicErrors.join(', ')} (E: 802d8350c3cccbd7184dd43866c05526)`);\n }\n\n const sGenesisErrors = await keystoneService.validateGenesisKeystone({ keystoneIbGib: sIbGib });\n if (sGenesisErrors && sGenesisErrors.length > 0) {\n throw new Error(`Genesis validation failed for S^Stjp: ${sGenesisErrors.join(', ')} (E: 8afdc1dbed48c000455b35585dc26826)`);\n }\n\n // Persist and Register both I and S\n await metaspace.put({ ibGibs: [keystoneIbGib, sIbGib], space });\n await metaspace.registerNewIbGib({ ibGib: keystoneIbGib, space });\n await metaspace.registerNewIbGib({ ibGib: sIbGib, space });\n}\n", "// #region SyncWebSocketMsgType enum\n\nexport const SYNC_WEB_SOCKET_MSG_TYPE_AUTH_CHALLENGE_INIT = 'auth-challenge-init';\nexport const SYNC_WEB_SOCKET_MSG_TYPE_AUTH_INIT = 'auth-init';\nexport const SYNC_WEB_SOCKET_MSG_TYPE_AUTH_CHALLENGE = 'auth-challenge';\nexport const SYNC_WEB_SOCKET_MSG_TYPE_AUTH_PROOF = 'auth-proof';\nexport const SYNC_WEB_SOCKET_MSG_TYPE_AUTH_OK = 'auth-ok';\nexport const SYNC_WEB_SOCKET_MSG_TYPE_AUTH_FAIL = 'auth-fail';\nexport const SYNC_WEB_SOCKET_MSG_TYPE_SYNC_FRAME = 'sync-frame';\nexport const SYNC_WEB_SOCKET_MSG_TYPE_SYNC_FRAME_RESPONSE = 'sync-frame-response';\nexport const SYNC_WEB_SOCKET_MSG_TYPE_SYNC_FRAME_AUTHENTICATED = 'sync-frame-authenticated';\nexport const SYNC_WEB_SOCKET_MSG_TYPE_SYNC_FRAME_RESPONSE_AUTHENTICATED = 'sync-frame-response-authenticated';\nexport const SYNC_WEB_SOCKET_MSG_TYPE_DOMAIN_PAYLOAD = 'domain-payload';\nexport const SYNC_WEB_SOCKET_MSG_TYPE_SYNC_ERROR = 'sync-error';\n\n/**\n * Message types transmitted over the stateful WebSocket connection\n * during a sync saga session handshake and execution.\n */\nexport type SyncWebSocketMsgType =\n | typeof SYNC_WEB_SOCKET_MSG_TYPE_AUTH_CHALLENGE_INIT\n | typeof SYNC_WEB_SOCKET_MSG_TYPE_AUTH_INIT\n | typeof SYNC_WEB_SOCKET_MSG_TYPE_AUTH_CHALLENGE\n | typeof SYNC_WEB_SOCKET_MSG_TYPE_AUTH_PROOF\n | typeof SYNC_WEB_SOCKET_MSG_TYPE_AUTH_OK\n | typeof SYNC_WEB_SOCKET_MSG_TYPE_AUTH_FAIL\n | typeof SYNC_WEB_SOCKET_MSG_TYPE_SYNC_FRAME\n | typeof SYNC_WEB_SOCKET_MSG_TYPE_SYNC_FRAME_RESPONSE\n | typeof SYNC_WEB_SOCKET_MSG_TYPE_SYNC_FRAME_AUTHENTICATED\n | typeof SYNC_WEB_SOCKET_MSG_TYPE_SYNC_FRAME_RESPONSE_AUTHENTICATED\n | typeof SYNC_WEB_SOCKET_MSG_TYPE_DOMAIN_PAYLOAD\n | typeof SYNC_WEB_SOCKET_MSG_TYPE_SYNC_ERROR\n ;\n\nexport const SyncWebSocketMsgType = {\n /** Sent by server/receiver to trigger connection authentication. */\n auth_challenge_init: SYNC_WEB_SOCKET_MSG_TYPE_AUTH_CHALLENGE_INIT,\n /** Sent by client/sender to start the authentication handshake with the target session address. */\n auth_init: SYNC_WEB_SOCKET_MSG_TYPE_AUTH_INIT,\n /** Sent by server/receiver with dynamic connect challenges to be solved. */\n auth_challenge: SYNC_WEB_SOCKET_MSG_TYPE_AUTH_CHALLENGE,\n /** Sent by client/sender with proof of session keystone evolution solving challenges. */\n auth_proof: SYNC_WEB_SOCKET_MSG_TYPE_AUTH_PROOF,\n /** Sent by server/receiver signaling successful challenge resolution and upgrade to active sync. */\n auth_ok: SYNC_WEB_SOCKET_MSG_TYPE_AUTH_OK,\n /** Sent when authentication fails. */\n auth_fail: SYNC_WEB_SOCKET_MSG_TYPE_AUTH_FAIL,\n /** Sent by client/sender to transmit the next sync transaction context without payload ibgibs. */\n sync_frame: SYNC_WEB_SOCKET_MSG_TYPE_SYNC_FRAME,\n /** Sent by server/receiver responding with the next sync transaction context. */\n sync_frame_response: SYNC_WEB_SOCKET_MSG_TYPE_SYNC_FRAME_RESPONSE,\n /** Sent by server/receiver after context is validated/authenticated to signal payload transmission. */\n sync_frame_authenticated: SYNC_WEB_SOCKET_MSG_TYPE_SYNC_FRAME_AUTHENTICATED,\n /** Sent by client/sender after response context is validated/authenticated to signal payload transmission. */\n sync_frame_response_authenticated: SYNC_WEB_SOCKET_MSG_TYPE_SYNC_FRAME_RESPONSE_AUTHENTICATED,\n /** Sent to stream a single domain payload ibgib. */\n domain_payload: SYNC_WEB_SOCKET_MSG_TYPE_DOMAIN_PAYLOAD,\n /** Sent when a sync runtime execution error occurs. */\n sync_error: SYNC_WEB_SOCKET_MSG_TYPE_SYNC_ERROR,\n} satisfies { readonly [key: string]: SyncWebSocketMsgType };\n\nexport const SYNC_WEB_SOCKET_MSG_TYPE_VALID_VALUES: SyncWebSocketMsgType[] = Object.values(SyncWebSocketMsgType);\n\nexport function isSyncWebSocketMsgType(value: any): value is SyncWebSocketMsgType {\n return SYNC_WEB_SOCKET_MSG_TYPE_VALID_VALUES.includes(value);\n}\n\n// #endregion SyncWebSocketMsgType enum\n", "/**\n * @module sync-peer-websocket-sender-v1\n */\n\nimport { extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';\nimport { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';\nimport { IbGib_V1 } from '@ibgib/ts-gib/dist/V1/types.mjs';\nimport { KeystoneIbGib_V1 } from '../../../../keystone/keystone-types.mjs';\nimport { KeystoneService_V1 } from '../../../../keystone/keystone-service-v1.mjs';\nimport { KeystoneStrategyFactory } from '../../../../keystone/strategy/keystone-strategy-factory.mjs';\nimport { deriveSessionSecret } from '../../../sync-helpers.mjs';\nimport { SyncPeer_V1 } from '../../sync-peer-v1.mjs';\nimport { SyncSagaContextIbGib_V1 } from '../../../sync-saga-context/sync-saga-context-types.mjs';\nimport { validateContextAndSagaFrame } from '../../../sync-saga-context/sync-saga-context-helpers.mjs';\nimport { GLOBAL_LOG_A_LOT } from '../../../../core-constants.mjs';\nimport {\n ConnectSyncPeerWebSocketSenderOpts,\n InitializeSyncPeerWebSocketSenderOpts,\n SyncPeerWebSocketSenderData_V1,\n SyncPeerWebSocketSenderRel8ns_V1,\n SyncPeerWebSocketSenderIbGib_V1\n} from './sync-peer-websocket-sender-types.mjs';\nimport {\n SESSION_KEYSTONE_POLICY,\n getConnectChallenge\n} from '../sync-peer-websocket-receiver/sync-websocket-peer-helpers.mjs';\nimport { SyncWebSocketMsgType, isSyncWebSocketMsgType, SYNC_WEB_SOCKET_MSG_TYPE_VALID_VALUES } from '../sync-peer-websocket-constants.mjs';\nimport { toDto } from '../../../../common/other/ibgib-helper.mjs';\nimport { putInSpace, registerNewIbGib } from '../../../../witness/space/space-helper.mjs';\n\n/**\n * helper in creating compile-time safety that we're handling all message types.\n */\nfunction assertUnreachable(x: never): never {\n throw new Error(`Unhandled message type: ${x} (E: e928a3f82cd7469a98ef1bc248a3f826)`);\n}\n\n\nconst logalot = GLOBAL_LOG_A_LOT || true;\n\n/**\n * WebSocket Sender Peer implementation running in browser/native environment.\n */\nexport class SyncPeerWebSocketSender_V1\n extends SyncPeer_V1<ConnectSyncPeerWebSocketSenderOpts, InitializeSyncPeerWebSocketSenderOpts>\n implements SyncPeerWebSocketSenderIbGib_V1 {\n\n protected override lc: string = `[${SyncPeerWebSocketSender_V1.name}]`;\n\n override get classname(): string {\n return SyncPeerWebSocketSender_V1.name;\n }\n\n public get isSocketOpen(): boolean {\n return this.ws !== undefined && this.ws.readyState === WebSocket.OPEN;\n }\n\n declare data: SyncPeerWebSocketSenderData_V1 | undefined;\n declare rel8ns: SyncPeerWebSocketSenderRel8ns_V1 | undefined;\n\n protected ws?: WebSocket;\n protected activeResolve?: (value: SyncSagaContextIbGib_V1 | undefined) => void;\n protected activeReject?: (reason: any) => void;\n protected pendingPayloadsToSend: IbGib_V1[] = [];\n protected handshakeMessageListener?: (event: MessageEvent) => Promise<void>;\n\n constructor(\n initialData: SyncPeerWebSocketSenderData_V1,\n initialRel8ns?: SyncPeerWebSocketSenderRel8ns_V1,\n ) {\n super(initialData, initialRel8ns);\n }\n\n protected override async preConnectCheck(opts: ConnectSyncPeerWebSocketSenderOpts): Promise<void> {\n const lc = `${this.lc}[${this.preConnectCheck.name}]`;\n if (!this.data?.wsUrl) {\n throw new Error(`Missing wsUrl in peer data (E: a3b2c1d0e9f8e7d6c5b4a3f2e1d0c910)`);\n }\n if (!this.data?.httpEvolveUrl) {\n throw new Error(`Missing httpEvolveUrl in peer data (E: a3b2c1d0e9f8e7d6c5b4a3f2e1d0c911)`);\n }\n }\n\n /**\n * Submits the evolved master identity (I1) and new session keystone (S) to the server's HTTP registry.\n */\n protected override async postEstablishToReceiver({\n newSenderIdentity,\n sessionIdentity,\n }: {\n newSenderIdentity: KeystoneIbGib_V1;\n sessionIdentity: KeystoneIbGib_V1;\n }): Promise<void> {\n const lc = `${this.lc}[${this.postEstablishToReceiver.name}]`;\n try {\n if (logalot) { console.log(`${lc} posting evolved keystones to ${this.data!.httpEvolveUrl}...`); }\n if (!this.data) { throw new Error(`(UNEXPECTED) this.data falsy? (E: d642e8a9af18b532c87c6f581aa53b26)`); }\n\n if (!this.data.httpEvolveUrl) { throw new Error(`(UNEXPECTED) this.data.httpEvolveUrl falsy? (E: 8589ddbb155914d85c09658881da2c26)`); }\n\n const response = await fetch(this.data.httpEvolveUrl, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n keystoneIbGib: newSenderIdentity,\n relatedKeystoneIbGibs: [sessionIdentity]\n }),\n });\n\n if (!response.ok) {\n const data = await response.json().catch(() => ({}));\n const errorMsg = data.message || data.error || 'Unknown error';\n throw new Error(`HTTP ${response.status} evolution post rejected. errorMsg: ${errorMsg} (E: e8a478291b88d05c68cf6b385684b826)`);\n }\n\n if (logalot) { console.log(`${lc} evolve post accepted by server.`); }\n } catch (error) {\n console.error(`${lc} establish post failed: ${extractErrorMsg(error)}`);\n throw error;\n }\n }\n\n /**\n * Establishes the stateful WebSocket connection and performs the multi-turn cryptographic challenge connect.\n */\n protected override async connectImpl(opts: ConnectSyncPeerWebSocketSenderOpts): Promise<void> {\n const lc = `${this.lc}[${this.connectImpl.name}]`;\n try {\n if (logalot) { console.log(`${lc} starting...`); }\n\n const { senderIdentity, fnSenderSecret, sagaId, localMetaspace, localSpace } = this.opts!;\n if (!senderIdentity || !fnSenderSecret || !sagaId) {\n throw new Error(`Missing identity parameters in peer options (E: ed49b6711ac82efcdb42b8a28c5b6826)`);\n }\n\n // 1. Solve upfront pre-filter solution\n const senderSecret = await fnSenderSecret();\n const sessionSecret = await deriveSessionSecret({ senderSecret, sagaId });\n\n // Fetch session identity S that establishSessionIdentity just created\n const sAddr_tjp = getIbGibAddr({ ibGib: senderIdentity }); // wait, S's past contains I\n // Actually, we can get the S keystone that was returned by establishSessionIdentity.\n // Let's resolve S from the sender localSpace using its target claim or the targetAddrs\n const sAddr = getIbGibAddr({ ibGib: senderIdentity.rel8ns?.past ? senderIdentity : senderIdentity }); // stub: get the actual generated S\n\n // To make sure we have the exact session identity S, we can query localSpace.\n // Since we know the sagaId, we can walk or locate it.\n // But wait, the coordinator calls establishSessionIdentity first, which returns the created S keystone!\n // Let's store a reference to the sessionIdentity S on this class during establish, or lookup from localSpace.\n // Wait, does the coordinator let the peer store S? No, but let's query the latest keystone in localSpace.\n const senderIdentityLatestAddr =\n await localMetaspace.getLatestAddr({ ibGib: senderIdentity, space: localSpace });\n if (!senderIdentityLatestAddr) { throw new Error(`senderIdentityLatestAddr falsy. we should have a latest addr that is different than the sender identity at this point (done in the peer establish phase) (E: 225607318bef485d7821f82de97b6826)`); }\n\n const resGet = await localMetaspace.get({ addrs: [senderIdentityLatestAddr], space: localSpace });\n const I_tip = resGet.ibGibs?.[0] as KeystoneIbGib_V1;\n\n // const targetSAddr = I_tip?.rel8ns?.past?.[0] ?? I_tip?.data?.proofs?.[0]?.claim?.target;\n const targetSAddr = I_tip.data.proofs.at(0)?.claim.target;\n if (!targetSAddr) {\n throw new Error(`Could not locate session keystone target from identity (E: 5ec4882f7e5e4c33fbd00ab8b3166726)`);\n }\n\n const resGetS = await localMetaspace.get({ addrs: [targetSAddr], space: localSpace });\n const sessionS = resGetS.ibGibs?.[0] as KeystoneIbGib_V1;\n if (!sessionS) {\n throw new Error(`Session keystone not found in local space: ${targetSAddr} (E: 9ba818e6622808bb4ae749be31f80b26)`);\n }\n\n // Solve dynamic upfront picket-fence challenge\n const connectPool =\n (sessionS.data?.challengePools ?? [])\n .find(p => p.id === SESSION_KEYSTONE_POLICY.CONNECT_POOL.ID);\n if (!connectPool) {\n throw new Error(`Session keystone missing connect pool (E: f50968afca04b6d38ec19824ea201826)`);\n }\n\n const { challengeId } = getConnectChallenge(sessionS);\n const strategy = KeystoneStrategyFactory.create({ config: connectPool.config });\n const poolSecret = await strategy.derivePoolSecret({ masterSecret: sessionSecret });\n const solution = await strategy.generateSolution({\n poolSecret,\n poolId: SESSION_KEYSTONE_POLICY.CONNECT_POOL.ID,\n challengeId\n });\n\n // 2. Open WebSocket connection\n const wsUrl = `${this.data!.wsUrl}?sAddr=${encodeURIComponent(targetSAddr)}&solution=${encodeURIComponent(solution.value)}`;\n if (logalot) { console.log(`${lc} connecting to WebSocket: ${wsUrl}`); }\n\n const ws = new WebSocket(wsUrl);\n this.ws = ws;\n\n return new Promise<void>((resolve, reject) => {\n let isResolved = false;\n\n ws.addEventListener('open', () => {\n if (logalot) { console.log(`${lc} WebSocket opened. Awaiting challenge...`); }\n });\n\n this.handshakeMessageListener = async (ev) => {\n try {\n const msg = JSON.parse(ev.data);\n if (logalot) { console.log(`${lc} received handshake frame: ${msg.type}`); }\n\n const msgType = msg.type;\n if (!isSyncWebSocketMsgType(msgType)) {\n const validTypes = SYNC_WEB_SOCKET_MSG_TYPE_VALID_VALUES.join(', ');\n throw new Error(`Unknown message type '${msgType}' received during connection handshake. Valid types are: ${validTypes} (E: e983271bc84f46928e4695be2409826)`);\n }\n\n switch (msgType) {\n case SyncWebSocketMsgType.auth_challenge_init:\n await this.handleHandshakeAuthChallengeInit(ws, targetSAddr);\n break;\n case SyncWebSocketMsgType.auth_challenge:\n await this.handleHandshakeAuthChallenge(ws, msg, sessionS, sessionSecret);\n break;\n case SyncWebSocketMsgType.auth_ok:\n isResolved = true;\n this.handleHandshakeAuthOk(ws, resolve);\n break;\n case SyncWebSocketMsgType.auth_fail:\n this.handleHandshakeAuthFail(msg, reject);\n break;\n case SyncWebSocketMsgType.sync_error:\n this.handleHandshakeSyncError(msg, reject);\n break;\n // Protocol violations / unexpected messages during connection handshake\n case SyncWebSocketMsgType.auth_init:\n case SyncWebSocketMsgType.auth_proof:\n case SyncWebSocketMsgType.sync_frame:\n case SyncWebSocketMsgType.sync_frame_response:\n case SyncWebSocketMsgType.sync_frame_authenticated:\n case SyncWebSocketMsgType.sync_frame_response_authenticated:\n case SyncWebSocketMsgType.domain_payload:\n throw new Error(`Unexpected message type '${msgType}' during connection handshake (E: e3f80c68ab2a46c2b1858c8a1e2f8926)`);\n default:\n assertUnreachable(msgType);\n }\n } catch (error) {\n console.error(`${lc} ${extractErrorMsg(error)}`);\n reject(error);\n }\n };\n\n ws.addEventListener('message', this.handshakeMessageListener);\n\n ws.addEventListener('close', (event) => {\n if (!isResolved) {\n this.disconnect();\n reject(new Error(`WebSocket closed before connect completed (code: ${event.code})`));\n }\n });\n\n ws.addEventListener('error', (err) => {\n if (!isResolved) {\n this.disconnect();\n reject(new Error(`WebSocket connection error`));\n }\n });\n });\n\n } catch (error) {\n console.error(`${lc} connect failed: ${extractErrorMsg(error)}`);\n throw error;\n }\n }\n\n /**\n * Cleanly closes the socket and removes the handshake message listener.\n *\n * LOGS AND SWALLOWS ERRORS, DOES NOT THROW\n */\n public disconnect(): void {\n const lc = `${this.lc}[${this.disconnect.name}]`;\n try {\n if (logalot) { console.log(`${lc} starting... (I: 35c4b85fca0c6e9d042f5ff87cde3826)`); }\n\n if (this.ws) {\n if (this.handshakeMessageListener) {\n this.ws.removeEventListener('message', this.handshakeMessageListener);\n this.handshakeMessageListener = undefined;\n }\n try {\n this.ws.close();\n } catch (error) {\n console.error(`${lc} failed to close websocket: ${extractErrorMsg(error)}`);\n }\n this.ws = undefined;\n }\n } catch (error) {\n console.error(`${lc} ${extractErrorMsg(error)}`);\n // throw error; // disconnect does NOT rethrow\n } finally {\n if (logalot) { console.log(`${lc} complete.`); }\n }\n }\n\n /**\n * Handles synchronizing messages and evolved context frames during active transaction turns.\n */\n protected async handleRuntimeMessage(event: MessageEvent): Promise<void> {\n const lc = `${this.lc}[${this.handleRuntimeMessage.name}]`;\n try {\n const msg = JSON.parse(event.data);\n if (logalot) { console.log(`${lc} received runtime frame: ${msg.type}`); }\n\n const msgType = msg.type;\n if (!isSyncWebSocketMsgType(msgType)) {\n const validTypes = SYNC_WEB_SOCKET_MSG_TYPE_VALID_VALUES.join(', ');\n throw new Error(`Unknown message type '${msgType}' received during active sync saga loop. Valid types are: ${validTypes} (E: e23a8d10b74d47fb90518f8e3f4b826)`);\n }\n\n switch (msgType) {\n case SyncWebSocketMsgType.sync_frame_response:\n await this.handleRuntimeSyncFrameResponse(msg);\n break;\n case SyncWebSocketMsgType.sync_frame_authenticated:\n this.handleRuntimeSyncFrameAuthenticated();\n break;\n case SyncWebSocketMsgType.domain_payload:\n this.handleRuntimeDomainPayload(msg);\n break;\n case SyncWebSocketMsgType.sync_error:\n this.handleRuntimeSyncError(msg);\n break;\n // Handshake messages / unexpected messages during active sync saga loop\n case SyncWebSocketMsgType.auth_challenge_init:\n case SyncWebSocketMsgType.auth_init:\n case SyncWebSocketMsgType.auth_challenge:\n case SyncWebSocketMsgType.auth_proof:\n case SyncWebSocketMsgType.auth_ok:\n case SyncWebSocketMsgType.auth_fail:\n case SyncWebSocketMsgType.sync_frame:\n case SyncWebSocketMsgType.sync_frame_response_authenticated:\n throw new Error(`Unexpected message type '${msgType}' during active sync saga loop (E: e982b12cf92c448bbad0e84b7263c826)`);\n default:\n assertUnreachable(msgType);\n }\n } catch (error) {\n console.error(`${lc} failed parsing/handling runtime frame: ${extractErrorMsg(error)}`);\n this.disconnect();\n if (this.activeReject) {\n const reject = this.activeReject;\n this.activeResolve = undefined;\n this.activeReject = undefined;\n reject(error);\n }\n }\n }\n\n protected async handleHandshakeAuthChallengeInit(ws: WebSocket, targetSAddr: string): Promise<void> {\n ws.send(JSON.stringify({\n type: SyncWebSocketMsgType.auth_init,\n sAddr: targetSAddr\n }));\n }\n\n protected async handleHandshakeAuthChallenge(\n ws: WebSocket,\n msg: any,\n sessionS: KeystoneIbGib_V1,\n sessionSecret: string\n ): Promise<void> {\n const { challengeUuid, demandedIds } = msg;\n if (logalot) { console.log(`${this.lc} solving demanded challenges: ${demandedIds.join(', ')}`); }\n\n const proofFrame = await this.signContextConnect({\n challengeUuid,\n demandedIds\n });\n\n if (!proofFrame) {\n throw new Error(`Failed to sign connect challenge proof (E: e9807f28ae9248bbadd0a7f1a8e9826)`);\n }\n\n ws.send(JSON.stringify({\n type: SyncWebSocketMsgType.auth_proof,\n proofFrame\n }));\n }\n\n protected handleHandshakeAuthOk(ws: WebSocket, resolve: () => void): void {\n if (logalot) { console.log(`${this.lc} WebSocket connect SUCCESS!`); }\n if (this.handshakeMessageListener) {\n ws.removeEventListener('message', this.handshakeMessageListener);\n this.handshakeMessageListener = undefined;\n }\n ws.addEventListener('message', (event) => this.handleRuntimeMessage(event));\n resolve();\n }\n\n protected handleHandshakeAuthFail(msg: any, reject: (err: Error) => void): void {\n this.disconnect();\n reject(new Error(`Handshake auth failed: ${msg.message || 'Unknown fail reason'} (E: f380b271a2be498db257bc8209fa8926)`));\n }\n\n protected handleHandshakeSyncError(msg: any, reject: (err: Error) => void): void {\n this.disconnect();\n reject(new Error(`Handshake sync error: ${msg.message || msg.error || 'Unknown sync error'} (E: f9208a01fe434cbbad83f210ea8f3426)`));\n }\n\n protected async handleRuntimeSyncFrameResponse(msg: any): Promise<void> {\n const responseContext = msg.context as SyncSagaContextIbGib_V1;\n\n const validationErrors = await validateContextAndSagaFrame({ context: responseContext });\n if (validationErrors.length > 0) {\n throw new Error(`Invalid response context received: ${validationErrors.join(', ')} (E: d7b5a283cf4c43ba8659c803800cf826)`);\n }\n\n // Put response control ibgibs into durable space immediately\n const allControlIbGibs: IbGib_V1[] = [\n toDto({ ibGib: responseContext }),\n responseContext.sagaFrame,\n responseContext.sagaFrameMsg!\n ];\n if (responseContext.signedSessionIdentity) {\n allControlIbGibs.push(responseContext.signedSessionIdentity);\n }\n\n const { localSpace } = this.opts!;\n for (const ibGib of allControlIbGibs) {\n await putInSpace({ space: localSpace, ibGibs: [ibGib] });\n await registerNewIbGib({ space: localSpace, ibGib });\n }\n\n const expectedPayloadAddrs = responseContext.data?.['@payloadAddrsDomain'] || [];\n if (expectedPayloadAddrs.length > 0) {\n this.ws!.send(JSON.stringify({\n type: SyncWebSocketMsgType.sync_frame_response_authenticated,\n contextAddr: getIbGibAddr({ ibGib: responseContext })\n }));\n }\n\n if (this.activeResolve) {\n const resolve = this.activeResolve;\n this.activeResolve = undefined;\n this.activeReject = undefined;\n resolve(responseContext);\n }\n }\n\n protected handleRuntimeSyncFrameAuthenticated(): void {\n const payloads = this.pendingPayloadsToSend || [];\n this.pendingPayloadsToSend = [];\n for (const ibGib of payloads) {\n this.ws!.send(JSON.stringify({\n type: SyncWebSocketMsgType.domain_payload,\n ibGib\n }));\n }\n }\n\n protected handleRuntimeDomainPayload(msg: any): void {\n const payload = msg.ibGib as IbGib_V1;\n this.payloadIbGibsDomainReceived$.next(payload);\n }\n\n protected handleRuntimeSyncError(msg: any): void {\n const errorDetail = msg.message || msg.error || 'Unknown sync runtime error';\n const error = new Error(`Sync runtime error from receiver: ${errorDetail} (E: e983bc1c828d447fa0581da2b8004f26)`);\n if (this.activeReject) {\n const reject = this.activeReject;\n this.activeResolve = undefined;\n this.activeReject = undefined;\n reject(error);\n } else {\n throw error;\n }\n }\n\n /**\n * Serializes the transaction context and payload down the active WebSocket connection.\n */\n protected override async sendContextRequest(context: SyncSagaContextIbGib_V1): Promise<SyncSagaContextIbGib_V1 | undefined> {\n const lc = `${this.lc}[${this.sendContextRequest.name}]`;\n try {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n throw new Error(`WebSocket is not connected or open (E: a3b2c1d0e9f8e7d6c5b4a3f2e1d0c915)`);\n }\n\n // 1. Separate payloads to send later\n const domainPayloads = context.payloadIbGibsDomain ?? [];\n this.pendingPayloadsToSend = [...domainPayloads];\n\n // 2. Clone context without payloads for transport\n const contextToSend = { ...context };\n delete contextToSend.payloadIbGibsDomain;\n\n // 3. Transmit the synchronizing transaction context\n return new Promise<SyncSagaContextIbGib_V1 | undefined>((resolve, reject) => {\n this.activeResolve = resolve;\n this.activeReject = reject;\n\n this.ws!.send(JSON.stringify({\n type: SyncWebSocketMsgType.sync_frame,\n context: contextToSend\n }));\n });\n\n } catch (error) {\n console.error(`${lc} sendContextRequest failed: ${extractErrorMsg(error)}`);\n throw error;\n }\n }\n}\n", "export const SYNC_SAGA_MSG_ATOM = 'sync_sagamsg';\r\n\r\n/**\r\n * list of addrs to be registered in the commit phase.\r\n */\r\nexport const NEW_ADDRS_TO_REGISTER_REL8N_NAME = 'new';\r\n/**\r\n * These addrs should NOT be registered in the commit phase, as they are from\r\n * orphaned branches.\r\n */\r\nexport const ORPHANED_REL8N_NAME = 'orphaned';\r\n", "import { extractErrorMsg } from \"@ibgib/helper-gib/dist/helpers/utils-helper.mjs\";\r\nimport { Ib } from \"@ibgib/ts-gib/dist/types.mjs\";\r\nimport { SYNC_SAGA_MSG_ATOM } from \"./sync-saga-message-constants.mjs\";\r\nimport { SyncSagaMessageData_V1, SyncSagaMessageIb_V1 } from \"./sync-saga-message-types.mjs\";\r\n\r\n/**\r\n * Constructs the standard 'ib' string for a Sync Saga Message stone.\r\n */\r\nexport async function getSyncSagaMessageIb({\r\n data,\r\n}: {\r\n data: SyncSagaMessageData_V1,\r\n}): Promise<Ib> {\r\n const lc = `[${getSyncSagaMessageIb.name}]`;\r\n try {\r\n // sync_saga_msg sagaId stage\r\n const ib = [\r\n SYNC_SAGA_MSG_ATOM,\r\n data.sagaId,\r\n data.stage\r\n ].join(' ');\r\n\r\n // console.log(`${lc} constructed ib: ${ib}`); // temporary debug\r\n\r\n return ib;\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Parses a standard Sync Saga Message 'ib' string.\r\n */\r\nexport async function parseSyncSagaMessageIb({\r\n ib,\r\n}: {\r\n ib: Ib,\r\n}): Promise<SyncSagaMessageIb_V1> {\r\n const lc = `[${parseSyncSagaMessageIb.name}]`;\r\n try {\r\n const parts = ib.split(' ');\r\n if (parts.length !== 3) {\r\n throw new Error(`Invalid sync saga message ib. Expected 3 parts [atom sagaId stage]. Got ${parts.length}. (E: 7abec847426bd8f41a475cafcc118826)`);\r\n }\r\n const [\r\n atom,\r\n sagaId,\r\n stage\r\n ] = parts;\r\n\r\n if (atom !== SYNC_SAGA_MSG_ATOM) {\r\n throw new Error(`Atom mismatch. Expected ${SYNC_SAGA_MSG_ATOM}. Got ${atom}. (E: 1b4ddf426ed87e474816ed48cedb8a26)`);\r\n }\r\n\r\n return { atom, sagaId, stage };\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Helper to retrieve the Message Stone associated with a Saga Frame.\r\n * \r\n * Saga Frames link to their Message Stone via the `sync-msg` relationship.\r\n */\r\nimport { IbGib_V1 } from \"@ibgib/ts-gib/dist/V1/types.mjs\";\r\nimport { IbGibSpaceAny } from \"../../witness/space/space-base-v1.mjs\";\r\nimport { getRel8dIbGibs } from \"../../common/other/ibgib-helper.mjs\";\r\nimport { SYNC_MSG_REL8N_NAME } from \"../sync-constants.mjs\";\r\n\r\nexport async function getSyncSagaMessageFromFrame({\r\n frameIbGib,\r\n space,\r\n}: {\r\n frameIbGib: IbGib_V1,\r\n space: IbGibSpaceAny,\r\n}): Promise<IbGib_V1<SyncSagaMessageData_V1>> {\r\n const lc = `[${getSyncSagaMessageFromFrame.name}]`;\r\n try {\r\n const rel8d = await getRel8dIbGibs({\r\n ibGib: frameIbGib,\r\n rel8nNames: [SYNC_MSG_REL8N_NAME],\r\n space\r\n });\r\n const msgs = rel8d[SYNC_MSG_REL8N_NAME];\r\n\r\n if (!msgs || msgs.length === 0) {\r\n throw new Error(`(UNEXPECTED) No sync message stone found found for frame: ${frameIbGib.ib} (E: 8a4b2c1d3e5f6a9b7c8d9e0f1a2b3c4d)`);\r\n }\r\n\r\n if (msgs.length > 1) {\r\n throw new Error(`(UNEXPECTED) Multiple sync message stones found (${msgs.length}) for frame: ${frameIbGib.ib}. logic not currently equipped to handle multiple messages per frame. (E: 1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d)`);\r\n }\r\n\r\n return msgs[0] as IbGib_V1<SyncSagaMessageData_V1>;\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n }\r\n}\r\n", "import {\r\n extractErrorMsg,\r\n getUUID, // so our uuid's are uniform across all ibgib code\r\n getTimestamp, // so our timestamp strings are uniform\r\n pretty, clone, delay,\r\n} from \"@ibgib/helper-gib/dist/helpers/utils-helper.mjs\";\r\nimport { getIbGibAddr } from \"@ibgib/ts-gib/dist/helper.mjs\";\r\nimport { Factory_V1 } from \"@ibgib/ts-gib/dist/V1/factory.mjs\";\r\nimport { IbGib_V1, } from \"@ibgib/ts-gib/dist/V1/types.mjs\";\r\nimport { IbGibAddr } from \"@ibgib/ts-gib/dist/types.mjs\";\r\nimport { validateIbGibIntrinsically } from \"@ibgib/ts-gib/dist/V1/validate-helper.mjs\";\r\n\r\nimport { GLOBAL_LOG_A_LOT } from \"../core-constants.mjs\";\r\nimport { IbGibSpaceAny } from \"../witness/space/space-base-v1.mjs\";\r\nimport { putInSpace, getLatestAddrs, getFromSpace, registerNewIbGib } from \"../witness/space/space-helper.mjs\";\r\nimport { MetaspaceService } from \"../witness/space/metaspace/metaspace-types.mjs\";\r\nimport {\r\n SyncStage, SYNC_ATOM, SYNC_MSG_REL8N_NAME, SYNC_SAGA_PAYLOAD_ADDRS_DOMAIN,\r\n SyncConflictStrategy, SYNC_CONFLICT_STRATEGY_VALID_VALUES,\r\n\r\n} from \"./sync-constants.mjs\";\r\nimport {\r\n appendToTimeline, createTimeline, getHistory, getHistoryAddrs, Rel8nInfo, Rel8nRemovalInfo\r\n} from \"../timeline/timeline-api.mjs\";\r\nimport {\r\n SyncData_V1, SyncIbGib_V1, SyncMode, SyncRel8ns_V1,\r\n DomainIbGibAnalysisInfo, NextSagaFrameInfo,\r\n HandleSagaResponseContextResult,\r\n SyncSagaFrameDependencyGraph,\r\n SyncSenderIdentityInfo,\r\n} from \"./sync-types.mjs\";\r\nimport { getSyncSagaFrameOrigin, getFullSyncSagaHistory, getSyncIb, getTempSpaceName, isPastFrame, putInSpace_dnasThenNonDnas, validateFullSyncSagaHistory, getAllOrphanedAddresses, getFinalConflictsInfo, getSyncSagaFrameDependencyGraph } from \"./sync-helpers.mjs\";\r\nimport { getDeltaDependencyGraph, getDependencyGraph, toFlatGraph } from \"../common/other/graph-helper.mjs\";\r\nimport {\r\n SyncSagaMessageData_V1, SyncSagaMessageInitData_V1,\r\n SyncSagaMessageAckData_V1, SyncSagaMessageDeltaData_V1,\r\n SyncSagaMessageCommitData_V1, SyncSagaConflictInfo, SyncSagaPushOfferInfo,\r\n SyncSagaRequestAddrInfo,\r\n SyncSagaMessageRel8ns_V1,\r\n} from \"./sync-saga-message/sync-saga-message-types.mjs\";\r\nimport { getSyncSagaMessageIb } from \"./sync-saga-message/sync-saga-message-helpers.mjs\";\r\nimport { SYNC_SAGA_MSG_ATOM } from \"./sync-saga-message/sync-saga-message-constants.mjs\";\r\nimport { SyncSagaInfo } from \"./sync-types.mjs\";\r\nimport { splitPerTjpAndOrDna, getTimelinesGroupedByTjp, isIbGib, getIbGibsFromCache_fallbackToSpaces, toDto, getTjpAddr } from \"../common/other/ibgib-helper.mjs\";\r\nimport { SyncPeerWitness } from \"./sync-peer/sync-peer-types.mjs\";\r\nimport { SyncSagaContextData_V1, SyncSagaContextIbGib_V1, SyncSagaContextRel8ns_V1, } from \"./sync-saga-context/sync-saga-context-types.mjs\";\r\nimport { getSyncSagaContextIb, validateContextAndSagaFrame } from \"./sync-saga-context/sync-saga-context-helpers.mjs\";\r\nimport { newupSubject, } from \"../common/pubsub/subject/subject-helper.mjs\";\r\nimport { SubjectWitness } from \"../common/pubsub/subject/subject-types.mjs\";\r\nimport { getSyncSagaMessageFromFrame } from \"./sync-saga-message/sync-saga-message-helpers.mjs\";\r\nimport { fnObs } from \"../common/pubsub/observer/observer-helper.mjs\";\r\nimport { ErrorIbGib_V1 } from \"../common/error/error-types.mjs\";\r\nimport { IbGibSpaceResultData, IbGibSpaceResultIbGib, IbGibSpaceResultRel8ns } from \"../witness/space/space-types.mjs\";\r\nimport { FlatIbGibGraph } from \"../common/other/graph-types.mjs\";\r\nimport { graftTimelines, } from \"./graft-info/graft-info-helpers.mjs\";\r\nimport { GRAFT_INFO_REL8N_NAME } from \"./graft-info/graft-info-constants.mjs\";\r\nimport { GraftInfoIbGib_V1 } from \"./graft-info/graft-info-types.mjs\";\r\nimport { SYNC_SAGA_CONTEXT_ATOM } from \"./sync-saga-context/sync-saga-context-constants.mjs\";\r\nimport { KeystoneIbGib_V1 } from \"../keystone/keystone-types.mjs\";\r\nimport { createStandardPoolConfig } from \"../keystone/keystone-config-builder.mjs\";\r\nimport {\r\n POOL_ID_CONNECT, POOL_ID_SYNC, KEYSTONE_VERB_CONNECT, KEYSTONE_VERB_SYNC\r\n} from \"../keystone/keystone-constants.mjs\";\r\nimport { KeystonePoolConfig, KeystoneReplenishStrategy } from \"../keystone/keystone-types.mjs\";\r\nimport { SyncPeer_V1 } from \"./sync-peer/sync-peer-v1.mjs\";\r\n\r\n\r\nconst logalot = GLOBAL_LOG_A_LOT || true;\r\nconst logalotControlDomain = true;\r\nconst lcControlDomain = '[ControlDomain]';\r\n\r\n/**\r\n * Orchestrates the synchronization process between two spaces (Source and Destination).\r\n *\r\n * ## Execution Contexts\r\n *\r\n * The methods in this class are designed to be run on specific nodes in the sync topology:\r\n *\r\n * * **Sender/Local Node**: The node *initiating* the sync (calling `sync()`).\r\n * * **Receiver/Remote Node**: The node *accepting* the sync request (the Peer).\r\n *\r\n * Note that in a peer-to-peer architecture, \"Sender\" and \"Receiver\" are roles\r\n * relative to a specific Saga, not fixed node ids.\r\n */\r\nexport class SyncSagaCoordinator {\r\n private lc: string = `[${SyncSagaCoordinator.name}]`;\r\n\r\n constructor() {\r\n\r\n }\r\n\r\n /**\r\n * Default pool config for the session keystone's `connect` pool.\r\n * Consumed exactly once per saga during `peer.connect()`.\r\n * Uses `deleteAll` replenish strategy \u2014 after the handshake, the pool is gone.\r\n *\r\n * Override in subclasses or pass custom config via opts to change security parameters.\r\n */\r\n protected defaultSessionConnectPoolConfig(): KeystonePoolConfig {\r\n return createStandardPoolConfig({\r\n id: POOL_ID_CONNECT,\r\n salt: `session-connect-${Date.now()}`,\r\n verbs: [KEYSTONE_VERB_CONNECT],\r\n size: 20,\r\n sequential: 2,\r\n random: 2,\r\n targetBinding: 0,\r\n replenishStrategy: KeystoneReplenishStrategy.deleteAll,\r\n });\r\n }\r\n\r\n /**\r\n * Default pool config for the session keystone's per-turn `sync` pool.\r\n * Used on each outgoing context frame (Init, Delta, Commit).\r\n * Uses `topUp` replenish strategy to stay active throughout the saga.\r\n *\r\n * Override in subclasses or pass custom config via opts to change security parameters.\r\n */\r\n protected defaultSessionSyncPoolConfig(): KeystonePoolConfig {\r\n return createStandardPoolConfig({\r\n id: POOL_ID_SYNC,\r\n salt: `session-sync-${Date.now()}`,\r\n verbs: [KEYSTONE_VERB_SYNC],\r\n size: 200,\r\n sequential: 3,\r\n random: 3,\r\n targetBinding: 3,\r\n replenishStrategy: KeystoneReplenishStrategy.topUp,\r\n });\r\n }\r\n\r\n /**\r\n * Executes a synchronization saga using the Symmetric Sync Protocol.\r\n *\r\n * @remarks\r\n * **Execution Context**: **Sender (Local)**.\r\n * This method is the entry point for starting a sync saga.\r\n */\r\n public async sync({\r\n peer,\r\n domainIbGibs,\r\n senderIdentityInfo,\r\n fnSenderSecret,\r\n conflictStrategy = SyncConflictStrategy.abort,\r\n metaspace,\r\n localSpace,\r\n }: {\r\n /**\r\n * The peer we are syncing with.\r\n */\r\n peer: SyncPeerWitness;\r\n /**\r\n * The primary ibgibs we wish to sync. The dependency ibgibs will be\r\n * automatically included as needed for sync.\r\n *\r\n * These should all exist in {@link localSpace}\r\n */\r\n domainIbGibs: IbGib_V1[],\r\n /**\r\n * Optional structure containing both the sender's delegate identity (Alice's device key)\r\n * and the parent root Domain Identity address (senderDomainAddr).\r\n *\r\n * NOTE: {@link fnSenderSecret} must be truthy if this is truthy, and vice versa.\r\n */\r\n senderIdentityInfo?: SyncSenderIdentityInfo,\r\n /**\r\n * secret corresponding to {@link senderIdentityInfo.senderIdentity}.\r\n *\r\n * NOTE: {@link senderIdentityInfo} must be truthy if this is truthy, and vice versa.\r\n */\r\n fnSenderSecret?: () => Promise<string>;\r\n /**\r\n * The space containing the {@link domainIbGibs} we want to sync. If\r\n * sync is successful, any updates to timelines will be stored here.\r\n */\r\n localSpace: IbGibSpaceAny;\r\n /**\r\n * The metaspace context (for registering sync sagas locally).\r\n */\r\n metaspace: MetaspaceService;\r\n /**\r\n * How to handle conflicts when both Source and Dest have diverged on the\r\n * same timeline.\r\n *\r\n * defaults to {@link SyncConflictStrategy.abort}\r\n */\r\n conflictStrategy?: SyncConflictStrategy;\r\n }): Promise<SyncSagaInfo> {\r\n const lc = `${this.lc}[${this.sync.name}]`;\r\n if (logalot) { console.log(`${lc} starting...`); }\r\n\r\n if (!localSpace) {\r\n debugger;\r\n throw new Error(`${lc} source (or localSpace) required (E: 25df3761f7686a1099a552f83c95d326)`);\r\n }\r\n\r\n if (senderIdentityInfo || fnSenderSecret) {\r\n if (!senderIdentityInfo) { throw new Error(`(UNEXPECTED) senderIdentityInfo falsy but fnSenderSecret truthy? if either is used, both must be truthy. (E: e366628a4919c7d727d2cbd8e5b75e26)`); }\r\n if (!fnSenderSecret) { throw new Error(`(UNEXPECTED) fnSenderSecret falsy but senderIdentityInfo truthy? if either is used, both must be truthy. (E: 7d55ce37ae482fec48e3398158161926)`); }\r\n\r\n const { senderIdentity, senderDomainAddr } = senderIdentityInfo;\r\n if (!senderIdentity) { throw new Error(`(UNEXPECTED) senderIdentity falsy in senderIdentityInfo? if senderIdentityInfo is provided, both senderIdentity and senderDomainAddr must be truthy. (E: a3c17fae2978926d)`); }\r\n if (!senderDomainAddr) { throw new Error(`(UNEXPECTED) senderDomainAddr falsy in senderIdentityInfo? if senderIdentityInfo is provided, both senderIdentity and senderDomainAddr must be truthy. (E: d288fae39b7d825c)`); }\r\n }\r\n\r\n const { senderIdentity, senderDomainAddr } = senderIdentityInfo ?? {};\r\n\r\n // 1. SETUP SAGA METADATA\r\n const sagaId = await getUUID();\r\n\r\n // Setup Observable & Promise\r\n // const updates$ = new Subject_V1<SyncSagaContextIbGib_V1>();\r\n const updates$ = await newupSubject<SyncSagaContextIbGib_V1>();\r\n if (!updates$.next) { throw new Error(`(UNEXPECTED) updates$.next falsy? (E: d24cd82184aec130c89a320819b39126)`); }\r\n let resolveDone!: () => void;\r\n let rejectDone!: (err: any) => void;\r\n const done = new Promise<void>((resolve, reject) => {\r\n resolveDone = resolve;\r\n rejectDone = reject;\r\n });\r\n\r\n // WORKING CONTEXT (Transactional)\r\n const tempSpaceName = await getTempSpaceName();\r\n const tempSpace = await metaspace.createNewLocalSpace({\r\n opts: {\r\n allowCancel: false,\r\n spaceName: tempSpaceName,\r\n getFnPrompt: metaspace.getFnPrompt!,\r\n logalot\r\n }\r\n });\r\n if (!tempSpace) { throw new Error(`Failed to create temp space (E: 8f4e2f3d6c1b4b1a8f4e2f3d6c1b4b1a)`); }\r\n await tempSpace.initialized;\r\n\r\n const cleanup = async () => {\r\n // In-memory temp space cleanup if needed (e.g. if we used a specialized disposable space)\r\n // await tempSpace.destroy();\r\n };\r\n\r\n // Async execution wrapper\r\n (async () => {\r\n try {\r\n const targetAddrs = domainIbGibs ? domainIbGibs.map(domain => getIbGibAddr({ ibGib: domain })) : undefined;\r\n\r\n // Attach saga-scoped identity opts to peer now that sagaId is known.\r\n peer.setOptionalOpts({\r\n sagaId,\r\n senderIdentity,\r\n senderDomainAddr,\r\n fnSenderSecret,\r\n sessionConnectPoolConfig: this.defaultSessionConnectPoolConfig(),\r\n sessionSyncPoolConfig: this.defaultSessionSyncPoolConfig(),\r\n targetAddrs,\r\n } as any);\r\n\r\n // ESTABLISH SESSION IDENTITY (pre-connect, if identity provided)\r\n await peer.establishSessionIdentity();\r\n\r\n // CONNECT PEER (if needed)\r\n await peer.connect({ sagaId });\r\n\r\n // CREATE INITIAL FRAME (Stage.init)\r\n const { initFrame, initDomainGraph } = await this.createInitFrame({\r\n sagaId,\r\n domainIbGibs,\r\n conflictStrategy,\r\n metaspace, localSpace, tempSpace,\r\n peer,\r\n });\r\n\r\n // KICK OFF THE PING-PONG SAGA LOOP (FSM)\r\n await this.executeSagaLoop({\r\n initFrame, initDomainGraph,\r\n peer,\r\n updates$,\r\n localSpace,\r\n tempSpace,\r\n metaspace\r\n });\r\n\r\n resolveDone();\r\n if (!updates$.complete) { throw new Error(`(UNEXPECTED) updates$.complete falsy? (E: d24cd82184aec130c89a320819b39126)`); }\r\n updates$.complete();\r\n\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n rejectDone(error);\r\n if (!updates$.error) { throw new Error(`(UNEXPECTED) updates$.error falsy? (E: 392ce77c073272e4c398c3e86583ce26)`); }\r\n updates$.error(error);\r\n } finally {\r\n await cleanup();\r\n }\r\n })();\r\n\r\n return { sagaId, updates$, done };\r\n }\r\n\r\n /**\r\n * This is what the receiving side of the sync calls to drive the FSM to the\r\n * next stage.\r\n *\r\n * So whereas the sender executes a saga loop and drives the entire process,\r\n * this is a reactive one-off that drives just the single step that the\r\n * receiver does in that saga.\r\n *\r\n * @returns next context result if another round, else if commit returns\r\n * null\r\n */\r\n public async continueSync({\r\n sagaContext,\r\n mySpace,\r\n myTempSpace,\r\n metaspace,\r\n peer,\r\n }: {\r\n sagaContext: SyncSagaContextIbGib_V1,\r\n /**\r\n * Local space relative to the execution context's POV\r\n */\r\n mySpace: IbGibSpaceAny,\r\n /**\r\n * Local temp space relative to the execution context's POV\r\n */\r\n myTempSpace: IbGibSpaceAny,\r\n metaspace: MetaspaceService,\r\n /**\r\n * the peer that is continuing the sync\r\n */\r\n peer: SyncPeer_V1,\r\n }): Promise<SyncSagaContextIbGib_V1 | null> {\r\n const lc = `${this.lc}[${this.continueSync.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: f64e08bf77d1425378601f380384ec26)`); }\r\n\r\n const contextResult = await this.handleResponseSagaContext({\r\n sagaContext,\r\n mySpace,\r\n myTempSpace,\r\n metaspace,\r\n });\r\n\r\n if (!contextResult) {\r\n if (logalot) { console.log(`${lc} Handler returned null (Saga End). (I: 43da8bb6c846b1fe7766332643be0e26)`); }\r\n // does this ever hit now?\r\n return null; /* <<<< returns early */\r\n } else if (contextResult.nextFrameInfo?.sagaComplete) {\r\n // this is the current proper workflow I believe as of 01/22/2026\r\n return null; /* <<<< returns early */\r\n }\r\n\r\n // #region error conditions throw\r\n if (contextResult.errorMsg) {\r\n throw new Error(`Couldn't handle response saga context. errorMsg: ${contextResult.errorMsg} (E: 7b41a183cf3cb58a5859c803800cf826)`);\r\n } else if (!contextResult.nextFrameInfo) {\r\n throw new Error(`(UNEXPECTED) contextResult.nextFrameInfo falsy? (E: 5740542f5eb8ccb41dfec188d87c1e26)`);\r\n }\r\n // #endregion error conditions throw\r\n\r\n // create the return context\r\n const { frame, payloadIbGibsDomain } = contextResult.nextFrameInfo;\r\n\r\n const responseCtx = await this.createSyncSagaContext({\r\n sagaFrame: frame,\r\n localSpace: mySpace,\r\n payloadIbGibsDomain,\r\n metaspace,\r\n sessionIdentityAddr: sagaContext.rel8ns?.sessionIdentity?.[0],\r\n peer,\r\n skipSign: true,\r\n });\r\n\r\n\r\n const immediateValidationErrors = await validateContextAndSagaFrame({\r\n context: responseCtx,\r\n });\r\n if (immediateValidationErrors.length > 0) { throw new Error(`(UNEXPECTED) just created sync saga context () and there were immediateValidationErrors? immediateValidationErrors: ${immediateValidationErrors} (E: c120e8e0aa98673d685267a8a36e5826)`); }\r\n\r\n return responseCtx;\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n }\r\n\r\n\r\n\r\n /**\r\n * Drives the FSM loop of the Saga.\r\n *\r\n * @remarks\r\n * **Execution Context**: **Sender (Local)**.\r\n *\r\n * This method manages the \"Ping Pong\" request-response cycle on the Sender.\r\n * It sends frames via the Peer Witness and processes the responses using `handleSagaResponseContext`.\r\n *\r\n * **Data Transport Note**:\r\n * Actual ibGib data (payloads) are transported via `SyncSagaContext.rel8ns.payload`.\r\n * When `handleSagaResponseContext` returns a `nextPayloadIbGibs` (data to send), this loop injects it into\r\n * the NEXT request context.\r\n * When the Peer responds with data (in the response context), it is resolved and put into `tempSpace`.\r\n */\r\n private async executeSagaLoop({\r\n initFrame,\r\n initDomainGraph,\r\n peer,\r\n updates$,\r\n localSpace,\r\n tempSpace,\r\n metaspace\r\n }: {\r\n initFrame: SyncIbGib_V1,\r\n /**\r\n * This is the initial dependency graph of all domain ibgibs passed in\r\n * to the original {@link sync} call.\r\n *\r\n * if we're executing on the sender, this will be populated\r\n */\r\n initDomainGraph: FlatIbGibGraph,\r\n peer: SyncPeerWitness,\r\n updates$: SubjectWitness<SyncSagaContextIbGib_V1>,\r\n metaspace: MetaspaceService\r\n localSpace: IbGibSpaceAny,\r\n tempSpace: IbGibSpaceAny,\r\n }): Promise<void> {\r\n const lc = `${this.lc}[${this.executeSagaLoop.name}]`;\r\n\r\n /** The current frame we just generated (e.g., Init or Delta Request) */\r\n let currentFrame: SyncIbGib_V1 | null = initFrame;\r\n /** The **domain** payload we need to transmit (data we are sending) */\r\n let nextDomainIbGibs: IbGib_V1[] = [];\r\n\r\n while (currentFrame) {\r\n // first, prepare for context transmission...\r\n\r\n /**\r\n * this is used later in pollForDomainPayloads **iif** payloads are\r\n * received **in the response**, i.e., on the return trip. So if we\r\n * request addrs, the response should have these addrs and their\r\n * dependencies. The ibgibs corresponding to these addrs will be\r\n * streamed and placed into this map.\r\n */\r\n const domainPayloadsMap = new Map<string, IbGib_V1>();\r\n // #region set up peer observable for any domainPayloadsMap\r\n const sublc = `${lc}[peer.payloadIbGibsDomainReceived$]`;\r\n const subscription = await peer.payloadIbGibsDomainReceived$.subscribe(fnObs({\r\n next: async (ibgib: IbGib_V1) => {\r\n if (logalot) { console.log(`${sublc} next fired. (I: 2b4bdf502a38a90ba33d9711e7cb7826)`); }\r\n const addr = getIbGibAddr({ ibGib: ibgib });\r\n if (logalotControlDomain) { console.log(`${lc}${lcControlDomain} DOMAIN STREAM RECEIVED <- observable: ${addr} (I: d69ee80fcaece272483ec33b2d289826)`); }\r\n domainPayloadsMap.set(addr, ibgib);\r\n },\r\n error: async (e: string | Error | ErrorIbGib_V1) => {\r\n if (isIbGib(e)) {\r\n console.error(`${sublc} error fired. error: ${JSON.stringify((e as IbGib_V1).data)} (E: 01cc08ba05ad99682831174fd7c31a26)`);\r\n } else {\r\n console.dir(e);\r\n console.error(`${sublc} error fired. error: ${extractErrorMsg(e)} (E: 73d3d61464e8e4ce4cd6efd8b9675826)`);\r\n }\r\n },\r\n complete: async () => {\r\n if (logalot) { console.log(`${sublc} complete fired. (I: a47218aa9e4433fdb97c068880a45826)`); }\r\n await subscription.unsubscribe();\r\n },\r\n }));\r\n // #endregion set up peer observable for any domainPayloadsMap\r\n\r\n try {\r\n // ...create/compose the Request Context itself...\r\n const requestCtx = await this.createSyncSagaContext({\r\n sagaFrame: currentFrame,\r\n /**\r\n * init frame: empty\r\n * ack frame: possible push offers\r\n * delta frame: requested ibgibs or commit offer\r\n * commit frame: empty\r\n */\r\n payloadIbGibsDomain: nextDomainIbGibs,\r\n localSpace,\r\n metaspace,\r\n sessionIdentityAddr: peer.currentSessionIdentityAddr,\r\n peer,\r\n });\r\n\r\n // #region Log what we're sending\r\n if (logalotControlDomain) {\r\n const domainAddrs = nextDomainIbGibs.map(p => getIbGibAddr({ ibGib: p }));\r\n console.log(`${lc}${lcControlDomain} SENDER TRANSMIT -> peer.witness (I: 5b0081803698770f0bf64992220b312)`);\r\n console.log(`${lc}${lcControlDomain} Context: ${getIbGibAddr({ ibGib: requestCtx })}`);\r\n console.log(`${lc}${lcControlDomain} Frame: ${getIbGibAddr({ ibGib: currentFrame })}`);\r\n console.log(`${lc}${lcControlDomain} DOMAIN Payloads (${domainAddrs.length}): ${domainAddrs.join(', ') || '(none)'}`);\r\n }\r\n // #endregion Log what we're sending\r\n\r\n // update our saga listeners...\r\n // if (logalot) { console.log(`${lc} transmitting... requestCtx: ${pretty(requestCtx)} (I: 8cf20817c66899abdb1e76df50356826)`); }\r\n updates$.next(requestCtx); // spins off for saga UI updates\r\n\r\n // ...And send the context.\r\n peer.setOptionalOpts({ localSpace, localTempSpace: tempSpace, });\r\n const responseCtx = await peer.witness(requestCtx);\r\n\r\n // the send returned, but a peer can return a falsy responseCtx, if\r\n // we just sent a commit to them and they're done. If so, there will\r\n // necessarily be no payload to wait to receive\r\n if (!responseCtx) {\r\n if (currentFrame) {\r\n // Check for Commit (Peer silence expected)\r\n const msg = await getSyncSagaMessageFromFrame({ frameIbGib: currentFrame, space: localSpace });\r\n if (msg?.data?.stage === SyncStage.commit) {\r\n if (logalot) { console.log(`${lc} Sender sent Commit. Peer returned no response. Saga Complete. (I: 26f9ee073858ca78b8284753368b5226)`); }\r\n currentFrame = null;\r\n break;\r\n } else {\r\n throw new Error(`(UNEXPECTED) responseCtx falsy and currentFrame truthy, but we're not in the commit stage? This may be expected ultimately, but atow I am not seeing this as being expected. (E: cc34498962bd370deeff351fac939f26)`);\r\n }\r\n } else {\r\n throw new Error(`(UNEXPECTED) no response and currentFrame falsy? (E: 8d1085ea2f28cfc3f9c922649864a826)`);\r\n }\r\n }\r\n\r\n // at this point, we did indeed receive a response to analyze. BUT!\r\n // we have only necessarily received the response context ibgib.\r\n // if there were payloads expected to be transferred, they may not\r\n // be done yet.\r\n\r\n if (!responseCtx.data) { throw new Error(`(UNEXPECTED) responseCtx.data falsy? (E: a969992bae53ab18a827ec58aec15826)`); }\r\n updates$.next(responseCtx); // spins off for saga UI updating\r\n\r\n // immediately validate context/saga frame (but not payloads because\r\n // we may not have those yet)\r\n const contextAndSagaFrameValidationErrors =\r\n await validateContextAndSagaFrame({ context: responseCtx });\r\n if (contextAndSagaFrameValidationErrors.length > 0) { throw new Error(`contextAndSagaFrameValidationErrors: ${contextAndSagaFrameValidationErrors} (E: 6eebe8e7fa437c00a8cde3ada3c66826)`); }\r\n\r\n // Turn-by-turn continuation & identity checks\r\n const returnContextErrors = await this.validateReturnContext({\r\n requestCtx,\r\n responseCtx,\r\n localSpace,\r\n });\r\n if (returnContextErrors.length > 0) {\r\n throw new Error(`validateReturnContext errors: ${returnContextErrors.join(', ')} (E: cb8a023b9d0728cceb09fa3da0bb8226)`);\r\n }\r\n\r\n // Extract expected domain addresses from response context\r\n const responsePayloadAddrsDomain = responseCtx.data[SYNC_SAGA_PAYLOAD_ADDRS_DOMAIN] as string[] || [];\r\n\r\n // Poll for them if needed. see above jsdocs for domainPayloadsMap\r\n if (responsePayloadAddrsDomain.length > 0) {\r\n responseCtx.payloadIbGibsDomain = await this.pollForDomainPayloads({\r\n expectedAddrs: responsePayloadAddrsDomain,\r\n pollIntervalMs: 20, // relatively arbitrary right now\r\n domainPayloadsMap,\r\n tempSpace,\r\n });\r\n }\r\n\r\n // #region Log what we received back\r\n if (!responseCtx.sagaFrame) { throw new Error(`(UNEXPECTED) responseCtx.sagaFrame falsy? the Peer should have set this when it got the response back from the remote. (E: e650adadf9a2063ec6764a1e31d3d826)`); }\r\n if (logalotControlDomain) {\r\n const responseControlAddrs = responseCtx.data?.['@payloadAddrsControl'] as string[] || [];\r\n console.log(`${lc}${lcControlDomain} SENDER RECEIVED <- peer.witness (I: 3dc76a9744d89a4fc3e2f076c2be4826)`);\r\n console.log(`${lc}${lcControlDomain} Response Context: ${getIbGibAddr({ ibGib: responseCtx })}`);\r\n console.log(`${lc}${lcControlDomain} Response Saga Frame: ${getIbGibAddr({ ibGib: responseCtx.sagaFrame })}`);\r\n console.log(`${lc}${lcControlDomain} CONTROL Payloads (${responseControlAddrs.length}): ${responseControlAddrs.join(', ') || '(none)'}`);\r\n console.log(`${lc}${lcControlDomain} DOMAIN Payloads (${responsePayloadAddrsDomain.length}): ${responsePayloadAddrsDomain.join(', ') || '(none)'}`);\r\n }\r\n // #endregion Log what we received back\r\n\r\n // at this point, we have received the context AND **all** of the\r\n // domain payloads (if applicable), so we are ready to do the next\r\n // iteration in the saga loop\r\n\r\n // this is the part that drives the FSM forward, i.e., when we\r\n // evolve the sync saga ibgib itself to the next frame if we aren't\r\n // finished/errored out.\r\n const contextResult = await this.handleResponseSagaContext({\r\n sagaContext: responseCtx,\r\n initDomainGraph,\r\n mySpace: localSpace,\r\n myTempSpace: tempSpace,\r\n metaspace,\r\n });\r\n\r\n if (!contextResult) {\r\n // should this ever hit?\r\n console.error(`${lc} NAG ERROR (DOES NOT THROW): does this ever hit now? (E: e04d02efc2a8e72a88b79f1f0f95ca26)`);\r\n break;\r\n } else if (contextResult.nextFrameInfo?.sagaComplete) {\r\n if (logalot) { console.log(`${lc} Handler returned null (Saga End). (I: 123bf9e7dca8886de72553a8d4f29e26)`); }\r\n break;\r\n }\r\n\r\n // #region error conditions throw\r\n if (contextResult.errorMsg) {\r\n throw new Error(`Couldn't handle response saga context. errorMsg: ${contextResult.errorMsg} (E: c948e81d513b2a0eb8b8afa878edc626)`);\r\n } else if (!contextResult.nextFrameInfo) {\r\n throw new Error(`(UNEXPECTED) contextResult.nextFrameInfo falsy? (E: c287a82e823e662a77923278e2418826)`);\r\n }\r\n // #endregion error conditions throw\r\n\r\n // we have another frame to process and send out, with possibly\r\n // payload domain ibgibs as well\r\n const { frame, payloadIbGibsDomain, } = contextResult.nextFrameInfo;\r\n currentFrame = frame;\r\n nextDomainIbGibs = [...(payloadIbGibsDomain || [])];\r\n\r\n // #region Log handler output for next iteration\r\n if (logalotControlDomain) {\r\n const handlerDomainAddrs = nextDomainIbGibs.map(p => getIbGibAddr({ ibGib: p }));\r\n console.log(`${lc}${lcControlDomain} HANDLER RESULT -> next iteration (I: 6b0d88c4c28857ccd812381515bd7826)`);\r\n console.log(`${lc}${lcControlDomain} Next Frame: ${getIbGibAddr({ ibGib: currentFrame })}`);\r\n console.log(`${lc}${lcControlDomain} DOMAIN for next (${handlerDomainAddrs.length}): ${handlerDomainAddrs.join(', ') || '(none)'}`);\r\n }\r\n // #endregion Log handler output for next iteration\r\n } finally {\r\n await subscription.unsubscribe();\r\n }\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Creates new SyncSagaContext stone. Puts/registers in {@link localSpace}\r\n * immediately after creation.\r\n *\r\n * @returns The context ibGib.\r\n *\r\n * ## notes\r\n *\r\n * the other ibgibs that are related to this context stone should already be\r\n * put/registered in {@link localSpace}.\r\n */\r\n private async createSyncSagaContext({\r\n sagaFrame,\r\n payloadIbGibsDomain,\r\n metaspace,\r\n localSpace,\r\n sessionIdentityAddr,\r\n peer,\r\n skipSign,\r\n }: {\r\n /**\r\n * The main saga frame (Init, Ack, etc.).\r\n */\r\n sagaFrame: SyncIbGib_V1;\r\n /**\r\n * Domain payload ibgibs when the sync saga frame includes actual domain\r\n * payloads to send, e.g., in a Delta frame.\r\n */\r\n payloadIbGibsDomain?: IbGib_V1[];\r\n /**\r\n * reference to the current metaspace\r\n */\r\n metaspace: MetaspaceService,\r\n /**\r\n * we persist the context in the local/sender space (relative to our\r\n * execution POV) right when we create it.\r\n */\r\n localSpace: IbGibSpaceAny;\r\n sessionIdentityAddr?: string;\r\n peer: SyncPeerWitness;\r\n /**\r\n * If true, will not sign context.\r\n *\r\n * For now, this should be true when we call {@link continueSync}, as\r\n * the receiver does not sign any keystones.\r\n *\r\n * ## intent\r\n *\r\n * In V1, our receiving endpoint is not signing the context, rather, it\r\n * is just returning its response context ibgib with the same session\r\n * identity addr. We are thus trusting the security of the transport\r\n * itself for now.\r\n */\r\n skipSign?: boolean,\r\n }): Promise<SyncSagaContextIbGib_V1> {\r\n const lc = `[${this.createSyncSagaContext.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: 6b87bee313e811d1d2fc90e87fbec826)`); }\r\n\r\n // #region sanity/validation\r\n if (!sagaFrame.data) { throw new Error(`(UNEXPECTED) sagaFrame.data falsy? (E: 04c49b4cccba6842a8b52e4c6f570726)`); }\r\n if (!sagaFrame.data.n && sagaFrame.data.n !== 0) { throw new Error(`(UNEXPECTED) sagaFrame.data.n falsy and not 0? (E: 45b508da64a8b28428b11765d684b826)`); }\r\n // #endregion sanity/validation\r\n\r\n const date = new Date();\r\n const timestamp = getTimestamp(date);\r\n const timestampMs = date.getMilliseconds();\r\n\r\n const data: SyncSagaContextData_V1 = {\r\n timestamp,\r\n timestampMs,\r\n sagaN: sagaFrame.data.n,\r\n };\r\n\r\n // Domain Payloads\r\n const payloadAddrsDomain = payloadIbGibsDomain ?\r\n payloadIbGibsDomain?.map(x => getIbGibAddr({ ibGib: x })) :\r\n undefined;\r\n if (payloadAddrsDomain && payloadAddrsDomain.length > 0) {\r\n data[SYNC_SAGA_PAYLOAD_ADDRS_DOMAIN] = payloadAddrsDomain;\r\n }\r\n\r\n // rel8ns should always have saga frame\r\n const rel8ns: SyncSagaContextRel8ns_V1 = {\r\n sagaFrame: [getIbGibAddr({ ibGib: sagaFrame })],\r\n };\r\n\r\n let sessionIdentity: KeystoneIbGib_V1 | undefined = undefined;\r\n if (sessionIdentityAddr) {\r\n sessionIdentityAddr =\r\n await metaspace.getLatestAddr({ addr: sessionIdentityAddr, space: localSpace }) ?? sessionIdentityAddr;\r\n const resGet = await getFromSpace({ addr: sessionIdentityAddr, space: localSpace });\r\n if (resGet.success && resGet.ibGibs?.length === 1) {\r\n sessionIdentity = resGet.ibGibs![0]! as KeystoneIbGib_V1;\r\n rel8ns.sessionIdentity = [sessionIdentityAddr];\r\n } else {\r\n debugger; // what stage of the algo is this? which side?\r\n throw new Error(`Couldn't get sessionIdentityAddr (${sessionIdentityAddr}) in space: ${localSpace.ib} (E: 5c29e80d68dbd1749866c358be093826)`);\r\n }\r\n }\r\n\r\n // Generate standard ib\r\n const ib = await getSyncSagaContextIb({ data });\r\n\r\n const contextIbGib = await Factory_V1.stone<SyncSagaContextData_V1, SyncSagaContextRel8ns_V1>({\r\n parentPrimitiveIb: SYNC_SAGA_CONTEXT_ATOM,\r\n ib,\r\n data,\r\n rel8ns,\r\n }) as SyncSagaContextIbGib_V1;\r\n\r\n const contextAddr = getIbGibAddr({ ibGib: contextIbGib });\r\n let signedSessionIdentity: KeystoneIbGib_V1 | undefined = undefined;\r\n if (sessionIdentity && !skipSign) {\r\n // signing context persists and registers the new keystone\r\n // using the peer's localMetaspace and localSpace\r\n signedSessionIdentity = await peer.signContext({ contextAddr });\r\n }\r\n\r\n // put/register context immediately in local space (currently is a\r\n // DTO) but we don't want a broadcast on the metaspace\r\n await putInSpace({ ibGib: contextIbGib, space: localSpace, });\r\n await registerNewIbGib({\r\n ibGib: contextIbGib,\r\n space: localSpace,\r\n fnBroadcast: undefined,\r\n });\r\n\r\n // Attach actual ibgibs for transport\r\n contextIbGib.sagaFrame = sagaFrame;\r\n\r\n const { msgStones } = await getSyncSagaFrameDependencyGraph({\r\n sagaIbGib: sagaFrame,\r\n localSpace: localSpace,\r\n });\r\n if (msgStones.length !== 1) {\r\n throw new Error(`(UNEXPECTED) msgStones.length !== 1 inside createSyncSagaContext? (E: a98165cf46ab4e82b7bd5e45a273b826)`);\r\n }\r\n contextIbGib.sagaFrameMsg = msgStones[0];\r\n\r\n if (payloadIbGibsDomain && payloadIbGibsDomain.length > 0) {\r\n contextIbGib.payloadIbGibsDomain = payloadIbGibsDomain;\r\n }\r\n if (signedSessionIdentity) {\r\n contextIbGib.signedSessionIdentity = signedSessionIdentity;\r\n }\r\n\r\n return contextIbGib;\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n }\r\n\r\n /**\r\n * Helper to get Knowledge Map for specific domain ibGibs or TJPs.\r\n * Useful for testing and external validation.\r\n */\r\n public async getKnowledgeMap({\r\n space,\r\n metaspace,\r\n domainIbGibs,\r\n tjpAddrs,\r\n }: {\r\n space: IbGibSpaceAny,\r\n metaspace: MetaspaceService,\r\n domainIbGibs?: IbGib_V1[],\r\n tjpAddrs?: string[],\r\n }): Promise<{ [tjp: string]: string | null }> {\r\n const lc = `${this.lc}[${this.getKnowledgeMap.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: e184f8a7818666febfbbd2d841ed3826)`); }\r\n\r\n if (!(domainIbGibs && domainIbGibs.length > 0) &&\r\n !(tjpAddrs && tjpAddrs.length > 0)\r\n ) {\r\n throw new Error(`(UNEXPECTED) domainIbGibs and tjpAddrs falsy/empty? we need one or the other (E: f674285111c8648398cd79d8c08ec826)`);\r\n }\r\n\r\n if ((domainIbGibs && domainIbGibs.length > 0) &&\r\n (tjpAddrs && tjpAddrs.length > 0)\r\n ) {\r\n throw new Error(`(UNEXPECTED) both domainIbGibs and tjpAddrs truthy? only pass in one or the other. (E: f674285111c8648398cd79d8c08ec826)`);\r\n }\r\n\r\n let tjps: string[] = [];\r\n if (tjpAddrs) {\r\n tjps = tjpAddrs;\r\n } else if (domainIbGibs && domainIbGibs.length > 0) {\r\n // Extract TJPs from domain Ibgibs\r\n const { mapWithTjp_YesDna, mapWithTjp_NoDna } =\r\n splitPerTjpAndOrDna({ ibGibs: domainIbGibs });\r\n\r\n const allWithTjp = [...Object.values(mapWithTjp_YesDna), ...Object.values(mapWithTjp_NoDna)];\r\n const timelineMap = getTimelinesGroupedByTjp({ ibGibs: allWithTjp });\r\n\r\n tjps = Object.keys(timelineMap);\r\n } else {\r\n // No info provided. Return empty? Or throw?\r\n // User test context implied \"everything\", but implementation requires scope.\r\n console.warn(`${lc} No domainIbGibs or tjpAddrs provided. Returning empty Knowledge. (W: 2b0e115e7578a83d1b26f7c726bf9426)`);\r\n return {};\r\n }\r\n\r\n if (tjps.length === 0) { return {}; }\r\n\r\n const res = await getLatestAddrs({ space, tjpAddrs: tjps });\r\n if (!res.data || !res.data.latestAddrsMap) {\r\n throw new Error(`${lc} Failed to get latest addrs. (E: 7d395940c0e1419165c5196c39c6c826)`);\r\n }\r\n\r\n return res.data.latestAddrsMap;\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n }\r\n\r\n private async analyzeDomainIbGibs({\r\n domainIbGibs,\r\n space,\r\n }: {\r\n domainIbGibs: IbGib_V1[],\r\n space: IbGibSpaceAny,\r\n }): Promise<DomainIbGibAnalysisInfo> {\r\n const lc = `${this.lc}[${this.analyzeDomainIbGibs.name}]`;\r\n if (domainIbGibs.length === 0) {\r\n throw new Error(`invalid domainIbGibs. expected at least one, but array is empty. (E: 820a719bcac5a16878a2af697113b826)`);\r\n }\r\n\r\n const fullGraph = await getDependencyGraph({\r\n ibGibs: domainIbGibs,\r\n live: true,\r\n space,\r\n });\r\n\r\n const graphIsValid = fullGraph && Object.keys(fullGraph).length > 0;\r\n if (logalot) { console.log(`${lc} graph generated. nodes: ${graphIsValid ? Object.keys(fullGraph).length : 0}`); }\r\n\r\n const srcIbGibs = graphIsValid ? Object.values(fullGraph) : [];\r\n const {\r\n mapWithTjp_YesDna: srcMapWithTjp_YesDna,\r\n mapWithTjp_NoDna: srcMapWithTjp_NoDna,\r\n mapWithoutTjps: src_MapWithoutTjps\r\n } = splitPerTjpAndOrDna({ ibGibs: srcIbGibs });\r\n\r\n const stones = Object.values(src_MapWithoutTjps);\r\n const withTimelines = [...Object.values(srcMapWithTjp_YesDna), ...Object.values(srcMapWithTjp_NoDna)];\r\n\r\n const timelinesMap = getTimelinesGroupedByTjp({ ibGibs: withTimelines });\r\n const topologicallySortedTjpAddrs = this.sortTimelinesTopologically(timelinesMap);\r\n\r\n return { stones, timelinesMap, topologicallySortedTjpAddrs, fullGraph };\r\n }\r\n\r\n /**\r\n * Creates the Initial Saga Frame (Init Stage).\r\n *\r\n * @remarks\r\n * **Execution Context**: **Sender (Local)**.\r\n *\r\n * Generates the first frame containing the Knowledge Map of the Local Space.\r\n * This is sent to the Receiver to begin Gap Analysis.\r\n */\r\n private async createInitFrame({\r\n sagaId,\r\n domainIbGibs,\r\n conflictStrategy,\r\n metaspace,\r\n localSpace,\r\n tempSpace,\r\n peer,\r\n }: {\r\n sagaId: string,\r\n domainIbGibs: IbGib_V1[],\r\n conflictStrategy: SyncConflictStrategy,\r\n metaspace: MetaspaceService,\r\n localSpace: IbGibSpaceAny,\r\n tempSpace: IbGibSpaceAny,\r\n peer: SyncPeerWitness,\r\n }): Promise<{ initFrame: SyncIbGib_V1, initDomainGraph: { [addr: string]: IbGib_V1 } }> {\r\n const lc = `${this.lc}[${this.createInitFrame.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: 551af8b411ae9be712ce3358d43ee726)`); }\r\n\r\n // Analyze Timelines & Stones\r\n const analysis = await this.analyzeDomainIbGibs({ domainIbGibs, space: localSpace });\r\n // if (logalot) { console.log(`${lc} analysis: ${pretty(analysis)}(I: cd00e2be5eccc8976879c888ff2dfb26)`); }\r\n const { timelinesMap: srcTimelinesMap, fullGraph, stones: srcStones, } = analysis;\r\n\r\n // we need to store the fullGraph in our tempSpace for later...\r\n await putInSpace({ ibGibs: Object.values(fullGraph), space: tempSpace });\r\n\r\n // populate our knowledge map with tjp -> latest addr/tip in timeline\r\n const knowledgeMap: { [tjp: string]: IbGibAddr } = {};\r\n Object.keys(srcTimelinesMap).forEach(tjp => {\r\n const timeline = srcTimelinesMap[tjp];\r\n const tip = timeline.at(-1)!;\r\n knowledgeMap[tjp] = getIbGibAddr({ ibGib: tip });\r\n });\r\n const initData: SyncSagaMessageInitData_V1 = {\r\n sagaId,\r\n stage: SyncStage.init,\r\n knowledgeMap: knowledgeMap,\r\n mode: SyncMode.sync,\r\n stones: srcStones.map(s => getIbGibAddr({ ibGib: s })),\r\n };\r\n if (logalot) {\r\n console.log(`${lc} SyncStage.init: ${SyncStage.init}, SyncStage.commit: ${SyncStage.commit}`);\r\n console.log(`${lc} initData.stage: ${initData.stage}`);\r\n }\r\n\r\n // create the stone and save/register it\r\n const initStone = await this.createSyncMsgStone({\r\n data: initData,\r\n localSpace,\r\n metaspace,\r\n });\r\n // if (logalot) { console.log(`${lc} initStone: ${pretty(initStone)} (I: 06e532f8a408549069474e96bed44826)`); }\r\n\r\n // create the initial sync ibgib frame, save/register it\r\n const sagaFrame = await this.evolveSyncSagaIbGib({\r\n msgStones: [initStone],\r\n conflictStrategy,\r\n metaspace,\r\n localSpace,\r\n sessionIdentity: peer.currentSessionIdentity,\r\n });\r\n\r\n if (logalot) { console.log(`${lc} sagaFrame (init): ${pretty(sagaFrame)} (I: b3d6a8be69248f18713cc3073cb08626)`); }\r\n\r\n return { initFrame: sagaFrame, initDomainGraph: fullGraph };\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n }\r\n\r\n /**\r\n * Validates that the return context received from a peer is a valid\r\n * continuation of the outbound context and that the session identity\r\n * is consistent.\r\n */\r\n private async validateReturnContext({\r\n requestCtx,\r\n responseCtx,\r\n localSpace,\r\n }: {\r\n requestCtx: SyncSagaContextIbGib_V1,\r\n responseCtx: SyncSagaContextIbGib_V1,\r\n localSpace: IbGibSpaceAny,\r\n }): Promise<string[]> {\r\n const lc = `${this.lc}[${this.validateReturnContext.name}]`;\r\n const errors: string[] = [];\r\n try {\r\n // 1. Verify saga frame continuation\r\n if (requestCtx.sagaFrame && responseCtx.sagaFrame) {\r\n const requestFrameAddr = getIbGibAddr({ ibGib: requestCtx.sagaFrame });\r\n const responseFrameAddr = getIbGibAddr({ ibGib: responseCtx.sagaFrame });\r\n\r\n const isContinuation = await isPastFrame({\r\n olderAddr: requestFrameAddr,\r\n newerAddr: responseFrameAddr,\r\n space: localSpace,\r\n });\r\n if (!isContinuation) {\r\n errors.push(`Response saga frame (${responseFrameAddr}) is not a valid continuation of request saga frame (${requestFrameAddr}). (E: 2c85e8d97318ff24ac8a02bd3a068226)`);\r\n }\r\n } else {\r\n errors.push(`Missing sagaFrame on requestCtx or responseCtx. (E: b65c68ff891000ddca8d22384a088226)`);\r\n }\r\n\r\n // 2. Verify session identity has not changed\r\n const expectedSessionIdAddr = requestCtx.signedSessionIdentity ?\r\n getIbGibAddr({ ibGib: requestCtx.signedSessionIdentity }) :\r\n requestCtx.rel8ns?.sessionIdentity?.[0];\r\n const responseSessionIdAddr = responseCtx.rel8ns?.sessionIdentity?.[0];\r\n if (expectedSessionIdAddr !== responseSessionIdAddr) {\r\n errors.push(`Session identity mismatch. Expected ${expectedSessionIdAddr}, got ${responseSessionIdAddr}. (E: ab98716bca88d2243cc822187768226)`);\r\n }\r\n } catch (error) {\r\n errors.push(`Error during validateReturnContext: ${extractErrorMsg(error)} (E: da878e1239aa88ee27bdfca005c28226)`);\r\n }\r\n return errors;\r\n }\r\n\r\n /**\r\n * Helper to poll for streaming domain payloads and put them in the\r\n * local {@link tempSpace}.\r\n *\r\n * @returns when all {@link expectedAddrs} are done being transmitted.\r\n */\r\n private async pollForDomainPayloads({\r\n expectedAddrs,\r\n pollIntervalMs,\r\n domainPayloadsMap,\r\n tempSpace,\r\n }: {\r\n expectedAddrs: string[],\r\n pollIntervalMs: number,\r\n domainPayloadsMap: Map<string, IbGib_V1>,\r\n tempSpace: IbGibSpaceAny,\r\n }): Promise<IbGib_V1[]> {\r\n const lc = `${this.lc}[${this.pollForDomainPayloads.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: 26dce86bfca572939885798802d6e926)`); }\r\n\r\n let resultDomainPayloads: IbGib_V1[] = [];\r\n\r\n const uniqueExpectedAddrs = [...new Set(expectedAddrs)];\r\n let pending = [...uniqueExpectedAddrs];\r\n const start = Date.now();\r\n /**\r\n * This needs\r\n */\r\n const timeoutMs = 5 * 60 * 1000; // 5 minutes...arbitrary at this point. This needs to be pulled out and improved eesh.\r\n\r\n while (pending.length > 0) {\r\n if (Date.now() - start > timeoutMs) {\r\n throw new Error(`Timeout waiting for payloads: ${pending.join(', ')} (E: 46e1683c9578095261aaf798bd5e1826)`);\r\n }\r\n\r\n const stillPending: string[] = [];\r\n const found: IbGib_V1[] = [];\r\n\r\n for (const addr of pending) {\r\n if (domainPayloadsMap.has(addr)) {\r\n found.push(domainPayloadsMap.get(addr)!);\r\n domainPayloadsMap.delete(addr);\r\n } else {\r\n stillPending.push(addr);\r\n }\r\n }\r\n\r\n if (found.length > 0) {\r\n await putInSpace({ space: tempSpace, ibGibs: found });\r\n found.forEach(x => resultDomainPayloads.push(x));\r\n }\r\n\r\n pending = stillPending;\r\n\r\n if (pending.length > 0) { await delay(pollIntervalMs); }\r\n }\r\n\r\n if (uniqueExpectedAddrs.length !== resultDomainPayloads.length) {\r\n throw new Error(`(UNEXPECTED) uniqueExpectedAddrs.length !== resultDomainPayloads.length? at this point, we expect all of the payload ibgibs to have been received. (E: 03749a7478c4b8b28bfc86951887a826)`);\r\n }\r\n\r\n return resultDomainPayloads;\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n }\r\n\r\n /**\r\n * This is the heart of the \"ping pong\" transaction, where we send a context\r\n *\r\n * and receive a context. IOW, this drives the FSM of the sync saga ibgib as\r\n * a whole.\r\n *\r\n * This is called in two places:\r\n *\r\n * ## 1. Sender\r\n *\r\n * On the sender, this is called repeatedly within the the sync saga\r\n * coordinator's {@link executeSagaLoop} which initiates and drives the\r\n * overall sync process. This loop continues until there are no more frames\r\n * to be exchanged between endpoints.\r\n *\r\n * ## 2. Receiver\r\n *\r\n * On the receiver, this is called directly from {@link continueSync}, which\r\n * itself is called either directly by the concrete sync peer or from within\r\n * the receiving node endpoint. That endpoint's job is basically to get\r\n * these things collocated and prepared to make this call.\r\n *\r\n * In contrast to the sender, this can be thought of as a one-off on the\r\n * receiver, since the sender's {@link executeSagaLoop} is what actually\r\n * drives the ping-pong process.\r\n */\r\n private async handleResponseSagaContext({\r\n sagaContext,\r\n initDomainGraph,\r\n mySpace,\r\n myTempSpace,\r\n metaspace,\r\n }: {\r\n sagaContext: SyncSagaContextIbGib_V1,\r\n /**\r\n * This is the initial dependency graph of all domain ibgibs passed in\r\n * to the original {@link sync} call.\r\n *\r\n * if we're executing on the sender, this will be populated\r\n */\r\n initDomainGraph?: FlatIbGibGraph,\r\n /**\r\n * Local space relative to the execution context's POV\r\n */\r\n mySpace: IbGibSpaceAny,\r\n /**\r\n * Local temp space relative to the execution context's POV\r\n */\r\n myTempSpace: IbGibSpaceAny,\r\n metaspace: MetaspaceService,\r\n }): Promise<HandleSagaResponseContextResult> {\r\n const lc = `${this.lc}[${this.handleResponseSagaContext.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: 5deec8a1f7a6d263c88cd458ad990826)`); }\r\n\r\n const sagaIbGib = sagaContext.sagaFrame;\r\n if (!sagaIbGib.data) { throw new Error(`(UNEXPECTED) sagaIbGib.data falsy? (E: 71b938adf1d87c2527bfd4f86dfd0826)`); }\r\n if (logalot) { console.log(`${lc} sagaIbGib: ${pretty(sagaIbGib)} (I: 1b99d87d262e9d18d8a607a80b1a0126)`); }\r\n\r\n // Get Stage from Stone (or Frame for Init fallback)\r\n const { stage, messageData } = await this.getStageAndPayloadFromFrame({ sagaFrame: sagaIbGib, space: mySpace });\r\n\r\n if (logalot) { console.log(`${lc} handling frame stage: ${stage}`); }\r\n\r\n let nextFrameInfo: NextSagaFrameInfo;\r\n switch (stage) {\r\n case SyncStage.init:\r\n nextFrameInfo = await this.handleInitFrame({\r\n sagaIbGib,\r\n messageData: messageData as SyncSagaMessageInitData_V1,\r\n metaspace, mySpace, myTempSpace,\r\n });\r\n break;\r\n\r\n case SyncStage.ack:\r\n if (!initDomainGraph) { throw new Error(`(UNEXPECTED) initDomainGraph falsy on the sender? (E: a3d758ad954829aba88663188eafc826)`); }\r\n nextFrameInfo = await this.handleAckFrame({\r\n sagaContext,\r\n sagaIbGib,\r\n initDomainGraph,\r\n metaspace, mySpace, myTempSpace,\r\n });\r\n break;\r\n\r\n case SyncStage.delta:\r\n nextFrameInfo = await this.handleDeltaFrame({\r\n sagaContext,\r\n sagaIbGib,\r\n metaspace, mySpace, myTempSpace,\r\n });\r\n break;\r\n\r\n case SyncStage.commit:\r\n if (logalot) { console.log(`${lc}[${getSyncSagaFrameOrigin({ sagaFrame: sagaIbGib })}] mySpace.ib: ${mySpace.ib} (I: 5b270996d848907238d817fffa64a126)`); }\r\n nextFrameInfo = await this.handleCommitFrame({\r\n sagaIbGib,\r\n metaspace, mySpace, myTempSpace,\r\n });\r\n break;\r\n\r\n default:\r\n throw new Error(`${lc} (UNEXPECTED) Unknown sync stage: ${stage} (E: 9c2b4c8a6d34469f8263544710183355)`);\r\n }\r\n\r\n if (logalot) { console.log(`${lc} nextFrameInfo: ${nextFrameInfo ? pretty(nextFrameInfo) : 'undefined'} (I: a8ad281ca8e89385686d18327a105726)`); }\r\n\r\n return { errorMsg: undefined, nextFrameInfo, }\r\n\r\n } catch (error) {\r\n const errorMsg = `${lc} ${extractErrorMsg(error)}`;\r\n console.error(errorMsg);\r\n return { errorMsg }\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n }\r\n\r\n // #region Handlers\r\n\r\n /**\r\n * Handles the `Init` frame.\r\n *\r\n * @remarks\r\n * **Execution Context**: **Receiver (Remote)**.\r\n *\r\n * The Receiver performs Gap Analysis here:\r\n * 1. Compares Sender's Knowledge Map (in `sagaIbGib`) vs Receiver's Local Knowledge Map.\r\n * 2. Identifies what Sender needs (`pushOfferAddrs`).\r\n * 3. Identifies what Receiver needs (`deltaRequestAddrInfos`).\r\n * 4. Returns an `Ack` frame containing these lists.\r\n */\r\n private async handleInitFrame({\r\n sagaIbGib,\r\n messageData,\r\n mySpace,\r\n myTempSpace,\r\n metaspace,\r\n }: {\r\n sagaIbGib: SyncIbGib_V1,\r\n messageData: SyncSagaMessageInitData_V1,\r\n /**\r\n * Local space relative to the execution context's POV\r\n */\r\n mySpace: IbGibSpaceAny,\r\n /**\r\n * Local temp space relative to the execution context's POV.\r\n *\r\n * NOTE: Since this always executes on the receiver's end, this should\r\n * be the receiver's temp space.\r\n */\r\n myTempSpace: IbGibSpaceAny,\r\n metaspace: MetaspaceService,\r\n }): Promise<NextSagaFrameInfo> {\r\n const lc = `${this.lc}[${this.handleInitFrame.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: 9d88dcad0408c029e898a4bcf3b08426)`); }\r\n\r\n if (logalot) { console.log(`${lc} [TEST DEBUG] Receiver mySpace: ${mySpace.ib}`); }\r\n\r\n // Extract Init Data\r\n const initData = messageData as SyncSagaMessageInitData_V1; // Using renamed variable for clarity\r\n if (initData.stage !== SyncStage.init) {\r\n throw new Error(`${lc} Invalid init frame: initData.stage !== SyncStage.init (E: c91be82970e4decc58f56bf8fc1ffc26)`);\r\n }\r\n // if (logalot) { console.log(`${lc} initData: ${pretty(initData)} (I: 46b0f8441b96ad7a388f1ce3239dd826)`); }\r\n if (!initData || !initData.knowledgeMap) {\r\n throw new Error(`${lc} Invalid init frame: missing knowledgeMap (E: ed02c869e028d2d06841b9c7f80f2826)`);\r\n }\r\n\r\n // Determine Strategy from Saga Data (since V1 stores it in root)\r\n const conflictStrategy = sagaIbGib.data!.conflictStrategy || SyncConflictStrategy.abort;\r\n\r\n // 2. Gap Analysis\r\n const conflicts: SyncSagaConflictInfo[] = [];\r\n const deltaRequestAddrInfos: SyncSagaRequestAddrInfo[] = [];\r\n const pushOfferInfos: SyncSagaPushOfferInfo[] = [];\r\n\r\n // First do the consant stones (Non-TJPs)\r\n const stones = initData.stones || [];\r\n if (stones.length > 0) {\r\n if (logalot) { console.log(`${lc} processing stones: ${stones.length}`); }\r\n // Check if we have these stones\r\n const resStones = await getFromSpace({ space: mySpace, addrs: stones });\r\n const rawResultIbGib = resStones.rawResultIbGib as IbGibSpaceResultIbGib<IbGib_V1, IbGibSpaceResultData, IbGibSpaceResultRel8ns>;\r\n if (!rawResultIbGib.data) { throw new Error(`(UNEXPECTED) rawResultIbGib.data falsy? (E: f3c40b492adc02c3f480b998fc7a5926)`); }\r\n const addrsNotFound = rawResultIbGib.data.addrsNotFound;\r\n if (addrsNotFound && addrsNotFound.length > 0) {\r\n if (logalot) { console.log(`${lc} stones missing (requesting): ${addrsNotFound.length}`); }\r\n addrsNotFound.forEach(addr => {\r\n if (!deltaRequestAddrInfos.some(x => x.addr === addr)) {\r\n deltaRequestAddrInfos.push({ addr }); // no tjpAddr\r\n }\r\n });\r\n }\r\n }\r\n\r\n const senderKnowledge = initData.knowledgeMap;\r\n if (logalot) { console.log(`${lc} senderKnowledge: ${pretty(senderKnowledge)} (I: 9f957862356dfeae183c200854e86e26)`); }\r\n const senderTjpAddrs = Object.keys(senderKnowledge);\r\n if (logalot) { console.log(`${lc} [TEST DEBUG] senderTjpAddrs: ${JSON.stringify(senderTjpAddrs)}`); }\r\n if (logalot) { console.log(`${lc} senderTjpAddrs: ${pretty(senderTjpAddrs)} (I: 86ea4c53db0dc184c8b253386c402126)`); }\r\n\r\n // 1. Get receiver Latest Addrs for all TJPs\r\n let receiverLatestAddrsMap: { [tjp: string]: string | null } = {};\r\n if (senderTjpAddrs.length > 0) {\r\n // Batch get latest addrs for the TJPs\r\n const resGetLatestAddrs = await getLatestAddrs({\r\n space: mySpace, // executing on receiver, so this is receiver's space\r\n tjpAddrs: senderTjpAddrs,\r\n });\r\n if (!resGetLatestAddrs.data) { throw new Error(`(UNEXPECTED) resGetLatestAddrs.data falsy? (E: b180d813c088042b38e1e02e06a16926)`); }\r\n if (!resGetLatestAddrs.data.latestAddrsMap) { throw new Error(`(UNEXPECTED) resGetLatestAddrs.data.latestAddrsMap falsy? (E: 16bc386dd51d0ff53a49620b1e641826)`); }\r\n receiverLatestAddrsMap = resGetLatestAddrs.data.latestAddrsMap;\r\n if (logalot) { console.log(`${lc} [TEST DEBUG] receiverLatestAddrsMap: ${JSON.stringify(receiverLatestAddrsMap)}`); }\r\n if (logalot) { console.log(`${lc} receiverLatestAddrsMap: ${pretty(receiverLatestAddrsMap)} (I: 980975642cbccd8018cf0cd808d30826)`); }\r\n }\r\n\r\n // 2. Gap Analysis\r\n for (const tjpAddr of senderTjpAddrs) {\r\n const senderTipAddr = senderKnowledge[tjpAddr];\r\n const receiverTipAddr = receiverLatestAddrsMap[tjpAddr];\r\n\r\n if (!receiverTipAddr) {\r\n // We (Receiver) don't have this timeline at all. Request it.\r\n if (logalot) { console.log(`${lc} [TEST DEBUG] Missing receiver timeline for TJP: ${tjpAddr}. Requesting remoteAddr: ${senderTipAddr}`); }\r\n deltaRequestAddrInfos.push({\r\n addr: senderTipAddr,\r\n tjpAddr: tjpAddr,\r\n // we don't have this timeline at all\r\n // latestAddrAlreadyHave: undefined\r\n });\r\n continue;\r\n }\r\n\r\n // we do have this timeline...\r\n\r\n if (receiverTipAddr === senderTipAddr) {\r\n // ...already synced\r\n if (logalot) { console.log(`${lc} [TEST DEBUG] TJP ${tjpAddr}: Synced (receiverTipAddr === remoteAddr)`); }\r\n continue;\r\n }\r\n if (logalot) { console.log(`${lc} [TEST DEBUG] TJP ${tjpAddr}: receiverTipAddr=${receiverTipAddr}, remoteAddr=${senderTipAddr} - checking for divergence...`); }\r\n\r\n // we have this timeline but it's not synced...\r\n\r\n // We're executing on receiver. Check if Remote (Sender) is in\r\n // our past, and if so, we are ahead and need to push the delta\r\n // to remote\r\n const remoteIsInPast = await isPastFrame({\r\n olderAddr: senderTipAddr,\r\n newerAddr: receiverTipAddr,\r\n space: mySpace,\r\n });\r\n\r\n if (remoteIsInPast) {\r\n // we're ahead, so push the delta of what the sender doesn't\r\n // have (we have full knowledge)\r\n if (logalot) { console.log(`${lc} [TEST DEBUG] TJP ${tjpAddr}: Remote (sender) is in past - offering push`); }\r\n const deltaGraph = await getDeltaDependencyGraph({\r\n ibGibAddr: receiverTipAddr,\r\n live: false, // always live: false right?\r\n latestCommonFrameAddr: senderTipAddr,\r\n space: mySpace,\r\n });\r\n pushOfferInfos.push({ tjpAddr: tjpAddr, addrs: Object.keys(deltaGraph), });\r\n } else {\r\n // Remote tip is not in our past. So, either Remote is\r\n // ahead (we're in THEIR past, i.e., Fast-Backward) OR\r\n // Diverged/conflict (we've both made edits).\r\n\r\n // Check if receiver is in sender's PAST (Remote is Ahead -> Delta Request)\r\n /**\r\n * we could first check for existence of remoteAddr in\r\n * mySpace, but this is quick and easy. If it throws, we\r\n * don't have it so it can't be in the past.\r\n */\r\n let receiverIsInPast = false;\r\n try {\r\n receiverIsInPast = await isPastFrame({\r\n olderAddr: receiverTipAddr,\r\n newerAddr: senderTipAddr,\r\n space: mySpace,\r\n });\r\n } catch (error) {\r\n // couldn't get one of them, so receiverIsInPast remains false.\r\n if (logalot) { console.log(`${lc} expected error if we don't have remote. verbose logging error though: ${extractErrorMsg(error)} (I: 47ea08d0b418cf4aa8a502a7bcb80826)`); }\r\n }\r\n\r\n if (receiverIsInPast) {\r\n // Fast-Forward: We update to remote's tip and we're done.\r\n if (logalot) { console.log(`${lc} [TEST DEBUG] TJP ${tjpAddr}: receiver is in past - requesting delta`); }\r\n deltaRequestAddrInfos.push({\r\n addr: senderTipAddr,\r\n tjpAddr: tjpAddr,\r\n latestAddrAlreadyHave: receiverTipAddr,\r\n });\r\n } else {\r\n // DIVERGENCE: Both have changes the other doesn't know\r\n // about and we don't have enough info at this point\r\n if (logalot) { console.log(`${lc} [TEST DEBUG] TJP ${tjpAddr}: DIVERGENCE DETECTED! conflictStrategy=${conflictStrategy}`); }\r\n\r\n if (conflictStrategy === 'abort') {\r\n // Abort Strategy: We will treat this as terminal.\r\n // But for Unified Ack, we just mark it terminal in the list?\r\n // Or do we actually throw/abort the saga?\r\n // Current logic (below) aborts the saga if ANY conflict is terminal/abort.\r\n conflicts.push({\r\n tjpAddr: tjpAddr,\r\n receiverTipAddr,\r\n senderTipAddr,\r\n receiverKnowledgeTimelineAddrs: [], // Not needed for abort\r\n reason: 'divergence',\r\n terminal: true\r\n });\r\n // todo: create error saga frame for when aborting or other terminal error?\r\n } else if (conflictStrategy === SyncConflictStrategy.optimisticWithLCS) {\r\n // Optimistic with LCS (longest common subsequence):\r\n // We want resolve this by grafting the later\r\n // divergent branch onto the earlier one, and we\r\n // will prefer text merges when we see changes in\r\n // data.text\r\n\r\n // Fetch Full History for receiver's Timeline\r\n const resReceiverTipIbGib = await getFromSpace({ addr: receiverTipAddr, space: mySpace, });\r\n if (!resReceiverTipIbGib.success || resReceiverTipIbGib.ibGibs?.length !== 1) {\r\n throw new Error(`couldn't get local tip (${receiverTipAddr}) from space (${mySpace.ib}). errorMsg: ${resReceiverTipIbGib.errorMsg ?? '[unknown error (E: b3c3d823276300aa384ebdba4a8eb826)]'} (E: 83cb88a767e22bbda99c6788bec50526)`);\r\n }\r\n const receiverTipIbGib = resReceiverTipIbGib.ibGibs[0];\r\n const pastAddrs = await getHistoryAddrs({\r\n timeline: receiverTipIbGib,\r\n space: mySpace,\r\n metaspace,\r\n });\r\n conflicts.push({\r\n tjpAddr: tjpAddr,\r\n receiverTipAddr,\r\n senderTipAddr,\r\n receiverKnowledgeTimelineAddrs: [...pastAddrs, receiverTipAddr],\r\n reason: 'divergence',\r\n terminal: false\r\n });\r\n } else {\r\n throw new Error(`${lc} Unsupported conflict strategy: ${conflictStrategy}. Only these currently implemented: ${SYNC_CONFLICT_STRATEGY_VALID_VALUES} (E: 8f12384180f8a718a983a749fe0adf26)`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Check if we should ABORT (if any conflict is terminal)\r\n const hasTerminalConflicts = conflicts.some(c => c.terminal);\r\n\r\n if (hasTerminalConflicts) {\r\n // Abort Strategy: Kill the saga.\r\n if (logalot) { console.warn(`${lc} ABORTING Sync Saga due to terminal conflicts: ${JSON.stringify(conflicts)}`); }\r\n\r\n throw new Error(`the saga has terminal conflicts. conflicts: ${JSON.stringify(conflicts)} (E: f2edbe93cc07a63b38bfc013d2213b26)`);\r\n }\r\n\r\n // 3. Create Ack Frame\r\n if (!sagaIbGib.data) { throw new Error(`(UNEXPECTED) sagaIbGib.data falsy? (E: 24203af4600fb226ae6c1afbde442826)`); }\r\n const sagaId = sagaIbGib.data.uuid;\r\n // Create Payload Stone\r\n const ackData: SyncSagaMessageAckData_V1 = {\r\n sagaId,\r\n stage: SyncStage.ack,\r\n deltaRequestAddrInfos,\r\n pushOfferInfos,\r\n };\r\n if (conflicts?.length > 0) { ackData.conflicts = conflicts; }\r\n // let rel8ns: SyncSagaMessageRel8ns_V1 | undefined = undefined;\r\n // if (pushOfferInfos.length > 0) {\r\n // // we are pushing because we're ahead and we will need to add\r\n // // these to the list of addrs to be registered during commit\r\n // // phase\r\n // const newAddrsToRegister: IbGibAddr[] = [];\r\n // pushOfferInfos.forEach(info => {\r\n // if (info.tjpAddr) {\r\n\r\n // } else {\r\n // // stone? register non-dnas\r\n // const nonDnaAddrs = info.addrs.filter(addr => ['fork', 'mut8', 'rel8'].every(transformAtom => !addr.startsWith(transformAtom)));\r\n // nonDnaAddrs.forEach(x => newAddrsToRegister.push(x));\r\n // }\r\n // });\r\n // if (newAddrsToRegister.length > 0) {\r\n // rel8ns = { [NEW_ADDRS_TO_REGISTER_REL8N_NAME]: newAddrsToRegister }\r\n // }\r\n // }\r\n\r\n const ackStone = await this.createSyncMsgStone({\r\n data: ackData,\r\n localSpace: mySpace,\r\n metaspace,\r\n });\r\n if (logalot) { console.log(`${lc} ackStone created: ${pretty(ackStone)} (I: 313708132dd53ff946befb7833657826)`); }\r\n\r\n // Evolve Saga\r\n const ackFrame = await this.evolveSyncSagaIbGib({\r\n prevSagaIbGib: sagaIbGib,\r\n msgStones: [ackStone],\r\n localSpace: mySpace,\r\n metaspace,\r\n });\r\n\r\n // if (logalot) { console.log(`${lc} ackFrame created: ${pretty(ackFrame)} (I: be24480592eec478086bb3da49286826)`); }\r\n\r\n /**\r\n * we want to push ibgibs to the remote/sender if we have push\r\n * offers. an ack frame's payloads, if any, are those push offers\r\n */\r\n let payloadIbGibsDomain: IbGib_V1[] | undefined;\r\n if (pushOfferInfos.length > 0) {\r\n const searchSecondSpaceAddrs: IbGibAddr[] = [];\r\n payloadIbGibsDomain = [];\r\n const domainAddrs: IbGibAddr[] = pushOfferInfos.flatMap(x => x.addrs);\r\n const resGet = await getFromSpace({ addrs: domainAddrs, space: mySpace, });\r\n const resGetRawData = resGet.rawResultIbGib?.data as IbGibSpaceResultData | undefined;\r\n if (!resGetRawData) { throw new Error(`(UNEXPECTED) resGet.rawResultIbGib.data falsy? (E: 1a2cc8cb99a1ffa60837e45a8229b826)`); }\r\n const addrsNotFound = resGetRawData.addrsNotFound ?? [];\r\n const addrsErrored = resGetRawData.addrsErrored ?? [];\r\n if (resGet.ibGibs && resGet.ibGibs.length === domainAddrs.length) {\r\n // found all of them\r\n resGet.ibGibs.forEach(x => { payloadIbGibsDomain!.push(x) })\r\n } else if (resGet.ibGibs && resGet.ibGibs.length > 0) {\r\n // found some of them\r\n resGet.ibGibs.forEach(x => { payloadIbGibsDomain!.push(x) })\r\n const foundPlusNotFoundCount =\r\n payloadIbGibsDomain.length +\r\n addrsNotFound.length +\r\n addrsErrored.length;\r\n if (foundPlusNotFoundCount === domainAddrs.length) {\r\n // we can still conceivably get the remaining addrs\r\n addrsNotFound.forEach(x => searchSecondSpaceAddrs.push(x));\r\n addrsErrored.forEach(x => searchSecondSpaceAddrs.push(x));\r\n } else if (addrsNotFound.length === 0 && addrsErrored.length === 0) {\r\n throw new Error(`(UNEXPECTED) found some but not all addrs but addrsNotFound and addrsErrored both empty? (E: ef1b2cf5bab8de2298ec507abe04e826)`);\r\n } else {\r\n throw new Error(`(UNEXPECTED) found some but not all addrs but addrsNotFound and addrsErrored don't contain the addrs not found? (E: ae9e015109f8c3c3a813da584cd98826)`);\r\n }\r\n } else {\r\n // found none of them(?)\r\n console.warn(`${lc} we were expecting all domainAddrs in mySpace (${mySpace.ib}) but we couldn't get all of them. addrsNotFound: ${addrsNotFound ?? []}. addrsErrored: ${addrsErrored ?? []}. Trying temp space (${myTempSpace.ib}). (W: f61908e264f8dddd2e3fb9084463d826)`);\r\n domainAddrs.forEach(x => searchSecondSpaceAddrs.push(x));\r\n }\r\n if (searchSecondSpaceAddrs.length > 0) {\r\n if (logalot) { console.log(`${lc} couldn't get all addrs in mySpace (${mySpace.ib}). searchSecondSpaceAddrs: ${searchSecondSpaceAddrs} (I: 233fd954dbd84e51bca02fa8eed5f826)`); }\r\n const resGet2 = await getFromSpace({ addrs: searchSecondSpaceAddrs, space: myTempSpace, });\r\n if (resGet2.success && resGet2.ibGibs && resGet2.ibGibs.length === searchSecondSpaceAddrs.length) {\r\n // got them all the second try\r\n resGet2.ibGibs.forEach(x => payloadIbGibsDomain!.push(x));\r\n } else {\r\n resGet2.ibGibs?.forEach(x => payloadIbGibsDomain!.push(x));\r\n const addrsFailed = domainAddrs.filter(x =>\r\n !payloadIbGibsDomain!.map(pid => getIbGibAddr({ ibGib: pid })).includes(x)\r\n );\r\n throw new Error(`couldn't get some or all of addrs from either mySpace (${mySpace.ib}) or myTempSpace (${myTempSpace.ib}). addrsFailed: ${addrsFailed} (E: 1394d412c4ffa4dd085f269b43338826)`);\r\n }\r\n }\r\n // we have now populated payloadIbGibsDomain\r\n }\r\n\r\n return {\r\n frame: ackFrame,\r\n payloadIbGibsDomain,\r\n };\r\n\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n }\r\n\r\n /**\r\n * Handles the `Ack` frame.\r\n *\r\n * @remarks\r\n * **Execution Context**: **Sender (Local)**.\r\n *\r\n * The Sender reacts to the Receiver's requirements:\r\n * 1. `deltaRequestAddrInfos`: Receiver wants this data. Sender takes this\r\n * into account, plus gathers it from `initDomainGraph` and puts them in\r\n * `payloadIbGibs` (for next frame).\r\n * 2. `pushOfferAddrs`: Receiver has newer data. these should have been\r\n * included in the incoming context from the receiver..\r\n *\r\n * Returns a `Delta` frame.\r\n */\r\n private async handleAckFrame({\r\n sagaContext,\r\n sagaIbGib,\r\n initDomainGraph,\r\n mySpace, myTempSpace, metaspace,\r\n }: {\r\n sagaContext: SyncSagaContextIbGib_V1,\r\n sagaIbGib: SyncIbGib_V1,\r\n /**\r\n * This is the initial dependency graph of all domain ibgibs passed in\r\n * to the original {@link sync} call.\r\n *\r\n * if we're executing on the sender, this will be populated\r\n */\r\n initDomainGraph: FlatIbGibGraph,\r\n mySpace: IbGibSpaceAny,\r\n myTempSpace: IbGibSpaceAny,\r\n metaspace: MetaspaceService,\r\n }): Promise<NextSagaFrameInfo> {\r\n const lc = `${this.lc}[${this.handleAckFrame.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: 605b6860e898267a5b50c6d85704be26)`); }\r\n\r\n const { messageData, } = await this.getStageAndPayloadFromFrame({ sagaFrame: sagaIbGib, space: mySpace });\r\n const ackData = messageData as SyncSagaMessageAckData_V1;\r\n /**\r\n * if at any time we find that commit will not be possible, this\r\n * will be set to false.\r\n */\r\n let proposeCommit = true;\r\n // /**\r\n // * outgoing requests should be registered in the commit phase.\r\n // *\r\n // * conflicts should manually add these as they are resolved, as this\r\n // * info is not known until the conflict is resolved.\r\n // */\r\n // const newAddrsToRegister: IbGibAddr[] = [];\r\n // /**\r\n // * orphaned addrs found/created during conflict resolution/merging.\r\n // */\r\n // const orphanedAddrs: IbGibAddr[] = [];\r\n\r\n // #region sanity/validation\r\n if (!ackData) {\r\n throw new Error(`${lc} ackData falsy (E: 3b8415edc876084c88a25b98e2d55826)`);\r\n }\r\n if (ackData.stage !== SyncStage.ack) {\r\n throw new Error(`${lc} Invalid ack frame: ackData.stage !== SyncStage.ack (E: 2e8b0a94b5954a66a6a1a7a0b3f5b7a1)`);\r\n }\r\n if (logalot) { console.log(`${lc} ackData: ${pretty(ackData)} (I: b817c5571c5e916fe8f90b892b3e8e26)`); }\r\n if (!sagaIbGib.data) { throw new Error(`(UNEXPECTED) sagaIbGib.data falsy? (E: e3f2e8f162484859787651b85c011826)`); }\r\n // #region sanity/validation\r\n\r\n // 1. Check for Conflicts\r\n /**\r\n * Starts off as a COPY of ackData.conflicts. But if conflicts\r\n * exist, we can now update these conflicts in place without\r\n * mutating ackData, and then include the modified conflicts in the\r\n * return Delta frame.\r\n */\r\n const conflicts = (ackData.conflicts ? clone(ackData.conflicts) : []) as SyncSagaConflictInfo[];\r\n if (logalot) { console.log(`${lc} [CONFLICT DEBUG] Received conflicts from Ack: ${conflicts.length}`); }\r\n if (logalot && conflicts.length > 0) {\r\n console.log(`${lc} [CONFLICT DEBUG] Conflicts detail: ${JSON.stringify(conflicts, null, 2)}`);\r\n }\r\n\r\n const terminalConflicts = conflicts.filter(c => c.terminal);\r\n if (terminalConflicts.length > 0) {\r\n if (logalot) { console.warn(`${lc} Received terminal conflicts from Ack: ${JSON.stringify(terminalConflicts)}`); }\r\n // Terminal failure. Sender should probably Commit(Fail) or just\r\n // Abort. For now, throw to trigger abort. the incoming ack\r\n // frame has already been persisted in local durable space by\r\n // now.\r\n throw new Error(`${lc} Peer reported terminal conflicts. (E: 23a0096ee05a2ccfa89334e8f156b426)`);\r\n }\r\n\r\n // we are the SENDER at this point in the sync process.\r\n\r\n // at this point, if we have conflicts, they are non-terminal. But\r\n // we will not have enough info to do the merge yet. We **do** have\r\n // enough knowledge to calculate the latestCommonFrameAddr, which\r\n // means we have enough info to calculate the delta that we\r\n // **know** the receiver does not have. So we send those delta\r\n // ibgibs that we know the receiver needs to do the merge, and we\r\n // update the conflict info with the addrs that we sent. So the\r\n // receiver will have full knowledge to complete the merge.\r\n\r\n /**\r\n * These are ibgibs that we know the remote does not have. The other\r\n * end will have to do the actual merging (assuming feasability).\r\n */\r\n const outgoingPayloadIbGibsDomain_conflicts: IbGib_V1[] = [];\r\n\r\n const activeConflicts: SyncSagaConflictInfo[] = [];\r\n if (conflicts.length > 0) {\r\n if (logalot) { console.log(`${lc} [CONFLICT DEBUG] Processing ${conflicts.length} non-terminal conflicts`); }\r\n\r\n for (const conflict of conflicts) {\r\n const {\r\n receiverTipAddr,\r\n reason,\r\n senderTipAddr,\r\n // latestCommonFrameAddr, // to be determined in this handler\r\n terminal,\r\n receiverKnowledgeTimelineAddrs,\r\n tjpAddr,\r\n } = conflict;\r\n if (terminal) { throw new Error(`(UNEXPECTED) conflict.terminal truthy? We expect this to already throw/abort the saga before this point in execution. (E: b42e982edca8b1156765de38f9e74626)`); }\r\n\r\n // get the latest common frame addr\r\n let senderTipIbGib = initDomainGraph[senderTipAddr];\r\n if (!senderTipIbGib) {\r\n throw new Error(`(UNEXPECTED) senderTipIbGib falsy? initDomainGraph should have had the senderTipAddr (${senderTipAddr}) that was included in the ack frame conflicts. tjpAddr: ${tjpAddr}. reason: ${reason} (E: 3bd80f2054a924be98e6a7421bff4626)`);\r\n }\r\n // we get the full history because we need the new tip if it exists\r\n const { headIbGib, orderedPastIbGibs } = await getHistory({\r\n timeline: senderTipIbGib,\r\n getLatest: true,\r\n metaspace,\r\n space: mySpace,\r\n });\r\n const historyAddrs: IbGibAddr[] = orderedPastIbGibs.map(x => getIbGibAddr({ ibGib: x }));\r\n const latestLocalAddr = getIbGibAddr({ ibGib: headIbGib });\r\n conflict.senderKnowledgeTimelineAddrs = [...historyAddrs, latestLocalAddr];\r\n\r\n if (headIbGib.gib !== senderTipIbGib.gib) {\r\n // #region edge case: changed since sync started with new local addr\r\n\r\n conflict.senderTipAddr = latestLocalAddr; // update the conflict with the new addr...hmmm\r\n if (!Object.keys(initDomainGraph).includes(latestLocalAddr)) {\r\n // small chance that history has evolved since the sync saga\r\n // started, but this is low probability for known immediate\r\n // use cases, and if the local *is* changed even more, our\r\n // conflict merge approach does not change (and should still\r\n // work just as well).\r\n const newDepGraph = await getDependencyGraph({\r\n ibGibAddr: latestLocalAddr,\r\n live: true,\r\n space: mySpace,\r\n });\r\n const newDepGraphAddrs = Object.keys(newDepGraph);\r\n for (const newDepGraphAddr of newDepGraphAddrs) {\r\n if (!initDomainGraph[newDepGraphAddr]) {\r\n initDomainGraph[newDepGraphAddr] = newDepGraph[newDepGraphAddr]!;\r\n }\r\n }\r\n }\r\n\r\n // #endregion edge case: changed since sync started with new local addr\r\n }\r\n\r\n const latestCommonFrameAddr =\r\n receiverKnowledgeTimelineAddrs.findLast(x => historyAddrs.includes(x));\r\n if (!latestCommonFrameAddr) { throw new Error(`(UNEXPECTED) no latestCommonFrameAddr in the conflicts.receiverKnowledgeTimelineAddrs (${receiverKnowledgeTimelineAddrs.join('\\n')})? This would mean that it doesn't even have the tjpAddr (${tjpAddr}). So what are we doing here? (E: 8931d1bdd6d8e100bf55f7c8a6924826)`); }\r\n\r\n const deltaGraph = await getDeltaDependencyGraph({\r\n ibGibAddr: latestLocalAddr,\r\n live: true,\r\n latestCommonFrameAddr,\r\n space: mySpace,\r\n });\r\n\r\n const accretivePayloadAddrs: IbGibAddr[] = [];\r\n Object.keys(deltaGraph).forEach(deltaPayloadAddr => {\r\n accretivePayloadAddrs.push(deltaPayloadAddr);\r\n const deltaPayloadIbGib = deltaGraph[deltaPayloadAddr];\r\n outgoingPayloadIbGibsDomain_conflicts.push(deltaPayloadIbGib);\r\n });\r\n\r\n const isFastForward = latestCommonFrameAddr === receiverTipAddr;\r\n if (isFastForward) {\r\n if (logalot) { console.log(`${lc} [CONFLICT DEBUG] TJP ${tjpAddr}: Fast-forward detected (receiver behind sender). Excluding from active conflicts and sending delta payload.`); }\r\n } else {\r\n if (conflict.accretivePayloadAddrs) { throw new Error(`(UNEXPECTED) conflict.accretivePayloadAddrs already truthy? This is expected to be falsy at this point in the sync. (E: 6b6b1846779867849cbde208f4374326)`); }\r\n conflict.accretivePayloadAddrs = accretivePayloadAddrs;\r\n activeConflicts.push(conflict);\r\n }\r\n }\r\n\r\n if (activeConflicts.length > 0) {\r\n proposeCommit = false;\r\n } else {\r\n proposeCommit = true;\r\n }\r\n\r\n if (logalot) { console.log(`${lc} [CONFLICT DEBUG] Finished processing ${conflicts.length} conflicts. Active (divergent) conflicts: ${activeConflicts.length}. outgoingPayloadIbGibsDomain_conflicts.length (total outgoing payload ibgibs for ALL conflicts): ${outgoingPayloadIbGibsDomain_conflicts.length}`); }\r\n } else {\r\n if (logalot) { console.log(`${lc} [CONFLICT DEBUG] No optimistic conflicts to process`); }\r\n }\r\n\r\n // 2. Prepare Delta Payload (What Receiver Requesting + Our Conflict Logic)\r\n\r\n /**\r\n * these were requested addrs on the INCOMING frame (the ack data).\r\n *\r\n * This is in contrast to any OUTGOING requests we make in this\r\n * method.\r\n */\r\n const outgoingPayloadIbGibsDomain_requestedByAck = await this.getPayloadsForRequestedInfos({\r\n deltaRequestAddrInfos: ackData.deltaRequestAddrInfos || [],\r\n mySpace,\r\n });\r\n\r\n let outgoingPayloadsDomain_all: IbGib_V1[] | undefined = [\r\n ...outgoingPayloadIbGibsDomain_conflicts,\r\n ...outgoingPayloadIbGibsDomain_requestedByAck,\r\n ];\r\n let outgoingPayloadsDomainAddrs_all: IbGibAddr[] | undefined = undefined;\r\n if (outgoingPayloadsDomain_all.length === 0) {\r\n outgoingPayloadsDomain_all = undefined;\r\n } else {\r\n outgoingPayloadsDomainAddrs_all = outgoingPayloadsDomain_all.map(x => {\r\n return getIbGibAddr({ ibGib: x });\r\n });\r\n }\r\n\r\n\r\n\r\n // 3. Create Delta Frame\r\n const deltaData: SyncSagaMessageDeltaData_V1 = {\r\n sagaId: sagaIbGib.data.uuid,\r\n stage: SyncStage.delta,\r\n /**\r\n * these are the modified conflicts with additional information.\r\n */\r\n conflicts: activeConflicts,\r\n /**\r\n * we're sending these domain ibgibs as payload (they were\r\n * requested by receiver and/or they are being sent as delta\r\n * deps for conflicts)\r\n */\r\n payloadAddrsDomain: outgoingPayloadsDomainAddrs_all,\r\n /**\r\n * we're asking for these addrs. I _think_ this may be unused at\r\n * this point, as my understanding of the sync protocol has\r\n * shifted.\r\n *\r\n * right now, it looks as though the receiver should have\r\n * complete information to perform the merge. we are proactively\r\n * sending them any payload ibgibs that we have that we KNOW\r\n * that they do not have.\r\n */\r\n deltaRequestAddrInfos: undefined,\r\n /**\r\n * if we have no changes and request none, propose commit to\r\n * finish the sync transaction.\r\n */\r\n proposeCommit,\r\n };\r\n\r\n\r\n /**\r\n * outgoing requests should be ultimately registered as these are triggered by FF requests. Conflicts,\r\n */\r\n let rel8ns: SyncSagaMessageRel8ns_V1 | undefined = undefined;\r\n\r\n if (logalot) { console.log(`${lc} Creating Delta Stone. Data stage: ${deltaData.stage}`); }\r\n\r\n const deltaStone = await this.createSyncMsgStone({\r\n data: deltaData,\r\n rel8ns,\r\n localSpace: mySpace,\r\n metaspace,\r\n });\r\n\r\n const deltaFrame = await this.evolveSyncSagaIbGib({\r\n prevSagaIbGib: sagaIbGib,\r\n msgStones: [deltaStone],\r\n localSpace: mySpace,\r\n metaspace,\r\n });\r\n\r\n if (logalot) { console.log(`${lc} Delta Frame created. Rel8ns: ${JSON.stringify(deltaFrame.rel8ns)}`); }\r\n\r\n // Build control payloads: frame + its dependencies (msg stone)\r\n // const payloadIbGibsControl: IbGib_V1[] = [deltaFrame, deltaStone];\r\n\r\n return { frame: deltaFrame, payloadIbGibsDomain: outgoingPayloadsDomain_all, };\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n }\r\n\r\n /**\r\n * Handles the `Delta` frame.\r\n *\r\n * @remarks\r\n * **Execution Context**: **Both** ??\r\n *\r\n * At this time, I only conceive this as being executed by the receiver.\r\n * Initially, I was thinking that it would need to be a back and forth,\r\n * especially since we were going to resolve one conflict at a time. That\r\n * may still end up being the case, but right now (01/27/2026), I'm thinking\r\n * we just have the receiver do the merging, since they should have full\r\n * knowledge at that point for most (all?) cases AFAICT.\r\n */\r\n private async handleDeltaFrame({\r\n sagaContext,\r\n sagaIbGib,\r\n mySpace,\r\n myTempSpace,\r\n metaspace,\r\n }: {\r\n sagaContext: SyncSagaContextIbGib_V1,\r\n sagaIbGib: SyncIbGib_V1,\r\n mySpace: IbGibSpaceAny,\r\n myTempSpace: IbGibSpaceAny,\r\n metaspace: MetaspaceService,\r\n }): Promise<NextSagaFrameInfo> {\r\n const lc = `${this.lc}[${this.handleDeltaFrame.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: a1d0a85eb4189466f86dfd61e3df2626)`); }\r\n\r\n const { messageData } = await this.getStageAndPayloadFromFrame({ sagaFrame: sagaIbGib, space: mySpace });\r\n const deltaData = messageData as SyncSagaMessageDeltaData_V1;\r\n\r\n // #region validate/sanity\r\n if (!sagaIbGib.data) { throw new Error(`(UNEXPECTED) sagaIbGib.data falsy? (E: 8874e83e1a1b307938ee832862ec5826)`); }\r\n if (!sagaIbGib.data.conflictStrategy) { throw new Error(`(UNEXPECTED) sagaIbGib.data.conflictStrategy falsy? (E: 636205ab5b78fcb31d0cb1880770c826)`); }\r\n if (!deltaData) { throw new Error(`${lc} deltaData falsy (E: 7c28c8d8f08a4421b8344e6727271421)`); }\r\n if (deltaData.stage !== SyncStage.delta) { throw new Error(`${lc} Invalid delta frame: deltaData.stage !== SyncStage.delta (E: 0c28c8d8f08a4421b8344e6727271421)`); }\r\n // #endregion validate/sanity\r\n if (logalot) { console.log(`${lc} deltaData: ${pretty(deltaData)} (I: a76008681df458cfbcdc4848f825a826)`); }\r\n\r\n if (logalot) { console.log(`${lc} [CONFLICT DEBUG] deltaData.payloadAddrsDomain count: ${deltaData.payloadAddrsDomain?.length || 0}`); }\r\n\r\n\r\n const { conflictStrategy } = sagaIbGib.data;\r\n const { deltaRequestAddrInfos, payloadAddrsDomain, proposeCommit, } = deltaData;\r\n\r\n const peerProposesCommit = deltaData.proposeCommit ?? false;\r\n\r\n /**\r\n * these are already in the local/receiver temp space\r\n */\r\n const receivedPayloadIbGibs: IbGib_V1[] = sagaContext.payloadIbGibsDomain ?? [];\r\n\r\n // 2. Fulfill Peer Requests (Outgoing Payload with Delta Dependencies)\r\n if (logalot) { console.log(`${lc} [CONFLICT DEBUG] Fulfilling ${(deltaData.deltaRequestAddrInfos || []).length} peer requests`); }\r\n const outgoingPayload = await this.getPayloadsForRequestedInfos({\r\n deltaRequestAddrInfos: deltaData.deltaRequestAddrInfos || [],\r\n mySpace,\r\n });\r\n if (logalot) { console.log(`${lc} [CONFLICT DEBUG] Outgoing payload size (with deps): ${outgoingPayload.length}`); }\r\n\r\n\r\n // if we have conflicts, then we should be able to resolve them now\r\n // at this point, yes?\r\n\r\n // iterate through any conflicts, performing the merges\r\n\r\n const conflicts =\r\n (deltaData.conflicts ? clone(deltaData.conflicts) : []) as SyncSagaConflictInfo[];\r\n const unresolvedConflicts = conflicts.filter(x => !x.resolved);\r\n if (unresolvedConflicts.length > 0) {\r\n // #region sanity conflictStrategy\r\n if (conflictStrategy !== SyncConflictStrategy.optimisticWithLCS) {\r\n throw new Error(`(UNEXPECTED) conflictStrategy (${conflictStrategy}) is not ${SyncConflictStrategy.optimisticWithLCS}? right now, this is the only one we've implemented. (E: ba3e08d92a66b24075016208a0f83226)`);\r\n }\r\n // #endregion sanity conflictStrategy\r\n\r\n for (const unresolvedConflict of unresolvedConflicts) {\r\n\r\n // gather/populate info\r\n const conflictPayloadIbGibMap: FlatIbGibGraph = {};\r\n for (const conflictPayloadAddr of (unresolvedConflict.accretivePayloadAddrs ?? [])) {\r\n const conflictPayloadIbGib =\r\n receivedPayloadIbGibs.find(x => getIbGibAddr({ ibGib: x }) === conflictPayloadAddr);\r\n if (!conflictPayloadIbGib) {\r\n throw new Error(`(UNEXPECTED) conflictPayloadIbGib falsy? At this time in dev (01/27/2026), we're expecting this to be populated because we're only expecting one iteration of conflict resolution. If dev is later, this may no longer be the case. (E: b197417e762639089827aa3edaece826)`);\r\n }\r\n conflictPayloadIbGibMap[conflictPayloadAddr] = conflictPayloadIbGib;\r\n }\r\n\r\n // at this point, we have populated the conflict payload\r\n // ibgibs, which right now is the sender's delta dep graph.\r\n // we need to get our own delta dep graph, based off of the\r\n // LCA, and then we need to perform the optimistic graft\r\n\r\n if (unresolvedConflict.latestCommonFrameAddr) {\r\n\r\n }\r\n\r\n const {\r\n // latestCommonFrameAddr, // is not defined yet\r\n receiverKnowledgeTimelineAddrs,\r\n senderKnowledgeTimelineAddrs,\r\n reason,\r\n receiverTipAddr,\r\n senderTipAddr,\r\n tjpAddr,\r\n } = unresolvedConflict;\r\n if (!senderKnowledgeTimelineAddrs) { throw new Error(`(UNEXPECTED) senderKnowledgeTimelineAddrs falsy? (E: 2a608892d11bd848e8f0c7a8d676d826)`); }\r\n\r\n // first we need to ensure that we have the entire\r\n // dependency graph in our temp space. it's possible that we\r\n // only need the direct timeline addrs and their dna, but\r\n // for now I'm just going to do the whole dep graph.\r\n\r\n const depGraph = await getDependencyGraph({\r\n ibGibAddrs: [receiverTipAddr],\r\n live: true,\r\n space: mySpace,\r\n });\r\n const depGraphIbGibs = Object.values(depGraph);\r\n await putInSpace_dnasThenNonDnas({\r\n ibGibs: depGraphIbGibs,\r\n space: myTempSpace,\r\n });\r\n for (const timelineAddr of receiverKnowledgeTimelineAddrs) {\r\n const timelineIbGib = depGraph[timelineAddr];\r\n await registerNewIbGib({ ibGib: timelineIbGib, space: myTempSpace });\r\n }\r\n\r\n\r\n // get the latest common point in the two timelines\r\n const latestCommonFrameAddr = senderKnowledgeTimelineAddrs.findLast(addrA => receiverKnowledgeTimelineAddrs.includes(addrA));\r\n if (!latestCommonFrameAddr) { throw new Error(`(UNEXPECTED) latestCommonFrameAddr falsy? how we can have a conflict without a common point in history? (E: 53de0a181838b3e5bf98d0887994b826)`); }\r\n\r\n // no matter what, we want to transmit our branch on this\r\n // end (the receiver). when grafting, it may end up being\r\n // orphaned, or it may end up being the base branch. Either\r\n // way, the sender does not have our (usually unique) delta\r\n // ibgibs.\r\n const ourDeltaDepGraph = await getDeltaDependencyGraph({\r\n ibGibAddr: unresolvedConflict.receiverTipAddr,\r\n latestCommonFrameAddr,\r\n live: true,\r\n space: mySpace,\r\n });\r\n Object.values(ourDeltaDepGraph).forEach(ourIbGib => outgoingPayload.push(ourIbGib));\r\n\r\n /**\r\n * ATOW (01/31/2026) on initial implementation, these are\r\n * already persisted AND registered in the space\r\n * (`myTempSpace`). These do NOT include\r\n */\r\n const resGraft = await graftTimelines({\r\n conflictStrategy,\r\n timelineAddrsA: senderKnowledgeTimelineAddrs,\r\n timelineAddrsB: receiverKnowledgeTimelineAddrs,\r\n latestCommonFrameAddr,\r\n ibGibReadCache: conflictPayloadIbGibMap,\r\n space: myTempSpace,\r\n });\r\n\r\n // need to get orphaned delta\r\n\r\n const {\r\n dnasCreatedInGraft,\r\n dnasReplayed,\r\n intermediateIbGibsCreatedInGraft,\r\n newGraftTip,\r\n graftInfoCreated,\r\n } = resGraft;\r\n\r\n\r\n unresolvedConflict.createdDnaAddrs = dnasCreatedInGraft.map(x => getIbGibAddr({ ibGib: x }));\r\n unresolvedConflict.replayedDnaAddrs = dnasReplayed.map(x => getIbGibAddr({ ibGib: x }));\r\n unresolvedConflict.createdDomainAddrs = [\r\n ...intermediateIbGibsCreatedInGraft.map(x => getIbGibAddr({ ibGib: x })),\r\n getIbGibAddr({ ibGib: graftInfoCreated }),\r\n getIbGibAddr({ ibGib: newGraftTip })\r\n ];\r\n\r\n // get/populate the graftInfoAddr for this conflict\r\n if (!newGraftTip.rel8ns) { throw new Error(`(UNEXPECTED) newGraftTip.rel8ns falsy? we expect this to have graftinfo rel8ns, let alone dna (E: 718788f5a44e815618ac1ba621c8a826)`); }\r\n const graftInfoAddrs = newGraftTip.rel8ns[GRAFT_INFO_REL8N_NAME];\r\n if (!graftInfoAddrs || graftInfoAddrs.length === 0) { throw new Error(`(UNEXPECTED) newGraftTip.rel8ns.${GRAFT_INFO_REL8N_NAME} falsy/empty? we expect to always have graft info attached to timelines that are grafted. (E: 45abf31654c8aa517df4d0882b996826)`); }\r\n unresolvedConflict.graftInfoAddr = graftInfoAddrs.at(-1)!;\r\n\r\n // add to ibgibs created in graft to both conflict info (via\r\n // addrs) and the outgoingPayload\r\n\r\n const ibGibsCreatedOrReplayedInGraft = [\r\n dnasCreatedInGraft,\r\n dnasReplayed,\r\n intermediateIbGibsCreatedInGraft,\r\n [graftInfoCreated, newGraftTip]\r\n ];\r\n\r\n // #region debug\r\n for (const ibGib of ibGibsCreatedOrReplayedInGraft.flat()) {\r\n const validationErrors = await validateIbGibIntrinsically({ ibGib }) ?? [];\r\n if (validationErrors.length > 0) {\r\n console.dir(ibGib);\r\n debugger;\r\n console.log(pretty(ibGib));\r\n }\r\n }\r\n // #endregion debug\r\n\r\n unresolvedConflict.accretivePayloadAddrs ??= [];\r\n\r\n ibGibsCreatedOrReplayedInGraft.forEach(\r\n ibGibsCreatedOrReplayedInGraft => ibGibsCreatedOrReplayedInGraft\r\n .forEach(ibGibCreated => {\r\n const addrCreated = getIbGibAddr({ ibGib: ibGibCreated });\r\n const alreadyExistsInAccretivePayloadAddrs =\r\n unresolvedConflict.accretivePayloadAddrs!.includes(addrCreated);\r\n if (!alreadyExistsInAccretivePayloadAddrs) {\r\n unresolvedConflict.accretivePayloadAddrs!.push(addrCreated)\r\n }\r\n const alreadyExistsInOutgoingPayload =\r\n outgoingPayload.some(payloadIbGib =>\r\n getIbGibAddr({ ibGib: payloadIbGib }) === addrCreated);\r\n if (!alreadyExistsInOutgoingPayload) {\r\n outgoingPayload.push(ibGibCreated);\r\n }\r\n })\r\n );\r\n\r\n unresolvedConflict.resolved = true;\r\n }\r\n }\r\n\r\n // at this point, we have resolved all conflicts, yes? At least in this implementation.\r\n\r\n // 4. Determine Next Action\r\n // We have `outgoingPayload` (Requests + Merge Results).\r\n // Does Peer have outstanding requests? No, we fulfilled `peerRequests`.\r\n // Do WE have outstanding requests?\r\n // We might if `mergeResult` requires further sync? Usually no, result is complete.\r\n\r\n const myRequests: string[] = []; // If we had more needs (e.g. partial payload), we'd add here.\r\n\r\n const hasOutgoing = outgoingPayload.length > 0;\r\n const hasMyRequests = myRequests.length > 0;\r\n\r\n if (hasOutgoing || hasMyRequests) {\r\n // We have business to attend to -> Send Delta\r\n const responseDeltaData: SyncSagaMessageDeltaData_V1 = {\r\n sagaId: deltaData.sagaId,\r\n stage: SyncStage.delta,\r\n payloadAddrsDomain: outgoingPayload.map(p => getIbGibAddr({ ibGib: p })),\r\n requests: hasMyRequests ? myRequests : undefined,\r\n conflicts: conflicts\r\n };\r\n\r\n const deltaStone = await this.createSyncMsgStone({\r\n data: responseDeltaData,\r\n localSpace: mySpace,\r\n metaspace,\r\n });\r\n\r\n const deltaFrame = await this.evolveSyncSagaIbGib({\r\n prevSagaIbGib: sagaIbGib,\r\n msgStones: [deltaStone],\r\n localSpace: mySpace,\r\n metaspace,\r\n });\r\n\r\n return { frame: deltaFrame, payloadIbGibsDomain: outgoingPayload };\r\n } else {\r\n // We have nothing to send.\r\n\r\n if (peerProposesCommit) {\r\n // Peer is done. We are done. -> Commit.\r\n // one last validate entire history?\r\n const history = await getFullSyncSagaHistory({\r\n sagaIbGib,\r\n space: mySpace,\r\n });\r\n const validationErrors = await validateFullSyncSagaHistory({\r\n history,\r\n });\r\n if (validationErrors.length > 0) {\r\n const errorCommitFrame = await this.createCommitFrame({\r\n sagaIbGib,\r\n errors: validationErrors,\r\n metaspace, mySpace,\r\n });\r\n return { frame: errorCommitFrame, }; /* <<<< returns early */\r\n }\r\n\r\n await this.executeLocalCommit({\r\n sagaHistory: history,\r\n deltaFrame: sagaIbGib,\r\n localTempSpace: myTempSpace,\r\n localSpace: mySpace,\r\n metaspace,\r\n })\r\n\r\n const commitFrame = await this.createCommitFrame({\r\n sagaIbGib,\r\n errors: undefined,\r\n metaspace,\r\n mySpace,\r\n });\r\n\r\n return { frame: commitFrame, };\r\n\r\n } else {\r\n // peer did NOT propose commit (maybe they just sent data/requests and didn't ready flag).\r\n // But we are empty.\r\n // So WE propose commit.\r\n const responseDeltaData: SyncSagaMessageDeltaData_V1 = {\r\n sagaId: deltaData.sagaId,\r\n stage: SyncStage.delta,\r\n proposeCommit: true,\r\n conflicts,\r\n };\r\n\r\n const deltaStone = await this.createSyncMsgStone({\r\n data: responseDeltaData,\r\n localSpace: mySpace,\r\n metaspace\r\n });\r\n\r\n const deltaFrame = await this.evolveSyncSagaIbGib({\r\n prevSagaIbGib: sagaIbGib,\r\n msgStones: [deltaStone],\r\n localSpace: mySpace,\r\n metaspace\r\n });\r\n\r\n // Check if PEER proposed commit\r\n if (deltaData.proposeCommit) {\r\n if (logalot) { console.log(`${lc} Peer proposed commit. Accepting & Committing.`); }\r\n // Peer wants to commit and has no more requests.\r\n // We should Commit.\r\n\r\n const commitData: SyncSagaMessageCommitData_V1 = {\r\n sagaId: deltaData.sagaId,\r\n stage: SyncStage.commit,\r\n success: true,\r\n };\r\n\r\n const commitStone = await this.createSyncMsgStone({\r\n data: commitData,\r\n localSpace: mySpace,\r\n metaspace\r\n });\r\n\r\n const commitFrame = await this.evolveSyncSagaIbGib({\r\n prevSagaIbGib: deltaFrame, // Build on top of the Delta we just created/persisted\r\n msgStones: [commitStone],\r\n localSpace: mySpace,\r\n metaspace\r\n });\r\n\r\n return { frame: commitFrame, };\r\n }\r\n\r\n return { frame: deltaFrame, payloadIbGibsDomain: outgoingPayload };\r\n }\r\n }\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n }\r\n\r\n /**\r\n * should throw if fails\r\n */\r\n private async executeLocalCommit({\r\n deltaFrame,\r\n commitFrame,\r\n sagaHistory,\r\n metaspace, localSpace, localTempSpace,\r\n }: {\r\n deltaFrame?: SyncIbGib_V1;\r\n commitFrame?: SyncIbGib_V1;\r\n sagaHistory: SyncSagaFrameDependencyGraph[];\r\n metaspace: MetaspaceService;\r\n localSpace: IbGibSpaceAny;\r\n localTempSpace: IbGibSpaceAny;\r\n }): Promise<void> {\r\n const lc = `${this.lc}[${this.executeLocalCommit.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: 6734980446b86a63c1af6e2e206de826)`); }\r\n if (!deltaFrame && !commitFrame) {\r\n throw new Error(`(UNEXPECTED) !deltaFrame && !commitFrame? we're expecting to execute the commit based off of EITHER a delta OR a commit frame. (E: 10cae319a2685a672866f5583514e326)`);\r\n } else if (deltaFrame && commitFrame) {\r\n throw new Error(`(UNEXPECTED) deltaFrame && commitFrame? we're expecting to execute the commit based off of EITHER a delta OR a commit frame. (E: b9037b1ed6d8684ac8a5d01328bad826)`);\r\n }\r\n\r\n /**\r\n * Sync has a two-stage commit. The first is from a delta frame with\r\n * `proposeCommit: true`. That produces a commit frame, which on the\r\n * other end triggers the second leg.\r\n */\r\n const isFirstCommitLeg = !!deltaFrame;\r\n const currentFrame = isFirstCommitLeg ? deltaFrame : commitFrame;\r\n if (!currentFrame) { throw new Error(`(UNEXPECTED) !currentFrame? something wrong with my logic. (E: 4ec0ce6625cc1d677bc902c839ca1a26)`); }\r\n\r\n // there are a few buckets of ibgibs to be stored/registered:\r\n //\r\n // 1. push offers - receiver immediately knows from sender knowledge\r\n // that they didn't have certain addrs. kept track of through\r\n // push offer infos.\r\n // 2. requested addrs - sender knows from ack frame enough knowledge\r\n // to know that sender is missing domain addrs, but does NOT know\r\n // all deps that will be required.\r\n // 3. conflicts - receiver/ack recognizes conflict (divergence) and\r\n // starts conflict-specific resolution ping pong. tracked in\r\n // conflicts info on delta stones, including all newly created\r\n // ibgibs resulting from graft.\r\n\r\n // the push offers are kept track of through the push offer infos\r\n // and NOT via payloadAddrsDomain?\r\n\r\n /**\r\n * There are\r\n * we only want to register new ibgibs from the other end, so we\r\n * will compare the history payloads/push offers with the context\r\n * that provided those payloads.\r\n *\r\n * So we will filter out the history that we produced, which should\r\n * leave us only with externally created payload addrs.\r\n *\r\n * NOTE: I have this at the beginning of the function PURELY to get\r\n * a log value in to understand the context of this function's\r\n * output.\r\n */\r\n const currentFrameOrigin = getSyncSagaFrameOrigin({ sagaFrame: currentFrame });\r\n\r\n if (logalot) { console.log(`${lc} currentFrameOrigin: ${currentFrameOrigin} (I: 3add8f8390c89743ae554bd3cc60b826)`); }\r\n\r\n // #region validate/sanity\r\n if (!currentFrame.data) { throw new Error(`(UNEXPECTED) currentFrame.data falsy? (E: a8be68d48668d93d992d793834823826)`); }\r\n // #endregion validate/sanity\r\n\r\n // * move all payload addrs from temp space to local space\r\n // * register each and every iteration of each timeline (including\r\n // stones, which are like their own sealed timeline of length 1)\r\n\r\n const allPayloadAddrsDomainReceived: IbGibAddr[] = [];\r\n const fnAddPayloadAddr = (addr: IbGibAddr) => {\r\n if (!allPayloadAddrsDomainReceived.includes(addr)) {\r\n allPayloadAddrsDomainReceived.push(addr);\r\n }\r\n }\r\n const sagaHistory_onlyMyEnd = sagaHistory.filter(x => {\r\n const frameExecutionContext = getSyncSagaFrameOrigin({ sagaFrame: x.sagaIbGib });\r\n return currentFrameOrigin !== frameExecutionContext;\r\n });\r\n\r\n const sagaHistory_onlyOtherParty = sagaHistory.filter(x => {\r\n const frameExecutionContext = getSyncSagaFrameOrigin({ sagaFrame: x.sagaIbGib });\r\n return currentFrameOrigin === frameExecutionContext;\r\n });\r\n\r\n sagaHistory_onlyOtherParty.forEach(x => {\r\n if (!x.sagaIbGib.data) { throw new Error(`(UNEXPECTED) sagaIbGib.data falsy? (E: 34d7f8cdee14717ce828878d98f89826)`); }\r\n // if (logalot) { console.log(`${lc}[${currentFrameOrigin}] history slice: ${pretty(x)} (I: e5a9436fb66b0df3183bd6d81be2ca26)`); }\r\n x.msgStones.forEach(msgStone => {\r\n if (!msgStone.data) { throw new Error(`(UNEXPECTED) msgStone.data falsy? (E: 21406101f91847514cc759c8a7382f26)`); }\r\n if (msgStone.data.stage === SyncStage.ack) {\r\n const ackData = msgStone.data as SyncSagaMessageAckData_V1;\r\n if (ackData.pushOfferInfos && ackData.pushOfferInfos.length > 0) {\r\n ackData.pushOfferInfos.forEach(info => {\r\n info.addrs.forEach(addr => fnAddPayloadAddr(addr));\r\n });\r\n }\r\n } else if (msgStone.data.stage === SyncStage.delta) {\r\n const deltaData = msgStone.data as SyncSagaMessageDeltaData_V1;\r\n if (deltaData.payloadAddrsDomain && deltaData.payloadAddrsDomain.length > 0) {\r\n deltaData.payloadAddrsDomain.forEach(addr => fnAddPayloadAddr(addr));\r\n }\r\n }\r\n })\r\n });\r\n\r\n if (logalot) { console.log(`${lc}[${currentFrameOrigin}] allPayloadAddrsDomainTransferred: ${allPayloadAddrsDomainReceived.length > 0 ? allPayloadAddrsDomainReceived.join(', ') : 'none'} (I: a1950eb3ca95bdc9ec18a4b8823e9826)`); }\r\n\r\n // at this point, we have a list of ALL payload addrs retrieved FROM\r\n // THE OTHER PARTICIPANT. This does NOT include any ibgibs created\r\n // in grafts in conflicts that will also need to be stored and\r\n // registered.\r\n let allPayloadIbGibsDomainTransferred: IbGib_V1[] = [];\r\n if (allPayloadAddrsDomainReceived.length > 0) {\r\n const resGetAllTransferred =\r\n await getFromSpace({ addrs: allPayloadAddrsDomainReceived, space: localTempSpace });\r\n if (resGetAllTransferred.success && resGetAllTransferred.ibGibs && resGetAllTransferred.ibGibs.length === allPayloadAddrsDomainReceived.length) {\r\n allPayloadIbGibsDomainTransferred = resGetAllTransferred.ibGibs.concat();\r\n } else {\r\n // errored out, gather info\r\n if (!resGetAllTransferred.rawResultIbGib) { throw new Error(`(UNEXPECTED) !resGetAllTransferred.rawResultIbGib falsy? (E: dc6cf8729668f4fbe8c024f887d97a26)`); }\r\n const { addrsNotFound, addrsErrored, errors } = resGetAllTransferred.rawResultIbGib.data as IbGibSpaceResultData;\r\n throw new Error(`(UNEXPECTED) we couldn't get all addrs transferred throughout the saga from the tempspace (${localTempSpace.ib})? addrsNotFound: ${addrsNotFound ?? []}. addrsErrored: ${addrsErrored ?? []}. errors: ${errors ?? []}(E: 222e341e634862b4d88ae7282584d826)`);\r\n }\r\n }\r\n\r\n /**\r\n * when conflicts arise, the receiver ends up sending ibgibs created\r\n * in conflicts as payloads to the sender. BUT! The receiver\r\n * actually needs to commit these as well, and so far we have only\r\n * been looking at payloads sent to us from the sender.\r\n */\r\n const createdFromConflictGraftsIbGibs: IbGib_V1[] = [];\r\n const finalConflicts = await getFinalConflictsInfo({ sagaHistory });\r\n if (finalConflicts) {\r\n // examine the conflicts\r\n for (const finalConflict of finalConflicts) {\r\n if (!finalConflict.resolved) { throw new Error(`(UNEXPECTED) finalConflict.resolved falsy? right now, we're expecting to resolve all conflicts. (E: a40ca8f1f54665407892ec21123a4f26)`); }\r\n if (!finalConflict.graftInfoAddr) { throw new Error(`(UNEXPECTED) finalConflict resolved but graftInfoAddr falsy? we're expecting all resolved conflicts to have a graftInfoAddr (E: d082488347570947b82008a835200126)`); }\r\n const resGetGraftIbGibs = await getIbGibsFromCache_fallbackToSpaces({\r\n addrs: [finalConflict.graftInfoAddr],\r\n space: localTempSpace,\r\n });\r\n const finalConflictGraftInfo = resGetGraftIbGibs.at(0) as GraftInfoIbGib_V1;\r\n if (!finalConflictGraftInfo) { throw new Error(`(UNEXPECTED) couldn't get finalConflictGraftInfo from localTempSpace (${localTempSpace})? (E: 35e3c8130608d991e8fb295807812826)`); }\r\n const { createdDnaAddrs, replayedDnaAddrs, createdDomainAddrs } = finalConflict;\r\n if (!createdDnaAddrs || createdDnaAddrs.length === 0) { throw new Error(`(UNEXPECTED) finalConflict.createdDnaAddrs falsy/empty? (E: 9689f8be5bd19650b8d4a058b65db826)`); }\r\n if (!replayedDnaAddrs || replayedDnaAddrs.length === 0) { throw new Error(`(UNEXPECTED) finalConflict.replayedDnaAddrs falsy/empty? (E: f42878ed1cee3e9828567c5ab8179526)`); }\r\n if (!createdDomainAddrs || createdDomainAddrs.length === 0) { throw new Error(`(UNEXPECTED) finalConflict.createdDomainAddrs falsy/empty? (E: cc41251d1acfe91a48d1b6080259ed26)`); }\r\n\r\n /** throws if not all found */\r\n const resGetCreated = await getIbGibsFromCache_fallbackToSpaces({\r\n addrs: [...createdDnaAddrs, ...replayedDnaAddrs, ...createdDomainAddrs],\r\n space: localTempSpace,\r\n });\r\n resGetCreated.forEach(x => createdFromConflictGraftsIbGibs.push(x));\r\n }\r\n }\r\n\r\n const allTransferredOrCreatedFromGraftIbGibs: IbGib_V1[] = [];\r\n allPayloadIbGibsDomainTransferred.forEach(x => allTransferredOrCreatedFromGraftIbGibs.push(x));\r\n createdFromConflictGraftsIbGibs.forEach(x => allTransferredOrCreatedFromGraftIbGibs.push(x));\r\n\r\n // now we have all ibgibs transferred, first put them all the local space\r\n if (allTransferredOrCreatedFromGraftIbGibs.length === 0) {\r\n // nothing was synced\r\n if (logalot) { console.log(`${lc}[${currentFrameOrigin}] no changes on this end (I: fa30d18e83a87ee9e8487fbb5d632b26)`); }\r\n } else {\r\n // we did have payloads synced, so store them and register them\r\n if (logalot) { console.log(`${lc}[${currentFrameOrigin}] ${allTransferredOrCreatedFromGraftIbGibs.length} changes detected (I: fa30d18e83a87ee9e8487fbb5d632b26)`); }\r\n\r\n // first store them in the durable localSpace (they exist in temp space)...\r\n if (logalot) { console.log(`${lc} put all into localSpace (${localSpace.ib}) starting... (I: d5e0d9870e380b61e80c729660058826)`); }\r\n const { payload_Dnas, payload_NonDnas } =\r\n await putInSpace_dnasThenNonDnas({\r\n ibGibs: allTransferredOrCreatedFromGraftIbGibs,\r\n space: localSpace,\r\n });\r\n if (logalot) { console.log(`${lc} put all into localSpace (${localSpace.ib}) complete. (I: d5e0d9870e380b61e80c729660058826)`); }\r\n\r\n // at this point, we have stored all transferred domain ibgibs.\r\n // we need to metaspace.registerNewIbGib now, which is\r\n // non-trivial. My approach here is to first compile all\r\n // orphaned addrs, and then any payload that was transferred\r\n // that was not orphaned gets registered.\r\n\r\n const orphanedAddresses = await getAllOrphanedAddresses({\r\n sagaHistory,\r\n /**\r\n * we're getting at the graft info, which will be in the temp space\r\n */\r\n myTempSpace: localTempSpace,\r\n });\r\n\r\n const { mapWithTjp_NoDna, mapWithTjp_YesDna, mapWithoutTjps } =\r\n splitPerTjpAndOrDna({ ibGibs: payload_NonDnas, filterPrimitives: true });\r\n\r\n // first register all non-tjp stones\r\n if (logalot) { console.log(`${lc} register mapWithoutTjps starting... (I: 2b84d8f8dda85adde88696d8419bf726)`); }\r\n const nonTjpIbGibs = Object.values(mapWithoutTjps);\r\n for (const nontjp of nonTjpIbGibs) {\r\n if (logalot) { console.log(`${lc} registering ${getIbGibAddr({ ibGib: nontjp })} (I: 4647b4f42d27cffe0fbfce8846755826)`); }\r\n await metaspace.registerNewIbGib({\r\n ibGib: nontjp,\r\n space: localSpace,\r\n });\r\n }\r\n if (logalot) { console.log(`${lc} mapWithoutTjps complete. (I: 2b84d8f8dda85adde88696d8419bf726)`); }\r\n\r\n // next register each timeline in order...\r\n\r\n // ...first the ones without dna...\r\n if (logalot) { console.log(`${lc} register mapWithTjp_NoDna starting... (I: 96e648e4db382499b8bfaa1b37c24826)`); }\r\n const timelinesByTjpAddr_NoDna =\r\n getTimelinesGroupedByTjp({ ibGibs: Object.values(mapWithTjp_NoDna) });\r\n const tjpAddrs_NoDna = Object.keys(timelinesByTjpAddr_NoDna);\r\n for (const tjpAddr_NoDna of tjpAddrs_NoDna) {\r\n const timelineIbGibs = timelinesByTjpAddr_NoDna[tjpAddr_NoDna];\r\n for (const ibGib of timelineIbGibs) {\r\n await metaspace.registerNewIbGib({\r\n ibGib,\r\n space: localSpace,\r\n });\r\n }\r\n }\r\n if (logalot) { console.log(`${lc} register mapWithTjp_NoDna complete. (I: 96e648e4db382499b8bfaa1b37c24826)`); }\r\n\r\n // ...then the ones WITH dna.\r\n if (logalot) { console.log(`${lc} register mapWithTjp_YesDna starting... (I: d54a820e9442dee4681f6228a6795926)`); }\r\n const timelinesByTjpAddr_YesDna =\r\n getTimelinesGroupedByTjp({ ibGibs: Object.values(mapWithTjp_YesDna) });\r\n const tjpAddrs_YesDna = Object.keys(timelinesByTjpAddr_YesDna);\r\n for (const tjpAddr_YesDna of tjpAddrs_YesDna) {\r\n const timelineIbGibs = timelinesByTjpAddr_YesDna[tjpAddr_YesDna];\r\n for (const ibGib of timelineIbGibs) {\r\n if (!orphanedAddresses.includes(getIbGibAddr({ ibGib }))) {\r\n await metaspace.registerNewIbGib({\r\n ibGib,\r\n space: localSpace,\r\n });\r\n }\r\n }\r\n }\r\n if (logalot) { console.log(`${lc} register mapWithTjp_YesDna complete. (I: d54a820e9442dee4681f6228a6795926)`); }\r\n }\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n }\r\n\r\n private async createCommitFrame({\r\n sagaIbGib,\r\n errors,\r\n metaspace,\r\n mySpace,\r\n }: {\r\n sagaIbGib: SyncIbGib_V1,\r\n /**\r\n * if truthy and non-empty, will create an errored commit frame (data\r\n * has `success: false`)\r\n */\r\n errors?: string[],\r\n metaspace: MetaspaceService,\r\n mySpace: IbGibSpaceAny,\r\n }): Promise<SyncIbGib_V1> {\r\n const lc = `[${this.createCommitFrame.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: 48fc57c023f80122135a284855757526)`); }\r\n const commitData: SyncSagaMessageCommitData_V1 = errors && errors.length > 0 ?\r\n {\r\n // errored\r\n sagaId: sagaIbGib.data!.uuid,\r\n stage: SyncStage.commit,\r\n success: false,\r\n errors,\r\n } :\r\n {\r\n // not errored\r\n sagaId: sagaIbGib.data!.uuid,\r\n stage: SyncStage.commit,\r\n success: true,\r\n };\r\n\r\n const commitStone = await this.createSyncMsgStone({\r\n data: commitData,\r\n localSpace: mySpace,\r\n metaspace\r\n });\r\n const commitFrame = await this.evolveSyncSagaIbGib({\r\n prevSagaIbGib: sagaIbGib,\r\n msgStones: [commitStone],\r\n localSpace: mySpace,\r\n metaspace,\r\n });\r\n return commitFrame;\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n }\r\n\r\n private async handleCommitFrame({\r\n sagaIbGib,\r\n mySpace,\r\n myTempSpace,\r\n metaspace,\r\n }: {\r\n sagaIbGib: SyncIbGib_V1,\r\n mySpace: IbGibSpaceAny,\r\n myTempSpace: IbGibSpaceAny,\r\n metaspace: MetaspaceService,\r\n }): Promise<NextSagaFrameInfo> {\r\n const lc = `${this.lc}[${this.handleCommitFrame.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: e179573bdd881202f8ba3168da1c3826)`); }\r\n\r\n if (!sagaIbGib.data) { throw new Error(`(UNEXPECTED) sagaIbGib.data falsy? (E: cbc31dbb7d28b5b8c8cddb510d7d2826)`); }\r\n\r\n if (sagaIbGib.data.errors && sagaIbGib.data.errors.length > 0) {\r\n // our saga errored out but we already committed the darn\r\n // changes previously\r\n throw new Error(`not implemented...saga errored out on other end but we've already committed our changes. we need to implement undoing our changes, i.e., rollback commit, which basically is deleting all the payloads that we already put in in our previous commit. (E: e8eb789e0c08f0b3cf93607cb73e9f26)`);\r\n } else {\r\n // Sender Logic (Finalizing):\r\n // If we are here, we received a Commit frame from the Peer.\r\n // This implies the Peer has successfully committed.\r\n // We should now:\r\n // 1. Validate (implicitly done by receiving valid frame)\r\n // 2. Perform our own cleanup (Temp -> Dest, if applicable)\r\n // 3. Return saga completion.\r\n\r\n // one last validate entire history ?\r\n const history = await getFullSyncSagaHistory({\r\n sagaIbGib,\r\n space: mySpace,\r\n });\r\n const validationErrors = await validateFullSyncSagaHistory({\r\n history,\r\n });\r\n if (validationErrors.length > 0) {\r\n const errorCommitFrame = await this.createCommitFrame({\r\n sagaIbGib,\r\n metaspace,\r\n mySpace,\r\n errors: validationErrors,\r\n });\r\n return { frame: errorCommitFrame, }; /* <<<< returns early */\r\n }\r\n\r\n await this.executeLocalCommit({\r\n commitFrame: sagaIbGib,\r\n sagaHistory: history,\r\n localSpace: mySpace,\r\n localTempSpace: myTempSpace,\r\n metaspace,\r\n });\r\n\r\n // debugger; // edited on dest exists in myTempSpace and mySpace?\r\n\r\n // todo: implement explicit cleanup logic here and in peer\r\n console.error(`${lc} NAG ERROR (NOT THROWN): implement cleanup logic, including add a cleanup method to the peer (E: 3a9a24befb98a981a88fbdbf52920e26)`);\r\n if (logalot) { console.log(`${lc} Peer committed. Finalizing saga locally. Saga Complete.`); }\r\n\r\n // the holy grail!\r\n return { sagaComplete: true };\r\n }\r\n } catch (error) {\r\n const emsg = `${lc} ${extractErrorMsg(error)}`;\r\n console.error(emsg);\r\n const errorCommitFrame = await this.createCommitFrame({\r\n sagaIbGib,\r\n errors: [emsg],\r\n metaspace,\r\n mySpace,\r\n });\r\n return { frame: errorCommitFrame }\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n\r\n }\r\n\r\n // #endregion Handlers\r\n\r\n private async createSyncMsgStone<TStoneData extends SyncSagaMessageData_V1>({\r\n data,\r\n rel8ns,\r\n localSpace,\r\n metaspace,\r\n }: {\r\n data: TStoneData,\r\n rel8ns?: SyncSagaMessageRel8ns_V1,\r\n localSpace: IbGibSpaceAny,\r\n metaspace: MetaspaceService,\r\n }): Promise<IbGib_V1<TStoneData>> {\r\n const lc = `${this.lc}[${this.createSyncMsgStone.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: 5f7f98e8ff980364f7191fcee4531e26)`); }\r\n\r\n const ib = await getSyncSagaMessageIb({ data });\r\n const stone = await Factory_V1.stone({\r\n ib,\r\n parentPrimitiveIb: SYNC_SAGA_MSG_ATOM,\r\n data,\r\n rel8ns,\r\n uuid: true, // we want the stone to have its own uniqueness\r\n });\r\n if (logalot) { console.log(`${lc} Created stone: ${getIbGibAddr({ ibGib: stone })}`); }\r\n await metaspace.put({ ibGib: stone, space: localSpace });\r\n await metaspace.registerNewIbGib({ ibGib: stone });\r\n return stone as IbGib_V1<TStoneData>;\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n }\r\n\r\n private async getPayloadsForRequestedInfos({\r\n deltaRequestAddrInfos,\r\n mySpace,\r\n }: {\r\n deltaRequestAddrInfos: SyncSagaRequestAddrInfo[];\r\n mySpace: IbGibSpaceAny;\r\n }): Promise<IbGib_V1[]> {\r\n const lc = `${this.lc}[${this.getPayloadsForRequestedInfos.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: 4fe13d0d80050f20a8b74ba80cee5826)`); }\r\n /**\r\n * graph of ibgibs we will send to the receiver. addr-based, so will\r\n * already be unique (no need to call `unique` on the domains\r\n * ibgibs)\r\n */\r\n const outgoingPayloadIbGibsDomainGraph: FlatIbGibGraph = {};\r\n for (const { addr, latestAddrAlreadyHave } of deltaRequestAddrInfos) {\r\n let deltaDepGraph: FlatIbGibGraph;\r\n if (latestAddrAlreadyHave) {\r\n // already has some, so only get the delta\r\n // remember: if we didn't have the other's latest addr, then\r\n // this would be in the conflicts not requested addrs\r\n deltaDepGraph = await getDeltaDependencyGraph({\r\n ibGibAddr: addr,\r\n latestCommonFrameAddr: latestAddrAlreadyHave,\r\n space: mySpace,\r\n live: true,\r\n });\r\n } else {\r\n // doesn't have anything, so get the entire dependency graph\r\n // INEFFICIENT: we've already gotten all of the domain\r\n // dependencies in initDomainGraph, but getDependencyGraph\r\n // only works against a space so we are going to rerun this.\r\n // an optimization would be to adapt/create a new\r\n // getDependencyGraph to work against an existing flat ibgib\r\n // map.\r\n deltaDepGraph = await getDependencyGraph({\r\n ibGibAddr: addr,\r\n space: mySpace,\r\n live: true,\r\n });\r\n }\r\n\r\n const depGraphSize = Object.keys(deltaDepGraph).length;\r\n if (depGraphSize === 0) {\r\n throw new Error(`(UNEXPECTED) couldn't get requested addrs in mySpace (${mySpace.ib})? How did the receiver know to ask for these addrs if they weren't in our original graph? (E: 281eaebcdf77dd73e8245b2872100826)`);\r\n } else {\r\n // we have dependencies!\r\n Object.values(deltaDepGraph).forEach(x => {\r\n outgoingPayloadIbGibsDomainGraph[getIbGibAddr({ ibGib: x })] = x;\r\n });\r\n }\r\n }\r\n\r\n const result = Object.values(outgoingPayloadIbGibsDomainGraph);\r\n return result;\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Evolves the saga timeline with a new frame.\r\n */\r\n private async evolveSyncSagaIbGib({\r\n prevSagaIbGib,\r\n conflictStrategy,\r\n msgStones,\r\n localSpace,\r\n metaspace,\r\n sessionIdentity,\r\n }: {\r\n prevSagaIbGib?: SyncIbGib_V1,\r\n conflictStrategy?: SyncConflictStrategy,\r\n msgStones: IbGib_V1[],\r\n localSpace: IbGibSpaceAny,\r\n metaspace: MetaspaceService,\r\n /**\r\n * this is only used on the init frame ({@link prevSagaIbGib}).\r\n * otherwise, the sessionIdentityTjpAddr for the next sync saga ibgib\r\n * frame will be driven by the {@link prevSagaIbGib}.\r\n */\r\n sessionIdentity?: KeystoneIbGib_V1 | undefined,\r\n }): Promise<SyncIbGib_V1> {\r\n const lc = `${this.lc}[${this.evolveSyncSagaIbGib.name}]`;\r\n try {\r\n // Validation\r\n if (!msgStones || msgStones.length === 0) {\r\n throw new Error(`${lc} msgStones required (E: d13f8afcfb8816aeb26baae7df3ef726)`);\r\n }\r\n const firstStoneData = msgStones[0].data as SyncSagaMessageData_V1;\r\n if (!firstStoneData?.sagaId || !firstStoneData?.stage) {\r\n throw new Error(`${lc} Invalid stone data (missing sagaId or stage) (E: c004f85ce8f8958b11839f8d68c38826)`);\r\n }\r\n const sagaId = firstStoneData.sagaId;\r\n const stage = firstStoneData.stage;\r\n\r\n // Ensure all stones match sagaId and stage\r\n for (const stone of msgStones) {\r\n const d = stone.data as SyncSagaMessageData_V1;\r\n if (d.sagaId !== sagaId) {\r\n throw new Error(`${lc} Mismatched sagaId in stones. Expected ${sagaId}, got ${d.sagaId} (E: 29e02719e426ecbbf8ee66887a2be226)`);\r\n }\r\n if (d.stage !== stage) {\r\n throw new Error(`${lc} Mismatched stage in stones. Expected ${stage}, got ${d.stage} (E: d12c6571b0882f762921b60880c3f826)`);\r\n }\r\n }\r\n\r\n if (prevSagaIbGib) {\r\n /**\r\n * rel8ns always include the new msg stone(s)\r\n */\r\n const rel8nInfos: Rel8nInfo[] = [\r\n {\r\n rel8nName: SYNC_MSG_REL8N_NAME,\r\n ibGibs: msgStones,\r\n }\r\n ];\r\n\r\n // remove the existing sync msg stones' addrs\r\n if (!prevSagaIbGib.rel8ns) { throw new Error(`(UNEXPECTED) prevSagaIbGib.rel8ns falsy? (E: 81375841aff85b1e48ea42ca218e6826)`); }\r\n if (!prevSagaIbGib.rel8ns[SYNC_MSG_REL8N_NAME] || prevSagaIbGib.rel8ns[SYNC_MSG_REL8N_NAME].length === 0) {\r\n throw new Error(`(UNEXPECTED) prevSagaIbGib.rel8ns[SYNC_MSG_REL8N_NAME] falsy/empty? (E: 15156baad26fcccda80aa3a31718c726)`);\r\n }\r\n const rel8nRemovalInfos: Rel8nRemovalInfo[] = [\r\n {\r\n rel8nName: SYNC_MSG_REL8N_NAME,\r\n ibGibAddrs: prevSagaIbGib.rel8ns[SYNC_MSG_REL8N_NAME],\r\n }\r\n ];\r\n\r\n // Append to existing timeline\r\n const resAppend = await appendToTimeline({\r\n timeline: prevSagaIbGib,\r\n rel8nInfos,\r\n rel8nRemovalInfos,\r\n metaspace,\r\n space: localSpace,\r\n noDna: true, // Explicitly no DNA for sync frames\r\n });\r\n\r\n const newFrame = resAppend as SyncIbGib_V1;\r\n return newFrame;\r\n } else {\r\n // Create New Timeline (Root Frame)\r\n // data\r\n const data: SyncData_V1 = {\r\n uuid: sagaId,\r\n n: 0,\r\n isTjp: true,\r\n conflictStrategy,\r\n };\r\n if (sessionIdentity) {\r\n const sessionIdentityTjpAddr =\r\n getTjpAddr({ ibGib: sessionIdentity });\r\n if (!sessionIdentityTjpAddr) { throw new Error(`(UNEXPECTED) sessionIdentity is truthy but sessionIdentityTjpAddr falsy? (E: f52004c10288987a6886f4e8fdf90826)`); }\r\n data.sessionIdentityTjpAddr = sessionIdentityTjpAddr;\r\n }\r\n // ib\r\n const ib = await getSyncIb({ data });\r\n // rel8ns\r\n const stoneAddrs = msgStones.map(s => getIbGibAddr({ ibGib: s }));\r\n const rel8ns: SyncRel8ns_V1 = { [SYNC_MSG_REL8N_NAME]: stoneAddrs, };\r\n\r\n const resNew = await createTimeline({\r\n space: localSpace,\r\n metaspace,\r\n ib,\r\n data,\r\n rel8ns,\r\n parentIb: SYNC_ATOM, // \"sync\"\r\n /**\r\n * this will squash the result into a single frame\r\n */\r\n noDna: true,\r\n });\r\n if (!!resNew.intermediateIbGibs) { throw new Error(`(UNEXPECTED) resNew.intermediateIbGibs? we were assuming we were creating a single frame. (E: 456818147235d991ccb4d10d0bbe4826)`); }\r\n\r\n return resNew.newIbGib as SyncIbGib_V1;\r\n }\r\n\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n }\r\n }\r\n\r\n private async getStageAndPayloadFromFrame({\r\n sagaFrame,\r\n space\r\n }: {\r\n sagaFrame: IbGib_V1,\r\n space: IbGibSpaceAny\r\n }): Promise<{ stage: SyncStage, messageData: unknown }> {\r\n const lc = `${this.lc}[${this.getStageAndPayloadFromFrame.name}]`;\r\n try {\r\n if (logalot) { console.log(`${lc} starting... (I: fddc287bd4d55253dc50e519fd352226)`); }\r\n\r\n if (!sagaFrame.rel8ns) { throw new Error(`(UNEXPECTED) sagaFrame.rel8ns falsy? (E: 725bc8eb5dfe5c7058907ad8e3063826)`); }\r\n\r\n const stoneAddrs = sagaFrame.rel8ns?.[SYNC_MSG_REL8N_NAME];\r\n if (stoneAddrs && stoneAddrs.length > 0) {\r\n const stoneAddr = stoneAddrs[0];\r\n const res = await getFromSpace({ addr: stoneAddr, space });\r\n if (res.ibGibs && res.ibGibs.length > 0) {\r\n const stone = res.ibGibs[0];\r\n if (!stone.data) { throw new Error(`(UNEXPECTED) message stone.data falsy? (E: 4d4abcea90d87ba1328434e83d0d0826)`); }\r\n if (!stone.data.stage) { throw new Error(`(UNEXPECTED) message stone.data.stage falsy? (E: 72c8d22310996644ecdd2b5fdb288c26)`); }\r\n return { stage: stone.data.stage, messageData: stone.data };\r\n } else {\r\n throw new Error(`couldn't get stoneAddr (${stoneAddr}) from space (${space.ib}) (E: f3c826e756f8a5c358beb88aa4a65e26)`);\r\n }\r\n } else {\r\n throw new Error(`(UNEXPECTED) no stone addrs rel8d to sync saga ibgib frame? sagaFrame addr: ${getIbGibAddr(sagaFrame)} (E: 43eae8579e289d016741b5526052f226)`);\r\n }\r\n } catch (error) {\r\n console.error(`${lc} ${extractErrorMsg(error)}`);\r\n throw error;\r\n } finally {\r\n if (logalot) { console.log(`${lc} complete.`); }\r\n }\r\n }\r\n\r\n private sortTimelinesTopologically(timelines: { [tjp: string]: IbGib_V1[] }): string[] {\r\n const lc = `${this.lc}[${this.sortTimelinesTopologically.name}]`;\r\n const tjps = Object.keys(timelines);\r\n if (tjps.length === 0) { return []; }\r\n\r\n // 1. Build a reverse lookup: ibGibAddr -> tjpAddr\r\n const addrToTjp: { [addr: string]: string } = {};\r\n tjps.forEach(tjp => {\r\n timelines[tjp].forEach(ibGib => {\r\n const addr = getIbGibAddr({ ibGib });\r\n addrToTjp[addr] = tjp;\r\n });\r\n });\r\n\r\n // 2. Build adjacency list for timelines: tjp -> Set<dependencyTjp>\r\n // Edge direction: T1 -> T2 means T1 depends on T2.\r\n const adj: { [tjp: string]: Set<string> } = {};\r\n tjps.forEach(tjp => adj[tjp] = new Set());\r\n\r\n tjps.forEach(tjp => {\r\n timelines[tjp].forEach(ibGib => {\r\n if (ibGib.rel8ns) {\r\n Object.values(ibGib.rel8ns).flat().forEach(relAddr => {\r\n if (!relAddr) { return; }\r\n const depTjp = addrToTjp[relAddr];\r\n // If dependency is in our scope and is a different timeline\r\n if (depTjp && depTjp !== tjp) {\r\n adj[tjp].add(depTjp);\r\n }\r\n });\r\n }\r\n });\r\n });\r\n\r\n // 3. Topological Sort (DFS)\r\n const visited = new Set<string>();\r\n const temp = new Set<string>(); // for cycle detection\r\n const sorted: string[] = [];\r\n\r\n const visit = (node: string) => {\r\n if (temp.has(node)) {\r\n console.warn(`${lc} Cycle detected involving ${node}. Ignoring edge to break cycle. (W: 7e7352347102431aa5318db962459929)`);\r\n return;\r\n }\r\n if (visited.has(node)) return;\r\n\r\n temp.add(node);\r\n\r\n // Visit dependencies first\r\n adj[node].forEach(dep => visit(dep));\r\n\r\n visited.add(node);\r\n temp.delete(node);\r\n sorted.push(node);\r\n };\r\n\r\n tjps.forEach(node => {\r\n if (!visited.has(node)) visit(node);\r\n });\r\n\r\n return sorted;\r\n }\r\n\r\n}\r\n", "{\n \"$schema\": \"../../../../libs/core-gib/dist/keystone/policy/schemas/keystone.medium.schema.json\",\n \"metadata\": {\n \"name\": \"Space-Gib Default Identity Policy\",\n \"securityLevel\": \"medium\"\n },\n \"pools\": {\n \"sync\": {\n \"id\": \"sync\",\n \"allowedVerbs\": [\"sync\"],\n \"algo\": \"SHA-256\",\n \"rounds\": 1,\n \"behavior\": {\n \"size\": 200,\n \"replenish\": \"top-up\",\n \"selectSequentially\": 2,\n \"selectRandomly\": 2,\n \"targetBindingCount\": 5\n }\n },\n \"manage\": {\n \"id\": \"manage\",\n \"allowedVerbs\": [\"manage\"],\n \"algo\": \"SHA-512\",\n \"rounds\": 10,\n \"behavior\": {\n \"size\": 2000,\n \"replenish\": \"replace-all\",\n \"selectSequentially\": 5,\n \"selectRandomly\": 5,\n \"targetBindingCount\": 16\n }\n },\n \"revoke\": {\n \"id\": \"revoke\",\n \"allowedVerbs\": [\"revoke\"],\n \"algo\": \"SHA-512\",\n \"rounds\": 10,\n \"behavior\": {\n \"size\": 2000,\n \"replenish\": \"delete-all\",\n \"selectSequentially\": 5,\n \"selectRandomly\": 5,\n \"targetBindingCount\": 16\n }\n },\n \"connect\": {\n \"id\": \"connect\",\n \"allowedVerbs\": [\"connect\"],\n \"algo\": \"SHA-256\",\n \"rounds\": 1,\n \"behavior\": {\n \"size\": 20,\n \"replenish\": \"top-up\",\n \"selectSequentially\": 2,\n \"selectRandomly\": 2,\n \"targetBindingCount\": 3\n }\n }\n }\n}", "/**\n * @module common/keystone-policies\n *\n * Centralized identity and security policies for the space-gib application.\n * Defines standard configurations for both persistent (Domain) and ephemeral (Session) keystones.\n *\n * ## important\n *\n * This file is part of the `src/common` layer. It MUST NEVER import from\n * `src/client` or `src/server`.\n */\n\nimport { HashAlgorithm } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';\nimport {\n SESSION_KEYSTONE_POLICY as CORE_SESSION_KEYSTONE_POLICY,\n getConnectChallenge as coreGetConnectChallenge,\n checkConnectSolution as coreCheckConnectSolution\n} from '@ibgib/core-gib/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-receiver/sync-websocket-peer-helpers.mjs';\nimport { createPoolConfigFromJson, KeystonePoolTemplate } from '@ibgib/core-gib/dist/keystone/keystone-config-builder.mjs';\nimport { KeystonePoolConfig } from '@ibgib/core-gib/dist/keystone/keystone-types.mjs';\n\nimport rawPolicies from './keystone-policies.json' with { type: 'json' };\n\n// ---------------------------------------------------------------------------\n// 1. JSON Configuration Mapping & Hybrid Fallbacks\n// ---------------------------------------------------------------------------\n\nexport const pools = rawPolicies.pools as unknown as Record<string, KeystonePoolTemplate>;\n\n/**\n * Resolves a pool config by key from the JSON policy file, with fallback behavior.\n */\nexport function getSpaceGibPoolConfig(poolKey: string, salt: string): KeystonePoolConfig {\n const template = pools[poolKey];\n if (!template) {\n throw new Error(`Pool template not found in space-gib JSON config: ${poolKey}`);\n }\n return createPoolConfigFromJson({\n template,\n salt\n });\n}\n\n// ---------------------------------------------------------------------------\n// 2. Compatibility Layer: Session Keystone (S) Policies\n// ---------------------------------------------------------------------------\n\n/**\n * Default configurations for short-lived session keystones (S^Stjp).\n * These values match the real-world usage in the space-gib client.\n */\nexport const SESSION_KEYSTONE_POLICY = {\n /**\n * Shared parameters across all session pools\n */\n COMMON: CORE_SESSION_KEYSTONE_POLICY.COMMON,\n\n /**\n * The primary authorization pool for sync actions (e.g. putting/getting ibgibs).\n */\n DEFAULT_POOL: {\n ID: 'default',\n SIZE: 20,\n SELECT_SEQUENTIALLY: 2,\n SELECT_RANDOMLY: 2,\n /**\n * We want more for this, with future implementations we will not have\n * resource exhaustion.\n */\n TARGET_BINDING_COUNT: 3,\n },\n\n /**\n * Dedicated pool for the WebSocket sync protocol handshake.\n */\n CONNECT_POOL: CORE_SESSION_KEYSTONE_POLICY.CONNECT_POOL\n} as const;\n\n\n// ---------------------------------------------------------------------------\n// 3. Compatibility Layer: Domain/Identity Keystone (I) Policies\n// ---------------------------------------------------------------------------\n\n/**\n * Server-side minimum requirements for long-lived primary identity keystones.\n */\nexport const DOMAIN_KEYSTONE_SECURITY_STANDARDS = {\n MIN_DEFAULT_POOL_SIZE: 50,\n ALLOWED_ALGORITHMS: [\n HashAlgorithm.sha_256,\n HashAlgorithm.sha_512\n ],\n} as const;\n\n\n// ---------------------------------------------------------------------------\n// 4. Upfront Picket-Fence Connect Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Returns the lexicographically first challenge from the session keystone's\n * 'connect' pool to be used as a deterministic, dynamic upfront pre-filter challenge.\n */\nexport const getConnectChallenge = coreGetConnectChallenge;\n\n/**\n * Cryptographically validates the upfront picket-fence solution against the session keystone.\n * Verifies that the client solved the lexicographically first challenge from the 'connect' pool.\n */\nexport const checkConnectSolution = coreCheckConnectSolution;", "import { IbGibApiBridge, setApiBridge } from \"@ibgib/web-gib/dist/api/ibgib-api-bridge.mjs\";\n\n/**\n * SpaceGib REST API bridge extending the upstream IbGibApiBridge.\n */\nexport class SpaceGibApiBridge extends IbGibApiBridge {\n protected override lc: string = `[SpaceGibApiBridge]`;\n}\n\n/** Singleton instance for space-gib API bridge. */\nexport const spaceGibApiBridge = new SpaceGibApiBridge();\n\n// Register as active API bridge in web-gib\nsetApiBridge(spaceGibApiBridge);\n", "import { extractErrorMsg, getTimestamp, getUUID, hash } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';\nimport { Factory_V1 as factory } from '@ibgib/ts-gib/dist/V1/factory.mjs';\nimport { ROOT } from '@ibgib/ts-gib/dist/V1/constants.mjs';\nimport { getIbGibAddr, } from '@ibgib/ts-gib/dist/helper.mjs';\nimport { IbGib_V1 } from '@ibgib/ts-gib/dist/V1/types.mjs';\nimport { KeystoneService_V1 } from '@ibgib/core-gib/dist/keystone/keystone-service-v1.mjs';\nimport { KeystoneIbGib_V1 } from '@ibgib/core-gib/dist/keystone/keystone-types.mjs';\nimport { SyncPeerWebSocketSender_V1 } from '@ibgib/core-gib/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.mjs';\nimport { SyncSagaCoordinator } from '@ibgib/core-gib/dist/sync/sync-saga-coordinator.mjs';\nimport { getGlobalMetaspace_waitIfNeeded } from \"@ibgib/web-gib/dist/helpers.mjs\";\nimport { SESSION_KEYSTONE_POLICY, getSpaceGibPoolConfig } from \"../../common/keystone-policies.mjs\";\nimport { SpaceGibApiBridge } from '../api/space-gib-api-bridge.mjs';\nimport { KEYSTONE_VERB_SYNC } from '@ibgib/core-gib/dist/keystone/keystone-constants.mjs';\nimport { SyncConflictStrategy } from '@ibgib/core-gib/dist/sync/sync-constants.mjs';\nimport { GLOBAL_LOG_A_LOT } from '../constants.mjs';\n\nexport const logalot = GLOBAL_LOG_A_LOT;\nexport const lc = '[dev-tools]';\n\nexport interface DebugState {\n domainI?: KeystoneIbGib_V1;\n domainIMasterSecret?: string;\n targetX?: IbGib_V1;\n targetC1?: IbGib_V1;\n targetC2?: IbGib_V1;\n sessionS?: KeystoneIbGib_V1;\n sessionSecret?: string;\n senderPeer?: SyncPeerWebSocketSender_V1;\n sagaId?: string;\n}\n\nexport const debugState: DebugState = {};\n(window as any).ibgibDebugState = debugState;\n\n// ---------------------------------------------------------------------------\n// Dev panel log helper\n// ---------------------------------------------------------------------------\n\nexport function devLog(msg: string): void {\n const logEl = document.getElementById('dev-panel-log') as HTMLPreElement | null;\n if (!logEl) { return; }\n const timestamp = new Date().toISOString().slice(11, 23); // HH:MM:SS.mmm\n logEl.textContent = `[${timestamp}] ${msg}\\n` + logEl.textContent;\n}\n\n// ---------------------------------------------------------------------------\n// Phase Setup / Sync common runners\n// ---------------------------------------------------------------------------\n\nexport interface PhaseSetupOptions {\n phaseText: '1B' | '2B' | '3B' | '4.1B' | '4.2B' | '4.3B';\n btnId: string;\n nextBtnId: string;\n masterSecret: string;\n syncSalt: string;\n manageSalt: string;\n ib: string;\n data: any;\n}\n\nexport async function createAndRegisterSyncDelegate({\n domainI,\n masterSecret,\n syncSalt,\n metaspace,\n space,\n apiBridge\n}: {\n domainI: KeystoneIbGib_V1;\n masterSecret: string;\n syncSalt: string;\n metaspace: any;\n space: any;\n apiBridge: SpaceGibApiBridge;\n}): Promise<{ evolvedDomainI: KeystoneIbGib_V1; delegateKeystone: KeystoneIbGib_V1; delegateSecret: string }> {\n const keystoneService = new KeystoneService_V1();\n\n // 1. Derive delegate secret\n const delegateSecret = await hash({ s: `${masterSecret}-sync-delegate` });\n\n // 2. Genesis the delegate keystone\n const delegateKeystone = await keystoneService.genesis({\n masterSecret: delegateSecret,\n configs: [\n getSpaceGibPoolConfig('sync', `${syncSalt}-delegate`),\n ],\n metaspace,\n space,\n frameDetails: { client: 'space-gib-web-dev-delegate', timestamp: getTimestamp() }\n });\n\n // 3. Register delegate on parent Domain identity\n const evolvedDomainI = await keystoneService.registerDelegate({\n parentKeystone: domainI,\n delegateKeystone,\n masterSecret,\n metaspace,\n space,\n allowedVerbs: [KEYSTONE_VERB_SYNC]\n });\n\n const domainAddr = getIbGibAddr({ ibGib: domainI });\n\n // 4. Sync evolved parent and delegate to server\n const resEvolve = await apiBridge.putEvolveKeystone({\n domainAddr,\n keystoneIbGib: evolvedDomainI,\n relatedKeystoneIbGibs: [delegateKeystone]\n });\n if (!resEvolve.success) {\n throw new Error(`Server rejected delegate evolution: ${resEvolve.message}`);\n }\n\n return { evolvedDomainI, delegateKeystone, delegateSecret };\n}\n\nexport async function getSenderIdentityInfo({\n domainI,\n masterSecret,\n metaspace,\n space\n}: {\n domainI: KeystoneIbGib_V1;\n masterSecret: string;\n metaspace: any;\n space: any;\n}): Promise<{ senderIdentity: KeystoneIbGib_V1; fnSenderSecret: () => Promise<string> }> {\n let senderIdentity = domainI;\n let fnSenderSecret = async () => masterSecret;\n\n // Find the delegate that is authorized for sync (not just [0] \u2014 there may be others)\n const syncDelegateEntry = Object.values(domainI.data?.delegates ?? {}).find(\n d => d.allowedVerbs?.includes(KEYSTONE_VERB_SYNC)\n );\n\n if (syncDelegateEntry) {\n const delegateTjpAddr = syncDelegateEntry.delegateTjpAddr;\n if (delegateTjpAddr) {\n // Always resolve the LATEST evolved delegate tip, not the genesis frame\n const latestDelegateAddr = await metaspace.getLatestAddr({ addr: delegateTjpAddr, space });\n if (latestDelegateAddr) {\n const resDel = await metaspace.get({ addr: latestDelegateAddr, space });\n if (resDel.success && resDel.ibGibs && resDel.ibGibs.length > 0) {\n senderIdentity = resDel.ibGibs[0] as KeystoneIbGib_V1;\n const delegateSecret = await hash({ s: `${masterSecret}-sync-delegate` });\n fnSenderSecret = async () => delegateSecret;\n }\n }\n }\n }\n return { senderIdentity, fnSenderSecret };\n}\n\nexport async function performPhaseSetup(opts: PhaseSetupOptions): Promise<void> {\n const lc_fn = `${lc}[performPhaseSetup(${opts.phaseText})]`;\n const btn = document.getElementById(opts.btnId) as HTMLButtonElement | null;\n if (!btn) { return; }\n\n try {\n btn.disabled = true;\n devLog(`${opts.phaseText} Setup: Generating Alice's long-lived Domain Keystone (I) and Target (X)...`);\n\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({});\n if (!space) { throw new Error(\"No default space found in metaspace.\"); }\n\n const keystoneService = new KeystoneService_V1();\n\n // 1. Create Genesis Domain Keystone (I^Itjp) in local space.\n // The domain identity only needs a 'manage' pool \u2014 the delegate gets 'sync'.\n const domainI = await keystoneService.genesis({\n masterSecret: opts.masterSecret,\n configs: [\n getSpaceGibPoolConfig('manage', opts.manageSalt),\n ],\n metaspace,\n space,\n frameDetails: { client: 'space-gib-web-dev', timestamp: getTimestamp() }\n });\n\n devLog(`${opts.phaseText} Setup: \u2713 Domain Keystone (I) created locally: ${getIbGibAddr({ ibGib: domainI })}`);\n devLog(`${opts.phaseText} Setup: Starting postGenesisKeystone...`);\n\n // 2. Post Genesis Domain Keystone to receiver/server\n const apiBridge = new SpaceGibApiBridge();\n const resGenesis = await apiBridge.postGenesisKeystone(domainI);\n if (resGenesis.success) {\n devLog(`${opts.phaseText} Setup: \u2713 Domain Keystone registered and stored on receiver (server).`);\n } else {\n devLog(`${opts.phaseText} Setup: X postGenesisKeystone failed: ${resGenesis.message}.`);\n throw new Error(`${opts.phaseText} Setup: Server rejected genesis domain keystone: ${resGenesis.message}`);\n }\n\n // 2.5 Generate and register delegate\n devLog(`${opts.phaseText} Setup: Generating and registering sync delegate...`);\n const { evolvedDomainI, delegateKeystone } = await createAndRegisterSyncDelegate({\n domainI,\n masterSecret: opts.masterSecret,\n syncSalt: opts.syncSalt,\n metaspace,\n space,\n apiBridge\n });\n\n debugState.domainI = evolvedDomainI;\n debugState.domainIMasterSecret = opts.masterSecret;\n\n devLog(`${opts.phaseText} Setup: \u2713 Registered Sync Delegate: ${getIbGibAddr({ ibGib: delegateKeystone })}`);\n\n // 3. Create Test IbGib (X) locally\n const resX = await factory.firstGen({\n parentIbGib: ROOT,\n ib: opts.ib,\n data: opts.data,\n dna: true,\n nCounter: true,\n tjp: { uuid: true, timestamp: true }\n });\n const xIbGib = resX.newIbGib;\n\n // Persist target X to local space so coordinator can build the sync history\n await metaspace.persistTransformResult({ resTransform: resX, space });\n await metaspace.registerNewIbGib({ ibGib: xIbGib });\n\n debugState.targetX = xIbGib;\n devLog(`${opts.phaseText} Setup: \u2713 Target (X) created and persisted locally: ${getIbGibAddr({ ibGib: xIbGib })}`);\n\n devLog(`\u2713 ${opts.phaseText} Setup Complete! Ready for ${opts.phaseText} Sync.`);\n btn.textContent = `\u2713 ${opts.phaseText} Setup Complete`;\n\n const syncBtn = document.getElementById(opts.nextBtnId) as HTMLButtonElement | null;\n if (syncBtn) { syncBtn.disabled = false; }\n\n } catch (error) {\n devLog(`\u2717 ${opts.phaseText} Setup FAILED: ${extractErrorMsg(error)}`);\n console.error(`${lc_fn} ${opts.phaseText} Setup error:`, error);\n btn.disabled = false;\n }\n}\n\nexport interface PhaseSyncOptions {\n phaseText: '1B' | '2B' | '3B' | '4.1B' | '4.2B' | '4.3B';\n btnId: string;\n nextBtnId: string;\n expectSyncFailure?: boolean;\n failureMessageSuffix?: string;\n}\n\nexport async function performPhaseSync(opts: PhaseSyncOptions): Promise<void> {\n const lc_fn = `${lc}[performPhaseSync(${opts.phaseText})]`;\n const btn = document.getElementById(opts.btnId) as HTMLButtonElement | null;\n if (!btn) { return; }\n\n try {\n btn.disabled = true;\n devLog(`${opts.phaseText} Sync: Executing senderCoordinator.sync(...) using WebSocket Peer...`);\n\n const domainI = debugState.domainI;\n const targetX = debugState.targetX;\n if (!domainI || !targetX) {\n devLog(`\u26A0 ${opts.phaseText} Sync: Missing setup state. Please run Setup first.`);\n btn.disabled = false;\n return;\n }\n\n const domainAddr = getIbGibAddr({ ibGib: domainI });\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({});\n if (!space) { throw new Error(\"No default space.\"); }\n\n const protocol = location.protocol === 'https:' ? 'wss:' : 'ws:';\n const senderPeer = new SyncPeerWebSocketSender_V1({\n classname: 'SyncPeerWebSocketSender_V1',\n httpEvolveUrl: `${location.protocol}//${location.host}/api/keystone/evolve/${encodeURIComponent(domainAddr)}`,\n wsUrl: `${protocol}//${location.host}/api/sync/ws/${encodeURIComponent(domainAddr)}`\n });\n\n const coordinator = new SyncSagaCoordinator();\n const sagaId = await getUUID();\n debugState.sagaId = sagaId;\n debugState.senderPeer = senderPeer;\n\n const { senderIdentity, fnSenderSecret } = await getSenderIdentityInfo({\n domainI,\n masterSecret: debugState.domainIMasterSecret!,\n metaspace,\n space\n });\n\n await senderPeer.initializeOpts({\n localMetaspace: metaspace,\n localSpace: space,\n senderIdentity,\n fnSenderSecret,\n sagaId,\n sessionConnectPoolConfig: SESSION_KEYSTONE_POLICY.CONNECT_POOL as any,\n sessionSyncPoolConfig: SESSION_KEYSTONE_POLICY.DEFAULT_POOL as any,\n targetAddrs: [domainAddr]\n });\n\n try {\n const syncSaga = await coordinator.sync({\n domainIbGibs: [targetX],\n senderIdentityInfo: {\n senderIdentity,\n senderDomainAddr: domainAddr,\n },\n fnSenderSecret,\n peer: senderPeer,\n localSpace: space,\n metaspace,\n conflictStrategy: SyncConflictStrategy.optimisticWithLCS,\n });\n await syncSaga.done;\n } catch (err) {\n if (opts.expectSyncFailure) {\n devLog(`${opts.phaseText} Sync: Coordinator sync executed (${opts.failureMessageSuffix ?? 'errors expected'}): ${extractErrorMsg(err)}`);\n } else {\n throw err;\n }\n }\n\n devLog(`\u2713 ${opts.phaseText} Sync Execution Complete! Ready for State Checks.`);\n btn.textContent = `\u2713 ${opts.phaseText} Sync Run`;\n\n const checkBtn = document.getElementById(opts.nextBtnId) as HTMLButtonElement | null;\n if (checkBtn) { checkBtn.disabled = false; }\n\n } catch (error) {\n devLog(`\u2717 ${opts.phaseText} Sync FAILED: ${extractErrorMsg(error)}`);\n console.error(`${lc_fn} ${opts.phaseText} Sync error:`, error);\n btn.disabled = false;\n }\n}\n\nexport async function getDelegateAndSessionInfo({\n localI,\n metaspace,\n space\n}: {\n localI: KeystoneIbGib_V1;\n metaspace: any;\n space: any;\n}): Promise<{\n delegateTjpAddr?: string;\n latestLocalDelegateAddr?: string;\n localDelegate?: KeystoneIbGib_V1;\n sessionIdentityTjpAddr?: string;\n}> {\n // Find the delegate that is specifically authorized for sync\n const delegateInfo = Object.values(localI.data?.delegates ?? {}).find(\n d => d.allowedVerbs?.includes(KEYSTONE_VERB_SYNC)\n );\n if (!delegateInfo) { return {}; }\n const delegateTjpAddr = delegateInfo.delegateTjpAddr;\n if (!delegateTjpAddr) { return {}; }\n const latestLocalDelegateAddr = await metaspace.getLatestAddr({\n addr: delegateTjpAddr,\n space\n });\n if (!latestLocalDelegateAddr) { return { delegateTjpAddr }; }\n const getDelRes = await metaspace.get({ addrs: [latestLocalDelegateAddr], space });\n const localDelegate = getDelRes.ibGibs?.[0] as KeystoneIbGib_V1 | undefined;\n if (!localDelegate) { return { delegateTjpAddr, latestLocalDelegateAddr }; }\n const syncProof = localDelegate.data?.proofs?.find(p => p.claim?.verb === 'sync');\n const sessionIdentityTjpAddr = syncProof?.claim?.target;\n return {\n delegateTjpAddr,\n latestLocalDelegateAddr,\n localDelegate,\n sessionIdentityTjpAddr\n };\n}\n\n/**\n * Executes one sync pass using the delegate keystone as the sender identity.\n * Always resolves the current delegate tip from the domain identity stored in\n * debugState, so it is safe to call in sequence across multiple passes.\n *\n * @param domainIbGibs - The ibgibs to sync in this pass.\n * @param passLabel - Label used in devLog messages (e.g. \"Pass 1 (Sync C1)\").\n */\nexport async function runSyncPass({\n domainIbGibs,\n passLabel,\n metaspace,\n space,\n}: {\n domainIbGibs: any[];\n passLabel: string;\n metaspace: any;\n space: any;\n}): Promise<void> {\n const domainI = debugState.domainI;\n const masterSecret = debugState.domainIMasterSecret;\n if (!domainI || !masterSecret) {\n throw new Error(`runSyncPass[${passLabel}]: Missing domain identity or secret in debugState. Run Setup first.`);\n }\n\n const domainAddr = getIbGibAddr({ ibGib: domainI });\n const protocol = location.protocol === 'https:' ? 'wss:' : 'ws:';\n\n const { senderIdentity, fnSenderSecret } = await getSenderIdentityInfo({\n domainI,\n masterSecret,\n metaspace,\n space,\n });\n\n devLog(`Sync: ${passLabel} \u2014 using sender: ${getIbGibAddr({ ibGib: senderIdentity }).slice(0, 40)}...`);\n\n const senderPeer = new SyncPeerWebSocketSender_V1({\n classname: 'SyncPeerWebSocketSender_V1',\n httpEvolveUrl: `${location.protocol}//${location.host}/api/keystone/evolve/${encodeURIComponent(domainAddr)}`,\n wsUrl: `${protocol}//${location.host}/api/sync/ws/${encodeURIComponent(domainAddr)}`\n });\n const coordinator = new SyncSagaCoordinator();\n const sagaId = await getUUID();\n debugState.sagaId = sagaId;\n debugState.senderPeer = senderPeer;\n\n await senderPeer.initializeOpts({\n localMetaspace: metaspace,\n localSpace: space,\n senderIdentity,\n fnSenderSecret,\n sagaId,\n sessionConnectPoolConfig: SESSION_KEYSTONE_POLICY.CONNECT_POOL as any,\n sessionSyncPoolConfig: SESSION_KEYSTONE_POLICY.DEFAULT_POOL as any,\n targetAddrs: [domainAddr]\n });\n\n const syncSaga = await coordinator.sync({\n domainIbGibs,\n senderIdentityInfo: {\n senderIdentity,\n senderDomainAddr: domainAddr,\n },\n fnSenderSecret,\n peer: senderPeer,\n localSpace: space,\n metaspace,\n conflictStrategy: SyncConflictStrategy.optimisticWithLCS,\n });\n await syncSaga.done;\n\n // After each pass the domain identity may have evolved \u2014 refresh debugState\n const latestDomainAddr = await metaspace.getLatestAddr({ addr: domainAddr, space });\n if (latestDomainAddr && latestDomainAddr !== getIbGibAddr({ ibGib: domainI })) {\n const res = await metaspace.get({ addrs: [latestDomainAddr], space });\n if (res.ibGibs?.[0]) { debugState.domainI = res.ibGibs[0] as KeystoneIbGib_V1; }\n }\n}\n\n/**\n * Like `runSyncPass` but accepts an explicit space, domainI, and masterSecret.\n * Use this when syncing from a secondary (e.g., \"remote\") space that is NOT\n * the current default local user space.\n *\n * After the sync, copies the evolved domain identity tip back to `primarySpace`\n * (if provided) and updates debugState.domainI.\n */\nexport async function runSyncPassFromSpace({\n domainIbGibs,\n passLabel,\n metaspace,\n space,\n primarySpace,\n domainI,\n masterSecret,\n}: {\n domainIbGibs: any[];\n passLabel: string;\n metaspace: any;\n space: any;\n /** If provided, the evolved domain identity is copied back here after sync. */\n primarySpace?: any;\n domainI: KeystoneIbGib_V1;\n masterSecret: string;\n}): Promise<void> {\n const domainAddr = getIbGibAddr({ ibGib: domainI });\n const protocol = location.protocol === 'https:' ? 'wss:' : 'ws:';\n\n const { senderIdentity, fnSenderSecret } = await getSenderIdentityInfo({\n domainI,\n masterSecret,\n metaspace,\n space,\n });\n\n devLog(`Sync: ${passLabel} \u2014 using sender: ${getIbGibAddr({ ibGib: senderIdentity }).slice(0, 40)}...`);\n\n const senderPeer = new SyncPeerWebSocketSender_V1({\n classname: 'SyncPeerWebSocketSender_V1',\n httpEvolveUrl: `${location.protocol}//${location.host}/api/keystone/evolve/${encodeURIComponent(domainAddr)}`,\n wsUrl: `${protocol}//${location.host}/api/sync/ws/${encodeURIComponent(domainAddr)}`\n });\n const coordinator = new SyncSagaCoordinator();\n const sagaId = await getUUID();\n debugState.sagaId = sagaId;\n debugState.senderPeer = senderPeer;\n\n await senderPeer.initializeOpts({\n localMetaspace: metaspace,\n localSpace: space,\n senderIdentity,\n fnSenderSecret,\n sagaId,\n sessionConnectPoolConfig: SESSION_KEYSTONE_POLICY.CONNECT_POOL as any,\n sessionSyncPoolConfig: SESSION_KEYSTONE_POLICY.DEFAULT_POOL as any,\n targetAddrs: [domainAddr]\n });\n\n const syncSaga = await coordinator.sync({\n domainIbGibs,\n senderIdentityInfo: {\n senderIdentity,\n senderDomainAddr: domainAddr,\n },\n fnSenderSecret,\n peer: senderPeer,\n localSpace: space,\n metaspace,\n conflictStrategy: SyncConflictStrategy.optimisticWithLCS,\n });\n await syncSaga.done;\n\n // After sync, refresh evolved domain identity\n const latestDomainAddr = await metaspace.getLatestAddr({ addr: domainAddr, space });\n if (latestDomainAddr) {\n const res = await metaspace.get({ addrs: [latestDomainAddr], space });\n const evolved = res.ibGibs?.[0] as KeystoneIbGib_V1 | undefined;\n if (evolved) {\n debugState.domainI = evolved;\n // If a primary space was provided, copy the evolved domain and delegate identities back there\n if (primarySpace) {\n await copyIdentitiesToSpace({\n domainI: evolved,\n metaspace,\n fromSpace: space,\n toSpace: primarySpace\n });\n }\n }\n }\n}\n\nexport async function setupDomainAndDelegateIdentities({\n masterSecret,\n syncSalt,\n manageSalt,\n metaspace,\n space,\n apiBridge,\n phaseText\n}: {\n masterSecret: string;\n syncSalt: string;\n manageSalt: string;\n metaspace: any;\n space: any;\n apiBridge: SpaceGibApiBridge;\n phaseText: string;\n}): Promise<{ domainI: KeystoneIbGib_V1; delegateKeystone: KeystoneIbGib_V1 }> {\n const keystoneService = new KeystoneService_V1();\n\n // 1. Create Genesis Domain Keystone (I^Itjp) in local space.\n // The domain identity only needs a 'manage' pool \u2014 the delegate gets 'sync'.\n const domainI = await keystoneService.genesis({\n masterSecret,\n configs: [\n getSpaceGibPoolConfig('manage', manageSalt),\n ],\n metaspace,\n space,\n frameDetails: { client: 'space-gib-web-dev', timestamp: getTimestamp() }\n });\n\n devLog(`${phaseText} Setup: \u2713 Domain Keystone (I) created locally: ${getIbGibAddr({ ibGib: domainI })}`);\n devLog(`${phaseText} Setup: Starting postGenesisKeystone...`);\n\n // 2. Post Genesis Domain Keystone to receiver/server\n const resGenesis = await apiBridge.postGenesisKeystone(domainI);\n if (resGenesis.success) {\n devLog(`${phaseText} Setup: \u2713 Domain Keystone registered and stored on receiver (server).`);\n } else {\n devLog(`${phaseText} Setup: X postGenesisKeystone failed: ${resGenesis.message}.`);\n throw new Error(`${phaseText} Setup: Server rejected genesis domain keystone: ${resGenesis.message}`);\n }\n\n // 3. Generate and register delegate\n devLog(`${phaseText} Setup: Generating and registering sync delegate...`);\n const { evolvedDomainI, delegateKeystone } = await createAndRegisterSyncDelegate({\n domainI,\n masterSecret,\n syncSalt,\n metaspace,\n space,\n apiBridge\n });\n\n debugState.domainI = evolvedDomainI;\n debugState.domainIMasterSecret = masterSecret;\n\n return { domainI: evolvedDomainI, delegateKeystone };\n}\n\nexport async function verifyIdentitiesOnServer({\n localI,\n metaspace,\n space,\n apiBridge,\n domainAddr\n}: {\n localI: KeystoneIbGib_V1;\n metaspace: any;\n space: any;\n apiBridge: SpaceGibApiBridge;\n domainAddr: string;\n}): Promise<{\n latestLocalIAddr: string;\n latestLocalDelegateAddr: string;\n sessionIdentityTjpAddr: string;\n}> {\n const latestLocalIAddr = await metaspace.getLatestAddr({\n addr: domainAddr,\n space\n });\n if (!latestLocalIAddr) {\n throw new Error('Evolved domain keystone tip NOT found in local space!');\n }\n devLog(`\u2713 Check: Evolved Domain Keystone exists locally.`);\n\n const {\n latestLocalDelegateAddr,\n sessionIdentityTjpAddr\n } = await getDelegateAndSessionInfo({ localI, metaspace, space });\n\n if (!latestLocalDelegateAddr) {\n throw new Error('Evolved delegate keystone tip NOT found in local space!');\n }\n if (!sessionIdentityTjpAddr) {\n throw new Error('Delegate sync claim does not target a session keystone.');\n }\n devLog(`\u2713 Check: Delegate Keystone and Sync Claim to Session verified locally.`);\n\n const serverDelGetRes = await apiBridge.getIbGib(domainAddr, latestLocalDelegateAddr);\n if (!serverDelGetRes.success || !serverDelGetRes.ibGib) {\n throw new Error(`Evolved Delegate Keystone NOT found on server!`);\n }\n devLog(`\u2713 Check: Evolved Delegate Keystone exists on server.`);\n\n const serverIGetRes = await apiBridge.getIbGib(domainAddr, latestLocalIAddr);\n if (!serverIGetRes.success || !serverIGetRes.ibGib) {\n throw new Error(`Evolved Domain Keystone NOT found on server!`);\n }\n devLog(`\u2713 Check: Evolved Domain Keystone exists on server.`);\n\n return {\n latestLocalIAddr,\n latestLocalDelegateAddr,\n sessionIdentityTjpAddr\n };\n}\n\nexport async function copyIdentitiesToSpace({\n domainI,\n metaspace,\n fromSpace,\n toSpace\n}: {\n domainI: KeystoneIbGib_V1;\n metaspace: any;\n fromSpace: any;\n toSpace: any;\n}): Promise<void> {\n const domainAddr = getIbGibAddr({ ibGib: domainI });\n\n // 1. Get latest Domain I and its graph, put and register\n const latestDomainAddr = await metaspace.getLatestAddr({ addr: domainAddr, space: fromSpace });\n if (!latestDomainAddr) { throw new Error(\"Could not find latest domain I address.\"); }\n\n const resDomain = await metaspace.get({ addrs: [latestDomainAddr], space: fromSpace });\n const latestDomainI = resDomain.ibGibs?.[0] as KeystoneIbGib_V1 | undefined;\n if (!latestDomainI) { throw new Error(\"Could not get latest domain I.\"); }\n\n const graphI = await metaspace.getDependencyGraph({ ibGibAddr: latestDomainAddr, space: fromSpace });\n await metaspace.put({ ibGibs: Object.values(graphI), space: toSpace });\n await metaspace.registerNewIbGib({ ibGib: latestDomainI, space: toSpace });\n\n // 2. Find and copy delegate(s)\n const syncDelegateEntry = Object.values(latestDomainI.data?.delegates ?? {}).find(\n d => d.allowedVerbs?.includes(KEYSTONE_VERB_SYNC)\n );\n\n if (syncDelegateEntry) {\n const delegateTjpAddr = syncDelegateEntry.delegateTjpAddr;\n if (delegateTjpAddr) {\n const latestDelegateAddr = await metaspace.getLatestAddr({ addr: delegateTjpAddr, space: fromSpace });\n if (latestDelegateAddr) {\n const resDel = await metaspace.get({ addrs: [latestDelegateAddr], space: fromSpace });\n const latestDelegate = resDel.ibGibs?.[0] as KeystoneIbGib_V1 | undefined;\n if (latestDelegate) {\n const graphDel = await metaspace.getDependencyGraph({ ibGibAddr: latestDelegateAddr, space: fromSpace });\n await metaspace.put({ ibGibs: Object.values(graphDel), space: toSpace });\n await metaspace.registerNewIbGib({ ibGib: latestDelegate, space: toSpace });\n }\n }\n }\n }\n}\n\n", "import { extractErrorMsg, getTimestamp, getUUID, } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';\nimport { Factory_V1 as factory } from '@ibgib/ts-gib/dist/V1/factory.mjs';\nimport { ROOT } from '@ibgib/ts-gib/dist/V1/constants.mjs';\nimport { getIbGibAddr, } from '@ibgib/ts-gib/dist/helper.mjs';\nimport { KeystoneService_V1 } from '@ibgib/core-gib/dist/keystone/keystone-service-v1.mjs';\nimport { KeystoneReplenishStrategy } from '@ibgib/core-gib/dist/keystone/keystone-types.mjs';\nimport { createManagePoolConfig } from '@ibgib/core-gib/dist/keystone/keystone-config-builder.mjs';\nimport { KeystoneStrategyFactory } from '@ibgib/core-gib/dist/keystone/strategy/keystone-strategy-factory.mjs';\nimport { KEYSTONE_VERB_CONNECT, POOL_ID_CONNECT } from '@ibgib/core-gib/dist/keystone/keystone-constants.mjs';\nimport { getGlobalMetaspace_waitIfNeeded } from \"@ibgib/web-gib/dist/helpers.mjs\";\nimport { SESSION_KEYSTONE_POLICY, getConnectChallenge } from \"../../common/keystone-policies.mjs\";\nimport { SpaceGibApiBridge } from '../api/space-gib-api-bridge.mjs';\n\nimport { debugState, devLog, lc } from './common.mjs';\n\nlet _ws: WebSocket | null = null;\n\nexport function initWsTestButton(): void {\n const lc_fn = `${lc}[initWsTestButton]`;\n const btn = document.getElementById('btn-test-ws') as HTMLButtonElement | null;\n if (!btn) {\n console.warn(`${lc_fn} btn-test-ws not found \u2014 skipping`);\n return;\n }\n\n btn.addEventListener('click', () => {\n try {\n if (_ws && _ws.readyState === WebSocket.OPEN) {\n _ws.send(JSON.stringify({ ping: 'hello from client', ts: Date.now() }));\n devLog('\u2192 sent ping on existing connection');\n return;\n }\n\n const protocol = location.protocol === 'https:' ? 'wss:' : 'ws:';\n const wsUrl = `${protocol}//${location.host}/api/debug/ws-echo`;\n devLog(`\u2192 connecting to ${wsUrl}`);\n\n _ws = new WebSocket(wsUrl);\n\n _ws.addEventListener('open', () => {\n devLog('\u2713 WebSocket connected');\n btn.textContent = 'Send WS Ping';\n });\n\n _ws.addEventListener('message', (ev) => {\n devLog(`\u2190 ${ev.data}`);\n });\n\n _ws.addEventListener('close', (ev) => {\n devLog(`\u2717 WebSocket closed (code ${ev.code})`);\n btn.textContent = 'Test WebSocket';\n _ws = null;\n });\n\n _ws.addEventListener('error', (ev) => {\n devLog(`\u2717 WebSocket error \u2014 check console`);\n console.error(`${lc_fn} WebSocket error`, ev);\n });\n\n } catch (error) {\n devLog(`\u2717 ${extractErrorMsg(error)}`);\n console.error(`${lc_fn} ${extractErrorMsg(error)}`);\n }\n });\n}\n\nexport function initPrintStateButton(): void {\n const btn = document.getElementById('btn-print-dev-state') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', () => {\n devLog(`Printing debug state to console...`);\n console.dir(debugState);\n });\n}\n\nexport function initCreateDomainKeystoneButton(): void {\n const lc_fn = `${lc}[initCreateDomainKeystoneButton]`;\n const btn = document.getElementById('btn-create-domain-keystone') as HTMLButtonElement | null;\n if (!btn) { return; }\n\n btn.addEventListener('click', async () => {\n try {\n btn.disabled = true;\n devLog('Generating dummy Domain Keystone (I)...');\n\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({});\n if (!space) { throw new Error(\"No default space found in metaspace.\"); }\n\n const masterSecret = 'password';\n const keystoneService = new KeystoneService_V1();\n\n const domainI = await keystoneService.genesis({\n masterSecret,\n configs: [\n createManagePoolConfig({\n id: 'default',\n salt: await getUUID(),\n replenishStrategy: KeystoneReplenishStrategy.topUp,\n }),\n ],\n metaspace,\n space,\n frameDetails: { client: 'space-gib-web-dev', timestamp: getTimestamp() }\n });\n\n const iAddr = getIbGibAddr({ ibGib: domainI });\n devLog(`\u2713 Local genesis complete: ${iAddr}`);\n\n debugState.domainI = domainI;\n debugState.domainIMasterSecret = masterSecret;\n\n devLog(`Posting genesis keystone to server...`);\n const apiBridge = new SpaceGibApiBridge();\n const resSync = await apiBridge.postGenesisKeystone(domainI);\n if (!resSync.success) {\n devLog(`\u2717 Server rejected genesis keystone: ${resSync.message}`);\n btn.disabled = false;\n return;\n }\n\n devLog(`\u2713 Server accepted Domain Keystone (I)`);\n btn.textContent = '\u2713 Domain Keystone Created';\n\n const nextBtn = document.getElementById('btn-create-test-ibgib') as HTMLButtonElement;\n if (nextBtn) { nextBtn.disabled = false; }\n\n } catch (error) {\n devLog(`\u2717 ${extractErrorMsg(error)}`);\n console.error(`${lc_fn} ${extractErrorMsg(error)}`);\n btn.disabled = false;\n }\n });\n}\n\nexport function initCreateTestIbGibButton(): void {\n const lc_fn = `${lc}[initCreateTestIbGibButton]`;\n const btn = document.getElementById('btn-create-test-ibgib') as HTMLButtonElement | null;\n if (!btn) {\n console.warn(`${lc_fn} btn-create-test-ibgib not found \u2014 skipping`);\n return;\n }\n\n btn.addEventListener('click', async () => {\n try {\n devLog('Generating dummy X^Xtjp ibgib...');\n const resX = await factory.firstGen({\n parentIbGib: ROOT,\n ib: 'test data',\n data: { hello: 'world', random: Math.random() },\n dna: true,\n nCounter: true,\n tjp: { uuid: true, timestamp: true }\n });\n const xIbGib = resX.newIbGib;\n const xAddr = getIbGibAddr({ ibGib: xIbGib });\n\n debugState.targetX = xIbGib;\n devLog(`\u2713 Created X: ${xAddr}`);\n btn.textContent = '\u2713 Test IbGib (X) Created';\n\n const nextBtn = document.getElementById('btn-create-session-keystone') as HTMLButtonElement;\n if (nextBtn) { nextBtn.disabled = false; }\n } catch (error) {\n devLog(`\u2717 ${extractErrorMsg(error)}`);\n console.error(`${lc_fn} ${extractErrorMsg(error)}`);\n }\n });\n}\n\nexport function initCreateSessionKeystoneButton(): void {\n const lc_fn = `${lc}[initCreateSessionKeystoneButton]`;\n const btn = document.getElementById('btn-create-session-keystone') as HTMLButtonElement | null;\n if (!btn) {\n console.warn(`${lc_fn} btn-create-session-keystone not found \u2014 skipping`);\n return;\n }\n\n btn.addEventListener('click', async () => {\n try {\n devLog('Generating Session Keystone (S^Stjp)...');\n\n const domainI = debugState.domainI;\n const targetX = debugState.targetX;\n\n if (!domainI) { devLog('\u26A0 No domain keystone (I) found in state. Please Create Domain Keystone first.'); return; }\n if (!targetX) { devLog('\u26A0 No target ibgib (X) found in state. Please Create Test IbGib first.'); return; }\n\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({});\n if (!space) { throw new Error(\"No default space found in metaspace.\"); }\n\n const sessionSecret = 'ephemeral-' + Math.random().toString();\n const keystoneService = new KeystoneService_V1();\n\n console.warn(`${lc}[NAG] placeholder genesis keystone config right now (W: 69b108687cf8bec0f9a8e148bcca8d26)`);\n const sIbGib = await keystoneService.genesis({\n masterSecret: sessionSecret,\n configs: [\n {\n id: SESSION_KEYSTONE_POLICY.DEFAULT_POOL.ID,\n salt: await getUUID(),\n type: SESSION_KEYSTONE_POLICY.COMMON.TYPE,\n algo: SESSION_KEYSTONE_POLICY.COMMON.ALGO,\n rounds: SESSION_KEYSTONE_POLICY.COMMON.ROUNDS,\n behavior: {\n size: SESSION_KEYSTONE_POLICY.DEFAULT_POOL.SIZE,\n replenish: SESSION_KEYSTONE_POLICY.COMMON.REPLENISH,\n selectSequentially: SESSION_KEYSTONE_POLICY.DEFAULT_POOL.SELECT_SEQUENTIALLY,\n selectRandomly: SESSION_KEYSTONE_POLICY.DEFAULT_POOL.SELECT_RANDOMLY,\n targetBindingCount: SESSION_KEYSTONE_POLICY.DEFAULT_POOL.TARGET_BINDING_COUNT,\n },\n allowedVerbs: [],\n },\n {\n id: SESSION_KEYSTONE_POLICY.CONNECT_POOL.ID,\n salt: await getUUID(),\n type: SESSION_KEYSTONE_POLICY.COMMON.TYPE,\n algo: SESSION_KEYSTONE_POLICY.COMMON.ALGO,\n rounds: SESSION_KEYSTONE_POLICY.COMMON.ROUNDS,\n behavior: {\n size: SESSION_KEYSTONE_POLICY.CONNECT_POOL.SIZE,\n replenish: SESSION_KEYSTONE_POLICY.COMMON.REPLENISH,\n selectSequentially: SESSION_KEYSTONE_POLICY.CONNECT_POOL.SELECT_SEQUENTIALLY,\n selectRandomly: SESSION_KEYSTONE_POLICY.CONNECT_POOL.SELECT_RANDOMLY,\n targetBindingCount: SESSION_KEYSTONE_POLICY.CONNECT_POOL.TARGET_BINDING_COUNT,\n },\n allowedVerbs: [SESSION_KEYSTONE_POLICY.CONNECT_POOL.VERB],\n }\n ],\n metaspace,\n space,\n frameDetails: {\n client: 'space-gib-web-session',\n target_I: domainI ? getIbGibAddr({ ibGib: domainI }) : undefined,\n target_X: targetX ? getIbGibAddr({ ibGib: targetX }) : undefined,\n }\n });\n\n const sAddr = getIbGibAddr({ ibGib: sIbGib });\n debugState.sessionS = sIbGib;\n debugState.sessionSecret = sessionSecret;\n\n devLog(`\u2713 Created Session Keystone: ${sAddr}`);\n btn.textContent = '\u2713 Session Keystone Created';\n } catch (error) {\n devLog(`\u2717 ${extractErrorMsg(error)}`);\n console.error(`${lc_fn} ${extractErrorMsg(error)}`);\n }\n });\n}\n\n", "import { extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';\nimport { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';\nimport { KeystoneIbGib_V1 } from '@ibgib/core-gib/dist/keystone/keystone-types.mjs';\nimport { POOL_ID_CONNECT, POOL_ID_SYNC } from '@ibgib/core-gib/dist/keystone/keystone-constants.mjs';\nimport { getGlobalMetaspace_waitIfNeeded } from \"@ibgib/web-gib/dist/helpers.mjs\";\nimport { SpaceGibApiBridge } from '../api/space-gib-api-bridge.mjs';\n\nimport { debugState, devLog, lc, performPhaseSetup, performPhaseSync } from './common.mjs';\n\nexport function init1bSetupButton(): void {\n const btn = document.getElementById('btn-1b-setup') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', () => {\n performPhaseSetup({\n phaseText: '1B',\n btnId: 'btn-1b-setup',\n nextBtnId: 'btn-1b-sync',\n masterSecret: 'test-sender-secret-phase1',\n syncSalt: 'senderidentitysyncsaltphase1',\n manageSalt: 'senderidentitymanagesaltphase1',\n ib: 'test data',\n data: { hello: 'world', random: Math.random() }\n });\n });\n}\n\nexport function init1bSyncButton(): void {\n const btn = document.getElementById('btn-1b-sync') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', () => {\n performPhaseSync({\n phaseText: '1B',\n btnId: 'btn-1b-sync',\n nextBtnId: 'btn-1b-check',\n expectSyncFailure: true,\n failureMessageSuffix: 'establish phase successfully run; connection/sync errors expected in 1B'\n });\n });\n}\n\nexport function init1bCheckButton(): void {\n const lc_fn = `${lc}[init1bCheckButton]`;\n const btn = document.getElementById('btn-1b-check') as HTMLButtonElement | null;\n if (!btn) { return; }\n\n btn.addEventListener('click', async () => {\n try {\n devLog('1B Check: Asserting cryptographic and durable state expectations from respec...');\n\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({});\n if (!space) { throw new Error(\"No default space.\"); }\n\n const domainI = debugState.domainI!;\n const targetX = debugState.targetX!;\n\n // 1. Resolve evolved sender identity I1 locally\n const newSenderIdentityAddr = await metaspace.getLatestAddr({\n addr: getIbGibAddr({ ibGib: domainI }),\n space\n });\n\n if (!newSenderIdentityAddr) {\n devLog('\u2717 Check: Evolved domain keystone tip I1 NOT found in local space!');\n return;\n }\n devLog(`\u2713 Check: Evolved Domain Keystone (I1) created and stored locally.`);\n\n const getRes = await metaspace.get({ addrs: [newSenderIdentityAddr], space });\n const newSenderIdentity = getRes.ibGibs?.[0] as KeystoneIbGib_V1 | undefined;\n\n if (!newSenderIdentity) {\n devLog('\u2717 Check: Failed to load I1 from local space.');\n return;\n }\n\n const syncProof = newSenderIdentity.data?.proofs?.find(p => p.claim?.verb === 'sync');\n if (!syncProof) {\n devLog('\u2717 Check: I1 is missing sync-verb claim proof!');\n } else {\n devLog('\u2713 Check: I1 contains valid sync-verb claim proof.');\n }\n\n const sessionIdentityTjpAddr = syncProof?.claim?.target;\n if (!sessionIdentityTjpAddr) {\n devLog('\u2717 Check: I1 sync claim does not target a session keystone.');\n return;\n }\n devLog(`\u2713 Check: Sync claim targets session keystone: ${sessionIdentityTjpAddr}`);\n\n // 2. Load Session Keystone (S) locally\n const sRes = await metaspace.get({ addrs: [sessionIdentityTjpAddr], space });\n const sessionIdentity = sRes.ibGibs?.[0] as KeystoneIbGib_V1 | undefined;\n\n if (!sessionIdentity) {\n devLog('\u2717 Check: Session Keystone (S) NOT found in local space.');\n return;\n }\n devLog('\u2713 Check: Session Keystone (S) successfully created locally.');\n\n const sPools = sessionIdentity.data?.challengePools ?? [];\n const hasConnectPool = sPools.some(p => p.id === POOL_ID_CONNECT);\n const hasSyncPool = sPools.some(p => p.id === POOL_ID_SYNC);\n\n if (hasConnectPool && hasSyncPool) {\n devLog('\u2713 Check: S contains both connect and sync challenge pools.');\n } else {\n devLog(`\u2717 Check: S is missing challenge pools! (connect: ${hasConnectPool}, sync: ${hasSyncPool})`);\n }\n\n // 3. Verify Server-Side (receiver) registrations via GET REST API\n devLog('Check: Verifying registrations on server (receiver metaspace)...');\n const apiBridge = new SpaceGibApiBridge();\n\n let hasI = false;\n let hasI1 = false;\n let hasS = false;\n\n const domainAddr = getIbGibAddr({ ibGib: domainI });\n const resGetDomainIGraphFromServer = await apiBridge.getKeystoneGraph(domainAddr);\n if (resGetDomainIGraphFromServer.success && resGetDomainIGraphFromServer.graph) {\n const domainGraph = resGetDomainIGraphFromServer.graph;\n hasI = domainGraph[domainAddr] !== undefined;\n hasI1 = domainGraph[newSenderIdentityAddr] !== undefined;\n } else {\n devLog(`\u2717 Check Server: Failed to fetch keystone graph from server: ${resGetDomainIGraphFromServer.message}`);\n }\n\n const resGetSessionSFromServer = await apiBridge.getIbGib(domainAddr, sessionIdentityTjpAddr);\n if (resGetSessionSFromServer.success && resGetSessionSFromServer.ibGib) {\n hasS = true;\n } else {\n devLog(`\u2717 Check Server: Failed to fetch session keystone from server: ${resGetSessionSFromServer.message}`);\n }\n\n if (hasI) { devLog('\u2713 Check Server: Genesis Domain Keystone (I) registered on server.'); }\n else devLog('\u2717 Check Server: Genesis Domain Keystone (I) missing on server!');\n if (hasI1) { devLog('\u2713 Check Server: Evolved Domain Keystone (I1) accepted and stored on server.'); }\n else devLog('\u2717 Check Server: Evolved Domain Keystone (I1) missing on server!');\n if (hasS) { devLog('\u2713 Check Server: Session Keystone (S) accepted and stored on server.'); }\n else devLog('\u2717 Check Server: Session Keystone (S) missing on server!');\n \n if (hasI && hasI1 && hasS) {\n devLog('\uD83C\uDF89 ALL PHASE 1B ESTABLISH CHECKS PASSED FLAWLESSLY! \u2713');\n btn.textContent = '\u2713 1B All Passed';\n\n const btn2bSetup = document.getElementById('btn-2b-setup') as HTMLButtonElement | null;\n if (btn2bSetup) { btn2bSetup.disabled = false; }\n }\n\n } catch (error) {\n devLog(`\u2717 1B Check FAILED: ${extractErrorMsg(error)}`);\n console.error(`${lc_fn} 1B Check error:`, error);\n }\n });\n}\n", "import { extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';\nimport { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';\nimport { KeystoneIbGib_V1 } from '@ibgib/core-gib/dist/keystone/keystone-types.mjs';\nimport { POOL_ID_CONNECT, POOL_ID_SYNC } from '@ibgib/core-gib/dist/keystone/keystone-constants.mjs';\nimport { getGlobalMetaspace_waitIfNeeded } from \"@ibgib/web-gib/dist/helpers.mjs\";\n\nimport { debugState, devLog, lc, performPhaseSetup, performPhaseSync } from './common.mjs';\n\nexport function init2bSetupButton(): void {\n const btn = document.getElementById('btn-2b-setup') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', () => {\n performPhaseSetup({\n phaseText: '2B',\n btnId: 'btn-2b-setup',\n nextBtnId: 'btn-2b-sync',\n masterSecret: 'test-sender-secret-phase2',\n syncSalt: 'senderidentitysyncsaltphase2',\n manageSalt: 'senderidentitymanagesaltphase2',\n ib: 'test data',\n data: { hello: 'world2', random: Math.random() }\n });\n });\n}\n\nexport function init2bSyncButton(): void {\n const btn = document.getElementById('btn-2b-sync') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', () => {\n performPhaseSync({\n phaseText: '2B',\n btnId: 'btn-2b-sync',\n nextBtnId: 'btn-2b-check',\n expectSyncFailure: true,\n failureMessageSuffix: 'connect phase successfully run; subsequent sync errors expected in 2B'\n });\n });\n}\n\nexport function init2bCheckButton(): void {\n const lc_fn = `${lc}[init2bCheckButton]`;\n const btn = document.getElementById('btn-2b-check') as HTMLButtonElement | null;\n if (!btn) { return; }\n\n btn.addEventListener('click', async () => {\n try {\n devLog('2B Check: Asserting cryptographic and WebSocket state expectations...');\n\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({});\n if (!space) { throw new Error(\"No default space.\"); }\n\n const domainI = debugState.domainI!;\n\n // 1. Resolve evolved sender identity I1 locally\n const domainAddr = getIbGibAddr({ ibGib: domainI });\n const newSenderIdentityAddr = await metaspace.getLatestAddr({\n addr: domainAddr,\n space\n });\n\n if (!newSenderIdentityAddr) {\n devLog('\u2717 Check: Evolved domain keystone tip I1 NOT found in local space!');\n return;\n }\n devLog(`\u2713 Check: Evolved Domain Keystone (I1) created and stored locally.`);\n\n const getRes = await metaspace.get({ addrs: [newSenderIdentityAddr], space });\n const newSenderIdentity = getRes.ibGibs?.[0] as KeystoneIbGib_V1 | undefined;\n\n if (!newSenderIdentity) {\n devLog('\u2717 Check: Failed to load I1 from local space.');\n return;\n }\n\n const syncProof = newSenderIdentity.data?.proofs?.find(p => p.claim?.verb === 'sync');\n const sessionIdentityTjpAddr = syncProof?.claim?.target;\n if (!sessionIdentityTjpAddr) {\n devLog('\u2717 Check: I1 sync claim does not target a session keystone.');\n return;\n }\n devLog(`\u2713 Check: Sync claim targets session keystone: ${sessionIdentityTjpAddr}`);\n\n // 2. Load Session Keystone (S) locally and get latest tip\n const latestSessionSAddr = await metaspace.getLatestAddr({\n addr: sessionIdentityTjpAddr,\n space\n });\n if (!latestSessionSAddr) {\n devLog('\u2717 Check: Latest Session Keystone (S) NOT found in local space.');\n return;\n }\n devLog(`\u2713 Check: Found latest session keystone (S) locally.`);\n\n const sRes = await metaspace.get({ addrs: [latestSessionSAddr], space });\n const sessionIdentity = sRes.ibGibs?.[0] as KeystoneIbGib_V1 | undefined;\n\n if (!sessionIdentity) {\n devLog('\u2717 Check: Failed to load latest Session Keystone (S).');\n return;\n }\n\n // Verify S contains connect and sync pools\n const sPools = sessionIdentity.data?.challengePools ?? [];\n const connectPool = sPools.find(p => p.id === POOL_ID_CONNECT);\n const syncPool = sPools.find(p => p.id === POOL_ID_SYNC);\n\n if (connectPool && syncPool) {\n devLog('\u2713 Check: S contains both connect and sync challenge pools.');\n } else {\n devLog(`\u2717 Check: S is missing challenge pools! (connect: ${!!connectPool}, sync: ${!!syncPool})`);\n return;\n }\n\n // Verify S was successfully evolved (depleted connect pool)\n const remainingChallenges = Object.keys(connectPool.challenges).length;\n if (remainingChallenges === 0) {\n devLog('\u2713 Check: S connect pool successfully depleted (0 challenges remaining).');\n } else {\n devLog(`\u2717 Check: S connect pool not depleted! (${remainingChallenges} challenges remaining)`);\n return;\n }\n\n // 3. Verify WebSocket Connection is open and active\n if (debugState.senderPeer && debugState.senderPeer.isSocketOpen) {\n devLog('\u2713 Check: WebSocket connection is active and OPEN.');\n } else {\n devLog('\u2717 Check: WebSocket connection is NOT open or peer is missing!');\n return;\n }\n\n devLog('\uD83C\uDF89 ALL PHASE 2B CONNECT CHECKS PASSED FLAWLESSLY! \u2713');\n btn.textContent = '\u2713 2B All Passed';\n\n const p3SetupBtn = document.getElementById('btn-3b-setup') as HTMLButtonElement | null;\n if (p3SetupBtn) { p3SetupBtn.disabled = false; }\n\n } catch (error) {\n devLog(`\u2717 2B Check FAILED: ${extractErrorMsg(error)}`);\n console.error(`${lc_fn} 2B Check error:`, error);\n }\n });\n}\n", "import { extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';\nimport { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';\nimport { KeystoneIbGib_V1 } from '@ibgib/core-gib/dist/keystone/keystone-types.mjs';\nimport { getGlobalMetaspace_waitIfNeeded } from \"@ibgib/web-gib/dist/helpers.mjs\";\nimport { graphsAreEquivalent } from '@ibgib/core-gib/dist/common/other/graph-helper.mjs';\nimport { SpaceGibApiBridge } from '../api/space-gib-api-bridge.mjs';\n\nimport { debugState, devLog, lc, performPhaseSetup, performPhaseSync } from './common.mjs';\n\nexport function init3bSetupButton(): void {\n const btn = document.getElementById('btn-3b-setup') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', () => {\n performPhaseSetup({\n phaseText: '3B',\n btnId: 'btn-3b-setup',\n nextBtnId: 'btn-3b-sync',\n masterSecret: 'test-sender-secret-phase3',\n syncSalt: 'senderidentitysyncsaltphase3',\n manageSalt: 'senderidentitymanagesaltphase3',\n ib: 'test data 3b',\n data: { hello: 'world3', random: Math.random() }\n });\n });\n}\n\nexport function init3bSyncButton(): void {\n const btn = document.getElementById('btn-3b-sync') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', () => {\n performPhaseSync({\n phaseText: '3B',\n btnId: 'btn-3b-sync',\n nextBtnId: 'btn-3b-check'\n });\n });\n}\n\nexport function init3bCheckButton(): void {\n const lc_fn = `${lc}[init3bCheckButton]`;\n const btn = document.getElementById('btn-3b-check') as HTMLButtonElement | null;\n if (!btn) { return; }\n\n btn.addEventListener('click', async () => {\n try {\n devLog('3B Check: Asserting cryptographic and WebSocket state expectations...');\n\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({});\n if (!space) { throw new Error(\"No default space.\"); }\n\n const domainI = debugState.domainI!;\n const targetX = debugState.targetX!;\n const xAddr = getIbGibAddr({ ibGib: targetX });\n const domainAddr = getIbGibAddr({ ibGib: domainI });\n\n // 1. Assert Target X exists locally (with evolved timeline) and get latest local graph\n const latestLocalXAddr = await metaspace.getLatestAddr({\n addr: xAddr,\n space\n });\n if (!latestLocalXAddr) {\n devLog('\u2717 Check: Evolved target X NOT found in local space!');\n return;\n }\n devLog(`\u2713 Check: Evolved target X found locally at: ${latestLocalXAddr}`);\n\n const localXGraph = await metaspace.getDependencyGraph({\n ibGibAddr: latestLocalXAddr,\n space\n });\n if (!localXGraph || Object.keys(localXGraph).length === 0) {\n devLog('\u2717 Check: Failed to load target X dependency graph locally.');\n return;\n }\n devLog(`\u2713 Check: Target X local graph loaded (${Object.keys(localXGraph).length} nodes).`);\n\n // 2. Fetch server's Target X graph via API bridge\n const apiBridge = new SpaceGibApiBridge();\n const serverGetRes = await apiBridge.getIbGibGraph(domainAddr, xAddr, true);\n if (!serverGetRes.success || !serverGetRes.graph) {\n devLog(`\u2717 Check: Failed to fetch target X graph from server: ${serverGetRes.message}`);\n return;\n }\n const serverXGraph = serverGetRes.graph;\n devLog(`\u2713 Check: Target X server graph loaded (${Object.keys(serverXGraph).length} nodes).`);\n\n // 3. Verify graphs are equivalent using graphsAreEquivalent\n const equal = graphsAreEquivalent({ graphA: localXGraph, graphB: serverXGraph });\n if (equal) {\n devLog('\u2713 Check: Target X dependency graphs are equivalent on client and server.');\n } else {\n devLog('\u2717 Check: Target X dependency graphs mismatch between client and server!');\n return;\n }\n\n // 4. Assert evolved sender identity I1 exists locally and on server\n const latestLocalIAddr = await metaspace.getLatestAddr({\n addr: domainAddr,\n space\n });\n if (!latestLocalIAddr) {\n devLog('\u2717 Check: Evolved domain keystone tip I1 NOT found in local space!');\n return;\n }\n devLog(`\u2713 Check: Evolved Domain Keystone (I1) exists locally.`);\n\n const getRes = await metaspace.get({ addrs: [latestLocalIAddr], space });\n const localI = getRes.ibGibs?.[0] as KeystoneIbGib_V1 | undefined;\n if (!localI) {\n devLog('\u2717 Check: Failed to load I1 from local space.');\n return;\n }\n\n const syncProof = localI.data?.proofs?.find(p => p.claim?.verb === 'sync');\n const sessionIdentityTjpAddr = syncProof?.claim?.target;\n if (!sessionIdentityTjpAddr) {\n devLog('\u2717 Check: I1 sync claim does not target a session keystone.');\n return;\n }\n\n const serverIGetRes = await apiBridge.getIbGib(domainAddr, latestLocalIAddr);\n if (!serverIGetRes.success || !serverIGetRes.ibGib) {\n devLog(`\u2717 Check: Evolved Domain Keystone (I1) NOT found on server!`);\n return;\n }\n devLog(`\u2713 Check: Evolved Domain Keystone (I1) exists on server.`);\n\n // 5. Assert session identity S tip exists locally and on server\n const latestLocalSAddr = await metaspace.getLatestAddr({\n addr: sessionIdentityTjpAddr,\n space\n });\n if (!latestLocalSAddr) {\n devLog('\u2717 Check: Latest Session Keystone (S) NOT found in local space.');\n return;\n }\n devLog(`\u2713 Check: Found latest session keystone (S) locally: ${latestLocalSAddr}`);\n\n const localSRes = await metaspace.get({ addrs: [latestLocalSAddr], space });\n const sessionS = localSRes.ibGibs?.[0] as KeystoneIbGib_V1 | undefined;\n if (!sessionS) {\n devLog('\u2717 Check: Failed to load latest Session Keystone (S) locally.');\n return;\n }\n\n // Verify S evolved to correct n (n === 3 or 4)\n const n = sessionS.data?.n;\n devLog(`\u2713 Check: S tip evolved to n = ${n}.`);\n if (n !== 3 && n !== 4) {\n devLog(`\u26A0 Check: Expected S to evolve to n = 3 or 4, got n = ${n}. Continuing anyway...`);\n }\n\n const serverSGetRes = await apiBridge.getIbGib(domainAddr, latestLocalSAddr);\n if (!serverSGetRes.success || !serverSGetRes.ibGib) {\n devLog(`\u2717 Check: Latest Session Keystone (S) NOT found on server!`);\n return;\n }\n devLog(`\u2713 Check: Latest Session Keystone (S) exists on server.`);\n\n // 6. Assert S graph is identical on client and server\n const localSGraph = await metaspace.getDependencyGraph({\n ibGibAddr: latestLocalSAddr,\n space\n });\n const serverSGetGraphRes = await apiBridge.getIbGibGraph(domainAddr, sessionIdentityTjpAddr, true);\n if (!serverSGetGraphRes.success || !serverSGetGraphRes.graph) {\n devLog(`\u2717 Check: Failed to fetch session S graph from server: ${serverSGetGraphRes.message}`);\n return;\n }\n const serverSGraph = serverSGetGraphRes.graph;\n\n const sGraphsEqual = graphsAreEquivalent({ graphA: localSGraph, graphB: serverSGraph });\n if (sGraphsEqual) {\n devLog('\u2713 Check: Session Keystone (S) dependency graphs are equivalent on client and server.');\n } else {\n devLog('\u2717 Check: Session Keystone (S) dependency graphs mismatch between client and server!');\n return;\n }\n\n devLog('\uD83C\uDF89 ALL PHASE 3B TRANSACTION SYNC CHECKS PASSED FLAWLESSLY! \u2713');\n btn.textContent = '\u2713 3B All Passed';\n\n } catch (error) {\n devLog(`\u2717 3B Check FAILED: ${extractErrorMsg(error)}`);\n console.error(`${lc_fn} 3B Check error:`, error);\n }\n });\n}\n", "import { extractErrorMsg, getUUID, getTimestamp } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';\nimport { Factory_V1 as factory } from '@ibgib/ts-gib/dist/V1/factory.mjs';\nimport { ROOT } from '@ibgib/ts-gib/dist/V1/constants.mjs';\nimport { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';\nimport { KeystoneIbGib_V1 } from '@ibgib/core-gib/dist/keystone/keystone-types.mjs';\nimport { KeystoneService_V1 } from '@ibgib/core-gib/dist/keystone/keystone-service-v1.mjs';\nimport { getGlobalMetaspace_waitIfNeeded } from \"@ibgib/web-gib/dist/helpers.mjs\";\nimport { mut8Timeline } from '@ibgib/core-gib/dist/timeline/timeline-api.mjs';\nimport { graphsAreEquivalent } from '@ibgib/core-gib/dist/common/other/graph-helper.mjs';\nimport { SyncPeerWebSocketSender_V1 } from '@ibgib/core-gib/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.mjs';\nimport { SyncSagaCoordinator } from '@ibgib/core-gib/dist/sync/sync-saga-coordinator.mjs';\nimport { SyncConflictStrategy } from '@ibgib/core-gib/dist/sync/sync-constants.mjs';\nimport { SESSION_KEYSTONE_POLICY, getSpaceGibPoolConfig } from \"../../common/keystone-policies.mjs\";\nimport { SpaceGibApiBridge } from '../api/space-gib-api-bridge.mjs';\n\nimport { debugState, devLog, lc, performPhaseSetup, performPhaseSync, getDelegateAndSessionInfo } from './common.mjs';\n\nexport function init4_1bSetupButton(): void {\n const btn = document.getElementById('btn-4-1b-setup') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', () => {\n performPhaseSetup({\n phaseText: '4.1B',\n btnId: 'btn-4-1b-setup',\n nextBtnId: 'btn-4-1b-sync',\n masterSecret: 'test-sender-secret-phase4-1',\n syncSalt: 'senderidentitysyncsaltphase4-1',\n manageSalt: 'senderidentitymanagesaltphase4-1',\n ib: 'test data 4.1b',\n data: { hello: 'world4_1', random: Math.random() }\n });\n });\n}\n\nexport function init4_1bSyncButton(): void {\n const btn = document.getElementById('btn-4-1b-sync') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', () => {\n performPhaseSync({\n phaseText: '4.1B',\n btnId: 'btn-4-1b-sync',\n nextBtnId: 'btn-4-1b-check'\n });\n });\n}\n\nexport function init4_1bCheckButton(): void {\n const lc_fn = `${lc}[init4_1bCheckButton]`;\n const btn = document.getElementById('btn-4-1b-check') as HTMLButtonElement | null;\n if (!btn) { return; }\n\n btn.addEventListener('click', async () => {\n try {\n devLog('4.1B Check: Asserting cryptographic and WebSocket state expectations...');\n\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({});\n if (!space) { throw new Error(\"No default space.\"); }\n\n const domainI = debugState.domainI!;\n const targetX = debugState.targetX!;\n const xAddr = getIbGibAddr({ ibGib: targetX });\n const domainAddr = getIbGibAddr({ ibGib: domainI });\n\n // 1. Assert Target X exists locally (with evolved timeline) and get latest local graph\n const latestLocalXAddr = await metaspace.getLatestAddr({\n addr: xAddr,\n space\n });\n if (!latestLocalXAddr) {\n devLog('\u2717 Check: Evolved target X NOT found in local space!');\n return;\n }\n devLog(`\u2713 Check: Evolved target X found locally at: ${latestLocalXAddr}`);\n\n const localXGraph = await metaspace.getDependencyGraph({\n ibGibAddr: latestLocalXAddr,\n space\n });\n if (!localXGraph || Object.keys(localXGraph).length === 0) {\n devLog('\u2717 Check: Failed to load target X dependency graph locally.');\n return;\n }\n devLog(`\u2713 Check: Target X local graph loaded (${Object.keys(localXGraph).length} nodes).`);\n\n // 2. Fetch server's Target X graph via API bridge\n const apiBridge = new SpaceGibApiBridge();\n const serverGetRes = await apiBridge.getIbGibGraph(domainAddr, xAddr, true);\n if (!serverGetRes.success || !serverGetRes.graph) {\n devLog(`\u2717 Check: Failed to fetch target X graph from server: ${serverGetRes.message}`);\n return;\n }\n const serverXGraph = serverGetRes.graph;\n devLog(`\u2713 Check: Target X server graph loaded (${Object.keys(serverXGraph).length} nodes).`);\n\n // 3. Verify graphs are equivalent using graphsAreEquivalent\n const equal = graphsAreEquivalent({ graphA: localXGraph, graphB: serverXGraph });\n if (equal) {\n devLog('\u2713 Check: Target X dependency graphs are equivalent on client and server.');\n } else {\n devLog('\u2717 Check: Target X dependency graphs mismatch between client and server!');\n return;\n }\n\n // 4. Assert evolved sender identity I1 exists locally and on server\n const latestLocalIAddr = await metaspace.getLatestAddr({\n addr: domainAddr,\n space\n });\n if (!latestLocalIAddr) {\n devLog('\u2717 Check: Evolved domain keystone tip I1 NOT found in local space!');\n return;\n }\n devLog(`\u2713 Check: Evolved Domain Keystone (I1) exists locally.`);\n\n const getRes = await metaspace.get({ addrs: [latestLocalIAddr], space });\n const localI = getRes.ibGibs?.[0] as KeystoneIbGib_V1 | undefined;\n if (!localI) {\n devLog('\u2717 Check: Failed to load I1 from local space.');\n return;\n }\n\n const {\n latestLocalDelegateAddr,\n sessionIdentityTjpAddr\n } = await getDelegateAndSessionInfo({ localI, metaspace, space });\n\n if (!latestLocalDelegateAddr) {\n devLog('\u2717 Check: Evolved delegate keystone tip NOT found in local space!');\n return;\n }\n if (!sessionIdentityTjpAddr) {\n devLog('\u2717 Check: Delegate sync claim does not target a session keystone.');\n return;\n }\n devLog(`\u2713 Check: Delegate Keystone and Sync Claim to Session verified locally.`);\n\n const serverDelGetRes = await apiBridge.getIbGib(domainAddr, latestLocalDelegateAddr);\n if (!serverDelGetRes.success || !serverDelGetRes.ibGib) {\n devLog(`\u2717 Check: Evolved Delegate Keystone NOT found on server!`);\n return;\n }\n devLog(`\u2713 Check: Evolved Delegate Keystone exists on server.`);\n\n const serverIGetRes = await apiBridge.getIbGib(domainAddr, latestLocalIAddr);\n if (!serverIGetRes.success || !serverIGetRes.ibGib) {\n devLog(`\u2717 Check: Evolved Domain Keystone (I1) NOT found on server!`);\n return;\n }\n devLog(`\u2713 Check: Evolved Domain Keystone (I1) exists on server.`);\n\n // 5. Assert session identity S tip exists locally and on server\n const latestLocalSAddr = await metaspace.getLatestAddr({\n addr: sessionIdentityTjpAddr,\n space\n });\n if (!latestLocalSAddr) {\n devLog('\u2717 Check: Latest Session Keystone (S) NOT found in local space.');\n return;\n }\n devLog(`\u2713 Check: Found latest session keystone (S) locally: ${latestLocalSAddr}`);\n\n const localSRes = await metaspace.get({ addrs: [latestLocalSAddr], space });\n const sessionS = localSRes.ibGibs?.[0] as KeystoneIbGib_V1 | undefined;\n if (!sessionS) {\n devLog('\u2717 Check: Failed to load latest Session Keystone (S) locally.');\n return;\n }\n\n // Verify S evolved to correct n (n === 3 or 4)\n const n = sessionS.data?.n;\n devLog(`\u2713 Check: S tip evolved to n = ${n}.`);\n if (n !== 3 && n !== 4) {\n devLog(`\u26A0 Check: Expected S to evolve to n = 3 or 4, got n = ${n}. Continuing anyway...`);\n }\n\n const serverSGetRes = await apiBridge.getIbGib(domainAddr, latestLocalSAddr);\n if (!serverSGetRes.success || !serverSGetRes.ibGib) {\n devLog(`\u2717 Check: Latest Session Keystone (S) NOT found on server!`);\n return;\n }\n devLog(`\u2713 Check: Latest Session Keystone (S) exists on server.`);\n\n // 6. Assert S graph is identical on client and server\n const localSGraph = await metaspace.getDependencyGraph({\n ibGibAddr: latestLocalSAddr,\n space\n });\n const serverSGetGraphRes = await apiBridge.getIbGibGraph(domainAddr, sessionIdentityTjpAddr, true);\n if (!serverSGetGraphRes.success || !serverSGetGraphRes.graph) {\n devLog(`\u2717 Check: Failed to fetch session S graph from server: ${serverSGetGraphRes.message}`);\n return;\n }\n const serverSGraph = serverSGetGraphRes.graph;\n\n const sGraphsEqual = graphsAreEquivalent({ graphA: localSGraph, graphB: serverSGraph });\n if (sGraphsEqual) {\n devLog('\u2713 Check: Session Keystone (S) dependency graphs are equivalent on client and server.');\n } else {\n devLog('\u2717 Check: Session Keystone (S) dependency graphs mismatch between client and server!');\n return;\n }\n\n devLog('\uD83C\uDF89 ALL PHASE 4.1B TRANSACTION SYNC CHECKS PASSED FLAWLESSLY! \u2713');\n btn.textContent = '\u2713 4.1B All Passed';\n\n } catch (error) {\n devLog(`\u2717 4.1B Check FAILED: ${extractErrorMsg(error)}`);\n console.error(`${lc_fn} 4.1B Check error:`, error);\n }\n });\n}\n", "import { extractErrorMsg, getUUID } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';\nimport { Factory_V1 as factory } from '@ibgib/ts-gib/dist/V1/factory.mjs';\nimport { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';\nimport { KeystoneIbGib_V1 } from '@ibgib/core-gib/dist/keystone/keystone-types.mjs';\nimport { graphsAreEquivalent } from '@ibgib/core-gib/dist/common/other/graph-helper.mjs';\nimport { getGlobalMetaspace_waitIfNeeded } from \"@ibgib/web-gib/dist/helpers.mjs\";\nimport { SpaceGibApiBridge } from '../api/space-gib-api-bridge.mjs';\n\nimport {\n debugState, devLog, lc, performPhaseSetup,\n runSyncPass, verifyIdentitiesOnServer\n} from './common.mjs';\n\nexport function init4_2bSetupButton(): void {\n const btn = document.getElementById('btn-4-2b-setup') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', () => {\n performPhaseSetup({\n phaseText: '4.2B',\n btnId: 'btn-4-2b-setup',\n nextBtnId: 'btn-4-2b-sync',\n masterSecret: 'test-sender-secret-phase4-2',\n syncSalt: 'senderidentitysyncsaltphase4-2',\n manageSalt: 'senderidentitymanagesaltphase4-2',\n ib: 'dummy target 4.2b',\n data: { hello: 'dummy' }\n });\n });\n}\n\nasync function performPhaseSync4_2b(): Promise<void> {\n const lc_fn = `${lc}[performPhaseSync4_2b]`;\n const btn = document.getElementById('btn-4-2b-sync') as HTMLButtonElement | null;\n if (!btn) { return; }\n\n try {\n btn.disabled = true;\n devLog(`4.2B Sync: Creating Constants and executing three-pass WebSocket Sync...`);\n\n if (!debugState.domainI) {\n devLog(`\u26A0 4.2B Sync: Missing setup state. Please run Setup first.`);\n btn.disabled = false;\n return;\n }\n\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({});\n if (!space) { throw new Error(\"No default space.\"); }\n\n // 1. Create Constant C1 locally\n const c1 = await factory.constant({\n parentPrimitiveIb: 'root',\n ib: 'constant_c1_' + (await getUUID()).slice(0, 8),\n data: { some: 'data_4_2b', random: Math.random() },\n });\n const addrC1 = getIbGibAddr({ ibGib: c1 });\n await metaspace.put({ ibGib: c1, space });\n await metaspace.registerNewIbGib({ ibGib: c1 });\n debugState.targetC1 = c1;\n devLog(`4.2B Sync: \u2713 Constant C1 created: ${addrC1}`);\n\n // --- Sync 1: C1 First Pass ---\n devLog(`4.2B Sync: Starting Pass 1 (Sync C1)...`);\n await runSyncPass({ domainIbGibs: [c1], passLabel: 'Pass 1 (Sync C1)', metaspace, space });\n devLog(`4.2B Sync: \u2713 Pass 1 Complete.`);\n\n // --- Sync 2: C1 Second Pass (Idempotent check) ---\n devLog(`4.2B Sync: Starting Pass 2 (Sync C1 - Idempotent)...`);\n await runSyncPass({ domainIbGibs: [c1], passLabel: 'Pass 2 (Sync C1 idempotent)', metaspace, space });\n devLog(`4.2B Sync: \u2713 Pass 2 Complete.`);\n\n // 2. Create Constant C2 locally linking to C1\n const c2 = await factory.constant({\n ib: 'constant_c2_' + (await getUUID()).slice(0, 8),\n parentPrimitiveIb: 'root',\n rel8ns: { link: [addrC1] },\n });\n const addrC2 = getIbGibAddr({ ibGib: c2 });\n await metaspace.put({ ibGib: c2, space });\n await metaspace.registerNewIbGib({ ibGib: c2 });\n debugState.targetC2 = c2;\n devLog(`4.2B Sync: \u2713 Constant C2 created linking to C1: ${addrC2}`);\n\n // --- Sync 3: C2 Pass ---\n devLog(`4.2B Sync: Starting Pass 3 (Sync C2)...`);\n await runSyncPass({ domainIbGibs: [c2], passLabel: 'Pass 3 (Sync C2)', metaspace, space });\n devLog(`4.2B Sync: \u2713 Pass 3 Complete.`);\n\n devLog(`\u2713 4.2B Sync Sequence Complete! Ready for State Checks.`);\n btn.textContent = `\u2713 4.2B Sync Run`;\n\n const checkBtn = document.getElementById('btn-4-2b-check') as HTMLButtonElement | null;\n if (checkBtn) { checkBtn.disabled = false; }\n\n } catch (error) {\n devLog(`\u2717 4.2B Sync FAILED: ${extractErrorMsg(error)}`);\n console.error(`${lc_fn} 4.2B Sync error:`, error);\n btn.disabled = false;\n }\n}\n\nexport function init4_2bSyncButton(): void {\n const btn = document.getElementById('btn-4-2b-sync') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', () => { performPhaseSync4_2b(); });\n}\n\nexport function init4_2bCheckButton(): void {\n const lc_fn = `${lc}[init4_2bCheckButton]`;\n const btn = document.getElementById('btn-4-2b-check') as HTMLButtonElement | null;\n if (!btn) { return; }\n\n btn.addEventListener('click', async () => {\n try {\n devLog('4.2B Check: Asserting cryptographic and WebSocket state expectations...');\n\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({});\n if (!space) { throw new Error(\"No default space.\"); }\n\n const domainI = debugState.domainI!;\n const targetC1 = debugState.targetC1!;\n const targetC2 = debugState.targetC2!;\n const c1Addr = getIbGibAddr({ ibGib: targetC1 });\n const c2Addr = getIbGibAddr({ ibGib: targetC2 });\n const domainAddr = getIbGibAddr({ ibGib: domainI });\n const apiBridge = new SpaceGibApiBridge();\n\n // 1. Verify C1 and C2 exist locally\n const localC1Res = await metaspace.get({ addrs: [c1Addr], space });\n const localC2Res = await metaspace.get({ addrs: [c2Addr], space });\n if (!localC1Res.success || !localC1Res.ibGibs?.[0]) {\n devLog('\u2717 Check: Constant C1 NOT found locally.'); return;\n }\n if (!localC2Res.success || !localC2Res.ibGibs?.[0]) {\n devLog('\u2717 Check: Constant C2 NOT found locally.'); return;\n }\n devLog(`\u2713 Check: Constants C1 and C2 exist locally.`);\n\n // 2. Verify C1 and C2 on server, C2 dependency graph matches\n const serverC1Res = await apiBridge.getIbGib(domainAddr, c1Addr);\n const serverC2Res = await apiBridge.getIbGib(domainAddr, c2Addr);\n if (!serverC1Res.success || !serverC1Res.ibGib) {\n devLog(`\u2717 Check: Constant C1 NOT found on server: ${serverC1Res.message}`); return;\n }\n if (!serverC2Res.success || !serverC2Res.ibGib) {\n devLog(`\u2717 Check: Constant C2 NOT found on server: ${serverC2Res.message}`); return;\n }\n devLog(`\u2713 Check: Constants C1 and C2 exist on server.`);\n\n const localC2Graph = await metaspace.getDependencyGraph({ ibGibAddr: c2Addr, space });\n const serverC2GetGraphRes = await apiBridge.getIbGibGraph(domainAddr, c2Addr, true);\n if (!serverC2GetGraphRes.success || !serverC2GetGraphRes.graph) {\n devLog(`\u2717 Check: Failed to fetch C2 graph from server: ${serverC2GetGraphRes.message}`); return;\n }\n if (!graphsAreEquivalent({ graphA: localC2Graph, graphB: serverC2GetGraphRes.graph })) {\n devLog('\u2717 Check: C2 dependency graphs mismatch between client and server!'); return;\n }\n devLog('\u2713 Check: C2 dependency graphs are equivalent on client and server.');\n\n // 3. Verify domain keystone n=1, then verify domain/delegate/session on server.\n // I only evolves once (delegate registration during setup).\n // The delegate is the sync sender and evolves during sync passes, not I.\n const latestLocalIAddr = await metaspace.getLatestAddr({ addr: domainAddr, space });\n if (!latestLocalIAddr) { devLog('\u2717 Check: Domain keystone tip not found locally!'); return; }\n const localIRes = await metaspace.get({ addrs: [latestLocalIAddr], space });\n const localI = localIRes.ibGibs?.[0] as KeystoneIbGib_V1 | undefined;\n if (!localI) { devLog('\u2717 Check: Failed to load domain keystone!'); return; }\n\n const nI = localI.data?.n;\n devLog(`\u2713 Check: Evolved I tip is at n = ${nI}.`);\n if (nI !== 1) {\n devLog(`\u2717 Check: Expected I to evolve to n = 1 (delegate registration only), got n = ${nI}.`); return;\n }\n\n const { sessionIdentityTjpAddr } = await verifyIdentitiesOnServer({\n localI, metaspace, space, apiBridge, domainAddr\n });\n\n // 4. Verify session keystone S n=3 and graph matches.\n // The session S from the final (3rd) pass goes through connect(n=1), sync(n=2), disconnect(n=3).\n const latestLocalSAddr = await metaspace.getLatestAddr({ addr: sessionIdentityTjpAddr, space });\n if (!latestLocalSAddr) {\n devLog('\u2717 Check: Latest Session Keystone (S) NOT found in local space.'); return;\n }\n devLog(`\u2713 Check: Found latest session keystone (S) locally: ${latestLocalSAddr}`);\n\n const localSRes = await metaspace.get({ addrs: [latestLocalSAddr], space });\n const sessionS = localSRes.ibGibs?.[0] as KeystoneIbGib_V1 | undefined;\n if (!sessionS) { devLog('\u2717 Check: Failed to load Session Keystone (S) locally.'); return; }\n\n const nS = sessionS.data?.n;\n devLog(`\u2713 Check: Latest session S tip evolved to n = ${nS}.`);\n if (nS !== 3) {\n devLog(`\u2717 Check: Expected latest session S to evolve to n = 3 (connect+sync+disconnect), got n = ${nS}.`); return;\n }\n\n const serverSGetRes = await apiBridge.getIbGib(domainAddr, latestLocalSAddr);\n if (!serverSGetRes.success || !serverSGetRes.ibGib) {\n devLog(`\u2717 Check: Latest Session Keystone (S) NOT found on server!`); return;\n }\n devLog(`\u2713 Check: Latest Session Keystone (S) exists on server.`);\n\n const localSGraph = await metaspace.getDependencyGraph({ ibGibAddr: latestLocalSAddr, space });\n const serverSGetGraphRes = await apiBridge.getIbGibGraph(domainAddr, sessionIdentityTjpAddr, true);\n if (!serverSGetGraphRes.success || !serverSGetGraphRes.graph) {\n devLog(`\u2717 Check: Failed to fetch session S graph from server: ${serverSGetGraphRes.message}`); return;\n }\n if (!graphsAreEquivalent({ graphA: localSGraph, graphB: serverSGetGraphRes.graph })) {\n devLog('\u2717 Check: Session Keystone (S) dependency graphs mismatch between client and server!'); return;\n }\n devLog('\u2713 Check: Session Keystone (S) dependency graphs are equivalent on client and server.');\n\n devLog('\uD83C\uDF89 ALL PHASE 4.2B TRANSACTION SYNC CHECKS PASSED FLAWLESSLY! \u2713');\n btn.textContent = '\u2713 4.2B All Passed';\n\n } catch (error) {\n devLog(`\u2717 4.2B Check FAILED: ${extractErrorMsg(error)}`);\n console.error(`${lc_fn} 4.2B Check error:`, error);\n }\n });\n}\n", "import { extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';\nimport { Factory_V1 as factory } from '@ibgib/ts-gib/dist/V1/factory.mjs';\nimport { ROOT } from '@ibgib/ts-gib/dist/V1/constants.mjs';\nimport { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';\nimport { KeystoneIbGib_V1 } from '@ibgib/core-gib/dist/keystone/keystone-types.mjs';\nimport { getGlobalMetaspace_waitIfNeeded } from \"@ibgib/web-gib/dist/helpers.mjs\";\nimport { mut8Timeline } from '@ibgib/core-gib/dist/timeline/timeline-api.mjs';\nimport { graphsAreEquivalent } from '@ibgib/core-gib/dist/common/other/graph-helper.mjs';\nimport { SpaceGibApiBridge } from '../api/space-gib-api-bridge.mjs';\n\nimport {\n debugState, devLog, lc,\n setupDomainAndDelegateIdentities, runSyncPass, verifyIdentitiesOnServer\n} from './common.mjs';\n\nexport function init4_3bSetupButton(): void {\n const btn = document.getElementById('btn-4-3b-setup') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', async () => {\n try {\n btn.disabled = true;\n devLog('4.3B Setup: Generating Domain Keystone (I) and Target timeline V0 -> V1...');\n\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({});\n if (!space) { throw new Error(\"No default space.\"); }\n\n const apiBridge = new SpaceGibApiBridge();\n\n // Create domain + delegate identities (DRY helper)\n await setupDomainAndDelegateIdentities({\n masterSecret: 'test-sender-secret-phase4-3',\n syncSalt: 'senderidentitysyncsaltphase4-3',\n manageSalt: 'senderidentitymanagesaltphase4-3',\n metaspace, space, apiBridge,\n phaseText: '4.3B'\n });\n\n // Create timeline V0 \u2192 V1\n const resV0 = await factory.firstGen({\n parentIbGib: ROOT,\n ib: 'timeline_root_partial_4_3b',\n data: { type: 'root', label: 'Root4_3b', random: Math.random() },\n dna: true,\n nCounter: true,\n tjp: { uuid: true, timestamp: true }\n });\n const r1_v0 = resV0.newIbGib;\n await metaspace.persistTransformResult({ resTransform: resV0, space });\n await metaspace.registerNewIbGib({ ibGib: r1_v0 });\n\n const r1_v1 = await mut8Timeline({\n timeline: r1_v0,\n mut8Opts: { dataToAddOrPatch: { type: 'comment', label: 'V1_4_3b' } },\n metaspace, space,\n });\n\n debugState.targetC1 = r1_v1;\n debugState.targetX = r1_v1;\n devLog(`4.3B Setup: \u2713 Timeline V0 -> V1 created and stored locally. V1: ${getIbGibAddr({ ibGib: r1_v1 })}`);\n\n devLog('\u2713 4.3B Setup Complete! Ready for 4.3B Sync.');\n btn.textContent = '\u2713 4.3B Setup Complete';\n\n const syncBtn = document.getElementById('btn-4-3b-sync') as HTMLButtonElement | null;\n if (syncBtn) { syncBtn.disabled = false; }\n\n } catch (error) {\n devLog(`\u2717 4.3B Setup FAILED: ${extractErrorMsg(error)}`);\n console.error(error);\n btn.disabled = false;\n }\n });\n}\n\nasync function performPhaseSync4_3b(): Promise<void> {\n const lc_fn = `${lc}[performPhaseSync4_3b]`;\n const btn = document.getElementById('btn-4-3b-sync') as HTMLButtonElement | null;\n if (!btn) { return; }\n\n try {\n btn.disabled = true;\n\n const targetV1 = debugState.targetX;\n if (!debugState.domainI || !targetV1) {\n devLog(`\u26A0 4.3B Sync: Missing setup state. Please run Setup first.`);\n btn.disabled = false;\n return;\n }\n\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({});\n if (!space) { throw new Error(\"No default space.\"); }\n\n // Pass 1: Sync V1\n devLog(`4.3B Sync: Starting Pass 1 (Sync V1 to server)...`);\n await runSyncPass({ domainIbGibs: [targetV1], passLabel: 'Pass 1 (Sync V1)', metaspace, space });\n devLog(`4.3B Sync: \u2713 Pass 1 Complete (V1 synced).`);\n\n // Mutate V1 \u2192 V2\n devLog(`4.3B Sync: Mutating V1 to V2 locally...`);\n const r1_v2 = await mut8Timeline({\n timeline: targetV1,\n mut8Opts: { dataToAddOrPatch: { type: 'comment', label: 'V2_4_3b' } },\n metaspace, space,\n });\n debugState.targetX = r1_v2;\n devLog(`4.3B Sync: \u2713 V2 created locally: ${getIbGibAddr({ ibGib: r1_v2 })}`);\n\n // Pass 2: Sync V2\n devLog(`4.3B Sync: Starting Pass 2 (Sync V2 delta to server)...`);\n await runSyncPass({ domainIbGibs: [r1_v2], passLabel: 'Pass 2 (Sync V2)', metaspace, space });\n devLog(`4.3B Sync: \u2713 Pass 2 Complete (V2 synced).`);\n\n devLog(`\u2713 4.3B Sync Sequence Complete! Ready for State Checks.`);\n btn.textContent = `\u2713 4.3B Sync Run`;\n\n const checkBtn = document.getElementById('btn-4-3b-check') as HTMLButtonElement | null;\n if (checkBtn) { checkBtn.disabled = false; }\n\n } catch (error) {\n devLog(`\u2717 4.3B Sync FAILED: ${extractErrorMsg(error)}`);\n console.error(error);\n btn.disabled = false;\n }\n}\n\nexport function init4_3bSyncButton(): void {\n const btn = document.getElementById('btn-4-3b-sync') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', () => { performPhaseSync4_3b(); });\n}\n\nexport function init4_3bCheckButton(): void {\n const lc_fn = `${lc}[init4_3bCheckButton]`;\n const btn = document.getElementById('btn-4-3b-check') as HTMLButtonElement | null;\n if (!btn) { return; }\n\n btn.addEventListener('click', async () => {\n try {\n devLog('4.3B Check: Asserting cryptographic and WebSocket state expectations...');\n\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({});\n if (!space) { throw new Error(\"No default space.\"); }\n\n const domainI = debugState.domainI!;\n const targetV1 = debugState.targetC1!;\n const targetV2 = debugState.targetX!;\n const v1Addr = getIbGibAddr({ ibGib: targetV1 });\n const v2Addr = getIbGibAddr({ ibGib: targetV2 });\n const domainAddr = getIbGibAddr({ ibGib: domainI });\n const apiBridge = new SpaceGibApiBridge();\n\n // 1. Verify V1 and V2 exist locally\n const localV1Res = await metaspace.get({ addrs: [v1Addr], space });\n const localV2Res = await metaspace.get({ addrs: [v2Addr], space });\n if (!localV1Res.success || !localV1Res.ibGibs?.[0]) {\n devLog('\u2717 Check: Timeline frame V1 NOT found locally.'); return;\n }\n if (!localV2Res.success || !localV2Res.ibGibs?.[0]) {\n devLog('\u2717 Check: Timeline frame V2 NOT found locally.'); return;\n }\n devLog(`\u2713 Check: Timeline frames V1 and V2 exist locally.`);\n\n // 2. Verify V2 on server with correct past ref and matching graph\n const serverV2Res = await apiBridge.getIbGib(domainAddr, v2Addr);\n if (!serverV2Res.success || !serverV2Res.ibGib) {\n devLog(`\u2717 Check: Timeline frame V2 NOT found on server: ${serverV2Res.message}`); return;\n }\n devLog(`\u2713 Check: Timeline frame V2 exists on server.`);\n\n const pastAddr = serverV2Res.ibGib.rel8ns?.past?.at(-1);\n if (pastAddr === v1Addr) {\n devLog('\u2713 Check: Server V2 correctly references V1 in its past relation.');\n } else {\n devLog(`\u2717 Check: Server V2 does not reference V1 in past relation! got: ${pastAddr}`); return;\n }\n\n const localV2Graph = await metaspace.getDependencyGraph({ ibGibAddr: v2Addr, space });\n const serverV2GetGraphRes = await apiBridge.getIbGibGraph(domainAddr, v2Addr, true);\n if (!serverV2GetGraphRes.success || !serverV2GetGraphRes.graph) {\n devLog(`\u2717 Check: Failed to fetch V2 graph from server: ${serverV2GetGraphRes.message}`); return;\n }\n if (!graphsAreEquivalent({ graphA: localV2Graph, graphB: serverV2GetGraphRes.graph })) {\n devLog('\u2717 Check: V2 timeline dependency graphs mismatch between client and server!'); return;\n }\n devLog('\u2713 Check: V2 timeline dependency graphs are equivalent on client and server.');\n\n // 3. Verify domain keystone n=1, then verify domain/delegate/session on server.\n // I only evolves once (delegate registration during setup).\n // The delegate is the sync sender and evolves during sync passes, not I.\n const latestLocalIAddr = await metaspace.getLatestAddr({ addr: domainAddr, space });\n if (!latestLocalIAddr) { devLog('\u2717 Check: Domain keystone tip not found locally!'); return; }\n const localIRes = await metaspace.get({ addrs: [latestLocalIAddr], space });\n const localI = localIRes.ibGibs?.[0] as KeystoneIbGib_V1 | undefined;\n if (!localI) { devLog('\u2717 Check: Failed to load domain keystone!'); return; }\n\n const nI = localI.data?.n;\n devLog(`\u2713 Check: Evolved I tip is at n = ${nI}.`);\n if (nI !== 1) {\n devLog(`\u2717 Check: Expected I to evolve to n = 1 (delegate registration only), got n = ${nI}.`); return;\n }\n\n const { sessionIdentityTjpAddr } = await verifyIdentitiesOnServer({\n localI, metaspace, space, apiBridge, domainAddr\n });\n\n // 4. Verify session keystone S n=3 and graph matches\n const latestLocalSAddr = await metaspace.getLatestAddr({ addr: sessionIdentityTjpAddr, space });\n if (!latestLocalSAddr) {\n devLog('\u2717 Check: Latest Session Keystone (S) NOT found in local space.'); return;\n }\n devLog(`\u2713 Check: Found latest session keystone (S) locally: ${latestLocalSAddr}`);\n\n const localSRes = await metaspace.get({ addrs: [latestLocalSAddr], space });\n const sessionS = localSRes.ibGibs?.[0] as KeystoneIbGib_V1 | undefined;\n if (!sessionS) { devLog('\u2717 Check: Failed to load Session Keystone (S) locally.'); return; }\n\n const nS = sessionS.data?.n;\n devLog(`\u2713 Check: Latest session S tip evolved to n = ${nS}.`);\n if (nS !== 3) {\n devLog(`\u2717 Check: Expected latest session S to evolve to n = 3, got n = ${nS}.`); return;\n }\n\n const serverSGetRes = await apiBridge.getIbGib(domainAddr, latestLocalSAddr);\n if (!serverSGetRes.success || !serverSGetRes.ibGib) {\n devLog(`\u2717 Check: Latest Session Keystone (S) NOT found on server!`); return;\n }\n devLog(`\u2713 Check: Latest Session Keystone (S) exists on server.`);\n\n const localSGraph = await metaspace.getDependencyGraph({ ibGibAddr: latestLocalSAddr, space });\n const serverSGetGraphRes = await apiBridge.getIbGibGraph(domainAddr, sessionIdentityTjpAddr, true);\n if (!serverSGetGraphRes.success || !serverSGetGraphRes.graph) {\n devLog(`\u2717 Check: Failed to fetch session S graph from server: ${serverSGetGraphRes.message}`); return;\n }\n if (!graphsAreEquivalent({ graphA: localSGraph, graphB: serverSGetGraphRes.graph })) {\n devLog('\u2717 Check: Session Keystone (S) dependency graphs mismatch between client and server!'); return;\n }\n devLog('\u2713 Check: Session Keystone (S) dependency graphs are equivalent on client and server.');\n\n devLog('\uD83C\uDF89 ALL PHASE 4.3B TRANSACTION SYNC CHECKS PASSED FLAWLESSLY! \u2713');\n btn.textContent = '\u2713 4.3B All Passed';\n\n } catch (error) {\n devLog(`\u2717 4.3B Check FAILED: ${extractErrorMsg(error)}`);\n console.error(`${lc_fn} 4.3B Check error:`, error);\n }\n });\n}\n", "import { extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';\nimport { Factory_V1 as factory } from '@ibgib/ts-gib/dist/V1/factory.mjs';\nimport { ROOT } from '@ibgib/ts-gib/dist/V1/constants.mjs';\nimport { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';\nimport { KeystoneIbGib_V1 } from '@ibgib/core-gib/dist/keystone/keystone-types.mjs';\nimport { getGlobalMetaspace_waitIfNeeded } from \"@ibgib/web-gib/dist/helpers.mjs\";\nimport { mut8Timeline } from '@ibgib/core-gib/dist/timeline/timeline-api.mjs';\nimport { graphsAreEquivalent } from '@ibgib/core-gib/dist/common/other/graph-helper.mjs';\nimport { SpaceGibApiBridge } from '../api/space-gib-api-bridge.mjs';\n\nimport {\n debugState, devLog, lc,\n setupDomainAndDelegateIdentities, runSyncPass, verifyIdentitiesOnServer\n} from './common.mjs';\n\nexport function init4_4bSetupButton(): void {\n const btn = document.getElementById('btn-4-4b-setup') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', async () => {\n try {\n btn.disabled = true;\n devLog('4.4B Setup: Generating Domain Keystone (I) and Target timeline V0 -> V1 -> V2...');\n\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({});\n if (!space) { throw new Error(\"No default space.\"); }\n\n const apiBridge = new SpaceGibApiBridge();\n\n // Create domain + delegate identities (DRY helper)\n await setupDomainAndDelegateIdentities({\n masterSecret: 'test-sender-secret-phase4-4',\n syncSalt: 'senderidentitysyncsaltphase4-4',\n manageSalt: 'senderidentitymanagesaltphase4-4',\n metaspace, space, apiBridge,\n phaseText: '4.4B'\n });\n\n // Create V0\n const resV0 = await factory.firstGen({\n parentIbGib: ROOT,\n ib: 'timeline_root_deep_4_4b',\n data: { type: 'root', label: 'Root4_4b', random: Math.random() },\n dna: true,\n nCounter: true,\n tjp: { uuid: true, timestamp: true }\n });\n const r1_v0 = resV0.newIbGib;\n await metaspace.persistTransformResult({ resTransform: resV0, space });\n await metaspace.registerNewIbGib({ ibGib: r1_v0 });\n debugState.targetC1 = r1_v0;\n\n // Create V1\n const r1_v1 = await mut8Timeline({\n timeline: r1_v0,\n mut8Opts: { dataToAddOrPatch: { type: 'comment', label: 'V1_4_4b' } },\n metaspace, space,\n });\n debugState.targetC2 = r1_v1;\n\n // Create V2\n const r1_v2 = await mut8Timeline({\n timeline: r1_v1,\n mut8Opts: { dataToAddOrPatch: { type: 'comment', label: 'V2_4_4b' } },\n metaspace, space,\n });\n debugState.targetX = r1_v2;\n\n devLog(`4.4B Setup: \u2713 Timeline V0 -> V1 -> V2 created locally. V2 Tip: ${getIbGibAddr({ ibGib: r1_v2 })}`);\n\n devLog('\u2713 4.4B Setup Complete! Ready for 4.4B Sync.');\n btn.textContent = '\u2713 4.4B Setup Complete';\n\n const syncBtn = document.getElementById('btn-4-4b-sync') as HTMLButtonElement | null;\n if (syncBtn) { syncBtn.disabled = false; }\n\n } catch (error) {\n devLog(`\u2717 4.4B Setup FAILED: ${extractErrorMsg(error)}`);\n console.error(error);\n btn.disabled = false;\n }\n });\n}\n\nasync function performPhaseSync4_4b(): Promise<void> {\n const lc_fn = `${lc}[performPhaseSync4_4b]`;\n const btn = document.getElementById('btn-4-4b-sync') as HTMLButtonElement | null;\n if (!btn) { return; }\n\n try {\n btn.disabled = true;\n devLog(`4.4B Sync: Initiating WebSocket Sync of V2 Tip...`);\n\n const targetV2 = debugState.targetX;\n if (!debugState.domainI || !targetV2) {\n devLog(`\u26A0 4.4B Sync: Missing setup state. Please run Setup first.`);\n btn.disabled = false;\n return;\n }\n\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({});\n if (!space) { throw new Error(\"No default space.\"); }\n\n await runSyncPass({ domainIbGibs: [targetV2], passLabel: 'Pass 1 (Sync V2 tip)', metaspace, space });\n devLog(`4.4B Sync: \u2713 WebSocket Sync completed.`);\n\n devLog(`\u2713 4.4B Sync Sequence Complete! Ready for State Checks.`);\n btn.textContent = `\u2713 4.4B Sync Run`;\n\n const checkBtn = document.getElementById('btn-4-4b-check') as HTMLButtonElement | null;\n if (checkBtn) { checkBtn.disabled = false; }\n\n } catch (error) {\n devLog(`\u2717 4.4B Sync FAILED: ${extractErrorMsg(error)}`);\n console.error(error);\n btn.disabled = false;\n }\n}\n\nexport function init4_4bSyncButton(): void {\n const btn = document.getElementById('btn-4-4b-sync') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', () => { performPhaseSync4_4b(); });\n}\n\nexport function init4_4bCheckButton(): void {\n const lc_fn = `${lc}[init4_4bCheckButton]`;\n const btn = document.getElementById('btn-4-4b-check') as HTMLButtonElement | null;\n if (!btn) { return; }\n\n btn.addEventListener('click', async () => {\n try {\n devLog('4.4B Check: Asserting cryptographic and WebSocket state expectations...');\n\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({});\n if (!space) { throw new Error(\"No default space.\"); }\n\n const domainI = debugState.domainI!;\n const targetV0 = debugState.targetC1!;\n const targetV1 = debugState.targetC2!;\n const targetV2 = debugState.targetX!;\n const v0Addr = getIbGibAddr({ ibGib: targetV0 });\n const v1Addr = getIbGibAddr({ ibGib: targetV1 });\n const v2Addr = getIbGibAddr({ ibGib: targetV2 });\n const domainAddr = getIbGibAddr({ ibGib: domainI });\n const apiBridge = new SpaceGibApiBridge();\n\n // 1. Verify V0, V1, V2 exist locally\n const localV0Res = await metaspace.get({ addrs: [v0Addr], space });\n const localV1Res = await metaspace.get({ addrs: [v1Addr], space });\n const localV2Res = await metaspace.get({ addrs: [v2Addr], space });\n if (!localV0Res.success || !localV0Res.ibGibs?.[0]) {\n devLog('\u2717 Check: Timeline frame V0 NOT found locally.'); return;\n }\n if (!localV1Res.success || !localV1Res.ibGibs?.[0]) {\n devLog('\u2717 Check: Timeline frame V1 NOT found locally.'); return;\n }\n if (!localV2Res.success || !localV2Res.ibGibs?.[0]) {\n devLog('\u2717 Check: Timeline frame V2 NOT found locally.'); return;\n }\n devLog(`\u2713 Check: Timeline frames V0, V1, and V2 exist locally.`);\n\n // 2. Verify V2, V1 exist on server with correct past refs, and V2 graph matches\n const serverV2Res = await apiBridge.getIbGib(domainAddr, v2Addr);\n if (!serverV2Res.success || !serverV2Res.ibGib) {\n devLog(`\u2717 Check: Timeline frame V2 NOT found on server: ${serverV2Res.message}`); return;\n }\n devLog(`\u2713 Check: Timeline frame V2 exists on server.`);\n\n const pastAddrV2 = serverV2Res.ibGib.rel8ns?.past?.at(-1);\n if (pastAddrV2 === v1Addr) {\n devLog('\u2713 Check: Server V2 correctly references V1 in its past relation.');\n } else {\n devLog(`\u2717 Check: Server V2 does not reference V1 in past relation! got: ${pastAddrV2}`); return;\n }\n\n const serverV1Res = await apiBridge.getIbGib(domainAddr, v1Addr);\n if (!serverV1Res.success || !serverV1Res.ibGib) {\n devLog(`\u2717 Check: Timeline frame V1 NOT found on server: ${serverV1Res.message}`); return;\n }\n devLog(`\u2713 Check: Timeline frame V1 exists on server.`);\n\n const pastAddrV1 = serverV1Res.ibGib.rel8ns?.past?.at(-1);\n if (pastAddrV1 === v0Addr) {\n devLog('\u2713 Check: Server V1 correctly references V0 in its past relation.');\n } else {\n devLog(`\u2717 Check: Server V1 does not reference V0 in past relation! got: ${pastAddrV1}`); return;\n }\n\n const localV2Graph = await metaspace.getDependencyGraph({ ibGibAddr: v2Addr, space });\n const serverV2GetGraphRes = await apiBridge.getIbGibGraph(domainAddr, v2Addr, true);\n if (!serverV2GetGraphRes.success || !serverV2GetGraphRes.graph) {\n devLog(`\u2717 Check: Failed to fetch V2 graph from server: ${serverV2GetGraphRes.message}`); return;\n }\n if (!graphsAreEquivalent({ graphA: localV2Graph, graphB: serverV2GetGraphRes.graph })) {\n devLog('\u2717 Check: V2 timeline dependency graphs mismatch between client and server!'); return;\n }\n devLog('\u2713 Check: V2 timeline dependency graphs are equivalent on client and server.');\n\n // 3. Verify domain keystone n=1, then verify domain/delegate/session on server\n const latestLocalIAddr = await metaspace.getLatestAddr({ addr: domainAddr, space });\n if (!latestLocalIAddr) { devLog('\u2717 Check: Domain keystone tip not found locally!'); return; }\n const localIRes = await metaspace.get({ addrs: [latestLocalIAddr], space });\n const localI = localIRes.ibGibs?.[0] as KeystoneIbGib_V1 | undefined;\n if (!localI) { devLog('\u2717 Check: Failed to load domain keystone!'); return; }\n devLog(`\u2713 Check: Evolved Domain Keystone exists locally: ${latestLocalIAddr}`);\n\n const nI = localI.data?.n;\n devLog(`\u2713 Check: Evolved I tip is at n = ${nI}.`);\n if (nI !== 1) {\n devLog(`\u2717 Check: Expected I to evolve to n = 1, got n = ${nI}.`); return;\n }\n\n const { sessionIdentityTjpAddr } = await verifyIdentitiesOnServer({\n localI, metaspace, space, apiBridge, domainAddr\n });\n\n // 4. Verify session keystone S n=3 and graph matches\n const latestLocalSAddr = await metaspace.getLatestAddr({ addr: sessionIdentityTjpAddr, space });\n if (!latestLocalSAddr) {\n devLog('\u2717 Check: Latest Session Keystone (S) NOT found in local space.'); return;\n }\n devLog(`\u2713 Check: Found latest session keystone (S) locally: ${latestLocalSAddr}`);\n\n const localSRes = await metaspace.get({ addrs: [latestLocalSAddr], space });\n const sessionS = localSRes.ibGibs?.[0] as KeystoneIbGib_V1 | undefined;\n if (!sessionS) { devLog('\u2717 Check: Failed to load Session Keystone (S) locally.'); return; }\n\n const nS = sessionS.data?.n;\n devLog(`\u2713 Check: Latest session S tip evolved to n = ${nS}.`);\n if (nS !== 3) {\n devLog(`\u2717 Check: Expected latest session S to evolve to n = 3, got n = ${nS}.`); return;\n }\n\n const serverSGetRes = await apiBridge.getIbGib(domainAddr, latestLocalSAddr);\n if (!serverSGetRes.success || !serverSGetRes.ibGib) {\n devLog(`\u2717 Check: Latest Session Keystone (S) NOT found on server!`); return;\n }\n devLog(`\u2713 Check: Latest Session Keystone (S) exists on server.`);\n\n const localSGraph = await metaspace.getDependencyGraph({ ibGibAddr: latestLocalSAddr, space });\n const serverSGetGraphRes = await apiBridge.getIbGibGraph(domainAddr, sessionIdentityTjpAddr, true);\n if (!serverSGetGraphRes.success || !serverSGetGraphRes.graph) {\n devLog(`\u2717 Check: Failed to fetch session S graph from server: ${serverSGetGraphRes.message}`); return;\n }\n if (!graphsAreEquivalent({ graphA: localSGraph, graphB: serverSGetGraphRes.graph })) {\n devLog('\u2717 Check: Session Keystone (S) dependency graphs mismatch between client and server!'); return;\n }\n devLog('\u2713 Check: Session Keystone (S) dependency graphs are equivalent on client and server.');\n\n devLog('\uD83C\uDF89 ALL PHASE 4.4B TRANSACTION SYNC CHECKS PASSED FLAWLESSLY! \u2713');\n btn.textContent = '\u2713 4.4B All Passed';\n\n } catch (error) {\n devLog(`\u2717 4.4B Check FAILED: ${extractErrorMsg(error)}`);\n console.error(`${lc_fn} 4.4B Check error:`, error);\n }\n });\n}\n", "import { extractErrorMsg, getUUID } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';\nimport { Factory_V1 as factory } from '@ibgib/ts-gib/dist/V1/factory.mjs';\nimport { ROOT } from '@ibgib/ts-gib/dist/V1/constants.mjs';\nimport { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';\nimport { KeystoneIbGib_V1 } from '@ibgib/core-gib/dist/keystone/keystone-types.mjs';\nimport { getGlobalMetaspace_waitIfNeeded } from \"@ibgib/web-gib/dist/helpers.mjs\";\nimport { mut8Timeline } from '@ibgib/core-gib/dist/timeline/timeline-api.mjs';\nimport { graphsAreEquivalent } from '@ibgib/core-gib/dist/common/other/graph-helper.mjs';\nimport { SpaceGibApiBridge } from '../api/space-gib-api-bridge.mjs';\n\nimport {\n debugState, devLog, lc,\n setupDomainAndDelegateIdentities, runSyncPass, runSyncPassFromSpace, copyIdentitiesToSpace\n} from './common.mjs';\n\n// Phase-specific state for items that don't fit in debugState\ninterface Phase45State {\n targetV2?: any;\n}\nconst state: Phase45State = {};\n\nconst MASTER_SECRET = 'test-sender-secret-phase4-5b';\n\nexport function init4_5bSetupButton(): void {\n const btn = document.getElementById('btn-4-5b-setup') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', async () => {\n try {\n btn.disabled = true;\n devLog('4.5B Setup: Generating Domain Keystone (I), target timeline, and seeding server from two spaces...');\n\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({});\n if (!space) { throw new Error(\"No default space.\"); }\n\n const apiBridge = new SpaceGibApiBridge();\n\n // 1. Create domain + delegate identities (DRY helper)\n await setupDomainAndDelegateIdentities({\n masterSecret: MASTER_SECRET,\n syncSalt: 'senderidentitysyncsaltphase4-5b',\n manageSalt: 'senderidentitymanagesaltphase4-5b',\n metaspace, space, apiBridge,\n phaseText: '4.5B'\n });\n\n // 2. Create target timeline root V0\n const resV0 = await factory.firstGen({\n parentIbGib: ROOT,\n ib: 'timeline_root_partial_4_5b',\n data: { type: 'root', label: 'Root4_5b', random: Math.random() },\n dna: true, nCounter: true, tjp: { uuid: true, timestamp: true }\n });\n const r1_v0 = resV0.newIbGib;\n await metaspace.persistTransformResult({ resTransform: resV0, space });\n await metaspace.registerNewIbGib({ ibGib: r1_v0, space });\n\n // 3. Mutate V0 \u2192 V1 in default space\n const r1_v1 = await mut8Timeline({\n timeline: r1_v0,\n mut8Opts: { dataToAddOrPatch: { type: 'comment', label: 'V1_4_5b' } },\n metaspace, space,\n });\n debugState.targetC1 = r1_v1;\n devLog(`4.5B Setup: \u2713 Local timeline V0 -> V1 created. V1 Tip: ${getIbGibAddr({ ibGib: r1_v1 })}`);\n\n // 4. Sync V1 to server from default space (Pass 1 \u2014 seeds V1 on the server)\n devLog('4.5B Setup: Seeding V1 to the server via WebSocket...');\n await runSyncPass({ domainIbGibs: [r1_v1], passLabel: 'Seed V1 to server', metaspace, space });\n devLog('4.5B Setup: \u2713 Pass 1 Sync (V1 to server) complete.');\n\n // 5. Create remoteSpace (simulating a remote client)\n devLog('4.5B Setup: Creating secondary local space simulating \"remote\" client...');\n const remoteSpaceName = `remote-${await getUUID()}`;\n const remoteSpace = await metaspace.createNewLocalSpace({\n opts: {\n allowCancel: false,\n spaceName: remoteSpaceName,\n getFnPrompt: metaspace.getFnPrompt!,\n }\n });\n if (!remoteSpace) { throw new Error(\"Failed to create remote space\"); }\n await remoteSpace.initialized;\n\n // 6. Copy V1 and its dependency graph + identity to remoteSpace\n const graphV1 = await metaspace.getDependencyGraph({ ibGibAddr: getIbGibAddr({ ibGib: r1_v1 }), space });\n await metaspace.put({ ibGibs: Object.values(graphV1), space: remoteSpace });\n await metaspace.registerNewIbGib({ ibGib: r1_v1, space: remoteSpace });\n\n const domainI = debugState.domainI!;\n await copyIdentitiesToSpace({ domainI, metaspace, fromSpace: space, toSpace: remoteSpace });\n devLog('4.5B Setup: \u2713 Copied V1 and identities (domain and delegate) to remoteSpace.');\n\n // 7. Mutate V1 \u2192 V2 in remoteSpace ONLY\n devLog('4.5B Setup: Mutating V1 -> V2 in remoteSpace...');\n const r1_v2 = await mut8Timeline({\n timeline: r1_v1,\n mut8Opts: { dataToAddOrPatch: { type: 'comment', label: 'V2_4_5b' } },\n metaspace,\n space: remoteSpace,\n });\n state.targetV2 = r1_v2;\n devLog(`4.5B Setup: \u2713 Mutated to V2 in remoteSpace: ${getIbGibAddr({ ibGib: r1_v2 })}`);\n\n // 8. Sync V2 from remoteSpace to server (Pass 2 \u2014 server now has V2)\n devLog('4.5B Setup: Syncing V2 from remoteSpace to the server...');\n await runSyncPassFromSpace({\n domainIbGibs: [r1_v2],\n passLabel: 'Seed V2 from remoteSpace',\n metaspace,\n space: remoteSpace,\n primarySpace: space,\n domainI,\n masterSecret: MASTER_SECRET\n });\n devLog('4.5B Setup: \u2713 Pass 2 Sync (V2 to server) complete. debugState.domainI updated.');\n\n devLog('\u2713 4.5B Setup Complete! Server has V2, default local space has V1. Ready for 4.5B Sync.');\n btn.textContent = '\u2713 4.5B Setup Complete';\n\n const syncBtn = document.getElementById('btn-4-5b-sync') as HTMLButtonElement | null;\n if (syncBtn) { syncBtn.disabled = false; }\n\n } catch (error) {\n devLog(`\u2717 4.5B Setup FAILED: ${extractErrorMsg(error)}`);\n console.error(error);\n btn.disabled = false;\n }\n });\n}\n\nexport function init4_5bSyncButton(): void {\n const btn = document.getElementById('btn-4-5b-sync') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', async () => {\n try {\n btn.disabled = true;\n devLog('4.5B Sync: Initiating WebSocket Sync from default local space (which has V1, server has V2)...');\n\n const targetV1 = debugState.targetC1;\n if (!debugState.domainI || !targetV1) {\n devLog('\u26A0 4.5B Sync: Missing setup state. Please run Setup first.');\n btn.disabled = false;\n return;\n }\n\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({});\n if (!space) { throw new Error(\"No default space.\"); }\n\n // Sync targeting our local tip V1. Since the server is ahead with V2,\n // the coordinator should pull down V2 via delta resolution.\n await runSyncPass({ domainIbGibs: [targetV1], passLabel: 'Pull V2 from server', metaspace, space });\n\n devLog('\u2713 4.5B Sync Execution Complete! Ready for 4.5B Check.');\n btn.textContent = '\u2713 4.5B Sync Run';\n\n const checkBtn = document.getElementById('btn-4-5b-check') as HTMLButtonElement | null;\n if (checkBtn) { checkBtn.disabled = false; }\n\n } catch (error) {\n devLog(`\u2717 4.5B Sync FAILED: ${extractErrorMsg(error)}`);\n console.error(error);\n btn.disabled = false;\n }\n });\n}\n\nexport function init4_5bCheckButton(): void {\n const btn = document.getElementById('btn-4-5b-check') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', async () => {\n try {\n btn.disabled = true;\n devLog('4.5B Check: Verifying that V2 was pulled down to default local space...');\n\n const targetV2 = state.targetV2;\n if (!targetV2 || !debugState.domainI) {\n devLog('\u26A0 4.5B Check: Missing target V2 in state. Did Setup run?');\n btn.disabled = false;\n return;\n }\n\n const targetV2Addr = getIbGibAddr({ ibGib: targetV2 });\n const domainAddr = getIbGibAddr({ ibGib: debugState.domainI });\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({});\n if (!space) { throw new Error(\"No default space.\"); }\n\n // 1. Verify V2 now exists in default local space\n const resGetV2 = await metaspace.get({ addr: targetV2Addr, space });\n if (!resGetV2.success || resGetV2.ibGibs?.length !== 1) {\n throw new Error(`V2 tip (${targetV2Addr}) is NOT present in local space!`);\n }\n const localV2 = resGetV2.ibGibs[0];\n devLog(`4.5B Check: \u2713 V2 Tip found locally. Label: \"${localV2.data?.label}\"`);\n\n // 2. Fetch full dependency graph of V2 from local space and server, assert equivalence\n const localGraph = await metaspace.getDependencyGraph({ ibGibAddr: targetV2Addr, space });\n devLog('4.5B Check: Fetching V2 dependency graph from server...');\n const apiBridge = new SpaceGibApiBridge();\n const resServerGraph = await apiBridge.getIbGibGraph(domainAddr, targetV2Addr, true);\n if (!resServerGraph.success || !resServerGraph.graph) {\n throw new Error(`Failed to fetch V2 graph from server: ${resServerGraph.message}`);\n }\n const equal = graphsAreEquivalent({ graphA: localGraph, graphB: resServerGraph.graph });\n if (equal) {\n devLog('\u2713 4.5B Check SUCCESS: V2 and all dependencies are fully equivalent on client and server!');\n btn.textContent = '\u2713 4.5B Check Success';\n } else {\n throw new Error(\"Dependency graphs on local space and server are NOT equivalent.\");\n }\n\n } catch (error) {\n devLog(`\u2717 4.5B Check FAILED: ${extractErrorMsg(error)}`);\n console.error(error);\n btn.disabled = false;\n }\n });\n}\n", "import { extractErrorMsg, getUUID } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';\nimport { Factory_V1 as factory } from '@ibgib/ts-gib/dist/V1/factory.mjs';\nimport { ROOT } from '@ibgib/ts-gib/dist/V1/constants.mjs';\nimport { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';\nimport { KeystoneIbGib_V1 } from '@ibgib/core-gib/dist/keystone/keystone-types.mjs';\nimport { getGlobalMetaspace_waitIfNeeded } from \"@ibgib/web-gib/dist/helpers.mjs\";\nimport { mut8Timeline } from '@ibgib/core-gib/dist/timeline/timeline-api.mjs';\nimport { graphsAreEquivalent } from '@ibgib/core-gib/dist/common/other/graph-helper.mjs';\nimport { SpaceGibApiBridge } from '../api/space-gib-api-bridge.mjs';\n\nimport {\n debugState, devLog, lc,\n setupDomainAndDelegateIdentities, runSyncPass\n} from './common.mjs';\n\n// Phase-specific state for targets that don't fit in debugState slots\ninterface Phase46State {\n targetAlphaV1?: any;\n targetBetaV2?: any;\n}\nconst state: Phase46State = {};\n\nconst MASTER_SECRET = 'test-sender-secret-phase4-6b';\n\nexport function init4_6bSetupButton(): void {\n const btn = document.getElementById('btn-4-6b-setup') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', async () => {\n try {\n btn.disabled = true;\n devLog('4.6B Setup: Generating Domain Keystone (I) and two independent target timelines (Alpha and Beta)...');\n\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({});\n if (!space) { throw new Error(\"No default space.\"); }\n\n const apiBridge = new SpaceGibApiBridge();\n\n // 1. Create domain + delegate identities (DRY helper)\n await setupDomainAndDelegateIdentities({\n masterSecret: MASTER_SECRET,\n syncSalt: 'senderidentitysyncsaltphase4-6b',\n manageSalt: 'senderidentitymanagesaltphase4-6b',\n metaspace, space, apiBridge,\n phaseText: '4.6B'\n });\n\n // 2. Create Timeline A (root A -> mutant A1)\n const resAlphaV0 = await factory.firstGen({\n parentIbGib: ROOT,\n ib: 'timeline_root_alpha_4_6b',\n data: { type: 'root', label: 'Alpha4_6b', random: Math.random() },\n dna: true, nCounter: true, tjp: { uuid: true, timestamp: true }\n });\n const r1_alpha_v0 = resAlphaV0.newIbGib;\n await metaspace.persistTransformResult({ resTransform: resAlphaV0, space });\n await metaspace.registerNewIbGib({ ibGib: r1_alpha_v0, space });\n\n const r1_alpha_v1 = await mut8Timeline({\n timeline: r1_alpha_v0,\n mut8Opts: { dataToAddOrPatch: { type: 'comment', label: 'A1_4_6b' } },\n metaspace, space,\n });\n state.targetAlphaV1 = r1_alpha_v1;\n debugState.targetC1 = r1_alpha_v1;\n devLog(`4.6B Setup: \u2713 Local Timeline A created. A1 Tip: ${getIbGibAddr({ ibGib: r1_alpha_v1 })}`);\n\n // 3. Create Timeline B (root B -> mutant B1 -> mutant B2)\n const resBetaV0 = await factory.firstGen({\n parentIbGib: ROOT,\n ib: 'timeline_root_beta_4_6b',\n data: { type: 'root', label: 'Beta4_6b', random: Math.random() },\n dna: true, nCounter: true, tjp: { uuid: true, timestamp: true }\n });\n const r1_beta_v0 = resBetaV0.newIbGib;\n await metaspace.persistTransformResult({ resTransform: resBetaV0, space });\n await metaspace.registerNewIbGib({ ibGib: r1_beta_v0, space });\n\n const r1_beta_v1 = await mut8Timeline({\n timeline: r1_beta_v0,\n mut8Opts: { dataToAddOrPatch: { type: 'comment', label: 'B1_4_6b' } },\n metaspace, space,\n });\n const r1_beta_v2 = await mut8Timeline({\n timeline: r1_beta_v1,\n mut8Opts: { dataToAddOrPatch: { type: 'comment', label: 'B2_4_6b' } },\n metaspace, space,\n });\n state.targetBetaV2 = r1_beta_v2;\n debugState.targetC2 = r1_beta_v2;\n devLog(`4.6B Setup: \u2713 Local Timeline B created. B2 Tip: ${getIbGibAddr({ ibGib: r1_beta_v2 })}`);\n\n devLog('\u2713 4.6B Setup Complete! Timelines created locally. Ready for 4.6B Sync.');\n btn.textContent = '\u2713 4.6B Setup Complete';\n\n const syncBtn = document.getElementById('btn-4-6b-sync') as HTMLButtonElement | null;\n if (syncBtn) { syncBtn.disabled = false; }\n\n } catch (error) {\n devLog(`\u2717 4.6B Setup FAILED: ${extractErrorMsg(error)}`);\n console.error(error);\n btn.disabled = false;\n }\n });\n}\n\nexport function init4_6bSyncButton(): void {\n const btn = document.getElementById('btn-4-6b-sync') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', async () => {\n try {\n btn.disabled = true;\n devLog('4.6B Sync: Initiating WebSocket Sync for both Timeline A and Timeline B in one call...');\n\n const targetAlphaV1 = state.targetAlphaV1;\n const targetBetaV2 = state.targetBetaV2;\n if (!debugState.domainI || !targetAlphaV1 || !targetBetaV2) {\n devLog('\u26A0 4.6B Sync: Missing setup state. Please run Setup first.');\n btn.disabled = false;\n return;\n }\n\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({});\n if (!space) { throw new Error(\"No default space.\"); }\n\n // Sync both timelines in a single call\n await runSyncPass({\n domainIbGibs: [targetAlphaV1, targetBetaV2],\n passLabel: 'Sync Alpha A1 + Beta B2',\n metaspace, space\n });\n\n devLog('\u2713 4.6B Sync Execution Complete! Ready for 4.6B Check.');\n btn.textContent = '\u2713 4.6B Sync Run';\n\n const checkBtn = document.getElementById('btn-4-6b-check') as HTMLButtonElement | null;\n if (checkBtn) { checkBtn.disabled = false; }\n\n } catch (error) {\n devLog(`\u2717 4.6B Sync FAILED: ${extractErrorMsg(error)}`);\n console.error(error);\n btn.disabled = false;\n }\n });\n}\n\nexport function init4_6bCheckButton(): void {\n const btn = document.getElementById('btn-4-6b-check') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', async () => {\n try {\n btn.disabled = true;\n devLog('4.6B Check: Verifying both Timeline A and Timeline B exist on the server with matching dependency graphs...');\n\n const targetAlphaV1 = state.targetAlphaV1;\n const targetBetaV2 = state.targetBetaV2;\n if (!debugState.domainI || !targetAlphaV1 || !targetBetaV2) {\n devLog('\u26A0 4.6B Check: Missing state. Did Setup and Sync run?');\n btn.disabled = false;\n return;\n }\n\n const domainAddr = getIbGibAddr({ ibGib: debugState.domainI });\n const alphaAddr = getIbGibAddr({ ibGib: targetAlphaV1 });\n const betaAddr = getIbGibAddr({ ibGib: targetBetaV2 });\n\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({});\n if (!space) { throw new Error(\"No default space.\"); }\n\n const apiBridge = new SpaceGibApiBridge();\n\n // 1. Verify Timeline A on server\n devLog('4.6B Check: Fetching Timeline A dependency graph from server...');\n const resServerGraphAlpha = await apiBridge.getIbGibGraph(domainAddr, alphaAddr, true);\n if (!resServerGraphAlpha.success || !resServerGraphAlpha.graph) {\n throw new Error(`Failed to fetch Timeline A graph from server: ${resServerGraphAlpha.message}`);\n }\n const localGraphAlpha = await metaspace.getDependencyGraph({ ibGibAddr: alphaAddr, space });\n if (!graphsAreEquivalent({ graphA: localGraphAlpha, graphB: resServerGraphAlpha.graph })) {\n throw new Error(\"Timeline A dependency graphs on local space and server are NOT equivalent.\");\n }\n devLog('4.6B Check: \u2713 Timeline A graphs are equivalent.');\n\n // 2. Verify Timeline B on server\n devLog('4.6B Check: Fetching Timeline B dependency graph from server...');\n const resServerGraphBeta = await apiBridge.getIbGibGraph(domainAddr, betaAddr, true);\n if (!resServerGraphBeta.success || !resServerGraphBeta.graph) {\n throw new Error(`Failed to fetch Timeline B graph from server: ${resServerGraphBeta.message}`);\n }\n const localGraphBeta = await metaspace.getDependencyGraph({ ibGibAddr: betaAddr, space });\n if (!graphsAreEquivalent({ graphA: localGraphBeta, graphB: resServerGraphBeta.graph })) {\n throw new Error(\"Timeline B dependency graphs on local space and server are NOT equivalent.\");\n }\n devLog('4.6B Check: \u2713 Timeline B graphs are equivalent.');\n\n devLog('\u2713 4.6B Check SUCCESS: Both independent timelines are fully synced and identical on client and server!');\n btn.textContent = '\u2713 4.6B Check Success';\n\n } catch (error) {\n devLog(`\u2717 4.6B Check FAILED: ${extractErrorMsg(error)}`);\n console.error(error);\n btn.disabled = false;\n }\n });\n}\n", "import { extractErrorMsg, getUUID } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';\nimport { Factory_V1 as factory } from '@ibgib/ts-gib/dist/V1/factory.mjs';\nimport { ROOT } from '@ibgib/ts-gib/dist/V1/constants.mjs';\nimport { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';\nimport { KeystoneIbGib_V1 } from '@ibgib/core-gib/dist/keystone/keystone-types.mjs';\nimport { getGlobalMetaspace_waitIfNeeded } from \"@ibgib/web-gib/dist/helpers.mjs\";\nimport { mut8Timeline } from '@ibgib/core-gib/dist/timeline/timeline-api.mjs';\nimport { getTjpAddr } from '@ibgib/core-gib/dist/common/other/ibgib-helper.mjs';\nimport { SyncSagaCoordinator } from '@ibgib/core-gib/dist/sync/sync-saga-coordinator.mjs';\nimport { GRAFT_BASE_REL8N_NAME, GRAFT_ORPHAN_REL8N_NAME, GRAFT_INFO_REL8N_NAME } from '@ibgib/core-gib/dist/sync/graft-info/graft-info-constants.mjs';\nimport { SpaceGibApiBridge } from '../api/space-gib-api-bridge.mjs';\n\nimport {\n debugState, devLog, lc,\n setupDomainAndDelegateIdentities, runSyncPass, runSyncPassFromSpace, copyIdentitiesToSpace\n} from './common.mjs';\n\ninterface Phase47State {\n testRoot?: any;\n targetAlphaV2a?: any;\n targetBetaV2b?: any;\n}\nconst state: Phase47State = {};\n\nconst MASTER_SECRET = 'test-sender-secret-phase4-7b';\n\nexport function init4_7bSetupButton(): void {\n const btn = document.getElementById('btn-4-7b-setup') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', async () => {\n try {\n btn.disabled = true;\n devLog('4.7B Setup: Setting up identities, seeding history, and creating divergent branches...');\n\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({}) as any;\n if (!space) { throw new Error(\"No default space.\"); }\n\n const apiBridge = new SpaceGibApiBridge();\n\n await setupDomainAndDelegateIdentities({\n masterSecret: MASTER_SECRET,\n syncSalt: 'senderidentitysyncsaltphase4-7b',\n manageSalt: 'senderidentitymanagesaltphase4-7b',\n metaspace, space, apiBridge, phaseText: '4.7B'\n });\n\n const domainI = debugState.domainI!;\n\n const remoteSpace = await metaspace.createNewLocalSpace({\n opts: { allowCancel: false, spaceName: 'remote_space_4_7b', getFnPrompt: metaspace.getFnPrompt! }\n }) as any;\n await remoteSpace.initialized;\n await metaspace.put({ ibGib: domainI, space: remoteSpace });\n await metaspace.registerNewIbGib({ ibGib: domainI, space: remoteSpace });\n\n const resRoot = await factory.firstGen({\n parentIbGib: ROOT,\n ib: 'timeline_root_conflict_4_7b',\n data: { type: 'root', label: 'CommonRoot', random: Math.random() },\n dna: true, nCounter: true, tjp: { uuid: true, timestamp: true }\n });\n const testRoot = resRoot.newIbGib;\n await metaspace.persistTransformResult({ resTransform: resRoot, space });\n await metaspace.registerNewIbGib({ ibGib: testRoot, space });\n state.testRoot = testRoot;\n\n const v1_common = await mut8Timeline({\n timeline: testRoot,\n mut8Opts: { dataToAddOrPatch: { type: 'comment', label: 'V1Common' } },\n metaspace, space,\n });\n\n const graphRoot = await metaspace.getDependencyGraph({ ibGibAddr: getIbGibAddr({ ibGib: testRoot }), space });\n const graphV1 = await metaspace.getDependencyGraph({ ibGibAddr: getIbGibAddr({ ibGib: v1_common }), space });\n await metaspace.put({ ibGibs: Object.values({ ...graphRoot, ...graphV1 }), space: remoteSpace });\n await metaspace.registerNewIbGib({ ibGib: testRoot, space: remoteSpace });\n await metaspace.registerNewIbGib({ ibGib: v1_common, space: remoteSpace });\n\n devLog('4.7B Setup: Syncing v1_common to server...');\n await runSyncPass({ domainIbGibs: [v1_common], passLabel: 'Seed v1_common', metaspace, space });\n devLog('4.7B Setup: \u2713 Seeding complete on server.');\n\n const domainIEvolved = debugState.domainI!;\n await copyIdentitiesToSpace({ domainI: domainIEvolved, metaspace, fromSpace: space, toSpace: remoteSpace });\n\n const v2a = await mut8Timeline({\n timeline: v1_common, mut8Opts: { dataToAddOrPatch: { fieldA: 'source_edit' } }, metaspace, space,\n });\n state.targetAlphaV2a = v2a;\n devLog(`4.7B Setup: \u2713 Created client divergent edit V2a: ${getIbGibAddr({ ibGib: v2a })}`);\n\n const v2b = await mut8Timeline({\n timeline: v1_common, mut8Opts: { dataToAddOrPatch: { fieldB: 'dest_edit' } }, metaspace, space: remoteSpace,\n });\n state.targetBetaV2b = v2b;\n devLog(`4.7B Setup: \u2713 Created remote divergent edit V2b: ${getIbGibAddr({ ibGib: v2b })}`);\n\n devLog('4.7B Setup: Pushing V2b from remote space to server...');\n await runSyncPassFromSpace({\n domainIbGibs: [v2b], passLabel: 'Push V2b from remoteSpace',\n metaspace, space: remoteSpace, primarySpace: space,\n domainI: domainIEvolved, masterSecret: MASTER_SECRET,\n });\n devLog('4.7B Setup: \u2713 Server tip is now V2b.');\n\n devLog('\u2713 4.7B Setup Complete! Ready for 4.7B Sync.');\n btn.textContent = '\u2713 4.7B Setup Complete';\n const syncBtn = document.getElementById('btn-4-7b-sync') as HTMLButtonElement | null;\n if (syncBtn) { syncBtn.disabled = false; }\n\n } catch (error) {\n devLog(`\u2717 4.7B Setup FAILED: ${extractErrorMsg(error)}`);\n console.error(error);\n btn.disabled = false;\n }\n });\n}\n\nexport function init4_7bSyncButton(): void {\n const btn = document.getElementById('btn-4-7b-sync') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', async () => {\n try {\n btn.disabled = true;\n devLog('4.7B Sync: Initiating WebSocket Sync for divergent edit V2a...');\n const targetAlphaV2a = state.targetAlphaV2a;\n if (!debugState.domainI || !targetAlphaV2a) {\n devLog('\u26A0 4.7B Sync: Missing setup state. Please run Setup first.');\n btn.disabled = false;\n return;\n }\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({}) as any;\n if (!space) { throw new Error(\"No default space.\"); }\n await runSyncPass({ domainIbGibs: [targetAlphaV2a], passLabel: 'Sync V2a (conflict merge)', metaspace, space });\n devLog('\u2713 4.7B Sync Execution Complete! Ready for 4.7B Check.');\n btn.textContent = '\u2713 4.7B Sync Run';\n const checkBtn = document.getElementById('btn-4-7b-check') as HTMLButtonElement | null;\n if (checkBtn) { checkBtn.disabled = false; }\n } catch (error) {\n devLog(`\u2717 4.7B Sync FAILED: ${extractErrorMsg(error)}`);\n console.error(error);\n btn.disabled = false;\n }\n });\n}\n\nexport function init4_7bCheckButton(): void {\n const btn = document.getElementById('btn-4-7b-check') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', async () => {\n try {\n btn.disabled = true;\n devLog('4.7B Check: Verifying merged tip (V3) contains both edits on client and server...');\n const testRoot = state.testRoot;\n const targetAlphaV2a = state.targetAlphaV2a;\n const targetBetaV2b = state.targetBetaV2b;\n if (!debugState.domainI || !testRoot || !targetAlphaV2a || !targetBetaV2b) {\n devLog('\u26A0 4.7B Check: Missing state. Did Setup and Sync run?');\n btn.disabled = false;\n return;\n }\n const domainAddr = getIbGibAddr({ ibGib: debugState.domainI });\n const tjpAddr = getTjpAddr({ ibGib: testRoot, defaultIfNone: 'incomingAddr' }) ?? getIbGibAddr({ ibGib: testRoot });\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({}) as any;\n if (!space) { throw new Error(\"No default space.\"); }\n\n const clientKV = await (metaspace.getLocalUserSpace({}) as Promise<any>).then((sp: any) =>\n new SyncSagaCoordinator().getKnowledgeMap({ space: sp, metaspace, domainIbGibs: [testRoot] })\n );\n const clientTipAddr = clientKV[tjpAddr];\n devLog(`4.7B Check: Client tip address: ${clientTipAddr}`);\n if (!clientTipAddr) { throw new Error(\"Client default space is missing the timeline tip.\"); }\n\n const resTip = await metaspace.get({ addr: clientTipAddr, space });\n if (!resTip.success || !resTip.ibGibs?.length) { throw new Error(\"Client tip not found in default local space.\"); }\n const clientTip = resTip.ibGibs[0];\n if (!clientTip.data?.fieldA || !clientTip.data?.fieldB) {\n throw new Error(`Merged client tip missing edits: fieldA: ${clientTip.data?.fieldA}, fieldB: ${clientTip.data?.fieldB}`);\n }\n devLog('4.7B Check: \u2713 Client tip has both fieldA and fieldB edits.');\n\n const graftInfoRel = clientTip.rel8ns?.[GRAFT_INFO_REL8N_NAME];\n if (!graftInfoRel?.[0]) { throw new Error(\"Client tip is missing graftinfo relations.\"); }\n const resGraft = await metaspace.get({ addr: graftInfoRel[0], space });\n if (!resGraft.success || !resGraft.ibGibs?.length) { throw new Error(\"GraftInfo not found in local space.\"); }\n const graftInfo = resGraft.ibGibs[0];\n if (!graftInfo.rel8ns?.[GRAFT_BASE_REL8N_NAME] || !graftInfo.rel8ns?.[GRAFT_ORPHAN_REL8N_NAME]) {\n throw new Error(\"GraftInfo is missing graftbase or graftorphan relations.\");\n }\n devLog('4.7B Check: \u2713 Client graft base and orphan relations are correctly set.');\n\n const apiBridge = new SpaceGibApiBridge();\n const resServerGraph = await apiBridge.getIbGibGraph(domainAddr, clientTipAddr, true);\n if (!resServerGraph.success || !resServerGraph.graph) {\n throw new Error(`Failed to fetch merged graph from server: ${resServerGraph.message}`);\n }\n const serverTip = resServerGraph.graph[clientTipAddr];\n if (!serverTip) { throw new Error(\"Merged V3 tip is not present on the server!\"); }\n if (serverTip.data?.fieldA !== 'source_edit' || serverTip.data?.fieldB !== 'dest_edit') {\n throw new Error(\"Server tip data edits do not match merged values.\");\n }\n devLog('4.7B Check: \u2713 Server tip has matching merged edits.');\n devLog('\u2713 4.7B Check SUCCESS: Divergent branches merged successfully via optimistic graft!');\n btn.textContent = '\u2713 4.7B Check Success';\n\n } catch (error) {\n devLog(`\u2717 4.7B Check FAILED: ${extractErrorMsg(error)}`);\n console.error(error);\n btn.disabled = false;\n }\n });\n}\n", "import { extractErrorMsg, getUUID } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';\nimport { Factory_V1 as factory } from '@ibgib/ts-gib/dist/V1/factory.mjs';\nimport { ROOT } from '@ibgib/ts-gib/dist/V1/constants.mjs';\nimport { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';\nimport { KeystoneIbGib_V1 } from '@ibgib/core-gib/dist/keystone/keystone-types.mjs';\nimport { getGlobalMetaspace_waitIfNeeded } from \"@ibgib/web-gib/dist/helpers.mjs\";\nimport { mut8Timeline, appendToTimeline } from '@ibgib/core-gib/dist/timeline/timeline-api.mjs';\nimport { getTjpAddr } from '@ibgib/core-gib/dist/common/other/ibgib-helper.mjs';\nimport { GRAFT_BASE_REL8N_NAME, GRAFT_ORPHAN_REL8N_NAME, GRAFT_INFO_REL8N_NAME } from '@ibgib/core-gib/dist/sync/graft-info/graft-info-constants.mjs';\nimport { SpaceGibApiBridge } from '../api/space-gib-api-bridge.mjs';\nimport { SyncSagaCoordinator } from '@ibgib/core-gib/dist/sync/sync-saga-coordinator.mjs';\n\nimport {\n debugState, devLog, lc,\n setupDomainAndDelegateIdentities, runSyncPass, runSyncPassFromSpace, copyIdentitiesToSpace\n} from './common.mjs';\n\ninterface Phase48State {\n domainI_latest?: KeystoneIbGib_V1;\n testRoot?: any;\n targetAlphaV3a?: any;\n targetBetaV0?: any;\n}\n\nconst state: Phase48State = {};\n\nexport function init4_8bSetupButton(): void {\n const btn = document.getElementById('btn-4-8b-setup') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', async () => {\n try {\n btn.disabled = true;\n devLog('4.8B Setup: Setting up identities, seeding history, and creating divergent branches in client and remote...');\n\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({}) as any;\n if (!space) { throw new Error(\"No default space.\"); }\n\n const apiBridge = new SpaceGibApiBridge();\n\n // 1. Create domain + delegate identities (DRY helper)\n await setupDomainAndDelegateIdentities({\n masterSecret: 'test-sender-secret-phase4-8b',\n syncSalt: 'senderidentitysyncsaltphase4-8b',\n manageSalt: 'senderidentitymanagesaltphase4-8b',\n metaspace, space, apiBridge,\n phaseText: '4.8B'\n });\n const domainI = debugState.domainI!;\n state.domainI_latest = domainI;\n const domainAddr = getIbGibAddr({ ibGib: domainI });\n\n // 2. Create the divergent \"remote\" space\n devLog('4.8B Setup: Creating temporary remote space...');\n const remoteSpace = await metaspace.createNewLocalSpace({\n opts: {\n allowCancel: false,\n spaceName: 'remote_space_4_8b',\n getFnPrompt: metaspace.getFnPrompt!\n }\n }) as any;\n await remoteSpace.initialized;\n\n // Copy user identity and delegate to remote space\n await copyIdentitiesToSpace({ domainI, metaspace, fromSpace: space, toSpace: remoteSpace });\n\n // 3. Seed common history root -> v1 locally\n const resRoot = await factory.firstGen({\n parentIbGib: ROOT,\n ib: 'timeline_root_conflict_4_8b',\n data: { type: 'root', label: 'CommonRoot', random: Math.random() },\n dna: true,\n nCounter: true,\n tjp: { uuid: true, timestamp: true }\n });\n const testRoot = resRoot.newIbGib;\n await metaspace.persistTransformResult({ resTransform: resRoot, space });\n await metaspace.registerNewIbGib({ ibGib: testRoot, space });\n state.testRoot = testRoot;\n\n const v1_common = await mut8Timeline({\n timeline: testRoot,\n mut8Opts: { dataToAddOrPatch: { type: 'comment', label: 'V1Common' } },\n metaspace,\n space,\n });\n\n // 4. Copy common history to remote space\n const graphRoot = await metaspace.getDependencyGraph({ ibGibAddr: getIbGibAddr({ ibGib: testRoot }), space });\n const graphV1 = await metaspace.getDependencyGraph({ ibGibAddr: getIbGibAddr({ ibGib: v1_common }), space });\n const commonDepGraph = { ...graphRoot, ...graphV1 };\n await metaspace.put({ ibGibs: Object.values(commonDepGraph), space: remoteSpace });\n await metaspace.registerNewIbGib({ ibGib: testRoot, space: remoteSpace });\n await metaspace.registerNewIbGib({ ibGib: v1_common, space: remoteSpace });\n\n // 5. Initial sync of v1_common to the server so server has it\n devLog('4.8B Setup: Syncing v1_common to server...');\n await runSyncPass({\n domainIbGibs: [v1_common],\n passLabel: 'Seed v1_common',\n metaspace,\n space\n });\n devLog('4.8B Setup: \u2713 Seeding complete on server.');\n\n // Copy evolved delegate and domain tip to remoteSpace\n await copyIdentitiesToSpace({ domainI: debugState.domainI!, metaspace, fromSpace: space, toSpace: remoteSpace });\n\n // 6. Create Divergence:\n // Client (default space) gets V2a (fieldA edit + relates newly created independent timeline Beta)\n const resBeta = await factory.firstGen({\n parentIbGib: ROOT,\n ib: 'beta_multitimelines_withid_4_8b',\n data: { fieldA: 'beta field A created on source' },\n dna: true,\n nCounter: true,\n tjp: { uuid: true, timestamp: true }\n });\n const beta_v0 = resBeta.newIbGib;\n await metaspace.persistTransformResult({ resTransform: resBeta, space });\n await metaspace.registerNewIbGib({ ibGib: beta_v0, space });\n state.targetBetaV0 = beta_v0;\n devLog(`4.8B Setup: \u2713 Created client independent related timeline Beta: ${getIbGibAddr({ ibGib: beta_v0 })}`);\n\n const alpha_v2_source_sansBeta = await mut8Timeline({\n timeline: v1_common,\n mut8Opts: { dataToAddOrPatch: { fieldA: 'source_edit' } },\n metaspace,\n space,\n });\n\n const alpha_v3_source_rel8beta = await appendToTimeline({\n timeline: alpha_v2_source_sansBeta,\n metaspace,\n space,\n rel8nInfos: [\n { rel8nName: 'testrel8n', ibGibs: [beta_v0] }\n ],\n });\n state.targetAlphaV3a = alpha_v3_source_rel8beta;\n devLog(`4.8B Setup: \u2713 Created client divergent edit V3a: ${getIbGibAddr({ ibGib: alpha_v3_source_rel8beta })}`);\n\n // Remote Space gets V2b (fieldB edit)\n const v2b = await mut8Timeline({\n timeline: v1_common,\n mut8Opts: { dataToAddOrPatch: { fieldB: 'dest_edit' } },\n metaspace,\n space: remoteSpace,\n });\n devLog(`4.8B Setup: \u2713 Created remote divergent edit V2b: ${getIbGibAddr({ ibGib: v2b })}`);\n\n // 7. Sync V2b from remote space to server, so server tip becomes V2b\n devLog('4.8B Setup: Pushing V2b from remote space to server...');\n await runSyncPassFromSpace({\n domainIbGibs: [v2b],\n passLabel: 'Push V2b from remoteSpace',\n metaspace,\n space: remoteSpace,\n primarySpace: space,\n domainI: debugState.domainI!,\n masterSecret: 'test-sender-secret-phase4-8b'\n });\n state.domainI_latest = debugState.domainI;\n devLog('4.8B Setup: \u2713 Server tip is now V2b. Evolved identity copied back.');\n\n devLog('\u2713 4.8B Setup Complete! Ready for 4.8B Sync.');\n btn.textContent = '\u2713 4.8B Setup Complete';\n\n const syncBtn = document.getElementById('btn-4-8b-sync') as HTMLButtonElement | null;\n if (syncBtn) { syncBtn.disabled = false; }\n\n } catch (error) {\n devLog(`\u2717 4.8B Setup FAILED: ${extractErrorMsg(error)}`);\n console.error(error);\n btn.disabled = false;\n }\n });\n}\n\nexport function init4_8bSyncButton(): void {\n const btn = document.getElementById('btn-4-8b-sync') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', async () => {\n try {\n btn.disabled = true;\n devLog('4.8B Sync: Initiating WebSocket Sync for divergent edit V3a (with related timeline Beta)...');\n\n const domainI = state.domainI_latest;\n const targetAlphaV3a = state.targetAlphaV3a;\n if (!domainI || !targetAlphaV3a) {\n devLog('\u26A0 4.8B Sync: Missing setup state. Please run Setup first.');\n btn.disabled = false;\n return;\n }\n\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({}) as any;\n if (!space) { throw new Error(\"No default space.\"); }\n\n await runSyncPass({\n domainIbGibs: [targetAlphaV3a],\n passLabel: 'Sync V3a and merge',\n metaspace,\n space\n });\n state.domainI_latest = debugState.domainI;\n\n devLog('\u2713 4.8B Sync Execution Complete! Ready for 4.8B Check.');\n btn.textContent = '\u2713 4.8B Sync Run';\n\n const checkBtn = document.getElementById('btn-4-8b-check') as HTMLButtonElement | null;\n if (checkBtn) { checkBtn.disabled = false; }\n\n } catch (error) {\n devLog(`\u2717 4.8B Sync FAILED: ${extractErrorMsg(error)}`);\n console.error(error);\n btn.disabled = false;\n }\n });\n}\n\nexport function init4_8bCheckButton(): void {\n const btn = document.getElementById('btn-4-8b-check') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', async () => {\n try {\n btn.disabled = true;\n devLog('4.8B Check: Verifying merged tip (V4) contains both edits on client and server...');\n\n const domainI = state.domainI_latest;\n const testRoot = state.testRoot;\n const targetAlphaV3a = state.targetAlphaV3a;\n const targetBetaV0 = state.targetBetaV0;\n if (!domainI || !testRoot || !targetAlphaV3a || !targetBetaV0) {\n devLog('\u26A0 4.8B Check: Missing state. Did Setup and Sync run?');\n btn.disabled = false;\n return;\n }\n\n const domainAddr = getIbGibAddr({ ibGib: domainI });\n const tjpAddr = getTjpAddr({ ibGib: testRoot, defaultIfNone: 'incomingAddr' }) ?? getIbGibAddr({ ibGib: testRoot });\n const betaAddr = getIbGibAddr({ ibGib: targetBetaV0 });\n\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({}) as any;\n if (!space) { throw new Error(\"No default space.\"); }\n\n // 1. Check client default space tip\n const clientKV = await metaspace.getLocalUserSpace({}).then((space: any) => {\n return new SyncSagaCoordinator().getKnowledgeMap({\n space,\n metaspace,\n domainIbGibs: [testRoot]\n });\n });\n const clientTipAddr = clientKV[tjpAddr];\n devLog(`4.8B Check: Client tip address: ${clientTipAddr}`);\n\n if (!clientTipAddr) {\n throw new Error(\"Client default space is missing the timeline tip.\");\n }\n\n const resTip = await metaspace.get({ addr: clientTipAddr, space });\n if (!resTip.success || !resTip.ibGibs || resTip.ibGibs.length === 0) {\n throw new Error(\"Client tip not found in default local space.\");\n }\n const clientTip = resTip.ibGibs[0];\n\n if (!clientTip.data || !clientTip.data.fieldA || !clientTip.data.fieldB) {\n throw new Error(`Merged client tip is missing expected data edits: fieldA: ${clientTip.data?.fieldA}, fieldB: ${clientTip.data?.fieldB}`);\n }\n devLog('4.8B Check: \u2713 Client tip has both fieldA and fieldB edits.');\n\n // Verify graftinfo rel8n exists\n const graftInfoRel = clientTip.rel8ns?.[GRAFT_INFO_REL8N_NAME];\n if (!graftInfoRel?.[0]) {\n throw new Error(\"Client tip is missing graftinfo relations.\");\n }\n const resGraft = await metaspace.get({ addr: graftInfoRel[0], space });\n if (!resGraft.success || !resGraft.ibGibs || resGraft.ibGibs.length === 0) {\n throw new Error(\"GraftInfo not found in local space.\");\n }\n const graftInfo = resGraft.ibGibs[0];\n const baseRel = graftInfo.rel8ns?.[GRAFT_BASE_REL8N_NAME];\n const orphanRel = graftInfo.rel8ns?.[GRAFT_ORPHAN_REL8N_NAME];\n\n if (!baseRel || !orphanRel) {\n throw new Error(\"GraftInfo is missing graftbase or graftorphan relations.\");\n }\n devLog('4.8B Check: \u2713 Client graft base and orphan relations are correctly set.');\n\n // 2. Check server tip\n const apiBridge = new SpaceGibApiBridge();\n devLog('4.8B Check: Fetching server timeline graph...');\n const resServerGraph = await apiBridge.getIbGibGraph(domainAddr, clientTipAddr, true);\n if (!resServerGraph.success || !resServerGraph.graph) {\n throw new Error(`Failed to fetch merged graph from server: ${resServerGraph.message}`);\n }\n\n const serverTip = resServerGraph.graph[clientTipAddr];\n if (!serverTip) {\n throw new Error(\"Merged V4 tip is not present on the server!\");\n }\n\n if (serverTip.data?.fieldA !== 'source_edit' || serverTip.data?.fieldB !== 'dest_edit') {\n throw new Error(\"Server tip data edits do not match merged values.\");\n }\n devLog('4.8B Check: \u2713 Server tip has matching merged edits.');\n\n // 3. Verify related timeline Beta exists on the server!\n devLog('4.8B Check: Verifying related timeline Beta is present on the server...');\n const resBetaGraph = await apiBridge.getIbGibGraph(domainAddr, betaAddr, true);\n if (!resBetaGraph.success || !resBetaGraph.graph || !resBetaGraph.graph[betaAddr]) {\n throw new Error(`Related timeline Beta (${betaAddr}) is missing from the server!`);\n }\n devLog('4.8B Check: \u2713 Related timeline Beta successfully verified on the server.');\n\n devLog('\u2713 4.8B Check SUCCESS: Divergent branches merged successfully and related timeline synced on server!');\n btn.textContent = '\u2713 4.8B Check Success';\n\n } catch (error) {\n devLog(`\u2717 4.8B Check FAILED: ${extractErrorMsg(error)}`);\n console.error(error);\n btn.disabled = false;\n }\n });\n}\n", "import { extractErrorMsg, getUUID } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';\nimport { Factory_V1 as factory } from '@ibgib/ts-gib/dist/V1/factory.mjs';\nimport { ROOT } from '@ibgib/ts-gib/dist/V1/constants.mjs';\nimport { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';\nimport { KeystoneIbGib_V1 } from '@ibgib/core-gib/dist/keystone/keystone-types.mjs';\nimport { getGlobalMetaspace_waitIfNeeded } from \"@ibgib/web-gib/dist/helpers.mjs\";\nimport { mut8Timeline } from '@ibgib/core-gib/dist/timeline/timeline-api.mjs';\nimport { getTjpAddr } from '@ibgib/core-gib/dist/common/other/ibgib-helper.mjs';\nimport { GRAFT_BASE_REL8N_NAME, GRAFT_ORPHAN_REL8N_NAME, GRAFT_INFO_REL8N_NAME } from '@ibgib/core-gib/dist/sync/graft-info/graft-info-constants.mjs';\nimport { SpaceGibApiBridge } from '../api/space-gib-api-bridge.mjs';\nimport { SyncSagaCoordinator } from '@ibgib/core-gib/dist/sync/sync-saga-coordinator.mjs';\n\nimport {\n debugState, devLog, lc,\n setupDomainAndDelegateIdentities, runSyncPass, runSyncPassFromSpace, copyIdentitiesToSpace\n} from './common.mjs';\n\ninterface Phase49State {\n domainI_latest?: KeystoneIbGib_V1;\n testRoot?: any;\n targetAlphaV1Source?: any;\n}\n\nconst state: Phase49State = {};\n\nconst INITIAL_TEXT = \"This is the initial quiz question.\\nIt has multiple lines.\\nStudents will answer this.\";\nconst SOURCE_APPEND = \"\\nInstructor added hint.\";\nconst DEST_PREPEND = \"Student note: Confusing!\\n\";\n\nexport function init4_9bSetupButton(): void {\n const btn = document.getElementById('btn-4-9b-setup') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', async () => {\n try {\n btn.disabled = true;\n devLog('4.9B Setup: Setting up identities, seeding text history, and creating divergent branches...');\n\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({}) as any;\n if (!space) { throw new Error(\"No default space.\"); }\n\n const apiBridge = new SpaceGibApiBridge();\n\n // 1. Create domain + delegate identities (DRY helper)\n await setupDomainAndDelegateIdentities({\n masterSecret: 'test-sender-secret-phase4-9b',\n syncSalt: 'senderidentitysyncsaltphase4-9b',\n manageSalt: 'senderidentitymanagesaltphase4-9b',\n metaspace, space, apiBridge,\n phaseText: '4.9B'\n });\n const domainI = debugState.domainI!;\n state.domainI_latest = domainI;\n const domainAddr = getIbGibAddr({ ibGib: domainI });\n\n // 2. Create the divergent \"remote\" space\n devLog('4.9B Setup: Creating temporary remote space...');\n const remoteSpace = await metaspace.createNewLocalSpace({\n opts: {\n allowCancel: false,\n spaceName: 'remote_space_4_9b',\n getFnPrompt: metaspace.getFnPrompt!\n }\n }) as any;\n await remoteSpace.initialized;\n\n // Copy user identity and delegate to remote space\n await copyIdentitiesToSpace({ domainI, metaspace, fromSpace: space, toSpace: remoteSpace });\n\n // 3. Seed common history root -> v1 (with initial text) locally\n const resRoot = await factory.firstGen({\n parentIbGib: ROOT,\n ib: 'timeline_root_text_conflict_4_9b',\n data: { text: INITIAL_TEXT, label: 'TextRoot', random: Math.random() },\n dna: true,\n nCounter: true,\n tjp: { uuid: true, timestamp: true }\n });\n const testRoot = resRoot.newIbGib;\n await metaspace.persistTransformResult({ resTransform: resRoot, space });\n await metaspace.registerNewIbGib({ ibGib: testRoot, space });\n state.testRoot = testRoot;\n\n // 4. Copy common history to remote space\n const graphRoot = await metaspace.getDependencyGraph({ ibGibAddr: getIbGibAddr({ ibGib: testRoot }), space });\n await metaspace.put({ ibGibs: Object.values(graphRoot), space: remoteSpace });\n await metaspace.registerNewIbGib({ ibGib: testRoot, space: remoteSpace });\n\n // 5. Initial sync of testRoot to the server so server has it\n devLog('4.9B Setup: Syncing testRoot to server...');\n await runSyncPass({\n domainIbGibs: [testRoot],\n passLabel: 'Seed testRoot',\n metaspace,\n space\n });\n devLog('4.9B Setup: \u2713 Seeding complete on server.');\n\n // Copy evolved delegate and domain tip to remoteSpace\n await copyIdentitiesToSpace({ domainI: debugState.domainI!, metaspace, fromSpace: space, toSpace: remoteSpace });\n\n // 6. Create Divergence:\n // Client (default space) appends to end\n const alpha_v1_source = await mut8Timeline({\n timeline: testRoot,\n mut8Opts: {\n mut8Ib: testRoot.ib + '_appended',\n dataToAddOrPatch: { text: INITIAL_TEXT + SOURCE_APPEND }\n },\n metaspace,\n space,\n });\n state.targetAlphaV1Source = alpha_v1_source;\n devLog(`4.9B Setup: \u2713 Created client appended edit: ${getIbGibAddr({ ibGib: alpha_v1_source })}`);\n\n // Remote Space prepends to beginning\n const alpha_v1_remote = await mut8Timeline({\n timeline: testRoot,\n mut8Opts: {\n mut8Ib: testRoot.ib + '_prepended',\n dataToAddOrPatch: { text: DEST_PREPEND + INITIAL_TEXT }\n },\n metaspace,\n space: remoteSpace,\n });\n devLog(`4.9B Setup: \u2713 Created remote prepended edit: ${getIbGibAddr({ ibGib: alpha_v1_remote })}`);\n\n // 7. Sync remote prepended edit to server, so server tip becomes the prepended edit\n devLog('4.9B Setup: Pushing remote prepended edit to server...');\n await runSyncPassFromSpace({\n domainIbGibs: [alpha_v1_remote],\n passLabel: 'Push remote prepended edit',\n metaspace,\n space: remoteSpace,\n primarySpace: space,\n domainI: debugState.domainI!,\n masterSecret: 'test-sender-secret-phase4-9b'\n });\n state.domainI_latest = debugState.domainI;\n devLog('4.9B Setup: \u2713 Server tip is now the prepended edit. Evolved identity copied back.');\n\n devLog('\u2713 4.9B Setup Complete! Ready for 4.9B Sync.');\n btn.textContent = '\u2713 4.9B Setup Complete';\n\n const syncBtn = document.getElementById('btn-4-9b-sync') as HTMLButtonElement | null;\n if (syncBtn) { syncBtn.disabled = false; }\n\n } catch (error) {\n devLog(`\u2717 4.9B Setup FAILED: ${extractErrorMsg(error)}`);\n console.error(error);\n btn.disabled = false;\n }\n });\n}\n\nexport function init4_9bSyncButton(): void {\n const btn = document.getElementById('btn-4-9b-sync') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', async () => {\n try {\n btn.disabled = true;\n devLog('4.9B Sync: Initiating WebSocket Sync for divergent edit (LCS text merge)...');\n\n const domainI = state.domainI_latest;\n const targetAlphaV1Source = state.targetAlphaV1Source;\n if (!domainI || !targetAlphaV1Source) {\n devLog('\u26A0 4.9B Sync: Missing setup state. Please run Setup first.');\n btn.disabled = false;\n return;\n }\n\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({}) as any;\n if (!space) { throw new Error(\"No default space.\"); }\n\n await runSyncPass({\n domainIbGibs: [targetAlphaV1Source],\n passLabel: 'Sync divergent edit and merge',\n metaspace,\n space\n });\n state.domainI_latest = debugState.domainI;\n\n devLog('\u2713 4.9B Sync Execution Complete! Ready for 4.9B Check.');\n btn.textContent = '\u2713 4.9B Sync Run';\n\n const checkBtn = document.getElementById('btn-4-9b-check') as HTMLButtonElement | null;\n if (checkBtn) { checkBtn.disabled = false; }\n\n } catch (error) {\n devLog(`\u2717 4.9B Sync FAILED: ${extractErrorMsg(error)}`);\n console.error(error);\n btn.disabled = false;\n }\n });\n}\n\nexport function init4_9bCheckButton(): void {\n const btn = document.getElementById('btn-4-9b-check') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', async () => {\n try {\n btn.disabled = true;\n devLog('4.9B Check: Verifying LCS merged text on client and server...');\n\n const domainI = state.domainI_latest;\n const testRoot = state.testRoot;\n const targetAlphaV1Source = state.targetAlphaV1Source;\n if (!domainI || !testRoot || !targetAlphaV1Source) {\n devLog('\u26A0 4.9B Check: Missing state. Did Setup and Sync run?');\n btn.disabled = false;\n return;\n }\n\n const domainAddr = getIbGibAddr({ ibGib: domainI });\n const tjpAddr = getTjpAddr({ ibGib: testRoot, defaultIfNone: 'incomingAddr' }) ?? getIbGibAddr({ ibGib: testRoot });\n\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({}) as any;\n if (!space) { throw new Error(\"No default space.\"); }\n\n // 1. Check client default space tip\n const clientKV = await metaspace.getLocalUserSpace({}).then((space: any) => {\n return new SyncSagaCoordinator().getKnowledgeMap({\n space,\n metaspace,\n domainIbGibs: [testRoot]\n });\n });\n const clientTipAddr = clientKV[tjpAddr];\n devLog(`4.9B Check: Client tip address: ${clientTipAddr}`);\n\n if (!clientTipAddr) {\n throw new Error(\"Client default space is missing the timeline tip.\");\n }\n\n const resTip = await metaspace.get({ addr: clientTipAddr, space });\n if (!resTip.success || !resTip.ibGibs || resTip.ibGibs.length === 0) {\n throw new Error(\"Client tip not found in default local space.\");\n }\n const clientTip = resTip.ibGibs[0];\n\n const expectedText = DEST_PREPEND + INITIAL_TEXT + SOURCE_APPEND;\n if (clientTip.data?.text !== expectedText) {\n throw new Error(`Merged client tip text mismatch! Expected:\\n${expectedText}\\nActual:\\n${clientTip.data?.text}`);\n }\n devLog('4.9B Check: \u2713 Client tip text contains both prepend and append edits merged correctly.');\n\n // Verify graftinfo rel8n exists\n const graftInfoRel = clientTip.rel8ns?.[GRAFT_INFO_REL8N_NAME];\n if (!graftInfoRel?.[0]) {\n throw new Error(\"Client tip is missing graftinfo relations.\");\n }\n const resGraft = await metaspace.get({ addr: graftInfoRel[0], space });\n if (!resGraft.success || !resGraft.ibGibs || resGraft.ibGibs.length === 0) {\n throw new Error(\"GraftInfo not found in local space.\");\n }\n const graftInfo = resGraft.ibGibs[0];\n const baseRel = graftInfo.rel8ns?.[GRAFT_BASE_REL8N_NAME];\n const orphanRel = graftInfo.rel8ns?.[GRAFT_ORPHAN_REL8N_NAME];\n\n if (!baseRel || !orphanRel) {\n throw new Error(\"GraftInfo is missing graftbase or graftorphan relations.\");\n }\n devLog('4.9B Check: \u2713 Client graft base and orphan relations are correctly set.');\n\n // 2. Check server tip\n const apiBridge = new SpaceGibApiBridge();\n devLog('4.9B Check: Fetching server timeline graph...');\n const resServerGraph = await apiBridge.getIbGibGraph(domainAddr, clientTipAddr, true);\n if (!resServerGraph.success || !resServerGraph.graph) {\n throw new Error(`Failed to fetch merged graph from server: ${resServerGraph.message}`);\n }\n\n const serverTip = resServerGraph.graph[clientTipAddr];\n if (!serverTip) {\n throw new Error(\"Merged tip is not present on the server!\");\n }\n\n if (serverTip.data?.text !== expectedText) {\n throw new Error(`Server tip text mismatch! Expected:\\n${expectedText}\\nActual:\\n${serverTip.data?.text}`);\n }\n devLog('4.9B Check: \u2713 Server tip text matches the client-side merged text.');\n\n devLog('\u2713 4.9B Check SUCCESS: LCS text field merge conflict resolved and verified on both client and server!');\n btn.textContent = '\u2713 4.9B Check Success';\n\n } catch (error) {\n devLog(`\u2717 4.9B Check FAILED: ${extractErrorMsg(error)}`);\n console.error(error);\n btn.disabled = false;\n }\n });\n}\n", "// #region Imports\nimport { extractErrorMsg, getUUID, pretty } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';\nimport { Factory_V1 as factory } from '@ibgib/ts-gib/dist/V1/factory.mjs';\nimport { ROOT } from '@ibgib/ts-gib/dist/V1/constants.mjs';\nimport { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';\nimport { KeystoneIbGib_V1 } from '@ibgib/core-gib/dist/keystone/keystone-types.mjs';\nimport { getGlobalMetaspace_waitIfNeeded } from \"@ibgib/web-gib/dist/helpers.mjs\";\nimport { mut8Timeline, appendToTimeline } from '@ibgib/core-gib/dist/timeline/timeline-api.mjs';\nimport { getTjpAddr } from '@ibgib/core-gib/dist/common/other/ibgib-helper.mjs';\nimport { SyncSagaCoordinator } from '@ibgib/core-gib/dist/sync/sync-saga-coordinator.mjs';\nimport { GRAFT_BASE_REL8N_NAME, GRAFT_ORPHAN_REL8N_NAME, GRAFT_INFO_REL8N_NAME } from '@ibgib/core-gib/dist/sync/graft-info/graft-info-constants.mjs';\nimport { SpaceGibApiBridge } from '../api/space-gib-api-bridge.mjs';\n\nimport {\n debugState, devLog, lc,\n setupDomainAndDelegateIdentities, runSyncPass, runSyncPassFromSpace, copyIdentitiesToSpace\n} from './common.mjs';\nimport { IbGibAddr } from '@ibgib/ts-gib/dist/types.mjs';\n// #endregion Imports\n\n// #region Module State\ninterface Phase410State {\n domainI_initial?: KeystoneIbGib_V1;\n domainI_latest?: KeystoneIbGib_V1;\n remoteSpace?: any;\n alpha_tjpAddr?: string;\n beta_tjpAddr?: string;\n gamma_tjpAddr?: string;\n\n alpha_v0?: any;\n r2_alpha_v3_source_rel8beta?: any;\n r2_beta_v0_source?: any;\n}\n\nconst state: Phase410State = {};\n\nconst TEST_REL8N_NAME = 'testrel8n';\n// #endregion Module State\n\n// #region Phase 4.10B Setup\nexport function init4_10bSetupButton(): void {\n const btn = document.getElementById('btn-4-10b-setup') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', async () => {\n try {\n btn.disabled = true;\n devLog('4.10B Setup: Setting up identities and preparing Round 1 & Round 2 divergence...');\n\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({}) as any;\n if (!space) { throw new Error(\"No default space.\"); }\n\n const apiBridge = new SpaceGibApiBridge();\n\n // 1. Create domain + delegate identities (DRY helper)\n await setupDomainAndDelegateIdentities({\n masterSecret: 'test-sender-secret-phase4-10b',\n syncSalt: 'senderidentitysyncsaltphase4-10b',\n manageSalt: 'senderidentitymanagesaltphase4-10b',\n metaspace, space, apiBridge,\n phaseText: '4.10B'\n });\n const domainI = debugState.domainI!;\n state.domainI_initial = domainI;\n state.domainI_latest = domainI;\n const domainAddr = getIbGibAddr({ ibGib: domainI });\n\n // 2. Create the divergent \"remote\" space\n devLog('4.10B Setup: Creating temporary remote space...');\n const remoteSpace = await metaspace.createNewLocalSpace({\n opts: {\n allowCancel: false,\n spaceName: 'remote_space_4_10b',\n getFnPrompt: metaspace.getFnPrompt!\n }\n }) as any;\n await remoteSpace.initialized;\n state.remoteSpace = remoteSpace;\n\n // Copy user identity and delegate to remote space\n await copyIdentitiesToSpace({ domainI, metaspace, fromSpace: space, toSpace: remoteSpace });\n\n // 3. Seed common history (Round 1) locally in default space\n devLog('4.10B Setup: Creating common history for alpha...');\n const resRoot = await factory.firstGen({\n parentIbGib: ROOT,\n ib: 'timeline_root_alpha_4_10b',\n data: { commonField: 'common field R1 val', label: 'AlphaRoot', random: Math.random() },\n dna: true,\n nCounter: true,\n tjp: { uuid: true, timestamp: true }\n });\n const alpha_v0 = resRoot.newIbGib;\n state.alpha_v0 = alpha_v0;\n await metaspace.persistTransformResult({ resTransform: resRoot, space });\n await metaspace.registerNewIbGib({ ibGib: alpha_v0, space });\n const alpha_tjpAddr = getTjpAddr({ ibGib: alpha_v0, defaultIfNone: 'incomingAddr' })!;\n state.alpha_tjpAddr = alpha_tjpAddr;\n\n // Copy alpha_v0 to remote space before it gets signed by the seeding sync\n await metaspace.persistTransformResult({ resTransform: resRoot, space: remoteSpace });\n await metaspace.registerNewIbGib({ ibGib: alpha_v0, space: remoteSpace });\n\n // Sync alpha_v0 to server immediately so server has it\n devLog('4.10B Setup: Seeding alpha_v0 to server...');\n await runSyncPass({\n domainIbGibs: [alpha_v0],\n passLabel: 'Seed alpha_v0',\n metaspace,\n space\n });\n state.domainI_latest = debugState.domainI;\n devLog('4.10B Setup: \u2713 alpha_v0 seeded on server.');\n\n // Copy evolved delegate and domain tip to remoteSpace\n await copyIdentitiesToSpace({ domainI: debugState.domainI!, metaspace, fromSpace: space, toSpace: remoteSpace });\n\n // 4. Create Round 2 Divergence:\n // Client (default space): Create beta, mutate alpha fieldA, relate alpha to beta\n const resBeta = await factory.firstGen({\n parentIbGib: ROOT,\n ib: 'timeline_root_beta_4_10b',\n data: { fieldA: 'beta field A created on source', label: 'BetaRoot', random: Math.random() },\n dna: true,\n nCounter: true,\n tjp: { uuid: true, timestamp: true }\n });\n const beta_v0_source = resBeta.newIbGib;\n await metaspace.persistTransformResult({ resTransform: resBeta, space });\n await metaspace.registerNewIbGib({ ibGib: beta_v0_source, space });\n state.r2_beta_v0_source = beta_v0_source;\n const beta_tjpAddr = getTjpAddr({ ibGib: beta_v0_source, defaultIfNone: 'incomingAddr' })!;\n state.beta_tjpAddr = beta_tjpAddr;\n\n const r2_alpha_v1_source_sansBeta = await mut8Timeline({\n timeline: alpha_v0,\n mut8Opts: {\n mut8Ib: alpha_v0.ib + '_r2client',\n dataToAddOrPatch: { fieldA: 'source_edit_r2' }\n },\n metaspace,\n space,\n });\n devLog(`r2_alpha_v1_source_sansBeta.gib: ${r2_alpha_v1_source_sansBeta.gib}`)\n\n betaAddr = getIbGibAddr({ ibGib: beta_v0_source });\n const r2_alpha_v2_source_rel8dBeta = await appendToTimeline({\n timeline: r2_alpha_v1_source_sansBeta,\n metaspace,\n space,\n rel8nInfos: [\n { rel8nName: TEST_REL8N_NAME, ibGibs: [beta_v0_source] }\n ]\n });\n state.r2_alpha_v3_source_rel8beta = r2_alpha_v2_source_rel8dBeta;\n devLog(`r2_alpha_v2_source_rel8dBeta.gib: ${r2_alpha_v2_source_rel8dBeta.gib}`)\n devLog('4.10B Setup: \u2713 Created client Round 2 edits (alpha fieldA edit + relate beta).');\n\n // Remote Space: Mutate alpha fieldB\n const r2_alpha_v1_remote = await mut8Timeline({\n timeline: alpha_v0,\n mut8Opts: {\n mut8Ib: alpha_v0.ib + '_r2remote',\n dataToAddOrPatch: { fieldB: 'remote_edit_r2' }\n },\n metaspace,\n space: remoteSpace,\n });\n console.log(`alpha_v0: ${pretty(alpha_v0)}`)\n console.log(`r2_alpha_v1_remote: ${pretty(r2_alpha_v1_remote)}`)\n devLog(`r2_alpha_v1_remote.gib: ${r2_alpha_v1_remote.gib}`)\n\n // Sync remote Round 2 edit to server\n devLog('4.10B Setup: Pushing remote Round 2 edit to server...');\n await runSyncPassFromSpace({\n domainIbGibs: [r2_alpha_v1_remote],\n passLabel: 'Push remote Round 2 edit',\n metaspace,\n space: remoteSpace,\n primarySpace: space,\n domainI: debugState.domainI!,\n masterSecret: 'test-sender-secret-phase4-10b'\n });\n state.domainI_latest = debugState.domainI;\n\n devLog('\u2713 4.10B Setup Complete! Ready for 4.10B Sync (which runs Round 2, 3, and 4 in succession).');\n btn.textContent = '\u2713 4.10B Setup Complete';\n\n const syncBtn = document.getElementById('btn-4-10b-sync') as HTMLButtonElement | null;\n if (syncBtn) { syncBtn.disabled = false; }\n\n } catch (error) {\n devLog(`\u2717 4.10B Setup FAILED: ${extractErrorMsg(error)}`);\n console.error(error);\n btn.disabled = false;\n }\n });\n}\n// #endregion Phase 4.10B Setup\n\nlet gammaAddr: IbGibAddr | undefined = undefined;\nlet betaAddr: IbGibAddr | undefined = undefined;\n// #region Phase 4.10B Sync Execution\nexport function init4_10bSyncButton(): void {\n const btn = document.getElementById('btn-4-10b-sync') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', async () => {\n try {\n btn.disabled = true;\n devLog('4.10B Sync: Initiating WebSocket Sync for Round 2, 3, and 4 sequential evolution...');\n\n let domainI = state.domainI_latest!;\n const remoteSpace = state.remoteSpace;\n const alpha_tjpAddr = state.alpha_tjpAddr!;\n const beta_tjpAddr = state.beta_tjpAddr!;\n const alpha_v0 = state.alpha_v0!;\n\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({}) as any;\n if (!space) { throw new Error(\"No default space.\"); }\n\n const protocol = location.protocol === 'https:' ? 'wss:' : 'ws:';\n const domainAddr = getIbGibAddr({ ibGib: state.domainI_initial! });\n\n // ----------------------------------------------------\n // #region Round 2 Sync\n // ----------------------------------------------------\n devLog('4.10B Sync: Running Round 2 Sync (merging divergent alpha edits)...');\n await runSyncPass({\n domainIbGibs: [state.r2_alpha_v3_source_rel8beta],\n passLabel: 'Sync divergent alpha edits R2',\n metaspace,\n space\n });\n state.domainI_latest = debugState.domainI;\n devLog('4.10B Sync: \u2713 Round 2 Sync complete.');\n\n // Copy evolved delegate and domain tip to remoteSpace\n await copyIdentitiesToSpace({ domainI: debugState.domainI!, metaspace, fromSpace: space, toSpace: remoteSpace });\n // #endregion Round 2 Sync\n\n // ----------------------------------------------------\n // #region Round 3 Divergence & Sync\n // ----------------------------------------------------\n devLog('4.10B Sync: Preparing Round 3 divergence (multiple conflicting timelines)...');\n // Client: Mutate alpha (fieldC), mutate beta (betaFieldA)\n const clientKV_R2 = await new SyncSagaCoordinator().getKnowledgeMap({\n domainIbGibs: [state.r2_alpha_v3_source_rel8beta, state.r2_beta_v0_source],\n space,\n metaspace,\n });\n const alpha_tipAddr_R2_client = clientKV_R2[alpha_tjpAddr];\n const beta_tipAddr_R2_client = clientKV_R2[beta_tjpAddr];\n\n const resGetAlphaClientR2 = await metaspace.get({ addr: alpha_tipAddr_R2_client!, space });\n const resGetBetaClientR2 = await metaspace.get({ addr: beta_tipAddr_R2_client!, space });\n\n const r3_alpha_v4_source = await mut8Timeline({\n timeline: resGetAlphaClientR2.ibGibs![0],\n mut8Opts: {\n mut8Ib: alpha_v0.ib + '_r3client',\n dataToAddOrPatch: { fieldC: 'source_edit_r3' }\n },\n metaspace,\n space,\n });\n\n const r3_beta_v1_source = await mut8Timeline({\n timeline: resGetBetaClientR2.ibGibs![0],\n mut8Opts: {\n mut8Ib: state.r2_beta_v0_source.ib + '_r3client',\n dataToAddOrPatch: { betaFieldA: 'source_beta_edit_r3' }\n },\n metaspace,\n space,\n });\n\n // Remote: Sync remote to latest merged tips, then mutate alpha (fieldD), mutate beta (betaFieldB)\n devLog('4.10B Sync: Updating remote space to latest merged tips...');\n\n // Query remoteSpace for its latest tips to initiate sync\n const alphaLatestAddrRemoteR3 = await metaspace.getLatestAddr({ addr: alpha_tjpAddr, space: remoteSpace });\n const resGetAlphaRemoteTipR3 = await metaspace.get({ addr: alphaLatestAddrRemoteR3!, space: remoteSpace });\n const alphaRemoteTipR3 = resGetAlphaRemoteTipR3.ibGibs![0];\n\n const domainIbGibsRemoteR3 = [alphaRemoteTipR3];\n\n const betaLatestAddrRemoteR3 = await metaspace.getLatestAddr({ addr: beta_tjpAddr, space: remoteSpace });\n if (betaLatestAddrRemoteR3) {\n const resGetBetaRemoteTipR3 = await metaspace.get({ addr: betaLatestAddrRemoteR3, space: remoteSpace });\n domainIbGibsRemoteR3.push(resGetBetaRemoteTipR3.ibGibs![0]);\n }\n\n // Sync remote space to pull merged alpha and beta from server\n await runSyncPassFromSpace({\n domainIbGibs: domainIbGibsRemoteR3,\n passLabel: 'Pull merged R2 tips to remoteSpace',\n metaspace,\n space: remoteSpace,\n primarySpace: space,\n domainI: debugState.domainI!,\n masterSecret: 'test-sender-secret-phase4-10b'\n });\n state.domainI_latest = debugState.domainI;\n\n\n\n // Now mutate alpha (fieldD) and beta (betaFieldB) in remote space\n const remoteKV_R3 = await new SyncSagaCoordinator().getKnowledgeMap({ space: remoteSpace, metaspace, domainIbGibs: [alpha_v0, state.r2_beta_v0_source] });\n const alpha_tipAddr_R2_remote = remoteKV_R3[alpha_tjpAddr];\n const beta_tipAddr_R2_remote = remoteKV_R3[beta_tjpAddr];\n\n const resGetAlphaRemoteR2 = await metaspace.get({ addr: alpha_tipAddr_R2_remote!, space: remoteSpace });\n const resGetBetaRemoteR2 = await metaspace.get({ addr: beta_tipAddr_R2_remote!, space: remoteSpace });\n\n const r3_alpha_v4_remote = await mut8Timeline({\n timeline: resGetAlphaRemoteR2.ibGibs![0],\n mut8Opts: {\n mut8Ib: alpha_v0.ib + '_r3remote',\n dataToAddOrPatch: { fieldD: 'remote_edit_r3' }\n },\n metaspace,\n space: remoteSpace,\n });\n\n const r3_beta_v1_remote = await mut8Timeline({\n timeline: resGetBetaRemoteR2.ibGibs![0],\n mut8Opts: {\n mut8Ib: state.r2_beta_v0_source.ib + '_r3remote',\n dataToAddOrPatch: { betaFieldB: 'remote_beta_edit_r3' }\n },\n metaspace,\n space: remoteSpace,\n });\n\n // Sync remote Round 3 edits to server\n devLog('4.10B Sync: Pushing remote Round 3 edits to server...');\n await runSyncPassFromSpace({\n domainIbGibs: [r3_alpha_v4_remote, r3_beta_v1_remote],\n passLabel: 'Push remote Round 3 edits',\n metaspace,\n space: remoteSpace,\n primarySpace: space,\n domainI: debugState.domainI!,\n masterSecret: 'test-sender-secret-phase4-10b'\n });\n state.domainI_latest = debugState.domainI;\n\n // Sync Client Round 3 edits to server (merges client and server)\n devLog('4.10B Sync: Running Round 3 Client Sync (merging alpha & beta divergence)...');\n await runSyncPass({\n domainIbGibs: [r3_alpha_v4_source, r3_beta_v1_source],\n passLabel: 'Sync Client Round 3 edits',\n metaspace,\n space\n });\n state.domainI_latest = debugState.domainI;\n devLog('4.10B Sync: \u2713 Round 3 Sync complete.');\n\n // Copy evolved delegate and domain tip to remoteSpace\n await copyIdentitiesToSpace({ domainI: debugState.domainI!, metaspace, fromSpace: space, toSpace: remoteSpace });\n // #endregion Round 3 Divergence & Sync\n\n // ----------------------------------------------------\n // #region Round 4 Divergence & Sync\n // ----------------------------------------------------\n devLog('4.10B Sync: Preparing Round 4 divergence (post-graft chain edits & new timeline)...');\n const clientKV_R3 = await new SyncSagaCoordinator().getKnowledgeMap({ space, metaspace, domainIbGibs: [alpha_v0, state.r2_beta_v0_source] });\n const alpha_tipAddr_R3_client = clientKV_R3[alpha_tjpAddr];\n const beta_tipAddr_R3_client = clientKV_R3[beta_tjpAddr];\n\n const resGetAlphaClientR3 = await metaspace.get({ addr: alpha_tipAddr_R3_client!, space });\n const resGetBetaClientR3 = await metaspace.get({ addr: beta_tipAddr_R3_client!, space });\n\n // Client: Mutate alpha (fieldE), create gamma, relate alpha to gamma (v6), mutate alpha (fieldF). Mutate beta (betaFieldD).\n const r4_alpha_v5_source = await mut8Timeline({\n timeline: resGetAlphaClientR3.ibGibs![0],\n mut8Opts: {\n mut8Ib: alpha_v0.ib + '_r4client_v5',\n dataToAddOrPatch: { fieldE: 'source_edit_r4_v5' }\n },\n metaspace,\n space,\n });\n\n // Create gamma\n const resGamma = await factory.firstGen({\n parentIbGib: ROOT,\n ib: 'timeline_root_gamma_4_10b',\n data: { gammaField: 'gamma created on client', label: 'GammaRoot', random: Math.random() },\n dna: true,\n nCounter: true,\n tjp: { uuid: true, timestamp: true }\n });\n const gamma_v0_source = resGamma.newIbGib;\n await metaspace.persistTransformResult({ resTransform: resGamma, space });\n await metaspace.registerNewIbGib({ ibGib: gamma_v0_source, space });\n const gamma_tjpAddr = getTjpAddr({ ibGib: gamma_v0_source, defaultIfNone: 'incomingAddr' })!;\n state.gamma_tjpAddr = gamma_tjpAddr;\n\n // Relate alpha to gamma\n gammaAddr = getIbGibAddr({ ibGib: gamma_v0_source });\n const r4_alpha_v6_source_rel8dGamma = await appendToTimeline({\n timeline: r4_alpha_v5_source,\n metaspace,\n space,\n rel8nInfos: [\n { rel8nName: TEST_REL8N_NAME, ibGibs: [gamma_v0_source] }\n ]\n });\n\n // Mutate alpha again (fieldF)\n const r4_alpha_v7_source = await mut8Timeline({\n timeline: r4_alpha_v6_source_rel8dGamma,\n mut8Opts: {\n mut8Ib: alpha_v0.ib + '_r4client_v7',\n dataToAddOrPatch: { fieldF: 'source_edit_r4_v7' }\n },\n metaspace,\n space,\n });\n\n // Mutate beta (betaFieldD)\n const r4_beta_v2_source = await mut8Timeline({\n timeline: resGetBetaClientR3.ibGibs![0],\n mut8Opts: {\n mut8Ib: state.r2_beta_v0_source.ib + '_r4client_v2',\n dataToAddOrPatch: { betaFieldD: 'source_beta_edit_r4_v2' }\n },\n metaspace,\n space,\n });\n\n // Remote: Sync remote to latest merged tips, then mutate alpha (fieldG), mutate beta (betaFieldC)\n devLog('4.10B Sync: Updating remote space to Round 3 merged tips...');\n\n // Query remoteSpace for its latest tips to initiate sync\n const alphaLatestAddrRemoteR4 = await metaspace.getLatestAddr({ addr: alpha_tjpAddr, space: remoteSpace });\n const resGetAlphaRemoteTipR4 = await metaspace.get({ addr: alphaLatestAddrRemoteR4!, space: remoteSpace });\n const alphaRemoteTipR4 = resGetAlphaRemoteTipR4.ibGibs![0];\n\n const domainIbGibsRemoteR4 = [alphaRemoteTipR4];\n\n const betaLatestAddrRemoteR4 = await metaspace.getLatestAddr({ addr: beta_tjpAddr, space: remoteSpace });\n if (betaLatestAddrRemoteR4) {\n const resGetBetaRemoteTipR4 = await metaspace.get({ addr: betaLatestAddrRemoteR4, space: remoteSpace });\n domainIbGibsRemoteR4.push(resGetBetaRemoteTipR4.ibGibs![0]);\n }\n\n await runSyncPassFromSpace({\n domainIbGibs: domainIbGibsRemoteR4,\n passLabel: 'Pull merged R3 tips to remoteSpace',\n metaspace,\n space: remoteSpace,\n primarySpace: space,\n domainI: debugState.domainI!,\n masterSecret: 'test-sender-secret-phase4-10b'\n });\n state.domainI_latest = debugState.domainI;\n\n // Mutate alpha (fieldG) and beta (betaFieldC) in remote space\n const remoteKV_R4 = await new SyncSagaCoordinator().getKnowledgeMap({ space: remoteSpace, metaspace, domainIbGibs: [alpha_v0, state.r2_beta_v0_source] });\n const alpha_tipAddr_R3_remote = remoteKV_R4[alpha_tjpAddr];\n const beta_tipAddr_R3_remote = remoteKV_R4[beta_tjpAddr];\n\n const resGetAlphaRemoteR3 = await metaspace.get({ addr: alpha_tipAddr_R3_remote!, space: remoteSpace });\n const resGetBetaRemoteR3 = await metaspace.get({ addr: beta_tipAddr_R3_remote!, space: remoteSpace });\n\n const r4_alpha_v5_remote = await mut8Timeline({\n timeline: resGetAlphaRemoteR3.ibGibs![0],\n mut8Opts: {\n mut8Ib: alpha_v0.ib + '_r4remote_v5',\n dataToAddOrPatch: { fieldG: 'remote_edit_r4_v5' }\n },\n metaspace,\n space: remoteSpace,\n });\n\n const r4_beta_v2_remote = await mut8Timeline({\n timeline: resGetBetaRemoteR3.ibGibs![0],\n mut8Opts: {\n mut8Ib: state.r2_beta_v0_source.ib + '_r4remote_v2',\n dataToAddOrPatch: { betaFieldC: 'remote_beta_edit_r4_v2' }\n },\n metaspace,\n space: remoteSpace,\n });\n\n // Sync remote edits to server\n devLog('4.10B Sync: Pushing remote Round 4 edits to server...');\n await runSyncPassFromSpace({\n domainIbGibs: [r4_alpha_v5_remote, r4_beta_v2_remote],\n passLabel: 'Push remote Round 4 edits',\n metaspace,\n space: remoteSpace,\n primarySpace: space,\n domainI: debugState.domainI!,\n masterSecret: 'test-sender-secret-phase4-10b'\n });\n state.domainI_latest = debugState.domainI;\n\n // Sync Client Round 4 edits to server (merges client and server final states)\n devLog('4.10B Sync: Running final Round 4 Client Sync (merging alpha, beta, and propagating gamma)...');\n await runSyncPass({\n domainIbGibs: [r4_alpha_v7_source, r4_beta_v2_source, gamma_v0_source],\n passLabel: 'Sync final Round 4 edits',\n metaspace,\n space\n });\n state.domainI_latest = debugState.domainI;\n\n devLog('\u2713 4.10B Sync: All rounds of divergent edits and merges complete!');\n btn.textContent = '\u2713 4.10B Sync Complete';\n\n const checkBtn = document.getElementById('btn-4-10b-check') as HTMLButtonElement | null;\n if (checkBtn) { checkBtn.disabled = false; }\n // #endregion Round 4 Divergence & Sync\n\n } catch (error) {\n devLog(`\u2717 4.10B Sync FAILED: ${extractErrorMsg(error)}`);\n console.error(error);\n btn.disabled = false;\n }\n });\n}\n// #endregion Phase 4.10B Sync Execution\n\n// #region Phase 4.10B Check/Verification\nexport function init4_10bCheckButton(): void {\n const btn = document.getElementById('btn-4-10b-check') as HTMLButtonElement | null;\n if (!btn) { return; }\n btn.addEventListener('click', async () => {\n try {\n btn.disabled = true;\n devLog('4.10B Check: Verifying multi-round merged timelines on client and server...');\n\n const domainI = state.domainI_latest!;\n const alpha_tjpAddr = state.alpha_tjpAddr!;\n const beta_tjpAddr = state.beta_tjpAddr!;\n const gamma_tjpAddr = state.gamma_tjpAddr!;\n\n const metaspace = await getGlobalMetaspace_waitIfNeeded();\n const space = await metaspace.getLocalUserSpace({}) as any;\n if (!space) { throw new Error(\"No default space.\"); }\n\n const domainAddr = getIbGibAddr({ ibGib: state.domainI_initial! });\n\n // 1. Get Client tips\n const clientKV = await new SyncSagaCoordinator().getKnowledgeMap({\n space,\n metaspace,\n domainIbGibs: [state.domainI_initial!] // Just a dummy domain to satisfy API or look up by root address\n });\n\n // Get absolute tips from space\n const clientAlphaTipAddr = await metaspace.getLatestAddr({ addr: alpha_tjpAddr, space });\n const clientBetaTipAddr = await metaspace.getLatestAddr({ addr: beta_tjpAddr, space });\n const clientGammaTipAddr = await metaspace.getLatestAddr({ addr: gamma_tjpAddr, space });\n\n if (!clientAlphaTipAddr || !clientBetaTipAddr || !clientGammaTipAddr) {\n throw new Error(\"Client space is missing timeline tips for Alpha, Beta, or Gamma.\");\n }\n\n const resGetAlpha = await metaspace.get({ addr: clientAlphaTipAddr, space });\n const resGetBeta = await metaspace.get({ addr: clientBetaTipAddr, space });\n\n const alphaTip = resGetAlpha.ibGibs![0];\n const betaTip = resGetBeta.ibGibs![0];\n\n // Assertions for Alpha data values\n if (alphaTip.data?.fieldA !== 'source_edit_r2') {\n throw new Error(`Alpha fieldA mismatch! Expected 'source_edit_r2', got '${alphaTip.data?.fieldA}'`);\n }\n if (alphaTip.data?.fieldB !== 'remote_edit_r2') {\n throw new Error(`Alpha fieldB mismatch! Expected 'remote_edit_r2', got '${alphaTip.data?.fieldB}'`);\n }\n if (alphaTip.data?.fieldC !== 'source_edit_r3') {\n throw new Error(`Alpha fieldC mismatch! Expected 'source_edit_r3', got '${alphaTip.data?.fieldC}'`);\n }\n if (alphaTip.data?.fieldD !== 'remote_edit_r3') {\n throw new Error(`Alpha fieldD mismatch! Expected 'remote_edit_r3', got '${alphaTip.data?.fieldD}'`);\n }\n if (alphaTip.data?.fieldE !== 'source_edit_r4_v5') {\n throw new Error(`Alpha fieldE mismatch! Expected 'source_edit_r4_v5', got '${alphaTip.data?.fieldE}'`);\n }\n if (alphaTip.data?.fieldF !== 'source_edit_r4_v7') {\n throw new Error(`Alpha fieldF mismatch! Expected 'source_edit_r4_v7', got '${alphaTip.data?.fieldF}'`);\n }\n if (alphaTip.data?.fieldG !== 'remote_edit_r4_v5') {\n throw new Error(`Alpha fieldG mismatch! Expected 'remote_edit_r4_v5', got '${alphaTip.data?.fieldG}'`);\n }\n devLog('4.10B Check: \u2713 Client Alpha merged tip contains all Round 2, 3, and 4 edits.');\n\n // Assertions for Beta data values\n if (betaTip.data?.betaFieldA !== 'source_beta_edit_r3') {\n throw new Error(`Beta betaFieldA mismatch! Expected 'source_beta_edit_r3', got '${betaTip.data?.betaFieldA}'`);\n }\n if (betaTip.data?.betaFieldB !== 'remote_beta_edit_r3') {\n throw new Error(`Beta betaFieldB mismatch! Expected 'remote_beta_edit_r3', got '${betaTip.data?.betaFieldB}'`);\n }\n if (betaTip.data?.betaFieldC !== 'remote_beta_edit_r4_v2') {\n throw new Error(`Beta betaFieldC mismatch! Expected 'remote_beta_edit_r4_v2', got '${betaTip.data?.betaFieldC}'`);\n }\n if (betaTip.data?.betaFieldD !== 'source_beta_edit_r4_v2') {\n throw new Error(`Beta betaFieldD mismatch! Expected 'source_beta_edit_r4_v2', got '${betaTip.data?.betaFieldD}'`);\n }\n devLog('4.10B Check: \u2713 Client Beta merged tip contains all Round 3 and 4 edits.');\n\n // Verify alpha's relation to gamma\n const rels = alphaTip.rel8ns?.[TEST_REL8N_NAME] || [];\n if (!betaAddr) { throw new Error(`(UNEXPECTED) betaAddr falsy? (E: 81c032ae7a93bddfd8eed6664d314826)`); }\n if (!rels.includes(betaAddr)) {\n throw new Error(\"Client Alpha tip is missing relation to Beta timeline.\");\n }\n if (!gammaAddr) { throw new Error(`(UNEXPECTED) gammaAddr falsy? (E: 12220a81d3b86385d1683d5a6bae5826)`); }\n if (!rels.includes(gammaAddr)) {\n throw new Error(\"Client Alpha tip is missing relation to Gamma timeline.\");\n }\n devLog('4.10B Check: \u2713 Client Alpha tip retains relation to Gamma.');\n\n // 2. Check server tips\n const apiBridge = new SpaceGibApiBridge();\n devLog('4.10B Check: Fetching server timeline graphs...');\n const resServerGraphAlpha = await apiBridge.getIbGibGraph(domainAddr, clientAlphaTipAddr, true);\n const resServerGraphBeta = await apiBridge.getIbGibGraph(domainAddr, clientBetaTipAddr, true);\n\n if (!resServerGraphAlpha.success || !resServerGraphAlpha.graph || !resServerGraphBeta.success || !resServerGraphBeta.graph) {\n throw new Error(\"Failed to fetch merged graphs from server.\");\n }\n\n const serverAlphaTip = resServerGraphAlpha.graph[clientAlphaTipAddr];\n const serverBetaTip = resServerGraphBeta.graph[clientBetaTipAddr];\n\n if (!serverAlphaTip || !serverBetaTip) {\n throw new Error(\"Server is missing the final merged tips for Alpha or Beta.\");\n }\n\n if (serverAlphaTip.data?.fieldF !== 'source_edit_r4_v7' || serverAlphaTip.data?.fieldG !== 'remote_edit_r4_v5') {\n throw new Error(\"Server Alpha tip does not match final client merged state.\");\n }\n if (serverBetaTip.data?.betaFieldC !== 'remote_beta_edit_r4_v2' || serverBetaTip.data?.betaFieldD !== 'source_beta_edit_r4_v2') {\n throw new Error(\"Server Beta tip does not match final client merged state.\");\n }\n devLog('4.10B Check: \u2713 Server tips match client merged states perfectly.');\n\n devLog('\u2713 4.10B Check SUCCESS: Advanced multi-round/timeline conflict resolved and verified on both client and server!');\n btn.textContent = '\u2713 4.10B Check Success';\n\n } catch (error) {\n devLog(`\u2717 4.10B Check FAILED: ${extractErrorMsg(error)}`);\n console.error(error);\n btn.disabled = false;\n }\n });\n}\n// #endregion Phase 4.10B Check/Verification\n", "/**\n * @module client/dev-tools\n *\n * Facade entry point for Dev Tools panel button handlers.\n * Imports and wires up all modular sub-file handlers under dev-tools/.\n */\n\nimport { extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';\n\nimport { devLog, debugState, lc } from './dev-tools/common.mjs';\nimport {\n initWsTestButton, initPrintStateButton, initCreateDomainKeystoneButton,\n initCreateTestIbGibButton, initCreateSessionKeystoneButton\n} from './dev-tools/base-tools.mjs';\nimport { init1bSetupButton, init1bSyncButton, init1bCheckButton } from './dev-tools/phase-1.mjs';\nimport { init2bSetupButton, init2bSyncButton, init2bCheckButton } from './dev-tools/phase-2.mjs';\nimport { init3bSetupButton, init3bSyncButton, init3bCheckButton } from './dev-tools/phase-3.mjs';\nimport { init4_1bSetupButton, init4_1bSyncButton, init4_1bCheckButton } from './dev-tools/phase-4-1.mjs';\nimport { init4_2bSetupButton, init4_2bSyncButton, init4_2bCheckButton } from './dev-tools/phase-4-2.mjs';\nimport { init4_3bSetupButton, init4_3bSyncButton, init4_3bCheckButton } from './dev-tools/phase-4-3.mjs';\nimport { init4_4bSetupButton, init4_4bSyncButton, init4_4bCheckButton } from './dev-tools/phase-4-4.mjs';\nimport { init4_5bSetupButton, init4_5bSyncButton, init4_5bCheckButton } from './dev-tools/phase-4-5.mjs';\nimport { init4_6bSetupButton, init4_6bSyncButton, init4_6bCheckButton } from './dev-tools/phase-4-6.mjs';\nimport { init4_7bSetupButton, init4_7bSyncButton, init4_7bCheckButton } from './dev-tools/phase-4-7.mjs';\nimport { init4_8bSetupButton, init4_8bSyncButton, init4_8bCheckButton } from './dev-tools/phase-4-8.mjs';\nimport { init4_9bSetupButton, init4_9bSyncButton, init4_9bCheckButton } from './dev-tools/phase-4-9.mjs';\nimport { init4_10bSetupButton, init4_10bSyncButton, init4_10bCheckButton } from './dev-tools/phase-4-10.mjs';\n\nexport { devLog, debugState };\n\n/**\n * Call once inside DOMContentLoaded to wire up all dev-tool buttons.\n */\nexport function initDevTools(): void {\n const lc_fn = `${lc}[initDevTools]`;\n try {\n const selectEl = document.getElementById('dev-tools-row-select') as HTMLSelectElement | null;\n if (selectEl) {\n selectEl.addEventListener('change', () => {\n const val = selectEl.value;\n const rows = document.querySelectorAll('.dev-panel-row-container') as NodeListOf<HTMLElement>;\n rows.forEach(row => {\n const rowId = row.getAttribute('data-row-id');\n if (val === 'all' || rowId === val) {\n row.style.display = 'flex';\n } else {\n row.style.display = 'none';\n }\n });\n });\n // Trigger change event to initialize display:\n selectEl.dispatchEvent(new Event('change'));\n }\n\n initPrintStateButton();\n initCreateDomainKeystoneButton();\n initWsTestButton();\n initCreateTestIbGibButton();\n initCreateSessionKeystoneButton();\n init1bSetupButton();\n init1bSyncButton();\n init1bCheckButton();\n init2bSetupButton();\n init2bSyncButton();\n init2bCheckButton();\n init3bSetupButton();\n init3bSyncButton();\n init3bCheckButton();\n init4_1bSetupButton();\n init4_1bSyncButton();\n init4_1bCheckButton();\n init4_2bSetupButton();\n init4_2bSyncButton();\n init4_2bCheckButton();\n init4_3bSetupButton();\n init4_3bSyncButton();\n init4_3bCheckButton();\n init4_4bSetupButton();\n init4_4bSyncButton();\n init4_4bCheckButton();\n init4_5bSetupButton();\n init4_5bSyncButton();\n init4_5bCheckButton();\n init4_6bSetupButton();\n init4_6bSyncButton();\n init4_6bCheckButton();\n init4_7bSetupButton();\n init4_7bSyncButton();\n init4_7bCheckButton();\n init4_8bSetupButton();\n init4_8bSyncButton();\n init4_8bCheckButton();\n init4_9bSetupButton();\n init4_9bSyncButton();\n init4_9bCheckButton();\n init4_10bSetupButton();\n init4_10bSyncButton();\n init4_10bCheckButton();\n } catch (error) {\n console.error(`${lc_fn} ${extractErrorMsg(error)}`);\n }\n}\n", "import { extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';\n\nimport { GLOBAL_LOG_A_LOT, APP_CONFIG } from './constants.mjs';\nimport {\n initIbGibStorage,\n initIbGibGlobalThis,\n dynamicallyLoadBootstrapScript,\n} from './helpers.web.mjs';\nimport { initDevTools } from './dev-tools.mjs';\n\ninitIbGibGlobalThis(APP_CONFIG);\n\nconst logalot = GLOBAL_LOG_A_LOT;\n\n/**\n * hmm\n * Initiates startup without blocking DOMContentLoaded.\n *\n * Sequence:\n * 1. Init IndexedDB storage\n * 2. Dynamically import bootstrap.mts \u2014 the heavy ibgib graph loads here\n */\nasync function spinOffStartup(): Promise<void> {\n const lc = `[${spinOffStartup.name}]`;\n try {\n if (logalot) { console.log(`${lc} starting... (I: 3d893846d02c4ff49181f9b8e586eb74)`); }\n console.time(lc);\n\n document.addEventListener('DOMContentLoaded', async () => {\n try {\n console.timeLog(lc, 'DOMContentLoaded fired');\n\n await initIbGibStorage(APP_CONFIG);\n console.timeLog(lc, 'initIbGibStorage complete');\n\n await dynamicallyLoadBootstrapScript('./bootstrap.mjs');\n console.timeLog(lc, 'dynamicallyLoadBootstrapScript complete');\n\n initDevTools();\n console.timeLog(lc, 'initDevTools complete');\n\n console.timeEnd(lc);\n } catch (error) {\n console.error(`${lc} ${extractErrorMsg(error)}`);\n throw error;\n }\n });\n\n } catch (error) {\n console.timeEnd(lc);\n debugger; // error in index.mts \u2014 investigate immediately\n console.error(`${lc} ${extractErrorMsg(error)}`);\n throw error;\n } finally {\n if (logalot) { console.log(`${lc} complete.`); }\n }\n}\n\nspinOffStartup();\n"],
|
|
5
|
+
"mappings": "gkBAEO,IAAMA,GAAY,OAEZC,GAAsB,UAKtBC,GAAiC,sBAGjCC,GAAkB,OAClBC,GAAiB,MACjBC,GAAmB,QACnBC,GAAoB,SAQpBC,EAAY,CAIrB,KAAMJ,GAIN,IAAKC,GAIL,MAAOC,GAIP,OAAQC,IAECE,GAA0B,OAAO,OAAOD,CAAS,EAIjDE,GAA+B,QAC/BC,GAA8C,8CAU9CC,GAAuB,CAIhC,MAAOF,GAWP,kBAAmBC,IAGVE,GAAsC,OAAO,OAAOD,EAAoB,EAC/E,SAAUE,GAA4BC,EAAgB,CACxD,OAAOF,GAAoC,SAASE,CAAgC,CACxF,CAFgBC,EAAAF,GAAA,+BC/DT,IAAMG,GAAiB,OACjBC,GAAiB,OACjBC,GAAiB,OAKjBC,GAAW,CACpB,KAAMH,GACN,KAAMC,GACN,KAAMC,IAEGE,GAAyB,OAAO,OAAOD,EAAQ,EAOrD,IAAME,GAAgC,SAChCC,GAAkC,WAWlCC,GAAsB,CAI/B,OAAQF,GAMR,SAAUC,IAEDE,GAAsC,OAAO,OAAOD,EAAmB,EC3CpF,IAAME,GAAU,GAOV,SAAUC,GAAc,CAC1B,KAAAC,EACA,SAAAC,EACA,iCAAAC,CAAgC,EAqBnC,CACG,IAAMC,EAAK,IAAIJ,GAAc,IAAI,IACjC,GAAI,CACID,IAAW,QAAQ,IAAI,GAAGK,CAAE,oDAAoD,EAEpF,IAAIC,EAAiC,GAErC,QAASC,EAAI,EAAGA,EAAIL,EAAK,OAAQK,IAC7B,GAAIL,EAAKK,CAAC,IAAMJ,EAASI,CAAC,EAAG,CACzBD,EAAiC,GACjC,KACJ,CAGJ,GAAIF,GAAoC,CAACE,EACrC,MAAM,IAAI,MAAM,sLAAsLJ,CAAI,eAAeC,CAAQ,yCAAyC,EAG9Q,IAAIK,EACJ,GAAIF,EAEAE,EAAmBL,EAAS,MAAMD,EAAK,MAAM,MAC1C,CAGHM,EAAmB,CAAA,EACnB,QAAWC,KAAgBN,EAClBD,EAAK,SAASO,CAAY,GAC3BD,EAAiB,KAAKC,CAAY,CAG9C,CAEA,OAAOD,CACX,OAASE,EAAO,CACZ,cAAQ,MAAM,GAAGL,CAAE,IAAIM,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQV,IAAW,QAAQ,IAAI,GAAGK,CAAE,YAAY,CAChD,CACJ,CAhEgBO,EAAAX,GAAA,iBA8EhB,eAAsBY,GAAgB,CAClC,IAAAC,EACA,sBAAAC,EACA,+CAAAC,EACA,eAAAC,CAAc,EA2BjB,CACG,IAAMZ,EAAK,IAAIQ,GAAgB,IAAI,IACnC,GAAI,CACA,GAAIG,EAA+C,OAAS,EAAG,CAC3D,IAAME,EAAiBF,EAA+C,OAAO,EAAG,CAAC,EAAE,CAAC,EAE9EG,EACFF,EAAe,OAAOG,GAAKC,EAAa,CAAE,MAAOD,CAAC,CAAE,IAAMF,CAAc,EACxEI,EACJ,GAAIH,EAA2B,OAAS,EACpCG,EAAWH,EAA2B,CAAC,MAMvC,OAAM,IAAI,MAAM,4DAA4DD,CAAc,yCAAyC,EAKvI,IAAIK,EAAeC,GAAMF,EAAS,IAAI,EACtCC,EAAa,IAAMT,EACnBS,EAAa,QAAUF,EAAa,CAAE,MAAOP,CAAG,CAAE,EAClD,IAAIW,EACJ,OAAQF,EAAa,KAAM,CACvB,IAAK,OACDE,EAAe,MAAMC,GAAKH,CAAiD,EAC3E,MACJ,IAAK,OACDE,EAAe,MAAME,GAAKJ,CAA4C,EACtE,MACJ,IAAK,OACD,MAAM,IAAI,MAAM,uSAAuS,EAC3T,QACI,MAAM,IAAI,MAAM,kCAAkCA,EAAa,IAAI,sBAAsBL,CAAc,4HAA4H,CAC3O,CAUA,IAPCO,EAAa,oBAAsB,CAAA,GAAI,QAAQL,GAAKL,EAAsB,KAAKK,CAAC,CAAC,GACjFK,EAAa,MAAQ,CAAA,GAAI,QAAQL,GAAKL,EAAsB,KAAKK,CAAC,CAAC,EACpEL,EAAsB,KAAKU,EAAa,QAAQ,GAK3CA,EAAa,MAAQ,CAAA,GAAI,OAAS,GACnC,GAAI,CAACA,EAAa,KAAM,KAAKL,GAAKC,EAAaD,CAAC,IAAMF,CAAc,EAEhE,MAAM,IAAI,MAAM,GAAGb,CAAE,sFAAsFa,CAAc,wCAAwC,OAGrK,QAAQ,KAAK,GAAGb,CAAE,yEAAyEa,CAAc,uCAAuC,EAKpJ,OAAO,MAAML,GAAgB,CACzB,IAAKY,EAAa,SAClB,sBAAAV,EACA,+CAAgDC,EAChD,eAAAC,EACH,CACL,KAGI,QAAIF,EAAsB,SAAW,GACjC,QAAQ,KAAK,GAAGV,CAAE,6MAA6M,EAE5NS,CAEf,OAASJ,EAAO,CACZ,cAAQ,MAAM,GAAGL,CAAE,IAAIM,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,CACJ,CA1GsBE,EAAAC,GAAA,mBC/Ff,IAAMe,GAAkB,YAClBC,GAAwBD,GAGxBE,GAAuB,mBAEvBC,GAAwB,OAExBC,GAA0B,SAE1BC,GAA8B,aAI9BC,GAA0B,6BAI1BC,GAAoB,CAI7B,IAAKD,IAEIE,GAAmC,OAAO,OAAOD,EAAiB,ECA/E,IAAME,GAA8B,GAMpC,eAAsBC,GAAe,CACjC,KAAAC,CAAI,EAGP,CACG,GAAI,CAACA,EAAK,iBAAoB,MAAM,IAAI,MAAM,mGAAmG,EACjJ,GAAI,CAACC,GAA4BD,EAAK,gBAAgB,EAAK,MAAM,IAAI,MAAM,kCAAkCA,EAAK,gBAAgB,iCAAiCE,EAAmC,wCAAwC,EAE9O,MAAO,CACHC,GACAH,EAAK,kBACP,KAAK,GAAG,CACd,CAZsBI,EAAAL,GAAA,kBA+CtB,eAAsBM,GAAgB,CAClC,iBAAAC,EACA,QAAAC,EACA,iBAAAC,EACA,sBAAAC,EACA,kBAAAC,EACA,oBAAAC,EACA,gBAAAC,CAAe,EASlB,CACG,IAAMC,EAAK,IAAIR,GAAgB,IAAI,IACnC,GAAI,CAGA,GAFIS,IAAW,QAAQ,IAAI,GAAGD,CAAE,oDAAoD,EAEhFH,EAAkB,SAAW,EAAK,MAAM,IAAI,MAAM,6EAA6E,EACnI,GAAIC,EAAoB,SAAW,EAAK,MAAM,IAAI,MAAM,+EAA+E,EAEvI,IAAMI,EAAyB,CAC3B,iBAAAT,EACA,YAAaC,GAEbC,IAAoBO,EAAK,iBAAmBP,GAEhD,IAAMQ,EAA6B,CAC/B,CAACC,EAAoB,EAAG,CAACR,CAAqB,EAC9C,CAACS,EAAqB,EAAGR,EAAkB,OAAM,EACjD,CAACS,EAAuB,EAAGR,EAAoB,OAAM,EACrD,CAACS,EAA2B,EAAGR,EAAgB,OAAM,GAGnDS,EAAK,MAAMC,GAAe,CAAE,KAAAP,CAAI,CAAE,EAQxC,OANY,MAAMQ,EAAW,MAAM,CAC/B,kBAAmBC,GACnB,GAAAH,EAAI,KAAAN,EAAM,OAAAC,EACV,KAAM,GACT,CAGL,OAASS,EAAO,CACZ,cAAQ,MAAM,GAAGZ,CAAE,IAAIa,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQX,IAAW,QAAQ,IAAI,GAAGD,CAAE,YAAY,CAChD,CACJ,CApDsBc,EAAAtB,GAAA,mBA6DtB,eAAsBuB,GAAoC,CACtD,MAAAC,EACA,MAAAC,CAAK,EAIR,CAEG,GAAID,IAAUC,EAAS,OAAOD,EAC9B,GAAIA,IAAU,GAAM,OAAOC,EAC3B,GAAIA,IAAU,GAAM,OAAOD,EAO3B,SAASE,EAAyBC,EAAaC,EAAW,CACtD,IAAMC,EAAIF,EAAE,OACNG,EAAIF,EAAE,OACNG,EAAiB,MAAMF,EAAI,CAAC,EAAE,KAAK,CAAC,EAAE,IAAI,IAAM,MAAMC,EAAI,CAAC,EAAE,KAAK,CAAC,CAAC,EAG1E,QAASE,EAAI,EAAGA,GAAKH,EAAGG,IACpB,QAASC,EAAI,EAAGA,GAAKH,EAAGG,IAChBN,EAAEK,EAAI,CAAC,IAAMJ,EAAEK,EAAI,CAAC,EACpBF,EAAGC,CAAC,EAAEC,CAAC,EAAIF,EAAGC,EAAI,CAAC,EAAEC,EAAI,CAAC,EAAI,EAE9BF,EAAGC,CAAC,EAAEC,CAAC,EAAI,KAAK,IAAIF,EAAGC,EAAI,CAAC,EAAEC,CAAC,EAAGF,EAAGC,CAAC,EAAEC,EAAI,CAAC,CAAC,EAM1D,IAAID,EAAIH,EAAGI,EAAIH,EACTI,EAAuC,CAAA,EAC7C,KAAOF,EAAI,GAAKC,EAAI,GACZN,EAAEK,EAAI,CAAC,IAAMJ,EAAEK,EAAI,CAAC,GACpBC,EAAI,QAAQ,CAAE,KAAMP,EAAEK,EAAI,CAAC,EAAG,OAAQA,EAAI,EAAG,OAAQC,EAAI,CAAC,CAAE,EAC5DD,IACAC,KACOF,EAAGC,EAAI,CAAC,EAAEC,CAAC,EAAIF,EAAGC,CAAC,EAAEC,EAAI,CAAC,EACjCD,IAEAC,IAGR,OAAOC,CACX,CA/BSZ,EAAAI,EAAA,4BAiCT,IAAMS,EAASX,EAAM,MAAM;CAAI,EACzBY,EAASX,EAAM,MAAM;CAAI,EAEzBY,EAASX,EAAyBS,EAAQC,CAAM,EAElDE,EAAwB,CAAA,EACxBC,EAAW,EACXC,EAAW,EAEf,QAAWC,KAASJ,EAAQ,CAExB,KAAOE,EAAWE,EAAM,QACpBH,EAAY,KAAKH,EAAOI,CAAQ,CAAC,EACjCA,IAGJ,KAAOC,EAAWC,EAAM,QACpBH,EAAY,KAAKF,EAAOI,CAAQ,CAAC,EACjCA,IAGJF,EAAY,KAAKG,EAAM,IAAI,EAC3BF,IACAC,GACJ,CAGA,KAAOD,EAAWJ,EAAO,QACrBG,EAAY,KAAKH,EAAOI,CAAQ,CAAC,EACjCA,IAGJ,KAAOC,EAAWJ,EAAO,QACrBE,EAAY,KAAKF,EAAOI,CAAQ,CAAC,EACjCA,IAGJ,OAAOF,EAAY,KAAK;CAAI,CAChC,CAxFsBhB,EAAAC,GAAA,uCA8GtB,eAAsBmB,GAAe,CACjC,eAAAC,EACA,eAAAC,EACA,sBAAAxC,EACA,iBAAAH,EACA,eAAA4C,EACA,MAAAC,CAAK,EAiCR,CACG,IAAMtC,EAAK,IAAIkC,GAAe,IAAI,IAClC,GAAI,CAoEA,IAASK,EAAT,SAA2BC,GAAsB,CAC7C,IAAMC,GAAU,GAAGzC,CAAE,IAAIuC,EAAkB,IAAI,IAC/C,QAAWG,MAAaF,GAAY,CAChC,GAAI,CAACE,GAAU,OAAU,MAAM,IAAI,MAAM,gBAAgBD,EAAO,mGAAmGE,EAAa,CAAE,MAAOD,EAAS,CAAE,CAAC,wCAAwC,EAC7O,GAAI,CAACA,GAAU,OAAO,IAAO,MAAM,IAAI,MAAM,6FAA6FC,EAAa,CAAE,MAAOD,EAAS,CAAE,CAAC,0GAA0G,EACtR,GAAIA,GAAU,OAAO,IAAI,SAAW,EAAK,MAAM,IAAI,MAAM,oGAAoGC,EAAa,CAAE,MAAOD,EAAS,CAAE,CAAC,0GAA0G,CAC7S,CACJ,EAPS,IAAAH,IAAAzB,EAAAyB,EAAA,qBAnELtC,IAAW,QAAQ,IAAI,GAAGD,CAAE,oDAAoD,EAepF,IAAM4C,EAAmD,CAAA,EAKnDC,EAAgC,CAAA,EAGtC,GAAIV,EAAe,SAAW,EAAK,MAAM,IAAI,MAAM,4DAA4D,EAC/G,GAAIC,EAAe,SAAW,EAAK,MAAM,IAAI,MAAM,4DAA4D,EAC/G,GAAIxC,EAAuB,CAEvB,GAAI,CAACuC,EAAe,SAASvC,CAAqB,EAAK,MAAM,IAAI,MAAM,0DAA0DA,CAAqB,sBAAsBuC,CAAc,wCAAwC,EAClO,GAAI,CAACC,EAAe,SAASxC,CAAqB,EAAK,MAAM,IAAI,MAAM,0DAA0DA,CAAqB,sBAAsBwC,CAAc,wCAAwC,CACtO,SACIxC,EAAwBuC,EAAe,SAASW,IAASV,EAAe,SAASU,EAAK,CAAC,EACnF,CAAClD,EAAyB,MAAM,IAAI,MAAM,6CAA6CuC,CAAc,QAAQC,CAAc,wCAAwC,EAE3K,GAAID,EAAe,GAAG,EAAE,IAAMvC,EAAuB,CACjD,SACA,MAAM,IAAI,MAAM,+HAA+H,CACnJ,CACA,GAAIwC,EAAe,GAAG,EAAE,IAAMxC,EAAyB,MAAM,IAAI,MAAM,+HAA+H,EAMtM,IAAMmD,EAAaZ,EAAe,YAAYvC,CAAqB,EAE7DoD,EAAkBb,EAAe,MAAMY,EAAa,CAAC,EACrDE,EAAmB,MAAMC,GAAoC,CAC/D,gBAAiBb,EACjB,MAAOW,EACP,MAAAV,EACH,EACKa,EAAOF,EAAiB,GAAG,EAAE,EAG7BG,EAAahB,EAAe,YAAYxC,CAAqB,EAE7DyD,EAAkBjB,EAAe,MAAMgB,EAAa,CAAC,EACrDE,EAAmB,MAAMJ,GAAoC,CAC/D,gBAAiBb,EACjB,MAAOgB,EACP,MAAAf,EACH,EACKiB,EAAOD,EAAiB,GAAG,EAAE,EAanCf,EAAkBU,CAAgB,EAClCV,EAAkBe,CAAgB,EAalC,IAAIE,EACAC,EAIAC,EAIAC,EAEEC,EAAiBC,GAAiB,CAAE,MAAOV,CAAI,CAAG,EAClDW,EAASF,EAAe,MAC1B,OAAO,SAASA,EAAe,KAAK,EACpC,OAAO,iBACLG,EAAMH,EAAe,MAASA,EAAe,IAAM,EAAK,EACxDI,EAAiBH,GAAiB,CAAE,MAAON,CAAI,CAAG,EAClDU,EAASD,EAAe,MAC1B,OAAO,SAASA,EAAe,KAAK,EACpC,OAAO,iBACLE,EAAMF,EAAe,MAASA,EAAe,IAAM,EAAK,EAC1DF,EAASG,GAETT,EAAUL,EACVM,EAAaR,EACbS,EAAYH,EACZI,EAAeL,GACRQ,EAASG,GAEhBT,EAAUD,EACVE,EAAaH,EACbI,EAAYP,EACZQ,EAAeV,GAGXc,GAAOG,GAEPV,EAAUL,EACVM,EAAaR,EACbS,EAAYH,EACZI,EAAeL,IAGfE,EAAUD,EACVE,EAAaH,EACbI,EAAYP,EACZQ,EAAeV,GAIvB,IAAMkB,EAAcxB,EAAa,CAAE,MAAOa,CAAO,CAAE,EAC7CY,EAAkBX,EAAW,IAAIY,IAAK1B,EAAa,CAAE,MAAO0B,EAAC,CAAE,CAAC,EAChEC,EAAgB3B,EAAa,CAAE,MAAOe,CAAS,CAAE,EACjDa,GAAoBZ,EAAa,IAAIU,IAAK1B,EAAa,CAAE,MAAO0B,EAAC,CAAE,CAAC,EAEtEpE,IAAW,QAAQ,IAAI,GAAGD,CAAE,iBAAiBmE,CAAW,wCAAwC,EAChGlE,IAAW,QAAQ,IAAI,GAAGD,CAAE,mBAAmBsE,CAAa,wCAAwC,EAaxG,GAAM,CAACE,CAAsB,EAAI,MAAMtB,GAAoC,CACvE,MAAO,CAACtD,CAAqB,EAC7B,MAAA0C,EACH,EAED,GAAI,CAACkC,EAA0B,MAAM,IAAI,MAAM,kFAAkF,EACjI,GAAI,CAACA,EAAuB,OAAU,MAAM,IAAI,MAAM,yFAAyF,EAC/I,GAAI,CAACA,EAAuB,OAAO,KAAOA,EAAuB,OAAO,IAAI,SAAW,EAAK,MAAM,IAAI,MAAM,qJAAqJ,EAKjQ,IAAMC,GAA2CD,EAAuB,OAAO,IAAI,OAAM,EACnFE,GAA+B,CAAA,EACrC,QAAWC,MAAehB,EAAc,CACpC,GAAI,CAACgB,GAAY,OAAU,MAAM,IAAI,MAAM,8EAA8E,EACzH,IAAMC,GAAwBC,GAAc,CACxC,KAAMJ,GACN,SAAUE,GAAY,OAAO,KAAO,CAAA,EACpC,iCAAkC,GACrC,EAED,GADAC,GAAsB,QAAQP,IAAKI,GAA4B,KAAKJ,EAAC,CAAC,EAClEO,GAAsB,SAAW,EAAK,MAAM,IAAI,MAAM,iFAAiF,EAC3IA,GAAsB,QAAQP,IAAKK,GAAgB,KAAKL,EAAC,CAAC,CAC9D,CAMA,IAAMS,GAAmB,MAAM5B,GAAoC,CAC/D,MAAOwB,GACP,gBAAiBrC,EACjB,MAAAC,EACH,EAOKyC,GAAoC,CAAA,EAQtCC,EAAyB,MAAMC,GAAgB,CAC/C,IAAKzB,EACL,+CAAgDkB,GAAgB,OAAM,EACtE,eAAgBI,GAChB,sBAAAC,GACH,EAED,GAAI,CAACC,EAAuB,KAAQ,MAAM,IAAI,MAAM,uFAAuF,EAC3I,GAAI,CAACA,EAAuB,KAAK,EAAK,MAAM,IAAI,MAAM,yFAAyF,EAC/I,GAAID,GAAsB,SAAW,EAAK,MAAM,IAAI,MAAM,+IAA+I,EAGzM,QAAQ,KAAK,GAAG/E,CAAE,6TAA6TsC,EAAM,EAAE,wCAAwC,EAC/X,MAAM4C,GAAW,CAAE,MAAA5C,EAAO,OAAQyC,EAAqB,CAAE,EACzD,QAAQ,KAAK,GAAG/E,CAAE,6TAA6TsC,EAAM,EAAE,wCAAwC,EAC/X,GAAM,CACF,iBAAA6C,GACA,kBAAmBC,GACnB,eAAgBC,CAAuC,EACvDC,GAAoB,CAAE,OAAQP,EAAqB,CAAE,EACzD,GAAI,OAAO,KAAKI,EAAgB,EAAE,OAAS,EAAK,MAAM,IAAI,MAAM,iXAAiX,EACjb,IAAMI,GAAsC,OAAO,OAAOH,EAAmB,EAEvEI,GAAwBC,GAAyB,CAAE,OAAQF,EAAmC,CAAE,EAEtG,GAAI,OAAO,KAAKC,EAAqB,EAAE,SAAW,EAAK,MAAM,IAAI,MAAM,6JAA6J,EACpO,GAAI,OAAO,KAAKA,EAAqB,EAAE,OAAS,EAAK,MAAM,IAAI,MAAM,wKAAwK,EAM7O,OAAO,OAAOA,EAAqB,EAAE,CAAC,EAAE,QAAQnB,IAAKzB,EAAqC,KAAKyB,EAAC,CAAC,EACjG,QAAWqB,MAAmB9C,EAC1B,MAAM+C,GAAiB,CAAE,MAAOD,GAAiB,MAAApD,CAAK,CAAE,EAoB5D,IAAIsD,GACJ,GAAInG,IAAqBoG,GAAqB,kBAAmB,CAE7D,GAAI,CAACrC,EAAQ,KAAQ,MAAM,IAAI,MAAM,wEAAwE,EAC7G,GAAI,CAACE,EAAU,KAAQ,MAAM,IAAI,MAAM,0EAA0E,EAGjH,IAEKA,EAAU,KAAK,MAAQF,EAAQ,KAAK,OAErCE,EAAU,KAAK,OAASF,EAAQ,KAAK,KACvC,CACMvD,IAAW,QAAQ,IAAI,GAAGD,CAAE,yEAAyEP,CAAgB,wCAAwC,EAEjK,IAAMuB,GAAQ0C,EAAU,KAAK,MAAQ,GAC/BoC,GAAYxB,EACZrD,GAAQuC,EAAQ,KAAK,MAAQ,GAC7BuC,GAAY5B,EACZ6B,GAAU,MAAMjF,GAAoC,CACtD,MAAAC,GACA,MAAAC,GACH,EACKgF,GAAc,MAAMC,GAAK,CAC3B,IAAKlB,EACL,iBAAkB,CAAE,KAAMgB,EAAO,EACjC,IAAK,GACL,SAAU,CAAC,CAAChB,EAAuB,KAAK,EAC3C,EAED,GAAIiB,GAAY,oBAAsBA,GAAY,mBAAmB,OAAS,EAAK,MAAM,IAAI,MAAM,yKAAyK,EAC5Q,GAAI,CAACA,GAAY,MAAQA,GAAY,KAAK,SAAW,EAAK,MAAM,IAAI,MAAM,4IAA4I,EACtN,GAAIA,GAAY,KAAK,SAAW,EAAK,MAAM,IAAI,MAAM,sHAAsH,EAc3K,GAXApD,EAAkB,KAAKoD,GAAY,KAAK,CAAC,CAAC,EAC1CrD,EAAqC,KAAKqD,GAAY,QAAQ,EAC9D,MAAME,GAAuB,CAAE,aAAcF,GAAa,MAAA3D,CAAK,CAAG,EAClE,MAAMqD,GAAiB,CAAE,MAAOM,GAAY,SAAU,MAAA3D,CAAK,CAAE,EAC7DsD,GAAmB,CACf,kBAAmBQ,GAAkB,IACrC,UAAAN,GACA,UAAAC,IAGJf,EAAyBiB,GAAY,SACjC,CAACjB,EAAuB,KAAQ,MAAM,IAAI,MAAM,6GAA6G,CACrK,CACJ,CAiBA,IAAMqB,GAAY,MAAM7G,GAAgB,CACpC,iBAAAC,EACA,QAAS,YAAYiF,GAAgB,MAAM,4BAA4BJ,CAAa,gBAAgBH,CAAW,KAC/G,iBAAkByB,GAAmB,CAACA,EAAgB,EAAI,OAC1D,sBAAAhG,EACA,kBAAmBwE,EACnB,oBAAqBG,GACrB,gBAAiBG,GACpB,EACGzE,IAAW,QAAQ,IAAI,GAAGD,CAAE;EAAqEsG,EAAOD,EAAS,CAAC,wCAAwC,EAC9J,MAAMnB,GAAW,CAAE,MAAOmB,GAAW,MAAA/D,CAAK,CAAE,EAC5C,IAAMiE,GAAgB5D,EAAa,CAAE,MAAO0D,EAAS,CAAE,EACjDG,GAAmB,MAAMC,GAAK,CAChC,IAAKzB,EACL,kBAAmB,CACf,CAAC0B,EAAqB,EAAG,CAACH,EAAa,GAE3C,IAAK,GACL,SAAU,CAAC,CAACvB,EAAuB,KAAK,EAC3C,EAED,GAAIwB,GAAiB,oBAAsBA,GAAiB,mBAAmB,OAAS,EAAK,MAAM,IAAI,MAAM,8KAA8K,EAC3R,GAAI,CAACA,GAAiB,MAAQA,GAAiB,KAAK,SAAW,EAAK,MAAM,IAAI,MAAM,sIAAsI,EAC1N,GAAIA,GAAiB,KAAK,SAAW,EAAK,MAAM,IAAI,MAAM,2HAA2H,EAIrL3D,EAAkB,KAAK2D,GAAiB,KAAK,CAAC,CAAC,EAC/C,MAAML,GAAuB,CAAE,aAAcK,GAAkB,MAAAlE,CAAK,CAAG,EACvE,MAAMqD,GAAiB,CAAE,MAAOa,GAAiB,SAAU,MAAAlE,CAAK,CAAE,EAIlE,IAAMqE,GAAgBH,GAAiB,SACnCvG,IAAW,QAAQ,IAAI,GAAGD,CAAE,mBAAmBsG,EAAOK,EAAa,CAAC,wCAAwC,EAEhH,IAAMC,GAA+B,CACjC,aAAc9B,GACd,mBAAoBjC,EACpB,iCAAkCD,EAClC,YAAa+D,GACb,iBAAkBN,IAGtB,OAAIpG,IAAW,QAAQ,IAAI,GAAGD,CAAE,kDAAkD,EAC9EC,IAAW,QAAQ,IAAI2G,EAAM,EAE1BA,EACX,OAAShG,EAAO,CACZ,cAAQ,MAAM,GAAGZ,CAAE,IAAIa,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQX,IAAW,QAAQ,IAAI,GAAGD,CAAE,YAAY,CAChD,CACJ,CAtasBc,EAAAoB,GAAA,kBA4ahB,SAAU2E,GAAYC,EAAe,CACvC,IAAM9G,EAAK,IAAI6G,GAAY,IAAI,IAC/B,GAAI,CAGA,GAFI5G,IAAW,QAAQ,IAAI,GAAGD,CAAE,oDAAoD,EAEhF,CAAC8G,EAAS,MAAM,IAAI,MAAM,mFAAmF,EACjH,GAAI,CAACA,EAAM,KAAQ,MAAM,IAAI,MAAM,0EAA0E,EAC7G,GAAI,CAACA,EAAM,GAAG,WAAWnG,EAAe,EACpC,MAAM,IAAI,MAAM,gDAAgDA,EAAe,wCAAwC,EAE3H,MAAO,EACX,OAASC,EAAO,CACZ,OAAIX,IAAW,QAAQ,MAAM,GAAGD,CAAE,IAAIa,EAAgBD,CAAK,CAAC,EAAE,EACvD,EACX,SACQX,IAAW,QAAQ,IAAI,GAAGD,CAAE,YAAY,CAChD,CACJ,CAjBgBc,EAAA+F,GAAA,eC7oBhB,IAAME,EAAU,GAQhB,eAAsBC,GAAU,CAC5B,KAAAC,CAAI,EAGP,CACG,IAAMC,EAAK,IAAIF,GAAU,IAAI,IAC7B,GAAI,CAQA,MALW,CACPG,GACAF,EAAK,MACP,KAAK,GAAG,CAGd,OAASG,EAAO,CACZ,cAAQ,MAAM,GAAGF,CAAE,IAAIG,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,CACJ,CAnBsBE,EAAAN,GAAA,aAsDtB,eAAsBO,IAAgB,CAElC,MAAO,mBADM,MAAMC,GAAO,GACI,UAAU,EAAG,CAAC,CAAC,EACjD,CAHsBC,EAAAF,GAAA,oBAWtB,eAAsBG,GAAY,CAC9B,UAAAC,EACA,UAAAC,EACA,MAAAC,CAAK,EAKR,CACG,IAAMC,EAAK,IAAIJ,GAAY,IAAI,IAC/B,GAAI,CAIA,GAHIK,GAAW,QAAQ,IAAI,GAAGD,CAAE,oDAAoD,EAGhFH,IAAcC,EACd,MAAO,GAIX,IAAII,EACEC,EAAM,MAAMC,GAAa,CAAE,MAAAL,EAAO,KAAMD,CAAS,CAAE,EACzD,GAAIK,EAAI,SAAWA,EAAI,QAAQ,SAAW,EACtCD,EAAaC,EAAI,OAAO,CAAC,MAEzB,OAAM,IAAI,MAAM,2BAA2BL,CAAS,iBAAiBC,EAAM,EAAE,0CAA0C,EAG3H,GAAI,CAACG,EAAW,OACZ,eAAQ,KAAK,GAAGF,CAAE,wCAAwCF,CAAS,yCAAyC,EACrG,GAGX,IAAMO,EAAYH,EAAW,OAAO,MAAQ,CAAA,EAC5C,GAAIG,EAAU,SAAW,EACrB,MAAO,GAGX,GAAIA,EAAU,SAASR,CAAS,EAC5B,MAAO,GAOX,IAAMS,EAAuBD,EAAU,CAAC,EAOxC,OANmB,MAAMT,GAAY,CACjC,UAAAC,EACA,UAAWS,EACX,MAAAP,EACH,CAGL,OAASQ,EAAO,CACZ,cAAQ,MAAM,GAAGP,CAAE,IAAIQ,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQN,GAAW,QAAQ,IAAI,GAAGD,CAAE,YAAY,CAChD,CAEJ,CA5DsBL,EAAAC,GAAA,eA0EtB,eAAsBa,GAAgC,CAClD,UAAAC,EACA,WAAAC,CAAU,EAIb,CACG,IAAMX,EAAK,IAAIS,GAAgC,IAAI,IAG7CG,EAAQjB,EAAA,MAAOkB,GAAmB,CACpC,IAAMC,EAAS,MAAMV,GAAa,CAAE,MAAOO,EAAY,MAAAE,CAAK,CAAE,EAC9D,GAAIC,EAAO,SAAWA,EAAO,QAAQ,SAAWD,EAAM,OAClD,OAAOC,EAAO,OACX,CACH,IAAMC,EACFD,EAAO,eACX,MAAKC,EAAS,KACR,IAAI,MAAM,oDAAoDA,EAAS,KAAK,aAAa,eAAeJ,EAAW,EAAE,wCAAwC,EADvI,IAAI,MAAM,sFAAsF,CAEhI,CACJ,EAVc,SAYRK,EAAmB,MAAMC,GAAsB,CAAE,UAAAP,CAAS,CAAE,EAClE,GAAIM,EAAiB,OAAS,EAC1B,MAAM,IAAI,MAAM,6CAA6CA,CAAgB,wCAAwC,EAGzH,GAAI,CAACN,EAAU,OAAU,MAAM,IAAI,MAAM,sFAAsF,EAG/H,IAAMQ,EAAgBR,EAAU,OAAOS,EAAmB,EACpDC,EAAY,MAAMR,EAAMM,CAAa,EAE3C,MAAO,CAAE,UAAAR,EAAW,UAAAU,CAAS,CACjC,CAlCsBzB,EAAAc,GAAA,mCAyCtB,eAAsBY,GAAuB,CACzC,UAAAX,EACA,MAAAX,CAAK,EAIR,CACG,IAAMC,EAAK,IAAIqB,GAAuB,IAAI,IAC1C,GAAI,CAEA,GADIpB,GAAW,QAAQ,IAAI,GAAGD,CAAE,oDAAoD,EAChF,CAACU,EAAU,KAAQ,MAAM,IAAI,MAAM,0EAA0E,EACjH,GAAI,CAACA,EAAU,OAAU,MAAM,IAAI,MAAM,4EAA4E,EAErH,IAAMY,EAAWC,EAAa,CAAE,MAAOb,CAAS,CAAE,EAE5CG,EAAQH,EAAU,OAAO,MAAQA,EAAU,OAAO,KAAK,OAAS,EAClE,CAAC,GAAGA,EAAU,OAAO,KAAMY,CAAQ,EACnC,CAACA,CAAQ,EAEPE,EAA4C,CAAA,EAClD,QAAWC,KAAQZ,EAAO,CACtB,IAAIa,EACAZ,EAAS,MAAMV,GAAa,CAAE,KAAAqB,EAAM,MAAA1B,CAAK,CAAE,EAC/C,GAAIe,EAAO,SAAWA,EAAO,QAAUA,EAAO,OAAO,SAAW,EAC5DY,EAAYZ,EAAO,OAAO,CAAC,MAE3B,OAAIb,GAAW,QAAQ,IAAI,GAAGD,CAAE;EAA+C2B,EAAOjB,CAAS,CAAC,wCAAwC,EAClI,IAAI,MAAM,2BAA2Be,CAAI,iBAAiB1B,EAAM,EAAE,yCAAyC,EAErH,IAAM6B,EAAQ,MAAMnB,GAAgC,CAChD,UAAWiB,EAAW,WAAY3B,EACrC,EACDyB,EAAU,KAAKI,CAAK,CACxB,CAGA,OAAI3B,GAAW,QAAQ,IAAI,GAAGD,CAAE;IAAqB2B,EAAOH,CAAS,EAAE,MAAM;CAAI,EAAE,KAAK;GAAM,CAAC;yCAA4C,EAEpIA,CACX,OAASjB,EAAO,CACZ,cAAQ,MAAM,GAAGP,CAAE,IAAIQ,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQN,GAAW,QAAQ,IAAI,GAAGD,CAAE,YAAY,CAChD,CACJ,CA7CsBL,EAAA0B,GAAA,0BAmDtB,eAAsBJ,GAAsB,CACxC,UAAAP,CAAS,EAGZ,CACG,IAAMV,EAAK,IAAIiB,GAAsB,IAAI,IACzC,GAAI,CACIhB,GAAW,QAAQ,IAAI,GAAGD,CAAE,oDAAoD,EAEpF,IAAM6B,EAAmB,MAAMC,GAA2B,CAAE,MAAOpB,CAAS,CAAE,GAAK,CAAA,EAGnF,GAAImB,EAAO,OAAS,EAAK,OAAOA,EAEhC,GAAInB,EAAU,KAAM,CAChB,GAAM,CAAE,KAAAqB,CAAI,EAAKrB,EAEbqB,EAAK,MAGLF,EAAO,KAAK,0DAA0D,EAEtEE,EAAK,WAGLF,EAAO,KAAK,+DAA+D,EAE3EE,EAAK,aAAeA,EAAK,cAAgB,GAGzCF,EAAO,KAAK,iEAAiE,EAG7EE,EAAK,iBACAC,GAA4BD,EAAK,gBAAgB,GAClDF,EAAO,KAAK,0BAA0BE,EAAK,gBAAgB,iCAAiCE,EAAmC,0CAA0C,EAG7KJ,EAAO,KAAK,sEAAsE,EAGlFE,EAAK,oBAILA,EAAK,OAILA,EAAK,YAIb,MACIF,EAAO,KAAK,4DAA4D,EAG5E,GAAInB,EAAU,OAAQ,CAClB,IAAMwB,EAAWxB,EAAU,OAAOS,EAAmB,EACjDe,GAAYA,EAAS,OAAS,GAG9BL,EAAO,KAAK,uFAAuF,CAE3G,MACIA,EAAO,KAAK,8DAA8D,EAG9E,OAAOA,CACX,OAAStB,EAAO,CACZ,cAAQ,MAAM,GAAGP,CAAE,IAAIQ,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQN,GAAW,QAAQ,IAAI,GAAGD,CAAE,YAAY,CAChD,CACJ,CA3EsBL,EAAAsB,GAAA,yBA6EtB,eAAsBkB,GAA4B,CAC9C,QAAAC,CAAO,EAGV,CACG,IAAMpC,EAAK,IAAImC,GAA4B,IAAI,IAC/C,GAAI,CACA,OAAIlC,GAAW,QAAQ,IAAI,GAAGD,CAAE,oDAAoD,EACpF,QAAQ,MAAM,GAAGA,CAAE,uHAAuH,EACnI,CAAA,CACX,OAASO,EAAO,CACZ,cAAQ,MAAM,GAAGP,CAAE,IAAIQ,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQN,GAAW,QAAQ,IAAI,GAAGD,CAAE,YAAY,CAChD,CACJ,CAhBsBL,EAAAwC,GAAA,+BAkBtB,eAAsBE,GAA2B,CAC7C,OAAAC,EACA,MAAAvC,CAAK,EAIR,CACG,IAAMC,EAAK,IAAIqC,GAA2B,IAAI,IAC9C,GAAI,CACIpC,GAAW,QAAQ,IAAI,GAAGD,CAAE,oDAAoD,EAEpF,IAAMuC,EAA2B,CAAA,EAC3BC,EAA8B,CAAA,EAEpC,QAAWC,KAASH,EAEZI,GAAY,CAAE,MAAAD,CAAK,CAAE,IAErBE,GAAM,CAAE,MAAAF,CAAK,CAAE,EACfF,EAAa,KAAKE,CAAK,EAEvBD,EAAgB,KAAKC,CAAK,GAKlC,OAAIF,EAAa,OAAS,GACtB,MAAMK,GAAW,CAAE,OAAQL,EAAc,MAAO,GAAM,MAAAxC,CAAK,CAAG,EAI9DyC,EAAgB,OAAS,GACzB,MAAMI,GAAW,CAAE,OAAQJ,EAAiB,MAAO,GAAO,MAAAzC,CAAK,CAAG,EAG/D,CAAE,aAAAwC,EAAc,gBAAAC,CAAe,CAC1C,OAASjC,EAAO,CACZ,cAAQ,MAAM,GAAGP,CAAE,IAAIQ,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQN,GAAW,QAAQ,IAAI,GAAGD,CAAE,YAAY,CAChD,CACJ,CA1CsBL,EAAA0C,GAAA,8BA+ChB,SAAUQ,GAAuB,CACnC,UAAAnB,CAAS,EAGZ,CACG,IAAM1B,EAAK,IAAI6C,GAAuB,IAAI,IAC1C,GAAI,CAEA,GADI5C,GAAW,QAAQ,IAAI,GAAGD,CAAE,oDAAoD,EAChF,CAAC0B,EAAa,MAAM,IAAI,MAAM,qEAAqE,EACvG,GAAI,CAACA,EAAU,KAAQ,MAAM,IAAI,MAAM,0EAA0E,EACjH,GAAI,CAACA,EAAU,KAAK,GAAKA,EAAU,KAAK,IAAM,EAAK,MAAM,IAAI,MAAM,sFAAsF,EAEzJ,IAAMoB,EAASpB,EAAU,KAAK,EAAI,EAIlC,GAAIoB,IAAW,EACX,OAAOC,GAAoB,OACxB,GAAID,IAAW,EAClB,OAAOC,GAAoB,SAE3B,MAAM,IAAI,MAAM,wIAAwI,CAEhK,OAASxC,EAAO,CACZ,cAAQ,MAAM,GAAGP,CAAE,IAAIQ,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQN,GAAW,QAAQ,IAAI,GAAGD,CAAE,YAAY,CAChD,CACJ,CA7BgBL,EAAAkD,GAAA,0BA2ChB,eAAsBG,GAAsB,CACxC,YAAAC,CAAW,EAGd,CACG,IAAMjD,EAAK,IAAIgD,GAAsB,IAAI,IACzC,GAAI,CACI/C,GAAW,QAAQ,IAAI,GAAGD,CAAE,oDAAoD,EAEpF,IAAMkD,EACFD,EAAY,SAASE,GAAKA,EAAE,UAAU,KAAKC,GAAYA,EAAS,KAAK,QAAUC,EAAU,KAAK,CAAC,EACnG,GAAI,CAACH,EACD,MAAM,IAAI,MAAM,2GAA2G,EAG/H,IAAMI,EAAcJ,EAAsB,UAAU,OAAOC,GAAKA,EAAE,KAAK,QAAUE,EAAU,KAAK,EAChG,GAAIC,EAAY,OAAS,EAAK,MAAM,IAAI,MAAM,iJAAiJ,EAG/L,OADkBA,EAAY,CAAC,EAAE,KAChB,SACrB,OAAS/C,EAAO,CACZ,cAAQ,MAAM,GAAGP,CAAE,IAAIQ,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQN,GAAW,QAAQ,IAAI,GAAGD,CAAE,YAAY,CAChD,CACJ,CA1BsBL,EAAAqD,GAAA,yBA4BtB,eAAsBO,GAAwB,CAC1C,YAAAN,EACA,YAAAO,CAAW,EAQd,CACG,IAAMxD,EAAK,IAAIuD,GAAwB,IAAI,IAC3C,GAAI,CACItD,GAAW,QAAQ,IAAI,GAAGD,CAAE,oDAAoD,EAKpF,IAAMyD,EAAY,MAAMT,GAAsB,CAAE,YAAAC,CAAW,CAAE,EAE7D,GAAI,CAACQ,GAAaA,EAAU,SAAW,EACnC,OAAIxD,GAAW,QAAQ,IAAI,GAAGD,CAAE,kFAAkF,EAC3G,CAAA,EAGX,IAAM0D,EAAgC,CAAA,EAEtC,QAAWC,KAAYF,EAAW,CAC9B,GAAI,CAACE,EAAS,SAAY,MAAM,IAAI,MAAM,2JAA2J,EACrM,GAAI,CAACA,EAAS,cAAiB,MAAM,IAAI,MAAM,0NAA0N,EACzQ,IAAMC,EAAe,MAAMC,GAAoC,CAC3D,MAAO,CAACF,EAAS,aAAa,EAC9B,MAAOH,EACV,EACD,GAAII,EAAa,SAAW,EAAK,MAAM,IAAI,MAAM,qDAAqDD,EAAS,aAAa,uBAAuBH,EAAY,EAAE,0CAA0C,EAC3M,IAAMM,EAAYF,EAAa,CAAC,EAChC,GAAI,CAACG,GAAYD,CAAS,EAAK,MAAM,IAAI,MAAM,wDAAwDH,EAAS,aAAa,8IAA8I,EAC3Q,IAAMK,EAAgBF,EAAU,OAAOG,EAAuB,EAE9D,GAAI,CAACD,GAAiBA,EAAc,SAAW,EAC3C,MAAM,IAAI,MAAM,4DAA4DL,EAAS,aAAa,wJAAwJ,EAG9PK,EAAc,QAAQb,GAAKO,EAAiB,KAAKP,CAAC,CAAC,CACvD,CAEA,OAAOO,CACX,OAASnD,EAAO,CACZ,cAAQ,MAAM,GAAGP,CAAE,IAAIQ,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQN,GAAW,QAAQ,IAAI,GAAGD,CAAE,YAAY,CAChD,CACJ,CArDsBL,EAAA4D,GAAA,2BAsEtB,eAAsBW,GAAoB,CACtC,aAAAC,EACA,OAAAC,CAAM,EAIT,CACG,IAAMpE,EAAK,IAAIkE,GAAoB,IAAI,IACvC,GAAI,CAGA,GAFIjE,GAAW,QAAQ,IAAI,GAAGD,CAAE,oDAAoD,EAEhF,CAACmE,EAAgB,MAAM,IAAI,MAAM,wEAAwE,EAC7G,GAAI,CAACC,EAAU,MAAM,IAAI,MAAM,kEAAkE,EAYjG,OAVsB,MAAMC,GAAU,CAClC,aAAcF,EACd,QAAS,CACL,SAAUG,GAAY,oBACtB,KAAMF,EACN,OAAQ,IACR,UAAW,WAElB,CAGL,OAAS7D,EAAO,CACZ,cAAQ,MAAM,GAAGP,CAAE,IAAIQ,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQN,GAAW,QAAQ,IAAI,GAAGD,CAAE,YAAY,CAChD,CACJ,CA/BsBL,EAAAuE,GAAA,uBC5hBf,IAAMK,GAAyB,mBCiBtC,IAAMC,GAAU,GAKhB,eAAsBC,GAAqB,CACvC,KAAAC,CAAI,EAGP,CACG,IAAMC,EAAK,IAAIF,GAAqB,IAAI,IACxC,GAAI,CACA,GAAI,CAACC,EAAQ,MAAM,IAAI,MAAM,qDAAqD,EAElF,IAAME,EAAeF,EAAK,qBAAqB,EAAIA,EAAK,qBAAqB,EAAE,OAAS,EAQxF,MANW,CACPG,GACAH,EAAK,MACLE,GACF,KAAK,GAAG,CAGd,OAASE,EAAO,CACZ,cAAQ,MAAM,GAAGH,CAAE,IAAII,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,CACJ,CAtBsBE,EAAAP,GAAA,wBAiGtB,eAAsBQ,GAA4B,CAC9C,QAAAC,CAAO,EAGV,CACG,IAAMC,EAAK,IAAIF,GAA4B,IAAI,IAC/C,GAAI,CACIG,IAAW,QAAQ,IAAI,GAAGD,CAAE,oDAAoD,EAEpF,IAAME,EAAmB,CAAA,EAGnBC,EAAkB,MAAMC,GAA2B,CAAE,MAAOL,CAAO,CAAE,EAC3E,GAAII,GAAmBA,EAAgB,OAAS,EAC5C,OAAAA,EAAgB,QAAQE,GAAKH,EAAO,KAAKG,CAAC,CAAC,EACpCH,EAWX,GARIH,EAAQ,WAEJ,MAAMO,GAAsB,CAAE,UAAWP,EAAQ,SAAS,CAAE,GAChD,QAAQM,GAAKH,EAAO,KAAKG,CAAC,CAAC,EAE3CH,EAAO,KAAK,mEAAmE,EAG/EH,EAAQ,cAKR,IAHI,MAAMK,GAA2B,CAAE,MAAOL,EAAQ,YAAY,CAAE,GAAK,CAAA,GACtD,QAAQM,GAAKH,EAAO,KAAKG,CAAC,CAAC,EAE1CN,EAAQ,UAAW,CACnB,IAAMQ,EAAkBR,EAAQ,UAAU,SAASS,EAAmB,IAAI,CAAC,EAC3E,GAAID,EAAiB,CACjB,IAAME,EAAgBC,EAAa,CAAE,MAAOX,EAAQ,YAAY,CAAE,EAC9DU,IAAkBF,GAClBL,EAAO,KAAK,iCAAiCO,CAAa,yEAAyEF,CAAe,0CAA0C,CAEpM,MACIL,EAAO,KAAK,4DAA4DM,EAAmB,0CAA0C,CAE7I,OAEAN,EAAO,KAAK,qEAAqE,EAKrF,OAAIA,EAAO,OAAS,EAAYA,GAShC,QAAQ,MAAM,GAAGF,CAAE,8FAA8F,EAC1G,CAAA,EACX,OAASW,EAAO,CACZ,cAAQ,MAAM,GAAGX,CAAE,IAAIY,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQV,IAAW,QAAQ,IAAI,GAAGD,CAAE,YAAY,CAChD,CACJ,CAjEsBa,EAAAf,GAAA,+BA6GtB,eAAsBgB,GAAiC,CACnD,QAAAC,EACA,MAAAC,GASH,CACG,IAAMC,EAAK,IAAIH,GAAiC,IAAI,IACpD,GAAI,CACII,IAAW,QAAQ,IAAI,GAAGD,CAAE,oDAAoD,EAEpF,IAAME,EAAmB,CAAA,EAEzB,GAAI,CAACJ,EAAQ,KAAQ,MAAM,IAAI,MAAM,wEAAwE,EAC7G,GAAI,CAACA,EAAQ,OAAU,MAAM,IAAI,MAAM,0EAA0E,EAEjH,GAAM,CAAE,UAAAK,EAAW,sBAAuBC,CAAmB,EAAKN,EAClE,GAAI,CAACK,EAAU,KAAQ,MAAM,IAAI,MAAM,0EAA0E,EAIjH,GAAI,CAACC,EAMD,OADA,QAAQ,MAAM,GAAGJ,CAAE,sIAAsI,EACrJG,EAAU,KAAK,wBACfD,EAAO,KAAK,wKAAwK,EAC7KA,GACAJ,EAAQ,OAAO,iBACtBI,EAAO,KAAK,6HAA6H,EAClIA,IAGHD,IAAW,QAAQ,IAAI,GAAGD,CAAE,qOAAqO,EAC9P,CAAA,GAGf,IAAMK,EAA0BC,EAAa,CAAE,MAAOF,CAAmB,CAAE,EAGrEG,EAAoDT,EAAQ,QAAQ,iBAAmB,CAAA,EAC7F,GAAIS,EAAkD,SAAW,EAC7D,OAAAL,EAAO,KAAK,mIAAmI,EACxIA,EAGX,GAAIK,EAAkD,OAAS,EAC3D,OAAAL,EAAO,KAAK,mGAAmG,EACxGA,EAKX,IAAMM,EAA0BD,EAAkD,CAAC,EAK7EE,EAAmB,MAAMC,GAAe,CAAE,MAAO,CAACF,CAAuB,EAAG,MAAAT,CAAK,CAAE,EACzF,GAAI,CAACU,EAAoB,MAAM,IAAI,MAAM,uEAAuEV,EAAM,EAAE,gDAAgD,EACxK,GAAI,CAACU,EAAiB,KAAQ,MAAM,IAAI,MAAM,4EAA4EV,EAAM,EAAE,gDAAgD,EAClL,GAAI,CAACU,EAAiB,KAAK,QACvB,MAAM,IAAI,MAAM,yFAAyF,EAE7G,GAAM,CAAE,eAAAE,CAAc,EAAKF,EAAiB,KAC5C,GAAI,CAACE,EAAkB,MAAM,IAAI,MAAM,gGAAgG,EACvI,GAAI,OAAO,KAAKA,CAAc,EAAE,SAAW,EACvC,MAAM,IAAI,MAAM,8FAA8F,EAElH,IAAMC,EAAiCD,EAAeH,CAAuB,EAC7E,GAAI,CAACI,EACD,OAAAV,EAAO,KAAK,4BAA4BM,CAAuB,yBAAyBT,EAAM,EAAE,qGAAqG,EAC9LG,EAEX,GAAIM,IAA4BI,GACxBA,IAAmCP,EAKnC,OAAAH,EAAO,KAAK,kFAAkFH,EAAM,EAAE,0CAA0C,EAGhJ,QAAQ,IAAI,YAAYc,EAAOC,GAAM,CAAE,MAAOhB,CAAO,CAAE,CAAC,CAAC,EAAE,EAC3D,QAAQ,IAAI,6DAA6DU,CAAuB,EAAE,EAClG,QAAQ,IAAI,mCAAmCI,CAA8B,EAAE,EAC/E,QAAQ,IAAI,wDAAwDC,EAAOC,GAAM,CAC7E,MAAO,CACH,GAAIV,EAAoB,GACxB,IAAKA,EAAoB,IACzB,OAAQA,EAAoB,OAC5B,KAAM,CACF,GAAGA,EAAoB,KACvB,eAAgBA,EAAoB,KAAK,eAAe,IAAIW,IACjD,CAAE,GAAGA,EAAG,WAAY,CAAA,CAAE,EAChC,IAIZ,CAAC,CAAC,EAAE,EACL,QAAQ,IAAI,4BAA4BV,CAAuB,EAAE,EAG1DH,EAIf,IAAMc,EAA4B,MAAMC,GAAa,CAAE,KAAMT,EAAyB,MAAAT,CAAK,CAAE,EAC7F,GAAI,CAACiB,EAA0B,SAAWA,EAA0B,QAAQ,SAAW,EACnF,OAAAd,EAAO,KAAK,0CAA0CM,CAAuB,gBAAgBT,EAAM,EAAE,0CAA0C,EACxIG,EAEX,IAAMgB,EAAsBF,EAA0B,OAAO,CAAC,EAIxDG,EACF,MAAMC,GAAY,CAAE,MAAOF,EAAqB,MAAO,GAAM,MAAAnB,CAAK,CAAE,EACxE,GAAI,CAACoB,EAAsB,MAAM,IAAI,MAAM,0DAA0DpB,EAAM,EAAE,0JAA0J,EACvQ,IAAMsB,EAAyBf,EAAa,CAAE,MAAOa,CAAkB,CAAE,EACzE,GAAIE,IAA2BlB,EAAU,KAAK,uBAC1C,MAAM,IAAI,MAAM,sHAAsH,EAG1I,IAAMmB,EAA6BH,EAAmB,KAAK,aAC3D,GAAI,CAACG,EACD,OAAApB,EAAO,KAAK,oHAAoH,EACzHA,EAEX,GAAM,CAAE,mBAAAqB,EAAoB,sBAAAC,CAAqB,EAAKF,EACtD,GAAI,CAACC,EAAsB,MAAM,IAAI,MAAM,2FAA2F,EACtI,GAAI,CAACC,EAAyB,MAAM,IAAI,MAAM,8FAA8F,EAE5I,IAAMC,EACF,MAAMf,GAAe,CAAE,MAAO,CAACc,EAAuBD,CAAkB,EAAG,MAAAxB,CAAK,CAAE,EACtF,GAAI,CAAC0B,EAAmC,MAAM,IAAI,MAAM,sFAAsF1B,EAAM,EAAE,gDAAgD,EACtM,GAAI,CAAC0B,EAAgC,KAAQ,MAAM,IAAI,MAAM,2FAA2F1B,EAAM,EAAE,gDAAgD,EAChN,GAAI,CAAC0B,EAAgC,KAAK,QACtC,MAAM,IAAI,MAAM,wGAAwG,EAE5H,GAAM,CAAE,eAAgBC,CAA6B,EAAKD,EAAgC,KAC1F,GAAI,CAACC,EAAiC,MAAM,IAAI,MAAM,+GAA+G,EACrK,GAAI,OAAO,KAAKA,CAA6B,EAAE,SAAW,GAAKF,IAA0BD,EACrF,MAAM,IAAI,MAAM,6JAA6J,EAIjL,IAAMI,EAA+BD,EAA8BF,CAAqB,EAClFI,EAA4BF,EAA8BH,CAAkB,EAClF,GAAI,CAACK,EAA6B,MAAM,IAAI,MAAM,qFAAqF,EACvI,GAAID,IAAiCC,EACjC,MAAM,IAAI,MAAM,kGAAkG,EAmBtH,IAAMC,EAA8B,MAAMZ,GAAa,CACnD,KAAMW,EACN,MAAA7B,EACH,EACD,GAAI,CAAC8B,EAA4B,SAAWA,EAA4B,QAAQ,SAAW,EACvF,OAAA3B,EAAO,KAAK,0CAA0CM,CAAuB,gBAAgBT,EAAM,EAAE,0CAA0C,EACxIG,EAEX,IAAM4B,EAAwBD,EAA4B,OAAO,CAAC,EAClE,GAAI,CAACC,EAAsB,KAAK,OAC5B,OAAA5B,EAAO,KAAK,oFAAoF,EACzFA,EAEX,IAAM6B,EAAYD,EAAsB,KAAK,OAAO,KAAKf,GACrDA,EAAE,MAAM,OAASiB,EAAkB,GACpC,MACH,GAAI,CAACD,EACD,OAAA7B,EAAO,KAAK,gEAAgE8B,EAAkB,yCAAyC,EAChI9B,EAEX,GAAI6B,EAAU,SAAWV,EACrB,OAAAnB,EAAO,KAAK,wDAAwD8B,EAAkB,uDAAuDxB,CAAuB,yCAAyC,EACtMN,EAIX,IAAM+B,EAAmB,MADL,IAAIC,GAAkB,EACC,SAAS,CAChD,aAAc9B,EACd,UAAWc,EACd,EACGe,EAAiB,OAAS,GAC1B/B,EAAO,KAAK,wCAAwC+B,EAAiB,KAAK,IAAI,CAAC,wCAAwC,EAK3H,IAAME,EAAc7B,EAAa,CAAE,MAAOR,CAAO,CAAE,EAGnD,OADIM,EAAoB,MAAM,QAAQ,KAAKW,GAAKA,EAAE,MAAM,SAAWoB,CAAW,GAE1EjC,EAAO,KAAK,qEAAqEiC,CAAW,0CAA0C,EAGnIjC,CACX,OAASkC,EAAO,CACZ,IAAMC,EAAO,GAAGrC,CAAE,IAAIsC,EAAgBF,CAAK,CAAC,GAC5C,eAAQ,MAAMC,CAAI,EACX,CAAC,qCAAqCA,CAAI,wCAAwC,CAC7F,SACQpC,IAAW,QAAQ,IAAI,GAAGD,CAAE,YAAY,CAChD,CACJ,CApOsBuC,EAAA1C,GAAA,oCC9MtB,IAAM2C,GAAU,GAaMC,GAAhB,MAAgBC,UAGZC,EAAuD,CA7CjE,MA6CiE,CAAAC,EAAA,oBAGnD,GAAa,IAAIF,EAAY,IAAI,IAEpC,KACA,6BACA,uBACP,IAAW,4BAA0B,CACjC,OAAO,KAAK,uBACRG,EAAa,CAAE,MAAO,KAAK,sBAAsB,CAAE,EACnD,MACR,CAMO,MAAM,YAAY,CACrB,YAAAC,CAAW,EAGd,CACG,IAAMC,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,YAAY,IAAI,IAC9C,GAAI,CACA,GAAI,CAAC,KAAK,uBACN,OAEJ,GAAI,CAAC,KAAK,KAAQ,MAAM,IAAI,MAAM,6DAA6D,EAC/F,GAAM,CAAE,eAAAC,EAAgB,OAAAC,EAAQ,eAAAC,EAAgB,WAAAC,CAAU,EAAK,KAAK,KACpE,GAAI,CAACH,EAAkB,MAAM,IAAI,MAAM,uEAAuE,EAC9G,GAAI,CAACC,EAAU,MAAM,IAAI,MAAM,+DAA+D,EAE9F,IAAMG,EAAe,MAAMJ,EAAc,EACnCK,EAAgB,MAAMC,GAAoB,CAAE,aAAAF,EAAc,OAAAH,CAAM,CAAE,EAGlEM,EAAU,MADI,IAAIC,GAAkB,EACR,KAAK,CACnC,eAAgB,KAAK,uBACrB,aAAcH,EACd,MAAO,CACH,KAAMI,GACN,OAAQX,GAEZ,UAAWI,EACX,MAAOC,EACV,EAED,YAAK,uBAAyBI,EACvBA,CACX,OAASG,EAAO,CACZ,cAAQ,MAAM,GAAGX,CAAE,IAAIY,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,CACJ,CAKO,MAAM,mBAAmB,CAC5B,cAAAE,EACA,YAAAC,CAAW,EAId,CACG,IAAMd,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,mBAAmB,IAAI,IACrD,GAAI,CACA,GAAI,CAAC,KAAK,uBACN,OAEJ,GAAI,CAAC,KAAK,KAAQ,MAAM,IAAI,MAAM,6DAA6D,EAC/F,GAAM,CAAE,eAAAC,EAAgB,OAAAC,EAAQ,eAAAC,EAAgB,WAAAC,CAAU,EAAK,KAAK,KACpE,GAAI,CAACH,EAAkB,MAAM,IAAI,MAAM,uEAAuE,EAC9G,GAAI,CAACC,EAAU,MAAM,IAAI,MAAM,+DAA+D,EAE9F,IAAMG,EAAe,MAAMJ,EAAc,EACnCK,EAAgB,MAAMC,GAAoB,CAAE,aAAAF,EAAc,OAAAH,CAAM,CAAE,EAGlEM,EAAU,MADI,IAAIC,GAAkB,EACR,KAAK,CACnC,eAAgB,KAAK,uBACrB,aAAcH,EACd,OAAQS,GACR,qBAAsBD,EACtB,MAAO,CACH,KAAME,GACN,OAAQH,GAEZ,UAAWV,EACX,MAAOC,EACV,EAED,YAAK,uBAAyBI,EACvBA,CACX,OAASG,EAAO,CACZ,cAAQ,MAAM,GAAGX,CAAE,IAAIY,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,CACJ,CAGA,IAAI,WAAS,CACT,GAAI,CAAC,KAAK,KAAQ,MAAM,IAAI,MAAM,qEAAqE,EACvG,GAAI,CAAC,KAAK,KAAK,UAAa,MAAM,IAAI,MAAM,kFAAkF,EAC9H,OAAO,KAAK,KAAK,SACrB,CAEA,YAAYM,EAA8BC,EAAiC,CACvE,MAAMD,EAAaC,CAAa,CACpC,CAEO,MAAM,YAAU,CACnB,KAAK,6BAA+B,MAAMC,GAAY,CAC1D,CAQO,MAAM,QAAQC,EAAkB,CACnC,IAAMpB,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,QAAQ,IAAI,IAC1C,GAAI,CACIP,IAAW,QAAQ,IAAI,GAAGO,CAAE,oDAAoD,EAEpF,MAAM,KAAK,gBAAgBoB,CAAI,EAC/B,MAAM,KAAK,YAAYA,CAAI,CAC/B,OAAST,EAAO,CACZ,cAAQ,MAAM,GAAGX,CAAE,IAAIY,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQlB,IAAW,QAAQ,IAAI,GAAGO,CAAE,YAAY,CAChD,CACJ,CAuCO,MAAM,0BAAwB,CACjC,IAAMA,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,yBAAyB,IAAI,IAC3D,GAAI,CAGA,GAFIP,IAAW,QAAQ,IAAI,GAAGO,CAAE,oDAAoD,EAEhF,CAAC,KAAK,KAAQ,MAAM,IAAI,MAAM,gGAAgG,EAElI,GAAM,CAAE,eAAAqB,EAAgB,eAAApB,EAAgB,iBAAAqB,EAAkB,OAAApB,EAAQ,eAAAC,EAAgB,WAAAC,CAAU,EAAK,KAAK,KAGtG,GAAI,CAACiB,GAAkB,CAACpB,EAAgB,CAChCR,IAAW,QAAQ,IAAI,GAAGO,CAAE,mGAA8F,EAC9H,MACJ,CAEA,GAAI,CAACsB,EACD,MAAM,IAAI,MAAM,6JAA6J,EAEjL,IAAMC,EAAqBzB,EAAa,CAAE,MAAOuB,CAAc,CAAE,EAC3DG,EAAwBC,GAAW,CAAE,MAAOJ,CAAc,CAAE,EAClE,GAAI,CAACG,EAAyB,MAAM,IAAI,MAAM,iFAAiF,EAE/H,GAAI,CAACtB,EAAU,MAAM,IAAI,MAAM,yIAAyI,EAExK,IAAMG,EAAe,MAAMJ,EAAc,EACzC,GAAI,CAACI,EAAgB,MAAM,IAAI,MAAM,kFAAkF,EACvH,IAAMC,EAAgB,MAAMC,GAAoB,CAAE,aAAAF,EAAc,OAAAH,CAAM,CAAE,EAElEwB,EAAc,IAAIjB,GAIxB,GAAI,CAAC,KAAK,KAAK,yBAA4B,MAAM,IAAI,MAAM,yFAAyF,EACpJ,GAAI,CAAC,KAAK,KAAK,sBAAyB,MAAM,IAAI,MAAM,sFAAsF,EAI9I,IAAMkB,EAA2C,CAC7C,mBAAAJ,EACA,sBAAAC,GAEA,KAAK,KAAK,cACVG,EAAa,YAAc,KAAK,KAAK,aAEzC,IAAMC,EAAkB,MAAMF,EAAY,QAAQ,CAC9C,aAAcpB,EACd,QAAS,CAAC,KAAK,KAAK,yBAA0B,KAAK,KAAK,qBAAqB,EAC7E,aAAAqB,EACA,UAAWxB,EACX,MAAOC,EACV,EACKyB,EAAsB/B,EAAa,CAAE,MAAO8B,CAAe,CAAE,EAG7DE,EAAoB,MAAMJ,EAAY,KAAK,CAC7C,eAAgBL,EAChB,aAAchB,EACd,MAAO,CACH,KAAMK,GACN,OAAQmB,GAEZ,UAAW1B,EACX,MAAOC,EACV,EAGD,MAAM,KAAK,wBAAwB,CAAE,kBAAA0B,EAAmB,gBAAAF,CAAe,CAAE,EAEzE,KAAK,uBAAyBA,CAClC,OAASjB,EAAO,CACZ,cAAQ,MAAM,GAAGX,CAAE,IAAIY,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQlB,IAAW,QAAQ,IAAI,GAAGO,CAAE,YAAY,CAChD,CACJ,CAsBO,MAAM,eAAeoB,EAAqB,CAC7C,IAAMpB,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,eAAe,IAAI,IACjD,GAAI,CACIP,IAAW,QAAQ,IAAI,GAAGO,CAAE,oDAAoD,EACpF,KAAK,KAAOoB,CAChB,OAAST,EAAO,CACZ,cAAQ,MAAM,GAAGX,CAAE,IAAIY,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQlB,IAAW,QAAQ,IAAI,GAAGO,CAAE,YAAY,CAChD,CACJ,CAEO,gBAAgB+B,EAA6B,CAChD,IAAM/B,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,gBAAgB,IAAI,IAClD,GAAI,CAEA,GADIP,IAAW,QAAQ,IAAI,GAAGO,CAAE,oDAAoD,EAChF,CAAC,KAAK,KAAQ,MAAM,IAAI,MAAM,qEAAqE,EAEnGP,IAAW,QAAQ,IAAI,GAAGO,CAAE,6BAA6B,OAAO,KAAK+B,CAAG,CAAC,wCAAwC,EAErH,KAAK,KAAO,CAAE,GAAG,KAAK,KAAM,GAAGA,CAAG,CACtC,OAASpB,EAAO,CACZ,cAAQ,MAAM,GAAGX,CAAE,IAAIY,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQlB,IAAW,QAAQ,IAAI,GAAGO,CAAE,YAAY,CAChD,CACJ,CAqBU,MAAM,wBAAwB,CACpC,QAAAgC,CAAO,EAGV,CACG,IAAMhC,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,wBAAwB,IAAI,IAC1D,GAAI,CAGA,GAFIP,IAAW,QAAQ,IAAI,GAAGO,CAAE,oDAAoD,EAEhF,CAAC,KAAK,KAAQ,MAAM,IAAI,MAAM,gGAAgG,EAClI,GAAM,CAAE,WAAAI,CAAU,EAAK,KAAK,KAItB6B,EAAuB,MAAMC,GAAiC,CAChE,QAAAF,EACA,MAAO5B,EACV,EACD,GAAI6B,EAAqB,OAAS,EAC9B,MAAM,IAAI,MAAM,yDAAyDA,CAAoB,wCAAwC,EAKzI,IAAME,EAAmB,MAAMC,GAA4B,CAAE,QAAAJ,CAAO,CAAG,EACvE,GAAIG,EAAiB,OAAS,EAC1B,MAAM,IAAI,MAAM,+CAA+CA,CAAgB,wCAAwC,CAE/H,OAASxB,EAAO,CACZ,cAAQ,MAAM,GAAGX,CAAE,IAAIY,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQlB,IAAW,QAAQ,IAAI,GAAGO,CAAE,YAAY,CAChD,CACJ,CAUS,MAAM,QAAQgC,EAAgC,CACnD,IAAMhC,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,QAAQ,IAAI,IAC1C,GAAI,CAGA,GAFIP,IAAW,QAAQ,IAAI,GAAGO,CAAE,cAAc,EAE1C,CAAC,KAAK,KAAQ,MAAM,IAAI,MAAM,gIAAgI,EAyClK,GAAI,CAACgC,EAAQ,UAAa,MAAM,IAAI,MAAM,gEAAgE,EAU1G,MAAM,KAAK,wBAAwB,CAAE,QAAAA,CAAO,CAAE,EAM9C,IAAMK,EAAW,MAAM,KAAK,mBAAmBL,CAAO,EAEtD,GAAIK,EAAU,CAQV,IAAMC,EAAwB,MAAMC,GAAuB,CACvD,UAAWP,EAAQ,UACnB,MAAO,KAAK,KAAK,WACpB,EAOD,OAAOK,CACX,KAAO,CAEC5C,IAAW,QAAQ,IAAI,GAAGO,CAAE,8HAA8H,EAE9J,MACJ,CACJ,OAASW,EAAO,CACZ,cAAQ,MAAM,GAAGX,CAAE,IAAIY,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQlB,IAAW,QAAQ,IAAI,GAAGO,CAAE,YAAY,CAChD,CACJ,CAkCU,MAAM,cAAcwC,EAAY,CACtC,IAAMxC,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,cAAc,IAAI,IAChD,GAAI,CAIA,GAHIP,IAAW,QAAQ,IAAI,GAAGO,CAAE,oDAAoD,EAEpF,QAAQ,KAAK,GAAGA,CAAE,8GAA8G,EAC5H,CAAC,KAAK,KAAQ,MAAM,IAAI,MAAM,qEAAqE,EAEvG,IAAMyC,EAAS,MAAMC,GAAa,CAAE,MAAO,KAAK,KAAK,WAAY,KAAAF,CAAI,CAAE,EAEvE,GAAIC,EAAO,SAAWA,EAAO,QAAUA,EAAO,OAAO,SAAW,EAE5D,OADcA,EAAO,OAAO,CAAC,EAG7B,MAAM,IAAI,MAAM,sBAAsBD,CAAI,sBAAsB,KAAK,KAAK,UAAU,aAAaC,EAAO,UAAY,qDAAqD,wCAAwC,CAEzN,OAAS9B,EAAO,CACZ,cAAQ,MAAM,GAAGX,CAAE,IAAIY,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQlB,IAAW,QAAQ,IAAI,GAAGO,CAAE,YAAY,CAChD,CACJ,GCnhBJ,IAAM2C,GAAU,GAKHC,GAA0B,CACnC,OAAQ,CACJ,KAAMC,GAAc,QACpB,KAAMC,GAAsB,eAC5B,OAAQ,EACR,UAAWC,GAA0B,OAEzC,aAAc,CACV,GAAIC,GACJ,KAAMC,GACN,KAAM,GACN,oBAAqB,EACrB,gBAAiB,EACjB,qBAAsB,EACtB,oBAAqB,IAOvB,SAAUC,GAAoBC,EAA0B,CAI1D,IAAMC,EAAK,IAAIF,GAAoB,IAAI,IACvC,GAAI,CACIP,IAAW,QAAQ,IAAI,GAAGS,CAAE,oDAAoD,EAEpF,IAAMC,GAAeF,EAAS,MAAM,gBAAkB,CAAA,GAAI,KACrDG,GAAMA,EAAE,KAAOV,GAAwB,aAAa,EAAE,EAE3D,GAAI,CAACS,EACD,MAAM,IAAI,MAAM,qBAAqBT,GAAwB,aAAa,EAAE,8CAA8C,EAG9H,IAAMW,EAAe,OAAO,KAAKF,EAAY,UAAU,EAAE,KAAI,EAC7D,GAAIE,EAAa,SAAW,EACxB,MAAM,IAAI,MAAM,sEAAsE,EAG1F,IAAMC,EAAcD,EAAa,CAAC,EAC5BE,EAAYJ,EAAY,WAAWG,CAAW,EACpD,MAAO,CAAE,YAAAA,EAAa,UAAAC,CAAS,CAEnC,OAASC,EAAO,CACZ,cAAQ,MAAM,GAAGN,CAAE,IAAIO,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQf,IAAW,QAAQ,IAAI,GAAGS,CAAE,YAAY,CAChD,CACJ,CA9BgBQ,EAAAV,GAAA,uBCrDT,IAAMW,GAA+C,sBAC/CC,GAAqC,YACrCC,GAA0C,iBAC1CC,GAAsC,aACtCC,GAAmC,UACnCC,GAAqC,YACrCC,GAAsC,aACtCC,GAA+C,sBAC/CC,GAAoD,2BACpDC,GAA6D,oCAC7DC,GAA0C,iBAC1CC,GAAsC,aAqBtCC,EAAuB,CAEhC,oBAAqBZ,GAErB,UAAWC,GAEX,eAAgBC,GAEhB,WAAYC,GAEZ,QAASC,GAET,UAAWC,GAEX,WAAYC,GAEZ,oBAAqBC,GAErB,yBAA0BC,GAE1B,kCAAmCC,GAEnC,eAAgBC,GAEhB,WAAYC,IAGHE,GAAgE,OAAO,OAAOD,CAAoB,EAEzG,SAAUE,GAAuBC,EAAU,CAC7C,OAAOF,GAAsC,SAASE,CAAK,CAC/D,CAFgBC,EAAAF,GAAA,0BC9BhB,SAASG,GAAkBC,EAAQ,CAC/B,MAAM,IAAI,MAAM,2BAA2BA,CAAC,wCAAwC,CACxF,CAFSC,EAAAF,GAAA,qBAKT,IAAMG,GAA8B,GAKvBC,GAAP,MAAOC,UACDC,EAAsF,CA5ClG,MA4CkG,CAAAJ,EAAA,mCAG3E,GAAa,IAAIG,EAA2B,IAAI,IAEnE,IAAa,WAAS,CAClB,OAAOA,EAA2B,IACtC,CAEA,IAAW,cAAY,CACnB,OAAO,KAAK,KAAO,QAAa,KAAK,GAAG,aAAe,UAAU,IACrE,CAKU,GACA,cACA,aACA,sBAAoC,CAAA,EACpC,yBAEV,YACIE,EACAC,EAAgD,CAEhD,MAAMD,EAAaC,CAAa,CACpC,CAEmB,MAAM,gBAAgBC,EAAwC,CAC7E,IAAMC,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,gBAAgB,IAAI,IAClD,GAAI,CAAC,KAAK,MAAM,MACZ,MAAM,IAAI,MAAM,kEAAkE,EAEtF,GAAI,CAAC,KAAK,MAAM,cACZ,MAAM,IAAI,MAAM,0EAA0E,CAElG,CAKmB,MAAM,wBAAwB,CAC7C,kBAAAC,EACA,gBAAAC,CAAe,EAIlB,CACG,IAAMF,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,wBAAwB,IAAI,IAC1D,GAAI,CAEA,GADIP,IAAW,QAAQ,IAAI,GAAGO,CAAE,iCAAiC,KAAK,KAAM,aAAa,KAAK,EAC1F,CAAC,KAAK,KAAQ,MAAM,IAAI,MAAM,qEAAqE,EAEvG,GAAI,CAAC,KAAK,KAAK,cAAiB,MAAM,IAAI,MAAM,mFAAmF,EAEnI,IAAMG,EAAW,MAAM,MAAM,KAAK,KAAK,cAAe,CAClD,OAAQ,MACR,QAAS,CACL,eAAgB,oBAEpB,KAAM,KAAK,UAAU,CACjB,cAAeF,EACf,sBAAuB,CAACC,CAAe,EAC1C,EACJ,EAED,GAAI,CAACC,EAAS,GAAI,CACd,IAAMC,EAAO,MAAMD,EAAS,KAAI,EAAG,MAAM,KAAO,CAAA,EAAG,EAC7CE,EAAWD,EAAK,SAAWA,EAAK,OAAS,gBAC/C,MAAM,IAAI,MAAM,QAAQD,EAAS,MAAM,uCAAuCE,CAAQ,wCAAwC,CAClI,CAEIZ,IAAW,QAAQ,IAAI,GAAGO,CAAE,kCAAkC,CACtE,OAASM,EAAO,CACZ,cAAQ,MAAM,GAAGN,CAAE,2BAA2BO,EAAgBD,CAAK,CAAC,EAAE,EAChEA,CACV,CACJ,CAKmB,MAAM,YAAYP,EAAwC,CACzE,IAAMC,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,YAAY,IAAI,IAC9C,GAAI,CACIP,IAAW,QAAQ,IAAI,GAAGO,CAAE,cAAc,EAE9C,GAAM,CAAE,eAAAQ,EAAgB,eAAAC,EAAgB,OAAAC,EAAQ,eAAAC,EAAgB,WAAAC,CAAU,EAAK,KAAK,KACpF,GAAI,CAACJ,GAAkB,CAACC,GAAkB,CAACC,EACvC,MAAM,IAAI,MAAM,mFAAmF,EAIvG,IAAMG,EAAe,MAAMJ,EAAc,EACnCK,EAAgB,MAAMC,GAAoB,CAAE,aAAAF,EAAc,OAAAH,CAAM,CAAE,EAGlEM,EAAYC,EAAa,CAAE,MAAOT,CAAc,CAAE,EAGlDU,EAAQD,EAAa,CAAE,OAAOT,EAAe,QAAQ,KAAOA,EAA+B,CAAE,EAO7FW,EACF,MAAMR,EAAe,cAAc,CAAE,MAAOH,EAAgB,MAAOI,CAAU,CAAE,EACnF,GAAI,CAACO,EAA4B,MAAM,IAAI,MAAM,gMAAgM,EAMjP,IAAMC,IAJS,MAAMT,EAAe,IAAI,CAAE,MAAO,CAACQ,CAAwB,EAAG,MAAOP,CAAU,CAAE,GAC3E,SAAS,CAAC,GAGL,KAAK,OAAO,GAAG,CAAC,GAAG,MAAM,OACnD,GAAI,CAACQ,EACD,MAAM,IAAI,MAAM,8FAA8F,EAIlH,IAAMC,GADU,MAAMV,EAAe,IAAI,CAAE,MAAO,CAACS,CAAW,EAAG,MAAOR,CAAU,CAAE,GAC3D,SAAS,CAAC,EACnC,GAAI,CAACS,EACD,MAAM,IAAI,MAAM,8CAA8CD,CAAW,wCAAwC,EAIrH,IAAME,GACDD,EAAS,MAAM,gBAAkB,CAAA,GAC7B,KAAKE,GAAKA,EAAE,KAAOC,GAAwB,aAAa,EAAE,EACnE,GAAI,CAACF,EACD,MAAM,IAAI,MAAM,6EAA6E,EAGjG,GAAM,CAAE,YAAAG,CAAW,EAAKC,GAAoBL,CAAQ,EAC9CM,EAAWC,GAAwB,OAAO,CAAE,OAAQN,EAAY,MAAM,CAAE,EACxEO,EAAa,MAAMF,EAAS,iBAAiB,CAAE,aAAcb,CAAa,CAAE,EAC5EgB,EAAW,MAAMH,EAAS,iBAAiB,CAC7C,WAAAE,EACA,OAAQL,GAAwB,aAAa,GAC7C,YAAAC,EACH,EAGKM,EAAQ,GAAG,KAAK,KAAM,KAAK,UAAU,mBAAmBX,CAAW,CAAC,aAAa,mBAAmBU,EAAS,KAAK,CAAC,GACrHrC,IAAW,QAAQ,IAAI,GAAGO,CAAE,6BAA6B+B,CAAK,EAAE,EAEpE,IAAMC,EAAK,IAAI,UAAUD,CAAK,EAC9B,YAAK,GAAKC,EAEH,IAAI,QAAc,CAACC,EAASC,IAAU,CACzC,IAAIC,EAAa,GAEjBH,EAAG,iBAAiB,OAAQ,IAAK,CACzBvC,IAAW,QAAQ,IAAI,GAAGO,CAAE,0CAA0C,CAC9E,CAAC,EAED,KAAK,yBAA2B,MAAOoC,GAAM,CACzC,GAAI,CACA,IAAMC,EAAM,KAAK,MAAMD,EAAG,IAAI,EAC1B3C,IAAW,QAAQ,IAAI,GAAGO,CAAE,8BAA8BqC,EAAI,IAAI,EAAE,EAExE,IAAMC,EAAUD,EAAI,KACpB,GAAI,CAACE,GAAuBD,CAAO,EAAG,CAClC,IAAME,EAAaC,GAAsC,KAAK,IAAI,EAClE,MAAM,IAAI,MAAM,yBAAyBH,CAAO,4DAA4DE,CAAU,uCAAuC,CACjK,CAEA,OAAQF,EAAS,CACb,KAAKI,EAAqB,oBACtB,MAAM,KAAK,iCAAiCV,EAAIZ,CAAW,EAC3D,MACJ,KAAKsB,EAAqB,eACtB,MAAM,KAAK,6BAA6BV,EAAIK,EAAKhB,EAAUP,CAAa,EACxE,MACJ,KAAK4B,EAAqB,QACtBP,EAAa,GACb,KAAK,sBAAsBH,EAAIC,CAAO,EACtC,MACJ,KAAKS,EAAqB,UACtB,KAAK,wBAAwBL,EAAKH,CAAM,EACxC,MACJ,KAAKQ,EAAqB,WACtB,KAAK,yBAAyBL,EAAKH,CAAM,EACzC,MAEJ,KAAKQ,EAAqB,UAC1B,KAAKA,EAAqB,WAC1B,KAAKA,EAAqB,WAC1B,KAAKA,EAAqB,oBAC1B,KAAKA,EAAqB,yBAC1B,KAAKA,EAAqB,kCAC1B,KAAKA,EAAqB,eACtB,MAAM,IAAI,MAAM,4BAA4BJ,CAAO,qEAAqE,EAC5H,QACIhD,GAAkBgD,CAAO,CACjC,CACJ,OAAShC,EAAO,CACZ,QAAQ,MAAM,GAAGN,CAAE,IAAIO,EAAgBD,CAAK,CAAC,EAAE,EAC/C4B,EAAO5B,CAAK,CAChB,CACJ,EAEA0B,EAAG,iBAAiB,UAAW,KAAK,wBAAwB,EAE5DA,EAAG,iBAAiB,QAAUW,GAAS,CAC9BR,IACD,KAAK,WAAU,EACfD,EAAO,IAAI,MAAM,oDAAoDS,EAAM,IAAI,GAAG,CAAC,EAE3F,CAAC,EAEDX,EAAG,iBAAiB,QAAUY,GAAO,CAC5BT,IACD,KAAK,WAAU,EACfD,EAAO,IAAI,MAAM,4BAA4B,CAAC,EAEtD,CAAC,CACL,CAAC,CAEL,OAAS5B,EAAO,CACZ,cAAQ,MAAM,GAAGN,CAAE,oBAAoBO,EAAgBD,CAAK,CAAC,EAAE,EACzDA,CACV,CACJ,CAOO,YAAU,CACb,IAAMN,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,WAAW,IAAI,IAC7C,GAAI,CAGA,GAFIP,IAAW,QAAQ,IAAI,GAAGO,CAAE,oDAAoD,EAEhF,KAAK,GAAI,CACL,KAAK,2BACL,KAAK,GAAG,oBAAoB,UAAW,KAAK,wBAAwB,EACpE,KAAK,yBAA2B,QAEpC,GAAI,CACA,KAAK,GAAG,MAAK,CACjB,OAASM,EAAO,CACZ,QAAQ,MAAM,GAAGN,CAAE,+BAA+BO,EAAgBD,CAAK,CAAC,EAAE,CAC9E,CACA,KAAK,GAAK,MACd,CACJ,OAASA,EAAO,CACZ,QAAQ,MAAM,GAAGN,CAAE,IAAIO,EAAgBD,CAAK,CAAC,EAAE,CAEnD,SACQb,IAAW,QAAQ,IAAI,GAAGO,CAAE,YAAY,CAChD,CACJ,CAKU,MAAM,qBAAqB2C,EAAmB,CACpD,IAAM3C,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,qBAAqB,IAAI,IACvD,GAAI,CACA,IAAMqC,EAAM,KAAK,MAAMM,EAAM,IAAI,EAC7BlD,IAAW,QAAQ,IAAI,GAAGO,CAAE,4BAA4BqC,EAAI,IAAI,EAAE,EAEtE,IAAMC,EAAUD,EAAI,KACpB,GAAI,CAACE,GAAuBD,CAAO,EAAG,CAClC,IAAME,EAAaC,GAAsC,KAAK,IAAI,EAClE,MAAM,IAAI,MAAM,yBAAyBH,CAAO,6DAA6DE,CAAU,uCAAuC,CAClK,CAEA,OAAQF,EAAS,CACb,KAAKI,EAAqB,oBACtB,MAAM,KAAK,+BAA+BL,CAAG,EAC7C,MACJ,KAAKK,EAAqB,yBACtB,KAAK,oCAAmC,EACxC,MACJ,KAAKA,EAAqB,eACtB,KAAK,2BAA2BL,CAAG,EACnC,MACJ,KAAKK,EAAqB,WACtB,KAAK,uBAAuBL,CAAG,EAC/B,MAEJ,KAAKK,EAAqB,oBAC1B,KAAKA,EAAqB,UAC1B,KAAKA,EAAqB,eAC1B,KAAKA,EAAqB,WAC1B,KAAKA,EAAqB,QAC1B,KAAKA,EAAqB,UAC1B,KAAKA,EAAqB,WAC1B,KAAKA,EAAqB,kCACtB,MAAM,IAAI,MAAM,4BAA4BJ,CAAO,sEAAsE,EAC7H,QACIhD,GAAkBgD,CAAO,CACjC,CACJ,OAAShC,EAAO,CAGZ,GAFA,QAAQ,MAAM,GAAGN,CAAE,2CAA2CO,EAAgBD,CAAK,CAAC,EAAE,EACtF,KAAK,WAAU,EACX,KAAK,aAAc,CACnB,IAAM4B,EAAS,KAAK,aACpB,KAAK,cAAgB,OACrB,KAAK,aAAe,OACpBA,EAAO5B,CAAK,CAChB,CACJ,CACJ,CAEU,MAAM,iCAAiC0B,EAAeZ,EAAmB,CAC/EY,EAAG,KAAK,KAAK,UAAU,CACnB,KAAMU,EAAqB,UAC3B,MAAOtB,EACV,CAAC,CACN,CAEU,MAAM,6BACZY,EACAK,EACAhB,EACAP,EAAqB,CAErB,GAAM,CAAE,cAAA+B,EAAe,YAAAC,CAAW,EAAKT,EACnC5C,IAAW,QAAQ,IAAI,GAAG,KAAK,EAAE,iCAAiCqD,EAAY,KAAK,IAAI,CAAC,EAAE,EAE9F,IAAMC,EAAa,MAAM,KAAK,mBAAmB,CAC7C,cAAAF,EACA,YAAAC,EACH,EAED,GAAI,CAACC,EACD,MAAM,IAAI,MAAM,6EAA6E,EAGjGf,EAAG,KAAK,KAAK,UAAU,CACnB,KAAMU,EAAqB,WAC3B,WAAAK,EACH,CAAC,CACN,CAEU,sBAAsBf,EAAeC,EAAmB,CAC1DxC,IAAW,QAAQ,IAAI,GAAG,KAAK,EAAE,6BAA6B,EAC9D,KAAK,2BACLuC,EAAG,oBAAoB,UAAW,KAAK,wBAAwB,EAC/D,KAAK,yBAA2B,QAEpCA,EAAG,iBAAiB,UAAYW,GAAU,KAAK,qBAAqBA,CAAK,CAAC,EAC1EV,EAAO,CACX,CAEU,wBAAwBI,EAAUH,EAA4B,CACpE,KAAK,WAAU,EACfA,EAAO,IAAI,MAAM,0BAA0BG,EAAI,SAAW,qBAAqB,wCAAwC,CAAC,CAC5H,CAEU,yBAAyBA,EAAUH,EAA4B,CACrE,KAAK,WAAU,EACfA,EAAO,IAAI,MAAM,yBAAyBG,EAAI,SAAWA,EAAI,OAAS,oBAAoB,wCAAwC,CAAC,CACvI,CAEU,MAAM,+BAA+BA,EAAQ,CACnD,IAAMW,EAAkBX,EAAI,QAEtBY,EAAmB,MAAMC,GAA4B,CAAE,QAASF,CAAe,CAAE,EACvF,GAAIC,EAAiB,OAAS,EAC1B,MAAM,IAAI,MAAM,sCAAsCA,EAAiB,KAAK,IAAI,CAAC,wCAAwC,EAI7H,IAAME,EAA+B,CACjCC,GAAM,CAAE,MAAOJ,CAAe,CAAE,EAChCA,EAAgB,UAChBA,EAAgB,cAEhBA,EAAgB,uBAChBG,EAAiB,KAAKH,EAAgB,qBAAqB,EAG/D,GAAM,CAAE,WAAApC,CAAU,EAAK,KAAK,KAC5B,QAAWyC,KAASF,EAChB,MAAMG,GAAW,CAAE,MAAO1C,EAAY,OAAQ,CAACyC,CAAK,CAAC,CAAE,EACvD,MAAME,GAAiB,CAAE,MAAO3C,EAAY,MAAAyC,CAAK,CAAE,EAWvD,IAR6BL,EAAgB,OAAO,qBAAqB,GAAK,CAAA,GACrD,OAAS,GAC9B,KAAK,GAAI,KAAK,KAAK,UAAU,CACzB,KAAMN,EAAqB,kCAC3B,YAAazB,EAAa,CAAE,MAAO+B,CAAe,CAAE,EACvD,CAAC,EAGF,KAAK,cAAe,CACpB,IAAMf,EAAU,KAAK,cACrB,KAAK,cAAgB,OACrB,KAAK,aAAe,OACpBA,EAAQe,CAAe,CAC3B,CACJ,CAEU,qCAAmC,CACzC,IAAMQ,EAAW,KAAK,uBAAyB,CAAA,EAC/C,KAAK,sBAAwB,CAAA,EAC7B,QAAWH,KAASG,EAChB,KAAK,GAAI,KAAK,KAAK,UAAU,CACzB,KAAMd,EAAqB,eAC3B,MAAAW,EACH,CAAC,CAEV,CAEU,2BAA2BhB,EAAQ,CACzC,IAAMoB,EAAUpB,EAAI,MACpB,KAAK,6BAA6B,KAAKoB,CAAO,CAClD,CAEU,uBAAuBpB,EAAQ,CACrC,IAAMqB,EAAcrB,EAAI,SAAWA,EAAI,OAAS,6BAC1C/B,EAAQ,IAAI,MAAM,qCAAqCoD,CAAW,wCAAwC,EAChH,GAAI,KAAK,aAAc,CACnB,IAAMxB,EAAS,KAAK,aACpB,KAAK,cAAgB,OACrB,KAAK,aAAe,OACpBA,EAAO5B,CAAK,CAChB,KACI,OAAMA,CAEd,CAKmB,MAAM,mBAAmBqD,EAAgC,CACxE,IAAM3D,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,mBAAmB,IAAI,IACrD,GAAI,CACA,GAAI,CAAC,KAAK,IAAM,KAAK,GAAG,aAAe,UAAU,KAC7C,MAAM,IAAI,MAAM,0EAA0E,EAI9F,IAAM4D,EAAiBD,EAAQ,qBAAuB,CAAA,EACtD,KAAK,sBAAwB,CAAC,GAAGC,CAAc,EAG/C,IAAMC,EAAgB,CAAE,GAAGF,CAAO,EAClC,cAAOE,EAAc,oBAGd,IAAI,QAA6C,CAAC5B,EAASC,IAAU,CACxE,KAAK,cAAgBD,EACrB,KAAK,aAAeC,EAEpB,KAAK,GAAI,KAAK,KAAK,UAAU,CACzB,KAAMQ,EAAqB,WAC3B,QAASmB,EACZ,CAAC,CACN,CAAC,CAEL,OAASvD,EAAO,CACZ,cAAQ,MAAM,GAAGN,CAAE,+BAA+BO,EAAgBD,CAAK,CAAC,EAAE,EACpEA,CACV,CACJ,GC3fG,IAAMwD,GAAqB,eCQlC,eAAsBC,GAAqB,CACvC,KAAAC,CAAI,EAGP,CACG,IAAMC,EAAK,IAAIF,GAAqB,IAAI,IACxC,GAAI,CAUA,MARW,CACPG,GACAF,EAAK,OACLA,EAAK,OACP,KAAK,GAAG,CAKd,OAASG,EAAO,CACZ,cAAQ,MAAM,GAAGF,CAAE,IAAIG,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,CACJ,CArBsBE,EAAAN,GAAA,wBAgEtB,eAAsBO,GAA4B,CAC9C,WAAAC,EACA,MAAAC,CAAK,EAIR,CACG,IAAMC,EAAK,IAAIH,GAA4B,IAAI,IAC/C,GAAI,CAMA,IAAMI,GALQ,MAAMC,GAAe,CAC/B,MAAOJ,EACP,WAAY,CAACK,EAAmB,EAChC,MAAAJ,EACH,GACkBI,EAAmB,EAEtC,GAAI,CAACF,GAAQA,EAAK,SAAW,EACzB,MAAM,IAAI,MAAM,6DAA6DH,EAAW,EAAE,wCAAwC,EAGtI,GAAIG,EAAK,OAAS,EACd,MAAM,IAAI,MAAM,oDAAoDA,EAAK,MAAM,gBAAgBH,EAAW,EAAE,6GAA6G,EAG7N,OAAOG,EAAK,CAAC,CACjB,OAASG,EAAO,CACZ,cAAQ,MAAM,GAAGJ,CAAE,IAAIK,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,CACJ,CA7BsBE,EAAAT,GAAA,+BCLtB,IAAMU,EAA8B,GAC9BC,GAAuB,GACvBC,GAAkB,kBAeXC,GAAP,MAAOC,CAAmB,CApFhC,MAoFgC,CAAAC,EAAA,4BACpB,GAAa,IAAID,EAAoB,IAAI,IAEjD,aAAA,CAEA,CASU,iCAA+B,CACrC,OAAOE,GAAyB,CAC5B,GAAIC,GACJ,KAAM,mBAAmB,KAAK,IAAG,CAAE,GACnC,MAAO,CAACC,EAAqB,EAC7B,KAAM,GACN,WAAY,EACZ,OAAQ,EACR,cAAe,EACf,kBAAmBC,GAA0B,UAChD,CACL,CASU,8BAA4B,CAClC,OAAOH,GAAyB,CAC5B,GAAII,GACJ,KAAM,gBAAgB,KAAK,IAAG,CAAE,GAChC,MAAO,CAACC,EAAkB,EAC1B,KAAM,IACN,WAAY,EACZ,OAAQ,EACR,cAAe,EACf,kBAAmBF,GAA0B,MAChD,CACL,CASO,MAAM,KAAK,CACd,KAAAG,EACA,aAAAC,EACA,mBAAAC,EACA,eAAAC,EACA,iBAAAC,EAAmBC,GAAqB,MACxC,UAAAC,EACA,WAAAC,CAAU,EA0Cb,CACG,IAAMC,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,KAAK,IAAI,IAGvC,GAFIpB,GAAW,QAAQ,IAAI,GAAGoB,CAAE,cAAc,EAE1C,CAACD,EAAY,CACb,SACA,MAAM,IAAI,MAAM,GAAGC,CAAE,wEAAwE,CACjG,CAEA,GAAIN,GAAsBC,EAAgB,CACtC,GAAI,CAACD,EAAsB,MAAM,IAAI,MAAM,gJAAgJ,EAC3L,GAAI,CAACC,EAAkB,MAAM,IAAI,MAAM,gJAAgJ,EAEvL,GAAM,CAAE,eAAAM,EAAgB,iBAAAC,CAAgB,EAAKR,EAC7C,GAAI,CAACO,EAAkB,MAAM,IAAI,MAAM,4KAA4K,EACnN,GAAI,CAACC,EAAoB,MAAM,IAAI,MAAM,8KAA8K,CAC3N,CAEA,GAAM,CAAE,eAAAD,EAAgB,iBAAAC,CAAgB,EAAKR,GAAsB,CAAA,EAG7DS,EAAS,MAAMC,GAAO,EAItBC,EAAW,MAAMC,GAAY,EACnC,GAAI,CAACD,EAAS,KAAQ,MAAM,IAAI,MAAM,yEAAyE,EAC/G,IAAIE,EACAC,EACEC,EAAO,IAAI,QAAc,CAACC,EAASC,IAAU,CAC/CJ,EAAcG,EACdF,EAAaG,CACjB,CAAC,EAGKC,EAAgB,MAAMC,GAAgB,EACtCC,EAAY,MAAMhB,EAAU,oBAAoB,CAClD,KAAM,CACF,YAAa,GACb,UAAWc,EACX,YAAad,EAAU,YACvB,QAAAlB,GAEP,EACD,GAAI,CAACkC,EAAa,MAAM,IAAI,MAAM,mEAAmE,EACrG,MAAMA,EAAU,YAEhB,IAAMC,EAAU9B,EAAA,SAAW,CAG3B,EAHgB,WAMhB,OAAC,SAAW,CACR,GAAI,CACA,IAAM+B,EAAcvB,EAAeA,EAAa,IAAIwB,GAAUC,EAAa,CAAE,MAAOD,CAAM,CAAE,CAAC,EAAI,OAGjGzB,EAAK,gBAAgB,CACjB,OAAAW,EACA,eAAAF,EACA,iBAAAC,EACA,eAAAP,EACA,yBAA0B,KAAK,gCAA+B,EAC9D,sBAAuB,KAAK,6BAA4B,EACxD,YAAAqB,EACI,EAGR,MAAMxB,EAAK,yBAAwB,EAGnC,MAAMA,EAAK,QAAQ,CAAE,OAAAW,CAAM,CAAE,EAG7B,GAAM,CAAE,UAAAgB,EAAW,gBAAAC,CAAe,EAAK,MAAM,KAAK,gBAAgB,CAC9D,OAAAjB,EACA,aAAAV,EACA,iBAAAG,EACA,UAAAE,EAAW,WAAAC,EAAY,UAAAe,EACvB,KAAAtB,EACH,EAaD,GAVA,MAAM,KAAK,gBAAgB,CACvB,UAAA2B,EAAW,gBAAAC,EACX,KAAA5B,EACA,SAAAa,EACA,WAAAN,EACA,UAAAe,EACA,UAAAhB,EACH,EAEDS,EAAW,EACP,CAACF,EAAS,SAAY,MAAM,IAAI,MAAM,6EAA6E,EACvHA,EAAS,SAAQ,CAErB,OAASgB,EAAO,CAGZ,GAFA,QAAQ,MAAM,GAAGrB,CAAE,IAAIsB,EAAgBD,CAAK,CAAC,EAAE,EAC/Cb,EAAWa,CAAK,EACZ,CAAChB,EAAS,MAAS,MAAM,IAAI,MAAM,0EAA0E,EACjHA,EAAS,MAAMgB,CAAK,CACxB,SACI,MAAMN,EAAO,CACjB,CACJ,GAAE,EAEK,CAAE,OAAAZ,EAAQ,SAAAE,EAAU,KAAAI,CAAI,CACnC,CAaO,MAAM,aAAa,CACtB,YAAAc,EACA,QAAAC,EACA,YAAAC,EACA,UAAA3B,EACA,KAAAN,CAAI,EAgBP,CACG,IAAMQ,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,aAAa,IAAI,IAC/C,GAAI,CACIpB,GAAW,QAAQ,IAAI,GAAGoB,CAAE,oDAAoD,EAEpF,IAAM0B,EAAgB,MAAM,KAAK,0BAA0B,CACvD,YAAAH,EACA,QAAAC,EACA,YAAAC,EACA,UAAA3B,EACH,EAED,GAAK4B,GAIE,GAAIA,EAAc,eAAe,aAEpC,OAAO,SALP,QAAI9C,GAAW,QAAQ,IAAI,GAAGoB,CAAE,0EAA0E,EAEnG,KAOX,GAAI0B,EAAc,SACd,MAAM,IAAI,MAAM,oDAAoDA,EAAc,QAAQ,wCAAwC,EAC/H,GAAI,CAACA,EAAc,cACtB,MAAM,IAAI,MAAM,uFAAuF,EAK3G,GAAM,CAAE,MAAAC,EAAO,oBAAAC,CAAmB,EAAKF,EAAc,cAE/CG,EAAc,MAAM,KAAK,sBAAsB,CACjD,UAAWF,EACX,WAAYH,EACZ,oBAAAI,EACA,UAAA9B,EACA,oBAAqByB,EAAY,QAAQ,kBAAkB,CAAC,EAC5D,KAAA/B,EACA,SAAU,GACb,EAGKsC,EAA4B,MAAMC,GAA4B,CAChE,QAASF,EACZ,EACD,GAAIC,EAA0B,OAAS,EAAK,MAAM,IAAI,MAAM,uHAAuHA,CAAyB,wCAAwC,EAEpP,OAAOD,CACX,OAASR,EAAO,CACZ,cAAQ,MAAM,GAAGrB,CAAE,IAAIsB,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQzC,GAAW,QAAQ,IAAI,GAAGoB,CAAE,YAAY,CAChD,CACJ,CAmBQ,MAAM,gBAAgB,CAC1B,UAAAmB,EACA,gBAAAC,EACA,KAAA5B,EACA,SAAAa,EACA,WAAAN,EACA,UAAAe,EACA,UAAAhB,CAAS,EAeZ,CACG,IAAME,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,gBAAgB,IAAI,IAG9CgC,EAAoCb,EAEpCc,EAA+B,CAAA,EAEnC,KAAOD,GAAc,CAUjB,IAAME,EAAoB,IAAI,IAExBC,EAAQ,GAAGnC,CAAE,sCACboC,EAAe,MAAM5C,EAAK,6BAA6B,UAAU6C,GAAM,CACzE,KAAMpD,EAAA,MAAOqD,GAAmB,CACxB1D,GAAW,QAAQ,IAAI,GAAGuD,CAAK,oDAAoD,EACvF,IAAMI,EAAOrB,EAAa,CAAE,MAAOoB,CAAK,CAAE,EACtCzD,IAAwB,QAAQ,IAAI,GAAGmB,CAAE,GAAGlB,EAAe,0CAA0CyD,CAAI,wCAAwC,EACrJL,EAAkB,IAAIK,EAAMD,CAAK,CACrC,EALM,QAMN,MAAOrD,EAAA,MAAOuD,GAAqC,CAC3CC,GAAQD,CAAC,EACT,QAAQ,MAAM,GAAGL,CAAK,wBAAwB,KAAK,UAAWK,EAAe,IAAI,CAAC,wCAAwC,GAE1H,QAAQ,IAAIA,CAAC,EACb,QAAQ,MAAM,GAAGL,CAAK,wBAAwBb,EAAgBkB,CAAC,CAAC,wCAAwC,EAEhH,EAPO,SAQP,SAAUvD,EAAA,SAAW,CACbL,GAAW,QAAQ,IAAI,GAAGuD,CAAK,wDAAwD,EAC3F,MAAMC,EAAa,YAAW,CAClC,EAHU,YAIb,CAAC,EAGF,GAAI,CAEA,IAAMM,EAAa,MAAM,KAAK,sBAAsB,CAChD,UAAWV,EAOX,oBAAqBC,EACrB,WAAAlC,EACA,UAAAD,EACA,oBAAqBN,EAAK,2BAC1B,KAAAA,EACH,EAGD,GAAIX,GAAsB,CACtB,IAAM8D,EAAcV,EAAiB,IAAIW,GAAK1B,EAAa,CAAE,MAAO0B,CAAC,CAAE,CAAC,EACxE,QAAQ,IAAI,GAAG5C,CAAE,GAAGlB,EAAe,uEAAuE,EAC1G,QAAQ,IAAI,GAAGkB,CAAE,GAAGlB,EAAe,eAAeoC,EAAa,CAAE,MAAOwB,CAAU,CAAE,CAAC,EAAE,EACvF,QAAQ,IAAI,GAAG1C,CAAE,GAAGlB,EAAe,aAAaoC,EAAa,CAAE,MAAOc,CAAY,CAAE,CAAC,EAAE,EACvF,QAAQ,IAAI,GAAGhC,CAAE,GAAGlB,EAAe,uBAAuB6D,EAAY,MAAM,MAAMA,EAAY,KAAK,IAAI,GAAK,QAAQ,EAAE,CAC1H,CAKAtC,EAAS,KAAKqC,CAAU,EAGxBlD,EAAK,gBAAgB,CAAE,WAAAO,EAAY,eAAgBe,CAAS,CAAG,EAC/D,IAAMe,EAAc,MAAMrC,EAAK,QAAQkD,CAAU,EAKjD,GAAI,CAACb,EACD,GAAIG,EAGA,IADY,MAAMa,GAA4B,CAAE,WAAYb,EAAc,MAAOjC,CAAU,CAAE,IACpF,MAAM,QAAU+C,EAAU,OAAQ,CACnClE,GAAW,QAAQ,IAAI,GAAGoB,CAAE,sGAAsG,EACtIgC,EAAe,KACf,KACJ,KACI,OAAM,IAAI,MAAM,oNAAoN,MAGxO,OAAM,IAAI,MAAM,wFAAwF,EAShH,GAAI,CAACH,EAAY,KAAQ,MAAM,IAAI,MAAM,4EAA4E,EACrHxB,EAAS,KAAKwB,CAAW,EAIzB,IAAMkB,EACF,MAAMhB,GAA4B,CAAE,QAASF,CAAW,CAAE,EAC9D,GAAIkB,EAAoC,OAAS,EAAK,MAAM,IAAI,MAAM,wCAAwCA,CAAmC,wCAAwC,EAGzL,IAAMC,EAAsB,MAAM,KAAK,sBAAsB,CACzD,WAAAN,EACA,YAAAb,EACA,WAAA9B,EACH,EACD,GAAIiD,EAAoB,OAAS,EAC7B,MAAM,IAAI,MAAM,iCAAiCA,EAAoB,KAAK,IAAI,CAAC,wCAAwC,EAI3H,IAAMC,EAA6BpB,EAAY,KAAKqB,EAA8B,GAAiB,CAAA,EAanG,GAVID,EAA2B,OAAS,IACpCpB,EAAY,oBAAsB,MAAM,KAAK,sBAAsB,CAC/D,cAAeoB,EACf,eAAgB,GAChB,kBAAAf,EACA,UAAApB,EACH,GAID,CAACe,EAAY,UAAa,MAAM,IAAI,MAAM,8JAA8J,EAC5M,GAAIhD,GAAsB,CACtB,IAAMsE,EAAuBtB,EAAY,OAAO,sBAAsB,GAAiB,CAAA,EACvF,QAAQ,IAAI,GAAG7B,CAAE,GAAGlB,EAAe,wEAAwE,EAC3G,QAAQ,IAAI,GAAGkB,CAAE,GAAGlB,EAAe,wBAAwBoC,EAAa,CAAE,MAAOW,CAAW,CAAE,CAAC,EAAE,EACjG,QAAQ,IAAI,GAAG7B,CAAE,GAAGlB,EAAe,2BAA2BoC,EAAa,CAAE,MAAOW,EAAY,SAAS,CAAE,CAAC,EAAE,EAC9G,QAAQ,IAAI,GAAG7B,CAAE,GAAGlB,EAAe,wBAAwBqE,EAAqB,MAAM,MAAMA,EAAqB,KAAK,IAAI,GAAK,QAAQ,EAAE,EACzI,QAAQ,IAAI,GAAGnD,CAAE,GAAGlB,EAAe,uBAAuBmE,EAA2B,MAAM,MAAMA,EAA2B,KAAK,IAAI,GAAK,QAAQ,EAAE,CACxJ,CAUA,IAAMvB,EAAgB,MAAM,KAAK,0BAA0B,CACvD,YAAaG,EACb,gBAAAT,EACA,QAASrB,EACT,YAAae,EACb,UAAAhB,EACH,EAED,GAAK4B,GAIE,GAAIA,EAAc,eAAe,aAAc,CAC9C9C,GAAW,QAAQ,IAAI,GAAGoB,CAAE,0EAA0E,EAC1G,KACJ,MAPoB,CAEhB,QAAQ,MAAM,GAAGA,CAAE,4FAA4F,EAC/G,KACJ,CAMA,GAAI0B,EAAc,SACd,MAAM,IAAI,MAAM,oDAAoDA,EAAc,QAAQ,wCAAwC,EAC/H,GAAI,CAACA,EAAc,cACtB,MAAM,IAAI,MAAM,uFAAuF,EAM3G,GAAM,CAAE,MAAAC,EAAO,oBAAAC,CAAmB,EAAMF,EAAc,cAKtD,GAJAM,EAAeL,EACfM,EAAmB,CAAC,GAAIL,GAAuB,CAAA,CAAG,EAG9C/C,GAAsB,CACtB,IAAMuE,EAAqBnB,EAAiB,IAAIW,GAAK1B,EAAa,CAAE,MAAO0B,CAAC,CAAE,CAAC,EAC/E,QAAQ,IAAI,GAAG5C,CAAE,GAAGlB,EAAe,yEAAyE,EAC5G,QAAQ,IAAI,GAAGkB,CAAE,GAAGlB,EAAe,kBAAkBoC,EAAa,CAAE,MAAOc,CAAY,CAAE,CAAC,EAAE,EAC5F,QAAQ,IAAI,GAAGhC,CAAE,GAAGlB,EAAe,uBAAuBsE,EAAmB,MAAM,MAAMA,EAAmB,KAAK,IAAI,GAAK,QAAQ,EAAE,CACxI,CAEJ,SACI,MAAMhB,EAAa,YAAW,CAClC,CACJ,CACJ,CAcQ,MAAM,sBAAsB,CAChC,UAAAiB,EACA,oBAAAzB,EACA,UAAA9B,EACA,WAAAC,EACA,oBAAAuD,EACA,KAAA9D,EACA,SAAA+D,CAAQ,EAoCX,CACG,IAAMvD,EAAK,IAAI,KAAK,sBAAsB,IAAI,IAC9C,GAAI,CAIA,GAHIpB,GAAW,QAAQ,IAAI,GAAGoB,CAAE,oDAAoD,EAGhF,CAACqD,EAAU,KAAQ,MAAM,IAAI,MAAM,0EAA0E,EACjH,GAAI,CAACA,EAAU,KAAK,GAAKA,EAAU,KAAK,IAAM,EAAK,MAAM,IAAI,MAAM,sFAAsF,EAGzJ,IAAMG,EAAO,IAAI,KACXC,EAAYC,GAAaF,CAAI,EAC7BG,EAAcH,EAAK,gBAAe,EAElCI,EAA+B,CACjC,UAAAH,EACA,YAAAE,EACA,MAAON,EAAU,KAAK,GAIpBQ,EAAqBjC,EACvBA,GAAqB,IAAIkC,GAAK5C,EAAa,CAAE,MAAO4C,CAAC,CAAE,CAAC,EACxD,OACAD,GAAsBA,EAAmB,OAAS,IAClDD,EAAKV,EAA8B,EAAIW,GAI3C,IAAME,EAAmC,CACrC,UAAW,CAAC7C,EAAa,CAAE,MAAOmC,CAAS,CAAE,CAAC,GAG9CW,EACJ,GAAIV,EAAqB,CACrBA,EACI,MAAMxD,EAAU,cAAc,CAAE,KAAMwD,EAAqB,MAAOvD,CAAU,CAAE,GAAKuD,EACvF,IAAMW,EAAS,MAAMC,GAAa,CAAE,KAAMZ,EAAqB,MAAOvD,CAAU,CAAE,EAClF,GAAIkE,EAAO,SAAWA,EAAO,QAAQ,SAAW,EAC5CD,EAAkBC,EAAO,OAAQ,CAAC,EAClCF,EAAO,gBAAkB,CAACT,CAAmB,MAC1C,CACH,SACA,MAAM,IAAI,MAAM,qCAAqCA,CAAmB,eAAevD,EAAW,EAAE,wCAAwC,CAChJ,CACJ,CAGA,IAAMoE,EAAK,MAAMC,GAAqB,CAAE,KAAAR,CAAI,CAAE,EAExCS,EAAe,MAAMC,EAAW,MAAwD,CAC1F,kBAAmBC,GACnB,GAAAJ,EACA,KAAAP,EACA,OAAAG,EACH,EAEKS,EAActD,EAAa,CAAE,MAAOmD,CAAY,CAAE,EACpDI,EACAT,GAAmB,CAACT,IAGpBkB,EAAwB,MAAMjF,EAAK,YAAY,CAAE,YAAAgF,CAAW,CAAE,GAKlE,MAAME,GAAW,CAAE,MAAOL,EAAc,MAAOtE,CAAU,CAAG,EAC5D,MAAM4E,GAAiB,CACnB,MAAON,EACP,MAAOtE,EACP,YAAa,OAChB,EAGDsE,EAAa,UAAYhB,EAEzB,GAAM,CAAE,UAAAuB,CAAS,EAAK,MAAMC,GAAgC,CACxD,UAAWxB,EACX,WAAYtD,EACf,EACD,GAAI6E,EAAU,SAAW,EACrB,MAAM,IAAI,MAAM,yGAAyG,EAE7H,OAAAP,EAAa,aAAeO,EAAU,CAAC,EAEnChD,GAAuBA,EAAoB,OAAS,IACpDyC,EAAa,oBAAsBzC,GAEnC6C,IACAJ,EAAa,sBAAwBI,GAGlCJ,CACX,OAAShD,EAAO,CACZ,cAAQ,MAAM,GAAGrB,CAAE,IAAIsB,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQzC,GAAW,QAAQ,IAAI,GAAGoB,CAAE,YAAY,CAChD,CACJ,CAMO,MAAM,gBAAgB,CACzB,MAAA8E,EACA,UAAAhF,EACA,aAAAL,EACA,SAAAsF,CAAQ,EAMX,CACG,IAAM/E,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,gBAAgB,IAAI,IAClD,GAAI,CAGA,GAFIpB,GAAW,QAAQ,IAAI,GAAGoB,CAAE,oDAAoD,EAEhF,EAAEP,GAAgBA,EAAa,OAAS,IACxC,EAAEsF,GAAYA,EAAS,OAAS,GAEhC,MAAM,IAAI,MAAM,oHAAoH,EAGxI,GAAKtF,GAAgBA,EAAa,OAAS,GACtCsF,GAAYA,EAAS,OAAS,EAE/B,MAAM,IAAI,MAAM,0HAA0H,EAG9I,IAAIC,EAAiB,CAAA,EACrB,GAAID,EACAC,EAAOD,UACAtF,GAAgBA,EAAa,OAAS,EAAG,CAEhD,GAAM,CAAE,kBAAAwF,EAAmB,iBAAAC,CAAgB,EACvCC,GAAoB,CAAE,OAAQ1F,CAAY,CAAE,EAE1C2F,EAAa,CAAC,GAAG,OAAO,OAAOH,CAAiB,EAAG,GAAG,OAAO,OAAOC,CAAgB,CAAC,EACrFG,EAAcC,GAAyB,CAAE,OAAQF,CAAU,CAAE,EAEnEJ,EAAO,OAAO,KAAKK,CAAW,CAClC,KAGI,gBAAQ,KAAK,GAAGrF,CAAE,yGAAyG,EACpH,CAAA,EAGX,GAAIgF,EAAK,SAAW,EAAK,MAAO,CAAA,EAEhC,IAAMO,EAAM,MAAMC,GAAe,CAAE,MAAAV,EAAO,SAAUE,CAAI,CAAE,EAC1D,GAAI,CAACO,EAAI,MAAQ,CAACA,EAAI,KAAK,eACvB,MAAM,IAAI,MAAM,GAAGvF,CAAE,oEAAoE,EAG7F,OAAOuF,EAAI,KAAK,cACpB,OAASlE,EAAO,CACZ,cAAQ,MAAM,GAAGrB,CAAE,IAAIsB,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQzC,GAAW,QAAQ,IAAI,GAAGoB,CAAE,YAAY,CAChD,CACJ,CAEQ,MAAM,oBAAoB,CAC9B,aAAAP,EACA,MAAAqF,CAAK,EAIR,CACG,IAAM9E,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,oBAAoB,IAAI,IACtD,GAAIP,EAAa,SAAW,EACxB,MAAM,IAAI,MAAM,wGAAwG,EAG5H,IAAMgG,EAAY,MAAMC,GAAmB,CACvC,OAAQjG,EACR,KAAM,GACN,MAAAqF,EACH,EAEKa,EAAeF,GAAa,OAAO,KAAKA,CAAS,EAAE,OAAS,EAC9D7G,GAAW,QAAQ,IAAI,GAAGoB,CAAE,4BAA4B2F,EAAe,OAAO,KAAKF,CAAS,EAAE,OAAS,CAAC,EAAE,EAE9G,IAAMG,EAAYD,EAAe,OAAO,OAAOF,CAAS,EAAI,CAAA,EACtD,CACF,kBAAmBI,EACnB,iBAAkBC,EAClB,eAAgBC,CAAkB,EAClCZ,GAAoB,CAAE,OAAQS,CAAS,CAAE,EAEvCI,EAAS,OAAO,OAAOD,CAAkB,EACzCE,EAAgB,CAAC,GAAG,OAAO,OAAOJ,CAAoB,EAAG,GAAG,OAAO,OAAOC,CAAmB,CAAC,EAE9FI,EAAeZ,GAAyB,CAAE,OAAQW,CAAa,CAAE,EACjEE,EAA8B,KAAK,2BAA2BD,CAAY,EAEhF,MAAO,CAAE,OAAAF,EAAQ,aAAAE,EAAc,4BAAAC,EAA6B,UAAAV,CAAS,CACzE,CAWQ,MAAM,gBAAgB,CAC1B,OAAAtF,EACA,aAAAV,EACA,iBAAAG,EACA,UAAAE,EACA,WAAAC,EACA,UAAAe,EACA,KAAAtB,CAAI,EASP,CACG,IAAMQ,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,gBAAgB,IAAI,IAClD,GAAI,CACIpB,GAAW,QAAQ,IAAI,GAAGoB,CAAE,oDAAoD,EAGpF,IAAMoG,EAAW,MAAM,KAAK,oBAAoB,CAAE,aAAA3G,EAAc,MAAOM,CAAU,CAAE,EAE7E,CAAE,aAAcsG,EAAiB,UAAAZ,EAAW,OAAQa,CAAS,EAAMF,EAGzE,MAAM1B,GAAW,CAAE,OAAQ,OAAO,OAAOe,CAAS,EAAG,MAAO3E,CAAS,CAAE,EAGvE,IAAMyF,EAA6C,CAAA,EACnD,OAAO,KAAKF,CAAe,EAAE,QAAQG,GAAM,CAEvC,IAAMC,EADWJ,EAAgBG,CAAG,EACf,GAAG,EAAE,EAC1BD,EAAaC,CAAG,EAAItF,EAAa,CAAE,MAAOuF,CAAG,CAAE,CACnD,CAAC,EACD,IAAMC,EAAuC,CACzC,OAAAvG,EACA,MAAO2C,EAAU,KACjB,aAAcyD,EACd,KAAMI,GAAS,KACf,OAAQL,EAAU,IAAIM,GAAK1F,EAAa,CAAE,MAAO0F,CAAC,CAAE,CAAC,GAErDhI,IACA,QAAQ,IAAI,GAAGoB,CAAE,oBAAoB8C,EAAU,IAAI,uBAAuBA,EAAU,MAAM,EAAE,EAC5F,QAAQ,IAAI,GAAG9C,CAAE,oBAAoB0G,EAAS,KAAK,EAAE,GAIzD,IAAMG,EAAY,MAAM,KAAK,mBAAmB,CAC5C,KAAMH,EACN,WAAA3G,EACA,UAAAD,EACH,EAIKuD,EAAY,MAAM,KAAK,oBAAoB,CAC7C,UAAW,CAACwD,CAAS,EACrB,iBAAAjH,EACA,UAAAE,EACA,WAAAC,EACA,gBAAiBP,EAAK,uBACzB,EAED,OAAIZ,GAAW,QAAQ,IAAI,GAAGoB,CAAE,sBAAsB8G,EAAOzD,CAAS,CAAC,wCAAwC,EAExG,CAAE,UAAWA,EAAW,gBAAiBoC,CAAS,CAC7D,OAASpE,EAAO,CACZ,cAAQ,MAAM,GAAGrB,CAAE,IAAIsB,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQzC,GAAW,QAAQ,IAAI,GAAGoB,CAAE,YAAY,CAChD,CACJ,CAOQ,MAAM,sBAAsB,CAChC,WAAA0C,EACA,YAAAb,EACA,WAAA9B,CAAU,EAKb,CACG,IAAMC,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,sBAAsB,IAAI,IAClD+G,EAAmB,CAAA,EACzB,GAAI,CAEA,GAAIrE,EAAW,WAAab,EAAY,UAAW,CAC/C,IAAMmF,EAAmB9F,EAAa,CAAE,MAAOwB,EAAW,SAAS,CAAE,EAC/DuE,EAAoB/F,EAAa,CAAE,MAAOW,EAAY,SAAS,CAAE,EAEhD,MAAMqF,GAAY,CACrC,UAAWF,EACX,UAAWC,EACX,MAAOlH,EACV,GAEGgH,EAAO,KAAK,wBAAwBE,CAAiB,wDAAwDD,CAAgB,0CAA0C,CAE/K,MACID,EAAO,KAAK,uFAAuF,EAIvG,IAAMI,EAAwBzE,EAAW,sBACrCxB,EAAa,CAAE,MAAOwB,EAAW,qBAAqB,CAAE,EACxDA,EAAW,QAAQ,kBAAkB,CAAC,EACpC0E,EAAwBvF,EAAY,QAAQ,kBAAkB,CAAC,EACjEsF,IAA0BC,GAC1BL,EAAO,KAAK,uCAAuCI,CAAqB,SAASC,CAAqB,wCAAwC,CAEtJ,OAAS/F,EAAO,CACZ0F,EAAO,KAAK,uCAAuCzF,EAAgBD,CAAK,CAAC,wCAAwC,CACrH,CACA,OAAO0F,CACX,CAQQ,MAAM,sBAAsB,CAChC,cAAAM,EACA,eAAAC,EACA,kBAAApF,EACA,UAAApB,CAAS,EAMZ,CACG,IAAMd,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,sBAAsB,IAAI,IACxD,GAAI,CACIpB,GAAW,QAAQ,IAAI,GAAGoB,CAAE,oDAAoD,EAEpF,IAAIuH,EAAmC,CAAA,EAEjCC,EAAsB,CAAC,GAAG,IAAI,IAAIH,CAAa,CAAC,EAClDI,EAAU,CAAC,GAAGD,CAAmB,EAC/BE,EAAQ,KAAK,IAAG,EAIhBC,EAAY,EAAI,GAAK,IAE3B,KAAOF,EAAQ,OAAS,GAAG,CACvB,GAAI,KAAK,IAAG,EAAKC,EAAQC,EACrB,MAAM,IAAI,MAAM,iCAAiCF,EAAQ,KAAK,IAAI,CAAC,wCAAwC,EAG/G,IAAMG,EAAyB,CAAA,EACzBC,EAAoB,CAAA,EAE1B,QAAWtF,KAAQkF,EACXvF,EAAkB,IAAIK,CAAI,GAC1BsF,EAAM,KAAK3F,EAAkB,IAAIK,CAAI,CAAE,EACvCL,EAAkB,OAAOK,CAAI,GAE7BqF,EAAa,KAAKrF,CAAI,EAI1BsF,EAAM,OAAS,IACf,MAAMnD,GAAW,CAAE,MAAO5D,EAAW,OAAQ+G,CAAK,CAAE,EACpDA,EAAM,QAAQ/D,GAAKyD,EAAqB,KAAKzD,CAAC,CAAC,GAGnD2D,EAAUG,EAENH,EAAQ,OAAS,GAAK,MAAMK,GAAMR,CAAc,CACxD,CAEA,GAAIE,EAAoB,SAAWD,EAAqB,OACpD,MAAM,IAAI,MAAM,0LAA0L,EAG9M,OAAOA,CACX,OAASlG,EAAO,CACZ,cAAQ,MAAM,GAAGrB,CAAE,IAAIsB,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQzC,GAAW,QAAQ,IAAI,GAAGoB,CAAE,YAAY,CAChD,CACJ,CA4BQ,MAAM,0BAA0B,CACpC,YAAAuB,EACA,gBAAAH,EACA,QAAAI,EACA,YAAAC,EACA,UAAA3B,CAAS,EAmBZ,CACG,IAAME,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,0BAA0B,IAAI,IAC5D,GAAI,CACIpB,GAAW,QAAQ,IAAI,GAAGoB,CAAE,oDAAoD,EAEpF,IAAM+H,EAAYxG,EAAY,UAC9B,GAAI,CAACwG,EAAU,KAAQ,MAAM,IAAI,MAAM,0EAA0E,EAC7GnJ,GAAW,QAAQ,IAAI,GAAGoB,CAAE,eAAe8G,EAAOiB,CAAS,CAAC,wCAAwC,EAGxG,GAAM,CAAE,MAAAC,EAAO,YAAAC,CAAW,EAAK,MAAM,KAAK,4BAA4B,CAAE,UAAWF,EAAW,MAAOvG,CAAO,CAAE,EAE1G5C,GAAW,QAAQ,IAAI,GAAGoB,CAAE,0BAA0BgI,CAAK,EAAE,EAEjE,IAAIE,EACJ,OAAQF,EAAO,CACX,KAAKlF,EAAU,KACXoF,EAAgB,MAAM,KAAK,gBAAgB,CACvC,UAAAH,EACA,YAAaE,EACb,UAAAnI,EAAW,QAAA0B,EAAS,YAAAC,EACvB,EACD,MAEJ,KAAKqB,EAAU,IACX,GAAI,CAAC1B,EAAmB,MAAM,IAAI,MAAM,yFAAyF,EACjI8G,EAAgB,MAAM,KAAK,eAAe,CACtC,YAAA3G,EACA,UAAAwG,EACA,gBAAA3G,EACA,UAAAtB,EAAW,QAAA0B,EAAS,YAAAC,EACvB,EACD,MAEJ,KAAKqB,EAAU,MACXoF,EAAgB,MAAM,KAAK,iBAAiB,CACxC,YAAA3G,EACA,UAAAwG,EACA,UAAAjI,EAAW,QAAA0B,EAAS,YAAAC,EACvB,EACD,MAEJ,KAAKqB,EAAU,OACPlE,GAAW,QAAQ,IAAI,GAAGoB,CAAE,IAAImI,GAAuB,CAAE,UAAWJ,CAAS,CAAE,CAAC,iBAAiBvG,EAAQ,EAAE,wCAAwC,EACvJ0G,EAAgB,MAAM,KAAK,kBAAkB,CACzC,UAAAH,EACA,UAAAjI,EAAW,QAAA0B,EAAS,YAAAC,EACvB,EACD,MAEJ,QACI,MAAM,IAAI,MAAM,GAAGzB,CAAE,qCAAqCgI,CAAK,wCAAwC,CAC/G,CAEA,OAAIpJ,GAAW,QAAQ,IAAI,GAAGoB,CAAE,mBAAmBkI,EAAgBpB,EAAOoB,CAAa,EAAI,WAAW,wCAAwC,EAEvI,CAAE,SAAU,OAAW,cAAAA,CAAa,CAE/C,OAAS7G,EAAO,CACZ,IAAM+G,EAAW,GAAGpI,CAAE,IAAIsB,EAAgBD,CAAK,CAAC,GAChD,eAAQ,MAAM+G,CAAQ,EACf,CAAE,SAAAA,CAAQ,CACrB,SACQxJ,GAAW,QAAQ,IAAI,GAAGoB,CAAE,YAAY,CAChD,CACJ,CAgBQ,MAAM,gBAAgB,CAC1B,UAAA+H,EACA,YAAAE,EACA,QAAAzG,EACA,YAAAC,EACA,UAAA3B,CAAS,EAgBZ,CACG,IAAME,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,gBAAgB,IAAI,IAClD,GAAI,CACIpB,GAAW,QAAQ,IAAI,GAAGoB,CAAE,oDAAoD,EAEhFpB,GAAW,QAAQ,IAAI,GAAGoB,CAAE,mCAAmCwB,EAAQ,EAAE,EAAE,EAG/E,IAAMkF,EAAWuB,EACjB,GAAIvB,EAAS,QAAU5D,EAAU,KAC7B,MAAM,IAAI,MAAM,GAAG9C,CAAE,8FAA8F,EAGvH,GAAI,CAAC0G,GAAY,CAACA,EAAS,aACvB,MAAM,IAAI,MAAM,GAAG1G,CAAE,iFAAiF,EAI1G,IAAMJ,EAAmBmI,EAAU,KAAM,kBAAoBlI,GAAqB,MAG5EwI,EAAoC,CAAA,EACpCC,EAAmD,CAAA,EACnDC,EAA0C,CAAA,EAG1CvC,EAASU,EAAS,QAAU,CAAA,EAClC,GAAIV,EAAO,OAAS,EAAG,CACfpH,GAAW,QAAQ,IAAI,GAAGoB,CAAE,uBAAuBgG,EAAO,MAAM,EAAE,EAGtE,IAAMwC,GADY,MAAMtE,GAAa,CAAE,MAAO1C,EAAS,MAAOwE,CAAM,CAAE,GACrC,eACjC,GAAI,CAACwC,EAAe,KAAQ,MAAM,IAAI,MAAM,+EAA+E,EAC3H,IAAMC,EAAgBD,EAAe,KAAK,cACtCC,GAAiBA,EAAc,OAAS,IACpC7J,GAAW,QAAQ,IAAI,GAAGoB,CAAE,iCAAiCyI,EAAc,MAAM,EAAE,EACvFA,EAAc,QAAQlG,GAAO,CACpB+F,EAAsB,KAAKxE,GAAKA,EAAE,OAASvB,CAAI,GAChD+F,EAAsB,KAAK,CAAE,KAAA/F,CAAI,CAAE,CAE3C,CAAC,EAET,CAEA,IAAMmG,EAAkBhC,EAAS,aAC7B9H,GAAW,QAAQ,IAAI,GAAGoB,CAAE,qBAAqB8G,EAAO4B,CAAe,CAAC,wCAAwC,EACpH,IAAMC,EAAiB,OAAO,KAAKD,CAAe,EAC9C9J,GAAW,QAAQ,IAAI,GAAGoB,CAAE,iCAAiC,KAAK,UAAU2I,CAAc,CAAC,EAAE,EAC7F/J,GAAW,QAAQ,IAAI,GAAGoB,CAAE,oBAAoB8G,EAAO6B,CAAc,CAAC,wCAAwC,EAGlH,IAAIC,EAA2D,CAAA,EAC/D,GAAID,EAAe,OAAS,EAAG,CAE3B,IAAME,EAAoB,MAAMrD,GAAe,CAC3C,MAAOhE,EACP,SAAUmH,EACb,EACD,GAAI,CAACE,EAAkB,KAAQ,MAAM,IAAI,MAAM,kFAAkF,EACjI,GAAI,CAACA,EAAkB,KAAK,eAAkB,MAAM,IAAI,MAAM,iGAAiG,EAC/JD,EAAyBC,EAAkB,KAAK,eAC5CjK,GAAW,QAAQ,IAAI,GAAGoB,CAAE,yCAAyC,KAAK,UAAU4I,CAAsB,CAAC,EAAE,EAC7GhK,GAAW,QAAQ,IAAI,GAAGoB,CAAE,4BAA4B8G,EAAO8B,CAAsB,CAAC,wCAAwC,CACtI,CAGA,QAAWE,KAAWH,EAAgB,CAClC,IAAMI,EAAgBL,EAAgBI,CAAO,EACvCE,EAAkBJ,EAAuBE,CAAO,EAEtD,GAAI,CAACE,EAAiB,CAEdpK,GAAW,QAAQ,IAAI,GAAGoB,CAAE,oDAAoD8I,CAAO,4BAA4BC,CAAa,EAAE,EACtIT,EAAsB,KAAK,CACvB,KAAMS,EACN,QAASD,EAGZ,EACD,QACJ,CAIA,GAAIE,IAAoBD,EAAe,CAE/BnK,GAAW,QAAQ,IAAI,GAAGoB,CAAE,qBAAqB8I,CAAO,2CAA2C,EACvG,QACJ,CAcA,GAbIlK,GAAW,QAAQ,IAAI,GAAGoB,CAAE,qBAAqB8I,CAAO,qBAAqBE,CAAe,gBAAgBD,CAAa,+BAA+B,EAOrI,MAAM7B,GAAY,CACrC,UAAW6B,EACX,UAAWC,EACX,MAAOxH,EACV,EAEmB,CAGZ5C,GAAW,QAAQ,IAAI,GAAGoB,CAAE,qBAAqB8I,CAAO,8CAA8C,EAC1G,IAAMG,EAAa,MAAMC,GAAwB,CAC7C,UAAWF,EACX,KAAM,GACN,sBAAuBD,EACvB,MAAOvH,EACV,EACD+G,EAAe,KAAK,CAAE,QAASO,EAAS,MAAO,OAAO,KAAKG,CAAU,CAAC,CAAG,CAC7E,KAAO,CAWH,IAAIE,EAAmB,GACvB,GAAI,CACAA,EAAmB,MAAMjC,GAAY,CACjC,UAAW8B,EACX,UAAWD,EACX,MAAOvH,EACV,CACL,OAASH,EAAO,CAERzC,GAAW,QAAQ,IAAI,GAAGoB,CAAE,0EAA0EsB,EAAgBD,CAAK,CAAC,wCAAwC,CAC5K,CAEA,GAAI8H,EAEIvK,GAAW,QAAQ,IAAI,GAAGoB,CAAE,qBAAqB8I,CAAO,0CAA0C,EACtGR,EAAsB,KAAK,CACvB,KAAMS,EACN,QAASD,EACT,sBAAuBE,EAC1B,UAIGpK,GAAW,QAAQ,IAAI,GAAGoB,CAAE,qBAAqB8I,CAAO,2CAA2ClJ,CAAgB,EAAE,EAErHA,IAAqB,QAKrByI,EAAU,KAAK,CACX,QAASS,EACT,gBAAAE,EACA,cAAAD,EACA,+BAAgC,CAAA,EAChC,OAAQ,aACR,SAAU,GACb,UAEMnJ,IAAqBC,GAAqB,kBAAmB,CAQpE,IAAMuJ,EAAsB,MAAMlF,GAAa,CAAE,KAAM8E,EAAiB,MAAOxH,CAAO,CAAG,EACzF,GAAI,CAAC4H,EAAoB,SAAWA,EAAoB,QAAQ,SAAW,EACvE,MAAM,IAAI,MAAM,2BAA2BJ,CAAe,iBAAiBxH,EAAQ,EAAE,gBAAgB4H,EAAoB,UAAY,uDAAuD,wCAAwC,EAExO,IAAMC,EAAmBD,EAAoB,OAAO,CAAC,EAC/CE,EAAY,MAAMC,GAAgB,CACpC,SAAUF,EACV,MAAO7H,EACP,UAAA1B,EACH,EACDuI,EAAU,KAAK,CACX,QAASS,EACT,gBAAAE,EACA,cAAAD,EACA,+BAAgC,CAAC,GAAGO,EAAWN,CAAe,EAC9D,OAAQ,aACR,SAAU,GACb,CACL,KACI,OAAM,IAAI,MAAM,GAAGhJ,CAAE,mCAAmCJ,CAAgB,uCAAuC4J,EAAmC,wCAAwC,CAGtM,CACJ,CAKA,GAF6BnB,EAAU,KAAKoB,GAAKA,EAAE,QAAQ,EAIvD,MAAI7K,GAAW,QAAQ,KAAK,GAAGoB,CAAE,kDAAkD,KAAK,UAAUqI,CAAS,CAAC,EAAE,EAExG,IAAI,MAAM,+CAA+C,KAAK,UAAUA,CAAS,CAAC,wCAAwC,EAIpI,GAAI,CAACN,EAAU,KAAQ,MAAM,IAAI,MAAM,0EAA0E,EAGjH,IAAM2B,EAAqC,CACvC,OAHW3B,EAAU,KAAK,KAI1B,MAAOjF,EAAU,IACjB,sBAAAwF,EACA,eAAAC,GAEAF,GAAW,OAAS,IAAKqB,EAAQ,UAAYrB,GAqBjD,IAAMsB,EAAW,MAAM,KAAK,mBAAmB,CAC3C,KAAMD,EACN,WAAYlI,EACZ,UAAA1B,EACH,EACGlB,GAAW,QAAQ,IAAI,GAAGoB,CAAE,sBAAsB8G,EAAO6C,CAAQ,CAAC,wCAAwC,EAG9G,IAAMC,EAAW,MAAM,KAAK,oBAAoB,CAC5C,cAAe7B,EACf,UAAW,CAAC4B,CAAQ,EACpB,WAAYnI,EACZ,UAAA1B,EACH,EAQG8B,EACJ,GAAI2G,EAAe,OAAS,EAAG,CAC3B,IAAMsB,EAAsC,CAAA,EAC5CjI,EAAsB,CAAA,EACtB,IAAMe,EAA2B4F,EAAe,QAAQzE,GAAKA,EAAE,KAAK,EAC9DG,EAAS,MAAMC,GAAa,CAAE,MAAOvB,EAAa,MAAOnB,CAAO,CAAG,EACnEsI,EAAgB7F,EAAO,gBAAgB,KAC7C,GAAI,CAAC6F,EAAiB,MAAM,IAAI,MAAM,sFAAsF,EAC5H,IAAMrB,EAAgBqB,EAAc,eAAiB,CAAA,EAC/CC,EAAeD,EAAc,cAAgB,CAAA,EACnD,GAAI7F,EAAO,QAAUA,EAAO,OAAO,SAAWtB,EAAY,OAEtDsB,EAAO,OAAO,QAAQH,GAAI,CAAGlC,EAAqB,KAAKkC,CAAC,CAAE,CAAC,UACpDG,EAAO,QAAUA,EAAO,OAAO,OAAS,EAO/C,GALAA,EAAO,OAAO,QAAQH,GAAI,CAAGlC,EAAqB,KAAKkC,CAAC,CAAE,CAAC,EAEvDlC,EAAoB,OACpB6G,EAAc,OACdsB,EAAa,SACcpH,EAAY,OAEvC8F,EAAc,QAAQ3E,GAAK+F,EAAuB,KAAK/F,CAAC,CAAC,EACzDiG,EAAa,QAAQjG,GAAK+F,EAAuB,KAAK/F,CAAC,CAAC,MACrD,OAAI2E,EAAc,SAAW,GAAKsB,EAAa,SAAW,EACvD,IAAI,MAAM,gIAAgI,EAE1I,IAAI,MAAM,uJAAuJ,OAI3K,QAAQ,KAAK,GAAG/J,CAAE,kDAAkDwB,EAAQ,EAAE,qDAAqDiH,GAAiB,CAAA,CAAE,mBAAmBsB,GAAgB,CAAA,CAAE,wBAAwBtI,EAAY,EAAE,0CAA0C,EAC3QkB,EAAY,QAAQmB,GAAK+F,EAAuB,KAAK/F,CAAC,CAAC,EAE3D,GAAI+F,EAAuB,OAAS,EAAG,CAC/BjL,GAAW,QAAQ,IAAI,GAAGoB,CAAE,uCAAuCwB,EAAQ,EAAE,8BAA8BqI,CAAsB,wCAAwC,EAC7K,IAAMG,EAAU,MAAM9F,GAAa,CAAE,MAAO2F,EAAwB,MAAOpI,CAAW,CAAG,EACzF,GAAIuI,EAAQ,SAAWA,EAAQ,QAAUA,EAAQ,OAAO,SAAWH,EAAuB,OAEtFG,EAAQ,OAAO,QAAQlG,GAAKlC,EAAqB,KAAKkC,CAAC,CAAC,MACrD,CACHkG,EAAQ,QAAQ,QAAQlG,GAAKlC,EAAqB,KAAKkC,CAAC,CAAC,EACzD,IAAMmG,EAActH,EAAY,OAAOmB,GACnC,CAAClC,EAAqB,IAAIsI,GAAOhJ,EAAa,CAAE,MAAOgJ,CAAG,CAAE,CAAC,EAAE,SAASpG,CAAC,CAAC,EAE9E,MAAM,IAAI,MAAM,0DAA0DtC,EAAQ,EAAE,qBAAqBC,EAAY,EAAE,mBAAmBwI,CAAW,wCAAwC,CACjM,CACJ,CAEJ,CAEA,MAAO,CACH,MAAOL,EACP,oBAAAhI,EAGR,OAASP,EAAO,CACZ,cAAQ,MAAM,GAAGrB,CAAE,IAAIsB,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQzC,GAAW,QAAQ,IAAI,GAAGoB,CAAE,YAAY,CAChD,CACJ,CAiBQ,MAAM,eAAe,CACzB,YAAAuB,EACA,UAAAwG,EACA,gBAAA3G,EACA,QAAAI,EAAS,YAAAC,EAAa,UAAA3B,CAAS,EAclC,CACG,IAAME,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,eAAe,IAAI,IACjD,GAAI,CACIpB,GAAW,QAAQ,IAAI,GAAGoB,CAAE,oDAAoD,EAEpF,GAAM,CAAE,YAAAiI,CAAW,EAAM,MAAM,KAAK,4BAA4B,CAAE,UAAWF,EAAW,MAAOvG,CAAO,CAAE,EAClGkI,EAAUzB,EAKZkC,EAAgB,GAcpB,GAAI,CAACT,EACD,MAAM,IAAI,MAAM,GAAG1J,CAAE,sDAAsD,EAE/E,GAAI0J,EAAQ,QAAU5G,EAAU,IAC5B,MAAM,IAAI,MAAM,GAAG9C,CAAE,2FAA2F,EAGpH,GADIpB,GAAW,QAAQ,IAAI,GAAGoB,CAAE,aAAa8G,EAAO4C,CAAO,CAAC,wCAAwC,EAChG,CAAC3B,EAAU,KAAQ,MAAM,IAAI,MAAM,0EAA0E,EAUjH,IAAMM,EAAaqB,EAAQ,UAAYU,GAAMV,EAAQ,SAAS,EAAI,CAAA,EAC9D9K,GAAW,QAAQ,IAAI,GAAGoB,CAAE,kDAAkDqI,EAAU,MAAM,EAAE,EAChGzJ,GAAWyJ,EAAU,OAAS,GAC9B,QAAQ,IAAI,GAAGrI,CAAE,uCAAuC,KAAK,UAAUqI,EAAW,KAAM,CAAC,CAAC,EAAE,EAGhG,IAAMgC,EAAoBhC,EAAU,OAAOoB,GAAKA,EAAE,QAAQ,EAC1D,GAAIY,EAAkB,OAAS,EAC3B,MAAIzL,GAAW,QAAQ,KAAK,GAAGoB,CAAE,0CAA0C,KAAK,UAAUqK,CAAiB,CAAC,EAAE,EAKxG,IAAI,MAAM,GAAGrK,CAAE,0EAA0E,EAkBnG,IAAMsK,EAAoD,CAAA,EAEpDC,EAA0C,CAAA,EAChD,GAAIlC,EAAU,OAAS,EAAG,CAClBzJ,GAAW,QAAQ,IAAI,GAAGoB,CAAE,gCAAgCqI,EAAU,MAAM,yBAAyB,EAEzG,QAAWmC,KAAYnC,EAAW,CAC9B,GAAM,CACF,gBAAAW,EACA,OAAAyB,EACA,cAAA1B,EAEA,SAAA2B,EACA,+BAAAC,EACA,QAAA7B,CAAO,EACP0B,EACJ,GAAIE,EAAY,MAAM,IAAI,MAAM,6JAA6J,EAG7L,IAAIE,EAAiBxJ,EAAgB2H,CAAa,EAClD,GAAI,CAAC6B,EACD,MAAM,IAAI,MAAM,yFAAyF7B,CAAa,4DAA4DD,CAAO,aAAa2B,CAAM,wCAAwC,EAGxP,GAAM,CAAE,UAAAI,EAAW,kBAAAC,CAAiB,EAAK,MAAMC,GAAW,CACtD,SAAUH,EACV,UAAW,GACX,UAAA9K,EACA,MAAO0B,EACV,EACKwJ,GAA4BF,EAAkB,IAAIhH,GAAK5C,EAAa,CAAE,MAAO4C,CAAC,CAAE,CAAC,EACjFmH,EAAkB/J,EAAa,CAAE,MAAO2J,CAAS,CAAE,EAGzD,GAFAL,EAAS,6BAA+B,CAAC,GAAGQ,GAAcC,CAAe,EAErEJ,EAAU,MAAQD,EAAe,MAGjCJ,EAAS,cAAgBS,EACrB,CAAC,OAAO,KAAK7J,CAAe,EAAE,SAAS6J,CAAe,GAAG,CAMzD,IAAMC,EAAc,MAAMxF,GAAmB,CACzC,UAAWuF,EACX,KAAM,GACN,MAAOzJ,EACV,EACK2J,GAAmB,OAAO,KAAKD,CAAW,EAChD,QAAWE,MAAmBD,GACrB/J,EAAgBgK,EAAe,IAChChK,EAAgBgK,EAAe,EAAIF,EAAYE,EAAe,EAG1E,CAKJ,IAAMC,GACFV,EAA+B,SAAS7G,GAAKkH,GAAa,SAASlH,CAAC,CAAC,EACzE,GAAI,CAACuH,GAAyB,MAAM,IAAI,MAAM,0FAA0FV,EAA+B,KAAK;CAAI,CAAC,6DAA6D7B,CAAO,qEAAqE,EAE1T,IAAMG,GAAa,MAAMC,GAAwB,CAC7C,UAAW+B,EACX,KAAM,GACN,sBAAAI,GACA,MAAO7J,EACV,EAEK8J,GAAqC,CAAA,EAQ3C,GAPA,OAAO,KAAKrC,EAAU,EAAE,QAAQsC,GAAmB,CAC/CD,GAAsB,KAAKC,CAAgB,EAC3C,IAAMC,GAAoBvC,GAAWsC,CAAgB,EACrDjB,EAAsC,KAAKkB,EAAiB,CAChE,CAAC,EAEqBH,KAA0BrC,EAExCpK,GAAW,QAAQ,IAAI,GAAGoB,CAAE,yBAAyB8I,CAAO,8GAA8G,MAC3K,CACH,GAAI0B,EAAS,sBAAyB,MAAM,IAAI,MAAM,2JAA2J,EACjNA,EAAS,sBAAwBc,GACjCf,EAAgB,KAAKC,CAAQ,CACjC,CACJ,CAEID,EAAgB,OAAS,EACzBJ,EAAgB,GAEhBA,EAAgB,GAGhBvL,GAAW,QAAQ,IAAI,GAAGoB,CAAE,yCAAyCqI,EAAU,MAAM,6CAA6CkC,EAAgB,MAAM,qGAAqGD,EAAsC,MAAM,EAAE,CACnT,MACQ1L,GAAW,QAAQ,IAAI,GAAGoB,CAAE,sDAAsD,EAW1F,IAAMyL,EAA6C,MAAM,KAAK,6BAA6B,CACvF,sBAAuB/B,EAAQ,uBAAyB,CAAA,EACxD,QAAAlI,EACH,EAEGkK,EAAqD,CACrD,GAAGpB,EACH,GAAGmB,GAEHE,EACAD,EAA2B,SAAW,EACtCA,EAA6B,OAE7BC,EAAkCD,EAA2B,IAAI5H,GACtD5C,EAAa,CAAE,MAAO4C,CAAC,CAAE,CACnC,EAML,IAAM8H,EAAyC,CAC3C,OAAQ7D,EAAU,KAAK,KACvB,MAAOjF,EAAU,MAIjB,UAAWyH,EAMX,mBAAoBoB,EAWpB,sBAAuB,OAKvB,cAAAxB,GAOApG,EAEAnF,GAAW,QAAQ,IAAI,GAAGoB,CAAE,sCAAsC4L,EAAU,KAAK,EAAE,EAEvF,IAAMC,EAAa,MAAM,KAAK,mBAAmB,CAC7C,KAAMD,EACN,OAAA7H,EACA,WAAYvC,EACZ,UAAA1B,EACH,EAEKgM,EAAa,MAAM,KAAK,oBAAoB,CAC9C,cAAe/D,EACf,UAAW,CAAC8D,CAAU,EACtB,WAAYrK,EACZ,UAAA1B,EACH,EAED,OAAIlB,GAAW,QAAQ,IAAI,GAAGoB,CAAE,iCAAiC,KAAK,UAAU8L,EAAW,MAAM,CAAC,EAAE,EAK7F,CAAE,MAAOA,EAAY,oBAAqBJ,CAA0B,CAC/E,OAASrK,EAAO,CACZ,cAAQ,MAAM,GAAGrB,CAAE,IAAIsB,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQzC,GAAW,QAAQ,IAAI,GAAGoB,CAAE,YAAY,CAChD,CACJ,CAeQ,MAAM,iBAAiB,CAC3B,YAAAuB,EACA,UAAAwG,EACA,QAAAvG,EACA,YAAAC,EACA,UAAA3B,CAAS,EAOZ,CACG,IAAME,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,iBAAiB,IAAI,IACnD,GAAI,CACIpB,GAAW,QAAQ,IAAI,GAAGoB,CAAE,oDAAoD,EAEpF,GAAM,CAAE,YAAAiI,CAAW,EAAK,MAAM,KAAK,4BAA4B,CAAE,UAAWF,EAAW,MAAOvG,CAAO,CAAE,EACjGoK,EAAY3D,EAGlB,GAAI,CAACF,EAAU,KAAQ,MAAM,IAAI,MAAM,0EAA0E,EACjH,GAAI,CAACA,EAAU,KAAK,iBAAoB,MAAM,IAAI,MAAM,2FAA2F,EACnJ,GAAI,CAAC6D,EAAa,MAAM,IAAI,MAAM,GAAG5L,CAAE,wDAAwD,EAC/F,GAAI4L,EAAU,QAAU9I,EAAU,MAAS,MAAM,IAAI,MAAM,GAAG9C,CAAE,iGAAiG,EAE7JpB,GAAW,QAAQ,IAAI,GAAGoB,CAAE,eAAe8G,EAAO8E,CAAS,CAAC,wCAAwC,EAEpGhN,GAAW,QAAQ,IAAI,GAAGoB,CAAE,yDAAyD4L,EAAU,oBAAoB,QAAU,CAAC,EAAE,EAGpI,GAAM,CAAE,iBAAAhM,CAAgB,EAAKmI,EAAU,KACjC,CAAE,sBAAAO,EAAuB,mBAAAzE,EAAoB,cAAAsG,CAAa,EAAMyB,EAEhEG,EAAqBH,EAAU,eAAiB,GAKhDI,EAAoCzK,EAAY,qBAAuB,CAAA,EAGzE3C,GAAW,QAAQ,IAAI,GAAGoB,CAAE,iCAAiC4L,EAAU,uBAAyB,CAAA,GAAI,MAAM,gBAAgB,EAC9H,IAAMK,EAAkB,MAAM,KAAK,6BAA6B,CAC5D,sBAAuBL,EAAU,uBAAyB,CAAA,EAC1D,QAAApK,EACH,EACG5C,GAAW,QAAQ,IAAI,GAAGoB,CAAE,wDAAwDiM,EAAgB,MAAM,EAAE,EAQhH,IAAM5D,EACDuD,EAAU,UAAYxB,GAAMwB,EAAU,SAAS,EAAI,CAAA,EAClDM,EAAsB7D,EAAU,OAAOvE,GAAK,CAACA,EAAE,QAAQ,EAC7D,GAAIoI,EAAoB,OAAS,EAAG,CAEhC,GAAItM,IAAqBC,GAAqB,kBAC1C,MAAM,IAAI,MAAM,kCAAkCD,CAAgB,YAAYC,GAAqB,iBAAiB,4FAA4F,EAIpN,QAAWsM,KAAsBD,EAAqB,CAGlD,IAAME,EAA0C,CAAA,EAChD,QAAWC,KAAwBF,EAAmB,uBAAyB,CAAA,EAAK,CAChF,IAAMG,GACFN,EAAsB,KAAKlI,IAAK5C,EAAa,CAAE,MAAO4C,EAAC,CAAE,IAAMuI,CAAmB,EACtF,GAAI,CAACC,GACD,MAAM,IAAI,MAAM,2QAA2Q,EAE/RF,EAAwBC,CAAmB,EAAIC,EACnD,CAOIH,EAAmB,sBAIvB,GAAM,CAEF,+BAAAxB,EACA,6BAAA4B,EACA,OAAA9B,EACA,gBAAAzB,EACA,cAAAD,EACA,QAAAD,CAAO,EACPqD,EACJ,GAAI,CAACI,EAAgC,MAAM,IAAI,MAAM,wFAAwF,EAO7I,IAAMC,EAAW,MAAM9G,GAAmB,CACtC,WAAY,CAACsD,CAAe,EAC5B,KAAM,GACN,MAAOxH,EACV,EACKiL,EAAiB,OAAO,OAAOD,CAAQ,EAC7C,MAAME,GAA2B,CAC7B,OAAQD,EACR,MAAOhL,EACV,EACD,QAAWkL,KAAgBhC,EAAgC,CACvD,IAAMiC,GAAgBJ,EAASG,CAAY,EAC3C,MAAMhI,GAAiB,CAAE,MAAOiI,GAAe,MAAOnL,CAAW,CAAE,CACvE,CAIA,IAAM4J,EAAwBkB,EAA6B,SAASM,GAASlC,EAA+B,SAASkC,CAAK,CAAC,EAC3H,GAAI,CAACxB,EAAyB,MAAM,IAAI,MAAM,+IAA+I,EAO7L,IAAMyB,GAAmB,MAAM5D,GAAwB,CACnD,UAAWiD,EAAmB,gBAC9B,sBAAAd,EACA,KAAM,GACN,MAAO7J,EACV,EACD,OAAO,OAAOsL,EAAgB,EAAE,QAAQC,GAAYd,EAAgB,KAAKc,CAAQ,CAAC,EAOlF,IAAMC,EAAW,MAAMC,GAAe,CAClC,iBAAArN,EACA,eAAgB2M,EAChB,eAAgB5B,EAChB,sBAAAU,EACA,eAAgBe,EAChB,MAAO3K,EACV,EAIK,CACF,mBAAAyL,GACA,aAAAC,GACA,iCAAAC,GACA,YAAAC,GACA,iBAAAC,CAAgB,EAChBN,EAYJ,GATAb,EAAmB,gBAAkBe,GAAmB,IAAIpJ,GAAK5C,EAAa,CAAE,MAAO4C,CAAC,CAAE,CAAC,EAC3FqI,EAAmB,iBAAmBgB,GAAa,IAAIrJ,GAAK5C,EAAa,CAAE,MAAO4C,CAAC,CAAE,CAAC,EACtFqI,EAAmB,mBAAqB,CACpC,GAAGiB,GAAiC,IAAItJ,GAAK5C,EAAa,CAAE,MAAO4C,CAAC,CAAE,CAAC,EACvE5C,EAAa,CAAE,MAAOoM,CAAgB,CAAE,EACxCpM,EAAa,CAAE,MAAOmM,EAAW,CAAE,GAInC,CAACA,GAAY,OAAU,MAAM,IAAI,MAAM,qIAAqI,EAChL,IAAME,GAAiBF,GAAY,OAAOG,EAAqB,EAC/D,GAAI,CAACD,IAAkBA,GAAe,SAAW,EAAK,MAAM,IAAI,MAAM,mCAAmCC,EAAqB,iIAAiI,EAC/PrB,EAAmB,cAAgBoB,GAAe,GAAG,EAAE,EAKvD,IAAME,GAAiC,CACnCP,GACAC,GACAC,GACA,CAACE,EAAkBD,EAAW,GAIlC,QAAWK,KAASD,GAA+B,KAAI,EAEnD,IADyB,MAAME,GAA2B,CAAE,MAAAD,CAAK,CAAE,GAAK,CAAA,GACnD,OAAS,EAAG,CAC7B,QAAQ,IAAIA,CAAK,EACjB,SACA,QAAQ,IAAI5G,EAAO4G,CAAK,CAAC,CAC7B,CAIJvB,EAAmB,wBAA0B,CAAA,EAE7CsB,GAA+B,QAC3BA,GAAkCA,EAC7B,QAAQG,IAAe,CACpB,IAAMC,GAAc3M,EAAa,CAAE,MAAO0M,EAAY,CAAE,EAEpDzB,EAAmB,sBAAuB,SAAS0B,EAAW,GAE9D1B,EAAmB,sBAAuB,KAAK0B,EAAW,EAG1D5B,EAAgB,KAAK6B,IACjB5M,EAAa,CAAE,MAAO4M,EAAY,CAAE,IAAMD,EAAW,GAEzD5B,EAAgB,KAAK2B,EAAY,CAEzC,CAAC,CAAC,EAGVzB,EAAmB,SAAW,EAClC,CACJ,CAUA,IAAM4B,EAAuB,CAAA,EAEvBC,EAAc/B,EAAgB,OAAS,EACvCgC,EAAgBF,EAAW,OAAS,EAE1C,GAAIC,GAAeC,EAAe,CAE9B,IAAMC,EAAiD,CACnD,OAAQtC,EAAU,OAClB,MAAO9I,EAAU,MACjB,mBAAoBmJ,EAAgB,IAAIrJ,GAAK1B,EAAa,CAAE,MAAO0B,CAAC,CAAE,CAAC,EACvE,SAAUqL,EAAgBF,EAAa,OACvC,UAAW1F,GAGTwD,EAAa,MAAM,KAAK,mBAAmB,CAC7C,KAAMqC,EACN,WAAY1M,EACZ,UAAA1B,EACH,EASD,MAAO,CAAE,MAPU,MAAM,KAAK,oBAAoB,CAC9C,cAAeiI,EACf,UAAW,CAAC8D,CAAU,EACtB,WAAYrK,EACZ,UAAA1B,EACH,EAE2B,oBAAqBmM,CAAe,CACpE,SAGQF,EAAoB,CAGpB,IAAMoC,EAAU,MAAMC,GAAuB,CACzC,UAAArG,EACA,MAAOvG,EACV,EACK6M,EAAmB,MAAMC,GAA4B,CACvD,QAAAH,EACH,EACD,OAAIE,EAAiB,OAAS,EAMnB,CAAE,MALgB,MAAM,KAAK,kBAAkB,CAClD,UAAAtG,EACA,OAAQsG,EACR,UAAAvO,EAAW,QAAA0B,EACd,CAC+B,GAGpC,MAAM,KAAK,mBAAmB,CAC1B,YAAa2M,EACb,WAAYpG,EACZ,eAAgBtG,EAChB,WAAYD,EACZ,UAAA1B,EACH,EASM,CAAE,MAPW,MAAM,KAAK,kBAAkB,CAC7C,UAAAiI,EACA,OAAQ,OACR,UAAAjI,EACA,QAAA0B,EACH,CAE0B,EAE/B,KAAO,CAIH,IAAM0M,EAAiD,CACnD,OAAQtC,EAAU,OAClB,MAAO9I,EAAU,MACjB,cAAe,GACf,UAAAuF,GAGEwD,EAAa,MAAM,KAAK,mBAAmB,CAC7C,KAAMqC,EACN,WAAY1M,EACZ,UAAA1B,EACH,EAEKgM,EAAa,MAAM,KAAK,oBAAoB,CAC9C,cAAe/D,EACf,UAAW,CAAC8D,CAAU,EACtB,WAAYrK,EACZ,UAAA1B,EACH,EAGD,GAAI8L,EAAU,cAAe,CACrBhN,GAAW,QAAQ,IAAI,GAAGoB,CAAE,gDAAgD,EAIhF,IAAMuO,EAA2C,CAC7C,OAAQ3C,EAAU,OAClB,MAAO9I,EAAU,OACjB,QAAS,IAGP0L,EAAc,MAAM,KAAK,mBAAmB,CAC9C,KAAMD,EACN,WAAY/M,EACZ,UAAA1B,EACH,EASD,MAAO,CAAE,MAPW,MAAM,KAAK,oBAAoB,CAC/C,cAAegM,EACf,UAAW,CAAC0C,CAAW,EACvB,WAAYhN,EACZ,UAAA1B,EACH,CAE0B,CAC/B,CAEA,MAAO,CAAE,MAAOgM,EAAY,oBAAqBG,CAAe,CACpE,CAER,OAAS5K,EAAO,CACZ,cAAQ,MAAM,GAAGrB,CAAE,IAAIsB,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQzC,GAAW,QAAQ,IAAI,GAAGoB,CAAE,YAAY,CAChD,CACJ,CAKQ,MAAM,mBAAmB,CAC7B,WAAA8L,EACA,YAAA2C,EACA,YAAAC,EACA,UAAA5O,EAAW,WAAAC,EAAY,eAAA4O,CAAc,EAQxC,CACG,IAAM3O,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,mBAAmB,IAAI,IACrD,GAAI,CAEA,GADIpB,GAAW,QAAQ,IAAI,GAAGoB,CAAE,oDAAoD,EAChF,CAAC8L,GAAc,CAAC2C,EAChB,MAAM,IAAI,MAAM,sKAAsK,EACnL,GAAI3C,GAAc2C,EACrB,MAAM,IAAI,MAAM,oKAAoK,EASxL,IAAMzM,EADmB,CAAC,CAAC8J,EACaA,EAAa2C,EACrD,GAAI,CAACzM,EAAgB,MAAM,IAAI,MAAM,kGAAkG,EA+BvI,IAAM4M,EAAqBzG,GAAuB,CAAE,UAAWnG,CAAY,CAAE,EAK7E,GAHIpD,GAAW,QAAQ,IAAI,GAAGoB,CAAE,wBAAwB4O,CAAkB,wCAAwC,EAG9G,CAAC5M,EAAa,KAAQ,MAAM,IAAI,MAAM,6EAA6E,EAOvH,IAAM6M,EAA6C,CAAA,EAC7CC,EAAmB7P,EAACsD,GAAmB,CACpCsM,EAA8B,SAAStM,CAAI,GAC5CsM,EAA8B,KAAKtM,CAAI,CAE/C,EAJyB,oBAKnBwM,EAAwBL,EAAY,OAAO5K,GAAI,CACjD,IAAMkL,EAAwB7G,GAAuB,CAAE,UAAWrE,EAAE,SAAS,CAAE,EAC/E,OAAO8K,IAAuBI,CAClC,CAAC,EAEkCN,EAAY,OAAO5K,GAAI,CACtD,IAAMkL,EAAwB7G,GAAuB,CAAE,UAAWrE,EAAE,SAAS,CAAE,EAC/E,OAAO8K,IAAuBI,CAClC,CAAC,EAE0B,QAAQlL,GAAI,CACnC,GAAI,CAACA,EAAE,UAAU,KAAQ,MAAM,IAAI,MAAM,0EAA0E,EAEnHA,EAAE,UAAU,QAAQmL,GAAW,CAC3B,GAAI,CAACA,EAAS,KAAQ,MAAM,IAAI,MAAM,yEAAyE,EAC/G,GAAIA,EAAS,KAAK,QAAUnM,EAAU,IAAK,CACvC,IAAM4G,EAAUuF,EAAS,KACrBvF,EAAQ,gBAAkBA,EAAQ,eAAe,OAAS,GAC1DA,EAAQ,eAAe,QAAQwF,GAAO,CAClCA,EAAK,MAAM,QAAQ3M,GAAQuM,EAAiBvM,CAAI,CAAC,CACrD,CAAC,CAET,SAAW0M,EAAS,KAAK,QAAUnM,EAAU,MAAO,CAChD,IAAM8I,EAAYqD,EAAS,KACvBrD,EAAU,oBAAsBA,EAAU,mBAAmB,OAAS,GACtEA,EAAU,mBAAmB,QAAQrJ,GAAQuM,EAAiBvM,CAAI,CAAC,CAE3E,CACJ,CAAC,CACL,CAAC,EAEG3D,GAAW,QAAQ,IAAI,GAAGoB,CAAE,IAAI4O,CAAkB,uCAAuCC,EAA8B,OAAS,EAAIA,EAA8B,KAAK,IAAI,EAAI,MAAM,wCAAwC,EAMjO,IAAIM,EAAgD,CAAA,EACpD,GAAIN,EAA8B,OAAS,EAAG,CAC1C,IAAMO,EACF,MAAMlL,GAAa,CAAE,MAAO2K,EAA+B,MAAOF,CAAc,CAAE,EACtF,GAAIS,EAAqB,SAAWA,EAAqB,QAAUA,EAAqB,OAAO,SAAWP,EAA8B,OACpIM,EAAoCC,EAAqB,OAAO,OAAM,MACnE,CAEH,GAAI,CAACA,EAAqB,eAAkB,MAAM,IAAI,MAAM,gGAAgG,EAC5J,GAAM,CAAE,cAAA3G,EAAe,aAAAsB,EAAc,OAAAhD,CAAM,EAAKqI,EAAqB,eAAe,KACpF,MAAM,IAAI,MAAM,8FAA8FT,EAAe,EAAE,qBAAqBlG,GAAiB,CAAA,CAAE,mBAAmBsB,GAAgB,CAAA,CAAE,aAAahD,GAAU,CAAA,CAAE,uCAAuC,CAChR,CACJ,CAQA,IAAMsI,EAA8C,CAAA,EAC9CC,EAAiB,MAAMC,GAAsB,CAAE,YAAAb,CAAW,CAAE,EAClE,GAAIY,EAEA,QAAWE,KAAiBF,EAAgB,CACxC,GAAI,CAACE,EAAc,SAAY,MAAM,IAAI,MAAM,uIAAuI,EACtL,GAAI,CAACA,EAAc,cAAiB,MAAM,IAAI,MAAM,mKAAmK,EAMvN,GAAI,EALsB,MAAMC,GAAoC,CAChE,MAAO,CAACD,EAAc,aAAa,EACnC,MAAOb,EACV,GACgD,GAAG,CAAC,EACtB,MAAM,IAAI,MAAM,yEAAyEA,CAAc,0CAA0C,EAChL,GAAM,CAAE,gBAAAe,EAAiB,iBAAAC,EAAkB,mBAAAC,CAAkB,EAAKJ,EAClE,GAAI,CAACE,GAAmBA,EAAgB,SAAW,EAAK,MAAM,IAAI,MAAM,+FAA+F,EACvK,GAAI,CAACC,GAAoBA,EAAiB,SAAW,EAAK,MAAM,IAAI,MAAM,gGAAgG,EAC1K,GAAI,CAACC,GAAsBA,EAAmB,SAAW,EAAK,MAAM,IAAI,MAAM,kGAAkG,GAG1J,MAAMH,GAAoC,CAC5D,MAAO,CAAC,GAAGC,EAAiB,GAAGC,EAAkB,GAAGC,CAAkB,EACtE,MAAOjB,EACV,GACa,QAAQ7K,GAAKuL,EAAgC,KAAKvL,CAAC,CAAC,CACtE,CAGJ,IAAM+L,EAAqD,CAAA,EAK3D,GAJAV,EAAkC,QAAQrL,GAAK+L,EAAuC,KAAK/L,CAAC,CAAC,EAC7FuL,EAAgC,QAAQvL,GAAK+L,EAAuC,KAAK/L,CAAC,CAAC,EAGvF+L,EAAuC,SAAW,EAE9CjR,GAAW,QAAQ,IAAI,GAAGoB,CAAE,IAAI4O,CAAkB,gEAAgE,MACnH,CAEChQ,GAAW,QAAQ,IAAI,GAAGoB,CAAE,IAAI4O,CAAkB,KAAKiB,EAAuC,MAAM,yDAAyD,EAG7JjR,GAAW,QAAQ,IAAI,GAAGoB,CAAE,6BAA6BD,EAAW,EAAE,qDAAqD,EAC/H,GAAM,CAAE,aAAA+P,EAAc,gBAAAC,CAAe,EACjC,MAAMrD,GAA2B,CAC7B,OAAQmD,EACR,MAAO9P,EACV,EACDnB,GAAW,QAAQ,IAAI,GAAGoB,CAAE,6BAA6BD,EAAW,EAAE,mDAAmD,EAQ7H,IAAMiQ,EAAoB,MAAMC,GAAwB,CACpD,YAAAvB,EAIA,YAAaC,EAChB,EAEK,CAAE,iBAAAzJ,EAAkB,kBAAAD,EAAmB,eAAAiL,CAAc,EACvD/K,GAAoB,CAAE,OAAQ4K,EAAiB,iBAAkB,EAAI,CAAE,EAGvEnR,GAAW,QAAQ,IAAI,GAAGoB,CAAE,4EAA4E,EAC5G,IAAMmQ,EAAe,OAAO,OAAOD,CAAc,EACjD,QAAWE,KAAUD,EACbvR,GAAW,QAAQ,IAAI,GAAGoB,CAAE,gBAAgBkB,EAAa,CAAE,MAAOkP,CAAM,CAAE,CAAC,wCAAwC,EACvH,MAAMtQ,EAAU,iBAAiB,CAC7B,MAAOsQ,EACP,MAAOrQ,EACV,EAEDnB,GAAW,QAAQ,IAAI,GAAGoB,CAAE,iEAAiE,EAK7FpB,GAAW,QAAQ,IAAI,GAAGoB,CAAE,8EAA8E,EAC9G,IAAMqQ,EACF/K,GAAyB,CAAE,OAAQ,OAAO,OAAOJ,CAAgB,CAAC,CAAE,EAClEoL,EAAiB,OAAO,KAAKD,CAAwB,EAC3D,QAAWE,KAAiBD,EAAgB,CACxC,IAAME,EAAiBH,EAAyBE,CAAa,EAC7D,QAAW7C,MAAS8C,EAChB,MAAM1Q,EAAU,iBAAiB,CAC7B,MAAA4N,GACA,MAAO3N,EACV,CAET,CACInB,GAAW,QAAQ,IAAI,GAAGoB,CAAE,4EAA4E,EAGxGpB,GAAW,QAAQ,IAAI,GAAGoB,CAAE,+EAA+E,EAC/G,IAAMyQ,EACFnL,GAAyB,CAAE,OAAQ,OAAO,OAAOL,CAAiB,CAAC,CAAE,EACnEyL,EAAkB,OAAO,KAAKD,CAAyB,EAC7D,QAAWE,KAAkBD,EAAiB,CAC1C,IAAMF,EAAiBC,EAA0BE,CAAc,EAC/D,QAAWjD,MAAS8C,EACXR,EAAkB,SAAS9O,EAAa,CAAE,MAAAwM,EAAK,CAAE,CAAC,GACnD,MAAM5N,EAAU,iBAAiB,CAC7B,MAAA4N,GACA,MAAO3N,EACV,CAGb,CACInB,GAAW,QAAQ,IAAI,GAAGoB,CAAE,6EAA6E,CACjH,CACJ,OAASqB,EAAO,CACZ,cAAQ,MAAM,GAAGrB,CAAE,IAAIsB,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQzC,GAAW,QAAQ,IAAI,GAAGoB,CAAE,YAAY,CAChD,CACJ,CAEQ,MAAM,kBAAkB,CAC5B,UAAA+H,EACA,OAAAhB,EACA,UAAAjH,EACA,QAAA0B,CAAO,EAUV,CACG,IAAMxB,EAAK,IAAI,KAAK,kBAAkB,IAAI,IAC1C,GAAI,CACIpB,GAAW,QAAQ,IAAI,GAAGoB,CAAE,oDAAoD,EACpF,IAAMuO,EAA2CxH,GAAUA,EAAO,OAAS,EACvE,CAEI,OAAQgB,EAAU,KAAM,KACxB,MAAOjF,EAAU,OACjB,QAAS,GACT,OAAAiE,GAEJ,CAEI,OAAQgB,EAAU,KAAM,KACxB,MAAOjF,EAAU,OACjB,QAAS,IAGX0L,EAAc,MAAM,KAAK,mBAAmB,CAC9C,KAAMD,EACN,WAAY/M,EACZ,UAAA1B,EACH,EAOD,OANoB,MAAM,KAAK,oBAAoB,CAC/C,cAAeiI,EACf,UAAW,CAACyG,CAAW,EACvB,WAAYhN,EACZ,UAAA1B,EACH,CAEL,OAASuB,EAAO,CACZ,cAAQ,MAAM,GAAGrB,CAAE,IAAIsB,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQzC,GAAW,QAAQ,IAAI,GAAGoB,CAAE,YAAY,CAChD,CACJ,CAEQ,MAAM,kBAAkB,CAC5B,UAAA+H,EACA,QAAAvG,EACA,YAAAC,EACA,UAAA3B,CAAS,EAMZ,CACG,IAAME,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,kBAAkB,IAAI,IACpD,GAAI,CAGA,GAFIpB,GAAW,QAAQ,IAAI,GAAGoB,CAAE,oDAAoD,EAEhF,CAAC+H,EAAU,KAAQ,MAAM,IAAI,MAAM,0EAA0E,EAEjH,GAAIA,EAAU,KAAK,QAAUA,EAAU,KAAK,OAAO,OAAS,EAGxD,MAAM,IAAI,MAAM,6RAA6R,EAC1S,CAUH,IAAMoG,EAAU,MAAMC,GAAuB,CACzC,UAAArG,EACA,MAAOvG,EACV,EACK6M,EAAmB,MAAMC,GAA4B,CACvD,QAAAH,EACH,EACD,OAAIE,EAAiB,OAAS,EAOnB,CAAE,MANgB,MAAM,KAAK,kBAAkB,CAClD,UAAAtG,EACA,UAAAjI,EACA,QAAA0B,EACA,OAAQ6M,EACX,CAC+B,GAGpC,MAAM,KAAK,mBAAmB,CAC1B,YAAatG,EACb,YAAaoG,EACb,WAAY3M,EACZ,eAAgBC,EAChB,UAAA3B,EACH,EAKD,QAAQ,MAAM,GAAGE,CAAE,oIAAoI,EACnJpB,GAAW,QAAQ,IAAI,GAAGoB,CAAE,0DAA0D,EAGnF,CAAE,aAAc,EAAI,EAC/B,CACJ,OAASqB,EAAO,CACZ,IAAMuP,EAAO,GAAG5Q,CAAE,IAAIsB,EAAgBD,CAAK,CAAC,GAC5C,eAAQ,MAAMuP,CAAI,EAOX,CAAE,MANgB,MAAM,KAAK,kBAAkB,CAClD,UAAA7I,EACA,OAAQ,CAAC6I,CAAI,EACb,UAAA9Q,EACA,QAAA0B,EACH,CAC+B,CACpC,SACQ5C,GAAW,QAAQ,IAAI,GAAGoB,CAAE,YAAY,CAChD,CAEJ,CAIQ,MAAM,mBAA8D,CACxE,KAAA4D,EACA,OAAAG,EACA,WAAAhE,EACA,UAAAD,CAAS,EAMZ,CACG,IAAME,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,mBAAmB,IAAI,IACrD,GAAI,CACIpB,GAAW,QAAQ,IAAI,GAAGoB,CAAE,oDAAoD,EAEpF,IAAMmE,EAAK,MAAM0M,GAAqB,CAAE,KAAAjN,CAAI,CAAE,EACxCkN,EAAQ,MAAMxM,EAAW,MAAM,CACjC,GAAAH,EACA,kBAAmB4M,GACnB,KAAAnN,EACA,OAAAG,EACA,KAAM,GACT,EACD,OAAInF,GAAW,QAAQ,IAAI,GAAGoB,CAAE,mBAAmBkB,EAAa,CAAE,MAAO4P,CAAK,CAAE,CAAC,EAAE,EACnF,MAAMhR,EAAU,IAAI,CAAE,MAAOgR,EAAO,MAAO/Q,CAAU,CAAE,EACvD,MAAMD,EAAU,iBAAiB,CAAE,MAAOgR,CAAK,CAAE,EAC1CA,CACX,OAASzP,EAAO,CACZ,cAAQ,MAAM,GAAGrB,CAAE,IAAIsB,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQzC,GAAW,QAAQ,IAAI,GAAGoB,CAAE,YAAY,CAChD,CACJ,CAEQ,MAAM,6BAA6B,CACvC,sBAAAsI,EACA,QAAA9G,CAAO,EAIV,CACG,IAAMxB,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,6BAA6B,IAAI,IAC/D,GAAI,CACIpB,GAAW,QAAQ,IAAI,GAAGoB,CAAE,oDAAoD,EAMpF,IAAMgR,EAAmD,CAAA,EACzD,OAAW,CAAE,KAAAzO,EAAM,sBAAA0O,CAAqB,IAAM3I,EAAuB,CACjE,IAAI4I,EA2BJ,GA1BID,EAIAC,EAAgB,MAAMhI,GAAwB,CAC1C,UAAW3G,EACX,sBAAuB0O,EACvB,MAAOzP,EACP,KAAM,GACT,EASD0P,EAAgB,MAAMxL,GAAmB,CACrC,UAAWnD,EACX,MAAOf,EACP,KAAM,GACT,EAGgB,OAAO,KAAK0P,CAAa,EAAE,SAC3B,EACjB,MAAM,IAAI,MAAM,yDAAyD1P,EAAQ,EAAE,kIAAkI,EAGrN,OAAO,OAAO0P,CAAa,EAAE,QAAQpN,GAAI,CACrCkN,EAAiC9P,EAAa,CAAE,MAAO4C,CAAC,CAAE,CAAC,EAAIA,CACnE,CAAC,CAET,CAGA,OADe,OAAO,OAAOkN,CAAgC,CAEjE,OAAS3P,EAAO,CACZ,cAAQ,MAAM,GAAGrB,CAAE,IAAIsB,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQzC,GAAW,QAAQ,IAAI,GAAGoB,CAAE,YAAY,CAChD,CACJ,CAMQ,MAAM,oBAAoB,CAC9B,cAAAmR,EACA,iBAAAvR,EACA,UAAAgF,EACA,WAAA7E,EACA,UAAAD,EACA,gBAAAkE,CAAe,EAalB,CACG,IAAMhE,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,oBAAoB,IAAI,IACtD,GAAI,CAEA,GAAI,CAAC4E,GAAaA,EAAU,SAAW,EACnC,MAAM,IAAI,MAAM,GAAG5E,CAAE,2DAA2D,EAEpF,IAAMoR,EAAiBxM,EAAU,CAAC,EAAE,KACpC,GAAI,CAACwM,GAAgB,QAAU,CAACA,GAAgB,MAC5C,MAAM,IAAI,MAAM,GAAGpR,CAAE,qFAAqF,EAE9G,IAAMG,EAASiR,EAAe,OACxBpJ,EAAQoJ,EAAe,MAG7B,QAAWN,KAASlM,EAAW,CAC3B,IAAMyM,EAAIP,EAAM,KAChB,GAAIO,EAAE,SAAWlR,EACb,MAAM,IAAI,MAAM,GAAGH,CAAE,0CAA0CG,CAAM,SAASkR,EAAE,MAAM,wCAAwC,EAElI,GAAIA,EAAE,QAAUrJ,EACZ,MAAM,IAAI,MAAM,GAAGhI,CAAE,yCAAyCgI,CAAK,SAASqJ,EAAE,KAAK,wCAAwC,CAEnI,CAEA,GAAIF,EAAe,CAIf,IAAMG,EAA0B,CAC5B,CACI,UAAWC,GACX,OAAQ3M,IAKhB,GAAI,CAACuM,EAAc,OAAU,MAAM,IAAI,MAAM,gFAAgF,EAC7H,GAAI,CAACA,EAAc,OAAOI,EAAmB,GAAKJ,EAAc,OAAOI,EAAmB,EAAE,SAAW,EACnG,MAAM,IAAI,MAAM,2GAA2G,EAE/H,IAAMC,EAAwC,CAC1C,CACI,UAAWD,GACX,WAAYJ,EAAc,OAAOI,EAAmB,IAe5D,OAVkB,MAAME,GAAiB,CACrC,SAAUN,EACV,WAAAG,EACA,kBAAAE,EACA,UAAA1R,EACA,MAAOC,EACP,MAAO,GACV,CAIL,KAAO,CAGH,IAAM6D,EAAoB,CACtB,KAAMzD,EACN,EAAG,EACH,MAAO,GACP,iBAAAP,GAEJ,GAAIoE,EAAiB,CACjB,IAAM0N,EACFC,GAAW,CAAE,MAAO3N,CAAe,CAAE,EACzC,GAAI,CAAC0N,EAA0B,MAAM,IAAI,MAAM,gHAAgH,EAC/J9N,EAAK,uBAAyB8N,CAClC,CAEA,IAAMvN,EAAK,MAAMyN,GAAU,CAAE,KAAAhO,CAAI,CAAE,EAE7BiO,EAAajN,EAAU,IAAIgC,GAAK1F,EAAa,CAAE,MAAO0F,CAAC,CAAE,CAAC,EAC1D7C,EAAwB,CAAE,CAACwN,EAAmB,EAAGM,CAAU,EAE3DC,EAAS,MAAMC,GAAe,CAChC,MAAOhS,EACP,UAAAD,EACA,GAAAqE,EACA,KAAAP,EACA,OAAAG,EACA,SAAUiO,GAIV,MAAO,GACV,EACD,GAAMF,EAAO,mBAAsB,MAAM,IAAI,MAAM,iIAAiI,EAEpL,OAAOA,EAAO,QAClB,CAEJ,OAASzQ,EAAO,CACZ,cAAQ,MAAM,GAAGrB,CAAE,IAAIsB,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,CACJ,CAEQ,MAAM,4BAA4B,CACtC,UAAAgC,EACA,MAAAyB,CAAK,EAIR,CACG,IAAM9E,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,4BAA4B,IAAI,IAC9D,GAAI,CAGA,GAFIpB,GAAW,QAAQ,IAAI,GAAGoB,CAAE,oDAAoD,EAEhF,CAACqD,EAAU,OAAU,MAAM,IAAI,MAAM,4EAA4E,EAErH,IAAMwO,EAAaxO,EAAU,SAASkO,EAAmB,EACzD,GAAIM,GAAcA,EAAW,OAAS,EAAG,CACrC,IAAMI,EAAYJ,EAAW,CAAC,EACxBtM,EAAM,MAAMrB,GAAa,CAAE,KAAM+N,EAAW,MAAAnN,CAAK,CAAE,EACzD,GAAIS,EAAI,QAAUA,EAAI,OAAO,OAAS,EAAG,CACrC,IAAMuL,EAAQvL,EAAI,OAAO,CAAC,EAC1B,GAAI,CAACuL,EAAM,KAAQ,MAAM,IAAI,MAAM,8EAA8E,EACjH,GAAI,CAACA,EAAM,KAAK,MAAS,MAAM,IAAI,MAAM,oFAAoF,EAC7H,MAAO,CAAE,MAAOA,EAAM,KAAK,MAAO,YAAaA,EAAM,IAAI,CAC7D,KACI,OAAM,IAAI,MAAM,2BAA2BmB,CAAS,iBAAiBnN,EAAM,EAAE,yCAAyC,CAE9H,KACI,OAAM,IAAI,MAAM,+EAA+E5D,EAAamC,CAAS,CAAC,wCAAwC,CAEtK,OAAShC,EAAO,CACZ,cAAQ,MAAM,GAAGrB,CAAE,IAAIsB,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,SACQzC,GAAW,QAAQ,IAAI,GAAGoB,CAAE,YAAY,CAChD,CACJ,CAEQ,2BAA2BkS,EAAwC,CACvE,IAAMlS,EAAK,GAAG,KAAK,EAAE,IAAI,KAAK,2BAA2B,IAAI,IACvDgF,EAAO,OAAO,KAAKkN,CAAS,EAClC,GAAIlN,EAAK,SAAW,EAAK,MAAO,CAAA,EAGhC,IAAMmN,EAAwC,CAAA,EAC9CnN,EAAK,QAAQwB,GAAM,CACf0L,EAAU1L,CAAG,EAAE,QAAQkH,GAAQ,CAC3B,IAAMnL,EAAOrB,EAAa,CAAE,MAAAwM,CAAK,CAAE,EACnCyE,EAAU5P,CAAI,EAAIiE,CACtB,CAAC,CACL,CAAC,EAID,IAAM4L,EAAsC,CAAA,EAC5CpN,EAAK,QAAQwB,GAAO4L,EAAI5L,CAAG,EAAI,IAAI,GAAK,EAExCxB,EAAK,QAAQwB,GAAM,CACf0L,EAAU1L,CAAG,EAAE,QAAQkH,GAAQ,CACvBA,EAAM,QACN,OAAO,OAAOA,EAAM,MAAM,EAAE,KAAI,EAAG,QAAQ2E,GAAU,CACjD,GAAI,CAACA,EAAW,OAChB,IAAMC,EAASH,EAAUE,CAAO,EAE5BC,GAAUA,IAAW9L,GACrB4L,EAAI5L,CAAG,EAAE,IAAI8L,CAAM,CAE3B,CAAC,CAET,CAAC,CACL,CAAC,EAGD,IAAMC,EAAU,IAAI,IACdC,EAAO,IAAI,IACXC,EAAmB,CAAA,EAEnBC,EAAQzT,EAAC0T,GAAgB,CAC3B,GAAIH,EAAK,IAAIG,CAAI,EAAG,CAChB,QAAQ,KAAK,GAAG3S,CAAE,6BAA6B2S,CAAI,uEAAuE,EAC1H,MACJ,CACIJ,EAAQ,IAAII,CAAI,IAEpBH,EAAK,IAAIG,CAAI,EAGbP,EAAIO,CAAI,EAAE,QAAQC,GAAOF,EAAME,CAAG,CAAC,EAEnCL,EAAQ,IAAII,CAAI,EAChBH,EAAK,OAAOG,CAAI,EAChBF,EAAO,KAAKE,CAAI,EACpB,EAfc,SAiBd,OAAA3N,EAAK,QAAQ2N,GAAO,CACXJ,EAAQ,IAAII,CAAI,GAAGD,EAAMC,CAAI,CACtC,CAAC,EAEMF,CACX,GCx4FJ,IAAAI,GAAA,CACE,QAAW,qFACX,SAAY,CACV,KAAQ,oCACR,cAAiB,QACnB,EACA,MAAS,CACP,KAAQ,CACN,GAAM,OACN,aAAgB,CAAC,MAAM,EACvB,KAAQ,UACR,OAAU,EACV,SAAY,CACV,KAAQ,IACR,UAAa,SACb,mBAAsB,EACtB,eAAkB,EAClB,mBAAsB,CACxB,CACF,EACA,OAAU,CACR,GAAM,SACN,aAAgB,CAAC,QAAQ,EACzB,KAAQ,UACR,OAAU,GACV,SAAY,CACV,KAAQ,IACR,UAAa,cACb,mBAAsB,EACtB,eAAkB,EAClB,mBAAsB,EACxB,CACF,EACA,OAAU,CACR,GAAM,SACN,aAAgB,CAAC,QAAQ,EACzB,KAAQ,UACR,OAAU,GACV,SAAY,CACV,KAAQ,IACR,UAAa,aACb,mBAAsB,EACtB,eAAkB,EAClB,mBAAsB,EACxB,CACF,EACA,QAAW,CACT,GAAM,UACN,aAAgB,CAAC,SAAS,EAC1B,KAAQ,UACR,OAAU,EACV,SAAY,CACV,KAAQ,GACR,UAAa,SACb,mBAAsB,EACtB,eAAkB,EAClB,mBAAsB,CACxB,CACF,CACF,CACF,ECjCO,IAAMC,GAAQC,GAAY,MAK1B,SAASC,GAAsBC,EAAiBC,EAAkC,CACrF,IAAMC,EAAWL,GAAMG,CAAO,EAC9B,GAAI,CAACE,EACD,MAAM,IAAI,MAAM,qDAAqDF,CAAO,EAAE,EAElF,OAAOG,GAAyB,CAC5B,SAAAD,EACA,KAAAD,CACJ,CAAC,CACL,CATgBG,EAAAL,GAAA,yBAmBT,IAAMM,EAA0B,CAInC,OAAQA,GAA6B,OAKrC,aAAc,CACV,GAAI,UACJ,KAAM,GACN,oBAAqB,EACrB,gBAAiB,EAKjB,qBAAsB,CAC1B,EAKA,aAAcA,GAA6B,YAC/C,EAUaC,GAAqC,CAC9C,sBAAuB,GACvB,mBAAoB,CAChBC,GAAc,QACdA,GAAc,OAClB,CACJ,ECvFO,IAAMC,EAAN,cAAgCC,EAAe,CALtD,MAKsD,CAAAC,EAAA,0BAC/B,GAAa,qBACpC,EAGaC,GAAoB,IAAIH,EAGrCI,GAAaD,EAAiB,ECIvB,IAAME,EAAK,cAcLC,EAAyB,CAAC,EACtC,OAAe,gBAAkBA,EAM3B,SAASC,EAAOC,EAAmB,CACtC,IAAMC,EAAQ,SAAS,eAAe,eAAe,EACrD,GAAI,CAACA,EAAS,OACd,IAAMC,EAAY,IAAI,KAAK,EAAE,YAAY,EAAE,MAAM,GAAI,EAAE,EACvDD,EAAM,YAAc,IAAIC,CAAS,KAAKF,CAAG;AAAA,EAAOC,EAAM,WAC1D,CALgBE,EAAAJ,EAAA,UAsBhB,eAAsBK,GAA8B,CAChD,QAAAC,EACA,aAAAC,EACA,SAAAC,EACA,UAAAC,EACA,MAAAC,EACA,UAAAC,CACJ,EAO8G,CAC1G,IAAMC,EAAkB,IAAIC,GAGtBC,EAAiB,MAAMC,GAAK,CAAE,EAAG,GAAGR,CAAY,gBAAiB,CAAC,EAGlES,EAAmB,MAAMJ,EAAgB,QAAQ,CACnD,aAAcE,EACd,QAAS,CACLG,GAAsB,OAAQ,GAAGT,CAAQ,WAAW,CACxD,EACA,UAAAC,EACA,MAAAC,EACA,aAAc,CAAE,OAAQ,6BAA8B,UAAWQ,GAAa,CAAE,CACpF,CAAC,EAGKC,EAAiB,MAAMP,EAAgB,iBAAiB,CAC1D,eAAgBN,EAChB,iBAAAU,EACA,aAAAT,EACA,UAAAE,EACA,MAAAC,EACA,aAAc,CAACU,EAAkB,CACrC,CAAC,EAEKC,EAAaC,EAAa,CAAE,MAAOhB,CAAQ,CAAC,EAG5CiB,EAAY,MAAMZ,EAAU,kBAAkB,CAChD,WAAAU,EACA,cAAeF,EACf,sBAAuB,CAACH,CAAgB,CAC5C,CAAC,EACD,GAAI,CAACO,EAAU,QACX,MAAM,IAAI,MAAM,uCAAuCA,EAAU,OAAO,EAAE,EAG9E,MAAO,CAAE,eAAAJ,EAAgB,iBAAAH,EAAkB,eAAAF,CAAe,CAC9D,CAtDsBV,EAAAC,GAAA,iCAwDtB,eAAsBmB,GAAsB,CACxC,QAAAlB,EACA,aAAAC,EACA,UAAAE,EACA,MAAAC,CACJ,EAKyF,CACrF,IAAIe,EAAiBnB,EACjBoB,EAAiBtB,EAAA,SAAYG,EAAZ,kBAGfoB,EAAoB,OAAO,OAAOrB,EAAQ,MAAM,WAAa,CAAC,CAAC,EAAE,KACnEsB,GAAKA,EAAE,cAAc,SAASR,EAAkB,CACpD,EAEA,GAAIO,EAAmB,CACnB,IAAME,EAAkBF,EAAkB,gBAC1C,GAAIE,EAAiB,CAEjB,IAAMC,EAAqB,MAAMrB,EAAU,cAAc,CAAE,KAAMoB,EAAiB,MAAAnB,CAAM,CAAC,EACzF,GAAIoB,EAAoB,CACpB,IAAMC,EAAS,MAAMtB,EAAU,IAAI,CAAE,KAAMqB,EAAoB,MAAApB,CAAM,CAAC,EACtE,GAAIqB,EAAO,SAAWA,EAAO,QAAUA,EAAO,OAAO,OAAS,EAAG,CAC7DN,EAAiBM,EAAO,OAAO,CAAC,EAChC,IAAMjB,EAAiB,MAAMC,GAAK,CAAE,EAAG,GAAGR,CAAY,gBAAiB,CAAC,EACxEmB,EAAiBtB,EAAA,SAAYU,EAAZ,iBACrB,CACJ,CACJ,CACJ,CACA,MAAO,CAAE,eAAAW,EAAgB,eAAAC,CAAe,CAC5C,CAnCsBtB,EAAAoB,GAAA,yBAqCtB,eAAsBQ,GAAkBC,EAAwC,CAC5E,IAAMC,EAAQ,GAAGpC,CAAE,sBAAsBmC,EAAK,SAAS,KACjDE,EAAM,SAAS,eAAeF,EAAK,KAAK,EAC9C,GAAKE,EAEL,GAAI,CACAA,EAAI,SAAW,GACfnC,EAAO,GAAGiC,EAAK,SAAS,6EAA6E,EAErG,IAAMxB,EAAY,MAAM2B,EAAgC,EAClD1B,EAAQ,MAAMD,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACC,EAAS,MAAM,IAAI,MAAM,sCAAsC,EAMpE,IAAMJ,EAAU,MAJQ,IAAIO,GAAmB,EAIT,QAAQ,CAC1C,aAAcoB,EAAK,aACnB,QAAS,CACLhB,GAAsB,SAAUgB,EAAK,UAAU,CACnD,EACA,UAAAxB,EACA,MAAAC,EACA,aAAc,CAAE,OAAQ,oBAAqB,UAAWQ,GAAa,CAAE,CAC3E,CAAC,EAEDlB,EAAO,GAAGiC,EAAK,SAAS,uDAAkDX,EAAa,CAAE,MAAOhB,CAAQ,CAAC,CAAC,EAAE,EAC5GN,EAAO,GAAGiC,EAAK,SAAS,yCAAyC,EAGjE,IAAMtB,EAAY,IAAI0B,EAChBC,EAAa,MAAM3B,EAAU,oBAAoBL,CAAO,EAC9D,GAAIgC,EAAW,QACXtC,EAAO,GAAGiC,EAAK,SAAS,4EAAuE,MAE/F,OAAAjC,EAAO,GAAGiC,EAAK,SAAS,yCAAyCK,EAAW,OAAO,GAAG,EAChF,IAAI,MAAM,GAAGL,EAAK,SAAS,oDAAoDK,EAAW,OAAO,EAAE,EAI7GtC,EAAO,GAAGiC,EAAK,SAAS,qDAAqD,EAC7E,GAAM,CAAE,eAAAd,EAAgB,iBAAAH,CAAiB,EAAI,MAAMX,GAA8B,CAC7E,QAAAC,EACA,aAAc2B,EAAK,aACnB,SAAUA,EAAK,SACf,UAAAxB,EACA,MAAAC,EACA,UAAAC,CACJ,CAAC,EAEDZ,EAAW,QAAUoB,EACrBpB,EAAW,oBAAsBkC,EAAK,aAEtCjC,EAAO,GAAGiC,EAAK,SAAS,4CAAuCX,EAAa,CAAE,MAAON,CAAiB,CAAC,CAAC,EAAE,EAG1G,IAAMuB,EAAO,MAAMC,EAAQ,SAAS,CAChC,YAAaC,EACb,GAAIR,EAAK,GACT,KAAMA,EAAK,KACX,IAAK,GACL,SAAU,GACV,IAAK,CAAE,KAAM,GAAM,UAAW,EAAK,CACvC,CAAC,EACKS,EAASH,EAAK,SAGpB,MAAM9B,EAAU,uBAAuB,CAAE,aAAc8B,EAAM,MAAA7B,CAAM,CAAC,EACpE,MAAMD,EAAU,iBAAiB,CAAE,MAAOiC,CAAO,CAAC,EAElD3C,EAAW,QAAU2C,EACrB1C,EAAO,GAAGiC,EAAK,SAAS,4DAAuDX,EAAa,CAAE,MAAOoB,CAAO,CAAC,CAAC,EAAE,EAEhH1C,EAAO,UAAKiC,EAAK,SAAS,8BAA8BA,EAAK,SAAS,QAAQ,EAC9EE,EAAI,YAAc,UAAKF,EAAK,SAAS,kBAErC,IAAMU,EAAU,SAAS,eAAeV,EAAK,SAAS,EAClDU,IAAWA,EAAQ,SAAW,GAEtC,OAASC,EAAO,CACZ5C,EAAO,UAAKiC,EAAK,SAAS,kBAAkBY,EAAgBD,CAAK,CAAC,EAAE,EACpE,QAAQ,MAAM,GAAGV,CAAK,IAAID,EAAK,SAAS,gBAAiBW,CAAK,EAC9DT,EAAI,SAAW,EACnB,CACJ,CArFsB/B,EAAA4B,GAAA,qBA+FtB,eAAsBc,GAAiBb,EAAuC,CAC1E,IAAMC,EAAQ,GAAGpC,CAAE,qBAAqBmC,EAAK,SAAS,KAChDE,EAAM,SAAS,eAAeF,EAAK,KAAK,EAC9C,GAAKE,EAEL,GAAI,CACAA,EAAI,SAAW,GACfnC,EAAO,GAAGiC,EAAK,SAAS,sEAAsE,EAE9F,IAAM3B,EAAUP,EAAW,QACrBgD,EAAUhD,EAAW,QAC3B,GAAI,CAACO,GAAW,CAACyC,EAAS,CACtB/C,EAAO,UAAKiC,EAAK,SAAS,qDAAqD,EAC/EE,EAAI,SAAW,GACf,MACJ,CAEA,IAAMd,EAAaC,EAAa,CAAE,MAAOhB,CAAQ,CAAC,EAC5CG,EAAY,MAAM2B,EAAgC,EAClD1B,EAAQ,MAAMD,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACC,EAAS,MAAM,IAAI,MAAM,mBAAmB,EAEjD,IAAMsC,EAAW,SAAS,WAAa,SAAW,OAAS,MACrDC,EAAa,IAAIC,GAA2B,CAC9C,UAAW,6BACX,cAAe,GAAG,SAAS,QAAQ,KAAK,SAAS,IAAI,wBAAwB,mBAAmB7B,CAAU,CAAC,GAC3G,MAAO,GAAG2B,CAAQ,KAAK,SAAS,IAAI,gBAAgB,mBAAmB3B,CAAU,CAAC,EACtF,CAAC,EAEK8B,EAAc,IAAIC,GAClBC,EAAS,MAAMC,GAAQ,EAC7BvD,EAAW,OAASsD,EACpBtD,EAAW,WAAakD,EAExB,GAAM,CAAE,eAAAxB,EAAgB,eAAAC,CAAe,EAAI,MAAMF,GAAsB,CACnE,QAAAlB,EACA,aAAcP,EAAW,oBACzB,UAAAU,EACA,MAAAC,CACJ,CAAC,EAED,MAAMuC,EAAW,eAAe,CAC5B,eAAgBxC,EAChB,WAAYC,EACZ,eAAAe,EACA,eAAAC,EACA,OAAA2B,EACA,yBAA0BE,EAAwB,aAClD,sBAAuBA,EAAwB,aAC/C,YAAa,CAAClC,CAAU,CAC5B,CAAC,EAED,GAAI,CAaA,MAZiB,MAAM8B,EAAY,KAAK,CACpC,aAAc,CAACJ,CAAO,EACtB,mBAAoB,CAChB,eAAAtB,EACA,iBAAkBJ,CACtB,EACA,eAAAK,EACA,KAAMuB,EACN,WAAYvC,EACZ,UAAAD,EACA,iBAAkB+C,GAAqB,iBAC3C,CAAC,GACc,IACnB,OAASC,EAAK,CACV,GAAIxB,EAAK,kBACLjC,EAAO,GAAGiC,EAAK,SAAS,qCAAqCA,EAAK,sBAAwB,iBAAiB,MAAMY,EAAgBY,CAAG,CAAC,EAAE,MAEvI,OAAMA,CAEd,CAEAzD,EAAO,UAAKiC,EAAK,SAAS,mDAAmD,EAC7EE,EAAI,YAAc,UAAKF,EAAK,SAAS,YAErC,IAAMyB,EAAW,SAAS,eAAezB,EAAK,SAAS,EACnDyB,IAAYA,EAAS,SAAW,GAExC,OAASd,EAAO,CACZ5C,EAAO,UAAKiC,EAAK,SAAS,iBAAiBY,EAAgBD,CAAK,CAAC,EAAE,EACnE,QAAQ,MAAM,GAAGV,CAAK,IAAID,EAAK,SAAS,eAAgBW,CAAK,EAC7DT,EAAI,SAAW,EACnB,CACJ,CArFsB/B,EAAA0C,GAAA,oBAuFtB,eAAsBa,GAA0B,CAC5C,OAAAC,EACA,UAAAnD,EACA,MAAAC,CACJ,EASG,CAEC,IAAMmD,EAAe,OAAO,OAAOD,EAAO,MAAM,WAAa,CAAC,CAAC,EAAE,KAC7DhC,GAAKA,EAAE,cAAc,SAASR,EAAkB,CACpD,EACA,GAAI,CAACyC,EAAgB,MAAO,CAAC,EAC7B,IAAMhC,EAAkBgC,EAAa,gBACrC,GAAI,CAAChC,EAAmB,MAAO,CAAC,EAChC,IAAMiC,EAA0B,MAAMrD,EAAU,cAAc,CAC1D,KAAMoB,EACN,MAAAnB,CACJ,CAAC,EACD,GAAI,CAACoD,EAA2B,MAAO,CAAE,gBAAAjC,CAAgB,EAEzD,IAAMkC,GADY,MAAMtD,EAAU,IAAI,CAAE,MAAO,CAACqD,CAAuB,EAAG,MAAApD,CAAM,CAAC,GACjD,SAAS,CAAC,EAC1C,GAAI,CAACqD,EAAiB,MAAO,CAAE,gBAAAlC,EAAiB,wBAAAiC,CAAwB,EAExE,IAAME,EADYD,EAAc,MAAM,QAAQ,KAAKE,GAAKA,EAAE,OAAO,OAAS,MAAM,GACtC,OAAO,OACjD,MAAO,CACH,gBAAApC,EACA,wBAAAiC,EACA,cAAAC,EACA,uBAAAC,CACJ,CACJ,CArCsB5D,EAAAuD,GAAA,6BA+CtB,eAAsBO,EAAY,CAC9B,aAAAC,EACA,UAAAC,EACA,UAAA3D,EACA,MAAAC,CACJ,EAKkB,CACd,IAAMJ,EAAUP,EAAW,QACrBQ,EAAeR,EAAW,oBAChC,GAAI,CAACO,GAAW,CAACC,EACb,MAAM,IAAI,MAAM,eAAe6D,CAAS,sEAAsE,EAGlH,IAAM/C,EAAaC,EAAa,CAAE,MAAOhB,CAAQ,CAAC,EAC5C0C,EAAW,SAAS,WAAa,SAAW,OAAS,MAErD,CAAE,eAAAvB,EAAgB,eAAAC,CAAe,EAAI,MAAMF,GAAsB,CACnE,QAAAlB,EACA,aAAAC,EACA,UAAAE,EACA,MAAAC,CACJ,CAAC,EAEDV,EAAO,SAASoE,CAAS,yBAAoB9C,EAAa,CAAE,MAAOG,CAAe,CAAC,EAAE,MAAM,EAAG,EAAE,CAAC,KAAK,EAEtG,IAAMwB,EAAa,IAAIC,GAA2B,CAC9C,UAAW,6BACX,cAAe,GAAG,SAAS,QAAQ,KAAK,SAAS,IAAI,wBAAwB,mBAAmB7B,CAAU,CAAC,GAC3G,MAAO,GAAG2B,CAAQ,KAAK,SAAS,IAAI,gBAAgB,mBAAmB3B,CAAU,CAAC,EACtF,CAAC,EACK8B,EAAc,IAAIC,GAClBC,EAAS,MAAMC,GAAQ,EAC7BvD,EAAW,OAASsD,EACpBtD,EAAW,WAAakD,EAExB,MAAMA,EAAW,eAAe,CAC5B,eAAgBxC,EAChB,WAAYC,EACZ,eAAAe,EACA,eAAAC,EACA,OAAA2B,EACA,yBAA0BE,EAAwB,aAClD,sBAAuBA,EAAwB,aAC/C,YAAa,CAAClC,CAAU,CAC5B,CAAC,EAcD,MAZiB,MAAM8B,EAAY,KAAK,CACpC,aAAAgB,EACA,mBAAoB,CAChB,eAAA1C,EACA,iBAAkBJ,CACtB,EACA,eAAAK,EACA,KAAMuB,EACN,WAAYvC,EACZ,UAAAD,EACA,iBAAkB+C,GAAqB,iBAC3C,CAAC,GACc,KAGf,IAAMa,EAAmB,MAAM5D,EAAU,cAAc,CAAE,KAAMY,EAAY,MAAAX,CAAM,CAAC,EAClF,GAAI2D,GAAoBA,IAAqB/C,EAAa,CAAE,MAAOhB,CAAQ,CAAC,EAAG,CAC3E,IAAMgE,EAAM,MAAM7D,EAAU,IAAI,CAAE,MAAO,CAAC4D,CAAgB,EAAG,MAAA3D,CAAM,CAAC,EAChE4D,EAAI,SAAS,CAAC,IAAKvE,EAAW,QAAUuE,EAAI,OAAO,CAAC,EAC5D,CACJ,CAtEsBlE,EAAA8D,EAAA,eAgFtB,eAAsBK,GAAqB,CACvC,aAAAJ,EACA,UAAAC,EACA,UAAA3D,EACA,MAAAC,EACA,aAAA8D,EACA,QAAAlE,EACA,aAAAC,CACJ,EASkB,CACd,IAAMc,EAAaC,EAAa,CAAE,MAAOhB,CAAQ,CAAC,EAC5C0C,EAAW,SAAS,WAAa,SAAW,OAAS,MAErD,CAAE,eAAAvB,EAAgB,eAAAC,CAAe,EAAI,MAAMF,GAAsB,CACnE,QAAAlB,EACA,aAAAC,EACA,UAAAE,EACA,MAAAC,CACJ,CAAC,EAEDV,EAAO,SAASoE,CAAS,yBAAoB9C,EAAa,CAAE,MAAOG,CAAe,CAAC,EAAE,MAAM,EAAG,EAAE,CAAC,KAAK,EAEtG,IAAMwB,EAAa,IAAIC,GAA2B,CAC9C,UAAW,6BACX,cAAe,GAAG,SAAS,QAAQ,KAAK,SAAS,IAAI,wBAAwB,mBAAmB7B,CAAU,CAAC,GAC3G,MAAO,GAAG2B,CAAQ,KAAK,SAAS,IAAI,gBAAgB,mBAAmB3B,CAAU,CAAC,EACtF,CAAC,EACK8B,EAAc,IAAIC,GAClBC,EAAS,MAAMC,GAAQ,EAC7BvD,EAAW,OAASsD,EACpBtD,EAAW,WAAakD,EAExB,MAAMA,EAAW,eAAe,CAC5B,eAAgBxC,EAChB,WAAYC,EACZ,eAAAe,EACA,eAAAC,EACA,OAAA2B,EACA,yBAA0BE,EAAwB,aAClD,sBAAuBA,EAAwB,aAC/C,YAAa,CAAClC,CAAU,CAC5B,CAAC,EAcD,MAZiB,MAAM8B,EAAY,KAAK,CACpC,aAAAgB,EACA,mBAAoB,CAChB,eAAA1C,EACA,iBAAkBJ,CACtB,EACA,eAAAK,EACA,KAAMuB,EACN,WAAYvC,EACZ,UAAAD,EACA,iBAAkB+C,GAAqB,iBAC3C,CAAC,GACc,KAGf,IAAMa,EAAmB,MAAM5D,EAAU,cAAc,CAAE,KAAMY,EAAY,MAAAX,CAAM,CAAC,EAClF,GAAI2D,EAAkB,CAElB,IAAMI,GADM,MAAMhE,EAAU,IAAI,CAAE,MAAO,CAAC4D,CAAgB,EAAG,MAAA3D,CAAM,CAAC,GAChD,SAAS,CAAC,EAC1B+D,IACA1E,EAAW,QAAU0E,EAEjBD,GACA,MAAME,GAAsB,CACxB,QAASD,EACT,UAAAhE,EACA,UAAWC,EACX,QAAS8D,CACb,CAAC,EAGb,CACJ,CAnFsBpE,EAAAmE,GAAA,wBAqFtB,eAAsBI,GAAiC,CACnD,aAAApE,EACA,SAAAC,EACA,WAAAoE,EACA,UAAAnE,EACA,MAAAC,EACA,UAAAC,EACA,UAAAkE,CACJ,EAQ+E,CAK3E,IAAMvE,EAAU,MAJQ,IAAIO,GAAmB,EAIT,QAAQ,CAC1C,aAAAN,EACA,QAAS,CACLU,GAAsB,SAAU2D,CAAU,CAC9C,EACA,UAAAnE,EACA,MAAAC,EACA,aAAc,CAAE,OAAQ,oBAAqB,UAAWQ,GAAa,CAAE,CAC3E,CAAC,EAEDlB,EAAO,GAAG6E,CAAS,uDAAkDvD,EAAa,CAAE,MAAOhB,CAAQ,CAAC,CAAC,EAAE,EACvGN,EAAO,GAAG6E,CAAS,yCAAyC,EAG5D,IAAMvC,EAAa,MAAM3B,EAAU,oBAAoBL,CAAO,EAC9D,GAAIgC,EAAW,QACXtC,EAAO,GAAG6E,CAAS,4EAAuE,MAE1F,OAAA7E,EAAO,GAAG6E,CAAS,yCAAyCvC,EAAW,OAAO,GAAG,EAC3E,IAAI,MAAM,GAAGuC,CAAS,oDAAoDvC,EAAW,OAAO,EAAE,EAIxGtC,EAAO,GAAG6E,CAAS,qDAAqD,EACxE,GAAM,CAAE,eAAA1D,EAAgB,iBAAAH,CAAiB,EAAI,MAAMX,GAA8B,CAC7E,QAAAC,EACA,aAAAC,EACA,SAAAC,EACA,UAAAC,EACA,MAAAC,EACA,UAAAC,CACJ,CAAC,EAED,OAAAZ,EAAW,QAAUoB,EACrBpB,EAAW,oBAAsBQ,EAE1B,CAAE,QAASY,EAAgB,iBAAAH,CAAiB,CACvD,CA1DsBZ,EAAAuE,GAAA,oCA4DtB,eAAsBG,GAAyB,CAC3C,OAAAlB,EACA,UAAAnD,EACA,MAAAC,EACA,UAAAC,EACA,WAAAU,CACJ,EAUG,CACC,IAAM0D,EAAmB,MAAMtE,EAAU,cAAc,CACnD,KAAMY,EACN,MAAAX,CACJ,CAAC,EACD,GAAI,CAACqE,EACD,MAAM,IAAI,MAAM,uDAAuD,EAE3E/E,EAAO,uDAAkD,EAEzD,GAAM,CACF,wBAAA8D,EACA,uBAAAE,CACJ,EAAI,MAAML,GAA0B,CAAE,OAAAC,EAAQ,UAAAnD,EAAW,MAAAC,CAAM,CAAC,EAEhE,GAAI,CAACoD,EACD,MAAM,IAAI,MAAM,yDAAyD,EAE7E,GAAI,CAACE,EACD,MAAM,IAAI,MAAM,yDAAyD,EAE7EhE,EAAO,6EAAwE,EAE/E,IAAMgF,EAAkB,MAAMrE,EAAU,SAASU,EAAYyC,CAAuB,EACpF,GAAI,CAACkB,EAAgB,SAAW,CAACA,EAAgB,MAC7C,MAAM,IAAI,MAAM,gDAAgD,EAEpEhF,EAAO,2DAAsD,EAE7D,IAAMiF,EAAgB,MAAMtE,EAAU,SAASU,EAAY0D,CAAgB,EAC3E,GAAI,CAACE,EAAc,SAAW,CAACA,EAAc,MACzC,MAAM,IAAI,MAAM,8CAA8C,EAElE,OAAAjF,EAAO,yDAAoD,EAEpD,CACH,iBAAA+E,EACA,wBAAAjB,EACA,uBAAAE,CACJ,CACJ,CAxDsB5D,EAAA0E,GAAA,4BA0DtB,eAAsBJ,GAAsB,CACxC,QAAApE,EACA,UAAAG,EACA,UAAAyE,EACA,QAAAC,CACJ,EAKkB,CACd,IAAM9D,EAAaC,EAAa,CAAE,MAAOhB,CAAQ,CAAC,EAG5C+D,EAAmB,MAAM5D,EAAU,cAAc,CAAE,KAAMY,EAAY,MAAO6D,CAAU,CAAC,EAC7F,GAAI,CAACb,EAAoB,MAAM,IAAI,MAAM,yCAAyC,EAGlF,IAAMe,GADY,MAAM3E,EAAU,IAAI,CAAE,MAAO,CAAC4D,CAAgB,EAAG,MAAOa,CAAU,CAAC,GACrD,SAAS,CAAC,EAC1C,GAAI,CAACE,EAAiB,MAAM,IAAI,MAAM,gCAAgC,EAEtE,IAAMC,EAAS,MAAM5E,EAAU,mBAAmB,CAAE,UAAW4D,EAAkB,MAAOa,CAAU,CAAC,EACnG,MAAMzE,EAAU,IAAI,CAAE,OAAQ,OAAO,OAAO4E,CAAM,EAAG,MAAOF,CAAQ,CAAC,EACrE,MAAM1E,EAAU,iBAAiB,CAAE,MAAO2E,EAAe,MAAOD,CAAQ,CAAC,EAGzE,IAAMxD,EAAoB,OAAO,OAAOyD,EAAc,MAAM,WAAa,CAAC,CAAC,EAAE,KACzExD,GAAKA,EAAE,cAAc,SAASR,EAAkB,CACpD,EAEA,GAAIO,EAAmB,CACnB,IAAME,EAAkBF,EAAkB,gBAC1C,GAAIE,EAAiB,CACjB,IAAMC,EAAqB,MAAMrB,EAAU,cAAc,CAAE,KAAMoB,EAAiB,MAAOqD,CAAU,CAAC,EACpG,GAAIpD,EAAoB,CAEpB,IAAMwD,GADS,MAAM7E,EAAU,IAAI,CAAE,MAAO,CAACqB,CAAkB,EAAG,MAAOoD,CAAU,CAAC,GACtD,SAAS,CAAC,EACxC,GAAII,EAAgB,CAChB,IAAMC,EAAW,MAAM9E,EAAU,mBAAmB,CAAE,UAAWqB,EAAoB,MAAOoD,CAAU,CAAC,EACvG,MAAMzE,EAAU,IAAI,CAAE,OAAQ,OAAO,OAAO8E,CAAQ,EAAG,MAAOJ,CAAQ,CAAC,EACvE,MAAM1E,EAAU,iBAAiB,CAAE,MAAO6E,EAAgB,MAAOH,CAAQ,CAAC,CAC9E,CACJ,CACJ,CACJ,CACJ,CA7CsB/E,EAAAsE,GAAA,yBC1oBtB,IAAIc,GAAwB,KAErB,SAASC,IAAyB,CACrC,IAAMC,EAAQ,GAAGC,CAAE,qBACbC,EAAM,SAAS,eAAe,aAAa,EACjD,GAAI,CAACA,EAAK,CACN,QAAQ,KAAK,GAAGF,CAAK,wCAAmC,EACxD,MACJ,CAEAE,EAAI,iBAAiB,QAAS,IAAM,CAChC,GAAI,CACA,GAAIJ,IAAOA,GAAI,aAAe,UAAU,KAAM,CAC1CA,GAAI,KAAK,KAAK,UAAU,CAAE,KAAM,oBAAqB,GAAI,KAAK,IAAI,CAAE,CAAC,CAAC,EACtEK,EAAO,yCAAoC,EAC3C,MACJ,CAGA,IAAMC,EAAQ,GADG,SAAS,WAAa,SAAW,OAAS,KAClC,KAAK,SAAS,IAAI,qBAC3CD,EAAO,wBAAmBC,CAAK,EAAE,EAEjCN,GAAM,IAAI,UAAUM,CAAK,EAEzBN,GAAI,iBAAiB,OAAQ,IAAM,CAC/BK,EAAO,4BAAuB,EAC9BD,EAAI,YAAc,cACtB,CAAC,EAEDJ,GAAI,iBAAiB,UAAYO,GAAO,CACpCF,EAAO,UAAKE,EAAG,IAAI,EAAE,CACzB,CAAC,EAEDP,GAAI,iBAAiB,QAAUO,GAAO,CAClCF,EAAO,iCAA4BE,EAAG,IAAI,GAAG,EAC7CH,EAAI,YAAc,iBAClBJ,GAAM,IACV,CAAC,EAEDA,GAAI,iBAAiB,QAAUO,GAAO,CAClCF,EAAO,6CAAmC,EAC1C,QAAQ,MAAM,GAAGH,CAAK,mBAAoBK,CAAE,CAChD,CAAC,CAEL,OAASC,EAAO,CACZH,EAAO,UAAKI,EAAgBD,CAAK,CAAC,EAAE,EACpC,QAAQ,MAAM,GAAGN,CAAK,IAAIO,EAAgBD,CAAK,CAAC,EAAE,CACtD,CACJ,CAAC,CACL,CA/CgBE,EAAAT,GAAA,oBAiDT,SAASU,IAA6B,CACzC,IAAMP,EAAM,SAAS,eAAe,qBAAqB,EACpDA,GACLA,EAAI,iBAAiB,QAAS,IAAM,CAChCC,EAAO,oCAAoC,EAC3C,QAAQ,IAAIO,CAAU,CAC1B,CAAC,CACL,CAPgBF,EAAAC,GAAA,wBAST,SAASE,IAAuC,CACnD,IAAMX,EAAQ,GAAGC,CAAE,mCACbC,EAAM,SAAS,eAAe,4BAA4B,EAC3DA,GAELA,EAAI,iBAAiB,QAAS,SAAY,CACtC,GAAI,CACAA,EAAI,SAAW,GACfC,EAAO,yCAAyC,EAEhD,IAAMS,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,sCAAsC,EAEpE,IAAMC,EAAe,WAGfC,EAAU,MAFQ,IAAIC,GAAmB,EAET,QAAQ,CAC1C,aAAAF,EACA,QAAS,CACLG,GAAuB,CACnB,GAAI,UACJ,KAAM,MAAMC,GAAQ,EACpB,kBAAmBC,GAA0B,KACjD,CAAC,CACL,EACA,UAAAR,EACA,MAAAE,EACA,aAAc,CAAE,OAAQ,oBAAqB,UAAWO,GAAa,CAAE,CAC3E,CAAC,EAEKC,EAAQC,EAAa,CAAE,MAAOP,CAAQ,CAAC,EAC7Cb,EAAO,kCAA6BmB,CAAK,EAAE,EAE3CZ,EAAW,QAAUM,EACrBN,EAAW,oBAAsBK,EAEjCZ,EAAO,uCAAuC,EAE9C,IAAMqB,EAAU,MADE,IAAIC,EAAkB,EACR,oBAAoBT,CAAO,EAC3D,GAAI,CAACQ,EAAQ,QAAS,CAClBrB,EAAO,4CAAuCqB,EAAQ,OAAO,EAAE,EAC/DtB,EAAI,SAAW,GACf,MACJ,CAEAC,EAAO,4CAAuC,EAC9CD,EAAI,YAAc,iCAElB,IAAMwB,EAAU,SAAS,eAAe,uBAAuB,EAC3DA,IAAWA,EAAQ,SAAW,GAEtC,OAASpB,EAAO,CACZH,EAAO,UAAKI,EAAgBD,CAAK,CAAC,EAAE,EACpC,QAAQ,MAAM,GAAGN,CAAK,IAAIO,EAAgBD,CAAK,CAAC,EAAE,EAClDJ,EAAI,SAAW,EACnB,CACJ,CAAC,CACL,CA1DgBM,EAAAG,GAAA,kCA4DT,SAASgB,IAAkC,CAC9C,IAAM3B,EAAQ,GAAGC,CAAE,8BACbC,EAAM,SAAS,eAAe,uBAAuB,EAC3D,GAAI,CAACA,EAAK,CACN,QAAQ,KAAK,GAAGF,CAAK,kDAA6C,EAClE,MACJ,CAEAE,EAAI,iBAAiB,QAAS,SAAY,CACtC,GAAI,CACAC,EAAO,kCAAkC,EASzC,IAAMyB,GARO,MAAMC,EAAQ,SAAS,CAChC,YAAaC,EACb,GAAI,YACJ,KAAM,CAAE,MAAO,QAAS,OAAQ,KAAK,OAAO,CAAE,EAC9C,IAAK,GACL,SAAU,GACV,IAAK,CAAE,KAAM,GAAM,UAAW,EAAK,CACvC,CAAC,GACmB,SACdC,EAAQR,EAAa,CAAE,MAAOK,CAAO,CAAC,EAE5ClB,EAAW,QAAUkB,EACrBzB,EAAO,qBAAgB4B,CAAK,EAAE,EAC9B7B,EAAI,YAAc,gCAElB,IAAMwB,EAAU,SAAS,eAAe,6BAA6B,EACjEA,IAAWA,EAAQ,SAAW,GACtC,OAASpB,EAAO,CACZH,EAAO,UAAKI,EAAgBD,CAAK,CAAC,EAAE,EACpC,QAAQ,MAAM,GAAGN,CAAK,IAAIO,EAAgBD,CAAK,CAAC,EAAE,CACtD,CACJ,CAAC,CACL,CAjCgBE,EAAAmB,GAAA,6BAmCT,SAASK,IAAwC,CACpD,IAAMhC,EAAQ,GAAGC,CAAE,oCACbC,EAAM,SAAS,eAAe,6BAA6B,EACjE,GAAI,CAACA,EAAK,CACN,QAAQ,KAAK,GAAGF,CAAK,wDAAmD,EACxE,MACJ,CAEAE,EAAI,iBAAiB,QAAS,SAAY,CACtC,GAAI,CACAC,EAAO,yCAAyC,EAEhD,IAAMa,EAAUN,EAAW,QACrBuB,EAAUvB,EAAW,QAE3B,GAAI,CAACM,EAAS,CAAEb,EAAO,oFAA+E,EAAG,MAAQ,CACjH,GAAI,CAAC8B,EAAS,CAAE9B,EAAO,4EAAuE,EAAG,MAAQ,CAEzG,IAAMS,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,sCAAsC,EAEpE,IAAMoB,EAAgB,aAAe,KAAK,OAAO,EAAE,SAAS,EACtDC,EAAkB,IAAIlB,GAE5B,QAAQ,KAAK,GAAGhB,CAAE,2FAA2F,EAC7G,IAAMmC,EAAS,MAAMD,EAAgB,QAAQ,CACzC,aAAcD,EACd,QAAS,CACL,CACI,GAAIG,EAAwB,aAAa,GACzC,KAAM,MAAMlB,GAAQ,EACpB,KAAMkB,EAAwB,OAAO,KACrC,KAAMA,EAAwB,OAAO,KACrC,OAAQA,EAAwB,OAAO,OACvC,SAAU,CACN,KAAMA,EAAwB,aAAa,KAC3C,UAAWA,EAAwB,OAAO,UAC1C,mBAAoBA,EAAwB,aAAa,oBACzD,eAAgBA,EAAwB,aAAa,gBACrD,mBAAoBA,EAAwB,aAAa,oBAC7D,EACA,aAAc,CAAC,CACnB,EACA,CACI,GAAIA,EAAwB,aAAa,GACzC,KAAM,MAAMlB,GAAQ,EACpB,KAAMkB,EAAwB,OAAO,KACrC,KAAMA,EAAwB,OAAO,KACrC,OAAQA,EAAwB,OAAO,OACvC,SAAU,CACN,KAAMA,EAAwB,aAAa,KAC3C,UAAWA,EAAwB,OAAO,UAC1C,mBAAoBA,EAAwB,aAAa,oBACzD,eAAgBA,EAAwB,aAAa,gBACrD,mBAAoBA,EAAwB,aAAa,oBAC7D,EACA,aAAc,CAACA,EAAwB,aAAa,IAAI,CAC5D,CACJ,EACA,UAAAzB,EACA,MAAAE,EACA,aAAc,CACV,OAAQ,wBACR,SAAUE,EAAUO,EAAa,CAAE,MAAOP,CAAQ,CAAC,EAAI,OACvD,SAAUiB,EAAUV,EAAa,CAAE,MAAOU,CAAQ,CAAC,EAAI,MAC3D,CACJ,CAAC,EAEKK,EAAQf,EAAa,CAAE,MAAOa,CAAO,CAAC,EAC5C1B,EAAW,SAAW0B,EACtB1B,EAAW,cAAgBwB,EAE3B/B,EAAO,oCAA+BmC,CAAK,EAAE,EAC7CpC,EAAI,YAAc,iCACtB,OAASI,EAAO,CACZH,EAAO,UAAKI,EAAgBD,CAAK,CAAC,EAAE,EACpC,QAAQ,MAAM,GAAGN,CAAK,IAAIO,EAAgBD,CAAK,CAAC,EAAE,CACtD,CACJ,CAAC,CACL,CAhFgBE,EAAAwB,GAAA,mCCjKT,SAASO,IAA0B,CACtC,IAAMC,EAAM,SAAS,eAAe,cAAc,EAC7CA,GACLA,EAAI,iBAAiB,QAAS,IAAM,CAChCC,GAAkB,CACd,UAAW,KACX,MAAO,eACP,UAAW,cACX,aAAc,4BACd,SAAU,+BACV,WAAY,iCACZ,GAAI,YACJ,KAAM,CAAE,MAAO,QAAS,OAAQ,KAAK,OAAO,CAAE,CAClD,CAAC,CACL,CAAC,CACL,CAfgBC,EAAAH,GAAA,qBAiBT,SAASI,IAAyB,CACrC,IAAMH,EAAM,SAAS,eAAe,aAAa,EAC5CA,GACLA,EAAI,iBAAiB,QAAS,IAAM,CAChCI,GAAiB,CACb,UAAW,KACX,MAAO,cACP,UAAW,eACX,kBAAmB,GACnB,qBAAsB,yEAC1B,CAAC,CACL,CAAC,CACL,CAZgBF,EAAAC,GAAA,oBAcT,SAASE,IAA0B,CACtC,IAAMC,EAAQ,GAAGC,CAAE,sBACbP,EAAM,SAAS,eAAe,cAAc,EAC7CA,GAELA,EAAI,iBAAiB,QAAS,SAAY,CACtC,GAAI,CACAQ,EAAO,iFAAiF,EAExF,IAAMC,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,mBAAmB,EAEjD,IAAMC,EAAUC,EAAW,QACrBC,EAAUD,EAAW,QAGrBE,EAAwB,MAAMN,EAAU,cAAc,CACxD,KAAMO,EAAa,CAAE,MAAOJ,CAAQ,CAAC,EACrC,MAAAD,CACJ,CAAC,EAED,GAAI,CAACI,EAAuB,CACxBP,EAAO,wEAAmE,EAC1E,MACJ,CACAA,EAAO,wEAAmE,EAG1E,IAAMS,GADS,MAAMR,EAAU,IAAI,CAAE,MAAO,CAACM,CAAqB,EAAG,MAAAJ,CAAM,CAAC,GAC3C,SAAS,CAAC,EAE3C,GAAI,CAACM,EAAmB,CACpBT,EAAO,mDAA8C,EACrD,MACJ,CAEA,IAAMU,EAAYD,EAAkB,MAAM,QAAQ,KAAKE,GAAKA,EAAE,OAAO,OAAS,MAAM,EAC/ED,EAGDV,EAAO,wDAAmD,EAF1DA,EAAO,oDAA+C,EAK1D,IAAMY,EAAyBF,GAAW,OAAO,OACjD,GAAI,CAACE,EAAwB,CACzBZ,EAAO,iEAA4D,EACnE,MACJ,CACAA,EAAO,sDAAiDY,CAAsB,EAAE,EAIhF,IAAMC,GADO,MAAMZ,EAAU,IAAI,CAAE,MAAO,CAACW,CAAsB,EAAG,MAAAT,CAAM,CAAC,GAC9C,SAAS,CAAC,EAEvC,GAAI,CAACU,EAAiB,CAClBb,EAAO,8DAAyD,EAChE,MACJ,CACAA,EAAO,kEAA6D,EAEpE,IAAMc,EAASD,EAAgB,MAAM,gBAAkB,CAAC,EAClDE,EAAiBD,EAAO,KAAKH,GAAKA,EAAE,KAAOK,EAAe,EAC1DC,EAAcH,EAAO,KAAKH,GAAKA,EAAE,KAAOO,EAAY,EAEtDH,GAAkBE,EAClBjB,EAAO,iEAA4D,EAEnEA,EAAO,yDAAoDe,CAAc,WAAWE,CAAW,GAAG,EAItGjB,EAAO,kEAAkE,EACzE,IAAMmB,EAAY,IAAIC,EAElBC,EAAO,GACPC,EAAQ,GACRC,EAAO,GAELC,EAAahB,EAAa,CAAE,MAAOJ,CAAQ,CAAC,EAC5CqB,EAA+B,MAAMN,EAAU,iBAAiBK,CAAU,EAChF,GAAIC,EAA6B,SAAWA,EAA6B,MAAO,CAC5E,IAAMC,EAAcD,EAA6B,MACjDJ,EAAOK,EAAYF,CAAU,IAAM,OACnCF,EAAQI,EAAYnB,CAAqB,IAAM,MACnD,MACIP,EAAO,oEAA+DyB,EAA6B,OAAO,EAAE,EAGhH,IAAME,EAA2B,MAAMR,EAAU,SAASK,EAAYZ,CAAsB,EAc5F,GAbIe,EAAyB,SAAWA,EAAyB,MAC7DJ,EAAO,GAEPvB,EAAO,sEAAiE2B,EAAyB,OAAO,EAAE,EAG1GN,EAAQrB,EAAO,wEAAmE,EACjFA,EAAO,qEAAgE,EACxEsB,EAAStB,EAAO,kFAA6E,EAC5FA,EAAO,sEAAiE,EACzEuB,EAAQvB,EAAO,0EAAqE,EACnFA,EAAO,8DAAyD,EAEjEqB,GAAQC,GAASC,EAAM,CACvBvB,EAAO,mEAAuD,EAC9DR,EAAI,YAAc,uBAElB,IAAMoC,EAAa,SAAS,eAAe,cAAc,EACrDA,IAAcA,EAAW,SAAW,GAC5C,CAEJ,OAASC,EAAO,CACZ7B,EAAO,2BAAsB8B,EAAgBD,CAAK,CAAC,EAAE,EACrD,QAAQ,MAAM,GAAG/B,CAAK,mBAAoB+B,CAAK,CACnD,CACJ,CAAC,CACL,CAnHgBnC,EAAAG,GAAA,qBChCT,SAASkC,IAA0B,CACtC,IAAMC,EAAM,SAAS,eAAe,cAAc,EAC7CA,GACLA,EAAI,iBAAiB,QAAS,IAAM,CAChCC,GAAkB,CACd,UAAW,KACX,MAAO,eACP,UAAW,cACX,aAAc,4BACd,SAAU,+BACV,WAAY,iCACZ,GAAI,YACJ,KAAM,CAAE,MAAO,SAAU,OAAQ,KAAK,OAAO,CAAE,CACnD,CAAC,CACL,CAAC,CACL,CAfgBC,EAAAH,GAAA,qBAiBT,SAASI,IAAyB,CACrC,IAAMH,EAAM,SAAS,eAAe,aAAa,EAC5CA,GACLA,EAAI,iBAAiB,QAAS,IAAM,CAChCI,GAAiB,CACb,UAAW,KACX,MAAO,cACP,UAAW,eACX,kBAAmB,GACnB,qBAAsB,uEAC1B,CAAC,CACL,CAAC,CACL,CAZgBF,EAAAC,GAAA,oBAcT,SAASE,IAA0B,CACtC,IAAMC,EAAQ,GAAGC,CAAE,sBACbP,EAAM,SAAS,eAAe,cAAc,EAC7CA,GAELA,EAAI,iBAAiB,QAAS,SAAY,CACtC,GAAI,CACAQ,EAAO,uEAAuE,EAE9E,IAAMC,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,mBAAmB,EAEjD,IAAMC,EAAUC,EAAW,QAGrBC,EAAaC,EAAa,CAAE,MAAOH,CAAQ,CAAC,EAC5CI,EAAwB,MAAMP,EAAU,cAAc,CACxD,KAAMK,EACN,MAAAH,CACJ,CAAC,EAED,GAAI,CAACK,EAAuB,CACxBR,EAAO,wEAAmE,EAC1E,MACJ,CACAA,EAAO,wEAAmE,EAG1E,IAAMS,GADS,MAAMR,EAAU,IAAI,CAAE,MAAO,CAACO,CAAqB,EAAG,MAAAL,CAAM,CAAC,GAC3C,SAAS,CAAC,EAE3C,GAAI,CAACM,EAAmB,CACpBT,EAAO,mDAA8C,EACrD,MACJ,CAGA,IAAMU,EADYD,EAAkB,MAAM,QAAQ,KAAKE,GAAKA,EAAE,OAAO,OAAS,MAAM,GAC1C,OAAO,OACjD,GAAI,CAACD,EAAwB,CACzBV,EAAO,iEAA4D,EACnE,MACJ,CACAA,EAAO,sDAAiDU,CAAsB,EAAE,EAGhF,IAAME,EAAqB,MAAMX,EAAU,cAAc,CACrD,KAAMS,EACN,MAAAP,CACJ,CAAC,EACD,GAAI,CAACS,EAAoB,CACrBZ,EAAO,qEAAgE,EACvE,MACJ,CACAA,EAAO,0DAAqD,EAG5D,IAAMa,GADO,MAAMZ,EAAU,IAAI,CAAE,MAAO,CAACW,CAAkB,EAAG,MAAAT,CAAM,CAAC,GAC1C,SAAS,CAAC,EAEvC,GAAI,CAACU,EAAiB,CAClBb,EAAO,2DAAsD,EAC7D,MACJ,CAGA,IAAMc,EAASD,EAAgB,MAAM,gBAAkB,CAAC,EAClDE,EAAcD,EAAO,KAAKH,GAAKA,EAAE,KAAOK,EAAe,EACvDC,EAAWH,EAAO,KAAKH,GAAKA,EAAE,KAAOO,EAAY,EAEvD,GAAIH,GAAeE,EACfjB,EAAO,iEAA4D,MAChE,CACHA,EAAO,yDAAoD,CAAC,CAACe,CAAW,WAAW,CAAC,CAACE,CAAQ,GAAG,EAChG,MACJ,CAGA,IAAME,EAAsB,OAAO,KAAKJ,EAAY,UAAU,EAAE,OAChE,GAAII,IAAwB,EACxBnB,EAAO,8EAAyE,MAC7E,CACHA,EAAO,+CAA0CmB,CAAmB,wBAAwB,EAC5F,MACJ,CAGA,GAAId,EAAW,YAAcA,EAAW,WAAW,aAC/CL,EAAO,wDAAmD,MACvD,CACHA,EAAO,oEAA+D,EACtE,MACJ,CAEAA,EAAO,iEAAqD,EAC5DR,EAAI,YAAc,uBAElB,IAAM4B,EAAa,SAAS,eAAe,cAAc,EACrDA,IAAcA,EAAW,SAAW,GAE5C,OAASC,EAAO,CACZrB,EAAO,2BAAsBsB,EAAgBD,CAAK,CAAC,EAAE,EACrD,QAAQ,MAAM,GAAGvB,CAAK,mBAAoBuB,CAAK,CACnD,CACJ,CAAC,CACL,CAvGgB3B,EAAAG,GAAA,qBC9BT,SAAS0B,IAA0B,CACtC,IAAMC,EAAM,SAAS,eAAe,cAAc,EAC7CA,GACLA,EAAI,iBAAiB,QAAS,IAAM,CAChCC,GAAkB,CACd,UAAW,KACX,MAAO,eACP,UAAW,cACX,aAAc,4BACd,SAAU,+BACV,WAAY,iCACZ,GAAI,eACJ,KAAM,CAAE,MAAO,SAAU,OAAQ,KAAK,OAAO,CAAE,CACnD,CAAC,CACL,CAAC,CACL,CAfgBC,EAAAH,GAAA,qBAiBT,SAASI,IAAyB,CACrC,IAAMH,EAAM,SAAS,eAAe,aAAa,EAC5CA,GACLA,EAAI,iBAAiB,QAAS,IAAM,CAChCI,GAAiB,CACb,UAAW,KACX,MAAO,cACP,UAAW,cACf,CAAC,CACL,CAAC,CACL,CAVgBF,EAAAC,GAAA,oBAYT,SAASE,IAA0B,CACtC,IAAMC,EAAQ,GAAGC,CAAE,sBACbP,EAAM,SAAS,eAAe,cAAc,EAC7CA,GAELA,EAAI,iBAAiB,QAAS,SAAY,CACtC,GAAI,CACAQ,EAAO,uEAAuE,EAE9E,IAAMC,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,mBAAmB,EAEjD,IAAMC,EAAUC,EAAW,QACrBC,EAAUD,EAAW,QACrBE,EAAQC,EAAa,CAAE,MAAOF,CAAQ,CAAC,EACvCG,EAAaD,EAAa,CAAE,MAAOJ,CAAQ,CAAC,EAG5CM,EAAmB,MAAMT,EAAU,cAAc,CACnD,KAAMM,EACN,MAAAJ,CACJ,CAAC,EACD,GAAI,CAACO,EAAkB,CACnBV,EAAO,0DAAqD,EAC5D,MACJ,CACAA,EAAO,oDAA+CU,CAAgB,EAAE,EAExE,IAAMC,EAAc,MAAMV,EAAU,mBAAmB,CACnD,UAAWS,EACX,MAAAP,CACJ,CAAC,EACD,GAAI,CAACQ,GAAe,OAAO,KAAKA,CAAW,EAAE,SAAW,EAAG,CACvDX,EAAO,iEAA4D,EACnE,MACJ,CACAA,EAAO,8CAAyC,OAAO,KAAKW,CAAW,EAAE,MAAM,UAAU,EAGzF,IAAMC,EAAY,IAAIC,EAChBC,EAAe,MAAMF,EAAU,cAAcH,EAAYF,EAAO,EAAI,EAC1E,GAAI,CAACO,EAAa,SAAW,CAACA,EAAa,MAAO,CAC9Cd,EAAO,6DAAwDc,EAAa,OAAO,EAAE,EACrF,MACJ,CACA,IAAMC,EAAeD,EAAa,MAKlC,GAJAd,EAAO,+CAA0C,OAAO,KAAKe,CAAY,EAAE,MAAM,UAAU,EAG7EC,GAAoB,CAAE,OAAQL,EAAa,OAAQI,CAAa,CAAC,EAE3Ef,EAAO,+EAA0E,MAC9E,CACHA,EAAO,8EAAyE,EAChF,MACJ,CAGA,IAAMiB,EAAmB,MAAMhB,EAAU,cAAc,CACnD,KAAMQ,EACN,MAAAN,CACJ,CAAC,EACD,GAAI,CAACc,EAAkB,CACnBjB,EAAO,wEAAmE,EAC1E,MACJ,CACAA,EAAO,4DAAuD,EAG9D,IAAMkB,GADS,MAAMjB,EAAU,IAAI,CAAE,MAAO,CAACgB,CAAgB,EAAG,MAAAd,CAAM,CAAC,GACjD,SAAS,CAAC,EAChC,GAAI,CAACe,EAAQ,CACTlB,EAAO,mDAA8C,EACrD,MACJ,CAGA,IAAMmB,EADYD,EAAO,MAAM,QAAQ,KAAKE,GAAKA,EAAE,OAAO,OAAS,MAAM,GAC/B,OAAO,OACjD,GAAI,CAACD,EAAwB,CACzBnB,EAAO,iEAA4D,EACnE,MACJ,CAEA,IAAMqB,EAAgB,MAAMT,EAAU,SAASH,EAAYQ,CAAgB,EAC3E,GAAI,CAACI,EAAc,SAAW,CAACA,EAAc,MAAO,CAChDrB,EAAO,iEAA4D,EACnE,MACJ,CACAA,EAAO,8DAAyD,EAGhE,IAAMsB,EAAmB,MAAMrB,EAAU,cAAc,CACnD,KAAMkB,EACN,MAAAhB,CACJ,CAAC,EACD,GAAI,CAACmB,EAAkB,CACnBtB,EAAO,qEAAgE,EACvE,MACJ,CACAA,EAAO,4DAAuDsB,CAAgB,EAAE,EAGhF,IAAMC,GADY,MAAMtB,EAAU,IAAI,CAAE,MAAO,CAACqB,CAAgB,EAAG,MAAAnB,CAAM,CAAC,GAC/C,SAAS,CAAC,EACrC,GAAI,CAACoB,EAAU,CACXvB,EAAO,mEAA8D,EACrE,MACJ,CAGA,IAAMwB,EAAID,EAAS,MAAM,EACzBvB,EAAO,sCAAiCwB,CAAC,GAAG,EACxCA,IAAM,GAAKA,IAAM,GACjBxB,EAAO,6DAAwDwB,CAAC,wBAAwB,EAG5F,IAAMC,EAAgB,MAAMb,EAAU,SAASH,EAAYa,CAAgB,EAC3E,GAAI,CAACG,EAAc,SAAW,CAACA,EAAc,MAAO,CAChDzB,EAAO,gEAA2D,EAClE,MACJ,CACAA,EAAO,6DAAwD,EAG/D,IAAM0B,EAAc,MAAMzB,EAAU,mBAAmB,CACnD,UAAWqB,EACX,MAAAnB,CACJ,CAAC,EACKwB,EAAqB,MAAMf,EAAU,cAAcH,EAAYU,EAAwB,EAAI,EACjG,GAAI,CAACQ,EAAmB,SAAW,CAACA,EAAmB,MAAO,CAC1D3B,EAAO,8DAAyD2B,EAAmB,OAAO,EAAE,EAC5F,MACJ,CACA,IAAMC,EAAeD,EAAmB,MAGxC,GADqBX,GAAoB,CAAE,OAAQU,EAAa,OAAQE,CAAa,CAAC,EAElF5B,EAAO,2FAAsF,MAC1F,CACHA,EAAO,0FAAqF,EAC5F,MACJ,CAEAA,EAAO,0EAA8D,EACrER,EAAI,YAAc,sBAEtB,OAASqC,EAAO,CACZ7B,EAAO,2BAAsB8B,EAAgBD,CAAK,CAAC,EAAE,EACrD,QAAQ,MAAM,GAAG/B,CAAK,mBAAoB+B,CAAK,CACnD,CACJ,CAAC,CACL,CAtJgBnC,EAAAG,GAAA,qBCrBT,SAASkC,IAA4B,CACxC,IAAMC,EAAM,SAAS,eAAe,gBAAgB,EAC/CA,GACLA,EAAI,iBAAiB,QAAS,IAAM,CAChCC,GAAkB,CACd,UAAW,OACX,MAAO,iBACP,UAAW,gBACX,aAAc,8BACd,SAAU,iCACV,WAAY,mCACZ,GAAI,iBACJ,KAAM,CAAE,MAAO,WAAY,OAAQ,KAAK,OAAO,CAAE,CACrD,CAAC,CACL,CAAC,CACL,CAfgBC,EAAAH,GAAA,uBAiBT,SAASI,IAA2B,CACvC,IAAMH,EAAM,SAAS,eAAe,eAAe,EAC9CA,GACLA,EAAI,iBAAiB,QAAS,IAAM,CAChCI,GAAiB,CACb,UAAW,OACX,MAAO,gBACP,UAAW,gBACf,CAAC,CACL,CAAC,CACL,CAVgBF,EAAAC,GAAA,sBAYT,SAASE,IAA4B,CACxC,IAAMC,EAAQ,GAAGC,CAAE,wBACbP,EAAM,SAAS,eAAe,gBAAgB,EAC/CA,GAELA,EAAI,iBAAiB,QAAS,SAAY,CACtC,GAAI,CACAQ,EAAO,yEAAyE,EAEhF,IAAMC,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,mBAAmB,EAEjD,IAAMC,EAAUC,EAAW,QACrBC,EAAUD,EAAW,QACrBE,EAAQC,EAAa,CAAE,MAAOF,CAAQ,CAAC,EACvCG,EAAaD,EAAa,CAAE,MAAOJ,CAAQ,CAAC,EAG5CM,EAAmB,MAAMT,EAAU,cAAc,CACnD,KAAMM,EACN,MAAAJ,CACJ,CAAC,EACD,GAAI,CAACO,EAAkB,CACnBV,EAAO,0DAAqD,EAC5D,MACJ,CACAA,EAAO,oDAA+CU,CAAgB,EAAE,EAExE,IAAMC,EAAc,MAAMV,EAAU,mBAAmB,CACnD,UAAWS,EACX,MAAAP,CACJ,CAAC,EACD,GAAI,CAACQ,GAAe,OAAO,KAAKA,CAAW,EAAE,SAAW,EAAG,CACvDX,EAAO,iEAA4D,EACnE,MACJ,CACAA,EAAO,8CAAyC,OAAO,KAAKW,CAAW,EAAE,MAAM,UAAU,EAGzF,IAAMC,EAAY,IAAIC,EAChBC,EAAe,MAAMF,EAAU,cAAcH,EAAYF,EAAO,EAAI,EAC1E,GAAI,CAACO,EAAa,SAAW,CAACA,EAAa,MAAO,CAC9Cd,EAAO,6DAAwDc,EAAa,OAAO,EAAE,EACrF,MACJ,CACA,IAAMC,EAAeD,EAAa,MAKlC,GAJAd,EAAO,+CAA0C,OAAO,KAAKe,CAAY,EAAE,MAAM,UAAU,EAG7EC,GAAoB,CAAE,OAAQL,EAAa,OAAQI,CAAa,CAAC,EAE3Ef,EAAO,+EAA0E,MAC9E,CACHA,EAAO,8EAAyE,EAChF,MACJ,CAGA,IAAMiB,EAAmB,MAAMhB,EAAU,cAAc,CACnD,KAAMQ,EACN,MAAAN,CACJ,CAAC,EACD,GAAI,CAACc,EAAkB,CACnBjB,EAAO,wEAAmE,EAC1E,MACJ,CACAA,EAAO,4DAAuD,EAG9D,IAAMkB,GADS,MAAMjB,EAAU,IAAI,CAAE,MAAO,CAACgB,CAAgB,EAAG,MAAAd,CAAM,CAAC,GACjD,SAAS,CAAC,EAChC,GAAI,CAACe,EAAQ,CACTlB,EAAO,mDAA8C,EACrD,MACJ,CAEA,GAAM,CACF,wBAAAmB,EACA,uBAAAC,CACJ,EAAI,MAAMC,GAA0B,CAAE,OAAAH,EAAQ,UAAAjB,EAAW,MAAAE,CAAM,CAAC,EAEhE,GAAI,CAACgB,EAAyB,CAC1BnB,EAAO,uEAAkE,EACzE,MACJ,CACA,GAAI,CAACoB,EAAwB,CACzBpB,EAAO,uEAAkE,EACzE,MACJ,CACAA,EAAO,6EAAwE,EAE/E,IAAMsB,EAAkB,MAAMV,EAAU,SAASH,EAAYU,CAAuB,EACpF,GAAI,CAACG,EAAgB,SAAW,CAACA,EAAgB,MAAO,CACpDtB,EAAO,8DAAyD,EAChE,MACJ,CACAA,EAAO,2DAAsD,EAE7D,IAAMuB,EAAgB,MAAMX,EAAU,SAASH,EAAYQ,CAAgB,EAC3E,GAAI,CAACM,EAAc,SAAW,CAACA,EAAc,MAAO,CAChDvB,EAAO,iEAA4D,EACnE,MACJ,CACAA,EAAO,8DAAyD,EAGhE,IAAMwB,EAAmB,MAAMvB,EAAU,cAAc,CACnD,KAAMmB,EACN,MAAAjB,CACJ,CAAC,EACD,GAAI,CAACqB,EAAkB,CACnBxB,EAAO,qEAAgE,EACvE,MACJ,CACAA,EAAO,4DAAuDwB,CAAgB,EAAE,EAGhF,IAAMC,GADY,MAAMxB,EAAU,IAAI,CAAE,MAAO,CAACuB,CAAgB,EAAG,MAAArB,CAAM,CAAC,GAC/C,SAAS,CAAC,EACrC,GAAI,CAACsB,EAAU,CACXzB,EAAO,mEAA8D,EACrE,MACJ,CAGA,IAAM0B,EAAID,EAAS,MAAM,EACzBzB,EAAO,sCAAiC0B,CAAC,GAAG,EACxCA,IAAM,GAAKA,IAAM,GACjB1B,EAAO,6DAAwD0B,CAAC,wBAAwB,EAG5F,IAAMC,EAAgB,MAAMf,EAAU,SAASH,EAAYe,CAAgB,EAC3E,GAAI,CAACG,EAAc,SAAW,CAACA,EAAc,MAAO,CAChD3B,EAAO,gEAA2D,EAClE,MACJ,CACAA,EAAO,6DAAwD,EAG/D,IAAM4B,EAAc,MAAM3B,EAAU,mBAAmB,CACnD,UAAWuB,EACX,MAAArB,CACJ,CAAC,EACK0B,EAAqB,MAAMjB,EAAU,cAAcH,EAAYW,EAAwB,EAAI,EACjG,GAAI,CAACS,EAAmB,SAAW,CAACA,EAAmB,MAAO,CAC1D7B,EAAO,8DAAyD6B,EAAmB,OAAO,EAAE,EAC5F,MACJ,CACA,IAAMC,EAAeD,EAAmB,MAGxC,GADqBb,GAAoB,CAAE,OAAQY,EAAa,OAAQE,CAAa,CAAC,EAElF9B,EAAO,2FAAsF,MAC1F,CACHA,EAAO,0FAAqF,EAC5F,MACJ,CAEAA,EAAO,4EAAgE,EACvER,EAAI,YAAc,wBAEtB,OAASuC,EAAO,CACZ/B,EAAO,6BAAwBgC,EAAgBD,CAAK,CAAC,EAAE,EACvD,QAAQ,MAAM,GAAGjC,CAAK,qBAAsBiC,CAAK,CACrD,CACJ,CAAC,CACL,CArKgBrC,EAAAG,GAAA,uBCjCT,SAASoC,IAA4B,CACxC,IAAMC,EAAM,SAAS,eAAe,gBAAgB,EAC/CA,GACLA,EAAI,iBAAiB,QAAS,IAAM,CAChCC,GAAkB,CACd,UAAW,OACX,MAAO,iBACP,UAAW,gBACX,aAAc,8BACd,SAAU,iCACV,WAAY,mCACZ,GAAI,oBACJ,KAAM,CAAE,MAAO,OAAQ,CAC3B,CAAC,CACL,CAAC,CACL,CAfgBC,EAAAH,GAAA,uBAiBhB,eAAeI,IAAsC,CACjD,IAAMC,EAAQ,GAAGC,CAAE,yBACbL,EAAM,SAAS,eAAe,eAAe,EACnD,GAAKA,EAEL,GAAI,CAIA,GAHAA,EAAI,SAAW,GACfM,EAAO,0EAA0E,EAE7E,CAACC,EAAW,QAAS,CACrBD,EAAO,gEAA2D,EAClEN,EAAI,SAAW,GACf,MACJ,CAEA,IAAMQ,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,mBAAmB,EAGjD,IAAMC,EAAK,MAAMC,EAAQ,SAAS,CAC9B,kBAAmB,OACnB,GAAI,gBAAkB,MAAMC,GAAQ,GAAG,MAAM,EAAG,CAAC,EACjD,KAAM,CAAE,KAAM,YAAa,OAAQ,KAAK,OAAO,CAAE,CACrD,CAAC,EACKC,EAASC,EAAa,CAAE,MAAOJ,CAAG,CAAC,EACzC,MAAMH,EAAU,IAAI,CAAE,MAAOG,EAAI,MAAAD,CAAM,CAAC,EACxC,MAAMF,EAAU,iBAAiB,CAAE,MAAOG,CAAG,CAAC,EAC9CJ,EAAW,SAAWI,EACtBL,EAAO,0CAAqCQ,CAAM,EAAE,EAGpDR,EAAO,yCAAyC,EAChD,MAAMU,EAAY,CAAE,aAAc,CAACL,CAAE,EAAG,UAAW,mBAAoB,UAAAH,EAAW,MAAAE,CAAM,CAAC,EACzFJ,EAAO,oCAA+B,EAGtCA,EAAO,sDAAsD,EAC7D,MAAMU,EAAY,CAAE,aAAc,CAACL,CAAE,EAAG,UAAW,8BAA+B,UAAAH,EAAW,MAAAE,CAAM,CAAC,EACpGJ,EAAO,oCAA+B,EAGtC,IAAMW,EAAK,MAAML,EAAQ,SAAS,CAC9B,GAAI,gBAAkB,MAAMC,GAAQ,GAAG,MAAM,EAAG,CAAC,EACjD,kBAAmB,OACnB,OAAQ,CAAE,KAAM,CAACC,CAAM,CAAE,CAC7B,CAAC,EACKI,EAASH,EAAa,CAAE,MAAOE,CAAG,CAAC,EACzC,MAAMT,EAAU,IAAI,CAAE,MAAOS,EAAI,MAAAP,CAAM,CAAC,EACxC,MAAMF,EAAU,iBAAiB,CAAE,MAAOS,CAAG,CAAC,EAC9CV,EAAW,SAAWU,EACtBX,EAAO,wDAAmDY,CAAM,EAAE,EAGlEZ,EAAO,yCAAyC,EAChD,MAAMU,EAAY,CAAE,aAAc,CAACC,CAAE,EAAG,UAAW,mBAAoB,UAAAT,EAAW,MAAAE,CAAM,CAAC,EACzFJ,EAAO,oCAA+B,EAEtCA,EAAO,6DAAwD,EAC/DN,EAAI,YAAc,uBAElB,IAAMmB,EAAW,SAAS,eAAe,gBAAgB,EACrDA,IAAYA,EAAS,SAAW,GAExC,OAASC,EAAO,CACZd,EAAO,4BAAuBe,EAAgBD,CAAK,CAAC,EAAE,EACtD,QAAQ,MAAM,GAAGhB,CAAK,oBAAqBgB,CAAK,EAChDpB,EAAI,SAAW,EACnB,CACJ,CArEeE,EAAAC,GAAA,wBAuER,SAASmB,IAA2B,CACvC,IAAMtB,EAAM,SAAS,eAAe,eAAe,EAC9CA,GACLA,EAAI,iBAAiB,QAAS,IAAM,CAAEG,GAAqB,CAAG,CAAC,CACnE,CAJgBD,EAAAoB,GAAA,sBAMT,SAASC,IAA4B,CACxC,IAAMnB,EAAQ,GAAGC,CAAE,wBACbL,EAAM,SAAS,eAAe,gBAAgB,EAC/CA,GAELA,EAAI,iBAAiB,QAAS,SAAY,CACtC,GAAI,CACAM,EAAO,yEAAyE,EAEhF,IAAME,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,mBAAmB,EAEjD,IAAMc,EAAUjB,EAAW,QACrBkB,EAAWlB,EAAW,SACtBmB,EAAWnB,EAAW,SACtBoB,EAASZ,EAAa,CAAE,MAAOU,CAAS,CAAC,EACzCG,EAASb,EAAa,CAAE,MAAOW,CAAS,CAAC,EACzCG,EAAad,EAAa,CAAE,MAAOS,CAAQ,CAAC,EAC5CM,EAAY,IAAIC,EAGhBC,EAAa,MAAMxB,EAAU,IAAI,CAAE,MAAO,CAACmB,CAAM,EAAG,MAAAjB,CAAM,CAAC,EAC3DuB,EAAa,MAAMzB,EAAU,IAAI,CAAE,MAAO,CAACoB,CAAM,EAAG,MAAAlB,CAAM,CAAC,EACjE,GAAI,CAACsB,EAAW,SAAW,CAACA,EAAW,SAAS,CAAC,EAAG,CAChD1B,EAAO,8CAAyC,EAAG,MACvD,CACA,GAAI,CAAC2B,EAAW,SAAW,CAACA,EAAW,SAAS,CAAC,EAAG,CAChD3B,EAAO,8CAAyC,EAAG,MACvD,CACAA,EAAO,kDAA6C,EAGpD,IAAM4B,EAAc,MAAMJ,EAAU,SAASD,EAAYF,CAAM,EACzDQ,EAAc,MAAML,EAAU,SAASD,EAAYD,CAAM,EAC/D,GAAI,CAACM,EAAY,SAAW,CAACA,EAAY,MAAO,CAC5C5B,EAAO,kDAA6C4B,EAAY,OAAO,EAAE,EAAG,MAChF,CACA,GAAI,CAACC,EAAY,SAAW,CAACA,EAAY,MAAO,CAC5C7B,EAAO,kDAA6C6B,EAAY,OAAO,EAAE,EAAG,MAChF,CACA7B,EAAO,oDAA+C,EAEtD,IAAM8B,EAAe,MAAM5B,EAAU,mBAAmB,CAAE,UAAWoB,EAAQ,MAAAlB,CAAM,CAAC,EAC9E2B,EAAsB,MAAMP,EAAU,cAAcD,EAAYD,EAAQ,EAAI,EAClF,GAAI,CAACS,EAAoB,SAAW,CAACA,EAAoB,MAAO,CAC5D/B,EAAO,uDAAkD+B,EAAoB,OAAO,EAAE,EAAG,MAC7F,CACA,GAAI,CAACC,GAAoB,CAAE,OAAQF,EAAc,OAAQC,EAAoB,KAAM,CAAC,EAAG,CACnF/B,EAAO,wEAAmE,EAAG,MACjF,CACAA,EAAO,yEAAoE,EAK3E,IAAMiC,EAAmB,MAAM/B,EAAU,cAAc,CAAE,KAAMqB,EAAY,MAAAnB,CAAM,CAAC,EAClF,GAAI,CAAC6B,EAAkB,CAAEjC,EAAO,sDAAiD,EAAG,MAAQ,CAE5F,IAAMkC,GADY,MAAMhC,EAAU,IAAI,CAAE,MAAO,CAAC+B,CAAgB,EAAG,MAAA7B,CAAM,CAAC,GACjD,SAAS,CAAC,EACnC,GAAI,CAAC8B,EAAQ,CAAElC,EAAO,+CAA0C,EAAG,MAAQ,CAE3E,IAAMmC,EAAKD,EAAO,MAAM,EAExB,GADAlC,EAAO,yCAAoCmC,CAAE,GAAG,EAC5CA,IAAO,EAAG,CACVnC,EAAO,qFAAgFmC,CAAE,GAAG,EAAG,MACnG,CAEA,GAAM,CAAE,uBAAAC,CAAuB,EAAI,MAAMC,GAAyB,CAC9D,OAAAH,EAAQ,UAAAhC,EAAW,MAAAE,EAAO,UAAAoB,EAAW,WAAAD,CACzC,CAAC,EAIKe,EAAmB,MAAMpC,EAAU,cAAc,CAAE,KAAMkC,EAAwB,MAAAhC,CAAM,CAAC,EAC9F,GAAI,CAACkC,EAAkB,CACnBtC,EAAO,qEAAgE,EAAG,MAC9E,CACAA,EAAO,4DAAuDsC,CAAgB,EAAE,EAGhF,IAAMC,GADY,MAAMrC,EAAU,IAAI,CAAE,MAAO,CAACoC,CAAgB,EAAG,MAAAlC,CAAM,CAAC,GAC/C,SAAS,CAAC,EACrC,GAAI,CAACmC,EAAU,CAAEvC,EAAO,4DAAuD,EAAG,MAAQ,CAE1F,IAAMwC,EAAKD,EAAS,MAAM,EAE1B,GADAvC,EAAO,qDAAgDwC,CAAE,GAAG,EACxDA,IAAO,EAAG,CACVxC,EAAO,iGAA4FwC,CAAE,GAAG,EAAG,MAC/G,CAEA,IAAMC,EAAgB,MAAMjB,EAAU,SAASD,EAAYe,CAAgB,EAC3E,GAAI,CAACG,EAAc,SAAW,CAACA,EAAc,MAAO,CAChDzC,EAAO,gEAA2D,EAAG,MACzE,CACAA,EAAO,6DAAwD,EAE/D,IAAM0C,EAAc,MAAMxC,EAAU,mBAAmB,CAAE,UAAWoC,EAAkB,MAAAlC,CAAM,CAAC,EACvFuC,EAAqB,MAAMnB,EAAU,cAAcD,EAAYa,EAAwB,EAAI,EACjG,GAAI,CAACO,EAAmB,SAAW,CAACA,EAAmB,MAAO,CAC1D3C,EAAO,8DAAyD2C,EAAmB,OAAO,EAAE,EAAG,MACnG,CACA,GAAI,CAACX,GAAoB,CAAE,OAAQU,EAAa,OAAQC,EAAmB,KAAM,CAAC,EAAG,CACjF3C,EAAO,0FAAqF,EAAG,MACnG,CACAA,EAAO,2FAAsF,EAE7FA,EAAO,4EAAgE,EACvEN,EAAI,YAAc,wBAEtB,OAASoB,EAAO,CACZd,EAAO,6BAAwBe,EAAgBD,CAAK,CAAC,EAAE,EACvD,QAAQ,MAAM,GAAGhB,CAAK,qBAAsBgB,CAAK,CACrD,CACJ,CAAC,CACL,CAlHgBlB,EAAAqB,GAAA,uBC5FT,SAAS2B,IAA4B,CACxC,IAAMC,EAAM,SAAS,eAAe,gBAAgB,EAC/CA,GACLA,EAAI,iBAAiB,QAAS,SAAY,CACtC,GAAI,CACAA,EAAI,SAAW,GACfC,EAAO,4EAA4E,EAEnF,IAAMC,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,mBAAmB,EAEjD,IAAMC,EAAY,IAAIC,EAGtB,MAAMC,GAAiC,CACnC,aAAc,8BACd,SAAU,iCACV,WAAY,mCACZ,UAAAL,EAAW,MAAAE,EAAO,UAAAC,EAClB,UAAW,MACf,CAAC,EAGD,IAAMG,EAAQ,MAAMC,EAAQ,SAAS,CACjC,YAAaC,EACb,GAAI,6BACJ,KAAM,CAAE,KAAM,OAAQ,MAAO,WAAY,OAAQ,KAAK,OAAO,CAAE,EAC/D,IAAK,GACL,SAAU,GACV,IAAK,CAAE,KAAM,GAAM,UAAW,EAAK,CACvC,CAAC,EACKC,EAAQH,EAAM,SACpB,MAAMN,EAAU,uBAAuB,CAAE,aAAcM,EAAO,MAAAJ,CAAM,CAAC,EACrE,MAAMF,EAAU,iBAAiB,CAAE,MAAOS,CAAM,CAAC,EAEjD,IAAMC,EAAQ,MAAMC,EAAa,CAC7B,SAAUF,EACV,SAAU,CAAE,iBAAkB,CAAE,KAAM,UAAW,MAAO,SAAU,CAAE,EACpE,UAAAT,EAAW,MAAAE,CACf,CAAC,EAEDU,EAAW,SAAWF,EACtBE,EAAW,QAAUF,EACrBX,EAAO,wEAAmEc,EAAa,CAAE,MAAOH,CAAM,CAAC,CAAC,EAAE,EAE1GX,EAAO,kDAA6C,EACpDD,EAAI,YAAc,6BAElB,IAAMgB,EAAU,SAAS,eAAe,eAAe,EACnDA,IAAWA,EAAQ,SAAW,GAEtC,OAASC,EAAO,CACZhB,EAAO,6BAAwBiB,EAAgBD,CAAK,CAAC,EAAE,EACvD,QAAQ,MAAMA,CAAK,EACnBjB,EAAI,SAAW,EACnB,CACJ,CAAC,CACL,CA1DgBmB,EAAApB,GAAA,uBA4DhB,eAAeqB,IAAsC,CACjD,IAAMC,EAAQ,GAAGC,CAAE,yBACbtB,EAAM,SAAS,eAAe,eAAe,EACnD,GAAKA,EAEL,GAAI,CACAA,EAAI,SAAW,GAEf,IAAMuB,EAAWT,EAAW,QAC5B,GAAI,CAACA,EAAW,SAAW,CAACS,EAAU,CAClCtB,EAAO,gEAA2D,EAClED,EAAI,SAAW,GACf,MACJ,CAEA,IAAME,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,mBAAmB,EAGjDH,EAAO,mDAAmD,EAC1D,MAAMuB,EAAY,CAAE,aAAc,CAACD,CAAQ,EAAG,UAAW,mBAAoB,UAAArB,EAAW,MAAAE,CAAM,CAAC,EAC/FH,EAAO,gDAA2C,EAGlDA,EAAO,yCAAyC,EAChD,IAAMwB,EAAQ,MAAMZ,EAAa,CAC7B,SAAUU,EACV,SAAU,CAAE,iBAAkB,CAAE,KAAM,UAAW,MAAO,SAAU,CAAE,EACpE,UAAArB,EAAW,MAAAE,CACf,CAAC,EACDU,EAAW,QAAUW,EACrBxB,EAAO,yCAAoCc,EAAa,CAAE,MAAOU,CAAM,CAAC,CAAC,EAAE,EAG3ExB,EAAO,yDAAyD,EAChE,MAAMuB,EAAY,CAAE,aAAc,CAACC,CAAK,EAAG,UAAW,mBAAoB,UAAAvB,EAAW,MAAAE,CAAM,CAAC,EAC5FH,EAAO,gDAA2C,EAElDA,EAAO,6DAAwD,EAC/DD,EAAI,YAAc,uBAElB,IAAM0B,EAAW,SAAS,eAAe,gBAAgB,EACrDA,IAAYA,EAAS,SAAW,GAExC,OAAST,EAAO,CACZhB,EAAO,4BAAuBiB,EAAgBD,CAAK,CAAC,EAAE,EACtD,QAAQ,MAAMA,CAAK,EACnBjB,EAAI,SAAW,EACnB,CACJ,CAlDemB,EAAAC,GAAA,wBAoDR,SAASO,IAA2B,CACvC,IAAM3B,EAAM,SAAS,eAAe,eAAe,EAC9CA,GACLA,EAAI,iBAAiB,QAAS,IAAM,CAAEoB,GAAqB,CAAG,CAAC,CACnE,CAJgBD,EAAAQ,GAAA,sBAMT,SAASC,IAA4B,CACxC,IAAMP,EAAQ,GAAGC,CAAE,wBACbtB,EAAM,SAAS,eAAe,gBAAgB,EAC/CA,GAELA,EAAI,iBAAiB,QAAS,SAAY,CACtC,GAAI,CACAC,EAAO,yEAAyE,EAEhF,IAAMC,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,mBAAmB,EAEjD,IAAMyB,EAAUf,EAAW,QACrBS,EAAWT,EAAW,SACtBgB,EAAWhB,EAAW,QACtBiB,EAAShB,EAAa,CAAE,MAAOQ,CAAS,CAAC,EACzCS,EAASjB,EAAa,CAAE,MAAOe,CAAS,CAAC,EACzCG,EAAalB,EAAa,CAAE,MAAOc,CAAQ,CAAC,EAC5CxB,EAAY,IAAIC,EAGhB4B,EAAa,MAAMhC,EAAU,IAAI,CAAE,MAAO,CAAC6B,CAAM,EAAG,MAAA3B,CAAM,CAAC,EAC3D+B,EAAa,MAAMjC,EAAU,IAAI,CAAE,MAAO,CAAC8B,CAAM,EAAG,MAAA5B,CAAM,CAAC,EACjE,GAAI,CAAC8B,EAAW,SAAW,CAACA,EAAW,SAAS,CAAC,EAAG,CAChDjC,EAAO,oDAA+C,EAAG,MAC7D,CACA,GAAI,CAACkC,EAAW,SAAW,CAACA,EAAW,SAAS,CAAC,EAAG,CAChDlC,EAAO,oDAA+C,EAAG,MAC7D,CACAA,EAAO,wDAAmD,EAG1D,IAAMmC,EAAc,MAAM/B,EAAU,SAAS4B,EAAYD,CAAM,EAC/D,GAAI,CAACI,EAAY,SAAW,CAACA,EAAY,MAAO,CAC5CnC,EAAO,wDAAmDmC,EAAY,OAAO,EAAE,EAAG,MACtF,CACAnC,EAAO,mDAA8C,EAErD,IAAMoC,EAAWD,EAAY,MAAM,QAAQ,MAAM,GAAG,EAAE,EACtD,GAAIC,IAAaN,EACb9B,EAAO,uEAAkE,MACtE,CACHA,EAAO,wEAAmEoC,CAAQ,EAAE,EAAG,MAC3F,CAEA,IAAMC,EAAe,MAAMpC,EAAU,mBAAmB,CAAE,UAAW8B,EAAQ,MAAA5B,CAAM,CAAC,EAC9EmC,EAAsB,MAAMlC,EAAU,cAAc4B,EAAYD,EAAQ,EAAI,EAClF,GAAI,CAACO,EAAoB,SAAW,CAACA,EAAoB,MAAO,CAC5DtC,EAAO,uDAAkDsC,EAAoB,OAAO,EAAE,EAAG,MAC7F,CACA,GAAI,CAACC,GAAoB,CAAE,OAAQF,EAAc,OAAQC,EAAoB,KAAM,CAAC,EAAG,CACnFtC,EAAO,iFAA4E,EAAG,MAC1F,CACAA,EAAO,kFAA6E,EAKpF,IAAMwC,EAAmB,MAAMvC,EAAU,cAAc,CAAE,KAAM+B,EAAY,MAAA7B,CAAM,CAAC,EAClF,GAAI,CAACqC,EAAkB,CAAExC,EAAO,sDAAiD,EAAG,MAAQ,CAE5F,IAAMyC,GADY,MAAMxC,EAAU,IAAI,CAAE,MAAO,CAACuC,CAAgB,EAAG,MAAArC,CAAM,CAAC,GACjD,SAAS,CAAC,EACnC,GAAI,CAACsC,EAAQ,CAAEzC,EAAO,+CAA0C,EAAG,MAAQ,CAE3E,IAAM0C,EAAKD,EAAO,MAAM,EAExB,GADAzC,EAAO,yCAAoC0C,CAAE,GAAG,EAC5CA,IAAO,EAAG,CACV1C,EAAO,qFAAgF0C,CAAE,GAAG,EAAG,MACnG,CAEA,GAAM,CAAE,uBAAAC,CAAuB,EAAI,MAAMC,GAAyB,CAC9D,OAAAH,EAAQ,UAAAxC,EAAW,MAAAE,EAAO,UAAAC,EAAW,WAAA4B,CACzC,CAAC,EAGKa,EAAmB,MAAM5C,EAAU,cAAc,CAAE,KAAM0C,EAAwB,MAAAxC,CAAM,CAAC,EAC9F,GAAI,CAAC0C,EAAkB,CACnB7C,EAAO,qEAAgE,EAAG,MAC9E,CACAA,EAAO,4DAAuD6C,CAAgB,EAAE,EAGhF,IAAMC,GADY,MAAM7C,EAAU,IAAI,CAAE,MAAO,CAAC4C,CAAgB,EAAG,MAAA1C,CAAM,CAAC,GAC/C,SAAS,CAAC,EACrC,GAAI,CAAC2C,EAAU,CAAE9C,EAAO,4DAAuD,EAAG,MAAQ,CAE1F,IAAM+C,EAAKD,EAAS,MAAM,EAE1B,GADA9C,EAAO,qDAAgD+C,CAAE,GAAG,EACxDA,IAAO,EAAG,CACV/C,EAAO,uEAAkE+C,CAAE,GAAG,EAAG,MACrF,CAEA,IAAMC,EAAgB,MAAM5C,EAAU,SAAS4B,EAAYa,CAAgB,EAC3E,GAAI,CAACG,EAAc,SAAW,CAACA,EAAc,MAAO,CAChDhD,EAAO,gEAA2D,EAAG,MACzE,CACAA,EAAO,6DAAwD,EAE/D,IAAMiD,EAAc,MAAMhD,EAAU,mBAAmB,CAAE,UAAW4C,EAAkB,MAAA1C,CAAM,CAAC,EACvF+C,EAAqB,MAAM9C,EAAU,cAAc4B,EAAYW,EAAwB,EAAI,EACjG,GAAI,CAACO,EAAmB,SAAW,CAACA,EAAmB,MAAO,CAC1DlD,EAAO,8DAAyDkD,EAAmB,OAAO,EAAE,EAAG,MACnG,CACA,GAAI,CAACX,GAAoB,CAAE,OAAQU,EAAa,OAAQC,EAAmB,KAAM,CAAC,EAAG,CACjFlD,EAAO,0FAAqF,EAAG,MACnG,CACAA,EAAO,2FAAsF,EAE7FA,EAAO,4EAAgE,EACvED,EAAI,YAAc,wBAEtB,OAASiB,EAAO,CACZhB,EAAO,6BAAwBiB,EAAgBD,CAAK,CAAC,EAAE,EACvD,QAAQ,MAAM,GAAGI,CAAK,qBAAsBJ,CAAK,CACrD,CACJ,CAAC,CACL,CApHgBE,EAAAS,GAAA,uBCtHT,SAASwB,IAA4B,CACxC,IAAMC,EAAM,SAAS,eAAe,gBAAgB,EAC/CA,GACLA,EAAI,iBAAiB,QAAS,SAAY,CACtC,GAAI,CACAA,EAAI,SAAW,GACfC,EAAO,kFAAkF,EAEzF,IAAMC,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,mBAAmB,EAEjD,IAAMC,EAAY,IAAIC,EAGtB,MAAMC,GAAiC,CACnC,aAAc,8BACd,SAAU,iCACV,WAAY,mCACZ,UAAAL,EAAW,MAAAE,EAAO,UAAAC,EAClB,UAAW,MACf,CAAC,EAGD,IAAMG,EAAQ,MAAMC,EAAQ,SAAS,CACjC,YAAaC,EACb,GAAI,0BACJ,KAAM,CAAE,KAAM,OAAQ,MAAO,WAAY,OAAQ,KAAK,OAAO,CAAE,EAC/D,IAAK,GACL,SAAU,GACV,IAAK,CAAE,KAAM,GAAM,UAAW,EAAK,CACvC,CAAC,EACKC,EAAQH,EAAM,SACpB,MAAMN,EAAU,uBAAuB,CAAE,aAAcM,EAAO,MAAAJ,CAAM,CAAC,EACrE,MAAMF,EAAU,iBAAiB,CAAE,MAAOS,CAAM,CAAC,EACjDC,EAAW,SAAWD,EAGtB,IAAME,EAAQ,MAAMC,EAAa,CAC7B,SAAUH,EACV,SAAU,CAAE,iBAAkB,CAAE,KAAM,UAAW,MAAO,SAAU,CAAE,EACpE,UAAAT,EAAW,MAAAE,CACf,CAAC,EACDQ,EAAW,SAAWC,EAGtB,IAAME,EAAQ,MAAMD,EAAa,CAC7B,SAAUD,EACV,SAAU,CAAE,iBAAkB,CAAE,KAAM,UAAW,MAAO,SAAU,CAAE,EACpE,UAAAX,EAAW,MAAAE,CACf,CAAC,EACDQ,EAAW,QAAUG,EAErBd,EAAO,uEAAkEe,EAAa,CAAE,MAAOD,CAAM,CAAC,CAAC,EAAE,EAEzGd,EAAO,kDAA6C,EACpDD,EAAI,YAAc,6BAElB,IAAMiB,EAAU,SAAS,eAAe,eAAe,EACnDA,IAAWA,EAAQ,SAAW,GAEtC,OAASC,EAAO,CACZjB,EAAO,6BAAwBkB,EAAgBD,CAAK,CAAC,EAAE,EACvD,QAAQ,MAAMA,CAAK,EACnBlB,EAAI,SAAW,EACnB,CACJ,CAAC,CACL,CAnEgBoB,EAAArB,GAAA,uBAqEhB,eAAesB,IAAsC,CACjD,IAAMC,EAAQ,GAAGC,CAAE,yBACbvB,EAAM,SAAS,eAAe,eAAe,EACnD,GAAKA,EAEL,GAAI,CACAA,EAAI,SAAW,GACfC,EAAO,mDAAmD,EAE1D,IAAMuB,EAAWZ,EAAW,QAC5B,GAAI,CAACA,EAAW,SAAW,CAACY,EAAU,CAClCvB,EAAO,gEAA2D,EAClED,EAAI,SAAW,GACf,MACJ,CAEA,IAAME,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,mBAAmB,EAEjD,MAAMqB,EAAY,CAAE,aAAc,CAACD,CAAQ,EAAG,UAAW,uBAAwB,UAAAtB,EAAW,MAAAE,CAAM,CAAC,EACnGH,EAAO,6CAAwC,EAE/CA,EAAO,6DAAwD,EAC/DD,EAAI,YAAc,uBAElB,IAAM0B,EAAW,SAAS,eAAe,gBAAgB,EACrDA,IAAYA,EAAS,SAAW,GAExC,OAASR,EAAO,CACZjB,EAAO,4BAAuBkB,EAAgBD,CAAK,CAAC,EAAE,EACtD,QAAQ,MAAMA,CAAK,EACnBlB,EAAI,SAAW,EACnB,CACJ,CAlCeoB,EAAAC,GAAA,wBAoCR,SAASM,IAA2B,CACvC,IAAM3B,EAAM,SAAS,eAAe,eAAe,EAC9CA,GACLA,EAAI,iBAAiB,QAAS,IAAM,CAAEqB,GAAqB,CAAG,CAAC,CACnE,CAJgBD,EAAAO,GAAA,sBAMT,SAASC,IAA4B,CACxC,IAAMN,EAAQ,GAAGC,CAAE,wBACbvB,EAAM,SAAS,eAAe,gBAAgB,EAC/CA,GAELA,EAAI,iBAAiB,QAAS,SAAY,CACtC,GAAI,CACAC,EAAO,yEAAyE,EAEhF,IAAMC,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,mBAAmB,EAEjD,IAAMyB,EAAUjB,EAAW,QACrBkB,EAAWlB,EAAW,SACtBmB,EAAWnB,EAAW,SACtBY,EAAWZ,EAAW,QACtBoB,EAAShB,EAAa,CAAE,MAAOc,CAAS,CAAC,EACzCG,EAASjB,EAAa,CAAE,MAAOe,CAAS,CAAC,EACzCG,EAASlB,EAAa,CAAE,MAAOQ,CAAS,CAAC,EACzCW,EAAanB,EAAa,CAAE,MAAOa,CAAQ,CAAC,EAC5CxB,EAAY,IAAIC,EAGhB8B,EAAa,MAAMlC,EAAU,IAAI,CAAE,MAAO,CAAC8B,CAAM,EAAG,MAAA5B,CAAM,CAAC,EAC3DiC,EAAa,MAAMnC,EAAU,IAAI,CAAE,MAAO,CAAC+B,CAAM,EAAG,MAAA7B,CAAM,CAAC,EAC3DkC,EAAa,MAAMpC,EAAU,IAAI,CAAE,MAAO,CAACgC,CAAM,EAAG,MAAA9B,CAAM,CAAC,EACjE,GAAI,CAACgC,EAAW,SAAW,CAACA,EAAW,SAAS,CAAC,EAAG,CAChDnC,EAAO,oDAA+C,EAAG,MAC7D,CACA,GAAI,CAACoC,EAAW,SAAW,CAACA,EAAW,SAAS,CAAC,EAAG,CAChDpC,EAAO,oDAA+C,EAAG,MAC7D,CACA,GAAI,CAACqC,EAAW,SAAW,CAACA,EAAW,SAAS,CAAC,EAAG,CAChDrC,EAAO,oDAA+C,EAAG,MAC7D,CACAA,EAAO,6DAAwD,EAG/D,IAAMsC,EAAc,MAAMlC,EAAU,SAAS8B,EAAYD,CAAM,EAC/D,GAAI,CAACK,EAAY,SAAW,CAACA,EAAY,MAAO,CAC5CtC,EAAO,wDAAmDsC,EAAY,OAAO,EAAE,EAAG,MACtF,CACAtC,EAAO,mDAA8C,EAErD,IAAMuC,EAAaD,EAAY,MAAM,QAAQ,MAAM,GAAG,EAAE,EACxD,GAAIC,IAAeP,EACfhC,EAAO,uEAAkE,MACtE,CACHA,EAAO,wEAAmEuC,CAAU,EAAE,EAAG,MAC7F,CAEA,IAAMC,EAAc,MAAMpC,EAAU,SAAS8B,EAAYF,CAAM,EAC/D,GAAI,CAACQ,EAAY,SAAW,CAACA,EAAY,MAAO,CAC5CxC,EAAO,wDAAmDwC,EAAY,OAAO,EAAE,EAAG,MACtF,CACAxC,EAAO,mDAA8C,EAErD,IAAMyC,EAAaD,EAAY,MAAM,QAAQ,MAAM,GAAG,EAAE,EACxD,GAAIC,IAAeV,EACf/B,EAAO,uEAAkE,MACtE,CACHA,EAAO,wEAAmEyC,CAAU,EAAE,EAAG,MAC7F,CAEA,IAAMC,EAAe,MAAMzC,EAAU,mBAAmB,CAAE,UAAWgC,EAAQ,MAAA9B,CAAM,CAAC,EAC9EwC,EAAsB,MAAMvC,EAAU,cAAc8B,EAAYD,EAAQ,EAAI,EAClF,GAAI,CAACU,EAAoB,SAAW,CAACA,EAAoB,MAAO,CAC5D3C,EAAO,uDAAkD2C,EAAoB,OAAO,EAAE,EAAG,MAC7F,CACA,GAAI,CAACC,GAAoB,CAAE,OAAQF,EAAc,OAAQC,EAAoB,KAAM,CAAC,EAAG,CACnF3C,EAAO,iFAA4E,EAAG,MAC1F,CACAA,EAAO,kFAA6E,EAGpF,IAAM6C,EAAmB,MAAM5C,EAAU,cAAc,CAAE,KAAMiC,EAAY,MAAA/B,CAAM,CAAC,EAClF,GAAI,CAAC0C,EAAkB,CAAE7C,EAAO,sDAAiD,EAAG,MAAQ,CAE5F,IAAM8C,GADY,MAAM7C,EAAU,IAAI,CAAE,MAAO,CAAC4C,CAAgB,EAAG,MAAA1C,CAAM,CAAC,GACjD,SAAS,CAAC,EACnC,GAAI,CAAC2C,EAAQ,CAAE9C,EAAO,+CAA0C,EAAG,MAAQ,CAC3EA,EAAO,yDAAoD6C,CAAgB,EAAE,EAE7E,IAAME,EAAKD,EAAO,MAAM,EAExB,GADA9C,EAAO,yCAAoC+C,CAAE,GAAG,EAC5CA,IAAO,EAAG,CACV/C,EAAO,wDAAmD+C,CAAE,GAAG,EAAG,MACtE,CAEA,GAAM,CAAE,uBAAAC,CAAuB,EAAI,MAAMC,GAAyB,CAC9D,OAAAH,EAAQ,UAAA7C,EAAW,MAAAE,EAAO,UAAAC,EAAW,WAAA8B,CACzC,CAAC,EAGKgB,EAAmB,MAAMjD,EAAU,cAAc,CAAE,KAAM+C,EAAwB,MAAA7C,CAAM,CAAC,EAC9F,GAAI,CAAC+C,EAAkB,CACnBlD,EAAO,qEAAgE,EAAG,MAC9E,CACAA,EAAO,4DAAuDkD,CAAgB,EAAE,EAGhF,IAAMC,GADY,MAAMlD,EAAU,IAAI,CAAE,MAAO,CAACiD,CAAgB,EAAG,MAAA/C,CAAM,CAAC,GAC/C,SAAS,CAAC,EACrC,GAAI,CAACgD,EAAU,CAAEnD,EAAO,4DAAuD,EAAG,MAAQ,CAE1F,IAAMoD,EAAKD,EAAS,MAAM,EAE1B,GADAnD,EAAO,qDAAgDoD,CAAE,GAAG,EACxDA,IAAO,EAAG,CACVpD,EAAO,uEAAkEoD,CAAE,GAAG,EAAG,MACrF,CAEA,IAAMC,EAAgB,MAAMjD,EAAU,SAAS8B,EAAYgB,CAAgB,EAC3E,GAAI,CAACG,EAAc,SAAW,CAACA,EAAc,MAAO,CAChDrD,EAAO,gEAA2D,EAAG,MACzE,CACAA,EAAO,6DAAwD,EAE/D,IAAMsD,GAAc,MAAMrD,EAAU,mBAAmB,CAAE,UAAWiD,EAAkB,MAAA/C,CAAM,CAAC,EACvFoD,EAAqB,MAAMnD,EAAU,cAAc8B,EAAYc,EAAwB,EAAI,EACjG,GAAI,CAACO,EAAmB,SAAW,CAACA,EAAmB,MAAO,CAC1DvD,EAAO,8DAAyDuD,EAAmB,OAAO,EAAE,EAAG,MACnG,CACA,GAAI,CAACX,GAAoB,CAAE,OAAQU,GAAa,OAAQC,EAAmB,KAAM,CAAC,EAAG,CACjFvD,EAAO,0FAAqF,EAAG,MACnG,CACAA,EAAO,2FAAsF,EAE7FA,EAAO,4EAAgE,EACvED,EAAI,YAAc,wBAEtB,OAASkB,EAAO,CACZjB,EAAO,6BAAwBkB,EAAgBD,CAAK,CAAC,EAAE,EACvD,QAAQ,MAAM,GAAGI,CAAK,qBAAsBJ,CAAK,CACrD,CACJ,CAAC,CACL,CAtIgBE,EAAAQ,GAAA,uBC3GhB,IAAM6B,GAAsB,CAAC,EAEvBC,GAAgB,+BAEf,SAASC,IAA4B,CACxC,IAAMC,EAAM,SAAS,eAAe,gBAAgB,EAC/CA,GACLA,EAAI,iBAAiB,QAAS,SAAY,CACtC,GAAI,CACAA,EAAI,SAAW,GACfC,EAAO,oGAAoG,EAE3G,IAAMC,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,mBAAmB,EAEjD,IAAMC,EAAY,IAAIC,EAGtB,MAAMC,GAAiC,CACnC,aAAcT,GACd,SAAU,kCACV,WAAY,oCACZ,UAAAI,EAAW,MAAAE,EAAO,UAAAC,EAClB,UAAW,MACf,CAAC,EAGD,IAAMG,EAAQ,MAAMC,EAAQ,SAAS,CACjC,YAAaC,EACb,GAAI,6BACJ,KAAM,CAAE,KAAM,OAAQ,MAAO,WAAY,OAAQ,KAAK,OAAO,CAAE,EAC/D,IAAK,GAAM,SAAU,GAAM,IAAK,CAAE,KAAM,GAAM,UAAW,EAAK,CAClE,CAAC,EACKC,EAAQH,EAAM,SACpB,MAAMN,EAAU,uBAAuB,CAAE,aAAcM,EAAO,MAAAJ,CAAM,CAAC,EACrE,MAAMF,EAAU,iBAAiB,CAAE,MAAOS,EAAO,MAAAP,CAAM,CAAC,EAGxD,IAAMQ,EAAQ,MAAMC,EAAa,CAC7B,SAAUF,EACV,SAAU,CAAE,iBAAkB,CAAE,KAAM,UAAW,MAAO,SAAU,CAAE,EACpE,UAAAT,EAAW,MAAAE,CACf,CAAC,EACDU,EAAW,SAAWF,EACtBX,EAAO,+DAA0Dc,EAAa,CAAE,MAAOH,CAAM,CAAC,CAAC,EAAE,EAGjGX,EAAO,uDAAuD,EAC9D,MAAMe,EAAY,CAAE,aAAc,CAACJ,CAAK,EAAG,UAAW,oBAAqB,UAAAV,EAAW,MAAAE,CAAM,CAAC,EAC7FH,EAAO,yDAAoD,EAG3DA,EAAO,0EAA0E,EACjF,IAAMgB,EAAkB,UAAU,MAAMC,GAAQ,CAAC,GAC3CC,EAAc,MAAMjB,EAAU,oBAAoB,CACpD,KAAM,CACF,YAAa,GACb,UAAWe,EACX,YAAaf,EAAU,WAC3B,CACJ,CAAC,EACD,GAAI,CAACiB,EAAe,MAAM,IAAI,MAAM,+BAA+B,EACnE,MAAMA,EAAY,YAGlB,IAAMC,EAAU,MAAMlB,EAAU,mBAAmB,CAAE,UAAWa,EAAa,CAAE,MAAOH,CAAM,CAAC,EAAG,MAAAR,CAAM,CAAC,EACvG,MAAMF,EAAU,IAAI,CAAE,OAAQ,OAAO,OAAOkB,CAAO,EAAG,MAAOD,CAAY,CAAC,EAC1E,MAAMjB,EAAU,iBAAiB,CAAE,MAAOU,EAAO,MAAOO,CAAY,CAAC,EAErE,IAAME,EAAUP,EAAW,QAC3B,MAAMQ,GAAsB,CAAE,QAAAD,EAAS,UAAAnB,EAAW,UAAWE,EAAO,QAASe,CAAY,CAAC,EAC1FlB,EAAO,mFAA8E,EAGrFA,EAAO,iDAAiD,EACxD,IAAMsB,EAAQ,MAAMV,EAAa,CAC7B,SAAUD,EACV,SAAU,CAAE,iBAAkB,CAAE,KAAM,UAAW,MAAO,SAAU,CAAE,EACpE,UAAAV,EACA,MAAOiB,CACX,CAAC,EACDtB,GAAM,SAAW0B,EACjBtB,EAAO,oDAA+Cc,EAAa,CAAE,MAAOQ,CAAM,CAAC,CAAC,EAAE,EAGtFtB,EAAO,0DAA0D,EACjE,MAAMuB,GAAqB,CACvB,aAAc,CAACD,CAAK,EACpB,UAAW,2BACX,UAAArB,EACA,MAAOiB,EACP,aAAcf,EACd,QAAAiB,EACA,aAAcvB,EAClB,CAAC,EACDG,EAAO,qFAAgF,EAEvFA,EAAO,6FAAwF,EAC/FD,EAAI,YAAc,6BAElB,IAAMyB,EAAU,SAAS,eAAe,eAAe,EACnDA,IAAWA,EAAQ,SAAW,GAEtC,OAASC,EAAO,CACZzB,EAAO,6BAAwB0B,EAAgBD,CAAK,CAAC,EAAE,EACvD,QAAQ,MAAMA,CAAK,EACnB1B,EAAI,SAAW,EACnB,CACJ,CAAC,CACL,CA1GgB4B,EAAA7B,GAAA,uBA4GT,SAAS8B,IAA2B,CACvC,IAAM7B,EAAM,SAAS,eAAe,eAAe,EAC9CA,GACLA,EAAI,iBAAiB,QAAS,SAAY,CACtC,GAAI,CACAA,EAAI,SAAW,GACfC,EAAO,gGAAgG,EAEvG,IAAM6B,EAAWhB,EAAW,SAC5B,GAAI,CAACA,EAAW,SAAW,CAACgB,EAAU,CAClC7B,EAAO,gEAA2D,EAClED,EAAI,SAAW,GACf,MACJ,CAEA,IAAME,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,mBAAmB,EAIjD,MAAMY,EAAY,CAAE,aAAc,CAACc,CAAQ,EAAG,UAAW,sBAAuB,UAAA5B,EAAW,MAAAE,CAAM,CAAC,EAElGH,EAAO,4DAAuD,EAC9DD,EAAI,YAAc,uBAElB,IAAM+B,EAAW,SAAS,eAAe,gBAAgB,EACrDA,IAAYA,EAAS,SAAW,GAExC,OAASL,EAAO,CACZzB,EAAO,4BAAuB0B,EAAgBD,CAAK,CAAC,EAAE,EACtD,QAAQ,MAAMA,CAAK,EACnB1B,EAAI,SAAW,EACnB,CACJ,CAAC,CACL,CAnCgB4B,EAAAC,GAAA,sBAqCT,SAASG,IAA4B,CACxC,IAAMhC,EAAM,SAAS,eAAe,gBAAgB,EAC/CA,GACLA,EAAI,iBAAiB,QAAS,SAAY,CACtC,GAAI,CACAA,EAAI,SAAW,GACfC,EAAO,yEAAyE,EAEhF,IAAMgC,EAAWpC,GAAM,SACvB,GAAI,CAACoC,GAAY,CAACnB,EAAW,QAAS,CAClCb,EAAO,+DAA0D,EACjED,EAAI,SAAW,GACf,MACJ,CAEA,IAAMkC,EAAenB,EAAa,CAAE,MAAOkB,CAAS,CAAC,EAC/CE,EAAapB,EAAa,CAAE,MAAOD,EAAW,OAAQ,CAAC,EACvDZ,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,mBAAmB,EAGjD,IAAMgC,EAAW,MAAMlC,EAAU,IAAI,CAAE,KAAMgC,EAAc,MAAA9B,CAAM,CAAC,EAClE,GAAI,CAACgC,EAAS,SAAWA,EAAS,QAAQ,SAAW,EACjD,MAAM,IAAI,MAAM,WAAWF,CAAY,kCAAkC,EAE7E,IAAMG,EAAUD,EAAS,OAAO,CAAC,EACjCnC,EAAO,oDAA+CoC,EAAQ,MAAM,KAAK,GAAG,EAG5E,IAAMC,EAAa,MAAMpC,EAAU,mBAAmB,CAAE,UAAWgC,EAAc,MAAA9B,CAAM,CAAC,EACxFH,EAAO,yDAAyD,EAEhE,IAAMsC,EAAiB,MADL,IAAIjC,EAAkB,EACD,cAAc6B,EAAYD,EAAc,EAAI,EACnF,GAAI,CAACK,EAAe,SAAW,CAACA,EAAe,MAC3C,MAAM,IAAI,MAAM,yCAAyCA,EAAe,OAAO,EAAE,EAGrF,GADcC,GAAoB,CAAE,OAAQF,EAAY,OAAQC,EAAe,KAAM,CAAC,EAElFtC,EAAO,+FAA0F,EACjGD,EAAI,YAAc,gCAElB,OAAM,IAAI,MAAM,iEAAiE,CAGzF,OAAS0B,EAAO,CACZzB,EAAO,6BAAwB0B,EAAgBD,CAAK,CAAC,EAAE,EACvD,QAAQ,MAAMA,CAAK,EACnB1B,EAAI,SAAW,EACnB,CACJ,CAAC,CACL,CAnDgB4B,EAAAI,GAAA,uBCpJhB,IAAMS,GAAsB,CAAC,EAEvBC,GAAgB,+BAEf,SAASC,IAA4B,CACxC,IAAMC,EAAM,SAAS,eAAe,gBAAgB,EAC/CA,GACLA,EAAI,iBAAiB,QAAS,SAAY,CACtC,GAAI,CACAA,EAAI,SAAW,GACfC,EAAO,qGAAqG,EAE5G,IAAMC,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,mBAAmB,EAEjD,IAAMC,EAAY,IAAIC,EAGtB,MAAMC,GAAiC,CACnC,aAAcT,GACd,SAAU,kCACV,WAAY,oCACZ,UAAAI,EAAW,MAAAE,EAAO,UAAAC,EAClB,UAAW,MACf,CAAC,EAGD,IAAMG,EAAa,MAAMC,EAAQ,SAAS,CACtC,YAAaC,EACb,GAAI,2BACJ,KAAM,CAAE,KAAM,OAAQ,MAAO,YAAa,OAAQ,KAAK,OAAO,CAAE,EAChE,IAAK,GAAM,SAAU,GAAM,IAAK,CAAE,KAAM,GAAM,UAAW,EAAK,CAClE,CAAC,EACKC,EAAcH,EAAW,SAC/B,MAAMN,EAAU,uBAAuB,CAAE,aAAcM,EAAY,MAAAJ,CAAM,CAAC,EAC1E,MAAMF,EAAU,iBAAiB,CAAE,MAAOS,EAAa,MAAAP,CAAM,CAAC,EAE9D,IAAMQ,EAAc,MAAMC,EAAa,CACnC,SAAUF,EACV,SAAU,CAAE,iBAAkB,CAAE,KAAM,UAAW,MAAO,SAAU,CAAE,EACpE,UAAAT,EAAW,MAAAE,CACf,CAAC,EACDP,GAAM,cAAgBe,EACtBE,EAAW,SAAWF,EACtBX,EAAO,wDAAmDc,EAAa,CAAE,MAAOH,CAAY,CAAC,CAAC,EAAE,EAGhG,IAAMI,EAAY,MAAMP,EAAQ,SAAS,CACrC,YAAaC,EACb,GAAI,0BACJ,KAAM,CAAE,KAAM,OAAQ,MAAO,WAAY,OAAQ,KAAK,OAAO,CAAE,EAC/D,IAAK,GAAM,SAAU,GAAM,IAAK,CAAE,KAAM,GAAM,UAAW,EAAK,CAClE,CAAC,EACKO,EAAaD,EAAU,SAC7B,MAAMd,EAAU,uBAAuB,CAAE,aAAcc,EAAW,MAAAZ,CAAM,CAAC,EACzE,MAAMF,EAAU,iBAAiB,CAAE,MAAOe,EAAY,MAAAb,CAAM,CAAC,EAE7D,IAAMc,EAAa,MAAML,EAAa,CAClC,SAAUI,EACV,SAAU,CAAE,iBAAkB,CAAE,KAAM,UAAW,MAAO,SAAU,CAAE,EACpE,UAAAf,EAAW,MAAAE,CACf,CAAC,EACKe,EAAa,MAAMN,EAAa,CAClC,SAAUK,EACV,SAAU,CAAE,iBAAkB,CAAE,KAAM,UAAW,MAAO,SAAU,CAAE,EACpE,UAAAhB,EAAW,MAAAE,CACf,CAAC,EACDP,GAAM,aAAesB,EACrBL,EAAW,SAAWK,EACtBlB,EAAO,wDAAmDc,EAAa,CAAE,MAAOI,CAAW,CAAC,CAAC,EAAE,EAE/FlB,EAAO,6EAAwE,EAC/ED,EAAI,YAAc,6BAElB,IAAMoB,EAAU,SAAS,eAAe,eAAe,EACnDA,IAAWA,EAAQ,SAAW,GAEtC,OAASC,EAAO,CACZpB,EAAO,6BAAwBqB,EAAgBD,CAAK,CAAC,EAAE,EACvD,QAAQ,MAAMA,CAAK,EACnBrB,EAAI,SAAW,EACnB,CACJ,CAAC,CACL,CAhFgBuB,EAAAxB,GAAA,uBAkFT,SAASyB,IAA2B,CACvC,IAAMxB,EAAM,SAAS,eAAe,eAAe,EAC9CA,GACLA,EAAI,iBAAiB,QAAS,SAAY,CACtC,GAAI,CACAA,EAAI,SAAW,GACfC,EAAO,wFAAwF,EAE/F,IAAMwB,EAAgB5B,GAAM,cACtB6B,EAAe7B,GAAM,aAC3B,GAAI,CAACiB,EAAW,SAAW,CAACW,GAAiB,CAACC,EAAc,CACxDzB,EAAO,gEAA2D,EAClED,EAAI,SAAW,GACf,MACJ,CAEA,IAAME,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,mBAAmB,EAGjD,MAAMuB,EAAY,CACd,aAAc,CAACF,EAAeC,CAAY,EAC1C,UAAW,0BACX,UAAAxB,EAAW,MAAAE,CACf,CAAC,EAEDH,EAAO,4DAAuD,EAC9DD,EAAI,YAAc,uBAElB,IAAM4B,EAAW,SAAS,eAAe,gBAAgB,EACrDA,IAAYA,EAAS,SAAW,GAExC,OAASP,EAAO,CACZpB,EAAO,4BAAuBqB,EAAgBD,CAAK,CAAC,EAAE,EACtD,QAAQ,MAAMA,CAAK,EACnBrB,EAAI,SAAW,EACnB,CACJ,CAAC,CACL,CAvCgBuB,EAAAC,GAAA,sBAyCT,SAASK,IAA4B,CACxC,IAAM7B,EAAM,SAAS,eAAe,gBAAgB,EAC/CA,GACLA,EAAI,iBAAiB,QAAS,SAAY,CACtC,GAAI,CACAA,EAAI,SAAW,GACfC,EAAO,6GAA6G,EAEpH,IAAMwB,EAAgB5B,GAAM,cACtB6B,EAAe7B,GAAM,aAC3B,GAAI,CAACiB,EAAW,SAAW,CAACW,GAAiB,CAACC,EAAc,CACxDzB,EAAO,2DAAsD,EAC7DD,EAAI,SAAW,GACf,MACJ,CAEA,IAAM8B,EAAaf,EAAa,CAAE,MAAOD,EAAW,OAAQ,CAAC,EACvDiB,EAAYhB,EAAa,CAAE,MAAOU,CAAc,CAAC,EACjDO,EAAWjB,EAAa,CAAE,MAAOW,CAAa,CAAC,EAE/CxB,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,mBAAmB,EAEjD,IAAMC,EAAY,IAAIC,EAGtBL,EAAO,iEAAiE,EACxE,IAAMgC,EAAsB,MAAM5B,EAAU,cAAcyB,EAAYC,EAAW,EAAI,EACrF,GAAI,CAACE,EAAoB,SAAW,CAACA,EAAoB,MACrD,MAAM,IAAI,MAAM,iDAAiDA,EAAoB,OAAO,EAAE,EAElG,IAAMC,EAAkB,MAAMhC,EAAU,mBAAmB,CAAE,UAAW6B,EAAW,MAAA3B,CAAM,CAAC,EAC1F,GAAI,CAAC+B,GAAoB,CAAE,OAAQD,EAAiB,OAAQD,EAAoB,KAAM,CAAC,EACnF,MAAM,IAAI,MAAM,4EAA4E,EAEhGhC,EAAO,sDAAiD,EAGxDA,EAAO,iEAAiE,EACxE,IAAMmC,EAAqB,MAAM/B,EAAU,cAAcyB,EAAYE,EAAU,EAAI,EACnF,GAAI,CAACI,EAAmB,SAAW,CAACA,EAAmB,MACnD,MAAM,IAAI,MAAM,iDAAiDA,EAAmB,OAAO,EAAE,EAEjG,IAAMC,EAAiB,MAAMnC,EAAU,mBAAmB,CAAE,UAAW8B,EAAU,MAAA5B,CAAM,CAAC,EACxF,GAAI,CAAC+B,GAAoB,CAAE,OAAQE,EAAgB,OAAQD,EAAmB,KAAM,CAAC,EACjF,MAAM,IAAI,MAAM,4EAA4E,EAEhGnC,EAAO,sDAAiD,EAExDA,EAAO,4GAAuG,EAC9GD,EAAI,YAAc,2BAEtB,OAASqB,EAAO,CACZpB,EAAO,6BAAwBqB,EAAgBD,CAAK,CAAC,EAAE,EACvD,QAAQ,MAAMA,CAAK,EACnBrB,EAAI,SAAW,EACnB,CACJ,CAAC,CACL,CA3DgBuB,EAAAM,GAAA,uBC7HhB,IAAMS,GAAsB,CAAC,EAEvBC,GAAgB,+BAEf,SAASC,IAA4B,CACxC,IAAMC,EAAM,SAAS,eAAe,gBAAgB,EAC/CA,GACLA,EAAI,iBAAiB,QAAS,SAAY,CACtC,GAAI,CACAA,EAAI,SAAW,GACfC,EAAO,wFAAwF,EAE/F,IAAMC,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,mBAAmB,EAEjD,IAAMC,EAAY,IAAIC,EAEtB,MAAMC,GAAiC,CACnC,aAAcT,GACd,SAAU,kCACV,WAAY,oCACZ,UAAAI,EAAW,MAAAE,EAAO,UAAAC,EAAW,UAAW,MAC5C,CAAC,EAED,IAAMG,EAAUC,EAAW,QAErBC,EAAc,MAAMR,EAAU,oBAAoB,CACpD,KAAM,CAAE,YAAa,GAAO,UAAW,oBAAqB,YAAaA,EAAU,WAAa,CACpG,CAAC,EACD,MAAMQ,EAAY,YAClB,MAAMR,EAAU,IAAI,CAAE,MAAOM,EAAS,MAAOE,CAAY,CAAC,EAC1D,MAAMR,EAAU,iBAAiB,CAAE,MAAOM,EAAS,MAAOE,CAAY,CAAC,EAEvE,IAAMC,EAAU,MAAMC,EAAQ,SAAS,CACnC,YAAaC,EACb,GAAI,8BACJ,KAAM,CAAE,KAAM,OAAQ,MAAO,aAAc,OAAQ,KAAK,OAAO,CAAE,EACjE,IAAK,GAAM,SAAU,GAAM,IAAK,CAAE,KAAM,GAAM,UAAW,EAAK,CAClE,CAAC,EACKC,EAAWH,EAAQ,SACzB,MAAMT,EAAU,uBAAuB,CAAE,aAAcS,EAAS,MAAAP,CAAM,CAAC,EACvE,MAAMF,EAAU,iBAAiB,CAAE,MAAOY,EAAU,MAAAV,CAAM,CAAC,EAC3DP,GAAM,SAAWiB,EAEjB,IAAMC,EAAY,MAAMC,EAAa,CACjC,SAAUF,EACV,SAAU,CAAE,iBAAkB,CAAE,KAAM,UAAW,MAAO,UAAW,CAAE,EACrE,UAAAZ,EAAW,MAAAE,CACf,CAAC,EAEKa,EAAY,MAAMf,EAAU,mBAAmB,CAAE,UAAWgB,EAAa,CAAE,MAAOJ,CAAS,CAAC,EAAG,MAAAV,CAAM,CAAC,EACtGe,EAAU,MAAMjB,EAAU,mBAAmB,CAAE,UAAWgB,EAAa,CAAE,MAAOH,CAAU,CAAC,EAAG,MAAAX,CAAM,CAAC,EAC3G,MAAMF,EAAU,IAAI,CAAE,OAAQ,OAAO,OAAO,CAAE,GAAGe,EAAW,GAAGE,CAAQ,CAAC,EAAG,MAAOT,CAAY,CAAC,EAC/F,MAAMR,EAAU,iBAAiB,CAAE,MAAOY,EAAU,MAAOJ,CAAY,CAAC,EACxE,MAAMR,EAAU,iBAAiB,CAAE,MAAOa,EAAW,MAAOL,CAAY,CAAC,EAEzET,EAAO,4CAA4C,EACnD,MAAMmB,EAAY,CAAE,aAAc,CAACL,CAAS,EAAG,UAAW,iBAAkB,UAAAb,EAAW,MAAAE,CAAM,CAAC,EAC9FH,EAAO,gDAA2C,EAElD,IAAMoB,EAAiBZ,EAAW,QAClC,MAAMa,GAAsB,CAAE,QAASD,EAAgB,UAAAnB,EAAW,UAAWE,EAAO,QAASM,CAAY,CAAC,EAE1G,IAAMa,EAAM,MAAMP,EAAa,CAC3B,SAAUD,EAAW,SAAU,CAAE,iBAAkB,CAAE,OAAQ,aAAc,CAAE,EAAG,UAAAb,EAAW,MAAAE,CAC/F,CAAC,EACDP,GAAM,eAAiB0B,EACvBtB,EAAO,yDAAoDiB,EAAa,CAAE,MAAOK,CAAI,CAAC,CAAC,EAAE,EAEzF,IAAMC,EAAM,MAAMR,EAAa,CAC3B,SAAUD,EAAW,SAAU,CAAE,iBAAkB,CAAE,OAAQ,WAAY,CAAE,EAAG,UAAAb,EAAW,MAAOQ,CACpG,CAAC,EACDb,GAAM,cAAgB2B,EACtBvB,EAAO,yDAAoDiB,EAAa,CAAE,MAAOM,CAAI,CAAC,CAAC,EAAE,EAEzFvB,EAAO,wDAAwD,EAC/D,MAAMwB,GAAqB,CACvB,aAAc,CAACD,CAAG,EAAG,UAAW,4BAChC,UAAAtB,EAAW,MAAOQ,EAAa,aAAcN,EAC7C,QAASiB,EAAgB,aAAcvB,EAC3C,CAAC,EACDG,EAAO,2CAAsC,EAE7CA,EAAO,kDAA6C,EACpDD,EAAI,YAAc,6BAClB,IAAM0B,EAAU,SAAS,eAAe,eAAe,EACnDA,IAAWA,EAAQ,SAAW,GAEtC,OAASC,EAAO,CACZ1B,EAAO,6BAAwB2B,EAAgBD,CAAK,CAAC,EAAE,EACvD,QAAQ,MAAMA,CAAK,EACnB3B,EAAI,SAAW,EACnB,CACJ,CAAC,CACL,CA3FgB6B,EAAA9B,GAAA,uBA6FT,SAAS+B,IAA2B,CACvC,IAAM9B,EAAM,SAAS,eAAe,eAAe,EAC9CA,GACLA,EAAI,iBAAiB,QAAS,SAAY,CACtC,GAAI,CACAA,EAAI,SAAW,GACfC,EAAO,gEAAgE,EACvE,IAAM8B,EAAiBlC,GAAM,eAC7B,GAAI,CAACY,EAAW,SAAW,CAACsB,EAAgB,CACxC9B,EAAO,gEAA2D,EAClED,EAAI,SAAW,GACf,MACJ,CACA,IAAME,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,mBAAmB,EACjD,MAAMgB,EAAY,CAAE,aAAc,CAACW,CAAc,EAAG,UAAW,4BAA6B,UAAA7B,EAAW,MAAAE,CAAM,CAAC,EAC9GH,EAAO,4DAAuD,EAC9DD,EAAI,YAAc,uBAClB,IAAMgC,EAAW,SAAS,eAAe,gBAAgB,EACrDA,IAAYA,EAAS,SAAW,GACxC,OAASL,EAAO,CACZ1B,EAAO,4BAAuB2B,EAAgBD,CAAK,CAAC,EAAE,EACtD,QAAQ,MAAMA,CAAK,EACnB3B,EAAI,SAAW,EACnB,CACJ,CAAC,CACL,CA3BgB6B,EAAAC,GAAA,sBA6BT,SAASG,IAA4B,CACxC,IAAMjC,EAAM,SAAS,eAAe,gBAAgB,EAC/CA,GACLA,EAAI,iBAAiB,QAAS,SAAY,CACtC,GAAI,CACAA,EAAI,SAAW,GACfC,EAAO,mFAAmF,EAC1F,IAAMa,EAAWjB,GAAM,SACjBkC,EAAiBlC,GAAM,eACvBqC,EAAgBrC,GAAM,cAC5B,GAAI,CAACY,EAAW,SAAW,CAACK,GAAY,CAACiB,GAAkB,CAACG,EAAe,CACvEjC,EAAO,2DAAsD,EAC7DD,EAAI,SAAW,GACf,MACJ,CACA,IAAMmC,EAAajB,EAAa,CAAE,MAAOT,EAAW,OAAQ,CAAC,EACvD2B,EAAUC,GAAW,CAAE,MAAOvB,EAAU,cAAe,cAAe,CAAC,GAAKI,EAAa,CAAE,MAAOJ,CAAS,CAAC,EAC5GZ,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,mBAAmB,EAKjD,IAAMkC,GAHW,MAAOpC,EAAU,kBAAkB,CAAC,CAAC,EAAmB,KAAMqC,GAC3E,IAAIC,GAAoB,EAAE,gBAAgB,CAAE,MAAOD,EAAI,UAAArC,EAAW,aAAc,CAACY,CAAQ,CAAE,CAAC,CAChG,GAC+BsB,CAAO,EAEtC,GADAnC,EAAO,mCAAmCqC,CAAa,EAAE,EACrD,CAACA,EAAiB,MAAM,IAAI,MAAM,mDAAmD,EAEzF,IAAMG,EAAS,MAAMvC,EAAU,IAAI,CAAE,KAAMoC,EAAe,MAAAlC,CAAM,CAAC,EACjE,GAAI,CAACqC,EAAO,SAAW,CAACA,EAAO,QAAQ,OAAU,MAAM,IAAI,MAAM,8CAA8C,EAC/G,IAAMC,EAAYD,EAAO,OAAO,CAAC,EACjC,GAAI,CAACC,EAAU,MAAM,QAAU,CAACA,EAAU,MAAM,OAC5C,MAAM,IAAI,MAAM,4CAA4CA,EAAU,MAAM,MAAM,aAAaA,EAAU,MAAM,MAAM,EAAE,EAE3HzC,EAAO,iEAA4D,EAEnE,IAAM0C,EAAeD,EAAU,SAASE,EAAqB,EAC7D,GAAI,CAACD,IAAe,CAAC,EAAK,MAAM,IAAI,MAAM,4CAA4C,EACtF,IAAME,EAAW,MAAM3C,EAAU,IAAI,CAAE,KAAMyC,EAAa,CAAC,EAAG,MAAAvC,CAAM,CAAC,EACrE,GAAI,CAACyC,EAAS,SAAW,CAACA,EAAS,QAAQ,OAAU,MAAM,IAAI,MAAM,qCAAqC,EAC1G,IAAMC,EAAYD,EAAS,OAAO,CAAC,EACnC,GAAI,CAACC,EAAU,SAASC,EAAqB,GAAK,CAACD,EAAU,SAASE,EAAuB,EACzF,MAAM,IAAI,MAAM,0DAA0D,EAE9E/C,EAAO,8EAAyE,EAGhF,IAAMgD,EAAiB,MADL,IAAI3C,EAAkB,EACD,cAAc6B,EAAYG,EAAe,EAAI,EACpF,GAAI,CAACW,EAAe,SAAW,CAACA,EAAe,MAC3C,MAAM,IAAI,MAAM,6CAA6CA,EAAe,OAAO,EAAE,EAEzF,IAAMC,EAAYD,EAAe,MAAMX,CAAa,EACpD,GAAI,CAACY,EAAa,MAAM,IAAI,MAAM,6CAA6C,EAC/E,GAAIA,EAAU,MAAM,SAAW,eAAiBA,EAAU,MAAM,SAAW,YACvE,MAAM,IAAI,MAAM,mDAAmD,EAEvEjD,EAAO,0DAAqD,EAC5DA,EAAO,yFAAoF,EAC3FD,EAAI,YAAc,2BAEtB,OAAS2B,EAAO,CACZ1B,EAAO,6BAAwB2B,EAAgBD,CAAK,CAAC,EAAE,EACvD,QAAQ,MAAMA,CAAK,EACnB3B,EAAI,SAAW,EACnB,CACJ,CAAC,CACL,CAlEgB6B,EAAAI,GAAA,uBC5HhB,IAAMkB,GAAsB,CAAC,EAEtB,SAASC,IAA4B,CACxC,IAAMC,EAAM,SAAS,eAAe,gBAAgB,EAC/CA,GACLA,EAAI,iBAAiB,QAAS,SAAY,CACtC,GAAI,CACAA,EAAI,SAAW,GACfC,EAAO,6GAA6G,EAEpH,IAAMC,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,mBAAmB,EAEjD,IAAMC,EAAY,IAAIC,EAGtB,MAAMC,GAAiC,CACnC,aAAc,+BACd,SAAU,kCACV,WAAY,oCACZ,UAAAL,EAAW,MAAAE,EAAO,UAAAC,EAClB,UAAW,MACf,CAAC,EACD,IAAMG,EAAUC,EAAW,QAC3BX,GAAM,eAAiBU,EACvB,IAAME,EAAaC,EAAa,CAAE,MAAOH,CAAQ,CAAC,EAGlDP,EAAO,gDAAgD,EACvD,IAAMW,EAAc,MAAMV,EAAU,oBAAoB,CACpD,KAAM,CACF,YAAa,GACb,UAAW,oBACX,YAAaA,EAAU,WAC3B,CACJ,CAAC,EACD,MAAMU,EAAY,YAGlB,MAAMC,GAAsB,CAAE,QAAAL,EAAS,UAAAN,EAAW,UAAWE,EAAO,QAASQ,CAAY,CAAC,EAG1F,IAAME,EAAU,MAAMC,EAAQ,SAAS,CACnC,YAAaC,EACb,GAAI,8BACJ,KAAM,CAAE,KAAM,OAAQ,MAAO,aAAc,OAAQ,KAAK,OAAO,CAAE,EACjE,IAAK,GACL,SAAU,GACV,IAAK,CAAE,KAAM,GAAM,UAAW,EAAK,CACvC,CAAC,EACKC,EAAWH,EAAQ,SACzB,MAAMZ,EAAU,uBAAuB,CAAE,aAAcY,EAAS,MAAAV,CAAM,CAAC,EACvE,MAAMF,EAAU,iBAAiB,CAAE,MAAOe,EAAU,MAAAb,CAAM,CAAC,EAC3DN,GAAM,SAAWmB,EAEjB,IAAMC,EAAY,MAAMC,EAAa,CACjC,SAAUF,EACV,SAAU,CAAE,iBAAkB,CAAE,KAAM,UAAW,MAAO,UAAW,CAAE,EACrE,UAAAf,EACA,MAAAE,CACJ,CAAC,EAGKgB,EAAY,MAAMlB,EAAU,mBAAmB,CAAE,UAAWS,EAAa,CAAE,MAAOM,CAAS,CAAC,EAAG,MAAAb,CAAM,CAAC,EACtGiB,EAAU,MAAMnB,EAAU,mBAAmB,CAAE,UAAWS,EAAa,CAAE,MAAOO,CAAU,CAAC,EAAG,MAAAd,CAAM,CAAC,EACrGkB,EAAiB,CAAE,GAAGF,EAAW,GAAGC,CAAQ,EAClD,MAAMnB,EAAU,IAAI,CAAE,OAAQ,OAAO,OAAOoB,CAAc,EAAG,MAAOV,CAAY,CAAC,EACjF,MAAMV,EAAU,iBAAiB,CAAE,MAAOe,EAAU,MAAOL,CAAY,CAAC,EACxE,MAAMV,EAAU,iBAAiB,CAAE,MAAOgB,EAAW,MAAON,CAAY,CAAC,EAGzEX,EAAO,4CAA4C,EACnD,MAAMsB,EAAY,CACd,aAAc,CAACL,CAAS,EACxB,UAAW,iBACX,UAAAhB,EACA,MAAAE,CACJ,CAAC,EACDH,EAAO,gDAA2C,EAGlD,MAAMY,GAAsB,CAAE,QAASJ,EAAW,QAAU,UAAAP,EAAW,UAAWE,EAAO,QAASQ,CAAY,CAAC,EAI/G,IAAMY,EAAU,MAAMT,EAAQ,SAAS,CACnC,YAAaC,EACb,GAAI,kCACJ,KAAM,CAAE,OAAQ,gCAAiC,EACjD,IAAK,GACL,SAAU,GACV,IAAK,CAAE,KAAM,GAAM,UAAW,EAAK,CACvC,CAAC,EACKS,EAAUD,EAAQ,SACxB,MAAMtB,EAAU,uBAAuB,CAAE,aAAcsB,EAAS,MAAApB,CAAM,CAAC,EACvE,MAAMF,EAAU,iBAAiB,CAAE,MAAOuB,EAAS,MAAArB,CAAM,CAAC,EAC1DN,GAAM,aAAe2B,EACrBxB,EAAO,wEAAmEU,EAAa,CAAE,MAAOc,CAAQ,CAAC,CAAC,EAAE,EAE5G,IAAMC,EAA2B,MAAMP,EAAa,CAChD,SAAUD,EACV,SAAU,CAAE,iBAAkB,CAAE,OAAQ,aAAc,CAAE,EACxD,UAAAhB,EACA,MAAAE,CACJ,CAAC,EAEKuB,EAA2B,MAAMC,GAAiB,CACpD,SAAUF,EACV,UAAAxB,EACA,MAAAE,EACA,WAAY,CACR,CAAE,UAAW,YAAa,OAAQ,CAACqB,CAAO,CAAE,CAChD,CACJ,CAAC,EACD3B,GAAM,eAAiB6B,EACvB1B,EAAO,yDAAoDU,EAAa,CAAE,MAAOgB,CAAyB,CAAC,CAAC,EAAE,EAG9G,IAAME,EAAM,MAAMV,EAAa,CAC3B,SAAUD,EACV,SAAU,CAAE,iBAAkB,CAAE,OAAQ,WAAY,CAAE,EACtD,UAAAhB,EACA,MAAOU,CACX,CAAC,EACDX,EAAO,yDAAoDU,EAAa,CAAE,MAAOkB,CAAI,CAAC,CAAC,EAAE,EAGzF5B,EAAO,wDAAwD,EAC/D,MAAM6B,GAAqB,CACvB,aAAc,CAACD,CAAG,EAClB,UAAW,4BACX,UAAA3B,EACA,MAAOU,EACP,aAAcR,EACd,QAASK,EAAW,QACpB,aAAc,8BAClB,CAAC,EACDX,GAAM,eAAiBW,EAAW,QAClCR,EAAO,yEAAoE,EAE3EA,EAAO,kDAA6C,EACpDD,EAAI,YAAc,6BAElB,IAAM+B,EAAU,SAAS,eAAe,eAAe,EACnDA,IAAWA,EAAQ,SAAW,GAEtC,OAASC,EAAO,CACZ/B,EAAO,6BAAwBgC,EAAgBD,CAAK,CAAC,EAAE,EACvD,QAAQ,MAAMA,CAAK,EACnBhC,EAAI,SAAW,EACnB,CACJ,CAAC,CACL,CAvJgBkC,EAAAnC,GAAA,uBAyJT,SAASoC,IAA2B,CACvC,IAAMnC,EAAM,SAAS,eAAe,eAAe,EAC9CA,GACLA,EAAI,iBAAiB,QAAS,SAAY,CACtC,GAAI,CACAA,EAAI,SAAW,GACfC,EAAO,6FAA6F,EAEpG,IAAMO,EAAUV,GAAM,eAChBsC,EAAiBtC,GAAM,eAC7B,GAAI,CAACU,GAAW,CAAC4B,EAAgB,CAC7BnC,EAAO,gEAA2D,EAClED,EAAI,SAAW,GACf,MACJ,CAEA,IAAME,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,mBAAmB,EAEjD,MAAMmB,EAAY,CACd,aAAc,CAACa,CAAc,EAC7B,UAAW,qBACX,UAAAlC,EACA,MAAAE,CACJ,CAAC,EACDN,GAAM,eAAiBW,EAAW,QAElCR,EAAO,4DAAuD,EAC9DD,EAAI,YAAc,uBAElB,IAAMqC,EAAW,SAAS,eAAe,gBAAgB,EACrDA,IAAYA,EAAS,SAAW,GAExC,OAASL,EAAO,CACZ/B,EAAO,4BAAuBgC,EAAgBD,CAAK,CAAC,EAAE,EACtD,QAAQ,MAAMA,CAAK,EACnBhC,EAAI,SAAW,EACnB,CACJ,CAAC,CACL,CAxCgBkC,EAAAC,GAAA,sBA0CT,SAASG,IAA4B,CACxC,IAAMtC,EAAM,SAAS,eAAe,gBAAgB,EAC/CA,GACLA,EAAI,iBAAiB,QAAS,SAAY,CACtC,GAAI,CACAA,EAAI,SAAW,GACfC,EAAO,mFAAmF,EAE1F,IAAMO,EAAUV,GAAM,eAChBmB,EAAWnB,GAAM,SACjBsC,EAAiBtC,GAAM,eACvByC,EAAezC,GAAM,aAC3B,GAAI,CAACU,GAAW,CAACS,GAAY,CAACmB,GAAkB,CAACG,EAAc,CAC3DtC,EAAO,2DAAsD,EAC7DD,EAAI,SAAW,GACf,MACJ,CAEA,IAAMU,EAAaC,EAAa,CAAE,MAAOH,CAAQ,CAAC,EAC5CgC,EAAUC,GAAW,CAAE,MAAOxB,EAAU,cAAe,cAAe,CAAC,GAAKN,EAAa,CAAE,MAAOM,CAAS,CAAC,EAC5GyB,EAAW/B,EAAa,CAAE,MAAO4B,CAAa,CAAC,EAE/CrC,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,mBAAmB,EAUjD,IAAMuC,GAPW,MAAMzC,EAAU,kBAAkB,CAAC,CAAC,EAAE,KAAME,GAClD,IAAIwC,GAAoB,EAAE,gBAAgB,CAC7C,MAAAxC,EACA,UAAAF,EACA,aAAc,CAACe,CAAQ,CAC3B,CAAC,CACJ,GAC8BuB,CAAO,EAGtC,GAFAvC,EAAO,mCAAmC0C,CAAa,EAAE,EAErD,CAACA,EACD,MAAM,IAAI,MAAM,mDAAmD,EAGvE,IAAME,EAAS,MAAM3C,EAAU,IAAI,CAAE,KAAMyC,EAAe,MAAAvC,CAAM,CAAC,EACjE,GAAI,CAACyC,EAAO,SAAW,CAACA,EAAO,QAAUA,EAAO,OAAO,SAAW,EAC9D,MAAM,IAAI,MAAM,8CAA8C,EAElE,IAAMC,EAAYD,EAAO,OAAO,CAAC,EAEjC,GAAI,CAACC,EAAU,MAAQ,CAACA,EAAU,KAAK,QAAU,CAACA,EAAU,KAAK,OAC7D,MAAM,IAAI,MAAM,6DAA6DA,EAAU,MAAM,MAAM,aAAaA,EAAU,MAAM,MAAM,EAAE,EAE5I7C,EAAO,iEAA4D,EAGnE,IAAM8C,EAAeD,EAAU,SAASE,EAAqB,EAC7D,GAAI,CAACD,IAAe,CAAC,EACjB,MAAM,IAAI,MAAM,4CAA4C,EAEhE,IAAME,EAAW,MAAM/C,EAAU,IAAI,CAAE,KAAM6C,EAAa,CAAC,EAAG,MAAA3C,CAAM,CAAC,EACrE,GAAI,CAAC6C,EAAS,SAAW,CAACA,EAAS,QAAUA,EAAS,OAAO,SAAW,EACpE,MAAM,IAAI,MAAM,qCAAqC,EAEzD,IAAMC,EAAYD,EAAS,OAAO,CAAC,EAC7BE,EAAUD,EAAU,SAASE,EAAqB,EAClDC,EAAYH,EAAU,SAASI,EAAuB,EAE5D,GAAI,CAACH,GAAW,CAACE,EACb,MAAM,IAAI,MAAM,0DAA0D,EAE9EpD,EAAO,8EAAyE,EAGhF,IAAMI,EAAY,IAAIC,EACtBL,EAAO,+CAA+C,EACtD,IAAMsD,EAAiB,MAAMlD,EAAU,cAAcK,EAAYiC,EAAe,EAAI,EACpF,GAAI,CAACY,EAAe,SAAW,CAACA,EAAe,MAC3C,MAAM,IAAI,MAAM,6CAA6CA,EAAe,OAAO,EAAE,EAGzF,IAAMC,EAAYD,EAAe,MAAMZ,CAAa,EACpD,GAAI,CAACa,EACD,MAAM,IAAI,MAAM,6CAA6C,EAGjE,GAAIA,EAAU,MAAM,SAAW,eAAiBA,EAAU,MAAM,SAAW,YACvE,MAAM,IAAI,MAAM,mDAAmD,EAEvEvD,EAAO,0DAAqD,EAG5DA,EAAO,yEAAyE,EAChF,IAAMwD,EAAe,MAAMpD,EAAU,cAAcK,EAAYgC,EAAU,EAAI,EAC7E,GAAI,CAACe,EAAa,SAAW,CAACA,EAAa,OAAS,CAACA,EAAa,MAAMf,CAAQ,EAC5E,MAAM,IAAI,MAAM,0BAA0BA,CAAQ,+BAA+B,EAErFzC,EAAO,+EAA0E,EAEjFA,EAAO,0GAAqG,EAC5GD,EAAI,YAAc,2BAEtB,OAASgC,EAAO,CACZ/B,EAAO,6BAAwBgC,EAAgBD,CAAK,CAAC,EAAE,EACvD,QAAQ,MAAMA,CAAK,EACnBhC,EAAI,SAAW,EACnB,CACJ,CAAC,CACL,CAzGgBkC,EAAAI,GAAA,uBCtMhB,IAAMoB,GAAsB,CAAC,EAEvBC,GAAe;AAAA;AAAA,4BACfC,GAAgB;AAAA,wBAChBC,GAAe;AAAA,EAEd,SAASC,IAA4B,CACxC,IAAMC,EAAM,SAAS,eAAe,gBAAgB,EAC/CA,GACLA,EAAI,iBAAiB,QAAS,SAAY,CACtC,GAAI,CACAA,EAAI,SAAW,GACfC,EAAO,6FAA6F,EAEpG,IAAMC,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,mBAAmB,EAEjD,IAAMC,EAAY,IAAIC,EAGtB,MAAMC,GAAiC,CACnC,aAAc,+BACd,SAAU,kCACV,WAAY,oCACZ,UAAAL,EAAW,MAAAE,EAAO,UAAAC,EAClB,UAAW,MACf,CAAC,EACD,IAAMG,EAAUC,EAAW,QAC3Bd,GAAM,eAAiBa,EACvB,IAAME,EAAaC,EAAa,CAAE,MAAOH,CAAQ,CAAC,EAGlDP,EAAO,gDAAgD,EACvD,IAAMW,EAAc,MAAMV,EAAU,oBAAoB,CACpD,KAAM,CACF,YAAa,GACb,UAAW,oBACX,YAAaA,EAAU,WAC3B,CACJ,CAAC,EACD,MAAMU,EAAY,YAGlB,MAAMC,GAAsB,CAAE,QAAAL,EAAS,UAAAN,EAAW,UAAWE,EAAO,QAASQ,CAAY,CAAC,EAG1F,IAAME,EAAU,MAAMC,EAAQ,SAAS,CACnC,YAAaC,EACb,GAAI,mCACJ,KAAM,CAAE,KAAMpB,GAAc,MAAO,WAAY,OAAQ,KAAK,OAAO,CAAE,EACrE,IAAK,GACL,SAAU,GACV,IAAK,CAAE,KAAM,GAAM,UAAW,EAAK,CACvC,CAAC,EACKqB,EAAWH,EAAQ,SACzB,MAAMZ,EAAU,uBAAuB,CAAE,aAAcY,EAAS,MAAAV,CAAM,CAAC,EACvE,MAAMF,EAAU,iBAAiB,CAAE,MAAOe,EAAU,MAAAb,CAAM,CAAC,EAC3DT,GAAM,SAAWsB,EAGjB,IAAMC,EAAY,MAAMhB,EAAU,mBAAmB,CAAE,UAAWS,EAAa,CAAE,MAAOM,CAAS,CAAC,EAAG,MAAAb,CAAM,CAAC,EAC5G,MAAMF,EAAU,IAAI,CAAE,OAAQ,OAAO,OAAOgB,CAAS,EAAG,MAAON,CAAY,CAAC,EAC5E,MAAMV,EAAU,iBAAiB,CAAE,MAAOe,EAAU,MAAOL,CAAY,CAAC,EAGxEX,EAAO,2CAA2C,EAClD,MAAMkB,EAAY,CACd,aAAc,CAACF,CAAQ,EACvB,UAAW,gBACX,UAAAf,EACA,MAAAE,CACJ,CAAC,EACDH,EAAO,gDAA2C,EAGlD,MAAMY,GAAsB,CAAE,QAASJ,EAAW,QAAU,UAAAP,EAAW,UAAWE,EAAO,QAASQ,CAAY,CAAC,EAI/G,IAAMQ,EAAkB,MAAMC,EAAa,CACvC,SAAUJ,EACV,SAAU,CACN,OAAQA,EAAS,GAAK,YACtB,iBAAkB,CAAE,KAAMrB,GAAeC,EAAc,CAC3D,EACA,UAAAK,EACA,MAAAE,CACJ,CAAC,EACDT,GAAM,oBAAsByB,EAC5BnB,EAAO,oDAA+CU,EAAa,CAAE,MAAOS,CAAgB,CAAC,CAAC,EAAE,EAGhG,IAAME,EAAkB,MAAMD,EAAa,CACvC,SAAUJ,EACV,SAAU,CACN,OAAQA,EAAS,GAAK,aACtB,iBAAkB,CAAE,KAAMnB,GAAeF,EAAa,CAC1D,EACA,UAAAM,EACA,MAAOU,CACX,CAAC,EACDX,EAAO,qDAAgDU,EAAa,CAAE,MAAOW,CAAgB,CAAC,CAAC,EAAE,EAGjGrB,EAAO,wDAAwD,EAC/D,MAAMsB,GAAqB,CACvB,aAAc,CAACD,CAAe,EAC9B,UAAW,6BACX,UAAApB,EACA,MAAOU,EACP,aAAcR,EACd,QAASK,EAAW,QACpB,aAAc,8BAClB,CAAC,EACDd,GAAM,eAAiBc,EAAW,QAClCR,EAAO,wFAAmF,EAE1FA,EAAO,kDAA6C,EACpDD,EAAI,YAAc,6BAElB,IAAMwB,EAAU,SAAS,eAAe,eAAe,EACnDA,IAAWA,EAAQ,SAAW,GAEtC,OAASC,EAAO,CACZxB,EAAO,6BAAwByB,EAAgBD,CAAK,CAAC,EAAE,EACvD,QAAQ,MAAMA,CAAK,EACnBzB,EAAI,SAAW,EACnB,CACJ,CAAC,CACL,CA5HgB2B,EAAA5B,GAAA,uBA8HT,SAAS6B,IAA2B,CACvC,IAAM5B,EAAM,SAAS,eAAe,eAAe,EAC9CA,GACLA,EAAI,iBAAiB,QAAS,SAAY,CACtC,GAAI,CACAA,EAAI,SAAW,GACfC,EAAO,6EAA6E,EAEpF,IAAMO,EAAUb,GAAM,eAChBkC,EAAsBlC,GAAM,oBAClC,GAAI,CAACa,GAAW,CAACqB,EAAqB,CAClC5B,EAAO,gEAA2D,EAClED,EAAI,SAAW,GACf,MACJ,CAEA,IAAME,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,mBAAmB,EAEjD,MAAMe,EAAY,CACd,aAAc,CAACU,CAAmB,EAClC,UAAW,gCACX,UAAA3B,EACA,MAAAE,CACJ,CAAC,EACDT,GAAM,eAAiBc,EAAW,QAElCR,EAAO,4DAAuD,EAC9DD,EAAI,YAAc,uBAElB,IAAM8B,EAAW,SAAS,eAAe,gBAAgB,EACrDA,IAAYA,EAAS,SAAW,GAExC,OAASL,EAAO,CACZxB,EAAO,4BAAuByB,EAAgBD,CAAK,CAAC,EAAE,EACtD,QAAQ,MAAMA,CAAK,EACnBzB,EAAI,SAAW,EACnB,CACJ,CAAC,CACL,CAxCgB2B,EAAAC,GAAA,sBA0CT,SAASG,IAA4B,CACxC,IAAM/B,EAAM,SAAS,eAAe,gBAAgB,EAC/CA,GACLA,EAAI,iBAAiB,QAAS,SAAY,CACtC,GAAI,CACAA,EAAI,SAAW,GACfC,EAAO,+DAA+D,EAEtE,IAAMO,EAAUb,GAAM,eAChBsB,EAAWtB,GAAM,SACjBkC,EAAsBlC,GAAM,oBAClC,GAAI,CAACa,GAAW,CAACS,GAAY,CAACY,EAAqB,CAC/C5B,EAAO,2DAAsD,EAC7DD,EAAI,SAAW,GACf,MACJ,CAEA,IAAMU,EAAaC,EAAa,CAAE,MAAOH,CAAQ,CAAC,EAC5CwB,EAAUC,GAAW,CAAE,MAAOhB,EAAU,cAAe,cAAe,CAAC,GAAKN,EAAa,CAAE,MAAOM,CAAS,CAAC,EAE5Gf,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,mBAAmB,EAUjD,IAAM8B,GAPW,MAAMhC,EAAU,kBAAkB,CAAC,CAAC,EAAE,KAAME,GAClD,IAAI+B,GAAoB,EAAE,gBAAgB,CAC7C,MAAA/B,EACA,UAAAF,EACA,aAAc,CAACe,CAAQ,CAC3B,CAAC,CACJ,GAC8Be,CAAO,EAGtC,GAFA/B,EAAO,mCAAmCiC,CAAa,EAAE,EAErD,CAACA,EACD,MAAM,IAAI,MAAM,mDAAmD,EAGvE,IAAME,EAAS,MAAMlC,EAAU,IAAI,CAAE,KAAMgC,EAAe,MAAA9B,CAAM,CAAC,EACjE,GAAI,CAACgC,EAAO,SAAW,CAACA,EAAO,QAAUA,EAAO,OAAO,SAAW,EAC9D,MAAM,IAAI,MAAM,8CAA8C,EAElE,IAAMC,EAAYD,EAAO,OAAO,CAAC,EAE3BE,EAAexC,GAAeF,GAAeC,GACnD,GAAIwC,EAAU,MAAM,OAASC,EACzB,MAAM,IAAI,MAAM;AAAA,EAA+CA,CAAY;AAAA;AAAA,EAAcD,EAAU,MAAM,IAAI,EAAE,EAEnHpC,EAAO,6FAAwF,EAG/F,IAAMsC,EAAeF,EAAU,SAASG,EAAqB,EAC7D,GAAI,CAACD,IAAe,CAAC,EACjB,MAAM,IAAI,MAAM,4CAA4C,EAEhE,IAAME,EAAW,MAAMvC,EAAU,IAAI,CAAE,KAAMqC,EAAa,CAAC,EAAG,MAAAnC,CAAM,CAAC,EACrE,GAAI,CAACqC,EAAS,SAAW,CAACA,EAAS,QAAUA,EAAS,OAAO,SAAW,EACpE,MAAM,IAAI,MAAM,qCAAqC,EAEzD,IAAMC,EAAYD,EAAS,OAAO,CAAC,EAC7BE,EAAUD,EAAU,SAASE,EAAqB,EAClDC,EAAYH,EAAU,SAASI,EAAuB,EAE5D,GAAI,CAACH,GAAW,CAACE,EACb,MAAM,IAAI,MAAM,0DAA0D,EAE9E5C,EAAO,8EAAyE,EAGhF,IAAMI,EAAY,IAAIC,EACtBL,EAAO,+CAA+C,EACtD,IAAM8C,EAAiB,MAAM1C,EAAU,cAAcK,EAAYwB,EAAe,EAAI,EACpF,GAAI,CAACa,EAAe,SAAW,CAACA,EAAe,MAC3C,MAAM,IAAI,MAAM,6CAA6CA,EAAe,OAAO,EAAE,EAGzF,IAAMC,EAAYD,EAAe,MAAMb,CAAa,EACpD,GAAI,CAACc,EACD,MAAM,IAAI,MAAM,0CAA0C,EAG9D,GAAIA,EAAU,MAAM,OAASV,EACzB,MAAM,IAAI,MAAM;AAAA,EAAwCA,CAAY;AAAA;AAAA,EAAcU,EAAU,MAAM,IAAI,EAAE,EAE5G/C,EAAO,yEAAoE,EAE3EA,EAAO,2GAAsG,EAC7GD,EAAI,YAAc,2BAEtB,OAASyB,EAAO,CACZxB,EAAO,6BAAwByB,EAAgBD,CAAK,CAAC,EAAE,EACvD,QAAQ,MAAMA,CAAK,EACnBzB,EAAI,SAAW,EACnB,CACJ,CAAC,CACL,CAhGgB2B,EAAAI,GAAA,uBCnKhB,IAAMkB,EAAuB,CAAC,EAExBC,GAAkB,YAIjB,SAASC,IAA6B,CACzC,IAAMC,EAAM,SAAS,eAAe,iBAAiB,EAChDA,GACLA,EAAI,iBAAiB,QAAS,SAAY,CACtC,GAAI,CACAA,EAAI,SAAW,GACfC,EAAO,kFAAkF,EAEzF,IAAMC,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,mBAAmB,EAEjD,IAAMC,EAAY,IAAIC,EAGtB,MAAMC,GAAiC,CACnC,aAAc,gCACd,SAAU,mCACV,WAAY,qCACZ,UAAAL,EAAW,MAAAE,EAAO,UAAAC,EAClB,UAAW,OACf,CAAC,EACD,IAAMG,EAAUC,EAAW,QAC3BZ,EAAM,gBAAkBW,EACxBX,EAAM,eAAiBW,EACvB,IAAME,EAAaC,EAAa,CAAE,MAAOH,CAAQ,CAAC,EAGlDP,EAAO,iDAAiD,EACxD,IAAMW,EAAc,MAAMV,EAAU,oBAAoB,CACpD,KAAM,CACF,YAAa,GACb,UAAW,qBACX,YAAaA,EAAU,WAC3B,CACJ,CAAC,EACD,MAAMU,EAAY,YAClBf,EAAM,YAAce,EAGpB,MAAMC,GAAsB,CAAE,QAAAL,EAAS,UAAAN,EAAW,UAAWE,EAAO,QAASQ,CAAY,CAAC,EAG1FX,EAAO,mDAAmD,EAC1D,IAAMa,EAAU,MAAMC,EAAQ,SAAS,CACnC,YAAaC,EACb,GAAI,4BACJ,KAAM,CAAE,YAAa,sBAAuB,MAAO,YAAa,OAAQ,KAAK,OAAO,CAAE,EACtF,IAAK,GACL,SAAU,GACV,IAAK,CAAE,KAAM,GAAM,UAAW,EAAK,CACvC,CAAC,EACKC,EAAWH,EAAQ,SACzBjB,EAAM,SAAWoB,EACjB,MAAMf,EAAU,uBAAuB,CAAE,aAAcY,EAAS,MAAAV,CAAM,CAAC,EACvE,MAAMF,EAAU,iBAAiB,CAAE,MAAOe,EAAU,MAAAb,CAAM,CAAC,EAC3D,IAAMc,EAAgBC,GAAW,CAAE,MAAOF,EAAU,cAAe,cAAe,CAAC,EACnFpB,EAAM,cAAgBqB,EAGtB,MAAMhB,EAAU,uBAAuB,CAAE,aAAcY,EAAS,MAAOF,CAAY,CAAC,EACpF,MAAMV,EAAU,iBAAiB,CAAE,MAAOe,EAAU,MAAOL,CAAY,CAAC,EAGxEX,EAAO,4CAA4C,EACnD,MAAMmB,EAAY,CACd,aAAc,CAACH,CAAQ,EACvB,UAAW,gBACX,UAAAf,EACA,MAAAE,CACJ,CAAC,EACDP,EAAM,eAAiBY,EAAW,QAClCR,EAAO,gDAA2C,EAGlD,MAAMY,GAAsB,CAAE,QAASJ,EAAW,QAAU,UAAAP,EAAW,UAAWE,EAAO,QAASQ,CAAY,CAAC,EAI/G,IAAMS,EAAU,MAAMN,EAAQ,SAAS,CACnC,YAAaC,EACb,GAAI,2BACJ,KAAM,CAAE,OAAQ,iCAAkC,MAAO,WAAY,OAAQ,KAAK,OAAO,CAAE,EAC3F,IAAK,GACL,SAAU,GACV,IAAK,CAAE,KAAM,GAAM,UAAW,EAAK,CACvC,CAAC,EACKM,EAAiBD,EAAQ,SAC/B,MAAMnB,EAAU,uBAAuB,CAAE,aAAcmB,EAAS,MAAAjB,CAAM,CAAC,EACvE,MAAMF,EAAU,iBAAiB,CAAE,MAAOoB,EAAgB,MAAAlB,CAAM,CAAC,EACjEP,EAAM,kBAAoByB,EAC1B,IAAMC,EAAeJ,GAAW,CAAE,MAAOG,EAAgB,cAAe,cAAe,CAAC,EACxFzB,EAAM,aAAe0B,EAErB,IAAMC,EAA8B,MAAMC,EAAa,CACnD,SAAUR,EACV,SAAU,CACN,OAAQA,EAAS,GAAK,YACtB,iBAAkB,CAAE,OAAQ,gBAAiB,CACjD,EACA,UAAAf,EACA,MAAAE,CACJ,CAAC,EACDH,EAAO,oCAAoCuB,EAA4B,GAAG,EAAE,EAE5EE,GAAWf,EAAa,CAAE,MAAOW,CAAe,CAAC,EACjD,IAAMK,EAA+B,MAAMC,GAAiB,CACxD,SAAUJ,EACV,UAAAtB,EACA,MAAAE,EACA,WAAY,CACR,CAAE,UAAWN,GAAiB,OAAQ,CAACwB,CAAc,CAAE,CAC3D,CACJ,CAAC,EACDzB,EAAM,4BAA8B8B,EACpC1B,EAAO,qCAAqC0B,EAA6B,GAAG,EAAE,EAC9E1B,EAAO,qFAAgF,EAGvF,IAAM4B,EAAqB,MAAMJ,EAAa,CAC1C,SAAUR,EACV,SAAU,CACN,OAAQA,EAAS,GAAK,YACtB,iBAAkB,CAAE,OAAQ,gBAAiB,CACjD,EACA,UAAAf,EACA,MAAOU,CACX,CAAC,EACD,QAAQ,IAAI,aAAakB,EAAOb,CAAQ,CAAC,EAAE,EAC3C,QAAQ,IAAI,uBAAuBa,EAAOD,CAAkB,CAAC,EAAE,EAC/D5B,EAAO,2BAA2B4B,EAAmB,GAAG,EAAE,EAG1D5B,EAAO,uDAAuD,EAC9D,MAAM8B,GAAqB,CACvB,aAAc,CAACF,CAAkB,EACjC,UAAW,2BACX,UAAA3B,EACA,MAAOU,EACP,aAAcR,EACd,QAASK,EAAW,QACpB,aAAc,+BAClB,CAAC,EACDZ,EAAM,eAAiBY,EAAW,QAElCR,EAAO,iGAA4F,EACnGD,EAAI,YAAc,8BAElB,IAAMgC,EAAU,SAAS,eAAe,gBAAgB,EACpDA,IAAWA,EAAQ,SAAW,GAEtC,OAASC,EAAO,CACZhC,EAAO,8BAAyBiC,EAAgBD,CAAK,CAAC,EAAE,EACxD,QAAQ,MAAMA,CAAK,EACnBjC,EAAI,SAAW,EACnB,CACJ,CAAC,CACL,CA7JgBmC,EAAApC,GAAA,wBAgKhB,IAAIqC,GACAV,GAEG,SAASW,IAA4B,CACxC,IAAMrC,EAAM,SAAS,eAAe,gBAAgB,EAC/CA,GACLA,EAAI,iBAAiB,QAAS,SAAY,CACtC,GAAI,CACAA,EAAI,SAAW,GACfC,EAAO,qFAAqF,EAE5F,IAAIO,EAAUX,EAAM,eACde,EAAcf,EAAM,YACpBqB,EAAgBrB,EAAM,cACtB0B,EAAe1B,EAAM,aACrBoB,EAAWpB,EAAM,SAEjBK,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,mBAAmB,EAEjD,IAAMkC,EAAW,SAAS,WAAa,SAAW,OAAS,MACrD5B,EAAaC,EAAa,CAAE,MAAOd,EAAM,eAAiB,CAAC,EAKjEI,EAAO,qEAAqE,EAC5E,MAAMmB,EAAY,CACd,aAAc,CAACvB,EAAM,2BAA2B,EAChD,UAAW,gCACX,UAAAK,EACA,MAAAE,CACJ,CAAC,EACDP,EAAM,eAAiBY,EAAW,QAClCR,EAAO,2CAAsC,EAG7C,MAAMY,GAAsB,CAAE,QAASJ,EAAW,QAAU,UAAAP,EAAW,UAAWE,EAAO,QAASQ,CAAY,CAAC,EAM/GX,EAAO,8EAA8E,EAErF,IAAMsC,EAAc,MAAM,IAAIC,GAAoB,EAAE,gBAAgB,CAChE,aAAc,CAAC3C,EAAM,4BAA6BA,EAAM,iBAAiB,EACzE,MAAAO,EACA,UAAAF,CACJ,CAAC,EACKuC,EAA0BF,EAAYrB,CAAa,EACnDwB,EAAyBH,EAAYhB,CAAY,EAEjDoB,EAAsB,MAAMzC,EAAU,IAAI,CAAE,KAAMuC,EAA0B,MAAArC,CAAM,CAAC,EACnFwC,EAAqB,MAAM1C,EAAU,IAAI,CAAE,KAAMwC,EAAyB,MAAAtC,CAAM,CAAC,EAEjFyC,EAAqB,MAAMpB,EAAa,CAC1C,SAAUkB,EAAoB,OAAQ,CAAC,EACvC,SAAU,CACN,OAAQ1B,EAAS,GAAK,YACtB,iBAAkB,CAAE,OAAQ,gBAAiB,CACjD,EACA,UAAAf,EACA,MAAAE,CACJ,CAAC,EAEK0C,EAAoB,MAAMrB,EAAa,CACzC,SAAUmB,EAAmB,OAAQ,CAAC,EACtC,SAAU,CACN,OAAQ/C,EAAM,kBAAkB,GAAK,YACrC,iBAAkB,CAAE,WAAY,qBAAsB,CAC1D,EACA,UAAAK,EACA,MAAAE,CACJ,CAAC,EAGDH,EAAO,4DAA4D,EAGnE,IAAM8C,EAA0B,MAAM7C,EAAU,cAAc,CAAE,KAAMgB,EAAe,MAAON,CAAY,CAAC,EAInGoC,EAAuB,EAHE,MAAM9C,EAAU,IAAI,CAAE,KAAM6C,EAA0B,MAAOnC,CAAY,CAAC,GACzD,OAAQ,CAAC,CAEX,EAExCqC,EAAyB,MAAM/C,EAAU,cAAc,CAAE,KAAMqB,EAAc,MAAOX,CAAY,CAAC,EACvG,GAAIqC,EAAwB,CACxB,IAAMC,GAAwB,MAAMhD,EAAU,IAAI,CAAE,KAAM+C,EAAwB,MAAOrC,CAAY,CAAC,EACtGoC,EAAqB,KAAKE,GAAsB,OAAQ,CAAC,CAAC,CAC9D,CAGA,MAAMnB,GAAqB,CACvB,aAAciB,EACd,UAAW,qCACX,UAAA9C,EACA,MAAOU,EACP,aAAcR,EACd,QAASK,EAAW,QACpB,aAAc,+BAClB,CAAC,EACDZ,EAAM,eAAiBY,EAAW,QAKlC,IAAM0C,EAAc,MAAM,IAAIX,GAAoB,EAAE,gBAAgB,CAAE,MAAO5B,EAAa,UAAAV,EAAW,aAAc,CAACe,EAAUpB,EAAM,iBAAiB,CAAE,CAAC,EAClJuD,EAA0BD,EAAYjC,CAAa,EACnDmC,EAAyBF,EAAY5B,CAAY,EAEjD+B,EAAsB,MAAMpD,EAAU,IAAI,CAAE,KAAMkD,EAA0B,MAAOxC,CAAY,CAAC,EAChG2C,EAAqB,MAAMrD,EAAU,IAAI,CAAE,KAAMmD,EAAyB,MAAOzC,CAAY,CAAC,EAE9F4C,EAAqB,MAAM/B,EAAa,CAC1C,SAAU6B,EAAoB,OAAQ,CAAC,EACvC,SAAU,CACN,OAAQrC,EAAS,GAAK,YACtB,iBAAkB,CAAE,OAAQ,gBAAiB,CACjD,EACA,UAAAf,EACA,MAAOU,CACX,CAAC,EAEK6C,EAAoB,MAAMhC,EAAa,CACzC,SAAU8B,EAAmB,OAAQ,CAAC,EACtC,SAAU,CACN,OAAQ1D,EAAM,kBAAkB,GAAK,YACrC,iBAAkB,CAAE,WAAY,qBAAsB,CAC1D,EACA,UAAAK,EACA,MAAOU,CACX,CAAC,EAGDX,EAAO,uDAAuD,EAC9D,MAAM8B,GAAqB,CACvB,aAAc,CAACyB,EAAoBC,CAAiB,EACpD,UAAW,4BACX,UAAAvD,EACA,MAAOU,EACP,aAAcR,EACd,QAASK,EAAW,QACpB,aAAc,+BAClB,CAAC,EACDZ,EAAM,eAAiBY,EAAW,QAGlCR,EAAO,8EAA8E,EACrF,MAAMmB,EAAY,CACd,aAAc,CAACyB,EAAoBC,CAAiB,EACpD,UAAW,4BACX,UAAA5C,EACA,MAAAE,CACJ,CAAC,EACDP,EAAM,eAAiBY,EAAW,QAClCR,EAAO,2CAAsC,EAG7C,MAAMY,GAAsB,CAAE,QAASJ,EAAW,QAAU,UAAAP,EAAW,UAAWE,EAAO,QAASQ,CAAY,CAAC,EAM/GX,EAAO,qFAAqF,EAC5F,IAAMyD,EAAc,MAAM,IAAIlB,GAAoB,EAAE,gBAAgB,CAAE,MAAApC,EAAO,UAAAF,EAAW,aAAc,CAACe,EAAUpB,EAAM,iBAAiB,CAAE,CAAC,EACrI8D,EAA0BD,EAAYxC,CAAa,EACnD0C,EAAyBF,EAAYnC,CAAY,EAEjDsC,GAAsB,MAAM3D,EAAU,IAAI,CAAE,KAAMyD,EAA0B,MAAAvD,CAAM,CAAC,EACnF0D,EAAqB,MAAM5D,EAAU,IAAI,CAAE,KAAM0D,EAAyB,MAAAxD,CAAM,CAAC,EAGjF2D,GAAqB,MAAMtC,EAAa,CAC1C,SAAUoC,GAAoB,OAAQ,CAAC,EACvC,SAAU,CACN,OAAQ5C,EAAS,GAAK,eACtB,iBAAkB,CAAE,OAAQ,mBAAoB,CACpD,EACA,UAAAf,EACA,MAAAE,CACJ,CAAC,EAGK4D,GAAW,MAAMjD,EAAQ,SAAS,CACpC,YAAaC,EACb,GAAI,4BACJ,KAAM,CAAE,WAAY,0BAA2B,MAAO,YAAa,OAAQ,KAAK,OAAO,CAAE,EACzF,IAAK,GACL,SAAU,GACV,IAAK,CAAE,KAAM,GAAM,UAAW,EAAK,CACvC,CAAC,EACKiD,GAAkBD,GAAS,SACjC,MAAM9D,EAAU,uBAAuB,CAAE,aAAc8D,GAAU,MAAA5D,CAAM,CAAC,EACxE,MAAMF,EAAU,iBAAiB,CAAE,MAAO+D,GAAiB,MAAA7D,CAAM,CAAC,EAClE,IAAM8D,GAAgB/C,GAAW,CAAE,MAAO8C,GAAiB,cAAe,cAAe,CAAC,EAC1FpE,EAAM,cAAgBqE,GAGtB9B,GAAYzB,EAAa,CAAE,MAAOsD,EAAgB,CAAC,EACnD,IAAME,EAAgC,MAAMvC,GAAiB,CACzD,SAAUmC,GACV,UAAA7D,EACA,MAAAE,EACA,WAAY,CACR,CAAE,UAAWN,GAAiB,OAAQ,CAACmE,EAAe,CAAE,CAC5D,CACJ,CAAC,EAGKG,GAAqB,MAAM3C,EAAa,CAC1C,SAAU0C,EACV,SAAU,CACN,OAAQlD,EAAS,GAAK,eACtB,iBAAkB,CAAE,OAAQ,mBAAoB,CACpD,EACA,UAAAf,EACA,MAAAE,CACJ,CAAC,EAGKiE,GAAoB,MAAM5C,EAAa,CACzC,SAAUqC,EAAmB,OAAQ,CAAC,EACtC,SAAU,CACN,OAAQjE,EAAM,kBAAkB,GAAK,eACrC,iBAAkB,CAAE,WAAY,wBAAyB,CAC7D,EACA,UAAAK,EACA,MAAAE,CACJ,CAAC,EAGDH,EAAO,6DAA6D,EAGpE,IAAMqE,EAA0B,MAAMpE,EAAU,cAAc,CAAE,KAAMgB,EAAe,MAAON,CAAY,CAAC,EAInG2D,GAAuB,EAHE,MAAMrE,EAAU,IAAI,CAAE,KAAMoE,EAA0B,MAAO1D,CAAY,CAAC,GACzD,OAAQ,CAAC,CAEX,EAExC4D,GAAyB,MAAMtE,EAAU,cAAc,CAAE,KAAMqB,EAAc,MAAOX,CAAY,CAAC,EACvG,GAAI4D,GAAwB,CACxB,IAAMC,GAAwB,MAAMvE,EAAU,IAAI,CAAE,KAAMsE,GAAwB,MAAO5D,CAAY,CAAC,EACtG2D,GAAqB,KAAKE,GAAsB,OAAQ,CAAC,CAAC,CAC9D,CAEA,MAAM1C,GAAqB,CACvB,aAAcwC,GACd,UAAW,qCACX,UAAArE,EACA,MAAOU,EACP,aAAcR,EACd,QAASK,EAAW,QACpB,aAAc,+BAClB,CAAC,EACDZ,EAAM,eAAiBY,EAAW,QAGlC,IAAMiE,GAAc,MAAM,IAAIlC,GAAoB,EAAE,gBAAgB,CAAE,MAAO5B,EAAa,UAAAV,EAAW,aAAc,CAACe,EAAUpB,EAAM,iBAAiB,CAAE,CAAC,EAClJ8E,GAA0BD,GAAYxD,CAAa,EACnD0D,GAAyBF,GAAYnD,CAAY,EAEjDsD,GAAsB,MAAM3E,EAAU,IAAI,CAAE,KAAMyE,GAA0B,MAAO/D,CAAY,CAAC,EAChGkE,GAAqB,MAAM5E,EAAU,IAAI,CAAE,KAAM0E,GAAyB,MAAOhE,CAAY,CAAC,EAE9FmE,GAAqB,MAAMtD,EAAa,CAC1C,SAAUoD,GAAoB,OAAQ,CAAC,EACvC,SAAU,CACN,OAAQ5D,EAAS,GAAK,eACtB,iBAAkB,CAAE,OAAQ,mBAAoB,CACpD,EACA,UAAAf,EACA,MAAOU,CACX,CAAC,EAEKoE,GAAoB,MAAMvD,EAAa,CACzC,SAAUqD,GAAmB,OAAQ,CAAC,EACtC,SAAU,CACN,OAAQjF,EAAM,kBAAkB,GAAK,eACrC,iBAAkB,CAAE,WAAY,wBAAyB,CAC7D,EACA,UAAAK,EACA,MAAOU,CACX,CAAC,EAGDX,EAAO,uDAAuD,EAC9D,MAAM8B,GAAqB,CACvB,aAAc,CAACgD,GAAoBC,EAAiB,EACpD,UAAW,4BACX,UAAA9E,EACA,MAAOU,EACP,aAAcR,EACd,QAASK,EAAW,QACpB,aAAc,+BAClB,CAAC,EACDZ,EAAM,eAAiBY,EAAW,QAGlCR,EAAO,+FAA+F,EACtG,MAAMmB,EAAY,CACd,aAAc,CAACgD,GAAoBC,GAAmBJ,EAAe,EACrE,UAAW,2BACX,UAAA/D,EACA,MAAAE,CACJ,CAAC,EACDP,EAAM,eAAiBY,EAAW,QAElCR,EAAO,uEAAkE,EACzED,EAAI,YAAc,6BAElB,IAAMiF,GAAW,SAAS,eAAe,iBAAiB,EACtDA,KAAYA,GAAS,SAAW,GAGxC,OAAShD,EAAO,CACZhC,EAAO,6BAAwBiC,EAAgBD,CAAK,CAAC,EAAE,EACvD,QAAQ,MAAMA,CAAK,EACnBjC,EAAI,SAAW,EACnB,CACJ,CAAC,CACL,CAjUgBmC,EAAAE,GAAA,uBAqUT,SAAS6C,IAA6B,CACzC,IAAMlF,EAAM,SAAS,eAAe,iBAAiB,EAChDA,GACLA,EAAI,iBAAiB,QAAS,SAAY,CACtC,GAAI,CACAA,EAAI,SAAW,GACfC,EAAO,6EAA6E,EAEpF,IAAMO,EAAUX,EAAM,eAChBqB,EAAgBrB,EAAM,cACtB0B,EAAe1B,EAAM,aACrBqE,EAAgBrE,EAAM,cAEtBK,EAAY,MAAMC,EAAgC,EAClDC,EAAQ,MAAMF,EAAU,kBAAkB,CAAC,CAAC,EAClD,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,mBAAmB,EAEjD,IAAMM,EAAaC,EAAa,CAAE,MAAOd,EAAM,eAAiB,CAAC,EAG3DsF,EAAW,MAAM,IAAI3C,GAAoB,EAAE,gBAAgB,CAC7D,MAAApC,EACA,UAAAF,EACA,aAAc,CAACL,EAAM,eAAgB,CACzC,CAAC,EAGKuF,EAAqB,MAAMlF,EAAU,cAAc,CAAE,KAAMgB,EAAe,MAAAd,CAAM,CAAC,EACjFiF,EAAoB,MAAMnF,EAAU,cAAc,CAAE,KAAMqB,EAAc,MAAAnB,CAAM,CAAC,EAC/EkF,EAAqB,MAAMpF,EAAU,cAAc,CAAE,KAAMgE,EAAe,MAAA9D,CAAM,CAAC,EAEvF,GAAI,CAACgF,GAAsB,CAACC,GAAqB,CAACC,EAC9C,MAAM,IAAI,MAAM,kEAAkE,EAGtF,IAAMC,EAAc,MAAMrF,EAAU,IAAI,CAAE,KAAMkF,EAAoB,MAAAhF,CAAM,CAAC,EACrEoF,EAAa,MAAMtF,EAAU,IAAI,CAAE,KAAMmF,EAAmB,MAAAjF,CAAM,CAAC,EAEnEqF,EAAWF,EAAY,OAAQ,CAAC,EAChCG,EAAUF,EAAW,OAAQ,CAAC,EAGpC,GAAIC,EAAS,MAAM,SAAW,iBAC1B,MAAM,IAAI,MAAM,0DAA0DA,EAAS,MAAM,MAAM,GAAG,EAEtG,GAAIA,EAAS,MAAM,SAAW,iBAC1B,MAAM,IAAI,MAAM,0DAA0DA,EAAS,MAAM,MAAM,GAAG,EAEtG,GAAIA,EAAS,MAAM,SAAW,iBAC1B,MAAM,IAAI,MAAM,0DAA0DA,EAAS,MAAM,MAAM,GAAG,EAEtG,GAAIA,EAAS,MAAM,SAAW,iBAC1B,MAAM,IAAI,MAAM,0DAA0DA,EAAS,MAAM,MAAM,GAAG,EAEtG,GAAIA,EAAS,MAAM,SAAW,oBAC1B,MAAM,IAAI,MAAM,6DAA6DA,EAAS,MAAM,MAAM,GAAG,EAEzG,GAAIA,EAAS,MAAM,SAAW,oBAC1B,MAAM,IAAI,MAAM,6DAA6DA,EAAS,MAAM,MAAM,GAAG,EAEzG,GAAIA,EAAS,MAAM,SAAW,oBAC1B,MAAM,IAAI,MAAM,6DAA6DA,EAAS,MAAM,MAAM,GAAG,EAKzG,GAHAxF,EAAO,mFAA8E,EAGjFyF,EAAQ,MAAM,aAAe,sBAC7B,MAAM,IAAI,MAAM,kEAAkEA,EAAQ,MAAM,UAAU,GAAG,EAEjH,GAAIA,EAAQ,MAAM,aAAe,sBAC7B,MAAM,IAAI,MAAM,kEAAkEA,EAAQ,MAAM,UAAU,GAAG,EAEjH,GAAIA,EAAQ,MAAM,aAAe,yBAC7B,MAAM,IAAI,MAAM,qEAAqEA,EAAQ,MAAM,UAAU,GAAG,EAEpH,GAAIA,EAAQ,MAAM,aAAe,yBAC7B,MAAM,IAAI,MAAM,qEAAqEA,EAAQ,MAAM,UAAU,GAAG,EAEpHzF,EAAO,8EAAyE,EAGhF,IAAM0F,EAAOF,EAAS,SAAS3F,EAAe,GAAK,CAAC,EACpD,GAAI,CAAC4B,GAAY,MAAM,IAAI,MAAM,oEAAoE,EACrG,GAAI,CAACiE,EAAK,SAASjE,EAAQ,EACvB,MAAM,IAAI,MAAM,wDAAwD,EAE5E,GAAI,CAACU,GAAa,MAAM,IAAI,MAAM,qEAAqE,EACvG,GAAI,CAACuD,EAAK,SAASvD,EAAS,EACxB,MAAM,IAAI,MAAM,yDAAyD,EAE7EnC,EAAO,iEAA4D,EAGnE,IAAMI,EAAY,IAAIC,EACtBL,EAAO,iDAAiD,EACxD,IAAM2F,EAAsB,MAAMvF,EAAU,cAAcK,EAAY0E,EAAoB,EAAI,EACxFS,EAAqB,MAAMxF,EAAU,cAAcK,EAAY2E,EAAmB,EAAI,EAE5F,GAAI,CAACO,EAAoB,SAAW,CAACA,EAAoB,OAAS,CAACC,EAAmB,SAAW,CAACA,EAAmB,MACjH,MAAM,IAAI,MAAM,4CAA4C,EAGhE,IAAMC,EAAiBF,EAAoB,MAAMR,CAAkB,EAC7DW,EAAgBF,EAAmB,MAAMR,CAAiB,EAEhE,GAAI,CAACS,GAAkB,CAACC,EACpB,MAAM,IAAI,MAAM,4DAA4D,EAGhF,GAAID,EAAe,MAAM,SAAW,qBAAuBA,EAAe,MAAM,SAAW,oBACvF,MAAM,IAAI,MAAM,4DAA4D,EAEhF,GAAIC,EAAc,MAAM,aAAe,0BAA4BA,EAAc,MAAM,aAAe,yBAClG,MAAM,IAAI,MAAM,2DAA2D,EAE/E9F,EAAO,uEAAkE,EAEzEA,EAAO,qHAAgH,EACvHD,EAAI,YAAc,4BAEtB,OAASiC,EAAO,CACZhC,EAAO,8BAAyBiC,EAAgBD,CAAK,CAAC,EAAE,EACxD,QAAQ,MAAMA,CAAK,EACnBjC,EAAI,SAAW,EACnB,CACJ,CAAC,CACL,CA9HgBmC,EAAA+C,GAAA,wBC/eT,SAASc,IAAqB,CACjC,IAAMC,EAAQ,GAAGC,CAAE,iBACnB,GAAI,CACA,IAAMC,EAAW,SAAS,eAAe,sBAAsB,EAC3DA,IACAA,EAAS,iBAAiB,SAAU,IAAM,CACtC,IAAMC,EAAMD,EAAS,MACR,SAAS,iBAAiB,0BAA0B,EAC5D,QAAQE,GAAO,CAChB,IAAMC,EAAQD,EAAI,aAAa,aAAa,EACxCD,IAAQ,OAASE,IAAUF,EAC3BC,EAAI,MAAM,QAAU,OAEpBA,EAAI,MAAM,QAAU,MAE5B,CAAC,CACL,CAAC,EAEDF,EAAS,cAAc,IAAI,MAAM,QAAQ,CAAC,GAG9CI,GAAqB,EACrBC,GAA+B,EAC/BC,GAAiB,EACjBC,GAA0B,EAC1BC,GAAgC,EAChCC,GAAkB,EAClBC,GAAiB,EACjBC,GAAkB,EAClBC,GAAkB,EAClBC,GAAiB,EACjBC,GAAkB,EAClBC,GAAkB,EAClBC,GAAiB,EACjBC,GAAkB,EAClBC,GAAoB,EACpBC,GAAmB,EACnBC,GAAoB,EACpBC,GAAoB,EACpBC,GAAmB,EACnBC,GAAoB,EACpBC,GAAoB,EACpBC,GAAmB,EACnBC,GAAoB,EACpBC,GAAoB,EACpBC,GAAmB,EACnBC,GAAoB,EACpBC,GAAoB,EACpBC,GAAmB,EACnBC,GAAoB,EACpBC,GAAoB,EACpBC,GAAmB,EACnBC,GAAoB,EACpBC,GAAoB,EACpBC,GAAmB,EACnBC,GAAoB,EACpBC,GAAoB,EACpBC,GAAmB,EACnBC,GAAoB,EACpBC,GAAoB,EACpBC,GAAmB,EACnBC,GAAoB,EACpBC,GAAqB,EACrBC,GAAoB,EACpBC,GAAqB,CACzB,OAASC,EAAO,CACZ,QAAQ,MAAM,GAAGlD,CAAK,IAAImD,EAAgBD,CAAK,CAAC,EAAE,CACtD,CACJ,CApEgBE,EAAArD,GAAA,gBCvBhBsD,GAAoBC,EAAU,EAE9B,IAAMC,GAAUC,GAUhB,eAAeC,IAAgC,CAC3C,IAAMC,EAAK,IAAID,GAAe,IAAI,IAClC,GAAI,CACIF,IAAW,QAAQ,IAAI,GAAGG,CAAE,oDAAoD,EACpF,QAAQ,KAAKA,CAAE,EAEf,SAAS,iBAAiB,mBAAoB,SAAY,CACtD,GAAI,CACA,QAAQ,QAAQA,EAAI,wBAAwB,EAE5C,MAAMC,GAAiBL,EAAU,EACjC,QAAQ,QAAQI,EAAI,2BAA2B,EAE/C,MAAME,GAA+B,iBAAiB,EACtD,QAAQ,QAAQF,EAAI,yCAAyC,EAE7DG,GAAa,EACb,QAAQ,QAAQH,EAAI,uBAAuB,EAE3C,QAAQ,QAAQA,CAAE,CACtB,OAASI,EAAO,CACZ,cAAQ,MAAM,GAAGJ,CAAE,IAAIK,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,CACJ,CAAC,CAEL,OAASA,EAAO,CACZ,QAAQ,QAAQJ,CAAE,EAClB,SACA,cAAQ,MAAM,GAAGA,CAAE,IAAIK,EAAgBD,CAAK,CAAC,EAAE,EACzCA,CACV,QAAE,CACMP,IAAW,QAAQ,IAAI,GAAGG,CAAE,YAAY,CAChD,CACJ,CAlCeM,EAAAP,GAAA,kBAoCfA,GAAe",
|
|
6
|
+
"names": ["SYNC_ATOM", "SYNC_MSG_REL8N_NAME", "SYNC_SAGA_PAYLOAD_ADDRS_DOMAIN", "SYNC_STAGE_INIT", "SYNC_STAGE_ACK", "SYNC_STAGE_DELTA", "SYNC_STAGE_COMMIT", "SyncStage", "SYNC_STAGE_VALID_VALUES", "SYNC_CONFLICT_STRATEGY_ABORT", "SYNC_CONFLICT_STRATEGY_OPTIMISTIC_GRAFT_LCS", "SyncConflictStrategy", "SYNC_CONFLICT_STRATEGY_VALID_VALUES", "isValidSyncConflictStrategy", "strategy", "__name", "SYNC_MODE_PUSH", "SYNC_MODE_PULL", "SYNC_MODE_SYNC", "SyncMode", "SYNC_MODE_VALID_VALUES", "SYNC_SAGA_FRAME_ORIGIN_SENDER", "SYNC_SAGA_FRAME_ORIGIN_RECEIVER", "SyncSagaFrameOrigin", "SYNC_SAGA_FRAME_ORIGIN_VALID_VALUES", "logalot", "getUniqueDnas", "base", "extended", "throwIfExtendedDoesntContainBase", "lc", "baseIsStartingSubsetOfExtended", "i", "resultUniqueDnas", "extendedAddr", "error", "extractErrorMsg", "__name", "applyTransforms", "src", "createdIbGibs_Running", "dnaAddrsToApplyToStoreVersion_MUTATES_IN_PLACE", "allLocalIbGibs", "dnaAddrToApply", "dnaIbGib_IntermediateArray", "x", "getIbGibAddr", "dnaIbGib", "argTransform", "clone", "resTransform", "mut8", "rel8", "GRAFT_INFO_ATOM", "GRAFT_INFO_REL8N_NAME", "GRAFT_LCA_REL8N_NAME", "GRAFT_BASE_REL8N_NAME", "GRAFT_ORPHAN_REL8N_NAME", "GRAFT_DNAAPPLIED_REL8N_NAME", "MERGE_TEXT_STRATEGY_LCS", "MergeTextStrategy", "MERGE_TEXT_STRATEGY_VALID_VALUES", "logalot", "getGraftInfoIb", "data", "isValidSyncConflictStrategy", "SYNC_CONFLICT_STRATEGY_VALID_VALUES", "GRAFT_INFO_ATOM", "__name", "createGraftInfo", "conflictStrategy", "details", "addlGraftDetails", "latestCommonFrameAddr", "baseAddrsSinceLCA", "orphanAddrsSinceLCA", "dnaAddrsApplied", "lc", "logalot", "data", "rel8ns", "GRAFT_LCA_REL8N_NAME", "GRAFT_BASE_REL8N_NAME", "GRAFT_ORPHAN_REL8N_NAME", "GRAFT_DNAAPPLIED_REL8N_NAME", "ib", "getGraftInfoIb", "Factory_V1", "GRAFT_INFO_ATOM", "error", "extractErrorMsg", "__name", "mergeTextByLongestCommonSubsequence", "textA", "textB", "longestCommonSubsequence", "a", "b", "m", "n", "dp", "i", "j", "lcs", "linesA", "linesB", "common", "resultLines", "currentA", "currentB", "match", "graftTimelines", "timelineAddrsA", "timelineAddrsB", "ibGibReadCache", "space", "throwIfUnexpected", "someIbGibs", "lcThrow", "someIbGib", "getIbGibAddr", "newGraftedIntermediateIbGibs_ordered", "newGraftDnaIbGibs", "addrA", "indexLCA_A", "addrsA_sinceLCA", "branchA_sinceLCA", "getIbGibsFromCache_fallbackToSpaces", "tipA", "indexLCA_B", "addrsB_sinceLCA", "branchB_sinceLCA", "tipB", "baseTip", "baseBranch", "orphanTip", "orphanBranch", "timestampInfoA", "getTimestampInfo", "ticksA", "msA", "timestampInfoB", "ticksB", "msB", "baseTipAddr", "baseBranchAddrs", "x", "orphanTipAddr", "orphanBranchAddrs", "latestCommonFrameIbGib", "dnaAddrsAlreadyAccountedFor", "dnaAddrsToApply", "orphanFrame", "orphanDnaAddrsToApply", "getUniqueDnas", "dnaIbGibsToApply", "createdIbGibs_Running", "graftTip_sansGraftInfo", "applyTransforms", "putInSpace", "mapWithTjp_NoDna", "newGraftedIbGibsMap", "_unusedBcDnaIsAlreadyStoredDontRegister", "splitPerTjpAndOrDna", "newGraftedIbGibs_orderNotGuaranteed", "newGraftedIbGibsByTjp", "getTimelinesGroupedByTjp", "newGraftedIbGib", "registerNewIbGib", "mergeTextDetails", "SyncConflictStrategy", "textAAddr", "textBAddr", "newText", "resMut8Text", "mut8", "persistTransformResult", "MergeTextStrategy", "graftInfo", "pretty", "graftInfoAddr", "resRel8GraftInfo", "rel8", "GRAFT_INFO_REL8N_NAME", "finalGraftTip", "result", "isGraftInfo", "ibGib", "logalot", "getSyncIb", "data", "lc", "SYNC_ATOM", "error", "extractErrorMsg", "__name", "getTempSpaceName", "getUUID", "__name", "isPastFrame", "olderAddr", "newerAddr", "space", "lc", "logalot", "newerIbGib", "res", "getFromSpace", "pastAddrs", "oldestAddrInThisPast", "error", "extractErrorMsg", "getSyncSagaFrameDependencyGraph", "sagaIbGib", "localSpace", "fnGet", "addrs", "resGet", "resIbGib", "validationErrors", "validateSyncSagaFrame", "msgStoneAddrs", "SYNC_MSG_REL8N_NAME", "msgStones", "getFullSyncSagaHistory", "sagaAddr", "getIbGibAddr", "resGraphs", "addr", "sagaFrame", "pretty", "graph", "errors", "validateIbGibIntrinsically", "data", "isValidSyncConflictStrategy", "SYNC_CONFLICT_STRATEGY_VALID_VALUES", "msgAddrs", "validateFullSyncSagaHistory", "history", "putInSpace_dnasThenNonDnas", "ibGibs", "payload_Dnas", "payload_NonDnas", "ibGib", "isPrimitive", "isDna", "putInSpace", "getSyncSagaFrameOrigin", "modulo", "SyncSagaFrameOrigin", "getFinalConflictsInfo", "sagaHistory", "lastDeltaHistorySlice", "x", "msgStone", "SyncStage", "deltaStones", "getAllOrphanedAddresses", "myTempSpace", "conflicts", "resOrphanedAddrs", "conflict", "ibgibsGotten", "getIbGibsFromCache_fallbackToSpaces", "graftInfo", "isGraftInfo", "orphanedAddrs", "GRAFT_ORPHAN_REL8N_NAME", "deriveSessionSecret", "senderSecret", "sagaId", "deriveKey", "KdfStrategy", "SYNC_SAGA_CONTEXT_ATOM", "logalot", "getSyncSagaContextIb", "data", "lc", "payloadCount", "SYNC_SAGA_CONTEXT_ATOM", "error", "extractErrorMsg", "__name", "validateContextAndSagaFrame", "context", "lc", "logalot", "errors", "intrinsicErrors", "validateIbGibIntrinsically", "x", "validateSyncSagaFrame", "expectedMsgAddr", "SYNC_MSG_REL8N_NAME", "actualMsgAddr", "getIbGibAddr", "error", "extractErrorMsg", "__name", "authenticateContextIntrinsically", "context", "space", "lc", "logalot", "errors", "sagaFrame", "currSessionIdentity", "currSessionIdentityAddr", "getIbGibAddr", "prevSessionIdentityAddrs_accordingToContextRel8ns", "prevSessionIdentityAddr", "resGetLatestAddr", "getLatestAddrs", "latestAddrsMap", "prevSessionIdentityAddr_latest", "pretty", "toDto", "p", "resGetPrevSessionIdentity", "getFromSpace", "prevSessionIdentity", "sessionIdentityTjp", "getTjpIbGib", "sessionIdentityTjpAddr", "sessionGenesisFrameDetails", "senderIdentityAddr", "senderIdentityTjpAddr", "resGetLatestAddr_senderIdentity", "latestAddrsMap_senderIdentity", "senderIdentityTjpAddr_latest", "senderIdentityAddr_latest", "resGetSenderIdentity_latest", "senderIdentity_latest", "syncClaim", "KEYSTONE_VERB_SYNC", "transitionErrors", "KeystoneService_V1", "contextAddr", "error", "emsg", "extractErrorMsg", "__name", "logalot", "SyncPeer_V1", "_SyncPeer_V1", "LightWitnessBase_V1", "__name", "getIbGibAddr", "contextAddr", "lc", "fnSenderSecret", "sagaId", "localMetaspace", "localSpace", "senderSecret", "sessionSecret", "deriveSessionSecret", "evolved", "KeystoneService_V1", "KEYSTONE_VERB_SYNC", "error", "extractErrorMsg", "challengeUuid", "demandedIds", "POOL_ID_CONNECT", "KEYSTONE_VERB_CONNECT", "initialData", "initialRel8ns", "newupSubject", "opts", "senderIdentity", "senderDomainAddr", "senderIdentityAddr", "senderIdentityTjpAddr", "getTjpAddr", "keystoneSvc", "frameDetails", "sessionIdentity", "sessionIdentityAddr", "newSenderIdentity", "arg", "context", "authenticationErrors", "authenticateContextIntrinsically", "validationErrors", "validateContextAndSagaFrame", "response", "sagaHistory_afterSend", "getFullSyncSagaHistory", "addr", "resGet", "getFromSpace", "logalot", "SESSION_KEYSTONE_POLICY", "HashAlgorithm", "KeystoneChallengeType", "KeystoneReplenishStrategy", "POOL_ID_CONNECT", "KEYSTONE_VERB_CONNECT", "getConnectChallenge", "keystone", "lc", "connectPool", "p", "challengeIds", "challengeId", "challenge", "error", "extractErrorMsg", "__name", "SYNC_WEB_SOCKET_MSG_TYPE_AUTH_CHALLENGE_INIT", "SYNC_WEB_SOCKET_MSG_TYPE_AUTH_INIT", "SYNC_WEB_SOCKET_MSG_TYPE_AUTH_CHALLENGE", "SYNC_WEB_SOCKET_MSG_TYPE_AUTH_PROOF", "SYNC_WEB_SOCKET_MSG_TYPE_AUTH_OK", "SYNC_WEB_SOCKET_MSG_TYPE_AUTH_FAIL", "SYNC_WEB_SOCKET_MSG_TYPE_SYNC_FRAME", "SYNC_WEB_SOCKET_MSG_TYPE_SYNC_FRAME_RESPONSE", "SYNC_WEB_SOCKET_MSG_TYPE_SYNC_FRAME_AUTHENTICATED", "SYNC_WEB_SOCKET_MSG_TYPE_SYNC_FRAME_RESPONSE_AUTHENTICATED", "SYNC_WEB_SOCKET_MSG_TYPE_DOMAIN_PAYLOAD", "SYNC_WEB_SOCKET_MSG_TYPE_SYNC_ERROR", "SyncWebSocketMsgType", "SYNC_WEB_SOCKET_MSG_TYPE_VALID_VALUES", "isSyncWebSocketMsgType", "value", "__name", "assertUnreachable", "x", "__name", "logalot", "SyncPeerWebSocketSender_V1", "_SyncPeerWebSocketSender_V1", "SyncPeer_V1", "initialData", "initialRel8ns", "opts", "lc", "newSenderIdentity", "sessionIdentity", "response", "data", "errorMsg", "error", "extractErrorMsg", "senderIdentity", "fnSenderSecret", "sagaId", "localMetaspace", "localSpace", "senderSecret", "sessionSecret", "deriveSessionSecret", "sAddr_tjp", "getIbGibAddr", "sAddr", "senderIdentityLatestAddr", "targetSAddr", "sessionS", "connectPool", "p", "SESSION_KEYSTONE_POLICY", "challengeId", "getConnectChallenge", "strategy", "KeystoneStrategyFactory", "poolSecret", "solution", "wsUrl", "ws", "resolve", "reject", "isResolved", "ev", "msg", "msgType", "isSyncWebSocketMsgType", "validTypes", "SYNC_WEB_SOCKET_MSG_TYPE_VALID_VALUES", "SyncWebSocketMsgType", "event", "err", "challengeUuid", "demandedIds", "proofFrame", "responseContext", "validationErrors", "validateContextAndSagaFrame", "allControlIbGibs", "toDto", "ibGib", "putInSpace", "registerNewIbGib", "payloads", "payload", "errorDetail", "context", "domainPayloads", "contextToSend", "SYNC_SAGA_MSG_ATOM", "getSyncSagaMessageIb", "data", "lc", "SYNC_SAGA_MSG_ATOM", "error", "extractErrorMsg", "__name", "getSyncSagaMessageFromFrame", "frameIbGib", "space", "lc", "msgs", "getRel8dIbGibs", "SYNC_MSG_REL8N_NAME", "error", "extractErrorMsg", "__name", "logalot", "logalotControlDomain", "lcControlDomain", "SyncSagaCoordinator", "_SyncSagaCoordinator", "__name", "createStandardPoolConfig", "POOL_ID_CONNECT", "KEYSTONE_VERB_CONNECT", "KeystoneReplenishStrategy", "POOL_ID_SYNC", "KEYSTONE_VERB_SYNC", "peer", "domainIbGibs", "senderIdentityInfo", "fnSenderSecret", "conflictStrategy", "SyncConflictStrategy", "metaspace", "localSpace", "lc", "senderIdentity", "senderDomainAddr", "sagaId", "getUUID", "updates$", "newupSubject", "resolveDone", "rejectDone", "done", "resolve", "reject", "tempSpaceName", "getTempSpaceName", "tempSpace", "cleanup", "targetAddrs", "domain", "getIbGibAddr", "initFrame", "initDomainGraph", "error", "extractErrorMsg", "sagaContext", "mySpace", "myTempSpace", "contextResult", "frame", "payloadIbGibsDomain", "responseCtx", "immediateValidationErrors", "validateContextAndSagaFrame", "currentFrame", "nextDomainIbGibs", "domainPayloadsMap", "sublc", "subscription", "fnObs", "ibgib", "addr", "e", "isIbGib", "requestCtx", "domainAddrs", "p", "getSyncSagaMessageFromFrame", "SyncStage", "contextAndSagaFrameValidationErrors", "returnContextErrors", "responsePayloadAddrsDomain", "SYNC_SAGA_PAYLOAD_ADDRS_DOMAIN", "responseControlAddrs", "handlerDomainAddrs", "sagaFrame", "sessionIdentityAddr", "skipSign", "date", "timestamp", "getTimestamp", "timestampMs", "data", "payloadAddrsDomain", "x", "rel8ns", "sessionIdentity", "resGet", "getFromSpace", "ib", "getSyncSagaContextIb", "contextIbGib", "Factory_V1", "SYNC_SAGA_CONTEXT_ATOM", "contextAddr", "signedSessionIdentity", "putInSpace", "registerNewIbGib", "msgStones", "getSyncSagaFrameDependencyGraph", "space", "tjpAddrs", "tjps", "mapWithTjp_YesDna", "mapWithTjp_NoDna", "splitPerTjpAndOrDna", "allWithTjp", "timelineMap", "getTimelinesGroupedByTjp", "res", "getLatestAddrs", "fullGraph", "getDependencyGraph", "graphIsValid", "srcIbGibs", "srcMapWithTjp_YesDna", "srcMapWithTjp_NoDna", "src_MapWithoutTjps", "stones", "withTimelines", "timelinesMap", "topologicallySortedTjpAddrs", "analysis", "srcTimelinesMap", "srcStones", "knowledgeMap", "tjp", "tip", "initData", "SyncMode", "s", "initStone", "pretty", "errors", "requestFrameAddr", "responseFrameAddr", "isPastFrame", "expectedSessionIdAddr", "responseSessionIdAddr", "expectedAddrs", "pollIntervalMs", "resultDomainPayloads", "uniqueExpectedAddrs", "pending", "start", "timeoutMs", "stillPending", "found", "delay", "sagaIbGib", "stage", "messageData", "nextFrameInfo", "getSyncSagaFrameOrigin", "errorMsg", "conflicts", "deltaRequestAddrInfos", "pushOfferInfos", "rawResultIbGib", "addrsNotFound", "senderKnowledge", "senderTjpAddrs", "receiverLatestAddrsMap", "resGetLatestAddrs", "tjpAddr", "senderTipAddr", "receiverTipAddr", "deltaGraph", "getDeltaDependencyGraph", "receiverIsInPast", "resReceiverTipIbGib", "receiverTipIbGib", "pastAddrs", "getHistoryAddrs", "SYNC_CONFLICT_STRATEGY_VALID_VALUES", "c", "ackData", "ackStone", "ackFrame", "searchSecondSpaceAddrs", "resGetRawData", "addrsErrored", "resGet2", "addrsFailed", "pid", "proposeCommit", "clone", "terminalConflicts", "outgoingPayloadIbGibsDomain_conflicts", "activeConflicts", "conflict", "reason", "terminal", "receiverKnowledgeTimelineAddrs", "senderTipIbGib", "headIbGib", "orderedPastIbGibs", "getHistory", "historyAddrs", "latestLocalAddr", "newDepGraph", "newDepGraphAddrs", "newDepGraphAddr", "latestCommonFrameAddr", "accretivePayloadAddrs", "deltaPayloadAddr", "deltaPayloadIbGib", "outgoingPayloadIbGibsDomain_requestedByAck", "outgoingPayloadsDomain_all", "outgoingPayloadsDomainAddrs_all", "deltaData", "deltaStone", "deltaFrame", "peerProposesCommit", "receivedPayloadIbGibs", "outgoingPayload", "unresolvedConflicts", "unresolvedConflict", "conflictPayloadIbGibMap", "conflictPayloadAddr", "conflictPayloadIbGib", "senderKnowledgeTimelineAddrs", "depGraph", "depGraphIbGibs", "putInSpace_dnasThenNonDnas", "timelineAddr", "timelineIbGib", "addrA", "ourDeltaDepGraph", "ourIbGib", "resGraft", "graftTimelines", "dnasCreatedInGraft", "dnasReplayed", "intermediateIbGibsCreatedInGraft", "newGraftTip", "graftInfoCreated", "graftInfoAddrs", "GRAFT_INFO_REL8N_NAME", "ibGibsCreatedOrReplayedInGraft", "ibGib", "validateIbGibIntrinsically", "ibGibCreated", "addrCreated", "payloadIbGib", "myRequests", "hasOutgoing", "hasMyRequests", "responseDeltaData", "history", "getFullSyncSagaHistory", "validationErrors", "validateFullSyncSagaHistory", "commitData", "commitStone", "commitFrame", "sagaHistory", "localTempSpace", "currentFrameOrigin", "allPayloadAddrsDomainReceived", "fnAddPayloadAddr", "sagaHistory_onlyMyEnd", "frameExecutionContext", "msgStone", "info", "allPayloadIbGibsDomainTransferred", "resGetAllTransferred", "createdFromConflictGraftsIbGibs", "finalConflicts", "getFinalConflictsInfo", "finalConflict", "getIbGibsFromCache_fallbackToSpaces", "createdDnaAddrs", "replayedDnaAddrs", "createdDomainAddrs", "allTransferredOrCreatedFromGraftIbGibs", "payload_Dnas", "payload_NonDnas", "orphanedAddresses", "getAllOrphanedAddresses", "mapWithoutTjps", "nonTjpIbGibs", "nontjp", "timelinesByTjpAddr_NoDna", "tjpAddrs_NoDna", "tjpAddr_NoDna", "timelineIbGibs", "timelinesByTjpAddr_YesDna", "tjpAddrs_YesDna", "tjpAddr_YesDna", "emsg", "getSyncSagaMessageIb", "stone", "SYNC_SAGA_MSG_ATOM", "outgoingPayloadIbGibsDomainGraph", "latestAddrAlreadyHave", "deltaDepGraph", "prevSagaIbGib", "firstStoneData", "d", "rel8nInfos", "SYNC_MSG_REL8N_NAME", "rel8nRemovalInfos", "appendToTimeline", "sessionIdentityTjpAddr", "getTjpAddr", "getSyncIb", "stoneAddrs", "resNew", "createTimeline", "SYNC_ATOM", "stoneAddr", "timelines", "addrToTjp", "adj", "relAddr", "depTjp", "visited", "temp", "sorted", "visit", "node", "dep", "keystone_policies_default", "pools", "keystone_policies_default", "getSpaceGibPoolConfig", "poolKey", "salt", "template", "createPoolConfigFromJson", "__name", "SESSION_KEYSTONE_POLICY", "DOMAIN_KEYSTONE_SECURITY_STANDARDS", "HashAlgorithm", "SpaceGibApiBridge", "IbGibApiBridge", "__name", "spaceGibApiBridge", "setApiBridge", "lc", "debugState", "devLog", "msg", "logEl", "timestamp", "__name", "createAndRegisterSyncDelegate", "domainI", "masterSecret", "syncSalt", "metaspace", "space", "apiBridge", "keystoneService", "KeystoneService_V1", "delegateSecret", "hash", "delegateKeystone", "getSpaceGibPoolConfig", "getTimestamp", "evolvedDomainI", "KEYSTONE_VERB_SYNC", "domainAddr", "getIbGibAddr", "resEvolve", "getSenderIdentityInfo", "senderIdentity", "fnSenderSecret", "syncDelegateEntry", "d", "delegateTjpAddr", "latestDelegateAddr", "resDel", "performPhaseSetup", "opts", "lc_fn", "btn", "getGlobalMetaspace_waitIfNeeded", "SpaceGibApiBridge", "resGenesis", "resX", "Factory_V1", "ROOT", "xIbGib", "syncBtn", "error", "extractErrorMsg", "performPhaseSync", "targetX", "protocol", "senderPeer", "SyncPeerWebSocketSender_V1", "coordinator", "SyncSagaCoordinator", "sagaId", "getUUID", "SESSION_KEYSTONE_POLICY", "SyncConflictStrategy", "err", "checkBtn", "getDelegateAndSessionInfo", "localI", "delegateInfo", "latestLocalDelegateAddr", "localDelegate", "sessionIdentityTjpAddr", "p", "runSyncPass", "domainIbGibs", "passLabel", "latestDomainAddr", "res", "runSyncPassFromSpace", "primarySpace", "evolved", "copyIdentitiesToSpace", "setupDomainAndDelegateIdentities", "manageSalt", "phaseText", "verifyIdentitiesOnServer", "latestLocalIAddr", "serverDelGetRes", "serverIGetRes", "fromSpace", "toSpace", "latestDomainI", "graphI", "latestDelegate", "graphDel", "_ws", "initWsTestButton", "lc_fn", "lc", "btn", "devLog", "wsUrl", "ev", "error", "extractErrorMsg", "__name", "initPrintStateButton", "debugState", "initCreateDomainKeystoneButton", "metaspace", "getGlobalMetaspace_waitIfNeeded", "space", "masterSecret", "domainI", "KeystoneService_V1", "createManagePoolConfig", "getUUID", "KeystoneReplenishStrategy", "getTimestamp", "iAddr", "getIbGibAddr", "resSync", "SpaceGibApiBridge", "nextBtn", "initCreateTestIbGibButton", "xIbGib", "Factory_V1", "ROOT", "xAddr", "initCreateSessionKeystoneButton", "targetX", "sessionSecret", "keystoneService", "sIbGib", "SESSION_KEYSTONE_POLICY", "sAddr", "init1bSetupButton", "btn", "performPhaseSetup", "__name", "init1bSyncButton", "performPhaseSync", "init1bCheckButton", "lc_fn", "lc", "devLog", "metaspace", "getGlobalMetaspace_waitIfNeeded", "space", "domainI", "debugState", "targetX", "newSenderIdentityAddr", "getIbGibAddr", "newSenderIdentity", "syncProof", "p", "sessionIdentityTjpAddr", "sessionIdentity", "sPools", "hasConnectPool", "POOL_ID_CONNECT", "hasSyncPool", "POOL_ID_SYNC", "apiBridge", "SpaceGibApiBridge", "hasI", "hasI1", "hasS", "domainAddr", "resGetDomainIGraphFromServer", "domainGraph", "resGetSessionSFromServer", "btn2bSetup", "error", "extractErrorMsg", "init2bSetupButton", "btn", "performPhaseSetup", "__name", "init2bSyncButton", "performPhaseSync", "init2bCheckButton", "lc_fn", "lc", "devLog", "metaspace", "getGlobalMetaspace_waitIfNeeded", "space", "domainI", "debugState", "domainAddr", "getIbGibAddr", "newSenderIdentityAddr", "newSenderIdentity", "sessionIdentityTjpAddr", "p", "latestSessionSAddr", "sessionIdentity", "sPools", "connectPool", "POOL_ID_CONNECT", "syncPool", "POOL_ID_SYNC", "remainingChallenges", "p3SetupBtn", "error", "extractErrorMsg", "init3bSetupButton", "btn", "performPhaseSetup", "__name", "init3bSyncButton", "performPhaseSync", "init3bCheckButton", "lc_fn", "lc", "devLog", "metaspace", "getGlobalMetaspace_waitIfNeeded", "space", "domainI", "debugState", "targetX", "xAddr", "getIbGibAddr", "domainAddr", "latestLocalXAddr", "localXGraph", "apiBridge", "SpaceGibApiBridge", "serverGetRes", "serverXGraph", "graphsAreEquivalent", "latestLocalIAddr", "localI", "sessionIdentityTjpAddr", "p", "serverIGetRes", "latestLocalSAddr", "sessionS", "n", "serverSGetRes", "localSGraph", "serverSGetGraphRes", "serverSGraph", "error", "extractErrorMsg", "init4_1bSetupButton", "btn", "performPhaseSetup", "__name", "init4_1bSyncButton", "performPhaseSync", "init4_1bCheckButton", "lc_fn", "lc", "devLog", "metaspace", "getGlobalMetaspace_waitIfNeeded", "space", "domainI", "debugState", "targetX", "xAddr", "getIbGibAddr", "domainAddr", "latestLocalXAddr", "localXGraph", "apiBridge", "SpaceGibApiBridge", "serverGetRes", "serverXGraph", "graphsAreEquivalent", "latestLocalIAddr", "localI", "latestLocalDelegateAddr", "sessionIdentityTjpAddr", "getDelegateAndSessionInfo", "serverDelGetRes", "serverIGetRes", "latestLocalSAddr", "sessionS", "n", "serverSGetRes", "localSGraph", "serverSGetGraphRes", "serverSGraph", "error", "extractErrorMsg", "init4_2bSetupButton", "btn", "performPhaseSetup", "__name", "performPhaseSync4_2b", "lc_fn", "lc", "devLog", "debugState", "metaspace", "getGlobalMetaspace_waitIfNeeded", "space", "c1", "Factory_V1", "getUUID", "addrC1", "getIbGibAddr", "runSyncPass", "c2", "addrC2", "checkBtn", "error", "extractErrorMsg", "init4_2bSyncButton", "init4_2bCheckButton", "domainI", "targetC1", "targetC2", "c1Addr", "c2Addr", "domainAddr", "apiBridge", "SpaceGibApiBridge", "localC1Res", "localC2Res", "serverC1Res", "serverC2Res", "localC2Graph", "serverC2GetGraphRes", "graphsAreEquivalent", "latestLocalIAddr", "localI", "nI", "sessionIdentityTjpAddr", "verifyIdentitiesOnServer", "latestLocalSAddr", "sessionS", "nS", "serverSGetRes", "localSGraph", "serverSGetGraphRes", "init4_3bSetupButton", "btn", "devLog", "metaspace", "getGlobalMetaspace_waitIfNeeded", "space", "apiBridge", "SpaceGibApiBridge", "setupDomainAndDelegateIdentities", "resV0", "Factory_V1", "ROOT", "r1_v0", "r1_v1", "mut8Timeline", "debugState", "getIbGibAddr", "syncBtn", "error", "extractErrorMsg", "__name", "performPhaseSync4_3b", "lc_fn", "lc", "targetV1", "runSyncPass", "r1_v2", "checkBtn", "init4_3bSyncButton", "init4_3bCheckButton", "domainI", "targetV2", "v1Addr", "v2Addr", "domainAddr", "localV1Res", "localV2Res", "serverV2Res", "pastAddr", "localV2Graph", "serverV2GetGraphRes", "graphsAreEquivalent", "latestLocalIAddr", "localI", "nI", "sessionIdentityTjpAddr", "verifyIdentitiesOnServer", "latestLocalSAddr", "sessionS", "nS", "serverSGetRes", "localSGraph", "serverSGetGraphRes", "init4_4bSetupButton", "btn", "devLog", "metaspace", "getGlobalMetaspace_waitIfNeeded", "space", "apiBridge", "SpaceGibApiBridge", "setupDomainAndDelegateIdentities", "resV0", "Factory_V1", "ROOT", "r1_v0", "debugState", "r1_v1", "mut8Timeline", "r1_v2", "getIbGibAddr", "syncBtn", "error", "extractErrorMsg", "__name", "performPhaseSync4_4b", "lc_fn", "lc", "targetV2", "runSyncPass", "checkBtn", "init4_4bSyncButton", "init4_4bCheckButton", "domainI", "targetV0", "targetV1", "v0Addr", "v1Addr", "v2Addr", "domainAddr", "localV0Res", "localV1Res", "localV2Res", "serverV2Res", "pastAddrV2", "serverV1Res", "pastAddrV1", "localV2Graph", "serverV2GetGraphRes", "graphsAreEquivalent", "latestLocalIAddr", "localI", "nI", "sessionIdentityTjpAddr", "verifyIdentitiesOnServer", "latestLocalSAddr", "sessionS", "nS", "serverSGetRes", "localSGraph", "serverSGetGraphRes", "state", "MASTER_SECRET", "init4_5bSetupButton", "btn", "devLog", "metaspace", "getGlobalMetaspace_waitIfNeeded", "space", "apiBridge", "SpaceGibApiBridge", "setupDomainAndDelegateIdentities", "resV0", "Factory_V1", "ROOT", "r1_v0", "r1_v1", "mut8Timeline", "debugState", "getIbGibAddr", "runSyncPass", "remoteSpaceName", "getUUID", "remoteSpace", "graphV1", "domainI", "copyIdentitiesToSpace", "r1_v2", "runSyncPassFromSpace", "syncBtn", "error", "extractErrorMsg", "__name", "init4_5bSyncButton", "targetV1", "checkBtn", "init4_5bCheckButton", "targetV2", "targetV2Addr", "domainAddr", "resGetV2", "localV2", "localGraph", "resServerGraph", "graphsAreEquivalent", "state", "MASTER_SECRET", "init4_6bSetupButton", "btn", "devLog", "metaspace", "getGlobalMetaspace_waitIfNeeded", "space", "apiBridge", "SpaceGibApiBridge", "setupDomainAndDelegateIdentities", "resAlphaV0", "Factory_V1", "ROOT", "r1_alpha_v0", "r1_alpha_v1", "mut8Timeline", "debugState", "getIbGibAddr", "resBetaV0", "r1_beta_v0", "r1_beta_v1", "r1_beta_v2", "syncBtn", "error", "extractErrorMsg", "__name", "init4_6bSyncButton", "targetAlphaV1", "targetBetaV2", "runSyncPass", "checkBtn", "init4_6bCheckButton", "domainAddr", "alphaAddr", "betaAddr", "resServerGraphAlpha", "localGraphAlpha", "graphsAreEquivalent", "resServerGraphBeta", "localGraphBeta", "state", "MASTER_SECRET", "init4_7bSetupButton", "btn", "devLog", "metaspace", "getGlobalMetaspace_waitIfNeeded", "space", "apiBridge", "SpaceGibApiBridge", "setupDomainAndDelegateIdentities", "domainI", "debugState", "remoteSpace", "resRoot", "Factory_V1", "ROOT", "testRoot", "v1_common", "mut8Timeline", "graphRoot", "getIbGibAddr", "graphV1", "runSyncPass", "domainIEvolved", "copyIdentitiesToSpace", "v2a", "v2b", "runSyncPassFromSpace", "syncBtn", "error", "extractErrorMsg", "__name", "init4_7bSyncButton", "targetAlphaV2a", "checkBtn", "init4_7bCheckButton", "targetBetaV2b", "domainAddr", "tjpAddr", "getTjpAddr", "clientTipAddr", "sp", "SyncSagaCoordinator", "resTip", "clientTip", "graftInfoRel", "GRAFT_INFO_REL8N_NAME", "resGraft", "graftInfo", "GRAFT_BASE_REL8N_NAME", "GRAFT_ORPHAN_REL8N_NAME", "resServerGraph", "serverTip", "state", "init4_8bSetupButton", "btn", "devLog", "metaspace", "getGlobalMetaspace_waitIfNeeded", "space", "apiBridge", "SpaceGibApiBridge", "setupDomainAndDelegateIdentities", "domainI", "debugState", "domainAddr", "getIbGibAddr", "remoteSpace", "copyIdentitiesToSpace", "resRoot", "Factory_V1", "ROOT", "testRoot", "v1_common", "mut8Timeline", "graphRoot", "graphV1", "commonDepGraph", "runSyncPass", "resBeta", "beta_v0", "alpha_v2_source_sansBeta", "alpha_v3_source_rel8beta", "appendToTimeline", "v2b", "runSyncPassFromSpace", "syncBtn", "error", "extractErrorMsg", "__name", "init4_8bSyncButton", "targetAlphaV3a", "checkBtn", "init4_8bCheckButton", "targetBetaV0", "tjpAddr", "getTjpAddr", "betaAddr", "clientTipAddr", "SyncSagaCoordinator", "resTip", "clientTip", "graftInfoRel", "GRAFT_INFO_REL8N_NAME", "resGraft", "graftInfo", "baseRel", "GRAFT_BASE_REL8N_NAME", "orphanRel", "GRAFT_ORPHAN_REL8N_NAME", "resServerGraph", "serverTip", "resBetaGraph", "state", "INITIAL_TEXT", "SOURCE_APPEND", "DEST_PREPEND", "init4_9bSetupButton", "btn", "devLog", "metaspace", "getGlobalMetaspace_waitIfNeeded", "space", "apiBridge", "SpaceGibApiBridge", "setupDomainAndDelegateIdentities", "domainI", "debugState", "domainAddr", "getIbGibAddr", "remoteSpace", "copyIdentitiesToSpace", "resRoot", "Factory_V1", "ROOT", "testRoot", "graphRoot", "runSyncPass", "alpha_v1_source", "mut8Timeline", "alpha_v1_remote", "runSyncPassFromSpace", "syncBtn", "error", "extractErrorMsg", "__name", "init4_9bSyncButton", "targetAlphaV1Source", "checkBtn", "init4_9bCheckButton", "tjpAddr", "getTjpAddr", "clientTipAddr", "SyncSagaCoordinator", "resTip", "clientTip", "expectedText", "graftInfoRel", "GRAFT_INFO_REL8N_NAME", "resGraft", "graftInfo", "baseRel", "GRAFT_BASE_REL8N_NAME", "orphanRel", "GRAFT_ORPHAN_REL8N_NAME", "resServerGraph", "serverTip", "state", "TEST_REL8N_NAME", "init4_10bSetupButton", "btn", "devLog", "metaspace", "getGlobalMetaspace_waitIfNeeded", "space", "apiBridge", "SpaceGibApiBridge", "setupDomainAndDelegateIdentities", "domainI", "debugState", "domainAddr", "getIbGibAddr", "remoteSpace", "copyIdentitiesToSpace", "resRoot", "Factory_V1", "ROOT", "alpha_v0", "alpha_tjpAddr", "getTjpAddr", "runSyncPass", "resBeta", "beta_v0_source", "beta_tjpAddr", "r2_alpha_v1_source_sansBeta", "mut8Timeline", "betaAddr", "r2_alpha_v2_source_rel8dBeta", "appendToTimeline", "r2_alpha_v1_remote", "pretty", "runSyncPassFromSpace", "syncBtn", "error", "extractErrorMsg", "__name", "gammaAddr", "init4_10bSyncButton", "protocol", "clientKV_R2", "SyncSagaCoordinator", "alpha_tipAddr_R2_client", "beta_tipAddr_R2_client", "resGetAlphaClientR2", "resGetBetaClientR2", "r3_alpha_v4_source", "r3_beta_v1_source", "alphaLatestAddrRemoteR3", "domainIbGibsRemoteR3", "betaLatestAddrRemoteR3", "resGetBetaRemoteTipR3", "remoteKV_R3", "alpha_tipAddr_R2_remote", "beta_tipAddr_R2_remote", "resGetAlphaRemoteR2", "resGetBetaRemoteR2", "r3_alpha_v4_remote", "r3_beta_v1_remote", "clientKV_R3", "alpha_tipAddr_R3_client", "beta_tipAddr_R3_client", "resGetAlphaClientR3", "resGetBetaClientR3", "r4_alpha_v5_source", "resGamma", "gamma_v0_source", "gamma_tjpAddr", "r4_alpha_v6_source_rel8dGamma", "r4_alpha_v7_source", "r4_beta_v2_source", "alphaLatestAddrRemoteR4", "domainIbGibsRemoteR4", "betaLatestAddrRemoteR4", "resGetBetaRemoteTipR4", "remoteKV_R4", "alpha_tipAddr_R3_remote", "beta_tipAddr_R3_remote", "resGetAlphaRemoteR3", "resGetBetaRemoteR3", "r4_alpha_v5_remote", "r4_beta_v2_remote", "checkBtn", "init4_10bCheckButton", "clientKV", "clientAlphaTipAddr", "clientBetaTipAddr", "clientGammaTipAddr", "resGetAlpha", "resGetBeta", "alphaTip", "betaTip", "rels", "resServerGraphAlpha", "resServerGraphBeta", "serverAlphaTip", "serverBetaTip", "initDevTools", "lc_fn", "lc", "selectEl", "val", "row", "rowId", "initPrintStateButton", "initCreateDomainKeystoneButton", "initWsTestButton", "initCreateTestIbGibButton", "initCreateSessionKeystoneButton", "init1bSetupButton", "init1bSyncButton", "init1bCheckButton", "init2bSetupButton", "init2bSyncButton", "init2bCheckButton", "init3bSetupButton", "init3bSyncButton", "init3bCheckButton", "init4_1bSetupButton", "init4_1bSyncButton", "init4_1bCheckButton", "init4_2bSetupButton", "init4_2bSyncButton", "init4_2bCheckButton", "init4_3bSetupButton", "init4_3bSyncButton", "init4_3bCheckButton", "init4_4bSetupButton", "init4_4bSyncButton", "init4_4bCheckButton", "init4_5bSetupButton", "init4_5bSyncButton", "init4_5bCheckButton", "init4_6bSetupButton", "init4_6bSyncButton", "init4_6bCheckButton", "init4_7bSetupButton", "init4_7bSyncButton", "init4_7bCheckButton", "init4_8bSetupButton", "init4_8bSyncButton", "init4_8bCheckButton", "init4_9bSetupButton", "init4_9bSyncButton", "init4_9bCheckButton", "init4_10bSetupButton", "init4_10bSyncButton", "init4_10bCheckButton", "error", "extractErrorMsg", "__name", "initIbGibGlobalThis", "APP_CONFIG", "logalot", "GLOBAL_LOG_A_LOT", "spinOffStartup", "lc", "initIbGibStorage", "dynamicallyLoadBootstrapScript", "initDevTools", "error", "extractErrorMsg", "__name"]
|
|
7
7
|
}
|