holosphere 2.0.0-alpha5 → 2.0.0-alpha6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/holosphere.cjs +1 -1
- package/dist/esm/holosphere.js +1 -1
- package/dist/index-BtKHqqet.cjs +5 -0
- package/dist/index-BtKHqqet.cjs.map +1 -0
- package/dist/{index-BG8FStkt.cjs → index-CmzkI7SI.cjs} +2 -2
- package/dist/{index-BG8FStkt.cjs.map → index-CmzkI7SI.cjs.map} +1 -1
- package/dist/{index-Cp3xctq8.js → index-JFz-dW43.js} +2 -2
- package/dist/{index-Cp3xctq8.js.map → index-JFz-dW43.js.map} +1 -1
- package/dist/{index-Bbey4GkP.js → index-NOravBLu.js} +239 -116
- package/dist/index-NOravBLu.js.map +1 -0
- package/dist/{indexeddb-storage-BD70pN7q.cjs → indexeddb-storage-C4HsulhA.cjs} +2 -2
- package/dist/{indexeddb-storage-BD70pN7q.cjs.map → indexeddb-storage-C4HsulhA.cjs.map} +1 -1
- package/dist/{indexeddb-storage-Bjg84U5R.js → indexeddb-storage-OtSAVDZY.js} +2 -2
- package/dist/{indexeddb-storage-Bjg84U5R.js.map → indexeddb-storage-OtSAVDZY.js.map} +1 -1
- package/dist/{memory-storage-CD0XFayE.js → memory-storage-ChpcYvxA.js} +2 -2
- package/dist/{memory-storage-CD0XFayE.js.map → memory-storage-ChpcYvxA.js.map} +1 -1
- package/dist/{memory-storage-DmMyJtOo.cjs → memory-storage-MD6ED00P.cjs} +2 -2
- package/dist/{memory-storage-DmMyJtOo.cjs.map → memory-storage-MD6ED00P.cjs.map} +1 -1
- package/dist/{secp256k1-TcN6vWGh.cjs → secp256k1-DcTYQrqC.cjs} +2 -2
- package/dist/{secp256k1-TcN6vWGh.cjs.map → secp256k1-DcTYQrqC.cjs.map} +1 -1
- package/dist/{secp256k1-69sS9O-P.js → secp256k1-PfNOEI7a.js} +2 -2
- package/dist/{secp256k1-69sS9O-P.js.map → secp256k1-PfNOEI7a.js.map} +1 -1
- package/package.json +1 -1
- package/src/contracts/abis/Bundle.json +1438 -1435
- package/src/contracts/deployer.js +32 -3
- package/src/federation/handshake.js +13 -5
- package/src/index.js +9 -1
- package/src/storage/gun-async.js +55 -6
- package/src/storage/gun-auth.js +81 -30
- package/src/storage/gun-wrapper.js +56 -48
- package/src/storage/nostr-client.js +5 -2
- package/dist/index-Bbey4GkP.js.map +0 -1
- package/dist/index-hfVGRwSr.cjs +0 -5
- package/dist/index-hfVGRwSr.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-NOravBLu.js","sources":["../src/storage/outbox-queue.js","../src/storage/sync-service.js","../src/storage/persistent-storage.js","../src/storage/nostr-client.js","../src/storage/backend-factory.js","../src/storage/gun-async.js","../src/storage/gun-wrapper.js","../src/storage/gun-federation.js","../src/storage/backend-interface.js","../src/storage/gun-references.js","../src/storage/gun-auth.js","../src/storage/gun-schema.js","../src/storage/backends/gundb-backend.js","../src/core/holosphere.js","../src/spatial/h3-operations.js","../src/storage/nostr-async.js","../src/storage/nostr-wrapper.js","../src/storage/unified-storage.js","../src/storage/global-tables.js","../src/schema/validator.js","../node_modules/@noble/hashes/esm/crypto.js","../node_modules/@noble/hashes/esm/utils.js","../node_modules/@noble/hashes/esm/_md.js","../node_modules/@noble/hashes/esm/sha2.js","../node_modules/@noble/hashes/esm/sha256.js","../src/crypto/secp256k1.js","../src/federation/registry.js","../src/federation/hologram.js","../src/crypto/nostr-utils.js","../src/federation/handshake.js","../src/content/social-protocols.js","../src/subscriptions/manager.js","../src/hierarchical/upcast.js","../node_modules/openai/internal/qs/formats.mjs","../node_modules/openai/internal/qs/utils.mjs","../node_modules/openai/internal/qs/stringify.mjs","../node_modules/openai/version.mjs","../node_modules/openai/_shims/registry.mjs","../node_modules/openai/_shims/MultipartBody.mjs","../node_modules/openai/_shims/web-runtime.mjs","../node_modules/openai/_shims/index.mjs","../node_modules/openai/error.mjs","../node_modules/openai/internal/decoders/line.mjs","../node_modules/openai/internal/stream-utils.mjs","../node_modules/openai/streaming.mjs","../node_modules/openai/uploads.mjs","../node_modules/openai/core.mjs","../node_modules/openai/pagination.mjs","../node_modules/openai/resource.mjs","../node_modules/openai/resources/chat/completions/messages.mjs","../node_modules/openai/resources/chat/completions/completions.mjs","../node_modules/openai/resources/chat/chat.mjs","../node_modules/openai/resources/audio/speech.mjs","../node_modules/openai/resources/audio/transcriptions.mjs","../node_modules/openai/resources/audio/translations.mjs","../node_modules/openai/resources/audio/audio.mjs","../node_modules/openai/resources/batches.mjs","../node_modules/openai/lib/EventStream.mjs","../node_modules/openai/lib/AssistantStream.mjs","../node_modules/openai/resources/beta/assistants.mjs","../node_modules/openai/lib/RunnableFunction.mjs","../node_modules/openai/lib/chatCompletionUtils.mjs","../node_modules/openai/lib/parser.mjs","../node_modules/openai/lib/AbstractChatCompletionRunner.mjs","../node_modules/openai/lib/ChatCompletionRunner.mjs","../node_modules/openai/_vendor/partial-json-parser/parser.mjs","../node_modules/openai/lib/ChatCompletionStream.mjs","../node_modules/openai/lib/ChatCompletionStreamingRunner.mjs","../node_modules/openai/resources/beta/chat/completions.mjs","../node_modules/openai/resources/beta/chat/chat.mjs","../node_modules/openai/resources/beta/realtime/sessions.mjs","../node_modules/openai/resources/beta/realtime/transcription-sessions.mjs","../node_modules/openai/resources/beta/realtime/realtime.mjs","../node_modules/openai/resources/beta/threads/messages.mjs","../node_modules/openai/resources/beta/threads/runs/steps.mjs","../node_modules/openai/resources/beta/threads/runs/runs.mjs","../node_modules/openai/resources/beta/threads/threads.mjs","../node_modules/openai/resources/beta/beta.mjs","../node_modules/openai/resources/completions.mjs","../node_modules/openai/resources/containers/files/content.mjs","../node_modules/openai/resources/containers/files/files.mjs","../node_modules/openai/resources/containers/containers.mjs","../node_modules/openai/resources/embeddings.mjs","../node_modules/openai/resources/evals/runs/output-items.mjs","../node_modules/openai/resources/evals/runs/runs.mjs","../node_modules/openai/resources/evals/evals.mjs","../node_modules/openai/resources/files.mjs","../node_modules/openai/resources/fine-tuning/methods.mjs","../node_modules/openai/resources/fine-tuning/alpha/graders.mjs","../node_modules/openai/resources/fine-tuning/alpha/alpha.mjs","../node_modules/openai/resources/fine-tuning/checkpoints/permissions.mjs","../node_modules/openai/resources/fine-tuning/checkpoints/checkpoints.mjs","../node_modules/openai/resources/fine-tuning/jobs/checkpoints.mjs","../node_modules/openai/resources/fine-tuning/jobs/jobs.mjs","../node_modules/openai/resources/fine-tuning/fine-tuning.mjs","../node_modules/openai/resources/graders/grader-models.mjs","../node_modules/openai/resources/graders/graders.mjs","../node_modules/openai/resources/images.mjs","../node_modules/openai/resources/models.mjs","../node_modules/openai/resources/moderations.mjs","../node_modules/openai/lib/ResponsesParser.mjs","../node_modules/openai/resources/responses/input-items.mjs","../node_modules/openai/lib/responses/ResponseStream.mjs","../node_modules/openai/resources/responses/responses.mjs","../node_modules/openai/resources/uploads/parts.mjs","../node_modules/openai/resources/uploads/uploads.mjs","../node_modules/openai/lib/Util.mjs","../node_modules/openai/resources/vector-stores/files.mjs","../node_modules/openai/resources/vector-stores/file-batches.mjs","../node_modules/openai/resources/vector-stores/vector-stores.mjs","../node_modules/openai/index.mjs","../src/ai/llm-service.js","../src/ai/schema-extractor.js","../src/ai/json-ops.js","../src/ai/embeddings.js","../src/ai/council.js","../src/ai/tts.js","../src/ai/nl-query.js","../src/ai/classifier.js","../src/ai/spatial.js","../src/ai/aggregation.js","../src/ai/federation-ai.js","../src/ai/relationships.js","../src/ai/breakdown.js","../src/ai/h3-ai.js","../src/contracts/networks.js","../src/contracts/chain-manager.js","../src/contracts/deployer.js","../src/contracts/operations.js","../src/contracts/holon-contracts.js","../src/contracts/event-listener.js","../node_modules/ethers/lib.esm/_version.js","../node_modules/ethers/lib.esm/utils/properties.js","../node_modules/ethers/lib.esm/utils/errors.js","../node_modules/ethers/lib.esm/utils/data.js","../node_modules/ethers/lib.esm/utils/maths.js","../node_modules/ethers/lib.esm/utils/events.js","../node_modules/ethers/lib.esm/utils/utf8.js","../node_modules/ethers/lib.esm/utils/fixednumber.js","../node_modules/ethers/lib.esm/utils/units.js","../node_modules/ethers/lib.esm/abi/coders/abstract-coder.js","../node_modules/ethers/node_modules/@noble/hashes/esm/_assert.js","../node_modules/ethers/node_modules/@noble/hashes/esm/crypto.js","../node_modules/ethers/node_modules/@noble/hashes/esm/utils.js","../node_modules/ethers/node_modules/@noble/hashes/esm/_u64.js","../node_modules/ethers/node_modules/@noble/hashes/esm/sha3.js","../node_modules/ethers/lib.esm/crypto/keccak.js","../node_modules/ethers/lib.esm/constants/addresses.js","../node_modules/ethers/lib.esm/address/address.js","../node_modules/ethers/lib.esm/address/checks.js","../node_modules/ethers/lib.esm/abi/typed.js","../node_modules/ethers/lib.esm/abi/coders/address.js","../node_modules/ethers/lib.esm/abi/coders/anonymous.js","../node_modules/ethers/lib.esm/abi/coders/array.js","../node_modules/ethers/lib.esm/abi/coders/boolean.js","../node_modules/ethers/lib.esm/abi/coders/bytes.js","../node_modules/ethers/lib.esm/abi/coders/fixed-bytes.js","../node_modules/ethers/lib.esm/abi/coders/null.js","../node_modules/ethers/lib.esm/abi/coders/number.js","../node_modules/ethers/lib.esm/abi/coders/string.js","../node_modules/ethers/lib.esm/abi/coders/tuple.js","../node_modules/ethers/lib.esm/transaction/accesslist.js","../node_modules/ethers/lib.esm/hash/id.js","../node_modules/ethers/lib.esm/abi/fragments.js","../node_modules/ethers/lib.esm/abi/abi-coder.js","../node_modules/ethers/lib.esm/abi/interface.js","../node_modules/ethers/lib.esm/providers/provider.js","../node_modules/ethers/lib.esm/contract/wrappers.js","../node_modules/ethers/lib.esm/contract/contract.js","../src/contracts/index.js","../src/contracts/queries.js","../src/lib/ai-methods.js","../src/lib/contract-methods.js","../src/federation/discovery.js","../src/lib/errors.js","../src/lib/federation-methods.js","../src/ai/index.js","../src/index.js"],"sourcesContent":["/**\n * OutboxQueue - Persistent queue for reliable relay delivery\n *\n * Implements guaranteed delivery with exponential backoff retry.\n * Events are persisted to local storage and retried until delivered\n * or max retries exceeded.\n */\n\nexport class OutboxQueue {\n /**\n * @param {Object} persistentStorage - Storage adapter (IndexedDB/FileSystem)\n * @param {Object} options - Configuration options\n * @param {number} options.maxRetries - Max retry attempts (default: 5)\n * @param {number} options.baseDelay - Base delay in ms (default: 1000)\n * @param {number} options.maxDelay - Max delay cap in ms (default: 60000)\n * @param {number} options.failedTTL - TTL for failed events in ms (default: 24 hours)\n */\n constructor(persistentStorage, options = {}) {\n this.storage = persistentStorage;\n this.queuePrefix = '_outbox/';\n this.maxRetries = options.maxRetries || 5;\n this.baseDelay = options.baseDelay || 1000; // 1 second\n this.maxDelay = options.maxDelay || 60000; // 1 minute\n this.failedTTL = options.failedTTL || 24 * 60 * 60 * 1000; // 24 hours\n }\n\n /**\n * Add an event to the outbox queue\n * @param {Object} event - Signed Nostr event\n * @param {string[]} relays - Target relay URLs\n * @returns {Promise<Object>} Queue entry\n */\n async enqueue(event, relays) {\n const entry = {\n id: event.id,\n event,\n relays,\n status: 'pending',\n retries: 0,\n createdAt: Date.now(),\n nextRetryAt: Date.now(),\n failedRelays: [],\n };\n\n const key = `${this.queuePrefix}${event.id}`;\n await this.storage.put(key, entry);\n return entry;\n }\n\n /**\n * Mark an event as sent (removes from queue if successful)\n * @param {string} eventId - Event ID\n * @param {string[]} successfulRelays - Relays that accepted the event\n */\n async markSent(eventId, successfulRelays) {\n const key = `${this.queuePrefix}${eventId}`;\n const entry = await this.storage.get(key);\n if (!entry) return;\n\n if (successfulRelays.length > 0) {\n // At least one relay accepted - remove from queue\n await this.storage.delete(key);\n } else {\n // All relays failed - schedule retry\n await this._scheduleRetry(key, entry);\n }\n }\n\n /**\n * Schedule a retry with exponential backoff\n * @private\n */\n async _scheduleRetry(key, entry) {\n entry.retries++;\n\n if (entry.retries >= this.maxRetries) {\n entry.status = 'failed';\n entry.failedAt = Date.now();\n } else {\n entry.status = 'pending';\n // Exponential backoff with jitter\n const delay = Math.min(\n this.baseDelay * Math.pow(2, entry.retries) + Math.random() * 1000,\n this.maxDelay\n );\n entry.nextRetryAt = Date.now() + delay;\n }\n\n await this.storage.put(key, entry);\n }\n\n /**\n * Get all pending events ready for retry\n * @returns {Promise<Object[]>} Pending queue entries sorted by creation time\n */\n async getPendingEvents() {\n const allEntries = await this.storage.getAll(this.queuePrefix);\n const now = Date.now();\n\n return allEntries\n .filter(e => e && e.status === 'pending' && e.nextRetryAt <= now)\n .sort((a, b) => a.createdAt - b.createdAt);\n }\n\n /**\n * Get all failed events (exceeded max retries)\n * @returns {Promise<Object[]>} Failed queue entries\n */\n async getFailedEvents() {\n const allEntries = await this.storage.getAll(this.queuePrefix);\n return allEntries.filter(e => e && e.status === 'failed');\n }\n\n /**\n * Get queue statistics\n * @returns {Promise<Object>} Stats object\n */\n async getStats() {\n const allEntries = await this.storage.getAll(this.queuePrefix);\n\n const stats = {\n total: allEntries.length,\n pending: 0,\n failed: 0,\n oldestPending: null,\n oldestFailed: null,\n };\n\n for (const entry of allEntries) {\n if (!entry) continue;\n\n if (entry.status === 'pending') {\n stats.pending++;\n if (!stats.oldestPending || entry.createdAt < stats.oldestPending) {\n stats.oldestPending = entry.createdAt;\n }\n } else if (entry.status === 'failed') {\n stats.failed++;\n if (!stats.oldestFailed || entry.failedAt < stats.oldestFailed) {\n stats.oldestFailed = entry.failedAt;\n }\n }\n }\n\n return stats;\n }\n\n /**\n * Purge failed events older than maxAge\n * @param {number} maxAge - Max age in ms (default: 24 hours)\n * @returns {Promise<number>} Number of entries purged\n */\n async purgeOldFailed(maxAge = this.failedTTL) {\n const allEntries = await this.storage.getAll(this.queuePrefix);\n const now = Date.now();\n let purged = 0;\n\n for (const entry of allEntries) {\n if (entry && entry.status === 'failed' && (now - entry.failedAt) > maxAge) {\n await this.storage.delete(`${this.queuePrefix}${entry.id}`);\n purged++;\n }\n }\n\n return purged;\n }\n\n /**\n * Clear all entries from the queue\n * @returns {Promise<number>} Number of entries cleared\n */\n async clear() {\n const allEntries = await this.storage.getAll(this.queuePrefix);\n let cleared = 0;\n\n for (const entry of allEntries) {\n if (entry && entry.id) {\n await this.storage.delete(`${this.queuePrefix}${entry.id}`);\n cleared++;\n }\n }\n\n return cleared;\n }\n\n /**\n * Manually retry a failed event\n * @param {string} eventId - Event ID to retry\n * @returns {Promise<Object|null>} Updated entry or null if not found\n */\n async retryFailed(eventId) {\n const key = `${this.queuePrefix}${eventId}`;\n const entry = await this.storage.get(key);\n\n if (!entry || entry.status !== 'failed') {\n return null;\n }\n\n // Reset for retry\n entry.status = 'pending';\n entry.retries = 0;\n entry.nextRetryAt = Date.now();\n delete entry.failedAt;\n\n await this.storage.put(key, entry);\n return entry;\n }\n}\n","/**\n * SyncService - Background service for reliable sync\n *\n * Periodically processes the outbox queue to retry failed deliveries\n * and purge old failed events.\n */\n\nexport class SyncService {\n /**\n * @param {Object} client - NostrClient instance\n * @param {Object} options - Configuration options\n * @param {number} options.interval - Sync interval in ms (default: 10000)\n * @param {boolean} options.autoStart - Start automatically (default: false)\n */\n constructor(client, options = {}) {\n this.client = client;\n this.interval = options.interval || 10000; // 10 seconds\n this.running = false;\n this.timer = null;\n this._processing = false;\n\n if (options.autoStart) {\n this.start();\n }\n }\n\n /**\n * Start the background sync service\n */\n start() {\n if (this.running) return;\n this.running = true;\n this._scheduleNextRun();\n }\n\n /**\n * Stop the background sync service\n */\n stop() {\n this.running = false;\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n\n /**\n * Check if the service is running\n * @returns {boolean}\n */\n isRunning() {\n return this.running;\n }\n\n /**\n * Force an immediate sync (useful for testing or manual trigger)\n * @returns {Promise<Object>} Sync result\n */\n async syncNow() {\n return this._processOutbox();\n }\n\n /**\n * Schedule the next run\n * @private\n */\n _scheduleNextRun() {\n if (!this.running) return;\n\n this.timer = setTimeout(() => {\n this._runLoop();\n }, this.interval);\n }\n\n /**\n * Main loop iteration\n * @private\n */\n async _runLoop() {\n if (!this.running) return;\n\n try {\n await this._processOutbox();\n } catch (error) {\n console.warn('[sync] Outbox processing failed:', error.message);\n }\n\n // Schedule next run\n this._scheduleNextRun();\n }\n\n /**\n * Process pending events in the outbox\n * @private\n * @returns {Promise<Object>} Processing result\n */\n async _processOutbox() {\n // Prevent concurrent processing\n if (this._processing) {\n return { skipped: true, reason: 'already processing' };\n }\n\n this._processing = true;\n\n const result = {\n processed: 0,\n succeeded: 0,\n failed: 0,\n purged: 0,\n };\n\n try {\n if (!this.client.outboxQueue) {\n return { ...result, skipped: true, reason: 'no outbox queue' };\n }\n\n // Get pending events ready for retry\n const pending = await this.client.outboxQueue.getPendingEvents();\n result.processed = pending.length;\n\n // Process each pending event\n for (const entry of pending) {\n try {\n const deliveryResult = await this.client._attemptDelivery(entry.event, entry.relays);\n\n if (deliveryResult.successful.length > 0) {\n result.succeeded++;\n } else {\n result.failed++;\n }\n } catch (error) {\n console.warn(`[sync] Retry failed for ${entry.id}:`, error.message);\n result.failed++;\n }\n }\n\n // Purge old failed events (24 hour TTL)\n result.purged = await this.client.outboxQueue.purgeOldFailed();\n\n } finally {\n this._processing = false;\n }\n\n return result;\n }\n\n /**\n * Get sync service statistics\n * @returns {Promise<Object>} Stats including queue status\n */\n async getStats() {\n const stats = {\n running: this.running,\n interval: this.interval,\n queue: null,\n };\n\n if (this.client.outboxQueue) {\n stats.queue = await this.client.outboxQueue.getStats();\n }\n\n return stats;\n }\n}\n","/**\n * Persistent Storage Interface\n * Provides a unified API for local persistence across browser and Node.js\n */\n\n/**\n * Base class for persistent storage adapters\n */\nclass PersistentStorage {\n /**\n * Initialize storage\n * @param {string} namespace - Storage namespace (appName)\n * @returns {Promise<void>}\n */\n async init(namespace) {\n throw new Error('init() must be implemented by subclass');\n }\n\n /**\n * Store event\n * @param {string} key - Event ID or d-tag\n * @param {Object} event - Nostr event\n * @returns {Promise<void>}\n */\n async put(key, event) {\n throw new Error('put() must be implemented by subclass');\n }\n\n /**\n * Retrieve event\n * @param {string} key - Event ID or d-tag\n * @returns {Promise<Object|null>} Event or null\n */\n async get(key) {\n throw new Error('get() must be implemented by subclass');\n }\n\n /**\n * Get all events matching prefix\n * @param {string} prefix - Key prefix\n * @returns {Promise<any[]>} Array of events\n */\n async getAll(prefix) {\n throw new Error('getAll() must be implemented by subclass');\n }\n\n /**\n * Delete event\n * @param {string} key - Event ID or d-tag\n * @returns {Promise<void>}\n */\n async delete(key) {\n throw new Error('delete() must be implemented by subclass');\n }\n\n /**\n * Clear all data in namespace\n * @returns {Promise<void>}\n */\n async clear() {\n throw new Error('clear() must be implemented by subclass');\n }\n\n /**\n * Close storage\n * @returns {Promise<void>}\n */\n async close() {\n throw new Error('close() must be implemented by subclass');\n }\n}\n\n/**\n * Detect environment and return appropriate storage adapter\n * @param {string} namespace - Storage namespace\n * @param {Object} options - Storage options\n * @returns {Promise<PersistentStorage>} Storage instance\n */\nasync function createPersistentStorage(namespace, options = {}) {\n // Detect environment\n const isBrowser = typeof window !== 'undefined' && typeof window.indexedDB !== 'undefined';\n const isNode = typeof process !== 'undefined' && process.versions && process.versions.node;\n\n if (isBrowser) {\n // Use IndexedDB in browser\n const { IndexedDBStorage } = await import('./indexeddb-storage.js');\n const storage = new IndexedDBStorage();\n await storage.init(namespace);\n return storage;\n } else if (isNode) {\n // Use file system in Node.js\n try {\n const { FileSystemStorage } = await import('./filesystem-storage.js');\n const storage = new FileSystemStorage(options.dataDir);\n await storage.init(namespace);\n return storage;\n } catch (error) {\n // Fall back to memory storage if filesystem module fails to load\n console.warn('FileSystemStorage not available, using MemoryStorage instead');\n const { MemoryStorage } = await import('./memory-storage.js');\n const storage = new MemoryStorage();\n await storage.init(namespace);\n return storage;\n }\n } else {\n // Fallback to memory-only storage\n const { MemoryStorage } = await import('./memory-storage.js');\n const storage = new MemoryStorage();\n await storage.init(namespace);\n return storage;\n }\n}\n\nexport { PersistentStorage, createPersistentStorage };\n","/**\n * Nostr Client - SimplePool wrapper for relay management\n * Provides connection pooling and relay management\n */\n\nimport { SimplePool, finalizeEvent, getPublicKey } from 'nostr-tools';\nimport { OutboxQueue } from './outbox-queue.js';\nimport { SyncService } from './sync-service.js';\n\n// Global pool singleton - reuse connections across NostrClient instances\nlet globalPool = null;\nlet globalPoolRelays = new Set();\n\n/**\n * Get or create global SimplePool singleton\n * This ensures WebSocket connections are reused across all operations\n */\nfunction getGlobalPool(config = {}) {\n if (!globalPool) {\n globalPool = new SimplePool({\n enableReconnect: config.enableReconnect !== false,\n enablePing: config.enablePing !== false,\n });\n }\n return globalPool;\n}\n\n// Global pending queries map for deduplication\n// Key: JSON-stringified filter, Value: { promise, timestamp }\nconst pendingQueries = new Map();\nconst PENDING_QUERY_TIMEOUT = 5000; // 5 seconds\n\n// Global active subscriptions map for subscription deduplication\n// Key: JSON-stringified filter, Value: { subscription, callbacks: Set, refCount }\nconst activeSubscriptions = new Map();\n\n// Throttle background refreshes to avoid flooding the relay\n// Key: path, Value: timestamp of last refresh\nconst backgroundRefreshThrottle = new Map();\nconst BACKGROUND_REFRESH_INTERVAL = 30000; // Only refresh same path every 30 seconds\n\n// Write debouncing for rapid updates to the same path\n// Key: d-tag path, Value: { event, timer, resolve, reject }\nconst pendingWrites = new Map();\nconst WRITE_DEBOUNCE_MS = 500; // Debounce writes within 500ms window\n\n// Long-lived subscription manager - keeps ONE subscription per author for real-time updates\n// Key: pubkey, Value: { subscription, lastEventTime, initialized }\nconst authorSubscriptions = new Map();\nconst AUTHOR_SUB_INIT_TIMEOUT = 5000; // Wait up to 5s for initial data load\n\n/**\n * Simple LRU Cache implementation\n * Automatically evicts least recently used entries when max size is reached\n */\nclass LRUCache {\n constructor(maxSize = 500) {\n this.maxSize = maxSize;\n this.cache = new Map();\n }\n\n get(key) {\n if (!this.cache.has(key)) return undefined;\n\n // Move to end (most recently used)\n const value = this.cache.get(key);\n this.cache.delete(key);\n this.cache.set(key, value);\n return value;\n }\n\n set(key, value) {\n // If key exists, delete it first to update position\n if (this.cache.has(key)) {\n this.cache.delete(key);\n }\n\n this.cache.set(key, value);\n\n // Evict oldest entries if over capacity\n while (this.cache.size > this.maxSize) {\n const oldestKey = this.cache.keys().next().value;\n this.cache.delete(oldestKey);\n }\n }\n\n has(key) {\n return this.cache.has(key);\n }\n\n delete(key) {\n return this.cache.delete(key);\n }\n\n clear() {\n this.cache.clear();\n }\n\n get size() {\n return this.cache.size;\n }\n\n keys() {\n return this.cache.keys();\n }\n\n values() {\n return this.cache.values();\n }\n\n entries() {\n return this.cache.entries();\n }\n\n forEach(callback) {\n this.cache.forEach(callback);\n }\n}\n\n// Lazy-load WebSocket polyfill for Node.js environment\nlet webSocketPolyfillPromise = null;\nfunction ensureWebSocket() {\n if (typeof globalThis.WebSocket !== 'undefined') {\n return Promise.resolve();\n }\n\n if (!webSocketPolyfillPromise) {\n webSocketPolyfillPromise = (async () => {\n try {\n const { default: WebSocket } = await import('ws');\n globalThis.WebSocket = WebSocket;\n } catch (e) {\n // WebSocket polyfill not available, will use mock pool\n }\n })();\n }\n\n return webSocketPolyfillPromise;\n}\nimport { createPersistentStorage } from './persistent-storage.js';\n\n/**\n * NostrClient - Manages connections to Nostr relays\n */\nexport class NostrClient {\n /**\n * @param {Object} config - Configuration options\n * @param {string[]} config.relays - Array of relay URLs\n * @param {string} config.privateKey - Private key for signing (hex format)\n * @param {boolean} config.enableReconnect - Auto-reconnect on disconnect (default: true)\n * @param {boolean} config.enablePing - Auto-ping relays (default: true)\n * @param {string} config.appName - Application name for storage namespace\n * @param {boolean} config.persistence - Enable persistent storage (default: true)\n */\n constructor(config = {}) {\n if (config.relays && !Array.isArray(config.relays)) {\n throw new Error('Relays must be an array');\n }\n\n this.relays = config.relays || [];\n\n // Generate or use provided private key\n // IMPORTANT: If you want keys to persist across restarts, you MUST provide\n // a privateKey in config. Otherwise, a new key is generated each time.\n this.privateKey = config.privateKey || this._generatePrivateKey();\n this.publicKey = getPublicKey(this.privateKey);\n this.config = config;\n\n this._subscriptions = new Map();\n this._eventCache = new LRUCache(config.cacheSize || 500); // LRU cache for recent events\n this._cacheIndex = new Map(); // Reverse index: kind -> Set of cache keys affected by that kind\n this.persistentStorage = null;\n\n // Batched persistent writes for better I/O performance\n this._persistQueue = new Map(); // path -> event\n this._persistTimer = null;\n this._persistBatchMs = config.persistBatchMs || 100; // Batch writes within 100ms window\n\n // Initialize pool and storage asynchronously\n this._initReady = this._initialize();\n }\n\n /**\n * Initialize WebSocket polyfill and pool\n * @private\n */\n async _initialize() {\n // Ensure WebSocket is available before initializing pool\n await ensureWebSocket();\n\n // Initialize SimplePool with options (only if relays exist)\n if (this.relays.length > 0) {\n // Use global pool singleton to reuse WebSocket connections\n this.pool = getGlobalPool(this.config);\n\n // Track relays used by this client\n this.relays.forEach(r => globalPoolRelays.add(r));\n } else {\n // Mock pool for testing - returns mock promise that resolves immediately\n this.pool = {\n publish: (relays, event) => [Promise.resolve()],\n querySync: (relays, filter, options) => Promise.resolve([]),\n subscribeMany: (relays, filters, opts) => ({ close: () => {} }),\n close: (relays) => {},\n };\n }\n\n // Initialize persistent storage\n await this._initPersistentStorage();\n\n // Start long-lived subscription for real-time cache updates\n if (this.relays.length > 0) {\n this._initLongLivedSubscription();\n }\n }\n\n /**\n * Initialize a long-lived subscription to keep cache fresh\n * This replaces polling with a single persistent subscription\n * @private\n */\n _initLongLivedSubscription() {\n const subKey = this.publicKey;\n\n // Check if subscription already exists for this author\n if (authorSubscriptions.has(subKey)) {\n return;\n }\n\n const subInfo = {\n subscription: null,\n initialized: false,\n initPromise: null,\n initResolve: null,\n };\n\n // Create promise for initial load completion\n subInfo.initPromise = new Promise(resolve => {\n subInfo.initResolve = resolve;\n });\n\n authorSubscriptions.set(subKey, subInfo);\n\n // Subscribe to ALL events for this author (kind 30000)\n // This single subscription replaces all the polling queries\n const filter = {\n kinds: [30000],\n authors: [this.publicKey],\n };\n\n const sub = this.pool.subscribeMany(\n this.relays,\n [filter],\n {\n onevent: (event) => {\n // Verify author (relay may not respect filter)\n if (event.pubkey !== this.publicKey) {\n return;\n }\n\n // Cache the event - this keeps our local cache in sync\n this._cacheEvent(event);\n },\n oneose: () => {\n // End of stored events - initial load complete\n if (!subInfo.initialized) {\n subInfo.initialized = true;\n subInfo.initResolve();\n }\n },\n }\n );\n\n subInfo.subscription = sub;\n\n // Set timeout for initial load in case EOSE never arrives\n setTimeout(() => {\n if (!subInfo.initialized) {\n subInfo.initialized = true;\n subInfo.initResolve();\n }\n }, AUTHOR_SUB_INIT_TIMEOUT);\n }\n\n /**\n * Wait for long-lived subscription to complete initial load\n * @private\n */\n async _waitForSubscriptionInit() {\n const subInfo = authorSubscriptions.get(this.publicKey);\n if (subInfo && subInfo.initPromise) {\n await subInfo.initPromise;\n }\n }\n\n /**\n * Initialize persistent storage\n * @private\n */\n async _initPersistentStorage() {\n // Only enable persistence if explicitly requested or radisk is true\n if (this.config.persistence !== false && (this.config.radisk || this.config.appName)) {\n try {\n const namespace = this.config.appName || 'holosphere_default';\n this.persistentStorage = await createPersistentStorage(namespace, {\n dataDir: this.config.dataDir\n });\n\n // Load cached events from persistent storage\n await this._loadFromPersistentStorage();\n\n // Initialize outbox queue for guaranteed delivery\n this.outboxQueue = new OutboxQueue(this.persistentStorage, {\n maxRetries: this.config.maxRetries || 5,\n baseDelay: this.config.retryBaseDelay || 1000,\n maxDelay: this.config.retryMaxDelay || 60000,\n failedTTL: this.config.failedTTL || 24 * 60 * 60 * 1000, // 24 hours\n });\n\n // Start background sync service\n if (this.config.backgroundSync !== false) {\n this.syncService = new SyncService(this, {\n interval: this.config.syncInterval || 10000, // 10 seconds\n autoStart: true,\n });\n }\n } catch (error) {\n console.warn('Failed to initialize persistent storage:', error);\n // Continue without persistence\n }\n }\n }\n\n /**\n * Load events from persistent storage into cache\n * @private\n */\n async _loadFromPersistentStorage() {\n if (!this.persistentStorage) return;\n\n try {\n // Load all events (excluding outbox queue entries)\n const events = await this.persistentStorage.getAll('');\n for (const event of events) {\n // Skip outbox queue entries\n if (event && event.id && !event.status) {\n // Add to cache\n this._cacheEventSync(event);\n }\n }\n } catch (error) {\n console.warn('Failed to load from persistent storage:', error);\n }\n }\n\n /**\n * Get a single event from persistent storage by path (d-tag)\n * @param {string} path - The d-tag path to look up\n * @returns {Promise<Object|null>} The event or null if not found\n */\n async persistentGet(path) {\n await this._initReady;\n if (!this.persistentStorage) return null;\n try {\n const event = await this.persistentStorage.get(path);\n return event || null;\n } catch (error) {\n console.warn('[nostr] Persistent storage read failed:', error);\n return null;\n }\n }\n\n /**\n * Get all events from persistent storage matching a prefix\n * @param {string} prefix - The path prefix to match\n * @returns {Promise<Array>} Array of events\n */\n async persistentGetAll(prefix) {\n await this._initReady;\n if (!this.persistentStorage) return [];\n try {\n const events = await this.persistentStorage.getAll(prefix);\n // Filter out outbox queue entries and null values\n return events.filter(e => e && e.id && !e.status);\n } catch (error) {\n console.warn('[nostr] Persistent storage read failed:', error);\n return [];\n }\n }\n\n /**\n * Generate random private key\n * @private\n */\n _generatePrivateKey() {\n const bytes = new Uint8Array(32);\n if (typeof window !== 'undefined' && window.crypto) {\n window.crypto.getRandomValues(bytes);\n } else {\n // Node.js - use dynamic import\n try {\n // Use crypto.randomFillSync if available\n const crypto = globalThis.crypto || global.crypto;\n if (crypto && crypto.getRandomValues) {\n crypto.getRandomValues(bytes);\n } else {\n // Fallback to Math.random (less secure, but works in testing)\n for (let i = 0; i < 32; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n }\n } catch (e) {\n // Fallback to Math.random\n for (let i = 0; i < 32; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n }\n }\n return Array.from(bytes)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n }\n\n /**\n * Publish event to relays\n * Supports debouncing for replaceable events (kind 30000-39999) to avoid rapid updates\n * @param {Object} event - Unsigned event object\n * @param {Object} options - Publish options\n * @param {boolean} options.waitForRelays - Wait for relay confirmation (default: false for speed)\n * @param {boolean} options.debounce - Debounce rapid writes to same d-tag (default: true for replaceable events)\n * @returns {Promise<Object>} Signed event with relay publish results\n */\n async publish(event, options = {}) {\n // Ensure initialization is complete\n await this._initReady;\n\n const waitForRelays = options.waitForRelays || false;\n\n // For replaceable events, check if we should debounce\n const isReplaceable = event.kind >= 30000 && event.kind < 40000;\n const shouldDebounce = isReplaceable && options.debounce !== false && !waitForRelays;\n\n if (shouldDebounce) {\n const dTag = event.tags?.find(t => t[0] === 'd');\n if (dTag && dTag[1]) {\n return this._debouncedPublish(event, dTag[1], options);\n }\n }\n\n return this._doPublish(event, options);\n }\n\n /**\n * Debounced publish - coalesces rapid writes to the same d-tag\n * @private\n */\n _debouncedPublish(event, dTagPath, options) {\n return new Promise((resolve, reject) => {\n const existing = pendingWrites.get(dTagPath);\n\n if (existing) {\n // Cancel previous pending write and use the new one\n clearTimeout(existing.timer);\n // Resolve the previous promise with the new event (it will be superseded)\n existing.resolve({\n event: null,\n results: [],\n debounced: true,\n supersededBy: event,\n });\n }\n\n // Set up debounced write\n const timer = setTimeout(async () => {\n pendingWrites.delete(dTagPath);\n try {\n const result = await this._doPublish(event, options);\n resolve(result);\n } catch (err) {\n reject(err);\n }\n }, WRITE_DEBOUNCE_MS);\n\n pendingWrites.set(dTagPath, { event, timer, resolve, reject });\n\n // Cache immediately for local-first reads (even before relay publish)\n const signedEvent = finalizeEvent(event, this.privateKey);\n this._cacheEvent(signedEvent);\n });\n }\n\n /**\n * Internal publish implementation\n * @private\n */\n async _doPublish(event, options = {}) {\n const waitForRelays = options.waitForRelays || false;\n\n // Check if event is already signed (has id and sig)\n // If so, use it as-is; otherwise sign it\n const signedEvent = (event.id && event.sig)\n ? event\n : finalizeEvent(event, this.privateKey);\n\n // 1. Cache the event locally first (this makes reads instant)\n await this._cacheEvent(signedEvent);\n\n // 2. Enqueue for guaranteed delivery (if outbox queue available)\n if (this.outboxQueue) {\n await this.outboxQueue.enqueue(signedEvent, this.relays);\n }\n\n // 3. Publish to relays\n if (waitForRelays) {\n // Wait for relay confirmation if explicitly requested\n const deliveryResult = await this._attemptDelivery(signedEvent, this.relays);\n\n return {\n event: signedEvent,\n results: deliveryResult.results,\n queued: !!this.outboxQueue,\n };\n } else {\n // Fire and forget - publish in background, return immediately\n this._attemptDelivery(signedEvent, this.relays).catch(() => {\n // Silent - event is cached locally and queued for retry\n });\n\n // Return immediately (data is in local cache and queued for delivery)\n return {\n event: signedEvent,\n results: [],\n queued: !!this.outboxQueue,\n };\n }\n }\n\n /**\n * Attempt to deliver event to relays\n * Updates outbox queue with delivery status\n * @param {Object} event - Signed event to deliver\n * @param {string[]} relays - Target relay URLs\n * @returns {Promise<Object>} Delivery result with successful/failed relays\n */\n async _attemptDelivery(event, relays) {\n const results = await Promise.allSettled(\n this.pool.publish(relays, event)\n );\n\n const successful = [];\n const failed = [];\n const formattedResults = [];\n\n results.forEach((r, i) => {\n formattedResults.push({\n relay: relays[i],\n status: r.status,\n value: r.value,\n reason: r.reason,\n });\n\n if (r.status === 'fulfilled') {\n successful.push(relays[i]);\n } else {\n failed.push(relays[i]);\n }\n });\n\n // Update outbox queue with delivery status\n if (this.outboxQueue) {\n await this.outboxQueue.markSent(event.id, successful);\n }\n\n // Log failures only at debug level (common during network issues)\n if (failed.length > 0 && successful.length === 0) {\n // Only warn if ALL relays failed (likely a real issue)\n const reasons = results\n .filter(r => r.status === 'rejected')\n .map(f => f.reason?.message || f.reason || 'unknown')\n .join(', ');\n // Use debug level for timeout issues (very common)\n if (reasons.includes('timed out')) {\n // Silent - event is queued for retry anyway\n } else {\n console.warn(`[nostr] All relays failed for ${event.id.slice(0, 8)}: ${reasons}`);\n }\n }\n\n return { successful, failed, results: formattedResults };\n }\n\n /**\n * Query events from relays\n * Uses long-lived subscription for cache updates - avoids polling\n * @param {Object} filter - Nostr filter object\n * @param {Object} options - Query options\n * @param {number} options.timeout - Query timeout in ms (default: 30000, set to 0 for no timeout)\n * @param {boolean} options.localFirst - Return local cache immediately, refresh in background (default: true)\n * @param {boolean} options.forceRelay - Force relay query even if subscription cache is available (default: false)\n * @returns {Promise<Array>} Array of events\n */\n async query(filter, options = {}) {\n // Ensure initialization is complete\n await this._initReady;\n\n const timeout = options.timeout !== undefined ? options.timeout : 30000;\n const localFirst = options.localFirst !== false; // Default to true for speed\n const forceRelay = options.forceRelay === true;\n\n // If no relays, query from cache only\n if (this.relays.length === 0) {\n const matchingEvents = this._getMatchingCachedEvents(filter);\n return matchingEvents;\n }\n\n // Check if this query can be served from the long-lived subscription cache\n // The subscription keeps ALL events for this author in cache, updated in real-time\n const subInfo = authorSubscriptions.get(this.publicKey);\n const isOwnDataQuery = filter.authors &&\n filter.authors.length === 1 &&\n filter.authors[0] === this.publicKey;\n\n // If we have an initialized subscription for our own data, use cache\n if (!forceRelay && isOwnDataQuery && subInfo && subInfo.initialized) {\n // Return matching events from cache - no relay query needed!\n const matchingEvents = this._getMatchingCachedEvents(filter);\n return matchingEvents;\n }\n\n // For first query before subscription initializes, wait briefly\n if (isOwnDataQuery && subInfo && !subInfo.initialized) {\n // Wait for subscription to initialize (up to timeout)\n await Promise.race([\n subInfo.initPromise,\n new Promise(resolve => setTimeout(resolve, Math.min(timeout, AUTHOR_SUB_INIT_TIMEOUT)))\n ]);\n\n // Now try cache again\n if (subInfo.initialized) {\n const matchingEvents = this._getMatchingCachedEvents(filter);\n return matchingEvents;\n }\n }\n\n // Check d-tag cache first for single-item queries (most common case)\n // This ensures recently written data is returned immediately\n if (filter['#d'] && filter['#d'].length === 1 && filter.kinds && filter.kinds.length === 1) {\n const dTagKey = `d:${filter.kinds[0]}:${filter['#d'][0]}`;\n const dTagCached = this._eventCache.get(dTagKey);\n if (dTagCached && Date.now() - dTagCached.timestamp < 5000) {\n return dTagCached.events;\n }\n }\n\n const cacheKey = JSON.stringify(filter);\n const cached = this._eventCache.get(cacheKey);\n\n // Return fresh cache immediately\n if (cached && Date.now() - cached.timestamp < 5000) {\n return cached.events;\n }\n\n // If we have stale cache and localFirst is enabled, return it immediately\n // and refresh in background\n if (localFirst && cached) {\n // Refresh cache in background\n this._refreshCacheInBackground(filter, cacheKey, timeout);\n return cached.events;\n }\n\n // No cache available or localFirst disabled - must query relays\n return this._queryRelaysAndCache(filter, cacheKey, timeout);\n }\n\n /**\n * Query relays and update cache\n * Uses global pending queries map to deduplicate identical concurrent queries\n * @private\n */\n async _queryRelaysAndCache(filter, cacheKey, timeout) {\n // Check if there's already a pending query for this exact filter\n const pending = pendingQueries.get(cacheKey);\n if (pending && Date.now() - pending.timestamp < PENDING_QUERY_TIMEOUT) {\n // Reuse the pending query promise instead of creating a new one\n return pending.promise;\n }\n\n // Create the query promise\n const queryPromise = (async () => {\n try {\n let events = await this.pool.querySync(this.relays, filter, { timeout });\n\n // CRITICAL: Filter out events from other authors (relay may not respect filter)\n if (filter.authors && filter.authors.length > 0) {\n events = events.filter(event => filter.authors.includes(event.pubkey));\n }\n\n // Cache results\n this._eventCache.set(cacheKey, {\n events,\n timestamp: Date.now(),\n });\n\n // Update reverse index for fast invalidation\n this._indexCacheEntry(cacheKey, filter);\n\n return events;\n } finally {\n // Clean up pending query after completion\n pendingQueries.delete(cacheKey);\n }\n })();\n\n // Store the pending query\n pendingQueries.set(cacheKey, {\n promise: queryPromise,\n timestamp: Date.now(),\n });\n\n return queryPromise;\n }\n\n /**\n * Limit cache size (called after cache operations)\n * Note: LRU cache handles this automatically, kept for API compatibility\n * @private\n */\n _limitCacheSize() {\n // LRU cache handles size limiting automatically\n }\n\n /**\n * Add cache entry to reverse index for fast invalidation\n * @private\n */\n _indexCacheEntry(cacheKey, filter) {\n // Index by kinds for fast lookup during invalidation\n if (filter.kinds) {\n for (const kind of filter.kinds) {\n if (!this._cacheIndex.has(kind)) {\n this._cacheIndex.set(kind, new Set());\n }\n this._cacheIndex.get(kind).add(cacheKey);\n }\n }\n }\n\n /**\n * Remove cache entry from reverse index\n * @private\n */\n _unindexCacheEntry(cacheKey) {\n // Try to parse the filter from the cache key to remove from index\n if (!cacheKey.startsWith('{')) return;\n\n try {\n const filter = JSON.parse(cacheKey);\n if (filter.kinds) {\n for (const kind of filter.kinds) {\n const indexSet = this._cacheIndex.get(kind);\n if (indexSet) {\n indexSet.delete(cacheKey);\n if (indexSet.size === 0) {\n this._cacheIndex.delete(kind);\n }\n }\n }\n }\n } catch {\n // Not a valid filter key, skip\n }\n }\n\n /**\n * Refresh cache in background (fire and forget)\n * @private\n */\n _refreshCacheInBackground(filter, cacheKey, timeout) {\n this._queryRelaysAndCache(filter, cacheKey, timeout).catch(err => {\n // Silently ignore background refresh errors - we have stale cache as fallback\n console.debug('[nostr] Background cache refresh failed:', err.message);\n });\n }\n\n /**\n * Refresh a single path from relays in the background\n * Used for persistent-first reads to update local data\n * @param {string} path - The d-tag path to refresh\n * @param {number} kind - Event kind (default: 30000)\n * @param {Object} options - Query options\n */\n refreshPathInBackground(path, kind = 30000, options = {}) {\n this._doBackgroundPathRefresh(path, kind, options).catch(err => {\n console.debug('[nostr] Background path refresh failed:', err.message);\n });\n }\n\n /**\n * Internal method to refresh a path from relays\n * Throttled to avoid flooding the relay with repeated requests\n * @private\n */\n async _doBackgroundPathRefresh(path, kind, options) {\n if (this.relays.length === 0) return;\n\n // Throttle: Skip if we've refreshed this path recently\n const lastRefresh = backgroundRefreshThrottle.get(path);\n if (lastRefresh && Date.now() - lastRefresh < BACKGROUND_REFRESH_INTERVAL) {\n return; // Skip - recently refreshed\n }\n\n // Mark as refreshed\n backgroundRefreshThrottle.set(path, Date.now());\n\n // Clean up old throttle entries periodically (keep map from growing)\n if (backgroundRefreshThrottle.size > 1000) {\n const cutoff = Date.now() - BACKGROUND_REFRESH_INTERVAL;\n for (const [key, timestamp] of backgroundRefreshThrottle) {\n if (timestamp < cutoff) {\n backgroundRefreshThrottle.delete(key);\n }\n }\n }\n\n const filter = {\n kinds: [kind],\n authors: options.authors || [this.publicKey],\n '#d': [path],\n limit: 1,\n };\n const cacheKey = JSON.stringify(filter);\n\n // Use our query deduplication by calling query() instead of pool.querySync() directly\n const timeout = options.timeout || 30000;\n const events = await this._queryRelaysAndCache(filter, cacheKey, timeout);\n\n // Filter by author (relays may not respect filter)\n const authorFiltered = events.filter(e =>\n (options.authors || [this.publicKey]).includes(e.pubkey)\n );\n\n if (authorFiltered.length > 0) {\n // Update cache and persistent storage\n await this._cacheEvent(authorFiltered[0]);\n }\n }\n\n /**\n * Refresh all paths with a prefix from relays in the background\n * Used for persistent-first collection reads\n * @param {string} prefix - The d-tag prefix to refresh\n * @param {number} kind - Event kind (default: 30000)\n * @param {Object} options - Query options\n */\n refreshPrefixInBackground(prefix, kind = 30000, options = {}) {\n this._doBackgroundPrefixRefresh(prefix, kind, options).catch(err => {\n console.debug('[nostr] Background prefix refresh failed:', err.message);\n });\n }\n\n /**\n * Internal method to refresh a prefix from relays\n * Throttled to avoid flooding the relay with repeated requests\n * @private\n */\n async _doBackgroundPrefixRefresh(prefix, kind, options) {\n if (this.relays.length === 0) return;\n\n // Throttle: Skip if we've refreshed this prefix recently\n const throttleKey = `prefix:${prefix}`;\n const lastRefresh = backgroundRefreshThrottle.get(throttleKey);\n if (lastRefresh && Date.now() - lastRefresh < BACKGROUND_REFRESH_INTERVAL) {\n return; // Skip - recently refreshed\n }\n\n // Mark as refreshed\n backgroundRefreshThrottle.set(throttleKey, Date.now());\n\n // Query with wildcard-ish filter (relays handle d-tag prefix matching)\n const filter = {\n kinds: [kind],\n authors: options.authors || [this.publicKey],\n limit: options.limit || 1000,\n };\n const cacheKey = JSON.stringify(filter);\n\n // Use our query deduplication\n const timeout = options.timeout || 30000;\n let events = await this._queryRelaysAndCache(filter, cacheKey, timeout);\n\n // Filter by author (already done by _queryRelaysAndCache, but double-check)\n events = events.filter(e =>\n (options.authors || [this.publicKey]).includes(e.pubkey)\n );\n\n // Filter by d-tag prefix (client-side since relays don't support prefix matching)\n events = events.filter(e => {\n const dTag = e.tags.find(t => t[0] === 'd');\n return dTag && dTag[1] && dTag[1].startsWith(prefix);\n });\n\n // Update cache and persistent storage for each event\n for (const event of events) {\n await this._cacheEvent(event);\n }\n }\n\n /**\n * Hybrid query: Check local cache first, then query relays for missing data\n * Merges local and relay results, preferring newer events\n * @param {Object} filter - Nostr filter object\n * @param {Object} options - Query options\n * @param {number} options.timeout - Query timeout in ms (default: 30000)\n * @returns {Promise<Array>} Array of events (merged from local + relay)\n */\n async queryHybrid(filter, options = {}) {\n // Ensure initialization is complete\n await this._initReady;\n\n const timeout = options.timeout !== undefined ? options.timeout : 30000;\n\n // Step 1: Get events from local cache\n const localEvents = this._getMatchingCachedEvents(filter);\n\n // If no relays configured, return local only\n if (this.relays.length === 0) {\n return localEvents;\n }\n\n // Step 2: Query relays\n let relayEvents = [];\n try {\n relayEvents = await this.pool.querySync(this.relays, filter, { timeout });\n\n // Filter out events from other authors\n if (filter.authors && filter.authors.length > 0) {\n relayEvents = relayEvents.filter(event => filter.authors.includes(event.pubkey));\n }\n } catch (error) {\n console.warn('Relay query failed, using local cache only:', error.message);\n }\n\n // Step 3: Merge results (prefer newer events for replaceable events)\n const merged = new Map();\n\n // Add local events first\n for (const event of localEvents) {\n const key = this._getEventKey(event);\n merged.set(key, event);\n }\n\n // Add or update with relay events (relay events are authoritative)\n for (const event of relayEvents) {\n const key = this._getEventKey(event);\n const existing = merged.get(key);\n\n // For replaceable events, prefer newer\n if (event.kind >= 30000 && event.kind < 40000 && existing) {\n if (event.created_at >= existing.created_at) {\n merged.set(key, event);\n }\n } else {\n // For non-replaceable or if no existing, just add\n merged.set(key, event);\n }\n }\n\n const result = Array.from(merged.values());\n\n // Cache the merged results\n const cacheKey = JSON.stringify(filter);\n this._eventCache.set(cacheKey, {\n events: result,\n timestamp: Date.now(),\n });\n\n return result;\n }\n\n /**\n * Get unique key for event (for merging)\n * @private\n */\n _getEventKey(event) {\n // For replaceable events with d-tag, use kind:dtag\n if (event.kind >= 30000 && event.kind < 40000) {\n const dTag = event.tags.find(t => t[0] === 'd');\n if (dTag && dTag[1]) {\n return `${event.kind}:${dTag[1]}`;\n }\n }\n // Otherwise use event id\n return event.id;\n }\n\n /**\n * Subscribe to events\n * Uses subscription deduplication to avoid creating multiple identical subscriptions\n * @param {Object} filter - Nostr filter object\n * @param {Function} onEvent - Callback for each event\n * @param {Object} options - Subscription options\n * @returns {Object} Subscription object with unsubscribe method\n */\n async subscribe(filter, onEvent, options = {}) {\n // Ensure initialization is complete\n await this._initReady;\n\n const subId = `sub-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n const filterKey = JSON.stringify(filter);\n\n // If no relays, check cache for matching events and trigger callbacks\n if (this.relays.length === 0) {\n // Trigger with cached events that match the filter\n const matchingEvents = this._getMatchingCachedEvents(filter);\n\n // Create a mock subscription that watches for new cache entries\n const mockSub = {\n filter,\n onEvent,\n active: true\n };\n\n this._subscriptions.set(subId, mockSub);\n\n // Trigger callbacks asynchronously to mimic real subscription behavior\n // Check active flag to avoid triggering if unsubscribed immediately\n setTimeout(() => {\n if (mockSub.active) {\n matchingEvents.forEach(event => onEvent(event));\n if (options.onEOSE) options.onEOSE();\n }\n }, 10);\n\n return {\n id: subId,\n unsubscribe: () => {\n mockSub.active = false;\n this._subscriptions.delete(subId);\n // Clear the subscription's onEvent to prevent any further calls\n mockSub.onEvent = () => {};\n // Note: active flag is checked before triggering callbacks\n },\n };\n }\n\n // Check if we already have an active subscription for this filter\n const existing = activeSubscriptions.get(filterKey);\n if (existing) {\n // Add callback to existing subscription\n existing.callbacks.add(onEvent);\n existing.refCount++;\n\n // Return wrapper that removes this specific callback on unsubscribe\n return {\n id: subId,\n unsubscribe: () => {\n existing.callbacks.delete(onEvent);\n existing.refCount--;\n\n // Only close actual subscription when no more callbacks\n if (existing.refCount === 0) {\n if (existing.subscription && existing.subscription.close) {\n existing.subscription.close();\n }\n activeSubscriptions.delete(filterKey);\n }\n this._subscriptions.delete(subId);\n },\n };\n }\n\n // Create new subscription with shared callback dispatcher\n const callbacks = new Set([onEvent]);\n const subscriptionInfo = {\n callbacks,\n refCount: 1,\n subscription: null,\n };\n\n // Store before creating subscription to handle race conditions\n activeSubscriptions.set(filterKey, subscriptionInfo);\n\n const sub = this.pool.subscribeMany(\n this.relays,\n [filter],\n {\n onevent: (event) => {\n // CRITICAL: Filter out events from other authors immediately\n // Many relays don't respect the authors filter, so we must do it client-side\n if (filter.authors && filter.authors.length > 0) {\n if (!filter.authors.includes(event.pubkey)) {\n // Silently reject events from other authors\n return;\n }\n }\n\n this._cacheEvent(event);\n\n // Dispatch to ALL registered callbacks for this subscription\n const subInfo = activeSubscriptions.get(filterKey);\n if (subInfo) {\n for (const cb of subInfo.callbacks) {\n try {\n cb(event);\n } catch (err) {\n console.warn('[nostr] Subscription callback error:', err.message);\n }\n }\n }\n },\n oneose: () => {\n if (options.onEOSE) options.onEOSE();\n },\n }\n );\n\n // Store the actual subscription object\n subscriptionInfo.subscription = sub;\n this._subscriptions.set(subId, sub);\n\n return {\n id: subId,\n unsubscribe: () => {\n callbacks.delete(onEvent);\n subscriptionInfo.refCount--;\n\n // Only close actual subscription when no more callbacks\n if (subscriptionInfo.refCount === 0) {\n if (sub.close) sub.close();\n activeSubscriptions.delete(filterKey);\n }\n this._subscriptions.delete(subId);\n },\n };\n }\n\n /**\n * Cache event in memory (synchronous version for loading)\n * @private\n */\n _cacheEventSync(event) {\n const key = event.id;\n this._eventCache.set(key, {\n events: [event],\n timestamp: Date.now(),\n });\n\n // For replaceable events (kind 30000-39999), also cache by d-tag\n if (event.kind >= 30000 && event.kind < 40000) {\n const dTag = event.tags.find(t => t[0] === 'd');\n if (dTag && dTag[1]) {\n const dTagKey = `d:${event.kind}:${dTag[1]}`;\n const existing = this._eventCache.get(dTagKey);\n\n // Replace if newer, or if same timestamp but different event ID (for events in same second)\n const shouldReplace = !existing || !existing.events[0] ||\n event.created_at > existing.events[0].created_at ||\n (event.created_at === existing.events[0].created_at && event.id !== existing.events[0].id);\n\n if (shouldReplace) {\n this._eventCache.set(dTagKey, {\n events: [event],\n timestamp: Date.now(),\n });\n\n // Remove old event from cache if it exists\n if (existing && existing.events[0]) {\n this._eventCache.delete(existing.events[0].id);\n }\n\n // Invalidate any query caches that might contain stale data for this d-tag\n // Query caches are JSON-stringified filters, so we look for any that match this event\n this._invalidateQueryCachesForEvent(event);\n }\n }\n }\n }\n\n /**\n * Invalidate query caches that might be affected by a new event\n * Uses reverse index for O(1) lookup instead of O(n) scan\n * @private\n */\n _invalidateQueryCachesForEvent(event) {\n // Use reverse index for fast lookup - only check caches that could match this event's kind\n const indexedKeys = this._cacheIndex.get(event.kind);\n if (!indexedKeys || indexedKeys.size === 0) {\n return; // No cached queries for this kind\n }\n\n const keysToDelete = [];\n\n // Only iterate over cache entries that match the event's kind\n for (const cacheKey of indexedKeys) {\n const cached = this._eventCache.get(cacheKey);\n if (!cached) {\n // Cache entry was evicted, clean up index\n indexedKeys.delete(cacheKey);\n continue;\n }\n\n try {\n const filter = JSON.parse(cacheKey);\n // Check if this event would match the filter\n if (this._eventMatchesFilter(event, filter)) {\n keysToDelete.push(cacheKey);\n }\n } catch {\n // Not a valid JSON key, clean up index\n indexedKeys.delete(cacheKey);\n }\n }\n\n for (const key of keysToDelete) {\n this._eventCache.delete(key);\n this._unindexCacheEntry(key);\n }\n }\n\n /**\n * Cache event in memory and persist (batched)\n * @private\n */\n async _cacheEvent(event) {\n // Cache in memory (synchronous - immediate for local-first reads)\n this._cacheEventSync(event);\n\n // Queue for batched persistence (async - batches writes for I/O efficiency)\n if (this.persistentStorage) {\n // For replaceable events, use d-tag as key\n let storageKey = event.id;\n if (event.kind >= 30000 && event.kind < 40000) {\n const dTag = event.tags.find(t => t[0] === 'd');\n if (dTag && dTag[1]) {\n storageKey = dTag[1]; // Use d-tag as key for replaceable events\n }\n }\n\n // Queue for batched write (overwrites previous if same key)\n this._persistQueue.set(storageKey, event);\n\n // Schedule batch flush if not already scheduled\n if (!this._persistTimer) {\n this._persistTimer = setTimeout(() => this._flushPersistQueue(), this._persistBatchMs);\n }\n }\n\n // Trigger any active subscriptions that match this event\n if (this.relays.length === 0) {\n for (const sub of this._subscriptions.values()) {\n if (sub.active && this._eventMatchesFilter(event, sub.filter)) {\n // Trigger callback asynchronously, but check active status again\n setTimeout(() => {\n if (sub.active) {\n sub.onEvent(event);\n }\n }, 10);\n }\n }\n }\n }\n\n /**\n * Flush batched persistent writes\n * @private\n */\n async _flushPersistQueue() {\n this._persistTimer = null;\n\n if (!this.persistentStorage || this._persistQueue.size === 0) {\n return;\n }\n\n // Take snapshot of current queue and clear it\n const toWrite = Array.from(this._persistQueue.entries());\n this._persistQueue.clear();\n\n // Write all queued events\n const writePromises = toWrite.map(async ([key, event]) => {\n try {\n await this.persistentStorage.put(key, event);\n } catch (error) {\n console.warn(`Failed to persist event ${key}:`, error.message);\n }\n });\n\n // Wait for all writes to complete\n await Promise.all(writePromises);\n }\n\n /**\n * Get cached events matching a filter\n * @private\n */\n _getMatchingCachedEvents(filter) {\n const matchingEvents = [];\n const seenDTags = new Map(); // For deduplicating replaceable events\n\n for (const cached of this._eventCache.values()) {\n for (const event of (cached.events || [])) {\n if (this._eventMatchesFilter(event, filter)) {\n // For replaceable events (kind 30000-39999), keep only the newest\n if (event.kind >= 30000 && event.kind < 40000) {\n const dTag = event.tags.find(t => t[0] === 'd');\n if (dTag && dTag[1]) {\n const dTagKey = `${event.kind}:${dTag[1]}`;\n const existing = seenDTags.get(dTagKey);\n\n // Replace if newer, or if same timestamp with _deleted flag (tombstones)\n const shouldReplace = !existing ||\n event.created_at > existing.created_at ||\n (event.created_at === existing.created_at &&\n JSON.parse(event.content)?._deleted &&\n !JSON.parse(existing.content)?._deleted);\n\n if (shouldReplace) {\n // Remove old event if exists\n if (existing) {\n const idx = matchingEvents.indexOf(existing);\n if (idx > -1) matchingEvents.splice(idx, 1);\n }\n seenDTags.set(dTagKey, event);\n matchingEvents.push(event);\n }\n continue;\n }\n }\n\n // Regular events or replaceable events without d-tag\n matchingEvents.push(event);\n }\n }\n }\n\n return matchingEvents;\n }\n\n /**\n * Check if event matches filter\n * @private\n */\n _eventMatchesFilter(event, filter) {\n // Check kinds\n if (filter.kinds && !filter.kinds.includes(event.kind)) {\n return false;\n }\n\n // Check IDs\n if (filter.ids && !filter.ids.includes(event.id)) {\n return false;\n }\n\n // Check authors\n if (filter.authors && !filter.authors.includes(event.pubkey)) {\n return false;\n }\n\n // Check #d tag (for replaceable events)\n if (filter['#d']) {\n const dTag = event.tags.find(t => t[0] === 'd');\n if (!dTag || !filter['#d'].includes(dTag[1])) {\n return false;\n }\n }\n\n // Check since/until\n if (filter.since && event.created_at < filter.since) {\n return false;\n }\n if (filter.until && event.created_at > filter.until) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Get single event by ID\n * @param {string} eventId - Event ID (hex)\n * @returns {Promise<Object|null>} Event or null\n */\n async getEvent(eventId) {\n const events = await this.query({ ids: [eventId] });\n return events.length > 0 ? events[0] : null;\n }\n\n /**\n * Clear the event cache (or specific entries matching a pattern)\n * @param {string} [pattern] - Optional d-tag pattern to match (clears all if not provided)\n */\n clearCache(pattern = null) {\n if (!pattern) {\n this._eventCache.clear();\n return;\n }\n\n // Clear entries matching the pattern\n for (const key of this._eventCache.keys()) {\n if (key.includes(pattern)) {\n this._eventCache.delete(key);\n }\n }\n }\n\n /**\n * Close all connections and subscriptions\n * @param {Object} options - Close options\n * @param {boolean} options.flush - Flush pending writes before closing (default: true)\n */\n async close(options = {}) {\n const shouldFlush = options.flush !== false;\n\n // Flush pending persistent writes before closing\n if (shouldFlush && this._persistTimer) {\n clearTimeout(this._persistTimer);\n await this._flushPersistQueue();\n }\n\n // Stop background sync service\n if (this.syncService) {\n this.syncService.stop();\n }\n\n // Close long-lived author subscription\n const authorSub = authorSubscriptions.get(this.publicKey);\n if (authorSub && authorSub.subscription) {\n if (authorSub.subscription.close) {\n authorSub.subscription.close();\n }\n authorSubscriptions.delete(this.publicKey);\n }\n\n // Close all subscriptions\n for (const sub of this._subscriptions.values()) {\n if (sub.close) {\n sub.close();\n } else if (sub.active !== undefined) {\n // Mock subscription\n sub.active = false;\n }\n }\n this._subscriptions.clear();\n\n // Close pool\n this.pool.close(this.relays);\n\n // Clear cache and index\n this._eventCache.clear();\n this._cacheIndex.clear();\n }\n\n /**\n * Get relay status\n * @returns {Array} Relay connection statuses\n */\n getRelayStatus() {\n return this.relays.map(relay => ({\n url: relay,\n connected: true, // SimplePool manages this internally\n }));\n }\n}\n\n/**\n * Create NostrClient instance\n * @param {Object} config - Configuration options\n * @returns {NostrClient} Client instance\n */\nexport function createClient(config) {\n return new NostrClient(config);\n}\n","/**\n * Factory for creating storage backends\n * Supports lazy loading of backend implementations\n */\n\nconst BACKEND_MODULES = {\n nostr: './backends/nostr-backend.js',\n gundb: './backends/gundb-backend.js',\n activitypub: './backends/activitypub-backend.js',\n};\n\n// Cache for loaded backend classes\nconst loadedBackends = new Map();\n\n/**\n * Factory for creating storage backends\n */\nexport class BackendFactory {\n /**\n * Get list of available backend types\n * @returns {string[]} Available backend type names\n */\n static getAvailableBackends() {\n return Object.keys(BACKEND_MODULES);\n }\n\n /**\n * Check if a backend type is available\n * @param {string} type - Backend type\n * @returns {boolean} Whether the backend is available\n */\n static isAvailable(type) {\n return type in BACKEND_MODULES;\n }\n\n /**\n * Load a backend class dynamically\n * @param {string} type - Backend type\n * @returns {Promise<Class>} Backend class\n */\n static async loadBackend(type) {\n if (loadedBackends.has(type)) {\n return loadedBackends.get(type);\n }\n\n const modulePath = BACKEND_MODULES[type];\n if (!modulePath) {\n throw new Error(\n `Unknown backend type: '${type}'. Available backends: ${Object.keys(BACKEND_MODULES).join(', ')}`\n );\n }\n\n try {\n const module = await import(modulePath);\n const BackendClass = module.default || module[`${capitalize(type)}Backend`];\n\n if (!BackendClass) {\n throw new Error(`Backend module '${type}' does not export a valid backend class`);\n }\n\n loadedBackends.set(type, BackendClass);\n return BackendClass;\n } catch (error) {\n if (error.code === 'ERR_MODULE_NOT_FOUND') {\n throw new Error(\n `Backend '${type}' requires additional dependencies. ` +\n `Please install them: ${getDependencyHint(type)}`\n );\n }\n throw error;\n }\n }\n\n /**\n * Create a storage backend instance\n * @param {string} type - Backend type: 'nostr' | 'gundb' | 'activitypub'\n * @param {Object} config - Backend-specific configuration\n * @returns {Promise<StorageBackend>} Initialized backend\n */\n static async create(type, config) {\n const BackendClass = await this.loadBackend(type);\n const backend = new BackendClass(config);\n await backend.init();\n return backend;\n }\n\n /**\n * Register a custom backend\n * @param {string} name - Backend name\n * @param {Class|string} BackendClassOrPath - Backend class or module path\n */\n static register(name, BackendClassOrPath) {\n if (typeof BackendClassOrPath === 'string') {\n BACKEND_MODULES[name] = BackendClassOrPath;\n } else {\n loadedBackends.set(name, BackendClassOrPath);\n BACKEND_MODULES[name] = null; // Mark as registered but not file-based\n }\n }\n}\n\n/**\n * Capitalize first letter\n * @param {string} str - String to capitalize\n * @returns {string} Capitalized string\n */\nfunction capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * Get dependency installation hint for a backend\n * @param {string} type - Backend type\n * @returns {string} Installation hint\n */\nfunction getDependencyHint(type) {\n const hints = {\n nostr: 'npm install nostr-tools',\n gundb: 'npm install gun',\n activitypub: 'npm install express',\n };\n return hints[type] || 'Check the documentation for required dependencies';\n}\n\nexport default BackendFactory;\n","/**\n * Gun Async Utilities\n * Provides Promise-based wrappers and async patterns for Gun operations\n */\n\n/**\n * Get data from Gun using native .then() support\n * @param {Object} gunChain - Gun chain reference\n * @param {number} timeout - Timeout in ms (default 1000ms)\n * @returns {Promise<any>} Promise resolving to data\n */\nexport function gunPromise(gunChain, timeout = 1000) {\n return new Promise((resolve, reject) => {\n let settled = false;\n\n const timer = setTimeout(() => {\n if (!settled) {\n settled = true;\n resolve(null);\n }\n }, timeout);\n\n gunChain.once((data) => {\n if (!settled) {\n settled = true;\n clearTimeout(timer);\n resolve(data || null);\n }\n });\n });\n}\n\n/**\n * Wait for Gun write acknowledgement\n * @param {Object} gunChain - Gun chain reference\n * @param {any} data - Data to write\n * @param {number} timeout - Timeout in ms (default 1000ms)\n * @returns {Promise<Object>} Promise resolving to ack object\n */\nexport function gunPut(gunChain, data, timeout = 1000) {\n return new Promise((resolve, reject) => {\n let settled = false;\n\n const timer = setTimeout(() => {\n if (!settled) {\n settled = true;\n resolve({ ok: true, timeout: true });\n }\n }, timeout);\n\n gunChain.put(data, (ack) => {\n if (!settled) {\n settled = true;\n clearTimeout(timer);\n if (ack.err) {\n reject(new Error(ack.err));\n } else {\n resolve(ack);\n }\n }\n });\n });\n}\n\n/**\n * Get all items from a Gun map\n * First gets count of items, then collects until count is reached\n * @param {Object} gunChain - Gun chain reference\n * @param {number} timeout - Timeout in ms (fallback, default 5000ms)\n * @returns {Promise<Object>} Promise resolving to map of items\n */\nexport async function gunMap(gunChain, timeout = 5000) {\n return new Promise((resolve) => {\n const items = {};\n let settled = false;\n let expectedCount = 0;\n let receivedCount = 0;\n\n const tryResolve = () => {\n if (settled) return;\n if (expectedCount > 0 && receivedCount >= expectedCount) {\n settled = true;\n resolve(items);\n }\n };\n\n // Step 1: Get parent to count expected items\n gunChain.once((parentData) => {\n if (settled) return;\n\n if (!parentData) {\n settled = true;\n resolve({});\n return;\n }\n\n const keys = Object.keys(parentData).filter(k => k !== '_');\n if (keys.length === 0) {\n settled = true;\n resolve({});\n return;\n }\n\n // Count references that need fetching\n expectedCount = keys.filter(k => {\n const item = parentData[k];\n return item && typeof item === 'object' && item['#'];\n }).length;\n\n // If no references, we're done\n if (expectedCount === 0) {\n settled = true;\n resolve({});\n return;\n }\n\n // Step 2: Collect items, counting as we go\n gunChain.map().once((data, key) => {\n if (settled || !data || key.startsWith('_')) return;\n items[key] = data;\n receivedCount++;\n tryResolve();\n });\n });\n\n // Fallback timeout\n setTimeout(() => {\n if (!settled) {\n settled = true;\n resolve(items);\n }\n }, timeout);\n });\n}\n\n/**\n * Load full chain data (follows all references)\n * @param {Object} gunChain - Gun chain reference\n * @param {number} depth - Max depth to traverse (default 3)\n * @returns {Promise<any>} Promise resolving to loaded data\n */\nexport async function gunLoad(gunChain, depth = 3) {\n return new Promise((resolve) => {\n let result = null;\n\n gunChain.load((data) => {\n result = data;\n }, { wait: 100 });\n\n setTimeout(() => {\n resolve(result);\n }, 100 * depth);\n });\n}\n\n/**\n * Async iterator for Gun map\n * @param {Object} gunChain - Gun chain reference\n * @returns {AsyncGenerator} Async generator yielding [key, value] pairs\n */\nexport async function* gunMapIterator(gunChain) {\n const items = await gunMap(gunChain);\n for (const [key, value] of Object.entries(items)) {\n yield [key, value];\n }\n}\n\n/**\n * Collect Gun on() stream into array over time\n * @param {Object} gunChain - Gun chain reference\n * @param {number} duration - Collection duration in ms\n * @returns {Promise<Array>} Promise resolving to array of data\n */\nexport async function gunCollect(gunChain, duration = 500) {\n return new Promise((resolve) => {\n const results = [];\n const seen = new Set();\n\n const listener = gunChain.on((data, key) => {\n if (data && !seen.has(key)) {\n seen.add(key);\n results.push({ key, data });\n }\n });\n\n setTimeout(() => {\n listener.off();\n resolve(results);\n }, duration);\n });\n}\n\n/**\n * Wait for specific condition on Gun data\n * @param {Object} gunChain - Gun chain reference\n * @param {Function} predicate - Condition function (data) => boolean\n * @param {number} timeout - Timeout in ms (default 5000ms)\n * @returns {Promise<any>} Promise resolving when condition is met\n */\nexport async function gunWaitFor(gunChain, predicate, timeout = 5000) {\n return new Promise((resolve, reject) => {\n let timeoutId;\n let listener;\n\n const cleanup = () => {\n if (timeoutId) clearTimeout(timeoutId);\n if (listener) listener.off();\n };\n\n listener = gunChain.on((data) => {\n if (predicate(data)) {\n cleanup();\n resolve(data);\n }\n });\n\n timeoutId = setTimeout(() => {\n cleanup();\n reject(new Error('Timeout waiting for condition'));\n }, timeout);\n });\n}\n\n/**\n * Batch read multiple Gun paths\n * @param {Object} gun - Gun instance\n * @param {string[]} paths - Array of paths to read\n * @returns {Promise<Object>} Object mapping paths to data\n */\nexport async function gunBatchGet(gun, paths) {\n const promises = paths.map(async (path) => {\n const data = await gunPromise(gun.get(path));\n return [path, data];\n });\n\n const results = await Promise.all(promises);\n return Object.fromEntries(results);\n}\n\n/**\n * Batch write multiple Gun paths\n * @param {Object} gun - Gun instance\n * @param {Object} pathDataMap - Object mapping paths to data\n * @returns {Promise<Object>} Object mapping paths to ack results\n */\nexport async function gunBatchPut(gun, pathDataMap) {\n const promises = Object.entries(pathDataMap).map(async ([path, data]) => {\n const ack = await gunPut(gun.get(path), data);\n return [path, ack];\n });\n\n const results = await Promise.all(promises);\n return Object.fromEntries(results);\n}\n\n/**\n * Retry Gun operation with exponential backoff\n * @param {Function} operation - Async function to retry\n * @param {number} maxRetries - Max retry attempts (default 3)\n * @param {number} baseDelay - Base delay in ms (default 100ms)\n * @returns {Promise<any>} Promise resolving to operation result\n */\nexport async function gunRetry(operation, maxRetries = 3, baseDelay = 100) {\n let lastError;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error;\n if (attempt < maxRetries) {\n const delay = baseDelay * Math.pow(2, attempt);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n }\n\n throw lastError;\n}\n\n/**\n * Create async stream from Gun on() callback\n * @param {Object} gunChain - Gun chain reference\n * @returns {Object} Stream object with async iteration support\n */\nexport function gunStream(gunChain) {\n let listeners = [];\n let buffer = [];\n let ended = false;\n\n const stream = {\n [Symbol.asyncIterator]() {\n return {\n async next() {\n if (buffer.length > 0) {\n return { value: buffer.shift(), done: false };\n }\n\n if (ended) {\n return { done: true };\n }\n\n // Wait for next value\n return new Promise((resolve) => {\n listeners.push((data) => {\n resolve({ value: data, done: false });\n });\n });\n },\n };\n },\n\n stop() {\n ended = true;\n if (this.listener) this.listener.off();\n },\n };\n\n stream.listener = gunChain.on((data, key) => {\n const item = { key, data };\n if (listeners.length > 0) {\n const listener = listeners.shift();\n listener(item);\n } else {\n buffer.push(item);\n }\n });\n\n return stream;\n}\n","/**\n * GunDB Storage Wrapper with radisk persistence\n * Handles path construction and CRUD operations\n * Note: GunDB doesn't handle nested objects well, so we store data as JSON strings\n */\n\nimport { gunPromise, gunPut, gunCollect } from './gun-async.js';\n\n// ============================================================================\n// PATH BUILDERS\n// ============================================================================\n\n/**\n * Build Gun path from components\n * @param {string} appname - Application namespace\n * @param {string} holon - Holon ID (H3 or URI)\n * @param {string} lens - Lens name\n * @param {string} key - Data key (optional)\n * @returns {string} Gun path\n */\nexport function buildPath(appname, holon, lens, key = null) {\n // Encode components to handle special characters\n const encodedHolon = encodePathComponent(holon);\n const encodedLens = encodePathComponent(lens);\n\n if (key) {\n const encodedKey = encodePathComponent(key);\n return `${appname}/${encodedHolon}/${encodedLens}/${encodedKey}`;\n }\n return `${appname}/${encodedHolon}/${encodedLens}`;\n}\n\n/**\n * Build Gun path for global tables (app-wide data not tied to holons)\n * @param {string} appname - Application namespace\n * @param {string} tableName - Global table name (e.g., 'schemas', 'federation')\n * @param {string} key - Data key (optional)\n * @returns {string} Gun path\n */\nexport function buildGlobalPath(appname, tableName, key = null) {\n const encodedTable = encodePathComponent(tableName);\n if (key) {\n const encodedKey = encodePathComponent(key);\n return `${appname}/${encodedTable}/${encodedKey}`;\n }\n return `${appname}/${encodedTable}`;\n}\n\n/**\n * Encode path component to handle special characters\n * @private\n */\nfunction encodePathComponent(component) {\n return encodeURIComponent(component).replace(/%2F/g, '/');\n}\n\n/**\n * Serialize data for GunDB storage\n * Wraps data in { _json: string } format for Gun compatibility\n * Gun requires an object at graph roots, so we can't store raw JSON strings\n * The deserialization handles both this format and raw JSON strings for reading old data\n * @private\n */\nfunction serializeForGun(data) {\n return { _json: JSON.stringify(data) };\n}\n\n/**\n * Deserialize data from GunDB storage\n * Handles multiple formats:\n * - Direct JSON string (holosphere original - now default)\n * - _json wrapped format (holosphere2 legacy)\n * - Gun internal references (_[\"#\"])\n * - Gun node data (_[\">\"])\n * - Plain objects\n * @private\n */\nfunction deserializeFromGun(data) {\n if (!data) {\n return null;\n }\n\n try {\n // Format 1: String data (holosphere original stores JSON as string directly)\n if (typeof data === 'string') {\n try {\n return JSON.parse(data);\n } catch (e) {\n // Not JSON, return as-is\n return data;\n }\n }\n\n // Format 2: _json wrapped format (holosphere2 default)\n if (data._json && typeof data._json === 'string') {\n try {\n return JSON.parse(data._json);\n } catch (e) {\n console.warn('Failed to parse _json field:', e);\n return null;\n }\n }\n\n // Format 3: Gun internal reference (_[\"#\"]) - this indicates a Gun reference\n // The actual data retrieval should happen via resolveReference, we just identify it here\n if (data._ && data._['#']) {\n // This is a Gun reference - return as-is for reference resolution\n // The caller should check isReference() and handle appropriately\n return data;\n }\n\n // Format 4: Gun node data with timestamps (_[\">\"])\n // Gun stores metadata in _.> - find the actual value\n if (data._ && data._['>']) {\n const nodeValue = Object.entries(data).find(([k, v]) => k !== '_' && typeof v === 'string');\n if (nodeValue) {\n try {\n return JSON.parse(nodeValue[1]);\n } catch (e) {\n return nodeValue[1];\n }\n }\n }\n\n // Format 5: Plain object - clean Gun metadata and return\n if (typeof data === 'object' && data !== null) {\n const cleaned = { ...data };\n delete cleaned['_'];\n\n // Check if any remaining keys - if empty after removing _, return null\n if (Object.keys(cleaned).length === 0) {\n return null;\n }\n\n return cleaned;\n }\n\n return data;\n } catch (error) {\n console.warn('Error deserializing Gun data:', error);\n return data; // Return raw data as fallback\n }\n}\n\n/**\n * Write data to Gun with radisk persistence\n * @param {Object} gun - Gun instance\n * @param {string} path - Gun path\n * @param {Object} data - Data to write\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function write(gun, path, data) {\n try {\n const serialized = serializeForGun(data);\n await gunPut(gun.get(path), serialized, 2000);\n // Delay to allow Gun to propagate the write (50ms for better reliability)\n await new Promise(resolve => setTimeout(resolve, 50));\n return true;\n } catch (error) {\n throw error;\n }\n}\n\n/**\n * Read data from Gun\n * @param {Object} gun - Gun instance\n * @param {string} path - Gun path\n * @returns {Promise<Object|null>} Data or null if not found\n */\nexport async function read(gun, path) {\n const rawData = await gunPromise(gun.get(path), 2000);\n\n if (!rawData) {\n return null;\n }\n\n const data = deserializeFromGun(rawData);\n\n // Return null if deleted or not found\n if (!data || data._deleted) {\n return null;\n }\n\n return data;\n}\n\n/**\n * Read all data under a path (lens query)\n * First gets the count of expected items, then collects until count is reached\n * @param {Object} gun - Gun instance\n * @param {string} path - Gun path\n * @param {number} timeout - Maximum timeout in ms (default 5000)\n * @returns {Promise<Object[]>} Array of data objects\n */\nexport async function readAll(gun, path, timeout = 5000) {\n return new Promise((resolve) => {\n const output = new Map();\n let settled = false;\n let expectedCount = 0;\n let receivedCount = 0;\n\n const ref = gun.get(path);\n\n const tryResolve = () => {\n if (settled) return;\n if (expectedCount > 0 && receivedCount >= expectedCount) {\n settled = true;\n resolve(Array.from(output.values()));\n }\n };\n\n const parseItem = (data) => {\n if (!data) return null;\n\n let item = null;\n if (data._json && typeof data._json === 'string') {\n try {\n item = JSON.parse(data._json);\n } catch (e) {}\n } else if (typeof data === 'string') {\n try {\n item = JSON.parse(data);\n } catch (e) {}\n }\n return item;\n };\n\n // Step 1: Get the parent data to count expected items\n ref.once((parentData) => {\n if (settled) return;\n\n if (!parentData) {\n settled = true;\n resolve([]);\n return;\n }\n\n // Get all keys except Gun metadata\n const keys = Object.keys(parentData).filter(k => k !== '_');\n\n if (keys.length === 0) {\n settled = true;\n resolve([]);\n return;\n }\n\n // Count expected items and check for inline data\n const referenceKeys = [];\n\n for (const key of keys) {\n const rawItem = parentData[key];\n if (!rawItem) continue;\n\n // Check if it's a Gun reference (soul) - need to fetch separately\n if (typeof rawItem === 'object' && rawItem['#']) {\n referenceKeys.push(key);\n continue;\n }\n\n // Try to parse inline data\n const item = parseItem(rawItem);\n if (item && item.id && !item._deleted) {\n output.set(item.id, item);\n receivedCount++;\n }\n }\n\n // Set expected count: references that need fetching\n expectedCount = referenceKeys.length;\n\n // If no references to resolve, we're done\n if (expectedCount === 0) {\n settled = true;\n resolve(Array.from(output.values()));\n return;\n }\n\n // Step 2: Use map().once() to resolve references, counting as we go\n ref.map().once((data, key) => {\n if (settled || !data || key === '_') return;\n\n const item = parseItem(data);\n if (item && item.id && !item._deleted) {\n if (!output.has(item.id)) {\n output.set(item.id, item);\n receivedCount++;\n tryResolve();\n }\n } else {\n // Item was null/deleted, still count it as received\n receivedCount++;\n tryResolve();\n }\n });\n });\n\n // Fallback timeout in case count-based resolution fails\n setTimeout(() => {\n if (!settled) {\n settled = true;\n resolve(Array.from(output.values()));\n }\n }, timeout);\n });\n}\n\n/**\n * Update data (merge fields)\n * @param {Object} gun - Gun instance\n * @param {string} path - Gun path\n * @param {Object} updates - Fields to update\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function update(gun, path, updates) {\n const rawData = await gunPromise(gun.get(path));\n\n if (!rawData) {\n return false; // Not found\n }\n\n // Deserialize existing data\n const existing = deserializeFromGun(rawData);\n if (!existing || !existing.id || existing._deleted) {\n return false;\n }\n\n // Merge updates\n const merged = { ...existing, ...updates };\n\n try {\n const serialized = serializeForGun(merged);\n await gunPut(gun.get(path), serialized);\n return true;\n } catch (error) {\n throw error;\n }\n}\n\n/**\n * Delete data (tombstone)\n * @param {Object} gun - Gun instance\n * @param {string} path - Gun path\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function deleteData(gun, path) {\n try {\n // First read existing data to get the id\n const rawData = await gunPromise(gun.get(path));\n if (!rawData) {\n return true; // Already deleted/doesn't exist\n }\n\n const existing = deserializeFromGun(rawData);\n\n // Create tombstone object and serialize it\n const tombstone = {\n id: existing?.id,\n _deleted: true,\n _deletedAt: Date.now()\n };\n\n await gunPut(gun.get(path), serializeForGun(tombstone));\n return true;\n } catch (error) {\n throw error;\n }\n}\n\n/**\n * Delete all data under path prefix (tombstone)\n * @param {Object} gun - Gun instance\n * @param {string} path - Gun path prefix\n * @returns {Promise<Object>} Deletion results { success: boolean, count: number }\n */\nexport async function deleteAll(gun, path) {\n const items = await readAll(gun, path);\n let count = 0;\n\n for (const item of items) {\n if (item && item.id) {\n const itemPath = `${path}/${item.id}`;\n await deleteData(gun, itemPath);\n count++;\n }\n }\n\n return { success: true, count };\n}\n\n/**\n * Subscribe to data changes\n * @param {Object} gun - Gun instance\n * @param {string} path - Gun path\n * @param {Function} callback - Called on data changes\n * @param {Object} options - Subscription options\n * @param {boolean} options.prefix - Subscribe to all items under path (default: auto-detect)\n * @returns {Object} Subscription object with unsubscribe method\n */\nexport function subscribe(gun, path, callback, options = {}) {\n // Detect if this is a prefix subscription\n const pathParts = path.split('/');\n const isPrefix = options.prefix !== undefined ? options.prefix : pathParts.length <= 3;\n\n if (isPrefix) {\n // Subscribe to all items under this prefix\n const ref = gun.get(path);\n\n ref.map().on((data, key) => {\n if (data && !key.startsWith('_')) {\n const deserialized = deserializeFromGun(data);\n if (deserialized && !deserialized._deleted) {\n callback(deserialized, key);\n }\n }\n });\n\n return {\n unsubscribe: () => {\n try {\n ref.off();\n } catch (e) {\n // Ignore cleanup errors\n }\n },\n };\n } else {\n // Subscribe to single item\n const listener = gun.get(path).on((data, key) => {\n if (data) {\n const deserialized = deserializeFromGun(data);\n if (deserialized && !deserialized._deleted) {\n callback(deserialized, key);\n }\n }\n });\n\n return {\n unsubscribe: () => {\n try {\n listener.off();\n } catch (e) {\n // Ignore cleanup errors\n }\n },\n };\n }\n}\n\n// ============================================================================\n// GLOBAL TABLE OPERATIONS\n// ============================================================================\n\n/**\n * Write data to a global table\n * Global tables are app-wide data not tied to specific holons (e.g., schemas, federation)\n * @param {Object} gun - Gun instance\n * @param {string} appname - Application namespace\n * @param {string} tableName - Global table name\n * @param {Object} data - Data to write (must have 'id' field)\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function writeGlobal(gun, appname, tableName, data) {\n if (!data || !data.id) {\n throw new Error('writeGlobal: data must have an id field');\n }\n const path = buildGlobalPath(appname, tableName, data.id);\n return write(gun, path, data);\n}\n\n/**\n * Read data from a global table\n * @param {Object} gun - Gun instance\n * @param {string} appname - Application namespace\n * @param {string} tableName - Global table name\n * @param {string} key - Data key\n * @returns {Promise<Object|null>} Data or null if not found\n */\nexport async function readGlobal(gun, appname, tableName, key) {\n const path = buildGlobalPath(appname, tableName, key);\n return read(gun, path);\n}\n\n/**\n * Read all data from a global table\n * Uses same approach as readAll\n * @param {Object} gun - Gun instance\n * @param {string} appname - Application namespace\n * @param {string} tableName - Global table name\n * @param {number} timeout - Timeout in ms (default: 2000)\n * @returns {Promise<Object[]>} Array of data objects\n */\nexport async function readAllGlobal(gun, appname, tableName, timeout = 2000) {\n const path = buildGlobalPath(appname, tableName);\n return readAll(gun, path);\n}\n\n/**\n * Delete data from a global table\n * @param {Object} gun - Gun instance\n * @param {string} appname - Application namespace\n * @param {string} tableName - Global table name\n * @param {string} key - Data key\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function deleteGlobal(gun, appname, tableName, key) {\n const path = buildGlobalPath(appname, tableName, key);\n return deleteData(gun, path);\n}\n\n/**\n * Delete all data from a global table\n * @param {Object} gun - Gun instance\n * @param {string} appname - Application namespace\n * @param {string} tableName - Global table name\n * @returns {Promise<Object>} Deletion results { success: boolean, count: number }\n */\nexport async function deleteAllGlobal(gun, appname, tableName) {\n const path = buildGlobalPath(appname, tableName);\n return deleteAll(gun, path);\n}\n\n// ============================================================================\n// DATA PARSING UTILITIES\n// ============================================================================\n\n/**\n * Parse data from Gun storage, handling various formats\n * - JSON string in _json field\n * - Legacy object format\n * - Gun references\n * @param {*} rawData - Raw data from Gun\n * @returns {Object|null} Parsed data or null\n */\nexport function parse(rawData) {\n return deserializeFromGun(rawData);\n}\n\n/**\n * Serialize data for Gun storage\n * @param {Object} data - Data to serialize\n * @returns {string} JSON string\n */\nexport function serialize(data) {\n return serializeForGun(data);\n}\n","/**\n * GunDB Federation Module\n * Provides methods for creating, managing, and using federated spaces\n *\n * Ported from holosphere/federation.js to work with the GunDBBackend\n */\n\n/**\n * Creates a federation relationship between two spaces\n * Federation is bidirectional by default, and data propagation uses soul references by default.\n *\n * @param {Object} backend - The GunDBBackend instance\n * @param {string} spaceId1 - The first space ID\n * @param {string} spaceId2 - The second space ID\n * @param {boolean} bidirectional - Whether to set up bidirectional notifications (default: true)\n * @returns {Promise<boolean>} True if federation was created successfully\n */\nexport async function federate(backend, spaceId1, spaceId2, bidirectional = true) {\n if (!spaceId1 || !spaceId2) {\n throw new Error('federate: Missing required space IDs');\n }\n\n if (spaceId1 === spaceId2) {\n throw new Error('Cannot federate a space with itself');\n }\n\n try {\n // Get or create federation info for first space (A)\n let fedInfo1 = await backend.readGlobal('federation', spaceId1);\n\n if (!fedInfo1) {\n fedInfo1 = {\n id: spaceId1,\n name: spaceId1,\n federation: [],\n notify: [],\n timestamp: Date.now()\n };\n }\n\n // Ensure arrays exist\n if (!fedInfo1.federation) fedInfo1.federation = [];\n if (!fedInfo1.notify) fedInfo1.notify = [];\n\n // Add space2 to space1's federation list if not already present\n if (!fedInfo1.federation.includes(spaceId2)) {\n fedInfo1.federation.push(spaceId2);\n }\n\n fedInfo1.timestamp = Date.now();\n await backend.writeGlobal('federation', fedInfo1);\n\n // Handle space2 (B) - add to notify list\n let fedInfo2 = await backend.readGlobal('federation', spaceId2);\n\n if (!fedInfo2) {\n fedInfo2 = {\n id: spaceId2,\n name: spaceId2,\n federation: [],\n notify: [],\n timestamp: Date.now()\n };\n }\n\n if (!fedInfo2.notify) fedInfo2.notify = [];\n\n // Add space1 to space2's notify list\n if (!fedInfo2.notify.includes(spaceId1)) {\n fedInfo2.notify.push(spaceId1);\n }\n\n fedInfo2.timestamp = Date.now();\n await backend.writeGlobal('federation', fedInfo2);\n\n // Create federation metadata record\n const federationMeta = {\n id: `${spaceId1}_${spaceId2}`,\n space1: spaceId1,\n space2: spaceId2,\n created: Date.now(),\n status: 'active',\n bidirectional: bidirectional\n };\n\n await backend.writeGlobal('federationMeta', federationMeta);\n\n return true;\n } catch (error) {\n console.error(`Federation creation failed: ${error.message}`);\n throw error;\n }\n}\n\n/**\n * Gets federation info for a space\n * @param {Object} backend - The GunDBBackend instance\n * @param {string} spaceId - The space ID\n * @returns {Promise<Object|null>} Federation info or null if not found\n */\nexport async function getFederation(backend, spaceId) {\n if (!spaceId) {\n throw new Error('getFederation: Missing space ID');\n }\n return backend.readGlobal('federation', spaceId);\n}\n\n/**\n * Removes a federation relationship between spaces\n * @param {Object} backend - The GunDBBackend instance\n * @param {string} spaceId1 - The first space ID\n * @param {string} spaceId2 - The second space ID\n * @returns {Promise<boolean>} True if federation was removed successfully\n */\nexport async function unfederate(backend, spaceId1, spaceId2) {\n if (!spaceId1 || !spaceId2) {\n throw new Error('unfederate: Missing required space IDs');\n }\n\n try {\n // Update first space federation info\n let fedInfo1 = await backend.readGlobal('federation', spaceId1);\n\n if (fedInfo1 && fedInfo1.federation) {\n fedInfo1.federation = fedInfo1.federation.filter(id => id !== spaceId2);\n fedInfo1.timestamp = Date.now();\n await backend.writeGlobal('federation', fedInfo1);\n }\n\n // Update second space federation info\n let fedInfo2 = await backend.readGlobal('federation', spaceId2);\n\n if (fedInfo2 && fedInfo2.notify) {\n fedInfo2.notify = fedInfo2.notify.filter(id => id !== spaceId1);\n fedInfo2.timestamp = Date.now();\n await backend.writeGlobal('federation', fedInfo2);\n }\n\n // Update federation metadata\n const metaId = `${spaceId1}_${spaceId2}`;\n const altMetaId = `${spaceId2}_${spaceId1}`;\n\n let meta = await backend.readGlobal('federationMeta', metaId);\n if (!meta) {\n meta = await backend.readGlobal('federationMeta', altMetaId);\n }\n\n if (meta) {\n meta.status = 'inactive';\n meta.endedAt = Date.now();\n await backend.writeGlobal('federationMeta', meta);\n }\n\n return true;\n } catch (error) {\n console.error(`Federation removal failed: ${error.message}`);\n throw error;\n }\n}\n\n/**\n * Removes a notification relationship between two spaces\n * @param {Object} backend - The GunDBBackend instance\n * @param {string} spaceId1 - The space to modify\n * @param {string} spaceId2 - The space to be removed from notifications\n * @returns {Promise<boolean>} True if notification was removed successfully\n */\nexport async function removeNotify(backend, spaceId1, spaceId2) {\n if (!spaceId1 || !spaceId2) {\n throw new Error('removeNotify: Missing required space IDs');\n }\n\n try {\n let fedInfo = await backend.readGlobal('federation', spaceId1);\n\n if (!fedInfo) {\n throw new Error(`No federation info found for ${spaceId1}`);\n }\n\n if (!fedInfo.notify) fedInfo.notify = [];\n\n if (fedInfo.notify.includes(spaceId2)) {\n fedInfo.notify = fedInfo.notify.filter(id => id !== spaceId2);\n fedInfo.timestamp = Date.now();\n await backend.writeGlobal('federation', fedInfo);\n return true;\n }\n\n return false;\n } catch (error) {\n console.error(`Remove notification failed: ${error.message}`);\n throw error;\n }\n}\n\n/**\n * Resets all federation relationships for a space\n * @param {Object} backend - The GunDBBackend instance\n * @param {string} spaceId - The ID of the space to reset\n * @param {Object} options - Reset options\n * @param {boolean} options.notifyPartners - Whether to notify federation partners (default: true)\n * @param {string} options.spaceName - Optional name for the space\n * @returns {Promise<Object>} Result object with success/error info\n */\nexport async function resetFederation(backend, spaceId, options = {}) {\n if (!spaceId) {\n throw new Error('resetFederation: Missing required space ID');\n }\n\n const {\n notifyPartners = true,\n spaceName = null\n } = options;\n\n const result = {\n success: false,\n federatedCount: 0,\n notifyCount: 0,\n partnersNotified: 0,\n errors: []\n };\n\n try {\n const fedInfo = await getFederation(backend, spaceId);\n\n if (!fedInfo) {\n return {\n ...result,\n success: true,\n message: 'No federation configuration found for this space'\n };\n }\n\n result.federatedCount = fedInfo.federation?.length || 0;\n result.notifyCount = fedInfo.notify?.length || 0;\n\n // Create empty federation record\n const emptyFedInfo = {\n id: spaceId,\n name: spaceName || spaceId,\n federation: [],\n notify: [],\n timestamp: Date.now()\n };\n\n await backend.writeGlobal('federation', emptyFedInfo);\n\n // Notify federation partners if requested\n if (notifyPartners && fedInfo.federation && fedInfo.federation.length > 0) {\n for (const partnerSpace of fedInfo.federation) {\n try {\n const partnerFedInfo = await getFederation(backend, partnerSpace);\n\n if (partnerFedInfo) {\n if (partnerFedInfo.federation) {\n partnerFedInfo.federation = partnerFedInfo.federation.filter(\n id => id !== spaceId.toString()\n );\n }\n\n if (partnerFedInfo.notify) {\n partnerFedInfo.notify = partnerFedInfo.notify.filter(\n id => id !== spaceId.toString()\n );\n }\n\n partnerFedInfo.timestamp = Date.now();\n await backend.writeGlobal('federation', partnerFedInfo);\n result.partnersNotified++;\n }\n } catch (error) {\n result.errors.push({\n partner: partnerSpace,\n error: error.message\n });\n }\n }\n }\n\n // Update federation metadata records\n if (fedInfo.federation && fedInfo.federation.length > 0) {\n for (const partnerSpace of fedInfo.federation) {\n try {\n const metaId = `${spaceId}_${partnerSpace}`;\n const altMetaId = `${partnerSpace}_${spaceId}`;\n\n let meta = await backend.readGlobal('federationMeta', metaId);\n if (!meta) {\n meta = await backend.readGlobal('federationMeta', altMetaId);\n }\n\n if (meta) {\n meta.status = 'inactive';\n meta.endedAt = Date.now();\n await backend.writeGlobal('federationMeta', meta);\n }\n } catch (error) {\n // Ignore metadata errors\n }\n }\n }\n\n result.success = true;\n return result;\n } catch (error) {\n console.error(`Federation reset failed: ${error.message}`);\n return {\n ...result,\n success: false,\n error: error.message\n };\n }\n}\n\n/**\n * Propagates data to federated spaces\n * @param {Object} backend - The GunDBBackend instance\n * @param {string} holon - The holon identifier\n * @param {string} lens - The lens identifier\n * @param {Object} data - The data to propagate\n * @param {Object} options - Propagation options\n * @param {boolean} options.useReferences - Whether to use references instead of duplicating data (default: true)\n * @param {string[]} options.targetSpaces - Specific target spaces to propagate to\n * @returns {Promise<Object>} Result with success count and errors\n */\nexport async function propagate(backend, holon, lens, data, options = {}) {\n if (!backend || !holon || !lens || !data) {\n throw new Error('propagate: Missing required parameters');\n }\n\n const {\n useReferences = true,\n targetSpaces = null\n } = options;\n\n const result = {\n success: 0,\n errors: 0,\n errorDetails: [],\n propagated: false,\n referencesUsed: useReferences\n };\n\n try {\n const fedInfo = await getFederation(backend, holon);\n\n if (!fedInfo || !fedInfo.federation || fedInfo.federation.length === 0) {\n return {\n ...result,\n message: `No federation found for ${holon}`\n };\n }\n\n if (!fedInfo.notify || fedInfo.notify.length === 0) {\n return {\n ...result,\n message: `No notification targets found for ${holon}`\n };\n }\n\n // Filter spaces to those in notify list\n let spaces = fedInfo.notify;\n\n if (targetSpaces && Array.isArray(targetSpaces) && targetSpaces.length > 0) {\n spaces = spaces.filter(space => targetSpaces.includes(space));\n }\n\n if (spaces.length === 0) {\n return {\n ...result,\n message: 'No valid target spaces found after filtering'\n };\n }\n\n const isAlreadyReference = backend.isReference(data);\n\n // Propagate to each target space\n for (const targetSpace of spaces) {\n try {\n if (useReferences && !isAlreadyReference) {\n // Create a reference\n const reference = backend.createReference(holon, lens, data);\n\n reference._federation = {\n origin: holon,\n lens: lens,\n timestamp: Date.now()\n };\n\n // Build path and write reference\n const path = backend.buildPath(backend.appName, targetSpace, lens, reference.id);\n await backend.write(path, reference);\n\n result.success++;\n } else if (isAlreadyReference) {\n // Propagate existing reference\n const referenceToStore = {\n ...data,\n _federation: data._federation || {\n origin: holon,\n lens: lens,\n timestamp: Date.now()\n }\n };\n\n const path = backend.buildPath(backend.appName, targetSpace, lens, data.id);\n await backend.write(path, referenceToStore);\n result.success++;\n } else {\n // Store full copy\n const dataToStore = {\n ...data,\n _federation: {\n origin: holon,\n lens: lens,\n timestamp: Date.now()\n }\n };\n\n const path = backend.buildPath(backend.appName, targetSpace, lens, data.id);\n await backend.write(path, dataToStore);\n result.success++;\n }\n } catch (error) {\n result.errors++;\n result.errorDetails.push({\n space: targetSpace,\n error: error.message\n });\n }\n }\n\n result.propagated = result.success > 0;\n return result;\n } catch (error) {\n console.error('Error in propagate:', error);\n return {\n ...result,\n error: error.message\n };\n }\n}\n\n/**\n * Get and combine data from local and federated sources\n * @param {Object} backend - The GunDBBackend instance\n * @param {string} holon - The local holon name\n * @param {string} lens - The lens to query\n * @param {Object} options - Options for data retrieval and aggregation\n * @returns {Promise<Array>} Combined array of local and federated data\n */\nexport async function getFederated(backend, holon, lens, options = {}) {\n const {\n aggregate = false,\n idField = 'id',\n sumFields = [],\n concatArrays = [],\n removeDuplicates = true,\n mergeStrategy = null,\n includeLocal = true,\n includeFederated = true,\n resolveReferences = true,\n maxFederatedSpaces = -1,\n timeout = 10000\n } = options;\n\n if (!backend || !holon || !lens) {\n throw new Error('Missing required parameters: backend, holon, and lens are required');\n }\n\n const fedInfo = await getFederation(backend, holon);\n\n const result = [];\n const processedIds = new Set();\n\n // Process federated spaces first\n if (includeFederated && fedInfo && fedInfo.federation && fedInfo.federation.length > 0) {\n const federatedSpaces = maxFederatedSpaces === -1\n ? fedInfo.federation\n : fedInfo.federation.slice(0, maxFederatedSpaces);\n\n for (const federatedSpace of federatedSpaces) {\n try {\n const path = backend.buildPath(backend.appName, federatedSpace, lens);\n const federatedItems = await backend.readAll(path);\n\n for (const item of federatedItems) {\n if (!item || !item[idField]) continue;\n\n result.push(item);\n processedIds.add(item[idField]);\n }\n } catch (error) {\n console.warn(`Error processing federated space ${federatedSpace}: ${error.message}`);\n }\n }\n }\n\n // Get local data\n if (includeLocal) {\n const localPath = backend.buildPath(backend.appName, holon, lens);\n const localData = await backend.readAll(localPath);\n\n for (const item of localData) {\n if (item && item[idField] && !processedIds.has(item[idField])) {\n result.push(item);\n processedIds.add(item[idField]);\n }\n }\n }\n\n // Resolve references\n if (resolveReferences) {\n for (let i = 0; i < result.length; i++) {\n const item = result[i];\n\n if (item.soul && item.id) {\n // Simple reference format\n try {\n const resolved = await backend.resolveReference(item);\n if (resolved) {\n result[i] = resolved;\n }\n } catch (error) {\n result[i] = {\n id: item.id,\n _federation: {\n isReference: true,\n resolved: false,\n soul: item.soul,\n error: error.message,\n timestamp: Date.now()\n }\n };\n }\n } else if (item._federation && item._federation.isReference) {\n // Legacy reference format\n try {\n const resolved = await backend.resolveReference(item);\n if (resolved) {\n result[i] = resolved;\n }\n } catch (error) {\n console.warn(`Error resolving legacy reference: ${error.message}`);\n }\n }\n }\n }\n\n // Apply aggregation if requested\n if (aggregate && result.length > 0) {\n const groupedById = result.reduce((acc, item) => {\n const id = item[idField];\n if (!acc[id]) {\n acc[id] = [];\n }\n acc[id].push(item);\n return acc;\n }, {});\n\n const aggregatedData = Object.values(groupedById).map(group => {\n if (group.length === 1) return group[0];\n\n if (mergeStrategy && typeof mergeStrategy === 'function') {\n return mergeStrategy(group);\n }\n\n const base = { ...group[0] };\n\n for (const field of sumFields) {\n if (typeof base[field] === 'number') {\n base[field] = group.reduce((sum, item) => sum + (Number(item[field]) || 0), 0);\n }\n }\n\n for (const field of concatArrays) {\n if (Array.isArray(base[field])) {\n const allValues = group.reduce((all, item) => {\n return Array.isArray(item[field]) ? [...all, ...item[field]] : all;\n }, []);\n\n base[field] = removeDuplicates ? Array.from(new Set(allValues)) : allValues;\n }\n }\n\n base._aggregated = {\n count: group.length,\n timestamp: Date.now()\n };\n\n return base;\n });\n\n return aggregatedData;\n }\n\n return result;\n}\n\n/**\n * Subscribes to federation notifications for a space\n * @param {Object} backend - The GunDBBackend instance\n * @param {string} spaceId - The space ID to subscribe to\n * @param {Function} callback - The callback to execute on notifications\n * @param {Object} options - Subscription options\n * @returns {Promise<Object>} Subscription object with unsubscribe() method\n */\nexport async function subscribeFederation(backend, spaceId, callback, options = {}) {\n if (!spaceId || !callback) {\n throw new Error('subscribeFederation: Missing required parameters');\n }\n\n const { lenses = ['*'], throttle = 0, resolveReferences = true } = options;\n\n const fedInfo = await getFederation(backend, spaceId);\n if (!fedInfo) {\n throw new Error('No federation info found for space');\n }\n\n const subscriptions = [];\n let lastNotificationTime = {};\n\n if (fedInfo.federation && fedInfo.federation.length > 0) {\n for (const federatedSpace of fedInfo.federation) {\n for (const lens of lenses) {\n try {\n const path = backend.buildPath(backend.appName, federatedSpace, lens);\n\n const sub = await backend.subscribe(path, async (data, key) => {\n try {\n if (!data || !data.id) return;\n\n // Apply throttling\n const now = Date.now();\n const throttleKey = `${federatedSpace}_${lens}_${data.id}`;\n\n if (throttle > 0) {\n if (lastNotificationTime[throttleKey] &&\n (now - lastNotificationTime[throttleKey]) < throttle) {\n return;\n }\n lastNotificationTime[throttleKey] = now;\n }\n\n // Resolve reference if needed\n let resolvedData = data;\n if (resolveReferences && backend.isReference(data)) {\n resolvedData = await backend.resolveReference(data);\n }\n\n if (!resolvedData._federation) {\n resolvedData._federation = {\n origin: federatedSpace,\n timestamp: now\n };\n }\n\n await callback(resolvedData, federatedSpace, lens);\n } catch (error) {\n console.warn('Federation notification error:', error);\n }\n }, { resolveReferences: false }); // Don't resolve in subscribe, we handle it\n\n if (sub && typeof sub.unsubscribe === 'function') {\n subscriptions.push(sub);\n }\n } catch (error) {\n console.warn(`Error creating subscription for ${federatedSpace}/${lens}:`, error);\n }\n }\n }\n }\n\n return {\n unsubscribe: () => {\n subscriptions.forEach(sub => {\n try {\n if (sub && typeof sub.unsubscribe === 'function') {\n sub.unsubscribe();\n }\n } catch (error) {\n console.warn('Error unsubscribing:', error);\n }\n });\n subscriptions.length = 0;\n lastNotificationTime = {};\n },\n getSubscriptionCount: () => subscriptions.length\n };\n}\n\n/**\n * Tracks a federated message across different chats\n * @param {Object} backend - The GunDBBackend instance\n * @param {string} originalChatId - The ID of the original chat\n * @param {string} messageId - The ID of the original message\n * @param {string} federatedChatId - The ID of the federated chat\n * @param {string} federatedMessageId - The ID of the message in the federated chat\n * @param {string} type - The type of message\n * @returns {Promise<void>}\n */\nexport async function federateMessage(backend, originalChatId, messageId, federatedChatId, federatedMessageId, type = 'generic') {\n const trackingKey = `${originalChatId}_${messageId}_fedmsgs`;\n let tracking = await backend.readGlobal('federation_messages', trackingKey);\n\n if (!tracking) {\n tracking = {\n id: trackingKey,\n originalChatId,\n originalMessageId: messageId,\n type,\n messages: []\n };\n }\n\n const existingMsg = tracking.messages.find(m => m.chatId === federatedChatId);\n if (existingMsg) {\n existingMsg.messageId = federatedMessageId;\n existingMsg.timestamp = Date.now();\n } else {\n tracking.messages.push({\n chatId: federatedChatId,\n messageId: federatedMessageId,\n timestamp: Date.now()\n });\n }\n\n await backend.writeGlobal('federation_messages', tracking);\n}\n\n/**\n * Gets all federated messages for a given original message\n * @param {Object} backend - The GunDBBackend instance\n * @param {string} originalChatId - The ID of the original chat\n * @param {string} messageId - The ID of the original message\n * @returns {Promise<Object|null>} The tracking information for the message\n */\nexport async function getFederatedMessages(backend, originalChatId, messageId) {\n const trackingKey = `${originalChatId}_${messageId}_fedmsgs`;\n return backend.readGlobal('federation_messages', trackingKey);\n}\n\n/**\n * Updates a federated message across all federated chats\n * @param {Object} backend - The GunDBBackend instance\n * @param {string} originalChatId - The ID of the original chat\n * @param {string} messageId - The ID of the original message\n * @param {Function} updateCallback - Function to update the message in each chat\n * @returns {Promise<void>}\n */\nexport async function updateFederatedMessages(backend, originalChatId, messageId, updateCallback) {\n const tracking = await getFederatedMessages(backend, originalChatId, messageId);\n if (!tracking?.messages) return;\n\n for (const msg of tracking.messages) {\n try {\n await updateCallback(msg.chatId, msg.messageId);\n } catch (error) {\n console.warn(`Failed to update federated message in chat ${msg.chatId}:`, error);\n }\n }\n}\n\nexport default {\n federate,\n unfederate,\n getFederation,\n resetFederation,\n removeNotify,\n propagate,\n getFederated,\n subscribeFederation,\n federateMessage,\n getFederatedMessages,\n updateFederatedMessages\n};\n","/**\n * Abstract Storage Backend Interface\n * All storage backends must implement this interface\n */\nexport class StorageBackend {\n constructor(config) {\n if (new.target === StorageBackend) {\n throw new Error('StorageBackend is abstract and cannot be instantiated directly');\n }\n this.config = config;\n this.publicKey = null;\n }\n\n /**\n * Initialize the backend\n * @returns {Promise<void>}\n */\n async init() {\n throw new Error('init() must be implemented by subclass');\n }\n\n /**\n * Build path from components\n * @param {string} appName - Application namespace\n * @param {string} holonId - Holon identifier (H3 hex or URI)\n * @param {string} lensName - Lens name\n * @param {string} [key] - Optional data key\n * @returns {string} Constructed path\n */\n buildPath(appName, holonId, lensName, key = null) {\n throw new Error('buildPath() must be implemented by subclass');\n }\n\n /**\n * Write data to storage\n * @param {string} path - Storage path\n * @param {Object} data - Data to write\n * @param {Object} [options] - Write options\n * @returns {Promise<boolean>} Success indicator\n */\n async write(path, data, options = {}) {\n throw new Error('write() must be implemented by subclass');\n }\n\n /**\n * Read data from storage\n * @param {string} path - Storage path\n * @param {Object} [options] - Read options\n * @param {string[]} [options.authors] - Public keys to query\n * @param {boolean} [options.includeAuthor] - Include author in response\n * @returns {Promise<Object|null>} Data or null\n */\n async read(path, options = {}) {\n throw new Error('read() must be implemented by subclass');\n }\n\n /**\n * Read all data under a path prefix\n * @param {string} path - Path prefix\n * @param {Object} [options] - Query options\n * @param {boolean} [options.hybrid] - Use hybrid mode (local + remote)\n * @param {string[]} [options.authors] - Public keys to query\n * @returns {Promise<Object[]>} Array of data objects\n */\n async readAll(path, options = {}) {\n throw new Error('readAll() must be implemented by subclass');\n }\n\n /**\n * Update data (merge fields)\n * @param {string} path - Storage path\n * @param {Object} updates - Fields to update\n * @returns {Promise<boolean>} Success indicator\n */\n async update(path, updates) {\n throw new Error('update() must be implemented by subclass');\n }\n\n /**\n * Delete data at path\n * @param {string} path - Storage path\n * @returns {Promise<boolean>} Success indicator\n */\n async delete(path) {\n throw new Error('delete() must be implemented by subclass');\n }\n\n /**\n * Delete all data under path prefix\n * @param {string} path - Path prefix\n * @returns {Promise<Object>} Deletion results { success: boolean, count: number }\n */\n async deleteAll(path) {\n throw new Error('deleteAll() must be implemented by subclass');\n }\n\n /**\n * Subscribe to data changes\n * @param {string} path - Path or path prefix\n * @param {Function} callback - Called on changes: (data, key) => void\n * @param {Object} [options] - Subscription options\n * @returns {Promise<Object>} Subscription with unsubscribe() method\n */\n async subscribe(path, callback, options = {}) {\n throw new Error('subscribe() must be implemented by subclass');\n }\n\n /**\n * Export all data for migration\n * @param {string} [pathPrefix] - Optional prefix to filter\n * @returns {Promise<Object[]>} Array of exportable records\n */\n async exportData(pathPrefix = '') {\n throw new Error('exportData() must be implemented by subclass');\n }\n\n /**\n * Import data from migration\n * @param {Object[]} records - Records to import\n * @param {Object} [options] - Import options\n * @param {boolean} [options.overwrite] - Overwrite existing data\n * @returns {Promise<Object>} Import results { success: number, failed: number, errors: [] }\n */\n async importData(records, options = {}) {\n throw new Error('importData() must be implemented by subclass');\n }\n\n /**\n * Close connections and cleanup\n */\n close() {\n throw new Error('close() must be implemented by subclass');\n }\n\n /**\n * Get backend status/health\n * @returns {Object} Status information { type, publicKey, connected, ... }\n */\n getStatus() {\n throw new Error('getStatus() must be implemented by subclass');\n }\n}\n","/**\n * GunDB Reference Handler\n * Handles creation and resolution of data references for federation\n *\n * References use a \"soul\" pattern: appname/holon/lens/key\n * This allows lightweight propagation without data duplication\n */\n\nimport { read } from './gun-wrapper.js';\n\n/**\n * Reference handler for GunDB backend\n */\nexport class GunReferenceHandler {\n /**\n * Create a new reference handler\n * @param {string} appname - Application namespace\n */\n constructor(appname) {\n this.appname = appname;\n }\n\n /**\n * Create a reference to data\n * @param {string} holon - Holon ID\n * @param {string} lens - Lens name\n * @param {Object} data - Data object (must have 'id' field)\n * @returns {Object} Reference object with id and soul\n */\n createReference(holon, lens, data) {\n if (!data || !data.id) {\n throw new Error('createReference: data must have an id field');\n }\n return {\n id: data.id,\n soul: `${this.appname}/${holon}/${lens}/${data.id}`\n };\n }\n\n /**\n * Check if data is a reference\n * @param {Object} data - Data to check\n * @returns {boolean} True if data is a reference\n */\n isReference(data) {\n if (!data) return false;\n\n // Simple reference format: { id, soul }\n if (data.soul && data.id && Object.keys(data).filter(k => !k.startsWith('_')).length <= 2) {\n return true;\n }\n\n // Legacy reference format: { _federation: { isReference: true } }\n if (data._federation && data._federation.isReference) {\n return true;\n }\n\n // Gun internal reference format: { _: { \"#\": \"path/to/data\" } }\n if (data._ && data._['#']) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Parse a soul path into its components\n * @param {string} soul - Soul path (appname/holon/lens/key)\n * @returns {Object|null} Parsed components or null if invalid\n */\n parseSoulPath(soul) {\n if (!soul || typeof soul !== 'string') {\n return null;\n }\n\n const parts = soul.split('/');\n if (parts.length < 4) {\n return null;\n }\n\n return {\n appname: parts[0],\n holon: parts[1],\n lens: parts[2],\n key: parts.slice(3).join('/') // Handle keys with slashes\n };\n }\n\n /**\n * Resolve a reference to get the actual data\n * @param {Object} gun - Gun instance\n * @param {Object} reference - Reference object\n * @param {Object} options - Resolution options\n * @param {boolean} options.followReferences - Whether to recursively resolve nested references (default: true)\n * @returns {Promise<Object|null>} Resolved data or null if not found\n */\n async resolveReference(gun, reference, options = {}) {\n const { followReferences = true } = options;\n\n if (!reference) {\n return null;\n }\n\n let soul = null;\n let originInfo = null;\n\n // Handle simple reference format { id, soul }\n if (reference.soul) {\n soul = reference.soul;\n }\n // Handle legacy reference format { _federation: { isReference: true, origin, lens } }\n else if (reference._federation && reference._federation.isReference) {\n const fed = reference._federation;\n if (fed.origin && fed.lens && reference.id) {\n soul = `${this.appname}/${fed.origin}/${fed.lens}/${reference.id}`;\n originInfo = fed;\n }\n }\n // Handle Gun internal reference format { _: { \"#\": \"path/to/data\" } }\n else if (reference._ && reference._['#']) {\n soul = reference._['#'];\n }\n\n if (!soul) {\n return null;\n }\n\n // Parse soul to get path components\n const parsed = this.parseSoulPath(soul);\n if (!parsed) {\n return null;\n }\n\n try {\n // Build path and read data\n const path = `${parsed.appname}/${parsed.holon}/${parsed.lens}/${parsed.key}`;\n const data = await read(gun, path);\n\n if (!data) {\n return null;\n }\n\n // Check if resolved data is also a reference and we should follow\n if (followReferences && this.isReference(data)) {\n const nested = await this.resolveReference(gun, data, { followReferences: true });\n if (nested) {\n return {\n ...nested,\n _federation: {\n resolved: true,\n soul: soul,\n origin: parsed.holon,\n lens: parsed.lens,\n timestamp: Date.now()\n }\n };\n }\n }\n\n // Add federation metadata to resolved data\n return {\n ...data,\n _federation: {\n resolved: true,\n soul: soul,\n origin: originInfo?.origin || parsed.holon,\n lens: originInfo?.lens || parsed.lens,\n timestamp: Date.now()\n }\n };\n } catch (error) {\n console.warn('Error resolving reference:', error);\n return null;\n }\n }\n\n /**\n * Get the soul path for data\n * @param {string} holon - Holon ID\n * @param {string} lens - Lens name\n * @param {string} key - Data key\n * @returns {string} Soul path\n */\n getSoul(holon, lens, key) {\n return `${this.appname}/${holon}/${lens}/${key}`;\n }\n}\n\n/**\n * Create a reference handler instance\n * @param {string} appname - Application namespace\n * @returns {GunReferenceHandler} Reference handler instance\n */\nexport function createReferenceHandler(appname) {\n return new GunReferenceHandler(appname);\n}\n\nexport default GunReferenceHandler;\n","/**\n * GunDB Authentication Handler\n * Handles user authentication and private data storage using Gun's user system\n *\n * Private data is stored under: user.get('private').get(lens).get(key)\n * Usernames are namespaced: ${appname}:${holonId}\n */\n\nimport { gunPromise, gunPut } from './gun-async.js';\n\n/**\n * Authentication handler for GunDB backend\n */\nexport class GunAuth {\n /**\n * Create a new authentication handler\n * @param {Object} gun - Gun instance\n * @param {string} appname - Application namespace\n */\n constructor(gun, appname) {\n this.gun = gun;\n this.appname = appname;\n this.user = null;\n this.authenticated = false;\n this.currentHolonId = null;\n }\n\n /**\n * Generate a namespaced username for a holon\n * @param {string} holonId - Holon ID\n * @returns {string} Namespaced username\n */\n userName(holonId) {\n return `${this.appname}:${holonId}`;\n }\n\n /**\n * Authenticate a user for a specific holon\n * @param {string} holonId - Holon ID\n * @param {string} password - Password\n * @returns {Promise<Object>} Authenticated user object\n */\n async authenticate(holonId, password) {\n if (!holonId || !password) {\n throw new Error('authenticate: holonId and password are required');\n }\n\n const username = this.userName(holonId);\n this.user = this.gun.user();\n\n return new Promise((resolve, reject) => {\n this.user.auth(username, password, (ack) => {\n if (ack.err) {\n this.authenticated = false;\n this.currentHolonId = null;\n reject(new Error(ack.err));\n } else {\n this.authenticated = true;\n this.currentHolonId = holonId;\n resolve(this.user);\n }\n });\n });\n }\n\n /**\n * Create a new user for a holon\n * @param {string} holonId - Holon ID\n * @param {string} password - Password\n * @returns {Promise<Object>} Created user object\n */\n async createUser(holonId, password) {\n if (!holonId || !password) {\n throw new Error('createUser: holonId and password are required');\n }\n\n const username = this.userName(holonId);\n this.user = this.gun.user();\n\n return new Promise((resolve, reject) => {\n this.user.create(username, password, (ack) => {\n if (ack.err) {\n reject(new Error(ack.err));\n } else {\n // Auto-login after creation\n this.user.auth(username, password, (authAck) => {\n if (authAck.err) {\n reject(new Error(authAck.err));\n } else {\n this.authenticated = true;\n this.currentHolonId = holonId;\n resolve(this.user);\n }\n });\n }\n });\n });\n }\n\n /**\n * Logout current user\n */\n logout() {\n if (this.user) {\n this.user.leave();\n }\n this.authenticated = false;\n this.currentHolonId = null;\n this.user = null;\n }\n\n /**\n * Check if currently authenticated\n * @returns {boolean} True if authenticated\n */\n isAuthenticated() {\n return this.authenticated && this.user !== null;\n }\n\n /**\n * Get the private data path for a lens and key\n * @param {string} lens - Lens name\n * @param {string} key - Data key (optional)\n * @returns {Object} Gun chain reference\n */\n getPrivatePath(lens, key = null) {\n if (!this.isAuthenticated()) {\n throw new Error('Not authenticated');\n }\n\n const basePath = this.user.get('private').get(lens);\n return key ? basePath.get(key) : basePath;\n }\n\n /**\n * Write data to private storage\n * @param {string} lens - Lens name\n * @param {string} key - Data key\n * @param {Object} data - Data to write\n * @returns {Promise<boolean>} Success indicator\n */\n async writePrivate(lens, key, data) {\n if (!this.isAuthenticated()) {\n throw new Error('Not authenticated');\n }\n\n if (!data || !key) {\n throw new Error('writePrivate: key and data are required');\n }\n\n try {\n const serialized = JSON.stringify(data);\n await gunPut(this.getPrivatePath(lens, key), serialized, 2000);\n return true;\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Read data from private storage\n * @param {string} lens - Lens name\n * @param {string} key - Data key\n * @returns {Promise<Object|null>} Data or null if not found\n */\n async readPrivate(lens, key) {\n if (!this.isAuthenticated()) {\n throw new Error('Not authenticated');\n }\n\n try {\n const rawData = await gunPromise(this.getPrivatePath(lens, key), 2000);\n\n if (!rawData) {\n return null;\n }\n\n // Deserialize - primary format is JSON string (like old holosphere)\n if (typeof rawData === 'string') {\n try {\n return JSON.parse(rawData);\n } catch (e) {\n return rawData; // Return as-is if not valid JSON\n }\n }\n\n // Legacy _json wrapper format\n if (rawData._json && typeof rawData._json === 'string') {\n try {\n return JSON.parse(rawData._json);\n } catch (e) {\n return null;\n }\n }\n\n // Plain object format\n if (typeof rawData === 'object') {\n const cleaned = { ...rawData };\n delete cleaned['_'];\n return cleaned;\n }\n\n return null;\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Read all data from a private lens\n * First gets count of items, then collects until count is reached\n * @param {string} lens - Lens name\n * @param {number} timeout - Timeout in ms (fallback)\n * @returns {Promise<Object[]>} Array of data objects\n */\n async readAllPrivate(lens, timeout = 5000) {\n if (!this.isAuthenticated()) {\n throw new Error('Not authenticated');\n }\n\n return new Promise((resolve) => {\n const results = [];\n const seen = new Set();\n const ref = this.getPrivatePath(lens);\n let settled = false;\n let expectedCount = 0;\n let receivedCount = 0;\n\n const tryResolve = () => {\n if (settled) return;\n if (expectedCount > 0 && receivedCount >= expectedCount) {\n settled = true;\n resolve(results);\n }\n };\n\n const parseItem = (data) => {\n if (!data) return null;\n let parsed = null;\n // Primary: JSON string format (like old holosphere)\n if (typeof data === 'string') {\n try {\n parsed = JSON.parse(data);\n } catch (e) {\n parsed = data;\n }\n // Legacy: _json wrapper format\n } else if (data._json && typeof data._json === 'string') {\n try {\n parsed = JSON.parse(data._json);\n } catch (e) {}\n // Plain object\n } else if (typeof data === 'object') {\n parsed = { ...data };\n delete parsed['_'];\n }\n return parsed;\n };\n\n // Step 1: Get parent to count expected items\n ref.once((parentData) => {\n if (settled) return;\n\n if (!parentData) {\n settled = true;\n resolve([]);\n return;\n }\n\n const keys = Object.keys(parentData).filter(k => k !== '_');\n if (keys.length === 0) {\n settled = true;\n resolve([]);\n return;\n }\n\n // Count references that need fetching\n expectedCount = keys.filter(k => {\n const item = parentData[k];\n return item && typeof item === 'object' && item['#'];\n }).length;\n\n // If no references, we're done\n if (expectedCount === 0) {\n settled = true;\n resolve([]);\n return;\n }\n\n // Step 2: Collect items, counting as we go\n ref.map().once((data, key) => {\n if (settled || !data || key.startsWith('_') || seen.has(key)) return;\n seen.add(key);\n\n const parsed = parseItem(data);\n if (parsed && !parsed._deleted) {\n results.push(parsed);\n }\n receivedCount++;\n tryResolve();\n });\n });\n\n // Fallback timeout\n setTimeout(() => {\n if (!settled) {\n settled = true;\n resolve(results);\n }\n }, timeout);\n });\n }\n\n /**\n * Delete data from private storage\n * @param {string} lens - Lens name\n * @param {string} key - Data key\n * @returns {Promise<boolean>} Success indicator\n */\n async deletePrivate(lens, key) {\n if (!this.isAuthenticated()) {\n throw new Error('Not authenticated');\n }\n\n try {\n // Get existing data to preserve ID\n const existing = await this.readPrivate(lens, key);\n\n // Create tombstone\n const tombstone = {\n id: existing?.id || key,\n _deleted: true,\n _deletedAt: Date.now()\n };\n\n await gunPut(this.getPrivatePath(lens, key), JSON.stringify(tombstone));\n return true;\n } catch (error) {\n throw error;\n }\n }\n}\n\n/**\n * Create an authentication handler instance\n * @param {Object} gun - Gun instance\n * @param {string} appname - Application namespace\n * @returns {GunAuth} Auth handler instance\n */\nexport function createAuthHandler(gun, appname) {\n return new GunAuth(gun, appname);\n}\n\nexport default GunAuth;\n","/**\n * GunDB Schema Validator\n * Handles JSON Schema validation for data stored in GunDB\n *\n * Schemas are stored in the global 'schemas' table\n * Validation uses AJV (Another JSON Schema Validator) with JSON Schema 2019\n */\n\nimport { writeGlobal, readGlobal, readAllGlobal, deleteGlobal } from './gun-wrapper.js';\n\n// Default meta-schema for validating schema definitions\nconst META_SCHEMA = {\n type: 'object',\n required: ['type'],\n properties: {\n $schema: { type: 'string' },\n $id: { type: 'string' },\n type: { type: 'string' },\n properties: { type: 'object' },\n required: { type: 'array', items: { type: 'string' } },\n additionalProperties: { type: 'boolean' }\n }\n};\n\n/**\n * Schema validator for GunDB backend\n */\nexport class GunSchemaValidator {\n /**\n * Create a new schema validator\n * @param {Object} options - Validator options\n * @param {boolean} options.strict - Whether to enforce strict validation (default: false)\n * @param {number} options.cacheMaxAge - Schema cache TTL in ms (default: 3600000 = 1 hour)\n */\n constructor(options = {}) {\n this.strict = options.strict || false;\n this.cacheMaxAge = options.cacheMaxAge || 3600000; // 1 hour\n this.schemaCache = new Map();\n this.validator = null;\n this.Ajv = null;\n }\n\n /**\n * Initialize the validator (lazy load AJV)\n * @returns {Promise<boolean>} True if initialized successfully\n */\n async init() {\n if (this.validator) {\n return true;\n }\n\n try {\n // Dynamically import AJV to avoid requiring it if not needed\n const AjvModule = await import('ajv/dist/2019.js');\n this.Ajv = AjvModule.default || AjvModule;\n\n this.validator = new this.Ajv({\n allErrors: true,\n strict: false,\n validateSchema: true\n });\n\n return true;\n } catch (error) {\n console.warn('AJV not available, schema validation disabled:', error.message);\n return false;\n }\n }\n\n /**\n * Set a schema for a lens\n * @param {Object} gun - Gun instance\n * @param {string} appname - Application namespace\n * @param {string} lens - Lens name\n * @param {Object} schema - JSON Schema definition\n * @returns {Promise<boolean>} Success indicator\n */\n async setSchema(gun, appname, lens, schema) {\n if (!schema || typeof schema !== 'object') {\n throw new Error('setSchema: schema must be an object');\n }\n\n // Validate the schema against meta-schema\n if (this.strict && this.validator) {\n const isValid = this.validateSchema(META_SCHEMA, schema);\n if (!isValid) {\n throw new Error('setSchema: Invalid schema definition');\n }\n }\n\n // Store schema in global 'schemas' table\n const schemaRecord = {\n id: lens,\n lens: lens,\n schema: schema,\n timestamp: Date.now()\n };\n\n await writeGlobal(gun, appname, 'schemas', schemaRecord);\n\n // Update cache\n this.schemaCache.set(lens, {\n schema: schema,\n timestamp: Date.now()\n });\n\n return true;\n }\n\n /**\n * Get a schema for a lens\n * @param {Object} gun - Gun instance\n * @param {string} appname - Application namespace\n * @param {string} lens - Lens name\n * @param {Object} options - Options\n * @param {boolean} options.useCache - Whether to use cache (default: true)\n * @returns {Promise<Object|null>} Schema or null if not found\n */\n async getSchema(gun, appname, lens, options = {}) {\n const { useCache = true } = options;\n\n // Check cache first\n if (useCache) {\n const cached = this.schemaCache.get(lens);\n if (cached && (Date.now() - cached.timestamp) < this.cacheMaxAge) {\n return cached.schema;\n }\n }\n\n // Fetch from storage\n const schemaRecord = await readGlobal(gun, appname, 'schemas', lens);\n\n if (schemaRecord && schemaRecord.schema) {\n // Update cache\n this.schemaCache.set(lens, {\n schema: schemaRecord.schema,\n timestamp: Date.now()\n });\n return schemaRecord.schema;\n }\n\n return null;\n }\n\n /**\n * Get all schemas\n * @param {Object} gun - Gun instance\n * @param {string} appname - Application namespace\n * @returns {Promise<Object[]>} Array of schema records\n */\n async getAllSchemas(gun, appname) {\n return readAllGlobal(gun, appname, 'schemas');\n }\n\n /**\n * Delete a schema\n * @param {Object} gun - Gun instance\n * @param {string} appname - Application namespace\n * @param {string} lens - Lens name\n * @returns {Promise<boolean>} Success indicator\n */\n async deleteSchema(gun, appname, lens) {\n // Remove from cache\n this.schemaCache.delete(lens);\n\n // Delete from storage\n return deleteGlobal(gun, appname, 'schemas', lens);\n }\n\n /**\n * Validate data against a schema\n * @param {Object} schema - JSON Schema definition\n * @param {Object} data - Data to validate\n * @returns {Object} Validation result { valid: boolean, errors: Array }\n */\n validate(schema, data) {\n if (!this.validator) {\n // If validator not available, skip validation\n return { valid: true, errors: [] };\n }\n\n try {\n const validate = this.validator.compile(schema);\n const valid = validate(data);\n\n return {\n valid: valid,\n errors: valid ? [] : this.formatErrors(validate.errors)\n };\n } catch (error) {\n return {\n valid: false,\n errors: [{ message: error.message, path: '' }]\n };\n }\n }\n\n /**\n * Validate data against a lens schema (fetch schema from storage)\n * @param {Object} gun - Gun instance\n * @param {string} appname - Application namespace\n * @param {string} lens - Lens name\n * @param {Object} data - Data to validate\n * @returns {Promise<Object>} Validation result { valid: boolean, errors: Array }\n */\n async validateData(gun, appname, lens, data) {\n const schema = await this.getSchema(gun, appname, lens);\n\n if (!schema) {\n // No schema defined, validation passes\n return { valid: true, errors: [] };\n }\n\n return this.validate(schema, data);\n }\n\n /**\n * Validate a schema definition against meta-schema\n * @param {Object} metaSchema - Meta schema to validate against\n * @param {Object} schema - Schema to validate\n * @returns {boolean} True if valid\n */\n validateSchema(metaSchema, schema) {\n if (!this.validator) {\n return true;\n }\n\n try {\n const validate = this.validator.compile(metaSchema);\n return validate(schema);\n } catch (error) {\n return false;\n }\n }\n\n /**\n * Format validation errors into a consistent structure\n * @private\n * @param {Array} errors - AJV error objects\n * @returns {Array} Formatted errors\n */\n formatErrors(errors) {\n if (!errors) return [];\n\n return errors.map(err => ({\n message: err.message || 'Validation error',\n path: err.instancePath || err.dataPath || '',\n keyword: err.keyword,\n params: err.params\n }));\n }\n\n /**\n * Clear the schema cache\n * @param {string} lens - Specific lens to clear, or null for all\n */\n clearCache(lens = null) {\n if (lens) {\n this.schemaCache.delete(lens);\n } else {\n this.schemaCache.clear();\n }\n }\n\n /**\n * Check if strict mode is enabled\n * @returns {boolean} True if strict mode enabled\n */\n isStrict() {\n return this.strict;\n }\n\n /**\n * Enable or disable strict mode\n * @param {boolean} strict - Whether to enable strict mode\n */\n setStrict(strict) {\n this.strict = strict;\n }\n}\n\n/**\n * Create a schema validator instance\n * @param {Object} options - Validator options\n * @returns {GunSchemaValidator} Validator instance\n */\nexport function createSchemaValidator(options = {}) {\n return new GunSchemaValidator(options);\n}\n\nexport default GunSchemaValidator;\n","/**\n * GunDB Storage Backend\n * Full-featured backend with authentication, schema validation, references, and global tables\n */\n\nimport { StorageBackend } from '../backend-interface.js';\nimport * as wrapper from '../gun-wrapper.js';\nimport { gunPromise, gunPut, gunMap, gunCollect } from '../gun-async.js';\nimport { GunReferenceHandler } from '../gun-references.js';\nimport { GunAuth } from '../gun-auth.js';\nimport { GunSchemaValidator } from '../gun-schema.js';\n\nexport class GunDBBackend extends StorageBackend {\n constructor(config) {\n super(config);\n this.gun = null;\n this.keyPair = null;\n this.appName = config.appName || 'holosphere';\n\n // New modules\n this.references = null;\n this.auth = null;\n this.schemaValidator = null;\n\n // Subscription tracking\n this.subscriptions = new Map();\n this.subscriptionCounter = 0;\n }\n\n async init() {\n // Dynamically import Gun to avoid issues if not installed\n let Gun;\n try {\n const gunModule = await import('gun');\n Gun = gunModule.default || gunModule;\n } catch (error) {\n throw new Error(\n 'GunDB backend requires the \"gun\" package. Install it with: npm install gun'\n );\n }\n\n const gunConfig = {\n peers: this.config.peers || [],\n radisk: this.config.radisk !== false,\n localStorage: this.config.localStorage !== false,\n file: this.config.dataDir,\n };\n\n this.gun = Gun(gunConfig);\n\n // Generate or use provided key pair using Gun's SEA\n try {\n const SEA = Gun.SEA;\n if (SEA) {\n if (this.config.privateKey) {\n // Try to restore from existing key\n this.keyPair = { priv: this.config.privateKey, pub: this.config.publicKey };\n this.publicKey = this.config.publicKey || this.config.privateKey.substring(0, 32);\n } else {\n // Generate new key pair\n this.keyPair = await SEA.pair();\n this.publicKey = this.keyPair.pub;\n }\n } else {\n // SEA not available, use simple identifier\n this.publicKey = this.appName;\n }\n } catch (error) {\n // SEA might not be loaded\n this.publicKey = this.appName;\n }\n\n // Initialize modules\n this.references = new GunReferenceHandler(this.appName);\n this.auth = new GunAuth(this.gun, this.appName);\n this.schemaValidator = new GunSchemaValidator({\n strict: this.config.strict || false,\n cacheMaxAge: this.config.schemaCacheMaxAge || 3600000\n });\n\n // Try to initialize schema validator (may fail if AJV not installed)\n await this.schemaValidator.init();\n }\n\n // ============================================================================\n // PATH BUILDING\n // ============================================================================\n\n buildPath(appName, holonId, lensName, key = null) {\n return wrapper.buildPath(appName, holonId, lensName, key);\n }\n\n buildGlobalPath(tableName, key = null) {\n return wrapper.buildGlobalPath(this.appName, tableName, key);\n }\n\n // ============================================================================\n // BASIC CRUD OPERATIONS\n // ============================================================================\n\n async write(path, data, options = {}) {\n // Validate against schema if strict mode\n if (this.schemaValidator && this.schemaValidator.isStrict()) {\n const pathParts = path.split('/');\n if (pathParts.length >= 3) {\n const lens = pathParts[2];\n // Skip validation for references\n if (!this.isReference(data)) {\n const result = await this.schemaValidator.validateData(\n this.gun, this.appName, lens, data\n );\n if (!result.valid) {\n throw new Error(`Schema validation failed: ${JSON.stringify(result.errors)}`);\n }\n }\n }\n }\n\n return wrapper.write(this.gun, path, data);\n }\n\n async read(path, options = {}) {\n const data = await wrapper.read(this.gun, path);\n\n // Resolve references if requested\n if (data && options.resolveReferences && this.isReference(data)) {\n return this.resolveReference(data);\n }\n\n return data;\n }\n\n async readAll(path, options = {}) {\n const items = await wrapper.readAll(this.gun, path);\n\n // Resolve references if requested\n if (options.resolveReferences) {\n const resolved = [];\n for (const item of items) {\n if (this.isReference(item)) {\n const resolvedItem = await this.resolveReference(item);\n if (resolvedItem) {\n resolved.push(resolvedItem);\n }\n } else {\n resolved.push(item);\n }\n }\n return resolved;\n }\n\n return items;\n }\n\n async update(path, updates) {\n return wrapper.update(this.gun, path, updates);\n }\n\n async delete(path) {\n return wrapper.deleteData(this.gun, path);\n }\n\n async deleteAll(path) {\n const items = await this.readAll(path);\n let count = 0;\n\n for (const item of items) {\n if (item && item.id) {\n const itemPath = `${path}/${item.id}`;\n await wrapper.deleteData(this.gun, itemPath);\n count++;\n }\n }\n\n return { success: true, count };\n }\n\n // ============================================================================\n // GLOBAL TABLE OPERATIONS\n // ============================================================================\n\n async writeGlobal(tableName, data) {\n return wrapper.writeGlobal(this.gun, this.appName, tableName, data);\n }\n\n async readGlobal(tableName, key) {\n return wrapper.readGlobal(this.gun, this.appName, tableName, key);\n }\n\n async readAllGlobal(tableName, timeout = 5000) {\n return wrapper.readAllGlobal(this.gun, this.appName, tableName, timeout);\n }\n\n async deleteGlobal(tableName, key) {\n return wrapper.deleteGlobal(this.gun, this.appName, tableName, key);\n }\n\n async deleteAllGlobal(tableName) {\n return wrapper.deleteAllGlobal(this.gun, this.appName, tableName);\n }\n\n // ============================================================================\n // REFERENCE OPERATIONS\n // ============================================================================\n\n /**\n * Create a reference to data\n */\n createReference(holon, lens, data) {\n return this.references.createReference(holon, lens, data);\n }\n\n /**\n * Check if data is a reference\n */\n isReference(data) {\n return this.references.isReference(data);\n }\n\n /**\n * Resolve a reference to get actual data\n */\n async resolveReference(reference, options = {}) {\n return this.references.resolveReference(this.gun, reference, options);\n }\n\n /**\n * Parse a soul path\n */\n parseSoulPath(soul) {\n return this.references.parseSoulPath(soul);\n }\n\n /**\n * Get soul for data\n */\n getSoul(holon, lens, key) {\n return this.references.getSoul(holon, lens, key);\n }\n\n // ============================================================================\n // AUTHENTICATION OPERATIONS\n // ============================================================================\n\n /**\n * Authenticate for a holon\n */\n async authenticate(holonId, password) {\n return this.auth.authenticate(holonId, password);\n }\n\n /**\n * Create a new user\n */\n async createUser(holonId, password) {\n return this.auth.createUser(holonId, password);\n }\n\n /**\n * Logout current user\n */\n logout() {\n this.auth.logout();\n }\n\n /**\n * Check if authenticated\n */\n isAuthenticated() {\n return this.auth.isAuthenticated();\n }\n\n /**\n * Write to private storage\n */\n async writePrivate(lens, key, data) {\n return this.auth.writePrivate(lens, key, data);\n }\n\n /**\n * Read from private storage\n */\n async readPrivate(lens, key) {\n return this.auth.readPrivate(lens, key);\n }\n\n /**\n * Read all from private lens\n */\n async readAllPrivate(lens, timeout = 2000) {\n return this.auth.readAllPrivate(lens, timeout);\n }\n\n /**\n * Delete from private storage\n */\n async deletePrivate(lens, key) {\n return this.auth.deletePrivate(lens, key);\n }\n\n // ============================================================================\n // SCHEMA OPERATIONS\n // ============================================================================\n\n /**\n * Set a schema for a lens\n */\n async setSchema(lens, schema) {\n return this.schemaValidator.setSchema(this.gun, this.appName, lens, schema);\n }\n\n /**\n * Get a schema for a lens\n */\n async getSchema(lens, options = {}) {\n return this.schemaValidator.getSchema(this.gun, this.appName, lens, options);\n }\n\n /**\n * Get all schemas\n */\n async getAllSchemas() {\n return this.schemaValidator.getAllSchemas(this.gun, this.appName);\n }\n\n /**\n * Delete a schema\n */\n async deleteSchema(lens) {\n return this.schemaValidator.deleteSchema(this.gun, this.appName, lens);\n }\n\n /**\n * Validate data against a schema\n */\n validate(schema, data) {\n return this.schemaValidator.validate(schema, data);\n }\n\n /**\n * Validate data against a lens schema\n */\n async validateData(lens, data) {\n return this.schemaValidator.validateData(this.gun, this.appName, lens, data);\n }\n\n /**\n * Clear schema cache\n */\n clearSchemaCache(lens = null) {\n this.schemaValidator.clearCache(lens);\n }\n\n // ============================================================================\n // SUBSCRIPTIONS\n // ============================================================================\n\n async subscribe(path, callback, options = {}) {\n const subscriptionId = ++this.subscriptionCounter;\n const pathParts = path.split('/');\n const isPrefix = pathParts.length <= 3;\n\n const subscription = {\n id: subscriptionId,\n path,\n active: true,\n gunRef: null\n };\n\n if (isPrefix) {\n const ref = this.gun.get(path);\n subscription.gunRef = ref;\n\n ref.map().on(async (data, key) => {\n if (!this.subscriptions.get(subscriptionId)?.active) return;\n if (!data || key.startsWith('_') || data._deleted) return;\n\n // Parse data\n let parsed = wrapper.parse(data);\n if (!parsed) return;\n\n // Resolve references if requested\n if (options.resolveReferences && this.isReference(parsed)) {\n parsed = await this.resolveReference(parsed);\n }\n\n if (parsed) {\n callback(parsed, key);\n }\n });\n } else {\n const ref = this.gun.get(path);\n subscription.gunRef = ref;\n\n ref.on(async (data, key) => {\n if (!this.subscriptions.get(subscriptionId)?.active) return;\n if (!data) return;\n\n let parsed = wrapper.parse(data);\n if (!parsed || parsed._deleted) return;\n\n if (options.resolveReferences && this.isReference(parsed)) {\n parsed = await this.resolveReference(parsed);\n }\n\n if (parsed) {\n callback(parsed, key);\n }\n });\n }\n\n this.subscriptions.set(subscriptionId, subscription);\n\n return {\n id: subscriptionId,\n unsubscribe: () => {\n const sub = this.subscriptions.get(subscriptionId);\n if (sub) {\n sub.active = false;\n if (sub.gunRef) {\n try {\n sub.gunRef.off();\n } catch (e) {}\n }\n this.subscriptions.delete(subscriptionId);\n }\n }\n };\n }\n\n // ============================================================================\n // EXPORT/IMPORT\n // ============================================================================\n\n async exportData(pathPrefix = '') {\n const records = [];\n const basePath = pathPrefix || this.appName;\n\n try {\n const items = await gunMap(this.gun.get(basePath), 2000);\n\n for (const [key, data] of Object.entries(items)) {\n if (!key.startsWith('_') && data && typeof data === 'object' && !data._deleted) {\n await this._collectRecords(basePath, key, data, records);\n }\n }\n } catch (error) {\n console.warn('Export data error:', error);\n }\n\n return records;\n }\n\n async _collectRecords(basePath, key, data, records) {\n const currentPath = `${basePath}/${key}`;\n\n if (data.id) {\n records.push({\n path: currentPath,\n data: this._cleanGunData(data),\n timestamp: data._meta?.timestamp || Date.now(),\n });\n } else {\n try {\n const nested = await gunMap(this.gun.get(currentPath), 500);\n for (const [nestedKey, nestedData] of Object.entries(nested)) {\n if (!nestedKey.startsWith('_') && nestedData) {\n await this._collectRecords(currentPath, nestedKey, nestedData, records);\n }\n }\n } catch (e) {}\n }\n }\n\n _cleanGunData(data) {\n const cleaned = { ...data };\n delete cleaned['_'];\n return cleaned;\n }\n\n async importData(records, options = {}) {\n const results = { success: 0, failed: 0, errors: [] };\n\n for (const record of records) {\n try {\n await wrapper.write(this.gun, record.path, record.data);\n results.success++;\n } catch (error) {\n results.failed++;\n results.errors.push({ path: record.path, error: error.message });\n }\n }\n\n return results;\n }\n\n // ============================================================================\n // LIFECYCLE\n // ============================================================================\n\n close() {\n // 1. Unsubscribe all active subscriptions\n for (const [id, subscription] of this.subscriptions) {\n if (subscription.active) {\n subscription.active = false;\n if (subscription.gunRef) {\n try {\n subscription.gunRef.off();\n } catch (e) {}\n }\n }\n }\n this.subscriptions.clear();\n\n // 2. Clear schema cache\n if (this.schemaValidator) {\n this.schemaValidator.clearCache();\n }\n\n // 3. Logout auth\n if (this.auth) {\n this.auth.logout();\n }\n\n // 4. Clean up Gun connections\n if (this.gun) {\n try {\n // Clean up mesh connections\n const mesh = this.gun.back('opt.mesh');\n if (mesh) {\n if (mesh.way) {\n Object.values(mesh.way).forEach(conn => {\n if (conn?.wire?.close) conn.wire.close();\n });\n }\n if (mesh.opt?.peers) mesh.opt.peers = {};\n }\n\n // Close web server if present\n const server = this.gun.back('opt.web');\n if (server?.close) server.close();\n\n // Turn off all listeners\n this.gun.off();\n } catch (error) {\n console.warn('Error during Gun cleanup:', error);\n }\n }\n }\n\n getStatus() {\n return {\n type: 'gundb',\n publicKey: this.publicKey,\n peers: this.config.peers || [],\n connected: !!this.gun,\n authenticated: this.isAuthenticated(),\n subscriptionCount: this.subscriptions.size,\n schemaValidationEnabled: this.schemaValidator?.isStrict() || false\n };\n }\n}\n\nexport default GunDBBackend;\n","import { createClient } from '../storage/nostr-client.js';\nimport { BackendFactory } from '../storage/backend-factory.js';\nimport * as gunWrapper from '../storage/gun-wrapper.js';\nimport * as gunFederation from '../storage/gun-federation.js';\nimport { GunDBBackend } from '../storage/backends/gundb-backend.js';\nimport pkg from '../../package.json' with { type: 'json' };\n\n// Gun will be loaded dynamically when needed\nlet Gun = null;\nlet gunLoadPromise = null;\n\n/**\n * Load Gun module dynamically\n * @returns {Promise<Function>} Gun constructor\n */\nasync function loadGun() {\n if (Gun) return Gun;\n if (gunLoadPromise) return gunLoadPromise;\n\n gunLoadPromise = import('gun').then(module => {\n Gun = module.default || module;\n return Gun;\n });\n\n return gunLoadPromise;\n}\n\n/**\n * Get environment variable (works in Node.js, returns undefined in browser)\n * @param {string} name - Environment variable name\n * @returns {string|undefined}\n */\nfunction getEnv(name) {\n if (typeof process !== 'undefined' && process.env) {\n return process.env[name];\n }\n return undefined;\n}\n\n/**\n * Parse relay URLs from environment variable or use defaults\n * @returns {string[]}\n */\nfunction getDefaultRelays() {\n const envRelays = getEnv('HOLOSPHERE_RELAYS');\n if (envRelays) {\n return envRelays.split(',').map(r => r.trim()).filter(r => r);\n }\n return ['wss://relay.holons.io'];\n}\n\n/**\n * HoloSphere - Holonic Geospatial Communication Infrastructure\n * Combines H3 hexagonal indexing with distributed P2P storage\n * Supports multiple storage backends: nostr, gundb, activitypub\n */\nexport class HoloSphere {\n /**\n * @param {Object} config - Configuration options\n * @param {string} config.appName - Application namespace (default: 'holosphere')\n * @param {string} config.backend - Storage backend: 'nostr' | 'gundb' | 'activitypub' (default: 'nostr')\n * @param {string[]} config.relays - Nostr relay URLs (default from HOLOSPHERE_RELAYS env or ['wss://relay.holons.io', 'wss://relay.nostr.band'])\n * @param {string} config.privateKey - Private key for signing (hex format, optional)\n * @param {string} config.logLevel - Log verbosity: ERROR|WARN|INFO|DEBUG (default: 'WARN')\n * @param {boolean} config.hybridMode - Enable hybrid mode (local + relay queries) (default: true)\n * @param {Object} config.gundb - GunDB-specific configuration\n * @param {Object} config.activitypub - ActivityPub-specific configuration\n */\n constructor(config = {}) {\n // Allow string as shorthand for appName (backward compatibility)\n if (typeof config === 'string') {\n config = { appName: config };\n }\n\n // Validate config\n if (config && typeof config !== 'object') {\n throw new TypeError('Config must be an object');\n }\n\n // Validate individual config properties\n if (config.appName !== undefined && typeof config.appName !== 'string') {\n throw new TypeError('config.appName must be a string');\n }\n if (config.relays !== undefined && !Array.isArray(config.relays)) {\n throw new TypeError('config.relays must be an array');\n }\n if (config.logLevel !== undefined && !['ERROR', 'WARN', 'INFO', 'DEBUG'].includes(config.logLevel)) {\n throw new TypeError('config.logLevel must be one of: ERROR, WARN, INFO, DEBUG');\n }\n if (config.backend !== undefined && !BackendFactory.isAvailable(config.backend)) {\n throw new TypeError(`config.backend must be one of: ${BackendFactory.getAvailableBackends().join(', ')}`);\n }\n\n // Set defaults (with environment variable fallbacks)\n this.config = {\n appName: config.appName || getEnv('HOLOSPHERE_APP_NAME') || 'holosphere',\n backend: config.backend || 'nostr',\n relays: config.relays || getDefaultRelays(),\n privateKey: config.privateKey || getEnv('HOLOSPHERE_PRIVATE_KEY'),\n logLevel: config.logLevel || getEnv('HOLOSPHERE_LOG_LEVEL') || 'WARN',\n hybridMode: config.hybridMode !== false, // Enable by default\n };\n\n // Store raw config for backend initialization\n this._rawConfig = config;\n\n // Initialize logging\n this.logLevels = { ERROR: 0, WARN: 1, INFO: 2, DEBUG: 3 };\n this.currentLogLevel = this.logLevels[this.config.logLevel] || 1;\n\n // Backend instance (set during initialization)\n this._backend = null;\n\n // For backward compatibility with Nostr, initialize synchronously\n // GunDB and other backends use async initialization via _backendReady\n if (this.config.backend === 'nostr') {\n this._initNostrSync(config);\n } else if (this.config.backend === 'gundb') {\n // GunDB uses async init due to dynamic import\n this._backendReady = this._initGunDBAsync(config);\n } else {\n // Async initialization for other backends\n this._backendReady = this._initBackendAsync(config);\n }\n\n // Metrics tracking\n this._metrics = {\n writes: 0,\n reads: 0,\n subscriptions: 0,\n };\n }\n\n /**\n * Initialize Nostr backend synchronously (for backward compatibility)\n * @private\n */\n _initNostrSync(config) {\n try {\n this.client = createClient({\n relays: this.config.relays,\n privateKey: this.config.privateKey,\n enableReconnect: config.enableReconnect !== false,\n enablePing: config.enablePing !== false,\n appName: this.config.appName,\n radisk: config.radisk !== false,\n persistence: config.persistence !== false,\n dataDir: config.dataDir,\n });\n\n // Log startup information\n this._logStartup({\n version: pkg.version,\n appName: this.config.appName,\n backend: 'nostr',\n relays: this.config.relays,\n publicKey: this.client.publicKey,\n logLevel: this.config.logLevel,\n persistence: config.persistence !== false,\n reconnect: config.enableReconnect !== false,\n dataDir: config.dataDir,\n });\n\n // Backend ready immediately for Nostr\n this._backendReady = Promise.resolve();\n } catch (error) {\n this._log('ERROR', 'Nostr client initialization failed', { error: error.message });\n throw new Error(`Nostr client initialization failed: ${error.message}`);\n }\n }\n\n /**\n * Initialize GunDB backend asynchronously (for browser compatibility with dynamic import)\n * @private\n */\n async _initGunDBAsync(config) {\n try {\n const gundbConfig = config.gundb || {};\n\n // Create the full-featured GunDB backend\n this._backend = new GunDBBackend({\n appName: this.config.appName,\n peers: gundbConfig.peers || [],\n radisk: gundbConfig.radisk !== false,\n localStorage: gundbConfig.localStorage !== false,\n dataDir: config.dataDir,\n privateKey: this.config.privateKey,\n strict: gundbConfig.strict || false,\n schemaCacheMaxAge: gundbConfig.schemaCacheMaxAge || 3600000,\n });\n\n // Initialize the backend\n await this._backend.init();\n\n // Set public key from backend\n this.publicKey = this._backend.publicKey;\n\n // Store Gun instance for direct access\n this._gun = this._backend.gun;\n\n // Create a client-like interface for compatibility\n this.client = {\n publicKey: this.publicKey,\n gun: this._gun,\n write: (path, data) => this._backend.write(path, data),\n read: (path, options) => this._backend.read(path, options),\n readAll: (path, options) => this._backend.readAll(path, options),\n update: (path, updates) => this._backend.update(path, updates),\n delete: (path) => this._backend.delete(path),\n subscribe: (path, callback, options) => this._backend.subscribe(path, callback, options),\n buildPath: gunWrapper.buildPath,\n };\n\n // Store Gun wrapper functions for direct access\n this._gunWrapper = gunWrapper;\n\n // Log startup information\n this._logStartup({\n version: pkg.version,\n appName: this.config.appName,\n backend: 'gundb',\n peers: gundbConfig.peers || [],\n publicKey: this.publicKey,\n logLevel: this.config.logLevel,\n persistence: gundbConfig.radisk !== false,\n dataDir: config.dataDir,\n });\n } catch (error) {\n this._log('ERROR', 'GunDB client initialization failed', { error: error.message });\n throw new Error(`GunDB client initialization failed: ${error.message}`);\n }\n }\n\n /**\n * Initialize non-Nostr backends asynchronously\n * @private\n */\n async _initBackendAsync(config) {\n const backendType = this.config.backend;\n const backendSpecificConfig = config[backendType] || {};\n\n try {\n // Merge common config with backend-specific config\n const backendConfig = {\n appName: this.config.appName,\n privateKey: this.config.privateKey,\n persistence: config.persistence !== false,\n dataDir: config.dataDir,\n ...backendSpecificConfig,\n };\n\n this._backend = await BackendFactory.create(backendType, backendConfig);\n\n // For compatibility, also set client if backend has one\n this.client = this._backend.client || this._backend;\n\n // Log startup information\n this._logStartup({\n version: pkg.version,\n appName: this.config.appName,\n backend: backendType,\n publicKey: this._backend.publicKey,\n logLevel: this.config.logLevel,\n persistence: config.persistence !== false,\n ...this._backend.getStatus(),\n });\n } catch (error) {\n this._log('ERROR', `${backendType} backend initialization failed`, { error: error.message });\n throw new Error(`${backendType} backend initialization failed: ${error.message}`);\n }\n }\n\n /**\n * Ensure backend is ready before operations\n * @returns {Promise<void>}\n */\n async ready() {\n if (this._backendReady) {\n await this._backendReady;\n }\n }\n\n /**\n * Get the storage backend instance\n * @returns {StorageBackend|null}\n */\n get backend() {\n return this._backend;\n }\n\n /**\n * Internal structured logging\n * @private\n */\n _log(level, message, data = {}) {\n if (this.logLevels[level] <= this.currentLogLevel) {\n const logEntry = {\n timestamp: Date.now(),\n level,\n message,\n app: this.config.appName,\n ...data,\n };\n console.log(JSON.stringify(logEntry));\n }\n }\n\n /**\n * Log startup information in a user-friendly format\n * @private\n */\n _logStartup(info) {\n // Only log if INFO or DEBUG level\n if (this.currentLogLevel >= this.logLevels.INFO) {\n console.log('\\n' + '='.repeat(60));\n console.log(' HoloSphere - Holonic Geospatial Infrastructure');\n console.log('='.repeat(60));\n console.log(` Version: ${info.version}`);\n console.log(` App Name: ${info.appName}`);\n console.log(` Backend: ${info.backend || 'nostr'}`);\n console.log(` Public Key: ${info.publicKey ? info.publicKey.substring(0, 16) + '...' : 'N/A'}`);\n console.log(` Log Level: ${info.logLevel}`);\n console.log(` Persistence: ${info.persistence ? 'Enabled' : 'Disabled'}${info.dataDir ? ` (${info.dataDir})` : ''}`);\n\n // Backend-specific info\n if (info.backend === 'nostr' || !info.backend) {\n console.log(` Auto-reconnect: ${info.reconnect ? 'Enabled' : 'Disabled'}`);\n console.log('\\n Connected Relays:');\n if (!info.relays || info.relays.length === 0) {\n console.log(' (none - running in local mode)');\n } else {\n info.relays.forEach((relay, idx) => {\n console.log(` ${idx + 1}. ${relay}`);\n });\n }\n } else if (info.backend === 'gundb') {\n console.log('\\n Gun Peers:');\n if (!info.peers || info.peers.length === 0) {\n console.log(' (none - running in local mode)');\n } else {\n info.peers.forEach((peer, idx) => {\n console.log(` ${idx + 1}. ${peer}`);\n });\n }\n } else if (info.backend === 'activitypub') {\n console.log(` Server URL: ${info.serverUrl || 'N/A'}`);\n console.log(` Actor ID: ${info.actorId || 'N/A'}`);\n }\n\n console.log('='.repeat(60) + '\\n');\n }\n }\n\n /**\n * Get metrics\n * @returns {Object} Operation counts\n */\n metrics() {\n return { ...this._metrics };\n }\n\n // ============================================================================\n // GUNDB-SPECIFIC METHODS\n // These methods are only available when using the 'gundb' backend\n // ============================================================================\n\n /**\n * Check if using GunDB backend\n * @private\n */\n _requireGunDB() {\n if (this.config.backend !== 'gundb') {\n throw new Error('This method requires the GunDB backend');\n }\n if (!this._backend) {\n throw new Error('Backend not initialized. Call ready() first.');\n }\n }\n\n // ============================================================================\n // GLOBAL TABLE OPERATIONS\n // ============================================================================\n\n /**\n * Write data to a global table\n * @param {string} tableName - Global table name (e.g., 'federation', 'schemas')\n * @param {Object} data - Data to write (must have 'id' field)\n * @returns {Promise<boolean>} Success indicator\n */\n async putGlobal(tableName, data) {\n await this.ready();\n this._requireGunDB();\n return this._backend.writeGlobal(tableName, data);\n }\n\n /**\n * Read data from a global table\n * @param {string} tableName - Global table name\n * @param {string} key - Data key\n * @returns {Promise<Object|null>} Data or null if not found\n */\n async getGlobal(tableName, key) {\n await this.ready();\n this._requireGunDB();\n return this._backend.readGlobal(tableName, key);\n }\n\n /**\n * Read all data from a global table\n * @param {string} tableName - Global table name\n * @returns {Promise<Object[]>} Array of data objects\n */\n async getAllGlobal(tableName) {\n await this.ready();\n this._requireGunDB();\n return this._backend.readAllGlobal(tableName);\n }\n\n /**\n * Delete data from a global table\n * @param {string} tableName - Global table name\n * @param {string} key - Data key\n * @returns {Promise<boolean>} Success indicator\n */\n async deleteGlobal(tableName, key) {\n await this.ready();\n this._requireGunDB();\n return this._backend.deleteGlobal(tableName, key);\n }\n\n // ============================================================================\n // REFERENCE OPERATIONS\n // ============================================================================\n\n /**\n * Create a reference to data\n * @param {string} holon - Holon ID\n * @param {string} lens - Lens name\n * @param {Object} data - Data object (must have 'id' field)\n * @returns {Object} Reference object with id and soul\n */\n createReference(holon, lens, data) {\n this._requireGunDB();\n return this._backend.createReference(holon, lens, data);\n }\n\n /**\n * Check if data is a reference\n * @param {Object} data - Data to check\n * @returns {boolean} True if data is a reference\n */\n isReference(data) {\n this._requireGunDB();\n return this._backend.isReference(data);\n }\n\n /**\n * Resolve a reference to get actual data\n * @param {Object} reference - Reference object\n * @param {Object} options - Resolution options\n * @returns {Promise<Object|null>} Resolved data or null\n */\n async resolveReference(reference, options = {}) {\n await this.ready();\n this._requireGunDB();\n return this._backend.resolveReference(reference, options);\n }\n\n // ============================================================================\n // AUTHENTICATION OPERATIONS\n // ============================================================================\n\n /**\n * Authenticate for a holon\n * @param {string} holonId - Holon ID\n * @param {string} password - Password\n * @returns {Promise<Object>} Authenticated user object\n */\n async authenticate(holonId, password) {\n await this.ready();\n this._requireGunDB();\n return this._backend.authenticate(holonId, password);\n }\n\n /**\n * Create a new user for a holon\n * @param {string} holonId - Holon ID\n * @param {string} password - Password\n * @returns {Promise<Object>} Created user object\n */\n async createUser(holonId, password) {\n await this.ready();\n this._requireGunDB();\n return this._backend.createUser(holonId, password);\n }\n\n /**\n * Logout current user\n */\n logout() {\n this._requireGunDB();\n this._backend.logout();\n }\n\n /**\n * Check if authenticated\n * @returns {boolean} True if authenticated\n */\n isAuthenticated() {\n this._requireGunDB();\n return this._backend.isAuthenticated();\n }\n\n /**\n * Write to private storage (requires authentication)\n * @param {string} lens - Lens name\n * @param {string} key - Data key\n * @param {Object} data - Data to write\n * @returns {Promise<boolean>} Success indicator\n */\n async writePrivate(lens, key, data) {\n await this.ready();\n this._requireGunDB();\n return this._backend.writePrivate(lens, key, data);\n }\n\n /**\n * Read from private storage (requires authentication)\n * @param {string} lens - Lens name\n * @param {string} key - Data key\n * @returns {Promise<Object|null>} Data or null\n */\n async readPrivate(lens, key) {\n await this.ready();\n this._requireGunDB();\n return this._backend.readPrivate(lens, key);\n }\n\n // ============================================================================\n // SCHEMA OPERATIONS\n // ============================================================================\n\n /**\n * Set a schema for a lens\n * @param {string} lens - Lens name\n * @param {Object} schema - JSON Schema definition\n * @returns {Promise<boolean>} Success indicator\n */\n async setSchema(lens, schema) {\n await this.ready();\n this._requireGunDB();\n return this._backend.setSchema(lens, schema);\n }\n\n /**\n * Get a schema for a lens\n * @param {string} lens - Lens name\n * @returns {Promise<Object|null>} Schema or null\n */\n async getSchema(lens) {\n await this.ready();\n this._requireGunDB();\n return this._backend.getSchema(lens);\n }\n\n /**\n * Validate data against a lens schema\n * @param {string} lens - Lens name\n * @param {Object} data - Data to validate\n * @returns {Promise<Object>} Validation result { valid: boolean, errors: Array }\n */\n async validateData(lens, data) {\n await this.ready();\n this._requireGunDB();\n return this._backend.validateData(lens, data);\n }\n\n // ============================================================================\n // FEDERATION OPERATIONS\n // ============================================================================\n\n /**\n * Create a federation relationship between two spaces\n * @param {string} spaceId1 - First space ID\n * @param {string} spaceId2 - Second space ID\n * @param {boolean} bidirectional - Whether to set up bidirectional notifications (default: true)\n * @returns {Promise<boolean>} True if federation was created\n */\n async federate(spaceId1, spaceId2, bidirectional = true) {\n await this.ready();\n this._requireGunDB();\n return gunFederation.federate(this._backend, spaceId1, spaceId2, bidirectional);\n }\n\n /**\n * Remove a federation relationship\n * @param {string} spaceId1 - First space ID\n * @param {string} spaceId2 - Second space ID\n * @returns {Promise<boolean>} True if federation was removed\n */\n async unfederate(spaceId1, spaceId2) {\n await this.ready();\n this._requireGunDB();\n return gunFederation.unfederate(this._backend, spaceId1, spaceId2);\n }\n\n /**\n * Get federation info for a space\n * @param {string} spaceId - Space ID\n * @returns {Promise<Object|null>} Federation info or null\n */\n async getFederation(spaceId) {\n await this.ready();\n this._requireGunDB();\n return gunFederation.getFederation(this._backend, spaceId);\n }\n\n /**\n * Reset all federation relationships for a space\n * @param {string} spaceId - Space ID\n * @param {Object} options - Reset options\n * @returns {Promise<Object>} Result object\n */\n async resetFederation(spaceId, options = {}) {\n await this.ready();\n this._requireGunDB();\n return gunFederation.resetFederation(this._backend, spaceId, options);\n }\n\n /**\n * Propagate data to federated spaces\n * @param {string} holon - Holon identifier\n * @param {string} lens - Lens identifier\n * @param {Object} data - Data to propagate\n * @param {Object} options - Propagation options\n * @returns {Promise<Object>} Result with success count and errors\n */\n async propagate(holon, lens, data, options = {}) {\n await this.ready();\n this._requireGunDB();\n return gunFederation.propagate(this._backend, holon, lens, data, options);\n }\n\n /**\n * Get combined data from local and federated sources\n * @param {string} holon - Local holon name\n * @param {string} lens - Lens to query\n * @param {Object} options - Options for data retrieval and aggregation\n * @returns {Promise<Array>} Combined array of local and federated data\n */\n async getFederated(holon, lens, options = {}) {\n await this.ready();\n this._requireGunDB();\n return gunFederation.getFederated(this._backend, holon, lens, options);\n }\n\n /**\n * Subscribe to federation notifications for a space\n * @param {string} spaceId - Space ID to subscribe to\n * @param {Function} callback - Callback to execute on notifications\n * @param {Object} options - Subscription options\n * @returns {Promise<Object>} Subscription object with unsubscribe() method\n */\n async subscribeFederation(spaceId, callback, options = {}) {\n await this.ready();\n this._requireGunDB();\n return gunFederation.subscribeFederation(this._backend, spaceId, callback, options);\n }\n\n /**\n * Track a federated message across different chats\n * @param {string} originalChatId - Original chat ID\n * @param {string} messageId - Original message ID\n * @param {string} federatedChatId - Federated chat ID\n * @param {string} federatedMessageId - Federated message ID\n * @param {string} type - Message type\n * @returns {Promise<void>}\n */\n async federateMessage(originalChatId, messageId, federatedChatId, federatedMessageId, type = 'generic') {\n await this.ready();\n this._requireGunDB();\n return gunFederation.federateMessage(this._backend, originalChatId, messageId, federatedChatId, federatedMessageId, type);\n }\n\n /**\n * Get all federated messages for a given original message\n * @param {string} originalChatId - Original chat ID\n * @param {string} messageId - Original message ID\n * @returns {Promise<Object|null>} Tracking information for the message\n */\n async getFederatedMessages(originalChatId, messageId) {\n await this.ready();\n this._requireGunDB();\n return gunFederation.getFederatedMessages(this._backend, originalChatId, messageId);\n }\n\n /**\n * Update a federated message across all federated chats\n * @param {string} originalChatId - Original chat ID\n * @param {string} messageId - Original message ID\n * @param {Function} updateCallback - Function to update the message in each chat\n * @returns {Promise<void>}\n */\n async updateFederatedMessages(originalChatId, messageId, updateCallback) {\n await this.ready();\n this._requireGunDB();\n return gunFederation.updateFederatedMessages(this._backend, originalChatId, messageId, updateCallback);\n }\n\n // ============================================================================\n // LIFECYCLE\n // ============================================================================\n\n /**\n * Close the backend and clean up resources\n */\n close() {\n if (this._backend) {\n this._backend.close();\n }\n if (this.client && typeof this.client.close === 'function') {\n this.client.close();\n }\n }\n}\n","import {\n latLngToCell,\n cellToParent,\n cellToChildren,\n isValidCell,\n getResolution,\n} from 'h3-js';\n\n/**\n * Convert geographic coordinates to H3 holon ID\n * @param {number} lat - Latitude (-90 to 90)\n * @param {number} lng - Longitude (-180 to 180)\n * @param {number} resolution - H3 resolution (0-15)\n * @returns {string} H3 cell ID\n */\nexport function toHolon(lat, lng, resolution) {\n // Validate inputs\n if (typeof lat !== 'number' || lat < -90 || lat > 90) {\n throw new RangeError(`Invalid latitude: ${lat}. Must be between -90 and 90.`);\n }\n if (typeof lng !== 'number' || lng < -180 || lng > 180) {\n throw new RangeError(`Invalid longitude: ${lng}. Must be between -180 and 180.`);\n }\n if (!Number.isInteger(resolution) || resolution < 0 || resolution > 15) {\n throw new RangeError(`Invalid resolution: ${resolution}. Must be integer between 0 and 15.`);\n }\n\n try {\n const h3Index = latLngToCell(lat, lng, resolution);\n return h3Index;\n } catch (error) {\n throw new Error(`H3 conversion failed: ${error.message}`);\n }\n}\n\n/**\n * Get all parent holons up the hierarchy\n * @param {string} holonId - H3 cell ID\n * @param {number} maxResolution - Stop at this resolution (default: 0)\n * @returns {string[]} Array of parent H3 IDs (ascending hierarchy)\n */\nexport function getParents(holonId, maxResolution = 0) {\n if (!isValidH3(holonId)) {\n throw new Error(`Invalid H3 holon ID: ${holonId}`);\n }\n\n const currentResolution = getResolution(holonId);\n const parents = [];\n\n let currentCell = holonId;\n for (let res = currentResolution - 1; res >= maxResolution; res--) {\n try {\n currentCell = cellToParent(currentCell, res);\n parents.push(currentCell);\n } catch (error) {\n break; // Reached root\n }\n }\n\n return parents;\n}\n\n/**\n * Get all child holons at next resolution level\n * @param {string} holonId - H3 cell ID\n * @returns {string[]} Array of child H3 IDs (7 children per hexagon)\n */\nexport function getChildren(holonId) {\n if (!isValidH3(holonId)) {\n throw new Error(`Invalid H3 holon ID: ${holonId}`);\n }\n\n try {\n const resolution = getResolution(holonId);\n // H3 max resolution is 15, can't get children of resolution 15\n if (resolution >= 15) {\n throw new Error('Cannot get children of resolution 15 cell (maximum resolution)');\n }\n\n // cellToChildren requires the child resolution (one level down)\n const children = cellToChildren(holonId, resolution + 1);\n return children;\n } catch (error) {\n throw new Error(`Failed to get children: ${error.message}`);\n }\n}\n\n/**\n * Validate H3 cell ID format\n * @param {string} holonId - H3 cell ID\n * @returns {boolean} True if valid H3 format\n */\nexport function isValidH3(holonId) {\n if (typeof holonId !== 'string') return false;\n // H3 indexes are 15-character hex strings, but can vary slightly\n // Use h3-js isValidCell for proper validation\n return isValidCell(holonId);\n}\n\n/**\n * Get H3 resolution level from cell ID\n * @param {string} holonId - H3 cell ID\n * @returns {number} Resolution (0-15)\n */\nexport function getH3Resolution(holonId) {\n if (!isValidH3(holonId)) {\n throw new Error(`Invalid H3 holon ID: ${holonId}`);\n }\n return getResolution(holonId);\n}\n","/**\n * Nostr Async Utilities\n * Provides Promise-based wrappers and async patterns for Nostr operations\n */\n\n/**\n * Global subscription manager to prevent duplicate subscriptions\n * Maps: subscriptionKey -> subscription object\n */\nconst globalSubscriptions = new Map();\n\n/**\n * Single-path subscription manager (for nostrSubscribe)\n * Maps: subscriptionKey -> { subscription, callbacks: [] }\n */\nconst singlePathSubscriptions = new Map();\n\n/**\n * Query deduplication for nostrGet - prevents duplicate relay queries\n * Maps: queryKey -> { promise, timestamp, callbacks: [] }\n */\nconst pendingQueries = new Map();\nconst QUERY_DEDUP_WINDOW = 2000; // 2 second window for deduplication\n\n/**\n * Write data as Nostr event (parameterized replaceable event)\n * @param {Object} client - NostrClient instance\n * @param {string} path - Path identifier (encoded in d-tag)\n * @param {Object} data - Data to store\n * @param {number} kind - Event kind (default: 30000 for parameterized replaceable)\n * @returns {Promise<Object>} Published event result\n */\nexport async function nostrPut(client, path, data, kind = 30000) {\n const dataEvent = {\n kind,\n created_at: Math.floor(Date.now() / 1000),\n tags: [\n ['d', path], // d-tag for parameterized replaceable events\n ],\n content: JSON.stringify(data),\n };\n\n const result = await client.publish(dataEvent);\n return result;\n}\n\n/**\n * Read data from Nostr (query by d-tag)\n * LOCAL-FIRST: Checks persistent storage first, never blocks on network\n * Uses query deduplication to prevent duplicate relay queries within a time window\n * @param {Object} client - NostrClient instance\n * @param {string} path - Path identifier\n * @param {number} kind - Event kind (default: 30000)\n * @param {Object} options - Query options\n * @param {string[]} options.authors - Array of public keys to query (default: [client.publicKey])\n * @param {boolean} options.includeAuthor - If true, adds _author field to returned data\n * @param {boolean} options.skipPersistent - If true, skip persistent storage check (default: false)\n * @returns {Promise<Object|null>} Data or null if not found\n */\nexport async function nostrGet(client, path, kind = 30000, options = {}) {\n const timeout = options.timeout !== undefined ? options.timeout : 30000;\n const authors = options.authors || [client.publicKey];\n\n // LOCAL-FIRST: Check persistent storage FIRST (never blocks on network)\n if (!options.skipPersistent && client.persistentGet) {\n const persistedEvent = await client.persistentGet(path);\n if (persistedEvent && persistedEvent.content) {\n try {\n const data = JSON.parse(persistedEvent.content);\n\n // Skip deleted items\n if (data._deleted) {\n return null;\n }\n\n // Optionally include author information\n if (options.includeAuthor) {\n data._author = persistedEvent.pubkey;\n }\n\n // Trigger background refresh from relays (fire-and-forget)\n if (client.refreshPathInBackground) {\n client.refreshPathInBackground(path, kind, { authors, timeout });\n }\n\n return data;\n } catch (error) {\n // Fall through to relay query if parsing fails\n console.warn('[nostrGet] Failed to parse persisted event:', error);\n }\n }\n }\n\n // Query deduplication: Check if same query is already pending\n const queryKey = `get:${client.publicKey}:${kind}:${path}:${authors.join(',')}`;\n const pending = pendingQueries.get(queryKey);\n\n if (pending && Date.now() - pending.timestamp < QUERY_DEDUP_WINDOW) {\n // Reuse pending query result\n return pending.promise;\n }\n\n // Create new query with deduplication\n const queryPromise = _executeNostrGet(client, path, kind, authors, timeout, options);\n\n pendingQueries.set(queryKey, {\n promise: queryPromise,\n timestamp: Date.now(),\n });\n\n // Clean up after promise resolves\n queryPromise.finally(() => {\n // Remove from pending after a short delay to allow coalescing\n setTimeout(() => {\n const current = pendingQueries.get(queryKey);\n if (current && current.promise === queryPromise) {\n pendingQueries.delete(queryKey);\n }\n }, QUERY_DEDUP_WINDOW);\n });\n\n return queryPromise;\n}\n\n/**\n * Internal function to execute nostrGet query\n * @private\n */\nasync function _executeNostrGet(client, path, kind, authors, timeout, options) {\n const filter = {\n kinds: [kind],\n authors: authors, // Support multiple authors for cross-holosphere queries\n '#d': [path],\n limit: authors.length, // Increase limit to get events from all authors\n };\n\n const events = await client.query(filter, { timeout });\n\n if (events.length === 0) {\n return null;\n }\n\n // Get most recent event (across all authors)\n const event = events.sort((a, b) => b.created_at - a.created_at)[0];\n\n try {\n const data = JSON.parse(event.content);\n // Skip deleted items\n if (data._deleted) {\n return null;\n }\n // Optionally include author information\n if (options.includeAuthor) {\n data._author = event.pubkey;\n }\n return data;\n } catch (error) {\n // Silent - return null for unparseable events\n return null;\n }\n}\n\n/**\n * Query all events under a path prefix\n * LOCAL-FIRST: Checks persistent storage first, never blocks on network\n * Uses query deduplication to prevent duplicate relay queries within a time window\n * @param {Object} client - NostrClient instance\n * @param {string} pathPrefix - Path prefix to match\n * @param {number} kind - Event kind (default: 30000)\n * @param {Object} options - Query options\n * @param {string[]} options.authors - Array of public keys to query (default: [client.publicKey])\n * @param {boolean} options.includeAuthor - If true, adds _author field to returned data\n * @param {boolean} options.skipPersistent - If true, skip persistent storage check (default: false)\n * @returns {Promise<Array>} Array of data objects\n */\nexport async function nostrGetAll(client, pathPrefix, kind = 30000, options = {}) {\n const timeout = options.timeout !== undefined ? options.timeout : 30000;\n const limit = options.limit || 1000; // Increased limit to get more events\n const authors = options.authors || [client.publicKey];\n\n // LOCAL-FIRST: Check persistent storage FIRST (never blocks on network)\n if (!options.skipPersistent && client.persistentGetAll) {\n const persistedEvents = await client.persistentGetAll(pathPrefix);\n if (persistedEvents.length > 0) {\n // Parse content and group by d-tag (keep latest only)\n const byPath = new Map();\n for (const event of persistedEvents) {\n if (!event || !event.tags) continue;\n\n const dTag = event.tags.find(t => t[0] === 'd');\n if (!dTag || !dTag[1] || !dTag[1].startsWith(pathPrefix)) continue;\n\n const path = dTag[1];\n const existing = byPath.get(path);\n\n if (!existing || event.created_at > existing.created_at) {\n try {\n const data = JSON.parse(event.content);\n\n // Handle deleted items - remove from map if this is newer\n if (data._deleted) {\n byPath.delete(path);\n continue;\n }\n\n // Optionally include author information\n if (options.includeAuthor) {\n data._author = event.pubkey;\n }\n byPath.set(path, { data, created_at: event.created_at });\n } catch (error) {\n // Skip invalid events\n }\n }\n }\n\n // Trigger background refresh from relays (fire-and-forget)\n if (client.refreshPrefixInBackground) {\n client.refreshPrefixInBackground(pathPrefix, kind, { authors, timeout, limit });\n }\n\n // Return array of data objects\n return Array.from(byPath.values()).map(item => item.data);\n }\n }\n\n // Query deduplication: Check if same query is already pending\n const queryKey = `getAll:${client.publicKey}:${kind}:${pathPrefix}:${authors.join(',')}`;\n const pending = pendingQueries.get(queryKey);\n\n if (pending && Date.now() - pending.timestamp < QUERY_DEDUP_WINDOW) {\n // Reuse pending query result\n return pending.promise;\n }\n\n // Create new query with deduplication\n const queryPromise = _executeNostrGetAll(client, pathPrefix, kind, authors, timeout, limit, options);\n\n pendingQueries.set(queryKey, {\n promise: queryPromise,\n timestamp: Date.now(),\n });\n\n // Clean up after promise resolves\n queryPromise.finally(() => {\n setTimeout(() => {\n const current = pendingQueries.get(queryKey);\n if (current && current.promise === queryPromise) {\n pendingQueries.delete(queryKey);\n }\n }, QUERY_DEDUP_WINDOW);\n });\n\n return queryPromise;\n}\n\n/**\n * Internal function to execute nostrGetAll query\n * @private\n */\nasync function _executeNostrGetAll(client, pathPrefix, kind, authors, timeout, limit, options) {\n const filter = {\n kinds: [kind],\n authors: authors,\n limit,\n };\n\n const events = await client.query(filter, { timeout });\n\n // Filter by path prefix in application layer\n const matching = events.filter(event => {\n const dTag = event.tags.find(t => t[0] === 'd');\n return dTag && dTag[1] && dTag[1].startsWith(pathPrefix);\n });\n\n // Parse content and group by d-tag (keep latest only, across all authors)\n const byPath = new Map();\n for (const event of matching) {\n const dTag = event.tags.find(t => t[0] === 'd')[1];\n const existing = byPath.get(dTag);\n\n if (!existing || event.created_at > existing.created_at) {\n try {\n const data = JSON.parse(event.content);\n\n // Handle deleted items - remove from map if this is newer\n if (data._deleted) {\n byPath.delete(dTag);\n continue;\n }\n\n // Optionally include author information\n if (options.includeAuthor) {\n data._author = event.pubkey;\n }\n byPath.set(dTag, { data, created_at: event.created_at });\n } catch (error) {\n // Silent - skip unparseable events\n }\n }\n }\n\n // Return array of data objects\n return Array.from(byPath.values()).map(item => item.data);\n}\n\n/**\n * Query all events under a path prefix (HYBRID MODE - local + relay)\n * Checks local cache first, then merges with relay data\n * @param {Object} client - NostrClient instance\n * @param {string} pathPrefix - Path prefix to match\n * @param {number} kind - Event kind (default: 30000)\n * @param {Object} options - Query options\n * @param {string[]} options.authors - Array of public keys to query (default: [client.publicKey])\n * @param {boolean} options.includeAuthor - If true, adds _author field to returned data\n * @returns {Promise<Array>} Array of data objects (merged from local + relay)\n */\nexport async function nostrGetAllHybrid(client, pathPrefix, kind = 30000, options = {}) {\n const timeout = options.timeout !== undefined ? options.timeout : 30000;\n const limit = options.limit || 1000;\n const authors = options.authors || [client.publicKey];\n\n // Use hybrid query if available\n const queryMethod = client.queryHybrid || client.query;\n\n const filter = {\n kinds: [kind],\n authors: authors,\n limit,\n };\n\n const events = await queryMethod.call(client, filter, { timeout });\n\n // Filter by path prefix in application layer\n const matching = events.filter(event => {\n const dTag = event.tags.find(t => t[0] === 'd');\n return dTag && dTag[1] && dTag[1].startsWith(pathPrefix);\n });\n\n // Parse content and group by d-tag (keep latest only)\n const byPath = new Map();\n for (const event of matching) {\n const dTag = event.tags.find(t => t[0] === 'd')[1];\n const existing = byPath.get(dTag);\n\n if (!existing || event.created_at > existing.created_at) {\n try {\n const data = JSON.parse(event.content);\n // Skip null or non-object content\n if (data === null || typeof data !== 'object') {\n continue;\n }\n // Handle deleted items - remove from map if this is newer\n if (data._deleted) {\n byPath.delete(dTag);\n continue;\n }\n // Optionally include author information\n if (options.includeAuthor) {\n data._author = event.pubkey;\n }\n byPath.set(dTag, { data, created_at: event.created_at });\n } catch (error) {\n // Silent - skip unparseable events\n }\n }\n }\n\n // Return array of data objects\n return Array.from(byPath.values()).map(item => item.data);\n}\n\n/**\n * Delete data (publish deletion event - NIP-09)\n * @param {Object} client - NostrClient instance\n * @param {string} path - Path identifier\n * @param {number} kind - Original event kind (default: 30000)\n * @returns {Promise<Object>} Deletion event result\n */\nexport async function nostrDelete(client, path, kind = 30000) {\n // Read existing data first\n const existing = await nostrGet(client, path, kind);\n\n if (!existing) {\n return { reason: 'not_found', results: [] };\n }\n\n // Create minimal tombstone - just the deleted flag, no original data\n const tombstone = {\n _deleted: true,\n _deletedAt: Date.now()\n };\n\n // Publish tombstone as replacement event\n // This ensures reads will see _deleted flag\n const result = await nostrPut(client, path, tombstone, kind);\n\n // Also delete from persistent storage to prevent resurrection on restart\n if (client.persistentStorage) {\n try {\n await client.persistentStorage.delete(path);\n } catch (e) {\n // Ignore storage deletion errors\n }\n }\n\n // Clear from memory cache\n if (client.clearCache) {\n client.clearCache(path);\n }\n\n // Also publish NIP-09 deletion event for relay compliance\n const coordinate = `${kind}:${client.publicKey}:${path}`;\n const deletionEvent = {\n kind: 5, // NIP-09 deletion event\n created_at: Math.floor(Date.now() / 1000),\n tags: [\n ['a', coordinate], // 'a' tag for parameterized replaceable events\n ],\n content: '', // Optional deletion reason/note\n };\n\n // Publish deletion event (best effort, don't block on failure)\n try {\n await client.publish(deletionEvent);\n // Silent success - deletion queued\n } catch (error) {\n // Silent - deletion will be retried\n }\n\n return result;\n}\n\n/**\n * Delete all data with path prefix (publish deletion events - NIP-09)\n * @param {Object} client - NostrClient instance\n * @param {string} pathPrefix - Path prefix to delete all items under\n * @param {number} kind - Original event kind (default: 30000)\n * @returns {Promise<Object>} Deletion results\n */\nexport async function nostrDeleteAll(client, pathPrefix, kind = 30000) {\n // Query events from relay\n const filter = {\n kinds: [kind],\n authors: [client.publicKey],\n limit: 1000,\n };\n\n const relayEvents = await client.query(filter, { timeout: 30000 });\n\n // Also get events from persistent storage (may have events not yet synced to relay)\n let persistentEvents = [];\n if (client.persistentStorage) {\n try {\n persistentEvents = await client.persistentStorage.getAll(pathPrefix);\n } catch (e) {\n // Ignore storage read errors\n }\n }\n\n // Merge events from both sources, using d-tag as key\n const eventsByDTag = new Map();\n\n // Add relay events\n for (const event of relayEvents) {\n const dTag = event.tags?.find(t => t[0] === 'd');\n if (dTag && dTag[1] && dTag[1].startsWith(pathPrefix)) {\n eventsByDTag.set(dTag[1], event);\n }\n }\n\n // Add persistent storage events (these might be newer or only exist locally)\n for (const event of persistentEvents) {\n const dTag = event.tags?.find(t => t[0] === 'd');\n if (dTag && dTag[1] && dTag[1].startsWith(pathPrefix)) {\n const existing = eventsByDTag.get(dTag[1]);\n // Use the persistent event if it's newer or doesn't exist in relay results\n if (!existing || event.created_at > existing.created_at) {\n eventsByDTag.set(dTag[1], event);\n }\n }\n }\n\n const matching = Array.from(eventsByDTag.values());\n\n if (matching.length === 0) {\n return { success: true, count: 0, results: [] };\n }\n\n // Publish tombstone events for each matching item\n const tombstoneResults = [];\n for (const event of matching) {\n const dTag = event.tags.find(t => t[0] === 'd')[1];\n\n try {\n // Create minimal tombstone - just the deleted flag, no original data\n const tombstone = {\n _deleted: true,\n _deletedAt: Date.now()\n };\n\n // Publish tombstone replacement\n const result = await nostrPut(client, dTag, tombstone, kind);\n tombstoneResults.push(result);\n\n // Also delete from persistent storage to prevent resurrection on restart\n if (client.persistentStorage) {\n try {\n await client.persistentStorage.delete(dTag);\n } catch (e) {\n // Ignore storage deletion errors\n }\n }\n\n // Clear from memory cache\n if (client.clearCache) {\n client.clearCache(dTag);\n }\n } catch (error) {\n console.error(`Failed to delete item ${dTag}:`, error);\n }\n }\n\n // Collect all coordinates for NIP-09 deletion event\n const coordinates = matching.map(event => {\n const dTag = event.tags.find(t => t[0] === 'd')[1];\n return `${kind}:${client.publicKey}:${dTag}`;\n });\n\n // Publish a single kind 5 deletion event with all coordinates\n // This is for relay compliance (best effort)\n try {\n const deletionEvent = {\n kind: 5, // NIP-09 deletion event\n created_at: Math.floor(Date.now() / 1000),\n tags: coordinates.map(coord => ['a', coord]),\n content: '', // Optional deletion reason/note\n };\n\n await client.publish(deletionEvent);\n // Silent success - bulk deletion queued\n } catch (error) {\n // Silent - bulk deletion will be retried\n }\n\n return {\n success: true,\n count: matching.length,\n results: tombstoneResults,\n };\n}\n\n/**\n * Subscribe to path changes\n * Uses subscription deduplication - multiple subscribers to same path share one relay subscription\n * @param {Object} client - NostrClient instance\n * @param {string} path - Path to subscribe to\n * @param {Function} callback - Callback function (data, event) => void\n * @param {Object} options - Subscription options\n * @returns {Object} Subscription object with unsubscribe method\n */\nexport function nostrSubscribe(client, path, callback, options = {}) {\n const kind = options.kind || 30000;\n\n // Create unique key for this subscription\n const subscriptionKey = `single:${client.publicKey}:${kind}:${path}`;\n\n // Check if we already have an active subscription for this path\n const existing = singlePathSubscriptions.get(subscriptionKey);\n if (existing) {\n // Add callback to existing subscription\n existing.callbacks.push(callback);\n\n // Return wrapper that removes only this callback on unsubscribe\n return {\n unsubscribe: () => {\n const idx = existing.callbacks.indexOf(callback);\n if (idx > -1) {\n existing.callbacks.splice(idx, 1);\n }\n\n // If no more callbacks, unsubscribe the whole thing\n if (existing.callbacks.length === 0) {\n existing.subscription.unsubscribe();\n singlePathSubscriptions.delete(subscriptionKey);\n }\n }\n };\n }\n\n // Create new subscription\n const callbacks = [callback];\n const subscriptionInfo = {\n callbacks,\n subscription: null,\n };\n\n // Store before creating subscription to handle race conditions\n singlePathSubscriptions.set(subscriptionKey, subscriptionInfo);\n\n const filter = {\n kinds: [kind],\n authors: [client.publicKey], // Filter by our public key\n '#d': [path],\n limit: 10, // Limit results for single item subscription\n };\n\n const subscription = client.subscribe(\n filter,\n (event) => {\n // Verify event is from our public key (relay may not respect author filter)\n if (event.pubkey !== client.publicKey) {\n return;\n }\n\n try {\n const data = JSON.parse(event.content);\n\n // Skip deleted items - don't send tombstones to subscribers\n if (data._deleted) {\n return;\n }\n\n // Dispatch to all registered callbacks\n for (const cb of callbacks) {\n try {\n cb(data, event);\n } catch (err) {\n console.error('Subscription callback error:', err);\n }\n }\n } catch (error) {\n console.error('Failed to parse event in subscription:', error);\n }\n },\n {\n onEOSE: () => {\n // EOSE received\n },\n }\n );\n\n subscriptionInfo.subscription = subscription;\n\n return {\n unsubscribe: () => {\n const idx = callbacks.indexOf(callback);\n if (idx > -1) {\n callbacks.splice(idx, 1);\n }\n\n // If no more callbacks, unsubscribe the whole thing\n if (callbacks.length === 0) {\n subscription.unsubscribe();\n singlePathSubscriptions.delete(subscriptionKey);\n }\n }\n };\n}\n\n/**\n * Subscribe to path prefix (multiple paths)\n *\n * Subscribes to data events and uses Page Visibility API to refresh when tab becomes visible.\n * Note: Nostr relays do not broadcast replaceable event updates to active subscriptions.\n *\n * @param {Object} client - NostrClient instance\n * @param {string} pathPrefix - Path prefix to match\n * @param {Function} callback - Callback function (data, path, event) => void\n * @param {Object} options - Subscription options\n * @returns {Promise<Object>} Subscription object with unsubscribe method\n */\nexport async function nostrSubscribeMany(client, pathPrefix, callback, options = {}) {\n const kind = options.kind || 30000;\n\n // Create unique key for this subscription\n const subscriptionKey = `${client.publicKey}:${kind}:${pathPrefix}`;\n\n // Check if we already have an active subscription for this path\n const existingSub = globalSubscriptions.get(subscriptionKey);\n if (existingSub) {\n // Register this callback with the existing subscription\n existingSub.callbacks.push(callback);\n\n // Return a wrapper that removes only this callback on unsubscribe\n return {\n unsubscribe: () => {\n const idx = existingSub.callbacks.indexOf(callback);\n if (idx > -1) {\n existingSub.callbacks.splice(idx, 1);\n }\n\n // If no more callbacks, unsubscribe the whole thing\n if (existingSub.callbacks.length === 0) {\n existingSub.actualSubscription.unsubscribe();\n globalSubscriptions.delete(subscriptionKey);\n }\n }\n };\n }\n\n const seenEventIds = new Set(); // Track event IDs to prevent duplicate callbacks\n const callbacks = [callback]; // Array of callbacks to notify\n\n // Track rejected events for metrics\n let rejectedCount = 0;\n let acceptedCount = 0;\n let lastLogTime = Date.now();\n const LOG_INTERVAL = 10000; // Log summary every 10 seconds\n\n // Handler for data events (kind 30000)\n const handleDataEvent = (event) => {\n // Skip duplicates\n if (seenEventIds.has(event.id)) {\n return;\n }\n seenEventIds.add(event.id);\n\n // Check if event is from a different author (relay not respecting filter)\n if (event.pubkey !== client.publicKey) {\n rejectedCount++;\n\n // Only log periodically to avoid spam\n const now = Date.now();\n if (now - lastLogTime > LOG_INTERVAL) {\n console.warn('[nostrSubscribeMany] ⚠️ Relay not respecting authors filter!', {\n rejectedCount,\n acceptedCount,\n expected: client.publicKey,\n message: 'Consider using a different relay or implementing private relay'\n });\n lastLogTime = now;\n }\n return; // Skip events from other authors\n }\n\n // Extract d-tag\n const dTagArray = event.tags.find(t => t[0] === 'd');\n const dTag = dTagArray?.[1];\n\n // Client-side prefix filter\n if (dTag && dTag.startsWith(pathPrefix)) {\n try {\n const data = JSON.parse(event.content);\n\n // Skip deleted items - don't send tombstones to subscribers\n if (data._deleted) {\n return;\n }\n\n acceptedCount++;\n // Notify all registered callbacks\n for (const cb of callbacks) {\n cb(data, dTag, event);\n }\n } catch (error) {\n console.error('[nostrSubscribeMany] Failed to parse event:', error);\n }\n }\n };\n\n // Subscribe to data events (kind 30000) for initial load\n // Use 'since' to only get events from subscription time onward for real-time updates\n const subscriptionStartTime = Math.floor(Date.now() / 1000);\n const dataFilter = {\n kinds: [kind],\n authors: [client.publicKey],\n since: subscriptionStartTime // Only get new events after subscription\n };\n const dataSubscription = await client.subscribe(dataFilter, handleDataEvent);\n\n // Use Page Visibility API to refresh when tab becomes visible\n let isDocumentHidden = typeof document !== 'undefined' && document.hidden;\n let lastVisibilityCheck = subscriptionStartTime;\n\n const handleVisibilityChange = async () => {\n if (typeof document === 'undefined') return;\n\n const wasHidden = isDocumentHidden;\n isDocumentHidden = document.hidden;\n\n // Tab became visible - only check for new events since we were hidden\n if (wasHidden && !isDocumentHidden) {\n const now = Math.floor(Date.now() / 1000);\n try {\n const visibilityFilter = {\n ...dataFilter,\n since: lastVisibilityCheck, // Only events since last check\n until: now\n };\n const events = await client.query(visibilityFilter, { timeout: 30000 });\n\n for (const event of events) {\n handleDataEvent(event);\n }\n lastVisibilityCheck = now;\n } catch (error) {\n // Silently handle visibility refresh errors\n }\n }\n };\n\n // Only add listener in browser environment\n if (typeof document !== 'undefined') {\n document.addEventListener('visibilitychange', handleVisibilityChange);\n }\n\n // Store subscription info for reuse\n const actualSubscription = {\n unsubscribe: () => {\n if (dataSubscription && dataSubscription.unsubscribe) {\n dataSubscription.unsubscribe();\n }\n if (typeof document !== 'undefined') {\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n }\n globalSubscriptions.delete(subscriptionKey);\n }\n };\n\n const subscriptionInfo = {\n callbacks,\n actualSubscription\n };\n\n globalSubscriptions.set(subscriptionKey, subscriptionInfo);\n\n return actualSubscription;\n}\n\n/**\n * Update data (merge with existing)\n * @param {Object} client - NostrClient instance\n * @param {string} path - Path identifier\n * @param {Object} updates - Fields to update\n * @param {number} kind - Event kind (default: 30000)\n * @returns {Promise<Object>} Updated event result\n */\nexport async function nostrUpdate(client, path, updates, kind = 30000) {\n // Read existing data\n const existing = await nostrGet(client, path, kind);\n\n if (!existing) {\n throw new Error(`No data found at path: ${path}`);\n }\n\n // Merge updates\n const merged = { ...existing, ...updates };\n\n // Publish updated event\n return nostrPut(client, path, merged, kind);\n}\n\n/**\n * Batch read multiple paths\n * @param {Object} client - NostrClient instance\n * @param {string[]} paths - Array of paths\n * @param {number} kind - Event kind (default: 30000)\n * @returns {Promise<Object>} Object mapping paths to data\n */\nexport async function nostrBatchGet(client, paths, kind = 30000) {\n const filter = {\n kinds: [kind],\n '#d': paths,\n limit: paths.length,\n };\n\n const events = await client.query(filter);\n\n // Group by d-tag (keep latest only)\n const byPath = new Map();\n for (const event of events) {\n const dTag = event.tags.find(t => t[0] === 'd');\n if (!dTag || !dTag[1]) continue;\n\n const path = dTag[1];\n const existing = byPath.get(path);\n\n if (!existing || event.created_at > existing.created_at) {\n try {\n const data = JSON.parse(event.content);\n byPath.set(path, data);\n } catch (error) {\n console.error('Failed to parse event content:', error);\n }\n }\n }\n\n // Return object mapping paths to data\n const result = {};\n for (const path of paths) {\n result[path] = byPath.get(path) || null;\n }\n\n return result;\n}\n\n/**\n * Batch write multiple paths\n * @param {Object} client - NostrClient instance\n * @param {Object} pathDataMap - Object mapping paths to data\n * @param {number} kind - Event kind (default: 30000)\n * @returns {Promise<Array>} Array of publish results\n */\nexport async function nostrBatchPut(client, pathDataMap, kind = 30000) {\n const promises = Object.entries(pathDataMap).map(([path, data]) =>\n nostrPut(client, path, data, kind)\n );\n\n return Promise.all(promises);\n}\n\n/**\n * Retry operation with exponential backoff\n * @param {Function} operation - Async function to retry\n * @param {number} maxRetries - Max retry attempts (default: 3)\n * @param {number} baseDelay - Base delay in ms (default: 100ms)\n * @returns {Promise<any>} Promise resolving to operation result\n */\nexport async function nostrRetry(operation, maxRetries = 3, baseDelay = 100) {\n let lastError;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error;\n if (attempt < maxRetries) {\n const delay = baseDelay * Math.pow(2, attempt);\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n }\n\n throw lastError;\n}\n\n/**\n * Wait for specific condition on data\n * @param {Object} client - NostrClient instance\n * @param {string} path - Path to watch\n * @param {Function} predicate - Condition function (data) => boolean\n * @param {number} timeout - Timeout in ms (default: 5000ms)\n * @returns {Promise<any>} Promise resolving when condition is met\n */\nexport async function nostrWaitFor(client, path, predicate, timeout = 5000) {\n return new Promise((resolve, reject) => {\n let timeoutId;\n let subscription;\n\n const cleanup = () => {\n if (timeoutId) clearTimeout(timeoutId);\n if (subscription) subscription.unsubscribe();\n };\n\n subscription = nostrSubscribe(client, path, (data) => {\n if (predicate(data)) {\n cleanup();\n resolve(data);\n }\n });\n\n timeoutId = setTimeout(() => {\n cleanup();\n reject(new Error('Timeout waiting for condition'));\n }, timeout);\n });\n}\n","/**\n * Nostr Storage Wrapper\n * Drop-in replacement for gun-wrapper.js with same API\n * Handles path construction and CRUD operations using Nostr relays\n */\n\nimport {\n nostrPut,\n nostrGet,\n nostrGetAll,\n nostrGetAllHybrid,\n nostrUpdate as nostrAsyncUpdate,\n nostrDelete,\n nostrDeleteAll,\n nostrSubscribe,\n nostrSubscribeMany,\n} from './nostr-async.js';\n\n/**\n * Build path from components\n * @param {string} appname - Application namespace\n * @param {string} holon - Holon ID (H3 or URI)\n * @param {string} lens - Lens name\n * @param {string} key - Data key (optional)\n * @returns {string} Path string\n */\nexport function buildPath(appname, holon, lens, key = null) {\n // Encode components to handle special characters\n const encodedHolon = encodePathComponent(holon);\n const encodedLens = encodePathComponent(lens);\n\n if (key) {\n const encodedKey = encodePathComponent(key);\n return `${appname}/${encodedHolon}/${encodedLens}/${encodedKey}`;\n }\n return `${appname}/${encodedHolon}/${encodedLens}`;\n}\n\n/**\n * Encode path component to handle special characters\n * @private\n */\nfunction encodePathComponent(component) {\n return encodeURIComponent(component).replace(/%2F/g, '/');\n}\n\n/**\n * Write data to Nostr\n * @param {Object} client - NostrClient instance\n * @param {string} path - Path\n * @param {Object} data - Data to write\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function write(client, path, data) {\n try {\n const result = await nostrPut(client, path, data);\n // Check if at least one relay accepted the event\n // If no relays (testing mode), consider it successful if event was created\n const success = result.results.length === 0 ? true : result.results.some(r => r.status === 'fulfilled');\n return success;\n } catch (error) {\n console.error('Nostr write error:', error);\n throw error;\n }\n}\n\n/**\n * Read data from Nostr\n * @param {Object} client - NostrClient instance\n * @param {string} path - Path\n * @param {Object} options - Query options\n * @param {string[]} options.authors - Array of public keys to query (for cross-holosphere reads)\n * @param {boolean} options.includeAuthor - If true, adds _author field to returned data\n * @returns {Promise<Object|null>} Data or null if not found\n */\nexport async function read(client, path, options = {}) {\n const data = await nostrGet(client, path, 30000, options);\n\n // Return null if deleted or not found\n if (!data || data._deleted) {\n return null;\n }\n\n return data;\n}\n\n/**\n * Read all data under a path (lens query)\n * @param {Object} client - NostrClient instance\n * @param {string} path - Path prefix\n * @param {Object} options - Query options\n * @param {boolean} options.hybrid - Use hybrid mode (local + relay) - default: false\n * @param {string[]} options.authors - Array of public keys to query (for cross-holosphere reads)\n * @param {boolean} options.includeAuthor - If true, adds _author field to returned data\n * @returns {Promise<Object[]>} Array of data objects\n */\nexport async function readAll(client, path, options = {}) {\n // Use hybrid mode if enabled and client supports it\n const useHybrid = options.hybrid && typeof client.queryHybrid === 'function';\n const queryFn = useHybrid ? nostrGetAllHybrid : nostrGetAll;\n\n const results = await queryFn(client, path, 30000, options);\n\n // Filter out deleted items\n return results.filter(data => {\n if (!data || typeof data !== 'object') return false;\n if (data._deleted) return false;\n return true;\n });\n}\n\n/**\n * Update data (merge fields)\n * @param {Object} client - NostrClient instance\n * @param {string} path - Path\n * @param {Object} updates - Fields to update\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function update(client, path, updates) {\n try {\n const existing = await nostrGet(client, path);\n\n if (!existing || !existing.id || existing._deleted) {\n return false; // Not found or deleted\n }\n\n // Merge updates\n const merged = { ...existing, ...updates };\n\n // Update timestamp\n if (!merged._meta) merged._meta = {};\n merged._meta.timestamp = Date.now();\n\n // Write merged data\n const result = await nostrPut(client, path, merged);\n // If no relays (testing mode), consider it successful if event was created\n const success = result.results.length === 0 ? true : result.results.some(r => r.status === 'fulfilled');\n return success;\n } catch (error) {\n console.error('Nostr update error:', error);\n throw error;\n }\n}\n\n/**\n * Delete data (tombstone)\n * @param {Object} client - NostrClient instance\n * @param {string} path - Path\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function deleteData(client, path) {\n try {\n const result = await nostrDelete(client, path);\n\n if (result.reason === 'not_found') {\n return false; // Item doesn't exist\n }\n\n // If no relays (testing mode), consider it successful if event was created\n const success = result.results.length === 0 ? true : result.results.some(r => r.status === 'fulfilled');\n return success;\n } catch (error) {\n console.error('Nostr delete error:', error);\n throw error;\n }\n}\n\n/**\n * Delete all data under path prefix (tombstone)\n * @param {Object} client - NostrClient instance\n * @param {string} path - Path prefix\n * @returns {Promise<Object>} Deletion results\n */\nexport async function deleteAll(client, path) {\n try {\n const result = await nostrDeleteAll(client, path);\n return result;\n } catch (error) {\n console.error('Nostr deleteAll error:', error);\n throw error;\n }\n}\n\n/**\n * Subscribe to data changes\n * @param {Object} client - NostrClient instance\n * @param {string} path - Path\n * @param {Function} callback - Called on data changes\n * @param {Object} options - Subscription options\n * @param {boolean} options.realtimeOnly - Only receive new events (default: true)\n * @returns {Promise<Object>} Subscription object with unsubscribe method\n */\nexport async function subscribe(client, path, callback, options = {}) {\n // Determine if this is a prefix subscription (no key) or single item\n const pathParts = path.split('/');\n const isPrefix = pathParts.length <= 3; // appname/holon/lens\n\n if (isPrefix) {\n // Subscribe to all items under this prefix\n return await nostrSubscribeMany(client, path + '/', (data, fullPath) => {\n // Extract key from full path\n const key = fullPath.split('/').pop();\n callback(data, key);\n }, options);\n } else {\n // Subscribe to single item\n return nostrSubscribe(client, path, (data) => {\n callback(data, path.split('/').pop());\n }, options);\n }\n}\n","/**\n * Unified Storage Adapter\n * Routes storage operations to the correct backend (nostr or gundb)\n */\n\nimport * as nostrWrapper from './nostr-wrapper.js';\nimport * as gunWrapper from './gun-wrapper.js';\n\n/**\n * Build path from components\n * @param {string} appName - Application namespace\n * @param {string} holonId - Holon identifier\n * @param {string} lensName - Lens name\n * @param {string} [key] - Optional data key\n * @returns {string} Constructed path\n */\nexport function buildPath(appName, holonId, lensName, key = null) {\n // Both backends use the same path format\n return nostrWrapper.buildPath(appName, holonId, lensName, key);\n}\n\n/**\n * Write data to storage\n * @param {Object} client - Client instance (nostr client or gun-compatible client)\n * @param {string} path - Storage path\n * @param {Object} data - Data to write\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function write(client, path, data) {\n // Check if this is a GunDB client\n if (client.gun) {\n return gunWrapper.write(client.gun, path, data);\n }\n // Default to Nostr\n return nostrWrapper.write(client, path, data);\n}\n\n/**\n * Read data from storage\n * @param {Object} client - Client instance\n * @param {string} path - Storage path\n * @param {Object} [options] - Read options\n * @returns {Promise<Object|null>} Data or null\n */\nexport async function read(client, path, options = {}) {\n if (client.gun) {\n return gunWrapper.read(client.gun, path);\n }\n return nostrWrapper.read(client, path, options);\n}\n\n/**\n * Read all data under a path prefix\n * @param {Object} client - Client instance\n * @param {string} path - Path prefix\n * @param {Object} [options] - Query options\n * @returns {Promise<Object[]>} Array of data objects\n */\nexport async function readAll(client, path, options = {}) {\n if (client.gun) {\n return gunWrapper.readAll(client.gun, path);\n }\n return nostrWrapper.readAll(client, path, options);\n}\n\n/**\n * Update data (merge fields)\n * @param {Object} client - Client instance\n * @param {string} path - Storage path\n * @param {Object} updates - Fields to update\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function update(client, path, updates) {\n if (client.gun) {\n return gunWrapper.update(client.gun, path, updates);\n }\n return nostrWrapper.update(client, path, updates);\n}\n\n/**\n * Delete data at path\n * @param {Object} client - Client instance\n * @param {string} path - Storage path\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function deleteData(client, path) {\n if (client.gun) {\n return gunWrapper.deleteData(client.gun, path);\n }\n return nostrWrapper.deleteData(client, path);\n}\n\n/**\n * Delete all data under path prefix\n * @param {Object} client - Client instance\n * @param {string} path - Path prefix\n * @returns {Promise<Object>} Deletion results\n */\nexport async function deleteAll(client, path) {\n if (client.gun) {\n return gunWrapper.deleteAll(client.gun, path);\n }\n return nostrWrapper.deleteAll(client, path);\n}\n\n/**\n * Subscribe to data changes\n * @param {Object} client - Client instance\n * @param {string} path - Path or path prefix\n * @param {Function} callback - Called on changes\n * @param {Object} [options] - Subscription options\n * @returns {Object} Subscription with unsubscribe method\n */\nexport function subscribe(client, path, callback, options = {}) {\n if (client.gun) {\n return gunWrapper.subscribe(client.gun, path, callback, options);\n }\n return nostrWrapper.subscribe(client, path, callback, options);\n}\n","/**\n * Global Data Operations\n * Non-location-specific storage (FR-044, FR-045)\n */\n\nimport { write, read, readAll, update, deleteData, deleteAll, subscribe } from './unified-storage.js';\n\n/**\n * Write data to global table\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {string} table - Global table name\n * @param {Object} data - Data to write (must contain id field)\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function writeGlobal(client, appname, table, data) {\n // Auto-generate ID if not provided\n if (!data.id) {\n data.id = `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n const path = `${appname}/${table}/${data.id}`;\n return write(client, path, data);\n}\n\n/**\n * Read data from global table\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {string} table - Global table name\n * @param {string} key - Data key (optional, if not provided returns all)\n * @returns {Promise<Object|Object[]|null>} Data or null\n */\nexport async function readGlobal(client, appname, table, key = null) {\n if (key) {\n const path = `${appname}/${table}/${key}`;\n return read(client, path);\n } else {\n const path = `${appname}/${table}`;\n return readAll(client, path);\n }\n}\n\n/**\n * Update data in global table\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {string} table - Global table name\n * @param {string} key - Data key\n * @param {Object} updates - Fields to update\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function updateGlobal(client, appname, table, key, updates) {\n const path = `${appname}/${table}/${key}`;\n return update(client, path, updates);\n}\n\n/**\n * Delete data from global table\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {string} table - Global table name\n * @param {string} key - Data key\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function deleteGlobal(client, appname, table, key) {\n const path = `${appname}/${table}/${key}`;\n return deleteData(client, path);\n}\n\n/**\n * Delete all data from global table\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {string} table - Global table name\n * @returns {Promise<Object>} Deletion results\n */\nexport async function deleteAllGlobal(client, appname, table) {\n const path = `${appname}/${table}`;\n return deleteAll(client, path);\n}\n\n/**\n * Get all data from global table\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {string} table - Global table name\n * @returns {Promise<Object[]>} Array of data objects\n */\nexport async function getAllGlobal(client, appname, table) {\n const path = `${appname}/${table}`;\n return readAll(client, path);\n}\n\n/**\n * Subscribe to global table changes\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {string} table - Global table name\n * @param {string} key - Data key (optional, if not provided subscribes to all)\n * @param {Function} callback - Called on data changes\n * @param {Object} options - Subscription options\n * @returns {Promise<Object>} Subscription object with unsubscribe method\n */\nexport async function subscribeGlobal(client, appname, table, key, callback, options = {}) {\n const path = key ? `${appname}/${table}/${key}` : `${appname}/${table}`;\n return subscribe(client, path, callback, options);\n}\n","/**\n * JSON Schema Validation with Ajv and caching\n */\n\nimport Ajv from 'ajv';\n\nconst ajv = new Ajv({ allErrors: true, strict: false });\nconst schemaCache = new Map();\nconst CACHE_TTL = 3600000; // 1 hour in milliseconds\n\n/**\n * Validation Error class\n */\nexport class ValidationError extends Error {\n constructor(message, errors = []) {\n super(message);\n this.name = 'ValidationError';\n this.errors = errors;\n }\n}\n\n/**\n * Compile and cache JSON Schema\n * @param {Object} schema - JSON Schema object\n * @param {string} lensName - Lens identifier for caching\n * @returns {Function} Ajv validator function\n */\nexport function compileSchema(schema, lensName) {\n const cacheKey = lensName;\n const cached = schemaCache.get(cacheKey);\n\n // Check if cached and not expired\n if (cached && Date.now() - cached.timestamp < CACHE_TTL) {\n return cached.validator;\n }\n\n // Compile new validator\n try {\n const validator = ajv.compile(schema);\n schemaCache.set(cacheKey, {\n validator,\n timestamp: Date.now(),\n });\n return validator;\n } catch (error) {\n throw new Error(`Schema compilation failed: ${error.message}`);\n }\n}\n\n/**\n * Validate data against schema\n * @param {Object} data - Data to validate\n * @param {Object} schema - JSON Schema object\n * @param {string} lensName - Lens name for caching\n * @param {boolean} strict - Throw error if invalid (default: false)\n * @returns {boolean} True if valid\n * @throws {ValidationError} If strict=true and validation fails\n */\nexport function validate(data, schema, lensName, strict = false) {\n const validator = compileSchema(schema, lensName);\n const valid = validator(data);\n\n if (!valid) {\n const errors = validator.errors || [];\n const errorMessage = errors.map((e) => `${e.instancePath} ${e.message}`).join('; ');\n\n if (strict) {\n throw new ValidationError(`ValidationError: Validation failed: ${errorMessage}`, errors);\n } else {\n console.warn(`[Schema Validation Warning] ${lensName}: ${errorMessage}`);\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Clear schema cache for a lens\n * @param {string} lensName - Lens name\n */\nexport function clearSchemaCache(lensName) {\n schemaCache.delete(lensName);\n}\n\n/**\n * Clear all cached schemas\n */\nexport function clearAllCaches() {\n schemaCache.clear();\n}\n","export const crypto = typeof globalThis === 'object' && 'crypto' in globalThis ? globalThis.crypto : undefined;\n//# sourceMappingURL=crypto.js.map","/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.\n// node.js versions earlier than v19 don't declare it in global scope.\n// For node.js, package.json#exports field mapping rewrites import\n// from `crypto` to `cryptoNode`, which imports native module.\n// Makes the utils un-importable in browsers without a bundler.\n// Once node.js 18 is deprecated (2025-04-30), we can just drop the import.\nimport { crypto } from '@noble/hashes/crypto';\n/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */\nexport function isBytes(a) {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n/** Asserts something is positive integer. */\nexport function anumber(n) {\n if (!Number.isSafeInteger(n) || n < 0)\n throw new Error('positive integer expected, got ' + n);\n}\n/** Asserts something is Uint8Array. */\nexport function abytes(b, ...lengths) {\n if (!isBytes(b))\n throw new Error('Uint8Array expected');\n if (lengths.length > 0 && !lengths.includes(b.length))\n throw new Error('Uint8Array expected of length ' + lengths + ', got length=' + b.length);\n}\n/** Asserts something is hash */\nexport function ahash(h) {\n if (typeof h !== 'function' || typeof h.create !== 'function')\n throw new Error('Hash should be wrapped by utils.createHasher');\n anumber(h.outputLen);\n anumber(h.blockLen);\n}\n/** Asserts a hash instance has not been destroyed / finished */\nexport function aexists(instance, checkFinished = true) {\n if (instance.destroyed)\n throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished)\n throw new Error('Hash#digest() has already been called');\n}\n/** Asserts output is properly-sized byte array */\nexport function aoutput(out, instance) {\n abytes(out);\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error('digestInto() expects output buffer of length at least ' + min);\n }\n}\n/** Cast u8 / u16 / u32 to u8. */\nexport function u8(arr) {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/** Cast u8 / u16 / u32 to u32. */\nexport function u32(arr) {\n return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n/** Zeroize a byte array. Warning: JS provides no guarantees. */\nexport function clean(...arrays) {\n for (let i = 0; i < arrays.length; i++) {\n arrays[i].fill(0);\n }\n}\n/** Create DataView of an array for easy byte-level manipulation. */\nexport function createView(arr) {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/** The rotate right (circular right shift) operation for uint32 */\nexport function rotr(word, shift) {\n return (word << (32 - shift)) | (word >>> shift);\n}\n/** The rotate left (circular left shift) operation for uint32 */\nexport function rotl(word, shift) {\n return (word << shift) | ((word >>> (32 - shift)) >>> 0);\n}\n/** Is current platform little-endian? Most are. Big-Endian platform: IBM */\nexport const isLE = /* @__PURE__ */ (() => new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n/** The byte swap operation for uint32 */\nexport function byteSwap(word) {\n return (((word << 24) & 0xff000000) |\n ((word << 8) & 0xff0000) |\n ((word >>> 8) & 0xff00) |\n ((word >>> 24) & 0xff));\n}\n/** Conditionally byte swap if on a big-endian platform */\nexport const swap8IfBE = isLE\n ? (n) => n\n : (n) => byteSwap(n);\n/** @deprecated */\nexport const byteSwapIfBE = swap8IfBE;\n/** In place byte swap for Uint32Array */\nexport function byteSwap32(arr) {\n for (let i = 0; i < arr.length; i++) {\n arr[i] = byteSwap(arr[i]);\n }\n return arr;\n}\nexport const swap32IfBE = isLE\n ? (u) => u\n : byteSwap32;\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin = /* @__PURE__ */ (() => \n// @ts-ignore\ntypeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0'));\n/**\n * Convert byte array to hex string. Uses built-in function, when available.\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes) {\n abytes(bytes);\n // @ts-ignore\n if (hasHexBuiltin)\n return bytes.toHex();\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 };\nfunction asciiToBase16(ch) {\n if (ch >= asciis._0 && ch <= asciis._9)\n return ch - asciis._0; // '2' => 50-48\n if (ch >= asciis.A && ch <= asciis.F)\n return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n if (ch >= asciis.a && ch <= asciis.f)\n return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n return;\n}\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex) {\n if (typeof hex !== 'string')\n throw new Error('hex string expected, got ' + typeof hex);\n // @ts-ignore\n if (hasHexBuiltin)\n return Uint8Array.fromHex(hex);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2)\n throw new Error('hex string expected, got unpadded hex of length ' + hl);\n const array = new Uint8Array(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n const n1 = asciiToBase16(hex.charCodeAt(hi));\n const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n if (n1 === undefined || n2 === undefined) {\n const char = hex[hi] + hex[hi + 1];\n throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n }\n array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n }\n return array;\n}\n/**\n * There is no setImmediate in browser and setTimeout is slow.\n * Call of async fn will return Promise, which will be fullfiled only on\n * next scheduler queue processing step and this is exactly what we need.\n */\nexport const nextTick = async () => { };\n/** Returns control to thread each 'tick' ms to avoid blocking. */\nexport async function asyncLoop(iters, tick, cb) {\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick)\n continue;\n await nextTick();\n ts += diff;\n }\n}\n/**\n * Converts string to bytes using UTF8 encoding.\n * @example utf8ToBytes('abc') // Uint8Array.from([97, 98, 99])\n */\nexport function utf8ToBytes(str) {\n if (typeof str !== 'string')\n throw new Error('string expected');\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n/**\n * Converts bytes to string using UTF8 encoding.\n * @example bytesToUtf8(Uint8Array.from([97, 98, 99])) // 'abc'\n */\nexport function bytesToUtf8(bytes) {\n return new TextDecoder().decode(bytes);\n}\n/**\n * Normalizes (non-hex) string or Uint8Array to Uint8Array.\n * Warning: when Uint8Array is passed, it would NOT get copied.\n * Keep in mind for future mutable operations.\n */\nexport function toBytes(data) {\n if (typeof data === 'string')\n data = utf8ToBytes(data);\n abytes(data);\n return data;\n}\n/**\n * Helper for KDFs: consumes uint8array or string.\n * When string is passed, does utf8 decoding, using TextDecoder.\n */\nexport function kdfInputToBytes(data) {\n if (typeof data === 'string')\n data = utf8ToBytes(data);\n abytes(data);\n return data;\n}\n/** Copies several Uint8Arrays into one. */\nexport function concatBytes(...arrays) {\n let sum = 0;\n for (let i = 0; i < arrays.length; i++) {\n const a = arrays[i];\n abytes(a);\n sum += a.length;\n }\n const res = new Uint8Array(sum);\n for (let i = 0, pad = 0; i < arrays.length; i++) {\n const a = arrays[i];\n res.set(a, pad);\n pad += a.length;\n }\n return res;\n}\nexport function checkOpts(defaults, opts) {\n if (opts !== undefined && {}.toString.call(opts) !== '[object Object]')\n throw new Error('options should be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged;\n}\n/** For runtime check if class implements interface */\nexport class Hash {\n}\n/** Wraps hash function, creating an interface on top of it */\nexport function createHasher(hashCons) {\n const hashC = (msg) => hashCons().update(toBytes(msg)).digest();\n const tmp = hashCons();\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = () => hashCons();\n return hashC;\n}\nexport function createOptHasher(hashCons) {\n const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({});\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts) => hashCons(opts);\n return hashC;\n}\nexport function createXOFer(hashCons) {\n const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({});\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts) => hashCons(opts);\n return hashC;\n}\nexport const wrapConstructor = createHasher;\nexport const wrapConstructorWithOpts = createOptHasher;\nexport const wrapXOFConstructorWithOpts = createXOFer;\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nexport function randomBytes(bytesLength = 32) {\n if (crypto && typeof crypto.getRandomValues === 'function') {\n return crypto.getRandomValues(new Uint8Array(bytesLength));\n }\n // Legacy Node.js compatibility\n if (crypto && typeof crypto.randomBytes === 'function') {\n return Uint8Array.from(crypto.randomBytes(bytesLength));\n }\n throw new Error('crypto.getRandomValues must be defined');\n}\n//# sourceMappingURL=utils.js.map","/**\n * Internal Merkle-Damgard hash utils.\n * @module\n */\nimport { Hash, abytes, aexists, aoutput, clean, createView, toBytes } from \"./utils.js\";\n/** Polyfill for Safari 14. https://caniuse.com/mdn-javascript_builtins_dataview_setbiguint64 */\nexport function setBigUint64(view, byteOffset, value, isLE) {\n if (typeof view.setBigUint64 === 'function')\n return view.setBigUint64(byteOffset, value, isLE);\n const _32n = BigInt(32);\n const _u32_max = BigInt(0xffffffff);\n const wh = Number((value >> _32n) & _u32_max);\n const wl = Number(value & _u32_max);\n const h = isLE ? 4 : 0;\n const l = isLE ? 0 : 4;\n view.setUint32(byteOffset + h, wh, isLE);\n view.setUint32(byteOffset + l, wl, isLE);\n}\n/** Choice: a ? b : c */\nexport function Chi(a, b, c) {\n return (a & b) ^ (~a & c);\n}\n/** Majority function, true if any two inputs is true. */\nexport function Maj(a, b, c) {\n return (a & b) ^ (a & c) ^ (b & c);\n}\n/**\n * Merkle-Damgard hash construction base class.\n * Could be used to create MD5, RIPEMD, SHA1, SHA2.\n */\nexport class HashMD extends Hash {\n constructor(blockLen, outputLen, padOffset, isLE) {\n super();\n this.finished = false;\n this.length = 0;\n this.pos = 0;\n this.destroyed = false;\n this.blockLen = blockLen;\n this.outputLen = outputLen;\n this.padOffset = padOffset;\n this.isLE = isLE;\n this.buffer = new Uint8Array(blockLen);\n this.view = createView(this.buffer);\n }\n update(data) {\n aexists(this);\n data = toBytes(data);\n abytes(data);\n const { view, buffer, blockLen } = this;\n const len = data.length;\n for (let pos = 0; pos < len;) {\n const take = Math.min(blockLen - this.pos, len - pos);\n // Fast path: we have at least one block in input, cast it to view and process\n if (take === blockLen) {\n const dataView = createView(data);\n for (; blockLen <= len - pos; pos += blockLen)\n this.process(dataView, pos);\n continue;\n }\n buffer.set(data.subarray(pos, pos + take), this.pos);\n this.pos += take;\n pos += take;\n if (this.pos === blockLen) {\n this.process(view, 0);\n this.pos = 0;\n }\n }\n this.length += data.length;\n this.roundClean();\n return this;\n }\n digestInto(out) {\n aexists(this);\n aoutput(out, this);\n this.finished = true;\n // Padding\n // We can avoid allocation of buffer for padding completely if it\n // was previously not allocated here. But it won't change performance.\n const { buffer, view, blockLen, isLE } = this;\n let { pos } = this;\n // append the bit '1' to the message\n buffer[pos++] = 0b10000000;\n clean(this.buffer.subarray(pos));\n // we have less than padOffset left in buffer, so we cannot put length in\n // current block, need process it and pad again\n if (this.padOffset > blockLen - pos) {\n this.process(view, 0);\n pos = 0;\n }\n // Pad until full block byte with zeros\n for (let i = pos; i < blockLen; i++)\n buffer[i] = 0;\n // Note: sha512 requires length to be 128bit integer, but length in JS will overflow before that\n // You need to write around 2 exabytes (u64_max / 8 / (1024**6)) for this to happen.\n // So we just write lowest 64 bits of that value.\n setBigUint64(view, blockLen - 8, BigInt(this.length * 8), isLE);\n this.process(view, 0);\n const oview = createView(out);\n const len = this.outputLen;\n // NOTE: we do division by 4 later, which should be fused in single op with modulo by JIT\n if (len % 4)\n throw new Error('_sha2: outputLen should be aligned to 32bit');\n const outLen = len / 4;\n const state = this.get();\n if (outLen > state.length)\n throw new Error('_sha2: outputLen bigger than state');\n for (let i = 0; i < outLen; i++)\n oview.setUint32(4 * i, state[i], isLE);\n }\n digest() {\n const { buffer, outputLen } = this;\n this.digestInto(buffer);\n const res = buffer.slice(0, outputLen);\n this.destroy();\n return res;\n }\n _cloneInto(to) {\n to || (to = new this.constructor());\n to.set(...this.get());\n const { blockLen, buffer, length, finished, destroyed, pos } = this;\n to.destroyed = destroyed;\n to.finished = finished;\n to.length = length;\n to.pos = pos;\n if (length % blockLen)\n to.buffer.set(buffer);\n return to;\n }\n clone() {\n return this._cloneInto();\n }\n}\n/**\n * Initial SHA-2 state: fractional parts of square roots of first 16 primes 2..53.\n * Check out `test/misc/sha2-gen-iv.js` for recomputation guide.\n */\n/** Initial SHA256 state. Bits 0..32 of frac part of sqrt of primes 2..19 */\nexport const SHA256_IV = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n/** Initial SHA224 state. Bits 32..64 of frac part of sqrt of primes 23..53 */\nexport const SHA224_IV = /* @__PURE__ */ Uint32Array.from([\n 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4,\n]);\n/** Initial SHA384 state. Bits 0..64 of frac part of sqrt of primes 23..53 */\nexport const SHA384_IV = /* @__PURE__ */ Uint32Array.from([\n 0xcbbb9d5d, 0xc1059ed8, 0x629a292a, 0x367cd507, 0x9159015a, 0x3070dd17, 0x152fecd8, 0xf70e5939,\n 0x67332667, 0xffc00b31, 0x8eb44a87, 0x68581511, 0xdb0c2e0d, 0x64f98fa7, 0x47b5481d, 0xbefa4fa4,\n]);\n/** Initial SHA512 state. Bits 0..64 of frac part of sqrt of primes 2..19 */\nexport const SHA512_IV = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1,\n 0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179,\n]);\n//# sourceMappingURL=_md.js.map","/**\n * SHA2 hash function. A.k.a. sha256, sha384, sha512, sha512_224, sha512_256.\n * SHA256 is the fastest hash implementable in JS, even faster than Blake3.\n * Check out [RFC 4634](https://datatracker.ietf.org/doc/html/rfc4634) and\n * [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n */\nimport { Chi, HashMD, Maj, SHA224_IV, SHA256_IV, SHA384_IV, SHA512_IV } from \"./_md.js\";\nimport * as u64 from \"./_u64.js\";\nimport { clean, createHasher, rotr } from \"./utils.js\";\n/**\n * Round constants:\n * First 32 bits of fractional parts of the cube roots of the first 64 primes 2..311)\n */\n// prettier-ignore\nconst SHA256_K = /* @__PURE__ */ Uint32Array.from([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\n/** Reusable temporary buffer. \"W\" comes straight from spec. */\nconst SHA256_W = /* @__PURE__ */ new Uint32Array(64);\nexport class SHA256 extends HashMD {\n constructor(outputLen = 32) {\n super(64, outputLen, 8, false);\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n this.A = SHA256_IV[0] | 0;\n this.B = SHA256_IV[1] | 0;\n this.C = SHA256_IV[2] | 0;\n this.D = SHA256_IV[3] | 0;\n this.E = SHA256_IV[4] | 0;\n this.F = SHA256_IV[5] | 0;\n this.G = SHA256_IV[6] | 0;\n this.H = SHA256_IV[7] | 0;\n }\n get() {\n const { A, B, C, D, E, F, G, H } = this;\n return [A, B, C, D, E, F, G, H];\n }\n // prettier-ignore\n set(A, B, C, D, E, F, G, H) {\n this.A = A | 0;\n this.B = B | 0;\n this.C = C | 0;\n this.D = D | 0;\n this.E = E | 0;\n this.F = F | 0;\n this.G = G | 0;\n this.H = H | 0;\n }\n process(view, offset) {\n // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4)\n SHA256_W[i] = view.getUint32(offset, false);\n for (let i = 16; i < 64; i++) {\n const W15 = SHA256_W[i - 15];\n const W2 = SHA256_W[i - 2];\n const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ (W15 >>> 3);\n const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ (W2 >>> 10);\n SHA256_W[i] = (s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16]) | 0;\n }\n // Compression function main loop, 64 rounds\n let { A, B, C, D, E, F, G, H } = this;\n for (let i = 0; i < 64; i++) {\n const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25);\n const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22);\n const T2 = (sigma0 + Maj(A, B, C)) | 0;\n H = G;\n G = F;\n F = E;\n E = (D + T1) | 0;\n D = C;\n C = B;\n B = A;\n A = (T1 + T2) | 0;\n }\n // Add the compressed chunk to the current hash value\n A = (A + this.A) | 0;\n B = (B + this.B) | 0;\n C = (C + this.C) | 0;\n D = (D + this.D) | 0;\n E = (E + this.E) | 0;\n F = (F + this.F) | 0;\n G = (G + this.G) | 0;\n H = (H + this.H) | 0;\n this.set(A, B, C, D, E, F, G, H);\n }\n roundClean() {\n clean(SHA256_W);\n }\n destroy() {\n this.set(0, 0, 0, 0, 0, 0, 0, 0);\n clean(this.buffer);\n }\n}\nexport class SHA224 extends SHA256 {\n constructor() {\n super(28);\n this.A = SHA224_IV[0] | 0;\n this.B = SHA224_IV[1] | 0;\n this.C = SHA224_IV[2] | 0;\n this.D = SHA224_IV[3] | 0;\n this.E = SHA224_IV[4] | 0;\n this.F = SHA224_IV[5] | 0;\n this.G = SHA224_IV[6] | 0;\n this.H = SHA224_IV[7] | 0;\n }\n}\n// SHA2-512 is slower than sha256 in js because u64 operations are slow.\n// Round contants\n// First 32 bits of the fractional parts of the cube roots of the first 80 primes 2..409\n// prettier-ignore\nconst K512 = /* @__PURE__ */ (() => u64.split([\n '0x428a2f98d728ae22', '0x7137449123ef65cd', '0xb5c0fbcfec4d3b2f', '0xe9b5dba58189dbbc',\n '0x3956c25bf348b538', '0x59f111f1b605d019', '0x923f82a4af194f9b', '0xab1c5ed5da6d8118',\n '0xd807aa98a3030242', '0x12835b0145706fbe', '0x243185be4ee4b28c', '0x550c7dc3d5ffb4e2',\n '0x72be5d74f27b896f', '0x80deb1fe3b1696b1', '0x9bdc06a725c71235', '0xc19bf174cf692694',\n '0xe49b69c19ef14ad2', '0xefbe4786384f25e3', '0x0fc19dc68b8cd5b5', '0x240ca1cc77ac9c65',\n '0x2de92c6f592b0275', '0x4a7484aa6ea6e483', '0x5cb0a9dcbd41fbd4', '0x76f988da831153b5',\n '0x983e5152ee66dfab', '0xa831c66d2db43210', '0xb00327c898fb213f', '0xbf597fc7beef0ee4',\n '0xc6e00bf33da88fc2', '0xd5a79147930aa725', '0x06ca6351e003826f', '0x142929670a0e6e70',\n '0x27b70a8546d22ffc', '0x2e1b21385c26c926', '0x4d2c6dfc5ac42aed', '0x53380d139d95b3df',\n '0x650a73548baf63de', '0x766a0abb3c77b2a8', '0x81c2c92e47edaee6', '0x92722c851482353b',\n '0xa2bfe8a14cf10364', '0xa81a664bbc423001', '0xc24b8b70d0f89791', '0xc76c51a30654be30',\n '0xd192e819d6ef5218', '0xd69906245565a910', '0xf40e35855771202a', '0x106aa07032bbd1b8',\n '0x19a4c116b8d2d0c8', '0x1e376c085141ab53', '0x2748774cdf8eeb99', '0x34b0bcb5e19b48a8',\n '0x391c0cb3c5c95a63', '0x4ed8aa4ae3418acb', '0x5b9cca4f7763e373', '0x682e6ff3d6b2b8a3',\n '0x748f82ee5defb2fc', '0x78a5636f43172f60', '0x84c87814a1f0ab72', '0x8cc702081a6439ec',\n '0x90befffa23631e28', '0xa4506cebde82bde9', '0xbef9a3f7b2c67915', '0xc67178f2e372532b',\n '0xca273eceea26619c', '0xd186b8c721c0c207', '0xeada7dd6cde0eb1e', '0xf57d4f7fee6ed178',\n '0x06f067aa72176fba', '0x0a637dc5a2c898a6', '0x113f9804bef90dae', '0x1b710b35131c471b',\n '0x28db77f523047d84', '0x32caab7b40c72493', '0x3c9ebe0a15c9bebc', '0x431d67c49c100d4c',\n '0x4cc5d4becb3e42b6', '0x597f299cfc657e2a', '0x5fcb6fab3ad6faec', '0x6c44198c4a475817'\n].map(n => BigInt(n))))();\nconst SHA512_Kh = /* @__PURE__ */ (() => K512[0])();\nconst SHA512_Kl = /* @__PURE__ */ (() => K512[1])();\n// Reusable temporary buffers\nconst SHA512_W_H = /* @__PURE__ */ new Uint32Array(80);\nconst SHA512_W_L = /* @__PURE__ */ new Uint32Array(80);\nexport class SHA512 extends HashMD {\n constructor(outputLen = 64) {\n super(128, outputLen, 16, false);\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n // h -- high 32 bits, l -- low 32 bits\n this.Ah = SHA512_IV[0] | 0;\n this.Al = SHA512_IV[1] | 0;\n this.Bh = SHA512_IV[2] | 0;\n this.Bl = SHA512_IV[3] | 0;\n this.Ch = SHA512_IV[4] | 0;\n this.Cl = SHA512_IV[5] | 0;\n this.Dh = SHA512_IV[6] | 0;\n this.Dl = SHA512_IV[7] | 0;\n this.Eh = SHA512_IV[8] | 0;\n this.El = SHA512_IV[9] | 0;\n this.Fh = SHA512_IV[10] | 0;\n this.Fl = SHA512_IV[11] | 0;\n this.Gh = SHA512_IV[12] | 0;\n this.Gl = SHA512_IV[13] | 0;\n this.Hh = SHA512_IV[14] | 0;\n this.Hl = SHA512_IV[15] | 0;\n }\n // prettier-ignore\n get() {\n const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl];\n }\n // prettier-ignore\n set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl) {\n this.Ah = Ah | 0;\n this.Al = Al | 0;\n this.Bh = Bh | 0;\n this.Bl = Bl | 0;\n this.Ch = Ch | 0;\n this.Cl = Cl | 0;\n this.Dh = Dh | 0;\n this.Dl = Dl | 0;\n this.Eh = Eh | 0;\n this.El = El | 0;\n this.Fh = Fh | 0;\n this.Fl = Fl | 0;\n this.Gh = Gh | 0;\n this.Gl = Gl | 0;\n this.Hh = Hh | 0;\n this.Hl = Hl | 0;\n }\n process(view, offset) {\n // Extend the first 16 words into the remaining 64 words w[16..79] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) {\n SHA512_W_H[i] = view.getUint32(offset);\n SHA512_W_L[i] = view.getUint32((offset += 4));\n }\n for (let i = 16; i < 80; i++) {\n // s0 := (w[i-15] rightrotate 1) xor (w[i-15] rightrotate 8) xor (w[i-15] rightshift 7)\n const W15h = SHA512_W_H[i - 15] | 0;\n const W15l = SHA512_W_L[i - 15] | 0;\n const s0h = u64.rotrSH(W15h, W15l, 1) ^ u64.rotrSH(W15h, W15l, 8) ^ u64.shrSH(W15h, W15l, 7);\n const s0l = u64.rotrSL(W15h, W15l, 1) ^ u64.rotrSL(W15h, W15l, 8) ^ u64.shrSL(W15h, W15l, 7);\n // s1 := (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 61) xor (w[i-2] rightshift 6)\n const W2h = SHA512_W_H[i - 2] | 0;\n const W2l = SHA512_W_L[i - 2] | 0;\n const s1h = u64.rotrSH(W2h, W2l, 19) ^ u64.rotrBH(W2h, W2l, 61) ^ u64.shrSH(W2h, W2l, 6);\n const s1l = u64.rotrSL(W2h, W2l, 19) ^ u64.rotrBL(W2h, W2l, 61) ^ u64.shrSL(W2h, W2l, 6);\n // SHA256_W[i] = s0 + s1 + SHA256_W[i - 7] + SHA256_W[i - 16];\n const SUMl = u64.add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16]);\n const SUMh = u64.add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16]);\n SHA512_W_H[i] = SUMh | 0;\n SHA512_W_L[i] = SUMl | 0;\n }\n let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n // Compression function main loop, 80 rounds\n for (let i = 0; i < 80; i++) {\n // S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41)\n const sigma1h = u64.rotrSH(Eh, El, 14) ^ u64.rotrSH(Eh, El, 18) ^ u64.rotrBH(Eh, El, 41);\n const sigma1l = u64.rotrSL(Eh, El, 14) ^ u64.rotrSL(Eh, El, 18) ^ u64.rotrBL(Eh, El, 41);\n //const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const CHIh = (Eh & Fh) ^ (~Eh & Gh);\n const CHIl = (El & Fl) ^ (~El & Gl);\n // T1 = H + sigma1 + Chi(E, F, G) + SHA512_K[i] + SHA512_W[i]\n // prettier-ignore\n const T1ll = u64.add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i]);\n const T1h = u64.add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i]);\n const T1l = T1ll | 0;\n // S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39)\n const sigma0h = u64.rotrSH(Ah, Al, 28) ^ u64.rotrBH(Ah, Al, 34) ^ u64.rotrBH(Ah, Al, 39);\n const sigma0l = u64.rotrSL(Ah, Al, 28) ^ u64.rotrBL(Ah, Al, 34) ^ u64.rotrBL(Ah, Al, 39);\n const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch);\n const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl);\n Hh = Gh | 0;\n Hl = Gl | 0;\n Gh = Fh | 0;\n Gl = Fl | 0;\n Fh = Eh | 0;\n Fl = El | 0;\n ({ h: Eh, l: El } = u64.add(Dh | 0, Dl | 0, T1h | 0, T1l | 0));\n Dh = Ch | 0;\n Dl = Cl | 0;\n Ch = Bh | 0;\n Cl = Bl | 0;\n Bh = Ah | 0;\n Bl = Al | 0;\n const All = u64.add3L(T1l, sigma0l, MAJl);\n Ah = u64.add3H(All, T1h, sigma0h, MAJh);\n Al = All | 0;\n }\n // Add the compressed chunk to the current hash value\n ({ h: Ah, l: Al } = u64.add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0));\n ({ h: Bh, l: Bl } = u64.add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0));\n ({ h: Ch, l: Cl } = u64.add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0));\n ({ h: Dh, l: Dl } = u64.add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0));\n ({ h: Eh, l: El } = u64.add(this.Eh | 0, this.El | 0, Eh | 0, El | 0));\n ({ h: Fh, l: Fl } = u64.add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0));\n ({ h: Gh, l: Gl } = u64.add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0));\n ({ h: Hh, l: Hl } = u64.add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0));\n this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl);\n }\n roundClean() {\n clean(SHA512_W_H, SHA512_W_L);\n }\n destroy() {\n clean(this.buffer);\n this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n }\n}\nexport class SHA384 extends SHA512 {\n constructor() {\n super(48);\n this.Ah = SHA384_IV[0] | 0;\n this.Al = SHA384_IV[1] | 0;\n this.Bh = SHA384_IV[2] | 0;\n this.Bl = SHA384_IV[3] | 0;\n this.Ch = SHA384_IV[4] | 0;\n this.Cl = SHA384_IV[5] | 0;\n this.Dh = SHA384_IV[6] | 0;\n this.Dl = SHA384_IV[7] | 0;\n this.Eh = SHA384_IV[8] | 0;\n this.El = SHA384_IV[9] | 0;\n this.Fh = SHA384_IV[10] | 0;\n this.Fl = SHA384_IV[11] | 0;\n this.Gh = SHA384_IV[12] | 0;\n this.Gl = SHA384_IV[13] | 0;\n this.Hh = SHA384_IV[14] | 0;\n this.Hl = SHA384_IV[15] | 0;\n }\n}\n/**\n * Truncated SHA512/256 and SHA512/224.\n * SHA512_IV is XORed with 0xa5a5a5a5a5a5a5a5, then used as \"intermediary\" IV of SHA512/t.\n * Then t hashes string to produce result IV.\n * See `test/misc/sha2-gen-iv.js`.\n */\n/** SHA512/224 IV */\nconst T224_IV = /* @__PURE__ */ Uint32Array.from([\n 0x8c3d37c8, 0x19544da2, 0x73e19966, 0x89dcd4d6, 0x1dfab7ae, 0x32ff9c82, 0x679dd514, 0x582f9fcf,\n 0x0f6d2b69, 0x7bd44da8, 0x77e36f73, 0x04c48942, 0x3f9d85a8, 0x6a1d36c8, 0x1112e6ad, 0x91d692a1,\n]);\n/** SHA512/256 IV */\nconst T256_IV = /* @__PURE__ */ Uint32Array.from([\n 0x22312194, 0xfc2bf72c, 0x9f555fa3, 0xc84c64c2, 0x2393b86b, 0x6f53b151, 0x96387719, 0x5940eabd,\n 0x96283ee2, 0xa88effe3, 0xbe5e1e25, 0x53863992, 0x2b0199fc, 0x2c85b8aa, 0x0eb72ddc, 0x81c52ca2,\n]);\nexport class SHA512_224 extends SHA512 {\n constructor() {\n super(28);\n this.Ah = T224_IV[0] | 0;\n this.Al = T224_IV[1] | 0;\n this.Bh = T224_IV[2] | 0;\n this.Bl = T224_IV[3] | 0;\n this.Ch = T224_IV[4] | 0;\n this.Cl = T224_IV[5] | 0;\n this.Dh = T224_IV[6] | 0;\n this.Dl = T224_IV[7] | 0;\n this.Eh = T224_IV[8] | 0;\n this.El = T224_IV[9] | 0;\n this.Fh = T224_IV[10] | 0;\n this.Fl = T224_IV[11] | 0;\n this.Gh = T224_IV[12] | 0;\n this.Gl = T224_IV[13] | 0;\n this.Hh = T224_IV[14] | 0;\n this.Hl = T224_IV[15] | 0;\n }\n}\nexport class SHA512_256 extends SHA512 {\n constructor() {\n super(32);\n this.Ah = T256_IV[0] | 0;\n this.Al = T256_IV[1] | 0;\n this.Bh = T256_IV[2] | 0;\n this.Bl = T256_IV[3] | 0;\n this.Ch = T256_IV[4] | 0;\n this.Cl = T256_IV[5] | 0;\n this.Dh = T256_IV[6] | 0;\n this.Dl = T256_IV[7] | 0;\n this.Eh = T256_IV[8] | 0;\n this.El = T256_IV[9] | 0;\n this.Fh = T256_IV[10] | 0;\n this.Fl = T256_IV[11] | 0;\n this.Gh = T256_IV[12] | 0;\n this.Gl = T256_IV[13] | 0;\n this.Hh = T256_IV[14] | 0;\n this.Hl = T256_IV[15] | 0;\n }\n}\n/**\n * SHA2-256 hash function from RFC 4634.\n *\n * It is the fastest JS hash, even faster than Blake3.\n * To break sha256 using birthday attack, attackers need to try 2^128 hashes.\n * BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n */\nexport const sha256 = /* @__PURE__ */ createHasher(() => new SHA256());\n/** SHA2-224 hash function from RFC 4634 */\nexport const sha224 = /* @__PURE__ */ createHasher(() => new SHA224());\n/** SHA2-512 hash function from RFC 4634. */\nexport const sha512 = /* @__PURE__ */ createHasher(() => new SHA512());\n/** SHA2-384 hash function from RFC 4634. */\nexport const sha384 = /* @__PURE__ */ createHasher(() => new SHA384());\n/**\n * SHA2-512/256 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_256 = /* @__PURE__ */ createHasher(() => new SHA512_256());\n/**\n * SHA2-512/224 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_224 = /* @__PURE__ */ createHasher(() => new SHA512_224());\n//# sourceMappingURL=sha2.js.map","/**\n * SHA2-256 a.k.a. sha256. In JS, it is the fastest hash, even faster than Blake3.\n *\n * To break sha256 using birthday attack, attackers need to try 2^128 hashes.\n * BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n *\n * Check out [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n * @deprecated\n */\nimport { SHA224 as SHA224n, sha224 as sha224n, SHA256 as SHA256n, sha256 as sha256n, } from \"./sha2.js\";\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const SHA256 = SHA256n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const sha256 = sha256n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const SHA224 = SHA224n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const sha224 = sha224n;\n//# sourceMappingURL=sha256.js.map","/**\n * Cryptographic Operations (secp256k1)\n * Lazy-loaded for performance\n */\n\nimport { sha256 } from '@noble/hashes/sha256';\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils';\n\nlet secp256k1 = null;\n\n/**\n * Lazy load secp256k1 module\n * @private\n */\nasync function loadCrypto() {\n if (!secp256k1) {\n const module = await import('@noble/curves/secp256k1');\n secp256k1 = module.secp256k1;\n }\n return secp256k1;\n}\n\n/**\n * Get public key from private key\n * @param {string} privateKey - Private key (hex string)\n * @returns {Promise<string>} Public key (hex string)\n */\nexport async function getPublicKey(privateKey) {\n const crypto = await loadCrypto();\n const pubKey = crypto.getPublicKey(privateKey);\n return bytesToHex(pubKey);\n}\n\n/**\n * Sign content with private key\n * @param {string} content - Content to sign (will be hashed)\n * @param {string} privateKey - Private key (hex string)\n * @returns {Promise<string>} Signature (hex string)\n */\nexport async function sign(content, privateKey) {\n try {\n const crypto = await loadCrypto();\n\n // Hash content\n const msgHash = hashContent(content);\n\n // Sign - secp256k1.sign returns Signature object\n const signature = crypto.sign(msgHash, privateKey);\n return signature.toCompactHex();\n } catch (error) {\n throw new Error(`Signature generation failed: ${error.message}`);\n }\n}\n\n/**\n * Verify signature\n * @param {string} content - Original content\n * @param {string} signature - Signature (hex string)\n * @param {string} publicKey - Public key (hex string)\n * @returns {Promise<boolean>} True if valid\n */\nexport async function verify(content, signature, publicKey) {\n try {\n // Validate public key format\n if (!publicKey || typeof publicKey !== 'string' || publicKey.length < 64) {\n throw new Error('Invalid public key format');\n }\n\n const crypto = await loadCrypto();\n\n const msgHash = hashContent(content);\n const isValid = crypto.verify(signature, msgHash, publicKey);\n return isValid;\n } catch (error) {\n // Invalid signatures or keys throw errors\n // For test compatibility, rethrow if it's a validation error\n if (error.message === 'Invalid public key format') {\n throw error;\n }\n // Otherwise return false for invalid signatures\n return false;\n }\n}\n\n/**\n * Match token scope against requested scope with wildcard support\n * Supports:\n * - Exact match: { holonId: \"abc\", lensName: \"quests\" }\n * - Item-level: { holonId: \"abc\", lensName: \"quests\", dataId: \"quest-001\" }\n * - Wildcards: { holonId: \"*\", lensName: \"*\" } matches everything\n * @param {Object} tokenScope - Scope from capability token\n * @param {Object} requestedScope - Scope being requested\n * @returns {boolean} True if token scope covers requested scope\n */\nexport function matchScope(tokenScope, requestedScope) {\n // Handle string scopes (legacy support)\n if (typeof tokenScope === 'string' || typeof requestedScope === 'string') {\n const tokenStr = typeof tokenScope === 'string' ? tokenScope : JSON.stringify(tokenScope);\n const reqStr = typeof requestedScope === 'string' ? requestedScope : JSON.stringify(requestedScope);\n return tokenStr === reqStr;\n }\n\n // Handle holonId\n if (tokenScope.holonId !== '*' && tokenScope.holonId !== requestedScope.holonId) {\n return false;\n }\n\n // Handle lensName\n if (tokenScope.lensName !== '*' && tokenScope.lensName !== requestedScope.lensName) {\n return false;\n }\n\n // Handle optional dataId (item-level scope)\n // If token has specific dataId (not wildcard), it must match requested dataId\n if (tokenScope.dataId && tokenScope.dataId !== '*') {\n if (requestedScope.dataId && tokenScope.dataId !== requestedScope.dataId) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Issue capability token\n * @param {string[]} permissions - Permissions array (e.g., ['read', 'write', 'delete'])\n * @param {Object|string} scope - Scope (holon/lens path or object). Supports wildcards: { holonId: \"*\", lensName: \"*\" }\n * @param {string} recipient - Recipient public key\n * @param {Object} options - Options\n * @param {number} options.expiresIn - Expiration in milliseconds (default: 1 hour)\n * @param {string} options.issuer - Issuer ID\n * @param {string} options.issuerKey - Issuer private key for signing\n * @returns {Promise<string>} Capability token (base64-encoded JWT-like)\n */\nexport async function issueCapability(permissions, scope, recipient, options = {}) {\n const { expiresIn = 3600000, issuer = 'holosphere', issuerKey } = options;\n\n // Validate permissions\n if (!Array.isArray(permissions) || permissions.length === 0) {\n throw new Error('Permissions array cannot be empty');\n }\n\n // Validate scope - now supports wildcards\n if (typeof scope === 'object') {\n // holonId is required (can be '*' for wildcard)\n if (scope.holonId === undefined || scope.holonId === '') {\n throw new Error('Invalid scope: holonId is required (use \"*\" for wildcard)');\n }\n // lensName is required (can be '*' for wildcard)\n if (scope.lensName === undefined || scope.lensName === '') {\n throw new Error('Invalid scope: lensName is required (use \"*\" for wildcard)');\n }\n // dataId is optional (can be specific value, '*', or omitted)\n } else if (typeof scope === 'string' && scope === '') {\n throw new Error('Invalid scope: cannot be empty string');\n }\n\n // Validate issuerKey if provided\n if (issuerKey && (typeof issuerKey !== 'string' || issuerKey.length < 32)) {\n throw new Error('Invalid issuer key');\n }\n\n const token = {\n type: 'capability',\n permissions,\n scope,\n recipient,\n issuer,\n nonce: generateNonce(),\n issued: Date.now(),\n expires: Date.now() + expiresIn,\n };\n\n // Encode token as base64\n const payload = JSON.stringify(token);\n const encoded = Buffer.from ?\n Buffer.from(payload).toString('base64') :\n btoa(payload);\n\n // If issuerKey provided, sign the token\n if (issuerKey) {\n const signature = await sign(payload, issuerKey);\n return `${encoded}.${signature}`;\n }\n\n return encoded;\n}\n\n/**\n * Verify capability token\n * @param {string|Object} token - Capability token (string or object)\n * @param {string} requiredPermission - Required permission\n * @param {Object|string} scope - Scope to check (supports wildcards in token scope)\n * @returns {Promise<boolean>} True if valid\n */\nexport async function verifyCapability(token, requiredPermission, scope) {\n try {\n let tokenObj;\n\n // Decode if string\n if (typeof token === 'string') {\n const parts = token.split('.');\n const payload = parts[0];\n const decoded = Buffer.from ?\n Buffer.from(payload, 'base64').toString('utf8') :\n atob(payload);\n tokenObj = JSON.parse(decoded);\n\n // TODO: Verify signature if present (parts[1])\n } else {\n tokenObj = token;\n }\n\n if (!tokenObj || tokenObj.type !== 'capability') {\n return false;\n }\n\n // Check expiration\n if (Date.now() > tokenObj.expires) {\n return false;\n }\n\n // Check scope using matchScope (supports wildcards)\n if (!matchScope(tokenObj.scope, scope)) {\n return false;\n }\n\n // Check permission\n if (!tokenObj.permissions.includes(requiredPermission)) {\n return false;\n }\n\n return true;\n } catch (error) {\n return false;\n }\n}\n\n/**\n * Generate unique nonce\n * @private\n */\nfunction generateNonce() {\n return (\n Date.now().toString(36) + Math.random().toString(36).substring(2, 15)\n );\n}\n\n/**\n * Hash content using SHA-256\n * @private\n */\nfunction hashContent(content) {\n const str = typeof content === 'string' ? content : JSON.stringify(content);\n const encoder = new TextEncoder();\n const data = encoder.encode(str);\n const hash = sha256(data);\n return bytesToHex(hash);\n}\n","/**\n * Federation Registry - Manages cross-holosphere partnerships\n * Tracks federated partners and their capability tokens\n */\n\nimport { writeGlobal, readGlobal } from '../storage/global-tables.js';\nimport { matchScope } from '../crypto/secp256k1.js';\n\nconst FEDERATION_TABLE = 'federations';\n\n/**\n * Get the federation registry for this holosphere\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @returns {Promise<Object>} Federation registry\n */\nexport async function getFederationRegistry(client, appname) {\n const registry = await readGlobal(client, appname, FEDERATION_TABLE, client.publicKey);\n\n return registry || {\n id: client.publicKey,\n federatedWith: [],\n discoveryEnabled: false,\n autoAccept: false,\n defaultScope: { holonId: '*', lensName: '*' },\n defaultPermissions: ['read'],\n };\n}\n\n/**\n * Save the federation registry\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @param {Object} registry - Registry to save\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function saveFederationRegistry(client, appname, registry) {\n return writeGlobal(client, appname, FEDERATION_TABLE, registry);\n}\n\n/**\n * Add a federated partner\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @param {string} partnerPubKey - Partner's public key\n * @param {Object} options - Partner options\n * @param {string} options.alias - Human-readable name\n * @param {string} options.addedVia - How the partner was added ('manual' or 'nostr_discovery')\n * @param {Object[]} options.inboundCapabilities - Capabilities they've granted us\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function addFederatedPartner(client, appname, partnerPubKey, options = {}) {\n const registry = await getFederationRegistry(client, appname);\n\n // Check if already exists\n const existingIndex = registry.federatedWith.findIndex(p => p.pubKey === partnerPubKey);\n\n if (existingIndex >= 0) {\n // Update existing entry\n const existing = registry.federatedWith[existingIndex];\n\n if (options.alias) {\n existing.alias = options.alias;\n }\n\n if (options.inboundCapabilities) {\n existing.inboundCapabilities = [\n ...(existing.inboundCapabilities || []),\n ...options.inboundCapabilities\n ];\n }\n\n existing.updatedAt = Date.now();\n registry.federatedWith[existingIndex] = existing;\n } else {\n // Add new partner\n registry.federatedWith.push({\n pubKey: partnerPubKey,\n alias: options.alias || null,\n addedAt: Date.now(),\n addedVia: options.addedVia || 'manual',\n inboundCapabilities: options.inboundCapabilities || [],\n outboundCapabilities: [],\n });\n }\n\n return saveFederationRegistry(client, appname, registry);\n}\n\n/**\n * Remove a federated partner\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @param {string} partnerPubKey - Partner's public key to remove\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function removeFederatedPartner(client, appname, partnerPubKey) {\n const registry = await getFederationRegistry(client, appname);\n\n const initialLength = registry.federatedWith.length;\n registry.federatedWith = registry.federatedWith.filter(p => p.pubKey !== partnerPubKey);\n\n if (registry.federatedWith.length === initialLength) {\n return false; // Partner not found\n }\n\n return saveFederationRegistry(client, appname, registry);\n}\n\n/**\n * Get all federated author public keys\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @returns {Promise<string[]>} Array of federated public keys\n */\nexport async function getFederatedAuthors(client, appname) {\n const registry = await getFederationRegistry(client, appname);\n return registry.federatedWith.map(p => p.pubKey);\n}\n\n/**\n * Get a specific federated partner\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @param {string} partnerPubKey - Partner's public key\n * @returns {Promise<Object|null>} Partner info or null\n */\nexport async function getFederatedPartner(client, appname, partnerPubKey) {\n const registry = await getFederationRegistry(client, appname);\n return registry.federatedWith.find(p => p.pubKey === partnerPubKey) || null;\n}\n\n/**\n * Get capability for a specific author and scope\n * Finds a valid, non-expired capability that covers the requested scope\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @param {string} authorPubKey - Author's public key\n * @param {Object} scope - Requested scope { holonId, lensName, dataId? }\n * @returns {Promise<Object|null>} Capability entry or null\n */\nexport async function getCapabilityForAuthor(client, appname, authorPubKey, scope) {\n const registry = await getFederationRegistry(client, appname);\n const partner = registry.federatedWith.find(p => p.pubKey === authorPubKey);\n\n if (!partner || !partner.inboundCapabilities) {\n return null;\n }\n\n // Find matching, non-expired capability\n return partner.inboundCapabilities.find(cap => {\n // Check expiration\n if (cap.expires && cap.expires < Date.now()) {\n return false;\n }\n\n // Check scope match (supports wildcards)\n return matchScope(cap.scope, scope);\n }) || null;\n}\n\n/**\n * Store an inbound capability (one we received from a partner)\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @param {string} partnerPubKey - Partner's public key\n * @param {Object} capabilityInfo - Capability information\n * @param {string} capabilityInfo.token - The capability token\n * @param {Object} capabilityInfo.scope - Token scope\n * @param {string[]} capabilityInfo.permissions - Granted permissions\n * @param {number} capabilityInfo.expires - Expiration timestamp\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function storeInboundCapability(client, appname, partnerPubKey, capabilityInfo) {\n const registry = await getFederationRegistry(client, appname);\n const partner = registry.federatedWith.find(p => p.pubKey === partnerPubKey);\n\n if (!partner) {\n // Auto-add partner if not exists\n return addFederatedPartner(client, appname, partnerPubKey, {\n addedVia: 'capability_received',\n inboundCapabilities: [capabilityInfo]\n });\n }\n\n if (!partner.inboundCapabilities) {\n partner.inboundCapabilities = [];\n }\n\n // Check if we already have this capability (by scope match)\n const existingIndex = partner.inboundCapabilities.findIndex(cap =>\n JSON.stringify(cap.scope) === JSON.stringify(capabilityInfo.scope)\n );\n\n if (existingIndex >= 0) {\n // Update existing capability\n partner.inboundCapabilities[existingIndex] = {\n ...capabilityInfo,\n updatedAt: Date.now()\n };\n } else {\n // Add new capability\n partner.inboundCapabilities.push({\n ...capabilityInfo,\n receivedAt: Date.now()\n });\n }\n\n return saveFederationRegistry(client, appname, registry);\n}\n\n/**\n * Store an outbound capability (one we issued to a partner)\n * We only store the hash, not the full token\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @param {string} partnerPubKey - Partner's public key\n * @param {Object} capabilityInfo - Capability information\n * @param {string} capabilityInfo.tokenHash - SHA-256 hash of the token\n * @param {Object} capabilityInfo.scope - Token scope\n * @param {string[]} capabilityInfo.permissions - Granted permissions\n * @param {number} capabilityInfo.expires - Expiration timestamp\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function storeOutboundCapability(client, appname, partnerPubKey, capabilityInfo) {\n const registry = await getFederationRegistry(client, appname);\n const partner = registry.federatedWith.find(p => p.pubKey === partnerPubKey);\n\n if (!partner) {\n throw new Error(`Partner ${partnerPubKey} not found in federation registry`);\n }\n\n if (!partner.outboundCapabilities) {\n partner.outboundCapabilities = [];\n }\n\n partner.outboundCapabilities.push({\n tokenHash: capabilityInfo.tokenHash,\n scope: capabilityInfo.scope,\n permissions: capabilityInfo.permissions,\n issuedAt: Date.now(),\n expires: capabilityInfo.expires,\n });\n\n return saveFederationRegistry(client, appname, registry);\n}\n\n/**\n * Revoke an outbound capability (by token hash)\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @param {string} partnerPubKey - Partner's public key\n * @param {string} tokenHash - Hash of the token to revoke\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function revokeOutboundCapability(client, appname, partnerPubKey, tokenHash) {\n const registry = await getFederationRegistry(client, appname);\n const partner = registry.federatedWith.find(p => p.pubKey === partnerPubKey);\n\n if (!partner || !partner.outboundCapabilities) {\n return false;\n }\n\n const initialLength = partner.outboundCapabilities.length;\n partner.outboundCapabilities = partner.outboundCapabilities.filter(\n cap => cap.tokenHash !== tokenHash\n );\n\n if (partner.outboundCapabilities.length === initialLength) {\n return false; // Token not found\n }\n\n return saveFederationRegistry(client, appname, registry);\n}\n\n/**\n * Update federation discovery settings\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @param {Object} settings - Discovery settings\n * @param {boolean} settings.discoveryEnabled - Enable Nostr discovery\n * @param {boolean} settings.autoAccept - Auto-accept federation requests\n * @param {Object} settings.defaultScope - Default scope for auto-accepted federations\n * @param {string[]} settings.defaultPermissions - Default permissions for auto-accepted federations\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function updateDiscoverySettings(client, appname, settings) {\n const registry = await getFederationRegistry(client, appname);\n\n if (settings.discoveryEnabled !== undefined) {\n registry.discoveryEnabled = settings.discoveryEnabled;\n }\n if (settings.autoAccept !== undefined) {\n registry.autoAccept = settings.autoAccept;\n }\n if (settings.defaultScope !== undefined) {\n registry.defaultScope = settings.defaultScope;\n }\n if (settings.defaultPermissions !== undefined) {\n registry.defaultPermissions = settings.defaultPermissions;\n }\n\n return saveFederationRegistry(client, appname, registry);\n}\n\n/**\n * Get all federated authors that have granted capabilities for a given scope\n * Returns pubKeys of partners who have given us access to read/write their data\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @param {Object} scope - Requested scope { holonId?, lensName?, dataId? }\n * @param {string} permission - Required permission ('read' or 'write')\n * @returns {Promise<Array>} Array of { pubKey, capability } for matching partners\n */\nexport async function getFederatedAuthorsForScope(client, appname, scope = {}, permission = 'read') {\n const registry = await getFederationRegistry(client, appname);\n const now = Date.now();\n const results = [];\n\n for (const partner of registry.federatedWith) {\n if (!partner.inboundCapabilities || partner.inboundCapabilities.length === 0) {\n continue;\n }\n\n // Find a valid capability that covers this scope\n for (const cap of partner.inboundCapabilities) {\n // Check expiration\n if (cap.expires && cap.expires < now) {\n continue;\n }\n\n // Check permission\n if (cap.permissions && !cap.permissions.includes(permission)) {\n continue;\n }\n\n // Check scope match (supports wildcards)\n if (matchScope(cap.scope, scope)) {\n results.push({\n pubKey: partner.pubKey,\n capability: cap,\n });\n break; // One valid capability per partner is enough\n }\n }\n }\n\n return results;\n}\n\n/**\n * Clean up expired capabilities from the registry\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @returns {Promise<Object>} Cleanup result { inboundRemoved, outboundRemoved }\n */\nexport async function cleanupExpiredCapabilities(client, appname) {\n const registry = await getFederationRegistry(client, appname);\n const now = Date.now();\n let inboundRemoved = 0;\n let outboundRemoved = 0;\n\n for (const partner of registry.federatedWith) {\n if (partner.inboundCapabilities) {\n const beforeCount = partner.inboundCapabilities.length;\n partner.inboundCapabilities = partner.inboundCapabilities.filter(\n cap => !cap.expires || cap.expires > now\n );\n inboundRemoved += beforeCount - partner.inboundCapabilities.length;\n }\n\n if (partner.outboundCapabilities) {\n const beforeCount = partner.outboundCapabilities.length;\n partner.outboundCapabilities = partner.outboundCapabilities.filter(\n cap => !cap.expires || cap.expires > now\n );\n outboundRemoved += beforeCount - partner.outboundCapabilities.length;\n }\n }\n\n if (inboundRemoved > 0 || outboundRemoved > 0) {\n await saveFederationRegistry(client, appname, registry);\n }\n\n return { inboundRemoved, outboundRemoved };\n}\n","/**\n * Federation and Hologram (reference) Management\n */\n\nimport { buildPath, write, read, update } from '../storage/unified-storage.js';\nimport { verifyCapability } from '../crypto/secp256k1.js';\nimport { getCapabilityForAuthor } from './registry.js';\n\nconst MAX_RESOLUTION_DEPTH = 10;\n\n/**\n * Check if creating a hologram would result in a circular reference\n * This follows the chain from the source to see if it eventually points back to the target\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {string} sourceHolon - Source holon ID (where original data lives)\n * @param {string} targetHolon - Target holon ID (where hologram would be created)\n * @param {string} lensName - Lens name\n * @param {string} dataId - Data ID\n * @returns {Promise<Object>} Result with { isCircular, chain }\n */\nexport async function wouldCreateCircularHologram(client, appname, sourceHolon, targetHolon, lensName, dataId) {\n const visited = new Set();\n const chain = [];\n\n let currentHolon = sourceHolon;\n let currentLens = lensName;\n let currentDataId = dataId;\n let currentAppname = appname;\n\n // Follow the chain to see if we eventually reach targetHolon\n while (visited.size < MAX_RESOLUTION_DEPTH) {\n const key = `${currentAppname}:${currentHolon}:${currentLens}:${currentDataId}`;\n\n if (visited.has(key)) {\n // Already visited this node - there's a cycle in the existing chain\n return { isCircular: true, chain, reason: 'existing_cycle' };\n }\n\n visited.add(key);\n chain.push({ holon: currentHolon, lens: currentLens, dataId: currentDataId });\n\n // Check if current holon is our target - this would create a circular reference\n if (currentHolon === targetHolon) {\n return { isCircular: true, chain, reason: 'would_create_cycle' };\n }\n\n // Read the data at current location\n const path = buildPath(currentAppname, currentHolon, currentLens, currentDataId);\n const data = await read(client, path);\n\n if (!data) {\n // Data doesn't exist - no circular reference possible from this chain\n return { isCircular: false, chain };\n }\n\n if (!data.hologram || !data.target) {\n // Not a hologram - chain ends here, no circular reference\n return { isCircular: false, chain };\n }\n\n // Follow the hologram to its target\n currentAppname = data.target.appname || currentAppname;\n currentHolon = data.target.holonId;\n currentLens = data.target.lensName || currentLens;\n currentDataId = data.target.dataId || currentDataId;\n }\n\n // Max depth reached - treat as potential circular to be safe\n return { isCircular: true, chain, reason: 'max_depth_exceeded' };\n}\n\n/**\n * Create a hologram (lightweight reference)\n * @param {string} sourceHolon - Source holon ID\n * @param {string} targetHolon - Target holon ID\n * @param {string} lensName - Lens name\n * @param {string} dataId - Data ID\n * @param {string} appname - Application namespace\n * @param {Object} options - Optional cross-holosphere settings\n * @param {string} options.authorPubKey - Source author's public key (for cross-holosphere)\n * @param {string} options.capability - Capability token (for cross-holosphere)\n * @returns {Object} Hologram object\n */\nexport function createHologram(sourceHolon, targetHolon, lensName, dataId, appname, options = {}) {\n const { authorPubKey = null, capability = null } = options;\n\n const soul = buildPath(appname, sourceHolon, lensName, dataId);\n\n const hologram = {\n id: dataId,\n hologram: true,\n soul,\n target: {\n appname,\n holonId: sourceHolon,\n lensName,\n dataId,\n },\n _meta: {\n created: Date.now(),\n sourceHolon,\n source: sourceHolon, // Alias for compatibility\n },\n };\n\n // Cross-holosphere enhancements\n if (authorPubKey) {\n hologram.crossHolosphere = true;\n hologram.target.authorPubKey = authorPubKey;\n hologram._meta.sourcePubKey = authorPubKey;\n }\n\n if (capability) {\n hologram.capability = capability;\n hologram._meta.grantedAt = Date.now();\n }\n\n return hologram;\n}\n\n/**\n * Resolve hologram to actual data, merging local overrides\n * Supports cross-holosphere holograms with capability token verification\n * @param {Object} client - Nostr client instance\n * @param {Object} hologram - Hologram object\n * @param {Set} visited - Visited souls (circular reference detection)\n * @param {Array} chain - Chain of souls for debugging circular references\n * @param {Object} options - Resolution options\n * @param {string} options.appname - Application namespace (for registry lookup)\n * @param {boolean} options.deleteCircular - If true, delete circular holograms when detected (default: true)\n * @param {string} options.hologramPath - Path of the hologram being resolved (for deletion)\n * @returns {Promise<Object|null>} Resolved data with _hologram metadata, or null\n */\nexport async function resolveHologram(client, hologram, visited = new Set(), chain = [], options = {}) {\n const { deleteCircular = true, hologramPath = null } = options;\n\n if (!hologram || !hologram.hologram) {\n return hologram; // Not a hologram, return as-is\n }\n\n const { soul } = hologram;\n const target = hologram.target || {};\n\n // Circular reference detection\n if (visited.has(soul)) {\n const chainStr = [...chain, soul].join(' → ');\n console.warn(`🔄 Circular reference detected - removing hologram`);\n console.warn(` Soul: ${soul}`);\n console.warn(` Chain: ${chainStr}`);\n console.warn(` Source holon: ${target.holonId || 'unknown'}`);\n console.warn(` Lens: ${target.lensName || 'unknown'}`);\n console.warn(` Data ID: ${target.dataId || hologram.id || 'unknown'}`);\n console.warn(` Resolution depth: ${visited.size}`);\n\n // Delete the circular hologram\n if (deleteCircular && hologramPath) {\n console.info(` 🗑️ Deleting circular hologram at: ${hologramPath}`);\n await write(client, hologramPath, null);\n }\n\n return null;\n }\n\n if (visited.size >= MAX_RESOLUTION_DEPTH) {\n const chainStr = [...chain, soul].join(' → ');\n console.warn(`⚠️ Max resolution depth (${MAX_RESOLUTION_DEPTH}) exceeded - removing hologram`);\n console.warn(` Current soul: ${soul}`);\n console.warn(` Chain: ${chainStr}`);\n console.warn(` Source holon: ${target.holonId || 'unknown'}`);\n console.warn(` Lens: ${target.lensName || 'unknown'}`);\n\n // Delete the problematic hologram\n if (deleteCircular && hologramPath) {\n console.info(` 🗑️ Deleting deep chain hologram at: ${hologramPath}`);\n await write(client, hologramPath, null);\n }\n\n return null;\n }\n\n visited.add(soul);\n chain.push(soul);\n\n let sourceData;\n\n // Handle cross-holosphere holograms\n if (hologram.crossHolosphere && target.authorPubKey) {\n // Get capability - try embedded first, then registry fallback\n let capability = hologram.capability;\n\n if (!capability && options.appname) {\n // Fallback to registry lookup\n const capEntry = await getCapabilityForAuthor(\n client,\n options.appname,\n target.authorPubKey,\n {\n holonId: target.holonId,\n lensName: target.lensName,\n dataId: target.dataId,\n }\n );\n if (capEntry) {\n capability = capEntry.token;\n }\n }\n\n // Verify capability before resolving\n if (!capability) {\n console.warn(`❌ Cross-holosphere hologram missing capability: ${soul}`);\n return null;\n }\n\n const isValid = await verifyCapability(\n capability,\n 'read',\n {\n holonId: target.holonId,\n lensName: target.lensName,\n dataId: target.dataId,\n }\n );\n\n if (!isValid) {\n console.warn(`❌ Capability verification failed for cross-holosphere hologram: ${soul}`);\n return null;\n }\n\n // Read from federated source (different author)\n sourceData = await read(client, soul, {\n authors: [target.authorPubKey]\n });\n } else {\n // Same-holosphere resolution (original behavior)\n sourceData = await read(client, soul);\n }\n\n if (!sourceData) {\n return null;\n }\n\n // If source data is also a hologram, recursively resolve\n if (sourceData.hologram) {\n // Pass the soul as the hologramPath so circular holograms can be deleted\n return resolveHologram(client, sourceData, visited, chain, { ...options, hologramPath: soul });\n }\n\n // Merge hologram with source data\n return mergeHologramWithSource(hologram, sourceData);\n}\n\n/**\n * Merge hologram local overrides with source data\n * @private\n * @param {Object} hologram - Hologram object\n * @param {Object} sourceData - Source data\n * @returns {Object} Merged data with _hologram metadata\n */\nfunction mergeHologramWithSource(hologram, sourceData) {\n // Extract local overrides from the hologram (exclude hologram-specific fields)\n const hologramOnlyFields = ['hologram', 'soul', 'target', '_meta', 'id', 'capability', 'crossHolosphere'];\n const localOverrides = {};\n const localOverrideKeys = [];\n\n for (const key of Object.keys(hologram)) {\n if (!hologramOnlyFields.includes(key)) {\n localOverrides[key] = hologram[key];\n localOverrideKeys.push(key);\n }\n }\n\n // Merge: source data + local overrides + hologram metadata\n const sourceHolon = hologram._meta?.sourceHolon || hologram._meta?.source || hologram.target?.holonId;\n const resolved = {\n ...sourceData, // Original data from source\n ...localOverrides, // Local overrides (x, y, pinned, etc.)\n _hologram: {\n isHologram: true,\n soul: hologram.soul,\n sourceHolon: sourceHolon,\n localOverrides: localOverrideKeys,\n crossHolosphere: hologram.crossHolosphere || false,\n sourcePubKey: hologram._meta?.sourcePubKey || null,\n }\n };\n\n // Preserve original _meta and add source from hologram\n if (sourceData._meta) {\n resolved._meta = { ...sourceData._meta, source: sourceHolon };\n } else {\n resolved._meta = { source: sourceHolon };\n }\n\n return resolved;\n}\n\n/**\n * Setup federation between holons\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {string} sourceHolon - Source holon ID\n * @param {string} targetHolon - Target holon ID\n * @param {string} lensName - Lens name\n * @param {Object} options - Federation options\n * @param {string} options.direction - 'inbound' or 'outbound'\n * @param {string} options.mode - 'reference' or 'copy'\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function setupFederation(\n client,\n appname,\n sourceHolon,\n targetHolon,\n lensName,\n options = {}\n) {\n const { direction = 'outbound', mode = 'reference' } = options;\n\n const federationConfig = {\n sourceHolon,\n targetHolon,\n lensName,\n direction,\n mode,\n created: Date.now(),\n };\n\n // Store federation config\n const configPath = buildPath(appname, sourceHolon, lensName, '_federation');\n return write(client, configPath, federationConfig);\n}\n\n/**\n * Propagate data to federated location\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {Object} data - Data to propagate\n * @param {string} sourceHolon - Source holon ID\n * @param {string} targetHolon - Target holon ID\n * @param {string} lensName - Lens name\n * @param {string} mode - 'reference' or 'copy'\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function propagateData(\n client,\n appname,\n data,\n sourceHolon,\n targetHolon,\n lensName,\n mode = 'reference'\n) {\n const dataId = data.id;\n\n // Don't create hologram to the same holon - it would point to itself\n if (sourceHolon === targetHolon) {\n console.info(`⏭️ Skipping propagation - source and target are the same holon: ${sourceHolon}`);\n return true;\n }\n\n // Don't propagate holograms back to avoid circular references\n // If this data is already a hologram pointing to the target, skip it\n if (data.hologram === true) {\n // Check if this hologram would create a circular reference\n if (data.target && data.target.holonId === targetHolon) {\n console.info(`🔄 Skipping propagation - would create circular reference:`);\n console.info(` Data ID: ${dataId}`);\n console.info(` Source holon: ${sourceHolon}`);\n console.info(` Target holon: ${targetHolon}`);\n console.info(` Hologram points to: ${data.target.holonId}`);\n console.info(` Lens: ${lensName}`);\n console.info(` Original soul: ${data.soul || 'unknown'}`);\n return true;\n }\n\n // Check if targetHolon is already in the original source's activeHolograms\n // This prevents creating duplicate holograms when the target already has one\n if (data.target) {\n const originalSourcePath = buildPath(\n data.target.appname || appname,\n data.target.holonId,\n data.target.lensName || lensName,\n data.target.dataId || dataId\n );\n const originalSource = await read(client, originalSourcePath);\n\n if (originalSource?._meta?.activeHolograms) {\n const alreadyHasHologram = originalSource._meta.activeHolograms.some(\n h => h.targetHolon === targetHolon\n );\n if (alreadyHasHologram) {\n console.info(`⏭️ Skipping propagation - target already in activeHolograms:`);\n console.info(` Data ID: ${dataId}`);\n console.info(` Original source: ${data.target.holonId}`);\n console.info(` Target holon: ${targetHolon}`);\n return true;\n }\n }\n }\n\n // Deep circular check for hologram copy - ensure the original source doesn't eventually point to target\n const originalSourceHolon = data.target.holonId;\n const originalDataId = data.target.dataId || dataId;\n const originalLens = data.target.lensName || lensName;\n const originalAppname = data.target.appname || appname;\n\n const circularCheck = await wouldCreateCircularHologram(\n client, originalAppname, originalSourceHolon, targetHolon, originalLens, originalDataId\n );\n\n if (circularCheck.isCircular) {\n const chainStr = circularCheck.chain.map(c => c.holon).join(' → ');\n console.warn(`🔄 Preventing circular hologram copy:`);\n console.warn(` Data ID: ${dataId}`);\n console.warn(` Original source: ${originalSourceHolon}`);\n console.warn(` Would copy to: ${targetHolon}`);\n console.warn(` Existing chain: ${chainStr}`);\n console.warn(` Reason: ${circularCheck.reason}`);\n return false;\n }\n\n // When propagating a hologram, copy it instead of creating a hologram of a hologram\n // This maintains the reference to the original source\n const targetPath = buildPath(appname, targetHolon, lensName, dataId);\n const copiedHologram = {\n ...data,\n _meta: {\n ...data._meta,\n copiedFrom: sourceHolon,\n copiedAt: Date.now()\n }\n };\n const success = await write(client, targetPath, copiedHologram);\n\n // Add this new location to the original source's activeHolograms\n if (success && data.target) {\n await addActiveHologram(\n client,\n data.target.appname || appname,\n data.target.holonId,\n data.target.lensName || lensName,\n data.target.dataId || dataId,\n targetHolon\n );\n console.info(`📋 Copied hologram to ${targetHolon}:`);\n console.info(` Data ID: ${dataId}`);\n console.info(` Original source: ${data.target.holonId}`);\n console.info(` Copied from: ${sourceHolon}`);\n }\n\n return success;\n }\n\n // For non-hologram data, check if targetHolon is already in activeHolograms\n if (mode === 'reference' && data._meta?.activeHolograms) {\n const alreadyHasHologram = data._meta.activeHolograms.some(\n h => h.targetHolon === targetHolon\n );\n if (alreadyHasHologram) {\n console.info(`⏭️ Skipping propagation - target already in activeHolograms:`);\n console.info(` Data ID: ${dataId}`);\n console.info(` Source holon: ${sourceHolon}`);\n console.info(` Target holon: ${targetHolon}`);\n return true;\n }\n }\n\n if (mode === 'reference') {\n // Deep circular reference check - follow the chain from source to see if it would loop back\n const circularCheck = await wouldCreateCircularHologram(\n client, appname, sourceHolon, targetHolon, lensName, dataId\n );\n\n if (circularCheck.isCircular) {\n const chainStr = circularCheck.chain.map(c => c.holon).join(' → ');\n console.warn(`🔄 Preventing circular hologram creation:`);\n console.warn(` Data ID: ${dataId}`);\n console.warn(` Would create: ${sourceHolon} → ${targetHolon}`);\n console.warn(` Existing chain: ${chainStr}`);\n console.warn(` Reason: ${circularCheck.reason}`);\n return false;\n }\n\n // Create hologram in target\n const hologram = createHologram(sourceHolon, targetHolon, lensName, dataId, appname);\n const targetPath = buildPath(appname, targetHolon, lensName, dataId);\n const success = await write(client, targetPath, hologram);\n\n // Add hologram to source data's _meta.activeHolograms for tracking\n if (success) {\n await addActiveHologram(client, appname, sourceHolon, lensName, dataId, targetHolon);\n }\n\n return success;\n } else {\n // Copy data to target\n const targetPath = buildPath(appname, targetHolon, lensName, dataId);\n return write(client, targetPath, { ...data, _meta: { ...data._meta, source: sourceHolon } });\n }\n}\n\n/**\n * Update local overrides on an existing hologram\n * This allows storing holon-specific data (position, pinned status, etc.) on a hologram\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {string} holonId - Holon where the hologram lives\n * @param {string} lensName - Lens name\n * @param {string} dataId - Data ID\n * @param {Object} overrides - Local override fields to set (e.g., { x: 100, y: 200, pinned: true })\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function updateHologramOverrides(client, appname, holonId, lensName, dataId, overrides) {\n const path = buildPath(appname, holonId, lensName, dataId);\n\n // Read existing hologram\n const existing = await read(client, path);\n\n if (!existing) {\n console.warn(`Hologram not found at ${path}`);\n return false;\n }\n\n // Only update if it's actually a hologram\n if (!existing.hologram) {\n console.warn(`Data at ${path} is not a hologram, cannot update overrides`);\n return false;\n }\n\n // Merge overrides into hologram (but don't allow overriding hologram-specific fields)\n const protectedFields = ['hologram', 'soul', 'target', '_meta', 'id'];\n const safeOverrides = {};\n\n for (const [key, value] of Object.entries(overrides)) {\n if (!protectedFields.includes(key)) {\n safeOverrides[key] = value;\n }\n }\n\n const updated = {\n ...existing,\n ...safeOverrides\n };\n\n return write(client, path, updated);\n}\n\n/**\n * Check if data is a hologram (unresolved reference)\n * @param {Object} data - Data to check\n * @returns {boolean} True if data is an unresolved hologram\n */\nexport function isHologram(data) {\n return data && data.hologram === true;\n}\n\n/**\n * Check if data was resolved from a hologram\n * @param {Object} data - Data to check\n * @returns {boolean} True if data was resolved from a hologram\n */\nexport function isResolvedHologram(data) {\n return data && data._hologram && data._hologram.isHologram === true;\n}\n\n/**\n * Get hologram source information from resolved data\n * @param {Object} data - Resolved data\n * @returns {Object|null} Source info { soul, sourceHolon, localOverrides } or null\n */\nexport function getHologramSource(data) {\n if (!isResolvedHologram(data)) {\n return null;\n }\n return {\n soul: data._hologram.soul,\n sourceHolon: data._hologram.sourceHolon,\n localOverrides: data._hologram.localOverrides || []\n };\n}\n\n/**\n * Add a hologram reference to the source data's _meta.activeHolograms\n * This tracks all holograms pointing to this specific data item\n * If the source is itself a hologram, follows the chain to find the real source\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {string} sourceHolon - Source holon ID (where original data lives)\n * @param {string} lensName - Lens name\n * @param {string} dataId - Data ID\n * @param {string} targetHolon - Target holon ID (where hologram lives)\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function addActiveHologram(client, appname, sourceHolon, lensName, dataId, targetHolon) {\n let currentAppname = appname;\n let currentHolon = sourceHolon;\n let currentLens = lensName;\n let currentDataId = dataId;\n let sourcePath = buildPath(currentAppname, currentHolon, currentLens, currentDataId);\n\n // Read existing source data\n let sourceData = await read(client, sourcePath);\n if (!sourceData) {\n console.warn(`Source data not found at ${sourcePath}`);\n return false;\n }\n\n // If source is a hologram, follow the chain to find the real source\n // This ensures activeHolograms is always tracked on the actual data, not on holograms\n let depth = 0;\n const maxDepth = 10;\n while (sourceData.hologram === true && sourceData.target && depth < maxDepth) {\n depth++;\n currentAppname = sourceData.target.appname || currentAppname;\n currentHolon = sourceData.target.holonId;\n currentLens = sourceData.target.lensName || currentLens;\n currentDataId = sourceData.target.dataId || currentDataId;\n sourcePath = buildPath(currentAppname, currentHolon, currentLens, currentDataId);\n\n sourceData = await read(client, sourcePath);\n if (!sourceData) {\n console.warn(`Real source data not found at ${sourcePath}`);\n return false;\n }\n }\n\n if (depth > 0) {\n console.info(`📍 Followed hologram chain (depth: ${depth}) to real source: ${currentHolon}/${currentLens}/${currentDataId}`);\n }\n\n // Initialize _meta and activeHolograms if needed\n if (!sourceData._meta) {\n sourceData._meta = {};\n }\n if (!Array.isArray(sourceData._meta.activeHolograms)) {\n sourceData._meta.activeHolograms = [];\n }\n\n const now = Date.now();\n\n // Check if this hologram already exists\n const existingIndex = sourceData._meta.activeHolograms.findIndex(\n h => h.targetHolon === targetHolon\n );\n\n if (existingIndex >= 0) {\n // Update existing entry\n sourceData._meta.activeHolograms[existingIndex].lastUpdated = now;\n } else {\n // Add new entry\n sourceData._meta.activeHolograms.push({\n targetHolon,\n created: now,\n lastUpdated: now\n });\n }\n\n // Write to the real source path (not the original one if we followed a chain)\n return write(client, sourcePath, sourceData);\n}\n\n/**\n * Remove a hologram reference from the source data's _meta.activeHolograms\n * If the source is itself a hologram, follows the chain to find the real source\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {string} sourceHolon - Source holon ID\n * @param {string} lensName - Lens name\n * @param {string} dataId - Data ID\n * @param {string} targetHolon - Target holon ID\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function removeActiveHologram(client, appname, sourceHolon, lensName, dataId, targetHolon) {\n let currentAppname = appname;\n let currentHolon = sourceHolon;\n let currentLens = lensName;\n let currentDataId = dataId;\n let sourcePath = buildPath(currentAppname, currentHolon, currentLens, currentDataId);\n\n // Read existing source data\n let sourceData = await read(client, sourcePath);\n if (!sourceData) {\n return false;\n }\n\n // If source is a hologram, follow the chain to find the real source\n let depth = 0;\n const maxDepth = 10;\n while (sourceData.hologram === true && sourceData.target && depth < maxDepth) {\n depth++;\n currentAppname = sourceData.target.appname || currentAppname;\n currentHolon = sourceData.target.holonId;\n currentLens = sourceData.target.lensName || currentLens;\n currentDataId = sourceData.target.dataId || currentDataId;\n sourcePath = buildPath(currentAppname, currentHolon, currentLens, currentDataId);\n\n sourceData = await read(client, sourcePath);\n if (!sourceData) {\n return false;\n }\n }\n\n if (!sourceData._meta || !Array.isArray(sourceData._meta.activeHolograms)) {\n return false;\n }\n\n const initialLength = sourceData._meta.activeHolograms.length;\n sourceData._meta.activeHolograms = sourceData._meta.activeHolograms.filter(\n h => h.targetHolon !== targetHolon\n );\n\n // Only write if something changed\n if (sourceData._meta.activeHolograms.length < initialLength) {\n return write(client, sourcePath, sourceData);\n }\n\n return false;\n}\n\n/**\n * Refresh lastUpdated timestamps on all activeHolograms in source data\n * Also updates the hologram objects in target holons\n * Called when source data is updated\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {string} sourceHolon - Source holon ID\n * @param {string} lensName - Lens name\n * @param {string} dataId - Data ID that was updated\n * @param {Object} sourceData - The source data object (already read, to avoid re-reading)\n * @returns {Promise<Object>} Result with refreshed count\n */\nexport async function refreshActiveHolograms(client, appname, sourceHolon, lensName, dataId, sourceData = null) {\n // Read source data if not provided\n if (!sourceData) {\n const sourcePath = buildPath(appname, sourceHolon, lensName, dataId);\n sourceData = await read(client, sourcePath);\n }\n\n if (!sourceData || !sourceData._meta || !Array.isArray(sourceData._meta.activeHolograms)) {\n return { refreshed: 0, holograms: [] };\n }\n\n const now = Date.now();\n const refreshed = [];\n\n // Update timestamps on all activeHolograms\n for (const hologramEntry of sourceData._meta.activeHolograms) {\n hologramEntry.lastUpdated = now;\n\n // Also update the hologram itself in the target holon\n const hologramPath = buildPath(appname, hologramEntry.targetHolon, lensName, dataId);\n const hologram = await read(client, hologramPath);\n\n if (hologram && hologram.hologram === true) {\n // Update hologram's _meta.lastUpdated\n if (!hologram._meta) hologram._meta = {};\n hologram._meta.lastUpdated = now;\n await write(client, hologramPath, hologram);\n refreshed.push({\n targetHolon: hologramEntry.targetHolon,\n dataId,\n timestamp: now\n });\n }\n }\n\n // Source data's activeHolograms timestamps are updated in-place\n // The caller should save sourceData if needed\n\n return { refreshed: refreshed.length, holograms: refreshed, sourceData };\n}\n\n/**\n * Delete a hologram and clean up the activeHolograms list on the original source\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {string} holonId - Holon where the hologram lives (to be deleted from)\n * @param {string} lensName - Lens name\n * @param {string} dataId - Data ID of the hologram\n * @param {Object} options - Optional settings\n * @param {boolean} options.deleteData - If true, actually delete the data (default: true)\n * @returns {Promise<Object>} Result with deletion info\n */\nexport async function deleteHologram(client, appname, holonId, lensName, dataId, options = {}) {\n const { deleteData = true } = options;\n const path = buildPath(appname, holonId, lensName, dataId);\n const result = {\n success: false,\n wasHologram: false,\n sourceHolon: null,\n activeHologramsUpdated: false,\n error: null\n };\n\n try {\n // Read the hologram to get source information\n const hologram = await read(client, path);\n\n if (!hologram) {\n console.warn(`🗑️ Hologram not found at ${path}`);\n result.error = 'Hologram not found';\n return result;\n }\n\n // Check if it's actually a hologram\n if (hologram.hologram === true && hologram.target) {\n result.wasHologram = true;\n result.sourceHolon = hologram.target.holonId;\n\n console.info(`🗑️ Deleting hologram:`);\n console.info(` Path: ${path}`);\n console.info(` Data ID: ${dataId}`);\n console.info(` From holon: ${holonId}`);\n console.info(` Source holon: ${hologram.target.holonId}`);\n console.info(` Lens: ${lensName}`);\n\n // Remove from source's activeHolograms list\n const removed = await removeActiveHologram(\n client,\n hologram.target.appname || appname,\n hologram.target.holonId,\n hologram.target.lensName || lensName,\n hologram.target.dataId || dataId,\n holonId\n );\n\n result.activeHologramsUpdated = removed;\n\n if (removed) {\n console.info(` ✓ Removed from activeHolograms on source`);\n } else {\n console.warn(` ⚠️ Could not update activeHolograms on source (may already be removed)`);\n }\n } else {\n console.info(`🗑️ Deleting non-hologram data at ${path}`);\n }\n\n // Delete the hologram data if requested\n if (deleteData) {\n // Write null to delete (or use a delete function if available)\n const deleted = await write(client, path, null);\n result.success = deleted;\n\n if (deleted) {\n console.info(` ✓ Hologram deleted successfully`);\n } else {\n console.warn(` ⚠️ Failed to delete hologram data`);\n result.error = 'Failed to delete hologram data';\n }\n } else {\n result.success = true;\n }\n\n return result;\n } catch (error) {\n console.error(`❌ Error deleting hologram at ${path}:`, error);\n result.error = error.message || 'Unknown error';\n return result;\n }\n}\n\n/**\n * Cleanup circular holograms in a holon's lens\n * This detects and removes holograms that create circular references (A→B→A)\n * Useful for cleaning up existing bad data created before circular reference prevention was added\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {string} holonId - Holon to clean up\n * @param {string} lensName - Lens name to check\n * @param {Object} options - Optional settings\n * @param {boolean} options.dryRun - If true, only report what would be deleted (default: false)\n * @returns {Promise<Object>} Result with cleanup info\n */\nexport async function cleanupCircularHolograms(client, appname, holonId, lensName, options = {}) {\n const { dryRun = false } = options;\n const result = {\n scanned: 0,\n circularFound: 0,\n deleted: 0,\n errors: [],\n details: []\n };\n\n console.info(`🧹 ${dryRun ? '[DRY RUN] ' : ''}Cleaning up circular holograms in ${holonId}/${lensName}...`);\n\n try {\n // Get all data in this lens\n const basePath = buildPath(appname, holonId, lensName);\n // We need to iterate through all items - this requires listing capability\n // For now, we'll rely on the caller to provide a list of IDs to check\n // or we can use a different approach\n\n // Alternative: Read the lens index if it exists\n const lensIndexPath = buildPath(appname, holonId, lensName, '_index');\n const lensIndex = await read(client, lensIndexPath);\n\n if (!lensIndex || !Array.isArray(lensIndex.items)) {\n console.warn(` No index found for ${holonId}/${lensName}, cannot scan for circular references`);\n console.info(` Tip: Provide specific IDs to check using cleanupCircularHologramsByIds()`);\n return result;\n }\n\n for (const itemId of lensIndex.items) {\n result.scanned++;\n const itemPath = buildPath(appname, holonId, lensName, itemId);\n const item = await read(client, itemPath);\n\n if (!item || item.hologram !== true || !item.target) {\n continue; // Not a hologram, skip\n }\n\n // This is a hologram - check if it creates a circular reference\n const sourceHolon = item.target.holonId;\n const sourceDataId = item.target.dataId || itemId;\n const sourceLens = item.target.lensName || lensName;\n\n // Read the source data\n const sourcePath = buildPath(item.target.appname || appname, sourceHolon, sourceLens, sourceDataId);\n const sourceData = await read(client, sourcePath);\n\n if (sourceData && sourceData.hologram === true && sourceData.target) {\n // Source is also a hologram - check if it points back\n if (sourceData.target.holonId === holonId) {\n result.circularFound++;\n const detail = {\n itemId,\n path: itemPath,\n pointsTo: `${sourceHolon}/${sourceLens}/${sourceDataId}`,\n circularWith: `${sourceData.target.holonId}/${sourceData.target.lensName}/${sourceData.target.dataId}`\n };\n result.details.push(detail);\n\n console.warn(` 🔄 Found circular hologram:`);\n console.warn(` ${holonId}/${lensName}/${itemId} → ${sourceHolon}/${sourceLens}/${sourceDataId} → ${holonId}`);\n\n if (!dryRun) {\n // Delete this hologram\n const deleteResult = await deleteHologram(client, appname, holonId, lensName, itemId);\n if (deleteResult.success) {\n result.deleted++;\n console.info(` ✓ Deleted circular hologram`);\n } else {\n result.errors.push({ itemId, error: deleteResult.error });\n console.error(` ❌ Failed to delete: ${deleteResult.error}`);\n }\n }\n }\n }\n }\n\n console.info(`🧹 Cleanup complete for ${holonId}/${lensName}:`);\n console.info(` Scanned: ${result.scanned}`);\n console.info(` Circular found: ${result.circularFound}`);\n console.info(` Deleted: ${result.deleted}`);\n if (result.errors.length > 0) {\n console.warn(` Errors: ${result.errors.length}`);\n }\n\n return result;\n } catch (error) {\n console.error(`❌ Error during cleanup:`, error);\n result.errors.push({ error: error.message });\n return result;\n }\n}\n\n/**\n * Cleanup circular holograms for a specific list of IDs\n * Use this when you don't have an index but know which IDs to check\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {string} holonId - Holon to clean up\n * @param {string} lensName - Lens name\n * @param {string[]} dataIds - Array of data IDs to check\n * @param {Object} options - Optional settings\n * @param {boolean} options.dryRun - If true, only report what would be deleted\n * @returns {Promise<Object>} Result with cleanup info\n */\nexport async function cleanupCircularHologramsByIds(client, appname, holonId, lensName, dataIds, options = {}) {\n const { dryRun = false } = options;\n const result = {\n scanned: 0,\n circularFound: 0,\n deleted: 0,\n errors: [],\n details: []\n };\n\n console.info(`🧹 ${dryRun ? '[DRY RUN] ' : ''}Cleaning up circular holograms for ${dataIds.length} IDs in ${holonId}/${lensName}...`);\n\n for (const itemId of dataIds) {\n result.scanned++;\n const itemPath = buildPath(appname, holonId, lensName, itemId);\n const item = await read(client, itemPath);\n\n if (!item || item.hologram !== true || !item.target) {\n continue; // Not a hologram, skip\n }\n\n // This is a hologram - check if it creates a circular reference\n const sourceHolon = item.target.holonId;\n const sourceDataId = item.target.dataId || itemId;\n const sourceLens = item.target.lensName || lensName;\n\n // Read the source data\n const sourcePath = buildPath(item.target.appname || appname, sourceHolon, sourceLens, sourceDataId);\n const sourceData = await read(client, sourcePath);\n\n if (sourceData && sourceData.hologram === true && sourceData.target) {\n // Source is also a hologram - check if it points back\n if (sourceData.target.holonId === holonId) {\n result.circularFound++;\n const detail = {\n itemId,\n path: itemPath,\n pointsTo: `${sourceHolon}/${sourceLens}/${sourceDataId}`,\n circularWith: `${sourceData.target.holonId}/${sourceData.target.lensName}/${sourceData.target.dataId}`\n };\n result.details.push(detail);\n\n console.warn(` 🔄 Found circular hologram: ${itemId}`);\n console.warn(` Chain: ${holonId} → ${sourceHolon} → ${holonId}`);\n\n if (!dryRun) {\n // Delete this hologram\n const deleteResult = await deleteHologram(client, appname, holonId, lensName, itemId);\n if (deleteResult.success) {\n result.deleted++;\n console.info(` ✓ Deleted`);\n } else {\n result.errors.push({ itemId, error: deleteResult.error });\n console.error(` ❌ Failed: ${deleteResult.error}`);\n }\n }\n }\n }\n }\n\n console.info(`🧹 Cleanup complete: scanned=${result.scanned}, circular=${result.circularFound}, deleted=${result.deleted}`);\n return result;\n}\n","/**\n * Nostr Utility Functions\n *\n * Provides browser-compatible utilities for Nostr key handling and NIP-04 encryption.\n * Apps can use these without directly importing nostr-tools.\n */\n\nimport { nip04, nip19, getPublicKey as nostrGetPublicKey, finalizeEvent, verifyEvent as nostrVerifyEvent } from 'nostr-tools';\n\n// ============================================================================\n// Key Conversion Utilities\n// ============================================================================\n\n/**\n * Convert hex string to Uint8Array\n * @param {string} hex - Hex string\n * @returns {Uint8Array} Byte array\n */\nexport function hexToBytes(hex) {\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n bytes[i / 2] = parseInt(hex.substr(i, 2), 16);\n }\n return bytes;\n}\n\n/**\n * Convert Uint8Array to hex string\n * @param {Uint8Array} bytes - Byte array\n * @returns {string} Hex string\n */\nexport function bytesToHex(bytes) {\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * Parse an npub or hex public key string into hex format\n * @param {string} input - npub (npub1...) or hex public key\n * @returns {{ valid: boolean, hexPubKey?: string, error?: string }}\n */\nexport function parseNpubOrHex(input) {\n const trimmed = input?.trim();\n\n if (!trimmed) {\n return { valid: false, error: 'Public key is required' };\n }\n\n // Check if it's already hex (64 characters)\n if (/^[0-9a-fA-F]{64}$/.test(trimmed)) {\n return { valid: true, hexPubKey: trimmed.toLowerCase() };\n }\n\n // Handle nostr: URI prefix\n let npubString = trimmed;\n if (npubString.startsWith('nostr:')) {\n npubString = npubString.slice(6);\n }\n\n // Try to decode as npub\n if (npubString.startsWith('npub1')) {\n try {\n const decoded = nip19.decode(npubString);\n if (decoded.type === 'npub') {\n return { valid: true, hexPubKey: decoded.data };\n }\n return { valid: false, error: 'Invalid npub format' };\n } catch (e) {\n return { valid: false, error: 'Invalid npub: unable to decode' };\n }\n }\n\n return { valid: false, error: 'Enter a valid npub (npub1...) or 64-character hex public key' };\n}\n\n/**\n * Convert a hex public key to npub format\n * @param {string} hexPubKey - Hex public key (64 chars)\n * @returns {string} npub string\n */\nexport function hexToNpub(hexPubKey) {\n try {\n return nip19.npubEncode(hexPubKey);\n } catch (e) {\n console.error('Failed to encode hex to npub:', e);\n return hexPubKey; // Return original on error\n }\n}\n\n/**\n * Convert npub to hex public key\n * @param {string} npub - npub string\n * @returns {string|null} Hex public key or null if invalid\n */\nexport function npubToHex(npub) {\n try {\n const decoded = nip19.decode(npub);\n if (decoded.type === 'npub') {\n return decoded.data;\n }\n return null;\n } catch (e) {\n return null;\n }\n}\n\n/**\n * Shorten a public key for display (first 8 and last 8 chars)\n * @param {string} pubKey - Public key (hex or npub)\n * @returns {string} Shortened key\n */\nexport function shortenPubKey(pubKey) {\n if (!pubKey || pubKey.length <= 20) return pubKey || '';\n return `${pubKey.slice(0, 8)}...${pubKey.slice(-8)}`;\n}\n\n/**\n * Shorten an npub for display\n * @param {string} npub - npub string\n * @returns {string} Shortened npub\n */\nexport function shortenNpub(npub) {\n if (!npub || npub.length <= 20) return npub || '';\n return `${npub.slice(0, 12)}...${npub.slice(-8)}`;\n}\n\n/**\n * Get public key from private key (matches nostr-tools API)\n * @param {string} privateKey - Hex private key\n * @returns {string} Hex public key\n */\nexport function getPublicKey(privateKey) {\n return nostrGetPublicKey(hexToBytes(privateKey));\n}\n\n// ============================================================================\n// NIP-04 Encryption\n// ============================================================================\n\n/**\n * Encrypt a message using NIP-04 (for DMs)\n * @param {string} privateKey - Sender's hex private key\n * @param {string} recipientPubKey - Recipient's hex public key\n * @param {string} content - Plain text content\n * @returns {Promise<string>} Encrypted content\n */\nexport async function encryptNIP04(privateKey, recipientPubKey, content) {\n return await nip04.encrypt(privateKey, recipientPubKey, content);\n}\n\n/**\n * Decrypt a NIP-04 encrypted message\n * @param {string} privateKey - Recipient's hex private key\n * @param {string} senderPubKey - Sender's hex public key\n * @param {string} encryptedContent - Encrypted content\n * @returns {Promise<string>} Decrypted content\n */\nexport async function decryptNIP04(privateKey, senderPubKey, encryptedContent) {\n return await nip04.decrypt(privateKey, senderPubKey, encryptedContent);\n}\n\n// ============================================================================\n// Event Creation\n// ============================================================================\n\n/**\n * Create and sign a Nostr event\n * @param {number} kind - Event kind\n * @param {string} content - Event content\n * @param {string[][]} tags - Event tags\n * @param {string} privateKey - Hex private key for signing\n * @returns {Object} Signed Nostr event\n */\nexport function createSignedEvent(kind, content, tags, privateKey) {\n const event = {\n kind,\n content,\n tags,\n created_at: Math.floor(Date.now() / 1000),\n };\n\n return finalizeEvent(event, hexToBytes(privateKey));\n}\n\n/**\n * Create a NIP-04 encrypted DM event (kind 4)\n * @param {string} recipientPubKey - Recipient's hex public key\n * @param {string} encryptedContent - NIP-04 encrypted content\n * @param {string} privateKey - Sender's hex private key\n * @returns {Object} Signed DM event\n */\nexport function createDMEvent(recipientPubKey, encryptedContent, privateKey) {\n return createSignedEvent(\n 4, // NIP-04 encrypted DM\n encryptedContent,\n [['p', recipientPubKey]],\n privateKey\n );\n}\n\n// ============================================================================\n// Validation\n// ============================================================================\n\n/**\n * Check if a string is a valid hex public key\n * @param {string} str - String to check\n * @returns {boolean}\n */\nexport function isValidHexPubKey(str) {\n return typeof str === 'string' && /^[0-9a-fA-F]{64}$/.test(str);\n}\n\n/**\n * Check if a string is a valid npub\n * @param {string} str - String to check\n * @returns {boolean}\n */\nexport function isValidNpub(str) {\n if (typeof str !== 'string' || !str.startsWith('npub1')) {\n return false;\n }\n try {\n const decoded = nip19.decode(str);\n return decoded.type === 'npub';\n } catch {\n return false;\n }\n}\n\n/**\n * Generate a unique nonce\n * @returns {string} Unique nonce\n */\nexport function generateNonce() {\n return Date.now().toString(36) + Math.random().toString(36).substring(2, 15);\n}\n\n/**\n * Sign a Nostr event (alias for createSignedEvent that accepts event object)\n * @param {Object} event - Unsigned event object with kind, content, tags\n * @param {string} privateKey - Hex private key for signing\n * @returns {Object} Signed Nostr event\n */\nexport function signEvent(event, privateKey) {\n const eventToSign = {\n kind: event.kind,\n content: event.content,\n tags: event.tags || [],\n created_at: event.created_at || Math.floor(Date.now() / 1000),\n };\n return finalizeEvent(eventToSign, hexToBytes(privateKey));\n}\n\n/**\n * Verify a Nostr event signature\n * @param {Object} event - Signed Nostr event to verify\n * @returns {boolean} True if signature is valid\n */\nexport function verifyEvent(event) {\n return nostrVerifyEvent(event);\n}\n","/**\n * Federation Handshake Protocol\n *\n * Uses NIP-04 encrypted DMs (kind 4) for bidirectional federation request/response.\n * When user A federates with user B's pubkey, a DM is sent to B.\n * B can accept/reject, creating a matching federation on their side.\n */\n\nimport {\n encryptNIP04,\n decryptNIP04,\n createDMEvent,\n hexToNpub,\n generateNonce,\n} from '../crypto/nostr-utils.js';\nimport { addFederatedPartner, storeInboundCapability } from './registry.js';\n\n// ============================================================================\n// Types (documented for reference)\n// ============================================================================\n\n/**\n * @typedef {Object} FederationRequestPayload\n * @property {'federation_request'} type\n * @property {'1.0'} version\n * @property {string} requestId - Unique request ID\n * @property {number} timestamp\n * @property {string} senderHolonId - Holon ID of the sender\n * @property {string} senderHolonName - Human-readable holon name\n * @property {string} senderNpub - Sender's npub\n * @property {Object} lensConfig - Lens configuration\n * @property {string[]} lensConfig.inbound - Lenses sender will accept\n * @property {string[]} lensConfig.outbound - Lenses sender will share\n * @property {Array} capabilities - Capability tokens\n * @property {string} [message] - Optional personal message\n */\n\n/**\n * @typedef {Object} FederationResponsePayload\n * @property {'federation_response'} type\n * @property {'1.0'} version\n * @property {string} requestId - References original request\n * @property {number} timestamp\n * @property {'accepted'|'rejected'} status\n * @property {string} [responderHolonId]\n * @property {string} [responderHolonName]\n * @property {string} [responderNpub]\n * @property {Object} [lensConfig]\n * @property {Array} [capabilities]\n * @property {string} [message]\n */\n\n// ============================================================================\n// Request/Response Creation\n// ============================================================================\n\n/**\n * Create a federation request payload\n * @param {Object} params\n * @param {string} params.senderHolonId\n * @param {string} params.senderHolonName\n * @param {string} params.senderPubKey - Hex public key\n * @param {Object} params.lensConfig - { inbound: string[], outbound: string[] }\n * @param {Array} [params.capabilities] - Capability tokens to include\n * @param {string} [params.message] - Optional message\n * @returns {FederationRequestPayload}\n */\nexport function createFederationRequest({\n senderHolonId,\n senderHolonName,\n senderPubKey,\n lensConfig = { inbound: [], outbound: [] },\n capabilities = [],\n message,\n}) {\n return {\n type: 'federation_request',\n version: '1.0',\n requestId: generateNonce(),\n timestamp: Date.now(),\n senderHolonId,\n senderHolonName,\n senderNpub: hexToNpub(senderPubKey),\n lensConfig,\n capabilities,\n message,\n };\n}\n\n/**\n * Create a federation response payload\n * @param {Object} params\n * @param {string} params.requestId - Original request ID\n * @param {'accepted'|'rejected'} params.status\n * @param {string} [params.responderHolonId]\n * @param {string} [params.responderHolonName]\n * @param {string} [params.responderPubKey] - Hex public key\n * @param {Object} [params.lensConfig]\n * @param {Array} [params.capabilities]\n * @param {string} [params.message]\n * @returns {FederationResponsePayload}\n */\nexport function createFederationResponse({\n requestId,\n status,\n responderHolonId,\n responderHolonName,\n responderPubKey,\n lensConfig,\n capabilities,\n message,\n}) {\n return {\n type: 'federation_response',\n version: '1.0',\n requestId,\n timestamp: Date.now(),\n status,\n responderHolonId,\n responderHolonName,\n responderNpub: responderPubKey ? hexToNpub(responderPubKey) : undefined,\n lensConfig,\n capabilities,\n message,\n };\n}\n\n// ============================================================================\n// DM Sending\n// ============================================================================\n\n/**\n * Send a federation request DM\n * @param {Object} client - NostrClient instance with publish method\n * @param {string} privateKey - Sender's hex private key\n * @param {string} recipientPubKey - Recipient's hex public key\n * @param {FederationRequestPayload} request - Request payload\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function sendFederationRequest(client, privateKey, recipientPubKey, request) {\n try {\n const content = JSON.stringify(request);\n const encrypted = await encryptNIP04(privateKey, recipientPubKey, content);\n const event = createDMEvent(recipientPubKey, encrypted, privateKey);\n\n if (client?.publish) {\n await client.publish(event);\n console.log('[Handshake] Federation request sent to:', recipientPubKey.substring(0, 8) + '...');\n return true;\n } else {\n console.error('[Handshake] No publish method on client');\n return false;\n }\n } catch (error) {\n console.error('[Handshake] Failed to send federation request:', error);\n return false;\n }\n}\n\n/**\n * Send a federation response DM\n * @param {Object} client - NostrClient instance with publish method\n * @param {string} privateKey - Sender's hex private key\n * @param {string} recipientPubKey - Recipient's hex public key\n * @param {FederationResponsePayload} response - Response payload\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function sendFederationResponse(client, privateKey, recipientPubKey, response) {\n try {\n const content = JSON.stringify(response);\n const encrypted = await encryptNIP04(privateKey, recipientPubKey, content);\n const event = createDMEvent(recipientPubKey, encrypted, privateKey);\n\n if (client?.publish) {\n await client.publish(event);\n console.log('[Handshake] Federation response sent to:', recipientPubKey.substring(0, 8) + '...');\n return true;\n } else {\n console.error('[Handshake] No publish method on client');\n return false;\n }\n } catch (error) {\n console.error('[Handshake] Failed to send federation response:', error);\n return false;\n }\n}\n\n// ============================================================================\n// DM Subscription\n// ============================================================================\n\n/**\n * Subscribe to incoming federation DMs\n * @param {Object} client - NostrClient instance with subscribe method\n * @param {string} privateKey - Recipient's hex private key\n * @param {string} publicKey - Recipient's hex public key\n * @param {Object} handlers\n * @param {Function} handlers.onRequest - Called with (request, senderPubKey)\n * @param {Function} handlers.onResponse - Called with (response, senderPubKey)\n * @returns {Function} Unsubscribe function\n */\nexport function subscribeToFederationDMs(client, privateKey, publicKey, handlers) {\n const { onRequest, onResponse } = handlers;\n let isActive = true;\n const processedEventIds = new Set();\n\n const handleEvent = async (event) => {\n if (!isActive) return;\n\n // Skip duplicates\n if (processedEventIds.has(event.id)) return;\n processedEventIds.add(event.id);\n\n // Only kind 4 (encrypted DM) events tagged to us\n if (event.kind !== 4) return;\n\n const pTag = event.tags?.find((t) => t[0] === 'p');\n if (!pTag || pTag[1] !== publicKey) return;\n\n try {\n const decrypted = await decryptNIP04(privateKey, event.pubkey, event.content);\n const payload = JSON.parse(decrypted);\n\n if (payload.type === 'federation_request' && payload.version === '1.0') {\n console.log('[Handshake] Received federation request from:', event.pubkey.substring(0, 8) + '...');\n onRequest?.(payload, event.pubkey);\n } else if (payload.type === 'federation_response' && payload.version === '1.0') {\n console.log('[Handshake] Received federation response from:', event.pubkey.substring(0, 8) + '...');\n onResponse?.(payload, event.pubkey);\n }\n } catch (error) {\n // Silently ignore non-federation DMs\n }\n };\n\n // Subscribe via client\n // Note: client is the HoloSphere instance, client.client is the NostrClient\n let subscription = null;\n\n const startSubscription = async () => {\n // Get the NostrClient from HoloSphere instance\n const nostrClient = client?.client;\n if (!nostrClient?.subscribe) {\n console.warn('[Handshake] No NostrClient subscribe method available');\n return;\n }\n\n const filter = {\n kinds: [4],\n '#p': [publicKey],\n since: Math.floor(Date.now() / 1000) - 86400, // Last 24 hours\n };\n\n try {\n // NostrClient.subscribe(filter, onEvent, options) returns { unsubscribe }\n subscription = await nostrClient.subscribe(filter, handleEvent, {});\n console.log('[Handshake] Federation DM subscription started');\n } catch (error) {\n console.error('[Handshake] Failed to subscribe:', error);\n }\n };\n\n startSubscription();\n\n // Return unsubscribe function\n return () => {\n isActive = false;\n if (subscription?.unsubscribe) {\n subscription.unsubscribe();\n } else if (subscription?.close) {\n subscription.close();\n }\n };\n}\n\n// ============================================================================\n// High-Level Handshake Operations\n// ============================================================================\n\n/**\n * Initiate a federation handshake with a partner\n * Creates local federation record and sends DM to partner\n * @param {Object} holosphere - HoloSphere instance\n * @param {string} privateKey - Sender's hex private key\n * @param {Object} params\n * @param {string} params.partnerPubKey - Partner's hex public key\n * @param {string} params.holonId - Current holon ID\n * @param {string} params.holonName - Current holon name\n * @param {Object} [params.lensConfig] - Lens configuration\n * @param {string} [params.message] - Optional message\n * @returns {Promise<{ success: boolean, requestId?: string, error?: string }>}\n */\nexport async function initiateFederationHandshake(holosphere, privateKey, params) {\n const {\n partnerPubKey,\n holonId,\n holonName,\n lensConfig = { inbound: [], outbound: [] },\n message,\n } = params;\n\n try {\n // Get sender's public key\n const { getPublicKey } = await import('../crypto/nostr-utils.js');\n const senderPubKey = getPublicKey(privateKey);\n\n // Create federation request\n const request = createFederationRequest({\n senderHolonId: holonId,\n senderHolonName: holonName,\n senderPubKey,\n lensConfig,\n capabilities: [],\n message,\n });\n\n // Add partner to local registry (status: pending)\n if (holosphere.client) {\n await addFederatedPartner(holosphere.client, holosphere.config.appName, partnerPubKey, {\n alias: null,\n addedVia: 'handshake_initiated',\n });\n }\n\n // Send DM to partner\n const sent = await sendFederationRequest(holosphere.client, privateKey, partnerPubKey, request);\n\n if (sent) {\n return { success: true, requestId: request.requestId };\n } else {\n return { success: false, error: 'Failed to send DM' };\n }\n } catch (error) {\n return { success: false, error: error.message };\n }\n}\n\n/**\n * Accept a federation request\n * Creates local federation record and sends acceptance DM\n * @param {Object} holosphere - HoloSphere instance\n * @param {string} privateKey - Responder's hex private key\n * @param {Object} params\n * @param {FederationRequestPayload} params.request - Original request\n * @param {string} params.senderPubKey - Original sender's public key\n * @param {string} params.holonId - Current holon ID\n * @param {string} params.holonName - Current holon name\n * @param {Object} [params.lensConfig] - Our lens configuration\n * @param {string} [params.message] - Optional message\n * @returns {Promise<{ success: boolean, error?: string }>}\n */\nexport async function acceptFederationRequest(holosphere, privateKey, params) {\n const {\n request,\n senderPubKey,\n holonId,\n holonName,\n lensConfig = { inbound: [], outbound: [] },\n message,\n } = params;\n\n try {\n // Get responder's public key\n const { getPublicKey } = await import('../crypto/nostr-utils.js');\n const responderPubKey = getPublicKey(privateKey);\n\n // Add sender as federated partner in Nostr registry\n if (holosphere.client) {\n await addFederatedPartner(holosphere.client, holosphere.config.appName, senderPubKey, {\n alias: request.senderHolonName,\n addedVia: 'handshake_accepted',\n });\n\n // Store any capabilities they sent\n if (request.capabilities && request.capabilities.length > 0) {\n for (const cap of request.capabilities) {\n await storeInboundCapability(holosphere.client, holosphere.config.appName, senderPubKey, cap);\n }\n }\n }\n\n // Create the actual federation record in GunDB storage\n // This is what makes the partner appear in getFederation() / loadFederationData()\n // Store the sender's name so we can display it without reading their settings\n await holosphere.federateHolon(holonId, senderPubKey, {\n lensConfig,\n partnerName: request.senderHolonName\n });\n\n // Create and send response\n const response = createFederationResponse({\n requestId: request.requestId,\n status: 'accepted',\n responderHolonId: holonId,\n responderHolonName: holonName,\n responderPubKey,\n lensConfig,\n capabilities: [],\n message,\n });\n\n const sent = await sendFederationResponse(holosphere.client, privateKey, senderPubKey, response);\n\n if (sent) {\n return { success: true };\n } else {\n return { success: false, error: 'Failed to send response DM' };\n }\n } catch (error) {\n return { success: false, error: error.message };\n }\n}\n\n/**\n * Reject a federation request\n * Sends rejection DM without creating local federation\n * @param {Object} holosphere - HoloSphere instance\n * @param {string} privateKey - Responder's hex private key\n * @param {Object} params\n * @param {string} params.requestId - Original request ID\n * @param {string} params.senderPubKey - Original sender's public key\n * @param {string} [params.message] - Optional rejection message\n * @returns {Promise<{ success: boolean, error?: string }>}\n */\nexport async function rejectFederationRequest(holosphere, privateKey, params) {\n const { requestId, senderPubKey, message } = params;\n\n try {\n const response = createFederationResponse({\n requestId,\n status: 'rejected',\n message,\n });\n\n const sent = await sendFederationResponse(holosphere.client, privateKey, senderPubKey, response);\n\n return { success: sent, error: sent ? undefined : 'Failed to send response DM' };\n } catch (error) {\n return { success: false, error: error.message };\n }\n}\n\n// ============================================================================\n// Payload Validation\n// ============================================================================\n\n/**\n * Check if payload is a federation request\n * @param {any} payload\n * @returns {payload is FederationRequestPayload}\n */\nexport function isFederationRequest(payload) {\n return payload?.type === 'federation_request' && payload?.version === '1.0';\n}\n\n/**\n * Check if payload is a federation response\n * @param {any} payload\n * @returns {payload is FederationResponsePayload}\n */\nexport function isFederationResponse(payload) {\n return payload?.type === 'federation_response' && payload?.version === '1.0';\n}\n","/**\n * Social Protocol Adapters (Nostr, ActivityPub)\n */\n\n// Import ValidationError from the validator module\nimport { ValidationError } from '../schema/validator.js';\n\n/**\n * Validate Nostr NIP-01 event format\n * @param {Object} event - Nostr event\n * @param {boolean} partial - Allow partial events (missing id, pubkey, sig)\n * @returns {boolean} True if valid\n * @throws {ValidationError} If strict validation fails\n */\nexport function validateNostrEvent(event, partial = true, throwOnError = false) {\n if (!event || typeof event !== 'object') {\n if (throwOnError) throw new ValidationError('ValidationError: Invalid Nostr event format');\n return false;\n }\n\n // Required fields always\n if (typeof event.kind !== 'number') {\n if (throwOnError) throw new ValidationError('ValidationError: Invalid Nostr event format - kind must be a number');\n return false;\n }\n if (!Array.isArray(event.tags)) {\n if (throwOnError) throw new ValidationError('ValidationError: Invalid Nostr event format - tags must be an array');\n return false;\n }\n if (typeof event.content !== 'string') {\n if (throwOnError) throw new ValidationError('ValidationError: Invalid Nostr event format - content must be a string');\n return false;\n }\n if (typeof event.created_at !== 'number') {\n if (throwOnError) throw new ValidationError('ValidationError: Invalid Nostr event format - created_at must be a number');\n return false;\n }\n\n // Optional for partial events (will be added by system)\n if (!partial) {\n if (typeof event.id !== 'string') {\n if (throwOnError) throw new ValidationError('ValidationError: Invalid Nostr event format - id must be a string');\n return false;\n }\n if (typeof event.pubkey !== 'string') {\n if (throwOnError) throw new ValidationError('ValidationError: Invalid Nostr event format - pubkey must be a string');\n return false;\n }\n if (typeof event.sig !== 'string') {\n if (throwOnError) throw new ValidationError('ValidationError: Invalid Nostr event format - sig must be a string');\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Validate ActivityPub object format\n * @param {Object} object - ActivityPub object\n * @param {boolean} throwOnError - Throw ValidationError on failure\n * @param {boolean} requireId - Require id field (default: false, will be auto-generated)\n * @returns {boolean} True if valid\n * @throws {ValidationError} If strict validation fails\n */\nexport function validateActivityPubObject(object, throwOnError = false, requireId = false) {\n if (!object || typeof object !== 'object') {\n if (throwOnError) throw new ValidationError('ValidationError: Invalid ActivityPub object format');\n return false;\n }\n if (!object['@context']) {\n if (throwOnError) throw new ValidationError('ValidationError: Invalid ActivityPub object format - @context is required');\n return false;\n }\n if (typeof object.type !== 'string') {\n if (throwOnError) throw new ValidationError('ValidationError: Invalid ActivityPub object format - type must be a string');\n return false;\n }\n // ID is optional - will be auto-generated if not provided\n if (requireId && typeof object.id !== 'string') {\n if (throwOnError) throw new ValidationError('ValidationError: Invalid ActivityPub object format - id must be a string');\n return false;\n }\n return true;\n}\n\n/**\n * Transform Nostr event to HoloSphere format\n * @param {Object} event - Nostr event\n * @returns {Object} HoloSphere data object\n */\nexport function transformNostrEvent(event) {\n // Generate missing fields if needed\n const id = event.id || `nostr-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n const pubkey = event.pubkey || 'anonymous';\n const sig = event.sig || '';\n\n return {\n id,\n protocol: 'nostr',\n originalFormat: 'nip-01',\n pubkey,\n sig, // Keep original field name for compatibility\n created_at: event.created_at,\n kind: event.kind,\n // Gun doesn't support arrays, so serialize as JSON string\n tags: JSON.stringify(event.tags),\n content: event.content,\n signature: sig, // Also include as signature for clarity\n _meta: {\n timestamp: event.created_at * 1000,\n protocol: 'nostr',\n },\n };\n}\n\n/**\n * Transform ActivityPub object to HoloSphere format\n * @param {Object} object - ActivityPub object\n * @returns {Object} HoloSphere data object\n */\nexport function transformActivityPubObject(object) {\n // Generate ID if not provided\n const id = object.id || `ap-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n\n return {\n id,\n protocol: 'activitypub',\n type: object.type,\n actor: object.actor,\n published: object.published,\n content: object.content || object.name,\n originalObject: { ...object, id }, // Add generated ID to original object\n _meta: {\n timestamp: object.published ? new Date(object.published).getTime() : Date.now(),\n protocol: 'activitypub',\n },\n };\n}\n\n/**\n * Filter social content by access level\n * @param {Object[]} content - Social content array\n * @param {string} accessLevel - Access level filter\n * @returns {Object[]} Filtered content\n */\nexport function filterByAccessLevel(content, accessLevel) {\n if (!accessLevel) return content;\n\n return content.filter((item) => {\n return !item.accessLevel || item.accessLevel === accessLevel;\n });\n}\n\n/**\n * Filter social content by protocol\n * @param {Object[]} content - Social content array\n * @param {string} protocol - Protocol filter ('nostr' or 'activitypub')\n * @returns {Object[]} Filtered content\n */\nexport function filterByProtocol(content, protocol) {\n if (!protocol || protocol === 'all') return content;\n if (!Array.isArray(content)) return [];\n\n return content.filter((item) => {\n return item.protocol === protocol;\n });\n}\n","/**\n * Real-time Subscription Management\n */\n\nimport { subscribe } from '../storage/unified-storage.js';\nimport { resolveHologram } from '../federation/hologram.js';\n\n/**\n * Create subscription with throttle and filter\n * @param {Object} client - Nostr client instance\n * @param {string} path - Path to subscribe to\n * @param {Function} callback - Callback function\n * @param {Object} options - Subscription options\n * @param {number} options.throttle - Throttle interval in ms\n * @param {Function} options.filter - Filter predicate\n * @param {boolean} options.includeFederated - Include federated data\n * @param {boolean} options.triggerInitial - Trigger callback with initial data (default: false)\n * @param {boolean} options.resolveHolograms - Resolve holograms before callback (default: true)\n * @returns {Object} Subscription object with unsubscribe method\n */\nexport async function createSubscription(client, path, callback, options = {}) {\n const { throttle = 0, filter = null, includeFederated = false, triggerInitial = false, realtimeOnly = true, resolveHolograms = true } = options;\n\n let lastInvoke = 0;\n let timeoutId = null;\n const seenKeys = new Set();\n let isActive = true; // Track active state\n\n const wrappedCallback = async (data, key) => {\n // Check if subscription is still active\n if (!isActive) {\n return;\n }\n\n // Skip if already seen (prevent duplicates)\n // Include timestamp in unique key to allow updates to same item\n const uniqueKey = `${key}-${data?.id || ''}-${data?._meta?.timestamp || Date.now()}`;\n if (seenKeys.has(uniqueKey)) {\n return;\n }\n seenKeys.add(uniqueKey);\n\n // Resolve holograms if enabled and data is a hologram\n let resolvedData = data;\n if (resolveHolograms && data && data.hologram === true) {\n try {\n resolvedData = await resolveHologram(client, data);\n // If resolution failed, skip this item (source data may not exist yet)\n if (!resolvedData) {\n return;\n }\n } catch (err) {\n console.warn('Failed to resolve hologram in subscription:', err);\n return;\n }\n }\n\n // Apply filter (on resolved data)\n if (filter && !filter(resolvedData, key)) {\n return;\n }\n\n // Apply throttle\n const now = Date.now();\n if (throttle > 0) {\n if (now - lastInvoke < throttle) {\n // Clear existing timeout\n if (timeoutId) clearTimeout(timeoutId);\n\n // Schedule callback\n timeoutId = setTimeout(() => {\n lastInvoke = Date.now();\n callback(resolvedData, key);\n }, throttle - (now - lastInvoke));\n return;\n }\n }\n\n lastInvoke = now;\n callback(resolvedData, key);\n };\n\n // Subscribe using Nostr wrapper\n const subscription = await subscribe(client, path, wrappedCallback, { realtimeOnly });\n\n // Return subscription object\n return {\n path,\n unsubscribe: () => {\n isActive = false; // Mark as inactive immediately\n if (timeoutId) clearTimeout(timeoutId);\n if (subscription && subscription.unsubscribe) {\n subscription.unsubscribe();\n }\n seenKeys.clear();\n },\n };\n}\n\n/**\n * Subscription registry for tracking active subscriptions\n */\nexport class SubscriptionRegistry {\n constructor() {\n this.subscriptions = new Map();\n }\n\n /**\n * Register a subscription\n */\n register(id, subscription) {\n this.subscriptions.set(id, subscription);\n }\n\n /**\n * Unregister a subscription\n */\n unregister(id) {\n const subscription = this.subscriptions.get(id);\n if (subscription) {\n subscription.unsubscribe();\n this.subscriptions.delete(id);\n }\n }\n\n /**\n * Unsubscribe all\n */\n unsubscribeAll() {\n for (const [id, subscription] of this.subscriptions) {\n subscription.unsubscribe();\n }\n this.subscriptions.clear();\n }\n\n /**\n * Get active subscription count\n */\n count() {\n return this.subscriptions.size;\n }\n}\n","/**\n * Hierarchical Aggregation (Upcast Operations)\n * FR-025 to FR-027\n */\n\nimport { getParents, isValidH3 } from '../spatial/h3-operations.js';\nimport { createHologram } from '../federation/hologram.js';\nimport { write } from '../storage/unified-storage.js';\n\n/**\n * Upcast data to parent holons in hierarchy\n * @param {Object} hs - HoloSphere instance\n * @param {string} holonId - Source holon ID (must be H3)\n * @param {string} lensName - Lens name\n * @param {string} dataId - Data ID\n * @param {Object} options - Upcast options\n * @param {number} options.maxLevel - Maximum levels to propagate (default: 3)\n * @param {string} options.operation - 'summarize', 'aggregate', or 'concatenate'\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function upcast(hs, holonId, lensName, dataId, options = {}) {\n const { maxLevel = 3, operation = 'concatenate' } = options;\n const client = hs.client;\n const appname = hs.config.appName;\n\n // Validate H3 format\n if (!isValidH3(holonId)) {\n throw new Error('Upcast only supported for geographic (H3) holons, not noospheric holons');\n }\n\n // Get parent holons\n const parents = getParents(holonId);\n const targetParents = parents.slice(0, maxLevel);\n\n if (targetParents.length === 0) {\n return true; // Already at root\n }\n\n // Create holograms in parent holons\n const promises = targetParents.map(async (parentHolon) => {\n return propagateToParent(client, appname, holonId, parentHolon, lensName, dataId, operation);\n });\n\n await Promise.all(promises);\n return true;\n}\n\n/**\n * Propagate data to parent holon\n * @private\n */\nasync function propagateToParent(\n client,\n appname,\n sourceHolon,\n parentHolon,\n lensName,\n dataId,\n operation\n) {\n // Create hologram reference\n const hologram = createHologram(sourceHolon, parentHolon, lensName, dataId, appname);\n\n // Add operation metadata\n hologram._meta.operation = operation;\n hologram._meta.upcast = true;\n\n // Write to parent holon\n const path = `${appname}/${parentHolon}/${lensName}/${dataId}`;\n return write(client, path, hologram);\n}\n\n/**\n * Summarize operation (count aggregation)\n * @param {Object[]} items - Data items\n * @returns {Object} Summary object\n */\nexport function summarize(items) {\n return {\n operation: 'summarize',\n count: items.length,\n summary: true,\n };\n}\n\n/**\n * Aggregate operation (merge objects)\n * @param {Object[]} items - Data items\n * @returns {Object} Aggregated object\n */\nexport function aggregate(items) {\n const result = { operation: 'aggregate' };\n\n for (const item of items) {\n Object.assign(result, item);\n }\n\n return result;\n}\n\n/**\n * Concatenate operation (array merge)\n * @param {Array[]} items - Array items\n * @returns {Array} Concatenated array\n */\nexport function concatenate(items) {\n return {\n operation: 'concatenate',\n items: items.flat(),\n };\n}\n","export const default_format = 'RFC3986';\nexport const formatters = {\n RFC1738: (v) => String(v).replace(/%20/g, '+'),\n RFC3986: (v) => String(v),\n};\nexport const RFC1738 = 'RFC1738';\nexport const RFC3986 = 'RFC3986';\n//# sourceMappingURL=formats.mjs.map","import { RFC1738 } from \"./formats.mjs\";\nconst has = Object.prototype.hasOwnProperty;\nconst is_array = Array.isArray;\nconst hex_table = (() => {\n const array = [];\n for (let i = 0; i < 256; ++i) {\n array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase());\n }\n return array;\n})();\nfunction compact_queue(queue) {\n while (queue.length > 1) {\n const item = queue.pop();\n if (!item)\n continue;\n const obj = item.obj[item.prop];\n if (is_array(obj)) {\n const compacted = [];\n for (let j = 0; j < obj.length; ++j) {\n if (typeof obj[j] !== 'undefined') {\n compacted.push(obj[j]);\n }\n }\n // @ts-ignore\n item.obj[item.prop] = compacted;\n }\n }\n}\nfunction array_to_object(source, options) {\n const obj = options && options.plainObjects ? Object.create(null) : {};\n for (let i = 0; i < source.length; ++i) {\n if (typeof source[i] !== 'undefined') {\n obj[i] = source[i];\n }\n }\n return obj;\n}\nexport function merge(target, source, options = {}) {\n if (!source) {\n return target;\n }\n if (typeof source !== 'object') {\n if (is_array(target)) {\n target.push(source);\n }\n else if (target && typeof target === 'object') {\n if ((options && (options.plainObjects || options.allowPrototypes)) ||\n !has.call(Object.prototype, source)) {\n target[source] = true;\n }\n }\n else {\n return [target, source];\n }\n return target;\n }\n if (!target || typeof target !== 'object') {\n return [target].concat(source);\n }\n let mergeTarget = target;\n if (is_array(target) && !is_array(source)) {\n // @ts-ignore\n mergeTarget = array_to_object(target, options);\n }\n if (is_array(target) && is_array(source)) {\n source.forEach(function (item, i) {\n if (has.call(target, i)) {\n const targetItem = target[i];\n if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') {\n target[i] = merge(targetItem, item, options);\n }\n else {\n target.push(item);\n }\n }\n else {\n target[i] = item;\n }\n });\n return target;\n }\n return Object.keys(source).reduce(function (acc, key) {\n const value = source[key];\n if (has.call(acc, key)) {\n acc[key] = merge(acc[key], value, options);\n }\n else {\n acc[key] = value;\n }\n return acc;\n }, mergeTarget);\n}\nexport function assign_single_source(target, source) {\n return Object.keys(source).reduce(function (acc, key) {\n acc[key] = source[key];\n return acc;\n }, target);\n}\nexport function decode(str, _, charset) {\n const strWithoutPlus = str.replace(/\\+/g, ' ');\n if (charset === 'iso-8859-1') {\n // unescape never throws, no try...catch needed:\n return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape);\n }\n // utf-8\n try {\n return decodeURIComponent(strWithoutPlus);\n }\n catch (e) {\n return strWithoutPlus;\n }\n}\nconst limit = 1024;\nexport const encode = (str, _defaultEncoder, charset, _kind, format) => {\n // This code was originally written by Brian White for the io.js core querystring library.\n // It has been adapted here for stricter adherence to RFC 3986\n if (str.length === 0) {\n return str;\n }\n let string = str;\n if (typeof str === 'symbol') {\n string = Symbol.prototype.toString.call(str);\n }\n else if (typeof str !== 'string') {\n string = String(str);\n }\n if (charset === 'iso-8859-1') {\n return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) {\n return '%26%23' + parseInt($0.slice(2), 16) + '%3B';\n });\n }\n let out = '';\n for (let j = 0; j < string.length; j += limit) {\n const segment = string.length >= limit ? string.slice(j, j + limit) : string;\n const arr = [];\n for (let i = 0; i < segment.length; ++i) {\n let c = segment.charCodeAt(i);\n if (c === 0x2d || // -\n c === 0x2e || // .\n c === 0x5f || // _\n c === 0x7e || // ~\n (c >= 0x30 && c <= 0x39) || // 0-9\n (c >= 0x41 && c <= 0x5a) || // a-z\n (c >= 0x61 && c <= 0x7a) || // A-Z\n (format === RFC1738 && (c === 0x28 || c === 0x29)) // ( )\n ) {\n arr[arr.length] = segment.charAt(i);\n continue;\n }\n if (c < 0x80) {\n arr[arr.length] = hex_table[c];\n continue;\n }\n if (c < 0x800) {\n arr[arr.length] = hex_table[0xc0 | (c >> 6)] + hex_table[0x80 | (c & 0x3f)];\n continue;\n }\n if (c < 0xd800 || c >= 0xe000) {\n arr[arr.length] =\n hex_table[0xe0 | (c >> 12)] + hex_table[0x80 | ((c >> 6) & 0x3f)] + hex_table[0x80 | (c & 0x3f)];\n continue;\n }\n i += 1;\n c = 0x10000 + (((c & 0x3ff) << 10) | (segment.charCodeAt(i) & 0x3ff));\n arr[arr.length] =\n hex_table[0xf0 | (c >> 18)] +\n hex_table[0x80 | ((c >> 12) & 0x3f)] +\n hex_table[0x80 | ((c >> 6) & 0x3f)] +\n hex_table[0x80 | (c & 0x3f)];\n }\n out += arr.join('');\n }\n return out;\n};\nexport function compact(value) {\n const queue = [{ obj: { o: value }, prop: 'o' }];\n const refs = [];\n for (let i = 0; i < queue.length; ++i) {\n const item = queue[i];\n // @ts-ignore\n const obj = item.obj[item.prop];\n const keys = Object.keys(obj);\n for (let j = 0; j < keys.length; ++j) {\n const key = keys[j];\n const val = obj[key];\n if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {\n queue.push({ obj: obj, prop: key });\n refs.push(val);\n }\n }\n }\n compact_queue(queue);\n return value;\n}\nexport function is_regexp(obj) {\n return Object.prototype.toString.call(obj) === '[object RegExp]';\n}\nexport function is_buffer(obj) {\n if (!obj || typeof obj !== 'object') {\n return false;\n }\n return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));\n}\nexport function combine(a, b) {\n return [].concat(a, b);\n}\nexport function maybe_map(val, fn) {\n if (is_array(val)) {\n const mapped = [];\n for (let i = 0; i < val.length; i += 1) {\n mapped.push(fn(val[i]));\n }\n return mapped;\n }\n return fn(val);\n}\n//# sourceMappingURL=utils.mjs.map","import { encode, is_buffer, maybe_map } from \"./utils.mjs\";\nimport { default_format, formatters } from \"./formats.mjs\";\nconst has = Object.prototype.hasOwnProperty;\nconst array_prefix_generators = {\n brackets(prefix) {\n return String(prefix) + '[]';\n },\n comma: 'comma',\n indices(prefix, key) {\n return String(prefix) + '[' + key + ']';\n },\n repeat(prefix) {\n return String(prefix);\n },\n};\nconst is_array = Array.isArray;\nconst push = Array.prototype.push;\nconst push_to_array = function (arr, value_or_array) {\n push.apply(arr, is_array(value_or_array) ? value_or_array : [value_or_array]);\n};\nconst to_ISO = Date.prototype.toISOString;\nconst defaults = {\n addQueryPrefix: false,\n allowDots: false,\n allowEmptyArrays: false,\n arrayFormat: 'indices',\n charset: 'utf-8',\n charsetSentinel: false,\n delimiter: '&',\n encode: true,\n encodeDotInKeys: false,\n encoder: encode,\n encodeValuesOnly: false,\n format: default_format,\n formatter: formatters[default_format],\n /** @deprecated */\n indices: false,\n serializeDate(date) {\n return to_ISO.call(date);\n },\n skipNulls: false,\n strictNullHandling: false,\n};\nfunction is_non_nullish_primitive(v) {\n return (typeof v === 'string' ||\n typeof v === 'number' ||\n typeof v === 'boolean' ||\n typeof v === 'symbol' ||\n typeof v === 'bigint');\n}\nconst sentinel = {};\nfunction inner_stringify(object, prefix, generateArrayPrefix, commaRoundTrip, allowEmptyArrays, strictNullHandling, skipNulls, encodeDotInKeys, encoder, filter, sort, allowDots, serializeDate, format, formatter, encodeValuesOnly, charset, sideChannel) {\n let obj = object;\n let tmp_sc = sideChannel;\n let step = 0;\n let find_flag = false;\n while ((tmp_sc = tmp_sc.get(sentinel)) !== void undefined && !find_flag) {\n // Where object last appeared in the ref tree\n const pos = tmp_sc.get(object);\n step += 1;\n if (typeof pos !== 'undefined') {\n if (pos === step) {\n throw new RangeError('Cyclic object value');\n }\n else {\n find_flag = true; // Break while\n }\n }\n if (typeof tmp_sc.get(sentinel) === 'undefined') {\n step = 0;\n }\n }\n if (typeof filter === 'function') {\n obj = filter(prefix, obj);\n }\n else if (obj instanceof Date) {\n obj = serializeDate?.(obj);\n }\n else if (generateArrayPrefix === 'comma' && is_array(obj)) {\n obj = maybe_map(obj, function (value) {\n if (value instanceof Date) {\n return serializeDate?.(value);\n }\n return value;\n });\n }\n if (obj === null) {\n if (strictNullHandling) {\n return encoder && !encodeValuesOnly ?\n // @ts-expect-error\n encoder(prefix, defaults.encoder, charset, 'key', format)\n : prefix;\n }\n obj = '';\n }\n if (is_non_nullish_primitive(obj) || is_buffer(obj)) {\n if (encoder) {\n const key_value = encodeValuesOnly ? prefix\n // @ts-expect-error\n : encoder(prefix, defaults.encoder, charset, 'key', format);\n return [\n formatter?.(key_value) +\n '=' +\n // @ts-expect-error\n formatter?.(encoder(obj, defaults.encoder, charset, 'value', format)),\n ];\n }\n return [formatter?.(prefix) + '=' + formatter?.(String(obj))];\n }\n const values = [];\n if (typeof obj === 'undefined') {\n return values;\n }\n let obj_keys;\n if (generateArrayPrefix === 'comma' && is_array(obj)) {\n // we need to join elements in\n if (encodeValuesOnly && encoder) {\n // @ts-expect-error values only\n obj = maybe_map(obj, encoder);\n }\n obj_keys = [{ value: obj.length > 0 ? obj.join(',') || null : void undefined }];\n }\n else if (is_array(filter)) {\n obj_keys = filter;\n }\n else {\n const keys = Object.keys(obj);\n obj_keys = sort ? keys.sort(sort) : keys;\n }\n const encoded_prefix = encodeDotInKeys ? String(prefix).replace(/\\./g, '%2E') : String(prefix);\n const adjusted_prefix = commaRoundTrip && is_array(obj) && obj.length === 1 ? encoded_prefix + '[]' : encoded_prefix;\n if (allowEmptyArrays && is_array(obj) && obj.length === 0) {\n return adjusted_prefix + '[]';\n }\n for (let j = 0; j < obj_keys.length; ++j) {\n const key = obj_keys[j];\n const value = \n // @ts-ignore\n typeof key === 'object' && typeof key.value !== 'undefined' ? key.value : obj[key];\n if (skipNulls && value === null) {\n continue;\n }\n // @ts-ignore\n const encoded_key = allowDots && encodeDotInKeys ? key.replace(/\\./g, '%2E') : key;\n const key_prefix = is_array(obj) ?\n typeof generateArrayPrefix === 'function' ?\n generateArrayPrefix(adjusted_prefix, encoded_key)\n : adjusted_prefix\n : adjusted_prefix + (allowDots ? '.' + encoded_key : '[' + encoded_key + ']');\n sideChannel.set(object, step);\n const valueSideChannel = new WeakMap();\n valueSideChannel.set(sentinel, sideChannel);\n push_to_array(values, inner_stringify(value, key_prefix, generateArrayPrefix, commaRoundTrip, allowEmptyArrays, strictNullHandling, skipNulls, encodeDotInKeys, \n // @ts-ignore\n generateArrayPrefix === 'comma' && encodeValuesOnly && is_array(obj) ? null : encoder, filter, sort, allowDots, serializeDate, format, formatter, encodeValuesOnly, charset, valueSideChannel));\n }\n return values;\n}\nfunction normalize_stringify_options(opts = defaults) {\n if (typeof opts.allowEmptyArrays !== 'undefined' && typeof opts.allowEmptyArrays !== 'boolean') {\n throw new TypeError('`allowEmptyArrays` option can only be `true` or `false`, when provided');\n }\n if (typeof opts.encodeDotInKeys !== 'undefined' && typeof opts.encodeDotInKeys !== 'boolean') {\n throw new TypeError('`encodeDotInKeys` option can only be `true` or `false`, when provided');\n }\n if (opts.encoder !== null && typeof opts.encoder !== 'undefined' && typeof opts.encoder !== 'function') {\n throw new TypeError('Encoder has to be a function.');\n }\n const charset = opts.charset || defaults.charset;\n if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {\n throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');\n }\n let format = default_format;\n if (typeof opts.format !== 'undefined') {\n if (!has.call(formatters, opts.format)) {\n throw new TypeError('Unknown format option provided.');\n }\n format = opts.format;\n }\n const formatter = formatters[format];\n let filter = defaults.filter;\n if (typeof opts.filter === 'function' || is_array(opts.filter)) {\n filter = opts.filter;\n }\n let arrayFormat;\n if (opts.arrayFormat && opts.arrayFormat in array_prefix_generators) {\n arrayFormat = opts.arrayFormat;\n }\n else if ('indices' in opts) {\n arrayFormat = opts.indices ? 'indices' : 'repeat';\n }\n else {\n arrayFormat = defaults.arrayFormat;\n }\n if ('commaRoundTrip' in opts && typeof opts.commaRoundTrip !== 'boolean') {\n throw new TypeError('`commaRoundTrip` must be a boolean, or absent');\n }\n const allowDots = typeof opts.allowDots === 'undefined' ?\n !!opts.encodeDotInKeys === true ?\n true\n : defaults.allowDots\n : !!opts.allowDots;\n return {\n addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix,\n // @ts-ignore\n allowDots: allowDots,\n allowEmptyArrays: typeof opts.allowEmptyArrays === 'boolean' ? !!opts.allowEmptyArrays : defaults.allowEmptyArrays,\n arrayFormat: arrayFormat,\n charset: charset,\n charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,\n commaRoundTrip: !!opts.commaRoundTrip,\n delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter,\n encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode,\n encodeDotInKeys: typeof opts.encodeDotInKeys === 'boolean' ? opts.encodeDotInKeys : defaults.encodeDotInKeys,\n encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder,\n encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly,\n filter: filter,\n format: format,\n formatter: formatter,\n serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate,\n skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls,\n // @ts-ignore\n sort: typeof opts.sort === 'function' ? opts.sort : null,\n strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling,\n };\n}\nexport function stringify(object, opts = {}) {\n let obj = object;\n const options = normalize_stringify_options(opts);\n let obj_keys;\n let filter;\n if (typeof options.filter === 'function') {\n filter = options.filter;\n obj = filter('', obj);\n }\n else if (is_array(options.filter)) {\n filter = options.filter;\n obj_keys = filter;\n }\n const keys = [];\n if (typeof obj !== 'object' || obj === null) {\n return '';\n }\n const generateArrayPrefix = array_prefix_generators[options.arrayFormat];\n const commaRoundTrip = generateArrayPrefix === 'comma' && options.commaRoundTrip;\n if (!obj_keys) {\n obj_keys = Object.keys(obj);\n }\n if (options.sort) {\n obj_keys.sort(options.sort);\n }\n const sideChannel = new WeakMap();\n for (let i = 0; i < obj_keys.length; ++i) {\n const key = obj_keys[i];\n if (options.skipNulls && obj[key] === null) {\n continue;\n }\n push_to_array(keys, inner_stringify(obj[key], key, \n // @ts-expect-error\n generateArrayPrefix, commaRoundTrip, options.allowEmptyArrays, options.strictNullHandling, options.skipNulls, options.encodeDotInKeys, options.encode ? options.encoder : null, options.filter, options.sort, options.allowDots, options.serializeDate, options.format, options.formatter, options.encodeValuesOnly, options.charset, sideChannel));\n }\n const joined = keys.join(options.delimiter);\n let prefix = options.addQueryPrefix === true ? '?' : '';\n if (options.charsetSentinel) {\n if (options.charset === 'iso-8859-1') {\n // encodeURIComponent('✓'), the \"numeric entity\" representation of a checkmark\n prefix += 'utf8=%26%2310003%3B&';\n }\n else {\n // encodeURIComponent('✓')\n prefix += 'utf8=%E2%9C%93&';\n }\n }\n return joined.length > 0 ? prefix + joined : '';\n}\n//# sourceMappingURL=stringify.mjs.map","export const VERSION = '4.104.0'; // x-release-please-version\n//# sourceMappingURL=version.mjs.map","export let auto = false;\nexport let kind = undefined;\nexport let fetch = undefined;\nexport let Request = undefined;\nexport let Response = undefined;\nexport let Headers = undefined;\nexport let FormData = undefined;\nexport let Blob = undefined;\nexport let File = undefined;\nexport let ReadableStream = undefined;\nexport let getMultipartRequestOptions = undefined;\nexport let getDefaultAgent = undefined;\nexport let fileFromPath = undefined;\nexport let isFsReadStream = undefined;\nexport function setShims(shims, options = { auto: false }) {\n if (auto) {\n throw new Error(`you must \\`import 'openai/shims/${shims.kind}'\\` before importing anything else from openai`);\n }\n if (kind) {\n throw new Error(`can't \\`import 'openai/shims/${shims.kind}'\\` after \\`import 'openai/shims/${kind}'\\``);\n }\n auto = options.auto;\n kind = shims.kind;\n fetch = shims.fetch;\n Request = shims.Request;\n Response = shims.Response;\n Headers = shims.Headers;\n FormData = shims.FormData;\n Blob = shims.Blob;\n File = shims.File;\n ReadableStream = shims.ReadableStream;\n getMultipartRequestOptions = shims.getMultipartRequestOptions;\n getDefaultAgent = shims.getDefaultAgent;\n fileFromPath = shims.fileFromPath;\n isFsReadStream = shims.isFsReadStream;\n}\n//# sourceMappingURL=registry.mjs.map","/**\n * Disclaimer: modules in _shims aren't intended to be imported by SDK users.\n */\nexport class MultipartBody {\n constructor(body) {\n this.body = body;\n }\n get [Symbol.toStringTag]() {\n return 'MultipartBody';\n }\n}\n//# sourceMappingURL=MultipartBody.mjs.map","import { MultipartBody } from \"./MultipartBody.mjs\";\nexport function getRuntime({ manuallyImported } = {}) {\n const recommendation = manuallyImported ?\n `You may need to use polyfills`\n : `Add one of these imports before your first \\`import … from 'openai'\\`:\n- \\`import 'openai/shims/node'\\` (if you're running on Node)\n- \\`import 'openai/shims/web'\\` (otherwise)\n`;\n let _fetch, _Request, _Response, _Headers;\n try {\n // @ts-ignore\n _fetch = fetch;\n // @ts-ignore\n _Request = Request;\n // @ts-ignore\n _Response = Response;\n // @ts-ignore\n _Headers = Headers;\n }\n catch (error) {\n throw new Error(`this environment is missing the following Web Fetch API type: ${error.message}. ${recommendation}`);\n }\n return {\n kind: 'web',\n fetch: _fetch,\n Request: _Request,\n Response: _Response,\n Headers: _Headers,\n FormData: \n // @ts-ignore\n typeof FormData !== 'undefined' ? FormData : (class FormData {\n // @ts-ignore\n constructor() {\n throw new Error(`file uploads aren't supported in this environment yet as 'FormData' is undefined. ${recommendation}`);\n }\n }),\n Blob: typeof Blob !== 'undefined' ? Blob : (class Blob {\n constructor() {\n throw new Error(`file uploads aren't supported in this environment yet as 'Blob' is undefined. ${recommendation}`);\n }\n }),\n File: \n // @ts-ignore\n typeof File !== 'undefined' ? File : (class File {\n // @ts-ignore\n constructor() {\n throw new Error(`file uploads aren't supported in this environment yet as 'File' is undefined. ${recommendation}`);\n }\n }),\n ReadableStream: \n // @ts-ignore\n typeof ReadableStream !== 'undefined' ? ReadableStream : (class ReadableStream {\n // @ts-ignore\n constructor() {\n throw new Error(`streaming isn't supported in this environment yet as 'ReadableStream' is undefined. ${recommendation}`);\n }\n }),\n getMultipartRequestOptions: async (\n // @ts-ignore\n form, opts) => ({\n ...opts,\n body: new MultipartBody(form),\n }),\n getDefaultAgent: (url) => undefined,\n fileFromPath: () => {\n throw new Error('The `fileFromPath` function is only supported in Node. See the README for more details: https://www.github.com/openai/openai-node#file-uploads');\n },\n isFsReadStream: (value) => false,\n };\n}\n//# sourceMappingURL=web-runtime.mjs.map","/**\n * Disclaimer: modules in _shims aren't intended to be imported by SDK users.\n */\nimport * as shims from './registry.mjs';\nimport * as auto from 'openai/_shims/auto/runtime';\nexport const init = () => {\n if (!shims.kind) shims.setShims(auto.getRuntime(), { auto: true });\n};\nexport * from './registry.mjs';\n\ninit();\n","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { castToError } from \"./core.mjs\";\nexport class OpenAIError extends Error {\n}\nexport class APIError extends OpenAIError {\n constructor(status, error, message, headers) {\n super(`${APIError.makeMessage(status, error, message)}`);\n this.status = status;\n this.headers = headers;\n this.request_id = headers?.['x-request-id'];\n this.error = error;\n const data = error;\n this.code = data?.['code'];\n this.param = data?.['param'];\n this.type = data?.['type'];\n }\n static makeMessage(status, error, message) {\n const msg = error?.message ?\n typeof error.message === 'string' ?\n error.message\n : JSON.stringify(error.message)\n : error ? JSON.stringify(error)\n : message;\n if (status && msg) {\n return `${status} ${msg}`;\n }\n if (status) {\n return `${status} status code (no body)`;\n }\n if (msg) {\n return msg;\n }\n return '(no status code or body)';\n }\n static generate(status, errorResponse, message, headers) {\n if (!status || !headers) {\n return new APIConnectionError({ message, cause: castToError(errorResponse) });\n }\n const error = errorResponse?.['error'];\n if (status === 400) {\n return new BadRequestError(status, error, message, headers);\n }\n if (status === 401) {\n return new AuthenticationError(status, error, message, headers);\n }\n if (status === 403) {\n return new PermissionDeniedError(status, error, message, headers);\n }\n if (status === 404) {\n return new NotFoundError(status, error, message, headers);\n }\n if (status === 409) {\n return new ConflictError(status, error, message, headers);\n }\n if (status === 422) {\n return new UnprocessableEntityError(status, error, message, headers);\n }\n if (status === 429) {\n return new RateLimitError(status, error, message, headers);\n }\n if (status >= 500) {\n return new InternalServerError(status, error, message, headers);\n }\n return new APIError(status, error, message, headers);\n }\n}\nexport class APIUserAbortError extends APIError {\n constructor({ message } = {}) {\n super(undefined, undefined, message || 'Request was aborted.', undefined);\n }\n}\nexport class APIConnectionError extends APIError {\n constructor({ message, cause }) {\n super(undefined, undefined, message || 'Connection error.', undefined);\n // in some environments the 'cause' property is already declared\n // @ts-ignore\n if (cause)\n this.cause = cause;\n }\n}\nexport class APIConnectionTimeoutError extends APIConnectionError {\n constructor({ message } = {}) {\n super({ message: message ?? 'Request timed out.' });\n }\n}\nexport class BadRequestError extends APIError {\n}\nexport class AuthenticationError extends APIError {\n}\nexport class PermissionDeniedError extends APIError {\n}\nexport class NotFoundError extends APIError {\n}\nexport class ConflictError extends APIError {\n}\nexport class UnprocessableEntityError extends APIError {\n}\nexport class RateLimitError extends APIError {\n}\nexport class InternalServerError extends APIError {\n}\nexport class LengthFinishReasonError extends OpenAIError {\n constructor() {\n super(`Could not parse response content as the length limit was reached`);\n }\n}\nexport class ContentFilterFinishReasonError extends OpenAIError {\n constructor() {\n super(`Could not parse response content as the request was rejected by the content filter`);\n }\n}\n//# sourceMappingURL=error.mjs.map","var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n};\nvar __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar _LineDecoder_carriageReturnIndex;\nimport { OpenAIError } from \"../../error.mjs\";\n/**\n * A re-implementation of httpx's `LineDecoder` in Python that handles incrementally\n * reading lines from text.\n *\n * https://github.com/encode/httpx/blob/920333ea98118e9cf617f246905d7b202510941c/httpx/_decoders.py#L258\n */\nexport class LineDecoder {\n constructor() {\n _LineDecoder_carriageReturnIndex.set(this, void 0);\n this.buffer = new Uint8Array();\n __classPrivateFieldSet(this, _LineDecoder_carriageReturnIndex, null, \"f\");\n }\n decode(chunk) {\n if (chunk == null) {\n return [];\n }\n const binaryChunk = chunk instanceof ArrayBuffer ? new Uint8Array(chunk)\n : typeof chunk === 'string' ? new TextEncoder().encode(chunk)\n : chunk;\n let newData = new Uint8Array(this.buffer.length + binaryChunk.length);\n newData.set(this.buffer);\n newData.set(binaryChunk, this.buffer.length);\n this.buffer = newData;\n const lines = [];\n let patternIndex;\n while ((patternIndex = findNewlineIndex(this.buffer, __classPrivateFieldGet(this, _LineDecoder_carriageReturnIndex, \"f\"))) != null) {\n if (patternIndex.carriage && __classPrivateFieldGet(this, _LineDecoder_carriageReturnIndex, \"f\") == null) {\n // skip until we either get a corresponding `\\n`, a new `\\r` or nothing\n __classPrivateFieldSet(this, _LineDecoder_carriageReturnIndex, patternIndex.index, \"f\");\n continue;\n }\n // we got double \\r or \\rtext\\n\n if (__classPrivateFieldGet(this, _LineDecoder_carriageReturnIndex, \"f\") != null &&\n (patternIndex.index !== __classPrivateFieldGet(this, _LineDecoder_carriageReturnIndex, \"f\") + 1 || patternIndex.carriage)) {\n lines.push(this.decodeText(this.buffer.slice(0, __classPrivateFieldGet(this, _LineDecoder_carriageReturnIndex, \"f\") - 1)));\n this.buffer = this.buffer.slice(__classPrivateFieldGet(this, _LineDecoder_carriageReturnIndex, \"f\"));\n __classPrivateFieldSet(this, _LineDecoder_carriageReturnIndex, null, \"f\");\n continue;\n }\n const endIndex = __classPrivateFieldGet(this, _LineDecoder_carriageReturnIndex, \"f\") !== null ? patternIndex.preceding - 1 : patternIndex.preceding;\n const line = this.decodeText(this.buffer.slice(0, endIndex));\n lines.push(line);\n this.buffer = this.buffer.slice(patternIndex.index);\n __classPrivateFieldSet(this, _LineDecoder_carriageReturnIndex, null, \"f\");\n }\n return lines;\n }\n decodeText(bytes) {\n if (bytes == null)\n return '';\n if (typeof bytes === 'string')\n return bytes;\n // Node:\n if (typeof Buffer !== 'undefined') {\n if (bytes instanceof Buffer) {\n return bytes.toString();\n }\n if (bytes instanceof Uint8Array) {\n return Buffer.from(bytes).toString();\n }\n throw new OpenAIError(`Unexpected: received non-Uint8Array (${bytes.constructor.name}) stream chunk in an environment with a global \"Buffer\" defined, which this library assumes to be Node. Please report this error.`);\n }\n // Browser\n if (typeof TextDecoder !== 'undefined') {\n if (bytes instanceof Uint8Array || bytes instanceof ArrayBuffer) {\n this.textDecoder ?? (this.textDecoder = new TextDecoder('utf8'));\n return this.textDecoder.decode(bytes);\n }\n throw new OpenAIError(`Unexpected: received non-Uint8Array/ArrayBuffer (${bytes.constructor.name}) in a web platform. Please report this error.`);\n }\n throw new OpenAIError(`Unexpected: neither Buffer nor TextDecoder are available as globals. Please report this error.`);\n }\n flush() {\n if (!this.buffer.length) {\n return [];\n }\n return this.decode('\\n');\n }\n}\n_LineDecoder_carriageReturnIndex = new WeakMap();\n// prettier-ignore\nLineDecoder.NEWLINE_CHARS = new Set(['\\n', '\\r']);\nLineDecoder.NEWLINE_REGEXP = /\\r\\n|[\\n\\r]/g;\n/**\n * This function searches the buffer for the end patterns, (\\r or \\n)\n * and returns an object with the index preceding the matched newline and the\n * index after the newline char. `null` is returned if no new line is found.\n *\n * ```ts\n * findNewLineIndex('abc\\ndef') -> { preceding: 2, index: 3 }\n * ```\n */\nfunction findNewlineIndex(buffer, startIndex) {\n const newline = 0x0a; // \\n\n const carriage = 0x0d; // \\r\n for (let i = startIndex ?? 0; i < buffer.length; i++) {\n if (buffer[i] === newline) {\n return { preceding: i, index: i + 1, carriage: false };\n }\n if (buffer[i] === carriage) {\n return { preceding: i, index: i + 1, carriage: true };\n }\n }\n return null;\n}\nexport function findDoubleNewlineIndex(buffer) {\n // This function searches the buffer for the end patterns (\\r\\r, \\n\\n, \\r\\n\\r\\n)\n // and returns the index right after the first occurrence of any pattern,\n // or -1 if none of the patterns are found.\n const newline = 0x0a; // \\n\n const carriage = 0x0d; // \\r\n for (let i = 0; i < buffer.length - 1; i++) {\n if (buffer[i] === newline && buffer[i + 1] === newline) {\n // \\n\\n\n return i + 2;\n }\n if (buffer[i] === carriage && buffer[i + 1] === carriage) {\n // \\r\\r\n return i + 2;\n }\n if (buffer[i] === carriage &&\n buffer[i + 1] === newline &&\n i + 3 < buffer.length &&\n buffer[i + 2] === carriage &&\n buffer[i + 3] === newline) {\n // \\r\\n\\r\\n\n return i + 4;\n }\n }\n return -1;\n}\n//# sourceMappingURL=line.mjs.map","/**\n * Most browsers don't yet have async iterable support for ReadableStream,\n * and Node has a very different way of reading bytes from its \"ReadableStream\".\n *\n * This polyfill was pulled from https://github.com/MattiasBuelens/web-streams-polyfill/pull/122#issuecomment-1627354490\n */\nexport function ReadableStreamToAsyncIterable(stream) {\n if (stream[Symbol.asyncIterator])\n return stream;\n const reader = stream.getReader();\n return {\n async next() {\n try {\n const result = await reader.read();\n if (result?.done)\n reader.releaseLock(); // release lock when stream becomes closed\n return result;\n }\n catch (e) {\n reader.releaseLock(); // release lock when stream becomes errored\n throw e;\n }\n },\n async return() {\n const cancelPromise = reader.cancel();\n reader.releaseLock();\n await cancelPromise;\n return { done: true, value: undefined };\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n}\n//# sourceMappingURL=stream-utils.mjs.map","import { ReadableStream } from \"./_shims/index.mjs\";\nimport { OpenAIError } from \"./error.mjs\";\nimport { findDoubleNewlineIndex, LineDecoder } from \"./internal/decoders/line.mjs\";\nimport { ReadableStreamToAsyncIterable } from \"./internal/stream-utils.mjs\";\nimport { createResponseHeaders } from \"./core.mjs\";\nimport { APIError } from \"./error.mjs\";\nexport class Stream {\n constructor(iterator, controller) {\n this.iterator = iterator;\n this.controller = controller;\n }\n static fromSSEResponse(response, controller) {\n let consumed = false;\n async function* iterator() {\n if (consumed) {\n throw new Error('Cannot iterate over a consumed stream, use `.tee()` to split the stream.');\n }\n consumed = true;\n let done = false;\n try {\n for await (const sse of _iterSSEMessages(response, controller)) {\n if (done)\n continue;\n if (sse.data.startsWith('[DONE]')) {\n done = true;\n continue;\n }\n if (sse.event === null ||\n sse.event.startsWith('response.') ||\n sse.event.startsWith('transcript.')) {\n let data;\n try {\n data = JSON.parse(sse.data);\n }\n catch (e) {\n console.error(`Could not parse message into JSON:`, sse.data);\n console.error(`From chunk:`, sse.raw);\n throw e;\n }\n if (data && data.error) {\n throw new APIError(undefined, data.error, undefined, createResponseHeaders(response.headers));\n }\n yield data;\n }\n else {\n let data;\n try {\n data = JSON.parse(sse.data);\n }\n catch (e) {\n console.error(`Could not parse message into JSON:`, sse.data);\n console.error(`From chunk:`, sse.raw);\n throw e;\n }\n // TODO: Is this where the error should be thrown?\n if (sse.event == 'error') {\n throw new APIError(undefined, data.error, data.message, undefined);\n }\n yield { event: sse.event, data: data };\n }\n }\n done = true;\n }\n catch (e) {\n // If the user calls `stream.controller.abort()`, we should exit without throwing.\n if (e instanceof Error && e.name === 'AbortError')\n return;\n throw e;\n }\n finally {\n // If the user `break`s, abort the ongoing request.\n if (!done)\n controller.abort();\n }\n }\n return new Stream(iterator, controller);\n }\n /**\n * Generates a Stream from a newline-separated ReadableStream\n * where each item is a JSON value.\n */\n static fromReadableStream(readableStream, controller) {\n let consumed = false;\n async function* iterLines() {\n const lineDecoder = new LineDecoder();\n const iter = ReadableStreamToAsyncIterable(readableStream);\n for await (const chunk of iter) {\n for (const line of lineDecoder.decode(chunk)) {\n yield line;\n }\n }\n for (const line of lineDecoder.flush()) {\n yield line;\n }\n }\n async function* iterator() {\n if (consumed) {\n throw new Error('Cannot iterate over a consumed stream, use `.tee()` to split the stream.');\n }\n consumed = true;\n let done = false;\n try {\n for await (const line of iterLines()) {\n if (done)\n continue;\n if (line)\n yield JSON.parse(line);\n }\n done = true;\n }\n catch (e) {\n // If the user calls `stream.controller.abort()`, we should exit without throwing.\n if (e instanceof Error && e.name === 'AbortError')\n return;\n throw e;\n }\n finally {\n // If the user `break`s, abort the ongoing request.\n if (!done)\n controller.abort();\n }\n }\n return new Stream(iterator, controller);\n }\n [Symbol.asyncIterator]() {\n return this.iterator();\n }\n /**\n * Splits the stream into two streams which can be\n * independently read from at different speeds.\n */\n tee() {\n const left = [];\n const right = [];\n const iterator = this.iterator();\n const teeIterator = (queue) => {\n return {\n next: () => {\n if (queue.length === 0) {\n const result = iterator.next();\n left.push(result);\n right.push(result);\n }\n return queue.shift();\n },\n };\n };\n return [\n new Stream(() => teeIterator(left), this.controller),\n new Stream(() => teeIterator(right), this.controller),\n ];\n }\n /**\n * Converts this stream to a newline-separated ReadableStream of\n * JSON stringified values in the stream\n * which can be turned back into a Stream with `Stream.fromReadableStream()`.\n */\n toReadableStream() {\n const self = this;\n let iter;\n const encoder = new TextEncoder();\n return new ReadableStream({\n async start() {\n iter = self[Symbol.asyncIterator]();\n },\n async pull(ctrl) {\n try {\n const { value, done } = await iter.next();\n if (done)\n return ctrl.close();\n const bytes = encoder.encode(JSON.stringify(value) + '\\n');\n ctrl.enqueue(bytes);\n }\n catch (err) {\n ctrl.error(err);\n }\n },\n async cancel() {\n await iter.return?.();\n },\n });\n }\n}\nexport async function* _iterSSEMessages(response, controller) {\n if (!response.body) {\n controller.abort();\n throw new OpenAIError(`Attempted to iterate over a response with no body`);\n }\n const sseDecoder = new SSEDecoder();\n const lineDecoder = new LineDecoder();\n const iter = ReadableStreamToAsyncIterable(response.body);\n for await (const sseChunk of iterSSEChunks(iter)) {\n for (const line of lineDecoder.decode(sseChunk)) {\n const sse = sseDecoder.decode(line);\n if (sse)\n yield sse;\n }\n }\n for (const line of lineDecoder.flush()) {\n const sse = sseDecoder.decode(line);\n if (sse)\n yield sse;\n }\n}\n/**\n * Given an async iterable iterator, iterates over it and yields full\n * SSE chunks, i.e. yields when a double new-line is encountered.\n */\nasync function* iterSSEChunks(iterator) {\n let data = new Uint8Array();\n for await (const chunk of iterator) {\n if (chunk == null) {\n continue;\n }\n const binaryChunk = chunk instanceof ArrayBuffer ? new Uint8Array(chunk)\n : typeof chunk === 'string' ? new TextEncoder().encode(chunk)\n : chunk;\n let newData = new Uint8Array(data.length + binaryChunk.length);\n newData.set(data);\n newData.set(binaryChunk, data.length);\n data = newData;\n let patternIndex;\n while ((patternIndex = findDoubleNewlineIndex(data)) !== -1) {\n yield data.slice(0, patternIndex);\n data = data.slice(patternIndex);\n }\n }\n if (data.length > 0) {\n yield data;\n }\n}\nclass SSEDecoder {\n constructor() {\n this.event = null;\n this.data = [];\n this.chunks = [];\n }\n decode(line) {\n if (line.endsWith('\\r')) {\n line = line.substring(0, line.length - 1);\n }\n if (!line) {\n // empty line and we didn't previously encounter any messages\n if (!this.event && !this.data.length)\n return null;\n const sse = {\n event: this.event,\n data: this.data.join('\\n'),\n raw: this.chunks,\n };\n this.event = null;\n this.data = [];\n this.chunks = [];\n return sse;\n }\n this.chunks.push(line);\n if (line.startsWith(':')) {\n return null;\n }\n let [fieldname, _, value] = partition(line, ':');\n if (value.startsWith(' ')) {\n value = value.substring(1);\n }\n if (fieldname === 'event') {\n this.event = value;\n }\n else if (fieldname === 'data') {\n this.data.push(value);\n }\n return null;\n }\n}\nfunction partition(str, delimiter) {\n const index = str.indexOf(delimiter);\n if (index !== -1) {\n return [str.substring(0, index), delimiter, str.substring(index + delimiter.length)];\n }\n return [str, '', ''];\n}\n//# sourceMappingURL=streaming.mjs.map","import { FormData, File, getMultipartRequestOptions, isFsReadStream, } from \"./_shims/index.mjs\";\nexport { fileFromPath } from \"./_shims/index.mjs\";\nexport const isResponseLike = (value) => value != null &&\n typeof value === 'object' &&\n typeof value.url === 'string' &&\n typeof value.blob === 'function';\nexport const isFileLike = (value) => value != null &&\n typeof value === 'object' &&\n typeof value.name === 'string' &&\n typeof value.lastModified === 'number' &&\n isBlobLike(value);\n/**\n * The BlobLike type omits arrayBuffer() because @types/node-fetch@^2.6.4 lacks it; but this check\n * adds the arrayBuffer() method type because it is available and used at runtime\n */\nexport const isBlobLike = (value) => value != null &&\n typeof value === 'object' &&\n typeof value.size === 'number' &&\n typeof value.type === 'string' &&\n typeof value.text === 'function' &&\n typeof value.slice === 'function' &&\n typeof value.arrayBuffer === 'function';\nexport const isUploadable = (value) => {\n return isFileLike(value) || isResponseLike(value) || isFsReadStream(value);\n};\n/**\n * Helper for creating a {@link File} to pass to an SDK upload method from a variety of different data formats\n * @param value the raw content of the file. Can be an {@link Uploadable}, {@link BlobLikePart}, or {@link AsyncIterable} of {@link BlobLikePart}s\n * @param {string=} name the name of the file. If omitted, toFile will try to determine a file name from bits if possible\n * @param {Object=} options additional properties\n * @param {string=} options.type the MIME type of the content\n * @param {number=} options.lastModified the last modified timestamp\n * @returns a {@link File} with the given properties\n */\nexport async function toFile(value, name, options) {\n // If it's a promise, resolve it.\n value = await value;\n // If we've been given a `File` we don't need to do anything\n if (isFileLike(value)) {\n return value;\n }\n if (isResponseLike(value)) {\n const blob = await value.blob();\n name || (name = new URL(value.url).pathname.split(/[\\\\/]/).pop() ?? 'unknown_file');\n // we need to convert the `Blob` into an array buffer because the `Blob` class\n // that `node-fetch` defines is incompatible with the web standard which results\n // in `new File` interpreting it as a string instead of binary data.\n const data = isBlobLike(blob) ? [(await blob.arrayBuffer())] : [blob];\n return new File(data, name, options);\n }\n const bits = await getBytes(value);\n name || (name = getName(value) ?? 'unknown_file');\n if (!options?.type) {\n const type = bits[0]?.type;\n if (typeof type === 'string') {\n options = { ...options, type };\n }\n }\n return new File(bits, name, options);\n}\nasync function getBytes(value) {\n let parts = [];\n if (typeof value === 'string' ||\n ArrayBuffer.isView(value) || // includes Uint8Array, Buffer, etc.\n value instanceof ArrayBuffer) {\n parts.push(value);\n }\n else if (isBlobLike(value)) {\n parts.push(await value.arrayBuffer());\n }\n else if (isAsyncIterableIterator(value) // includes Readable, ReadableStream, etc.\n ) {\n for await (const chunk of value) {\n parts.push(chunk); // TODO, consider validating?\n }\n }\n else {\n throw new Error(`Unexpected data type: ${typeof value}; constructor: ${value?.constructor\n ?.name}; props: ${propsForError(value)}`);\n }\n return parts;\n}\nfunction propsForError(value) {\n const props = Object.getOwnPropertyNames(value);\n return `[${props.map((p) => `\"${p}\"`).join(', ')}]`;\n}\nfunction getName(value) {\n return (getStringFromMaybeBuffer(value.name) ||\n getStringFromMaybeBuffer(value.filename) ||\n // For fs.ReadStream\n getStringFromMaybeBuffer(value.path)?.split(/[\\\\/]/).pop());\n}\nconst getStringFromMaybeBuffer = (x) => {\n if (typeof x === 'string')\n return x;\n if (typeof Buffer !== 'undefined' && x instanceof Buffer)\n return String(x);\n return undefined;\n};\nconst isAsyncIterableIterator = (value) => value != null && typeof value === 'object' && typeof value[Symbol.asyncIterator] === 'function';\nexport const isMultipartBody = (body) => body && typeof body === 'object' && body.body && body[Symbol.toStringTag] === 'MultipartBody';\n/**\n * Returns a multipart/form-data request if any part of the given request body contains a File / Blob value.\n * Otherwise returns the request as is.\n */\nexport const maybeMultipartFormRequestOptions = async (opts) => {\n if (!hasUploadableValue(opts.body))\n return opts;\n const form = await createForm(opts.body);\n return getMultipartRequestOptions(form, opts);\n};\nexport const multipartFormRequestOptions = async (opts) => {\n const form = await createForm(opts.body);\n return getMultipartRequestOptions(form, opts);\n};\nexport const createForm = async (body) => {\n const form = new FormData();\n await Promise.all(Object.entries(body || {}).map(([key, value]) => addFormValue(form, key, value)));\n return form;\n};\nconst hasUploadableValue = (value) => {\n if (isUploadable(value))\n return true;\n if (Array.isArray(value))\n return value.some(hasUploadableValue);\n if (value && typeof value === 'object') {\n for (const k in value) {\n if (hasUploadableValue(value[k]))\n return true;\n }\n }\n return false;\n};\nconst addFormValue = async (form, key, value) => {\n if (value === undefined)\n return;\n if (value == null) {\n throw new TypeError(`Received null for \"${key}\"; to pass null in FormData, you must use the string 'null'`);\n }\n // TODO: make nested formats configurable\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n form.append(key, String(value));\n }\n else if (isUploadable(value)) {\n const file = await toFile(value);\n form.append(key, file);\n }\n else if (Array.isArray(value)) {\n await Promise.all(value.map((entry) => addFormValue(form, key + '[]', entry)));\n }\n else if (typeof value === 'object') {\n await Promise.all(Object.entries(value).map(([name, prop]) => addFormValue(form, `${key}[${name}]`, prop)));\n }\n else {\n throw new TypeError(`Invalid value given to form, expected a string, number, boolean, object, Array, File or Blob but got ${value} instead`);\n }\n};\n//# sourceMappingURL=uploads.mjs.map","var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n};\nvar __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar _AbstractPage_client;\nimport { VERSION } from \"./version.mjs\";\nimport { Stream } from \"./streaming.mjs\";\nimport { OpenAIError, APIError, APIConnectionError, APIConnectionTimeoutError, APIUserAbortError, } from \"./error.mjs\";\nimport { kind as shimsKind, getDefaultAgent, fetch, init, } from \"./_shims/index.mjs\";\n// try running side effects outside of _shims/index to workaround https://github.com/vercel/next.js/issues/76881\ninit();\nimport { isBlobLike, isMultipartBody } from \"./uploads.mjs\";\nexport { maybeMultipartFormRequestOptions, multipartFormRequestOptions, createForm, } from \"./uploads.mjs\";\nasync function defaultParseResponse(props) {\n const { response } = props;\n if (props.options.stream) {\n debug('response', response.status, response.url, response.headers, response.body);\n // Note: there is an invariant here that isn't represented in the type system\n // that if you set `stream: true` the response type must also be `Stream<T>`\n if (props.options.__streamClass) {\n return props.options.__streamClass.fromSSEResponse(response, props.controller);\n }\n return Stream.fromSSEResponse(response, props.controller);\n }\n // fetch refuses to read the body when the status code is 204.\n if (response.status === 204) {\n return null;\n }\n if (props.options.__binaryResponse) {\n return response;\n }\n const contentType = response.headers.get('content-type');\n const mediaType = contentType?.split(';')[0]?.trim();\n const isJSON = mediaType?.includes('application/json') || mediaType?.endsWith('+json');\n if (isJSON) {\n const json = await response.json();\n debug('response', response.status, response.url, response.headers, json);\n return _addRequestID(json, response);\n }\n const text = await response.text();\n debug('response', response.status, response.url, response.headers, text);\n // TODO handle blob, arraybuffer, other content types, etc.\n return text;\n}\nfunction _addRequestID(value, response) {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return value;\n }\n return Object.defineProperty(value, '_request_id', {\n value: response.headers.get('x-request-id'),\n enumerable: false,\n });\n}\n/**\n * A subclass of `Promise` providing additional helper methods\n * for interacting with the SDK.\n */\nexport class APIPromise extends Promise {\n constructor(responsePromise, parseResponse = defaultParseResponse) {\n super((resolve) => {\n // this is maybe a bit weird but this has to be a no-op to not implicitly\n // parse the response body; instead .then, .catch, .finally are overridden\n // to parse the response\n resolve(null);\n });\n this.responsePromise = responsePromise;\n this.parseResponse = parseResponse;\n }\n _thenUnwrap(transform) {\n return new APIPromise(this.responsePromise, async (props) => _addRequestID(transform(await this.parseResponse(props), props), props.response));\n }\n /**\n * Gets the raw `Response` instance instead of parsing the response\n * data.\n *\n * If you want to parse the response body but still get the `Response`\n * instance, you can use {@link withResponse()}.\n *\n * 👋 Getting the wrong TypeScript type for `Response`?\n * Try setting `\"moduleResolution\": \"NodeNext\"` if you can,\n * or add one of these imports before your first `import … from 'openai'`:\n * - `import 'openai/shims/node'` (if you're running on Node)\n * - `import 'openai/shims/web'` (otherwise)\n */\n asResponse() {\n return this.responsePromise.then((p) => p.response);\n }\n /**\n * Gets the parsed response data, the raw `Response` instance and the ID of the request,\n * returned via the X-Request-ID header which is useful for debugging requests and reporting\n * issues to OpenAI.\n *\n * If you just want to get the raw `Response` instance without parsing it,\n * you can use {@link asResponse()}.\n *\n *\n * 👋 Getting the wrong TypeScript type for `Response`?\n * Try setting `\"moduleResolution\": \"NodeNext\"` if you can,\n * or add one of these imports before your first `import … from 'openai'`:\n * - `import 'openai/shims/node'` (if you're running on Node)\n * - `import 'openai/shims/web'` (otherwise)\n */\n async withResponse() {\n const [data, response] = await Promise.all([this.parse(), this.asResponse()]);\n return { data, response, request_id: response.headers.get('x-request-id') };\n }\n parse() {\n if (!this.parsedPromise) {\n this.parsedPromise = this.responsePromise.then(this.parseResponse);\n }\n return this.parsedPromise;\n }\n then(onfulfilled, onrejected) {\n return this.parse().then(onfulfilled, onrejected);\n }\n catch(onrejected) {\n return this.parse().catch(onrejected);\n }\n finally(onfinally) {\n return this.parse().finally(onfinally);\n }\n}\nexport class APIClient {\n constructor({ baseURL, maxRetries = 2, timeout = 600000, // 10 minutes\n httpAgent, fetch: overriddenFetch, }) {\n this.baseURL = baseURL;\n this.maxRetries = validatePositiveInteger('maxRetries', maxRetries);\n this.timeout = validatePositiveInteger('timeout', timeout);\n this.httpAgent = httpAgent;\n this.fetch = overriddenFetch ?? fetch;\n }\n authHeaders(opts) {\n return {};\n }\n /**\n * Override this to add your own default headers, for example:\n *\n * {\n * ...super.defaultHeaders(),\n * Authorization: 'Bearer 123',\n * }\n */\n defaultHeaders(opts) {\n return {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n 'User-Agent': this.getUserAgent(),\n ...getPlatformHeaders(),\n ...this.authHeaders(opts),\n };\n }\n /**\n * Override this to add your own headers validation:\n */\n validateHeaders(headers, customHeaders) { }\n defaultIdempotencyKey() {\n return `stainless-node-retry-${uuid4()}`;\n }\n get(path, opts) {\n return this.methodRequest('get', path, opts);\n }\n post(path, opts) {\n return this.methodRequest('post', path, opts);\n }\n patch(path, opts) {\n return this.methodRequest('patch', path, opts);\n }\n put(path, opts) {\n return this.methodRequest('put', path, opts);\n }\n delete(path, opts) {\n return this.methodRequest('delete', path, opts);\n }\n methodRequest(method, path, opts) {\n return this.request(Promise.resolve(opts).then(async (opts) => {\n const body = opts && isBlobLike(opts?.body) ? new DataView(await opts.body.arrayBuffer())\n : opts?.body instanceof DataView ? opts.body\n : opts?.body instanceof ArrayBuffer ? new DataView(opts.body)\n : opts && ArrayBuffer.isView(opts?.body) ? new DataView(opts.body.buffer)\n : opts?.body;\n return { method, path, ...opts, body };\n }));\n }\n getAPIList(path, Page, opts) {\n return this.requestAPIList(Page, { method: 'get', path, ...opts });\n }\n calculateContentLength(body) {\n if (typeof body === 'string') {\n if (typeof Buffer !== 'undefined') {\n return Buffer.byteLength(body, 'utf8').toString();\n }\n if (typeof TextEncoder !== 'undefined') {\n const encoder = new TextEncoder();\n const encoded = encoder.encode(body);\n return encoded.length.toString();\n }\n }\n else if (ArrayBuffer.isView(body)) {\n return body.byteLength.toString();\n }\n return null;\n }\n buildRequest(inputOptions, { retryCount = 0 } = {}) {\n const options = { ...inputOptions };\n const { method, path, query, headers: headers = {} } = options;\n const body = ArrayBuffer.isView(options.body) || (options.__binaryRequest && typeof options.body === 'string') ?\n options.body\n : isMultipartBody(options.body) ? options.body.body\n : options.body ? JSON.stringify(options.body, null, 2)\n : null;\n const contentLength = this.calculateContentLength(body);\n const url = this.buildURL(path, query);\n if ('timeout' in options)\n validatePositiveInteger('timeout', options.timeout);\n options.timeout = options.timeout ?? this.timeout;\n const httpAgent = options.httpAgent ?? this.httpAgent ?? getDefaultAgent(url);\n const minAgentTimeout = options.timeout + 1000;\n if (typeof httpAgent?.options?.timeout === 'number' &&\n minAgentTimeout > (httpAgent.options.timeout ?? 0)) {\n // Allow any given request to bump our agent active socket timeout.\n // This may seem strange, but leaking active sockets should be rare and not particularly problematic,\n // and without mutating agent we would need to create more of them.\n // This tradeoff optimizes for performance.\n httpAgent.options.timeout = minAgentTimeout;\n }\n if (this.idempotencyHeader && method !== 'get') {\n if (!inputOptions.idempotencyKey)\n inputOptions.idempotencyKey = this.defaultIdempotencyKey();\n headers[this.idempotencyHeader] = inputOptions.idempotencyKey;\n }\n const reqHeaders = this.buildHeaders({ options, headers, contentLength, retryCount });\n const req = {\n method,\n ...(body && { body: body }),\n headers: reqHeaders,\n ...(httpAgent && { agent: httpAgent }),\n // @ts-ignore node-fetch uses a custom AbortSignal type that is\n // not compatible with standard web types\n signal: options.signal ?? null,\n };\n return { req, url, timeout: options.timeout };\n }\n buildHeaders({ options, headers, contentLength, retryCount, }) {\n const reqHeaders = {};\n if (contentLength) {\n reqHeaders['content-length'] = contentLength;\n }\n const defaultHeaders = this.defaultHeaders(options);\n applyHeadersMut(reqHeaders, defaultHeaders);\n applyHeadersMut(reqHeaders, headers);\n // let builtin fetch set the Content-Type for multipart bodies\n if (isMultipartBody(options.body) && shimsKind !== 'node') {\n delete reqHeaders['content-type'];\n }\n // Don't set theses headers if they were already set or removed through default headers or by the caller.\n // We check `defaultHeaders` and `headers`, which can contain nulls, instead of `reqHeaders` to account\n // for the removal case.\n if (getHeader(defaultHeaders, 'x-stainless-retry-count') === undefined &&\n getHeader(headers, 'x-stainless-retry-count') === undefined) {\n reqHeaders['x-stainless-retry-count'] = String(retryCount);\n }\n if (getHeader(defaultHeaders, 'x-stainless-timeout') === undefined &&\n getHeader(headers, 'x-stainless-timeout') === undefined &&\n options.timeout) {\n reqHeaders['x-stainless-timeout'] = String(Math.trunc(options.timeout / 1000));\n }\n this.validateHeaders(reqHeaders, headers);\n return reqHeaders;\n }\n /**\n * Used as a callback for mutating the given `FinalRequestOptions` object.\n */\n async prepareOptions(options) { }\n /**\n * Used as a callback for mutating the given `RequestInit` object.\n *\n * This is useful for cases where you want to add certain headers based off of\n * the request properties, e.g. `method` or `url`.\n */\n async prepareRequest(request, { url, options }) { }\n parseHeaders(headers) {\n return (!headers ? {}\n : Symbol.iterator in headers ?\n Object.fromEntries(Array.from(headers).map((header) => [...header]))\n : { ...headers });\n }\n makeStatusError(status, error, message, headers) {\n return APIError.generate(status, error, message, headers);\n }\n request(options, remainingRetries = null) {\n return new APIPromise(this.makeRequest(options, remainingRetries));\n }\n async makeRequest(optionsInput, retriesRemaining) {\n const options = await optionsInput;\n const maxRetries = options.maxRetries ?? this.maxRetries;\n if (retriesRemaining == null) {\n retriesRemaining = maxRetries;\n }\n await this.prepareOptions(options);\n const { req, url, timeout } = this.buildRequest(options, { retryCount: maxRetries - retriesRemaining });\n await this.prepareRequest(req, { url, options });\n debug('request', url, options, req.headers);\n if (options.signal?.aborted) {\n throw new APIUserAbortError();\n }\n const controller = new AbortController();\n const response = await this.fetchWithTimeout(url, req, timeout, controller).catch(castToError);\n if (response instanceof Error) {\n if (options.signal?.aborted) {\n throw new APIUserAbortError();\n }\n if (retriesRemaining) {\n return this.retryRequest(options, retriesRemaining);\n }\n if (response.name === 'AbortError') {\n throw new APIConnectionTimeoutError();\n }\n throw new APIConnectionError({ cause: response });\n }\n const responseHeaders = createResponseHeaders(response.headers);\n if (!response.ok) {\n if (retriesRemaining && this.shouldRetry(response)) {\n const retryMessage = `retrying, ${retriesRemaining} attempts remaining`;\n debug(`response (error; ${retryMessage})`, response.status, url, responseHeaders);\n return this.retryRequest(options, retriesRemaining, responseHeaders);\n }\n const errText = await response.text().catch((e) => castToError(e).message);\n const errJSON = safeJSON(errText);\n const errMessage = errJSON ? undefined : errText;\n const retryMessage = retriesRemaining ? `(error; no more retries left)` : `(error; not retryable)`;\n debug(`response (error; ${retryMessage})`, response.status, url, responseHeaders, errMessage);\n const err = this.makeStatusError(response.status, errJSON, errMessage, responseHeaders);\n throw err;\n }\n return { response, options, controller };\n }\n requestAPIList(Page, options) {\n const request = this.makeRequest(options, null);\n return new PagePromise(this, request, Page);\n }\n buildURL(path, query) {\n const url = isAbsoluteURL(path) ?\n new URL(path)\n : new URL(this.baseURL + (this.baseURL.endsWith('/') && path.startsWith('/') ? path.slice(1) : path));\n const defaultQuery = this.defaultQuery();\n if (!isEmptyObj(defaultQuery)) {\n query = { ...defaultQuery, ...query };\n }\n if (typeof query === 'object' && query && !Array.isArray(query)) {\n url.search = this.stringifyQuery(query);\n }\n return url.toString();\n }\n stringifyQuery(query) {\n return Object.entries(query)\n .filter(([_, value]) => typeof value !== 'undefined')\n .map(([key, value]) => {\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;\n }\n if (value === null) {\n return `${encodeURIComponent(key)}=`;\n }\n throw new OpenAIError(`Cannot stringify type ${typeof value}; Expected string, number, boolean, or null. If you need to pass nested query parameters, you can manually encode them, e.g. { query: { 'foo[key1]': value1, 'foo[key2]': value2 } }, and please open a GitHub issue requesting better support for your use case.`);\n })\n .join('&');\n }\n async fetchWithTimeout(url, init, ms, controller) {\n const { signal, ...options } = init || {};\n if (signal)\n signal.addEventListener('abort', () => controller.abort());\n const timeout = setTimeout(() => controller.abort(), ms);\n const fetchOptions = {\n signal: controller.signal,\n ...options,\n };\n if (fetchOptions.method) {\n // Custom methods like 'patch' need to be uppercased\n // See https://github.com/nodejs/undici/issues/2294\n fetchOptions.method = fetchOptions.method.toUpperCase();\n }\n return (\n // use undefined this binding; fetch errors if bound to something else in browser/cloudflare\n this.fetch.call(undefined, url, fetchOptions).finally(() => {\n clearTimeout(timeout);\n }));\n }\n shouldRetry(response) {\n // Note this is not a standard header.\n const shouldRetryHeader = response.headers.get('x-should-retry');\n // If the server explicitly says whether or not to retry, obey.\n if (shouldRetryHeader === 'true')\n return true;\n if (shouldRetryHeader === 'false')\n return false;\n // Retry on request timeouts.\n if (response.status === 408)\n return true;\n // Retry on lock timeouts.\n if (response.status === 409)\n return true;\n // Retry on rate limits.\n if (response.status === 429)\n return true;\n // Retry internal errors.\n if (response.status >= 500)\n return true;\n return false;\n }\n async retryRequest(options, retriesRemaining, responseHeaders) {\n let timeoutMillis;\n // Note the `retry-after-ms` header may not be standard, but is a good idea and we'd like proactive support for it.\n const retryAfterMillisHeader = responseHeaders?.['retry-after-ms'];\n if (retryAfterMillisHeader) {\n const timeoutMs = parseFloat(retryAfterMillisHeader);\n if (!Number.isNaN(timeoutMs)) {\n timeoutMillis = timeoutMs;\n }\n }\n // About the Retry-After header: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After\n const retryAfterHeader = responseHeaders?.['retry-after'];\n if (retryAfterHeader && !timeoutMillis) {\n const timeoutSeconds = parseFloat(retryAfterHeader);\n if (!Number.isNaN(timeoutSeconds)) {\n timeoutMillis = timeoutSeconds * 1000;\n }\n else {\n timeoutMillis = Date.parse(retryAfterHeader) - Date.now();\n }\n }\n // If the API asks us to wait a certain amount of time (and it's a reasonable amount),\n // just do what it says, but otherwise calculate a default\n if (!(timeoutMillis && 0 <= timeoutMillis && timeoutMillis < 60 * 1000)) {\n const maxRetries = options.maxRetries ?? this.maxRetries;\n timeoutMillis = this.calculateDefaultRetryTimeoutMillis(retriesRemaining, maxRetries);\n }\n await sleep(timeoutMillis);\n return this.makeRequest(options, retriesRemaining - 1);\n }\n calculateDefaultRetryTimeoutMillis(retriesRemaining, maxRetries) {\n const initialRetryDelay = 0.5;\n const maxRetryDelay = 8.0;\n const numRetries = maxRetries - retriesRemaining;\n // Apply exponential backoff, but not more than the max.\n const sleepSeconds = Math.min(initialRetryDelay * Math.pow(2, numRetries), maxRetryDelay);\n // Apply some jitter, take up to at most 25 percent of the retry time.\n const jitter = 1 - Math.random() * 0.25;\n return sleepSeconds * jitter * 1000;\n }\n getUserAgent() {\n return `${this.constructor.name}/JS ${VERSION}`;\n }\n}\nexport class AbstractPage {\n constructor(client, response, body, options) {\n _AbstractPage_client.set(this, void 0);\n __classPrivateFieldSet(this, _AbstractPage_client, client, \"f\");\n this.options = options;\n this.response = response;\n this.body = body;\n }\n hasNextPage() {\n const items = this.getPaginatedItems();\n if (!items.length)\n return false;\n return this.nextPageInfo() != null;\n }\n async getNextPage() {\n const nextInfo = this.nextPageInfo();\n if (!nextInfo) {\n throw new OpenAIError('No next page expected; please check `.hasNextPage()` before calling `.getNextPage()`.');\n }\n const nextOptions = { ...this.options };\n if ('params' in nextInfo && typeof nextOptions.query === 'object') {\n nextOptions.query = { ...nextOptions.query, ...nextInfo.params };\n }\n else if ('url' in nextInfo) {\n const params = [...Object.entries(nextOptions.query || {}), ...nextInfo.url.searchParams.entries()];\n for (const [key, value] of params) {\n nextInfo.url.searchParams.set(key, value);\n }\n nextOptions.query = undefined;\n nextOptions.path = nextInfo.url.toString();\n }\n return await __classPrivateFieldGet(this, _AbstractPage_client, \"f\").requestAPIList(this.constructor, nextOptions);\n }\n async *iterPages() {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let page = this;\n yield page;\n while (page.hasNextPage()) {\n page = await page.getNextPage();\n yield page;\n }\n }\n async *[(_AbstractPage_client = new WeakMap(), Symbol.asyncIterator)]() {\n for await (const page of this.iterPages()) {\n for (const item of page.getPaginatedItems()) {\n yield item;\n }\n }\n }\n}\n/**\n * This subclass of Promise will resolve to an instantiated Page once the request completes.\n *\n * It also implements AsyncIterable to allow auto-paginating iteration on an unawaited list call, eg:\n *\n * for await (const item of client.items.list()) {\n * console.log(item)\n * }\n */\nexport class PagePromise extends APIPromise {\n constructor(client, request, Page) {\n super(request, async (props) => new Page(client, props.response, await defaultParseResponse(props), props.options));\n }\n /**\n * Allow auto-paginating iteration on an unawaited list call, eg:\n *\n * for await (const item of client.items.list()) {\n * console.log(item)\n * }\n */\n async *[Symbol.asyncIterator]() {\n const page = await this;\n for await (const item of page) {\n yield item;\n }\n }\n}\nexport const createResponseHeaders = (headers) => {\n return new Proxy(Object.fromEntries(\n // @ts-ignore\n headers.entries()), {\n get(target, name) {\n const key = name.toString();\n return target[key.toLowerCase()] || target[key];\n },\n });\n};\n// This is required so that we can determine if a given object matches the RequestOptions\n// type at runtime. While this requires duplication, it is enforced by the TypeScript\n// compiler such that any missing / extraneous keys will cause an error.\nconst requestOptionsKeys = {\n method: true,\n path: true,\n query: true,\n body: true,\n headers: true,\n maxRetries: true,\n stream: true,\n timeout: true,\n httpAgent: true,\n signal: true,\n idempotencyKey: true,\n __metadata: true,\n __binaryRequest: true,\n __binaryResponse: true,\n __streamClass: true,\n};\nexport const isRequestOptions = (obj) => {\n return (typeof obj === 'object' &&\n obj !== null &&\n !isEmptyObj(obj) &&\n Object.keys(obj).every((k) => hasOwn(requestOptionsKeys, k)));\n};\nconst getPlatformProperties = () => {\n if (typeof Deno !== 'undefined' && Deno.build != null) {\n return {\n 'X-Stainless-Lang': 'js',\n 'X-Stainless-Package-Version': VERSION,\n 'X-Stainless-OS': normalizePlatform(Deno.build.os),\n 'X-Stainless-Arch': normalizeArch(Deno.build.arch),\n 'X-Stainless-Runtime': 'deno',\n 'X-Stainless-Runtime-Version': typeof Deno.version === 'string' ? Deno.version : Deno.version?.deno ?? 'unknown',\n };\n }\n if (typeof EdgeRuntime !== 'undefined') {\n return {\n 'X-Stainless-Lang': 'js',\n 'X-Stainless-Package-Version': VERSION,\n 'X-Stainless-OS': 'Unknown',\n 'X-Stainless-Arch': `other:${EdgeRuntime}`,\n 'X-Stainless-Runtime': 'edge',\n 'X-Stainless-Runtime-Version': process.version,\n };\n }\n // Check if Node.js\n if (Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]') {\n return {\n 'X-Stainless-Lang': 'js',\n 'X-Stainless-Package-Version': VERSION,\n 'X-Stainless-OS': normalizePlatform(process.platform),\n 'X-Stainless-Arch': normalizeArch(process.arch),\n 'X-Stainless-Runtime': 'node',\n 'X-Stainless-Runtime-Version': process.version,\n };\n }\n const browserInfo = getBrowserInfo();\n if (browserInfo) {\n return {\n 'X-Stainless-Lang': 'js',\n 'X-Stainless-Package-Version': VERSION,\n 'X-Stainless-OS': 'Unknown',\n 'X-Stainless-Arch': 'unknown',\n 'X-Stainless-Runtime': `browser:${browserInfo.browser}`,\n 'X-Stainless-Runtime-Version': browserInfo.version,\n };\n }\n // TODO add support for Cloudflare workers, etc.\n return {\n 'X-Stainless-Lang': 'js',\n 'X-Stainless-Package-Version': VERSION,\n 'X-Stainless-OS': 'Unknown',\n 'X-Stainless-Arch': 'unknown',\n 'X-Stainless-Runtime': 'unknown',\n 'X-Stainless-Runtime-Version': 'unknown',\n };\n};\n// Note: modified from https://github.com/JS-DevTools/host-environment/blob/b1ab79ecde37db5d6e163c050e54fe7d287d7c92/src/isomorphic.browser.ts\nfunction getBrowserInfo() {\n if (typeof navigator === 'undefined' || !navigator) {\n return null;\n }\n // NOTE: The order matters here!\n const browserPatterns = [\n { key: 'edge', pattern: /Edge(?:\\W+(\\d+)\\.(\\d+)(?:\\.(\\d+))?)?/ },\n { key: 'ie', pattern: /MSIE(?:\\W+(\\d+)\\.(\\d+)(?:\\.(\\d+))?)?/ },\n { key: 'ie', pattern: /Trident(?:.*rv\\:(\\d+)\\.(\\d+)(?:\\.(\\d+))?)?/ },\n { key: 'chrome', pattern: /Chrome(?:\\W+(\\d+)\\.(\\d+)(?:\\.(\\d+))?)?/ },\n { key: 'firefox', pattern: /Firefox(?:\\W+(\\d+)\\.(\\d+)(?:\\.(\\d+))?)?/ },\n { key: 'safari', pattern: /(?:Version\\W+(\\d+)\\.(\\d+)(?:\\.(\\d+))?)?(?:\\W+Mobile\\S*)?\\W+Safari/ },\n ];\n // Find the FIRST matching browser\n for (const { key, pattern } of browserPatterns) {\n const match = pattern.exec(navigator.userAgent);\n if (match) {\n const major = match[1] || 0;\n const minor = match[2] || 0;\n const patch = match[3] || 0;\n return { browser: key, version: `${major}.${minor}.${patch}` };\n }\n }\n return null;\n}\nconst normalizeArch = (arch) => {\n // Node docs:\n // - https://nodejs.org/api/process.html#processarch\n // Deno docs:\n // - https://doc.deno.land/deno/stable/~/Deno.build\n if (arch === 'x32')\n return 'x32';\n if (arch === 'x86_64' || arch === 'x64')\n return 'x64';\n if (arch === 'arm')\n return 'arm';\n if (arch === 'aarch64' || arch === 'arm64')\n return 'arm64';\n if (arch)\n return `other:${arch}`;\n return 'unknown';\n};\nconst normalizePlatform = (platform) => {\n // Node platforms:\n // - https://nodejs.org/api/process.html#processplatform\n // Deno platforms:\n // - https://doc.deno.land/deno/stable/~/Deno.build\n // - https://github.com/denoland/deno/issues/14799\n platform = platform.toLowerCase();\n // NOTE: this iOS check is untested and may not work\n // Node does not work natively on IOS, there is a fork at\n // https://github.com/nodejs-mobile/nodejs-mobile\n // however it is unknown at the time of writing how to detect if it is running\n if (platform.includes('ios'))\n return 'iOS';\n if (platform === 'android')\n return 'Android';\n if (platform === 'darwin')\n return 'MacOS';\n if (platform === 'win32')\n return 'Windows';\n if (platform === 'freebsd')\n return 'FreeBSD';\n if (platform === 'openbsd')\n return 'OpenBSD';\n if (platform === 'linux')\n return 'Linux';\n if (platform)\n return `Other:${platform}`;\n return 'Unknown';\n};\nlet _platformHeaders;\nconst getPlatformHeaders = () => {\n return (_platformHeaders ?? (_platformHeaders = getPlatformProperties()));\n};\nexport const safeJSON = (text) => {\n try {\n return JSON.parse(text);\n }\n catch (err) {\n return undefined;\n }\n};\n// https://url.spec.whatwg.org/#url-scheme-string\nconst startsWithSchemeRegexp = /^[a-z][a-z0-9+.-]*:/i;\nconst isAbsoluteURL = (url) => {\n return startsWithSchemeRegexp.test(url);\n};\nexport const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));\nconst validatePositiveInteger = (name, n) => {\n if (typeof n !== 'number' || !Number.isInteger(n)) {\n throw new OpenAIError(`${name} must be an integer`);\n }\n if (n < 0) {\n throw new OpenAIError(`${name} must be a positive integer`);\n }\n return n;\n};\nexport const castToError = (err) => {\n if (err instanceof Error)\n return err;\n if (typeof err === 'object' && err !== null) {\n try {\n return new Error(JSON.stringify(err));\n }\n catch { }\n }\n return new Error(err);\n};\nexport const ensurePresent = (value) => {\n if (value == null)\n throw new OpenAIError(`Expected a value to be given but received ${value} instead.`);\n return value;\n};\n/**\n * Read an environment variable.\n *\n * Trims beginning and trailing whitespace.\n *\n * Will return undefined if the environment variable doesn't exist or cannot be accessed.\n */\nexport const readEnv = (env) => {\n if (typeof process !== 'undefined') {\n return process.env?.[env]?.trim() ?? undefined;\n }\n if (typeof Deno !== 'undefined') {\n return Deno.env?.get?.(env)?.trim();\n }\n return undefined;\n};\nexport const coerceInteger = (value) => {\n if (typeof value === 'number')\n return Math.round(value);\n if (typeof value === 'string')\n return parseInt(value, 10);\n throw new OpenAIError(`Could not coerce ${value} (type: ${typeof value}) into a number`);\n};\nexport const coerceFloat = (value) => {\n if (typeof value === 'number')\n return value;\n if (typeof value === 'string')\n return parseFloat(value);\n throw new OpenAIError(`Could not coerce ${value} (type: ${typeof value}) into a number`);\n};\nexport const coerceBoolean = (value) => {\n if (typeof value === 'boolean')\n return value;\n if (typeof value === 'string')\n return value === 'true';\n return Boolean(value);\n};\nexport const maybeCoerceInteger = (value) => {\n if (value === undefined) {\n return undefined;\n }\n return coerceInteger(value);\n};\nexport const maybeCoerceFloat = (value) => {\n if (value === undefined) {\n return undefined;\n }\n return coerceFloat(value);\n};\nexport const maybeCoerceBoolean = (value) => {\n if (value === undefined) {\n return undefined;\n }\n return coerceBoolean(value);\n};\n// https://stackoverflow.com/a/34491287\nexport function isEmptyObj(obj) {\n if (!obj)\n return true;\n for (const _k in obj)\n return false;\n return true;\n}\n// https://eslint.org/docs/latest/rules/no-prototype-builtins\nexport function hasOwn(obj, key) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n/**\n * Copies headers from \"newHeaders\" onto \"targetHeaders\",\n * using lower-case for all properties,\n * ignoring any keys with undefined values,\n * and deleting any keys with null values.\n */\nfunction applyHeadersMut(targetHeaders, newHeaders) {\n for (const k in newHeaders) {\n if (!hasOwn(newHeaders, k))\n continue;\n const lowerKey = k.toLowerCase();\n if (!lowerKey)\n continue;\n const val = newHeaders[k];\n if (val === null) {\n delete targetHeaders[lowerKey];\n }\n else if (val !== undefined) {\n targetHeaders[lowerKey] = val;\n }\n }\n}\nconst SENSITIVE_HEADERS = new Set(['authorization', 'api-key']);\nexport function debug(action, ...args) {\n if (typeof process !== 'undefined' && process?.env?.['DEBUG'] === 'true') {\n const modifiedArgs = args.map((arg) => {\n if (!arg) {\n return arg;\n }\n // Check for sensitive headers in request body 'headers' object\n if (arg['headers']) {\n // clone so we don't mutate\n const modifiedArg = { ...arg, headers: { ...arg['headers'] } };\n for (const header in arg['headers']) {\n if (SENSITIVE_HEADERS.has(header.toLowerCase())) {\n modifiedArg['headers'][header] = 'REDACTED';\n }\n }\n return modifiedArg;\n }\n let modifiedArg = null;\n // Check for sensitive headers in headers object\n for (const header in arg) {\n if (SENSITIVE_HEADERS.has(header.toLowerCase())) {\n // avoid making a copy until we need to\n modifiedArg ?? (modifiedArg = { ...arg });\n modifiedArg[header] = 'REDACTED';\n }\n }\n return modifiedArg ?? arg;\n });\n console.log(`OpenAI:DEBUG:${action}`, ...modifiedArgs);\n }\n}\n/**\n * https://stackoverflow.com/a/2117523\n */\nconst uuid4 = () => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n};\nexport const isRunningInBrowser = () => {\n return (\n // @ts-ignore\n typeof window !== 'undefined' &&\n // @ts-ignore\n typeof window.document !== 'undefined' &&\n // @ts-ignore\n typeof navigator !== 'undefined');\n};\nexport const isHeadersProtocol = (headers) => {\n return typeof headers?.get === 'function';\n};\nexport const getRequiredHeader = (headers, header) => {\n const foundHeader = getHeader(headers, header);\n if (foundHeader === undefined) {\n throw new Error(`Could not find ${header} header`);\n }\n return foundHeader;\n};\nexport const getHeader = (headers, header) => {\n const lowerCasedHeader = header.toLowerCase();\n if (isHeadersProtocol(headers)) {\n // to deal with the case where the header looks like Stainless-Event-Id\n const intercapsHeader = header[0]?.toUpperCase() +\n header.substring(1).replace(/([^\\w])(\\w)/g, (_m, g1, g2) => g1 + g2.toUpperCase());\n for (const key of [header, lowerCasedHeader, header.toUpperCase(), intercapsHeader]) {\n const value = headers.get(key);\n if (value) {\n return value;\n }\n }\n }\n for (const [key, value] of Object.entries(headers)) {\n if (key.toLowerCase() === lowerCasedHeader) {\n if (Array.isArray(value)) {\n if (value.length <= 1)\n return value[0];\n console.warn(`Received ${value.length} entries for the ${header} header, using the first entry.`);\n return value[0];\n }\n return value;\n }\n }\n return undefined;\n};\n/**\n * Encodes a string to Base64 format.\n */\nexport const toBase64 = (str) => {\n if (!str)\n return '';\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(str).toString('base64');\n }\n if (typeof btoa !== 'undefined') {\n return btoa(str);\n }\n throw new OpenAIError('Cannot generate b64 string; Expected `Buffer` or `btoa` to be defined');\n};\n/**\n * Converts a Base64 encoded string to a Float32Array.\n * @param base64Str - The Base64 encoded string.\n * @returns An Array of numbers interpreted as Float32 values.\n */\nexport const toFloat32Array = (base64Str) => {\n if (typeof Buffer !== 'undefined') {\n // for Node.js environment\n const buf = Buffer.from(base64Str, 'base64');\n return Array.from(new Float32Array(buf.buffer, buf.byteOffset, buf.length / Float32Array.BYTES_PER_ELEMENT));\n }\n else {\n // for legacy web platform APIs\n const binaryStr = atob(base64Str);\n const len = binaryStr.length;\n const bytes = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n bytes[i] = binaryStr.charCodeAt(i);\n }\n return Array.from(new Float32Array(bytes.buffer));\n }\n};\nexport function isObj(obj) {\n return obj != null && typeof obj === 'object' && !Array.isArray(obj);\n}\n//# sourceMappingURL=core.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { AbstractPage } from \"./core.mjs\";\n/**\n * Note: no pagination actually occurs yet, this is for forwards-compatibility.\n */\nexport class Page extends AbstractPage {\n constructor(client, response, body, options) {\n super(client, response, body, options);\n this.data = body.data || [];\n this.object = body.object;\n }\n getPaginatedItems() {\n return this.data ?? [];\n }\n // @deprecated Please use `nextPageInfo()` instead\n /**\n * This page represents a response that isn't actually paginated at the API level\n * so there will never be any next page params.\n */\n nextPageParams() {\n return null;\n }\n nextPageInfo() {\n return null;\n }\n}\nexport class CursorPage extends AbstractPage {\n constructor(client, response, body, options) {\n super(client, response, body, options);\n this.data = body.data || [];\n this.has_more = body.has_more || false;\n }\n getPaginatedItems() {\n return this.data ?? [];\n }\n hasNextPage() {\n if (this.has_more === false) {\n return false;\n }\n return super.hasNextPage();\n }\n // @deprecated Please use `nextPageInfo()` instead\n nextPageParams() {\n const info = this.nextPageInfo();\n if (!info)\n return null;\n if ('params' in info)\n return info.params;\n const params = Object.fromEntries(info.url.searchParams);\n if (!Object.keys(params).length)\n return null;\n return params;\n }\n nextPageInfo() {\n const data = this.getPaginatedItems();\n if (!data.length) {\n return null;\n }\n const id = data[data.length - 1]?.id;\n if (!id) {\n return null;\n }\n return { params: { after: id } };\n }\n}\n//# sourceMappingURL=pagination.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nexport class APIResource {\n constructor(client) {\n this._client = client;\n }\n}\n//# sourceMappingURL=resource.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../core.mjs\";\nimport { ChatCompletionStoreMessagesPage } from \"./completions.mjs\";\nexport class Messages extends APIResource {\n list(completionId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list(completionId, {}, query);\n }\n return this._client.getAPIList(`/chat/completions/${completionId}/messages`, ChatCompletionStoreMessagesPage, { query, ...options });\n }\n}\nexport { ChatCompletionStoreMessagesPage };\n//# sourceMappingURL=messages.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../core.mjs\";\nimport * as MessagesAPI from \"./messages.mjs\";\nimport { Messages } from \"./messages.mjs\";\nimport { CursorPage } from \"../../../pagination.mjs\";\nexport class Completions extends APIResource {\n constructor() {\n super(...arguments);\n this.messages = new MessagesAPI.Messages(this._client);\n }\n create(body, options) {\n return this._client.post('/chat/completions', { body, ...options, stream: body.stream ?? false });\n }\n /**\n * Get a stored chat completion. Only Chat Completions that have been created with\n * the `store` parameter set to `true` will be returned.\n *\n * @example\n * ```ts\n * const chatCompletion =\n * await client.chat.completions.retrieve('completion_id');\n * ```\n */\n retrieve(completionId, options) {\n return this._client.get(`/chat/completions/${completionId}`, options);\n }\n /**\n * Modify a stored chat completion. Only Chat Completions that have been created\n * with the `store` parameter set to `true` can be modified. Currently, the only\n * supported modification is to update the `metadata` field.\n *\n * @example\n * ```ts\n * const chatCompletion = await client.chat.completions.update(\n * 'completion_id',\n * { metadata: { foo: 'string' } },\n * );\n * ```\n */\n update(completionId, body, options) {\n return this._client.post(`/chat/completions/${completionId}`, { body, ...options });\n }\n list(query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list({}, query);\n }\n return this._client.getAPIList('/chat/completions', ChatCompletionsPage, { query, ...options });\n }\n /**\n * Delete a stored chat completion. Only Chat Completions that have been created\n * with the `store` parameter set to `true` can be deleted.\n *\n * @example\n * ```ts\n * const chatCompletionDeleted =\n * await client.chat.completions.del('completion_id');\n * ```\n */\n del(completionId, options) {\n return this._client.delete(`/chat/completions/${completionId}`, options);\n }\n}\nexport class ChatCompletionsPage extends CursorPage {\n}\nexport class ChatCompletionStoreMessagesPage extends CursorPage {\n}\nCompletions.ChatCompletionsPage = ChatCompletionsPage;\nCompletions.Messages = Messages;\n//# sourceMappingURL=completions.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport * as CompletionsAPI from \"./completions/completions.mjs\";\nimport { ChatCompletionsPage, Completions, } from \"./completions/completions.mjs\";\nexport class Chat extends APIResource {\n constructor() {\n super(...arguments);\n this.completions = new CompletionsAPI.Completions(this._client);\n }\n}\nChat.Completions = Completions;\nChat.ChatCompletionsPage = ChatCompletionsPage;\n//# sourceMappingURL=chat.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nexport class Speech extends APIResource {\n /**\n * Generates audio from the input text.\n *\n * @example\n * ```ts\n * const speech = await client.audio.speech.create({\n * input: 'input',\n * model: 'string',\n * voice: 'ash',\n * });\n *\n * const content = await speech.blob();\n * console.log(content);\n * ```\n */\n create(body, options) {\n return this._client.post('/audio/speech', {\n body,\n ...options,\n headers: { Accept: 'application/octet-stream', ...options?.headers },\n __binaryResponse: true,\n });\n }\n}\n//# sourceMappingURL=speech.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport * as Core from \"../../core.mjs\";\nexport class Transcriptions extends APIResource {\n create(body, options) {\n return this._client.post('/audio/transcriptions', Core.multipartFormRequestOptions({\n body,\n ...options,\n stream: body.stream ?? false,\n __metadata: { model: body.model },\n }));\n }\n}\n//# sourceMappingURL=transcriptions.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport * as Core from \"../../core.mjs\";\nexport class Translations extends APIResource {\n create(body, options) {\n return this._client.post('/audio/translations', Core.multipartFormRequestOptions({ body, ...options, __metadata: { model: body.model } }));\n }\n}\n//# sourceMappingURL=translations.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport * as SpeechAPI from \"./speech.mjs\";\nimport { Speech } from \"./speech.mjs\";\nimport * as TranscriptionsAPI from \"./transcriptions.mjs\";\nimport { Transcriptions, } from \"./transcriptions.mjs\";\nimport * as TranslationsAPI from \"./translations.mjs\";\nimport { Translations, } from \"./translations.mjs\";\nexport class Audio extends APIResource {\n constructor() {\n super(...arguments);\n this.transcriptions = new TranscriptionsAPI.Transcriptions(this._client);\n this.translations = new TranslationsAPI.Translations(this._client);\n this.speech = new SpeechAPI.Speech(this._client);\n }\n}\nAudio.Transcriptions = Transcriptions;\nAudio.Translations = Translations;\nAudio.Speech = Speech;\n//# sourceMappingURL=audio.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../resource.mjs\";\nimport { isRequestOptions } from \"../core.mjs\";\nimport { CursorPage } from \"../pagination.mjs\";\nexport class Batches extends APIResource {\n /**\n * Creates and executes a batch from an uploaded file of requests\n */\n create(body, options) {\n return this._client.post('/batches', { body, ...options });\n }\n /**\n * Retrieves a batch.\n */\n retrieve(batchId, options) {\n return this._client.get(`/batches/${batchId}`, options);\n }\n list(query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list({}, query);\n }\n return this._client.getAPIList('/batches', BatchesPage, { query, ...options });\n }\n /**\n * Cancels an in-progress batch. The batch will be in status `cancelling` for up to\n * 10 minutes, before changing to `cancelled`, where it will have partial results\n * (if any) available in the output file.\n */\n cancel(batchId, options) {\n return this._client.post(`/batches/${batchId}/cancel`, options);\n }\n}\nexport class BatchesPage extends CursorPage {\n}\nBatches.BatchesPage = BatchesPage;\n//# sourceMappingURL=batches.mjs.map","var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n};\nvar __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar _EventStream_instances, _EventStream_connectedPromise, _EventStream_resolveConnectedPromise, _EventStream_rejectConnectedPromise, _EventStream_endPromise, _EventStream_resolveEndPromise, _EventStream_rejectEndPromise, _EventStream_listeners, _EventStream_ended, _EventStream_errored, _EventStream_aborted, _EventStream_catchingPromiseCreated, _EventStream_handleError;\nimport { APIUserAbortError, OpenAIError } from \"../error.mjs\";\nexport class EventStream {\n constructor() {\n _EventStream_instances.add(this);\n this.controller = new AbortController();\n _EventStream_connectedPromise.set(this, void 0);\n _EventStream_resolveConnectedPromise.set(this, () => { });\n _EventStream_rejectConnectedPromise.set(this, () => { });\n _EventStream_endPromise.set(this, void 0);\n _EventStream_resolveEndPromise.set(this, () => { });\n _EventStream_rejectEndPromise.set(this, () => { });\n _EventStream_listeners.set(this, {});\n _EventStream_ended.set(this, false);\n _EventStream_errored.set(this, false);\n _EventStream_aborted.set(this, false);\n _EventStream_catchingPromiseCreated.set(this, false);\n __classPrivateFieldSet(this, _EventStream_connectedPromise, new Promise((resolve, reject) => {\n __classPrivateFieldSet(this, _EventStream_resolveConnectedPromise, resolve, \"f\");\n __classPrivateFieldSet(this, _EventStream_rejectConnectedPromise, reject, \"f\");\n }), \"f\");\n __classPrivateFieldSet(this, _EventStream_endPromise, new Promise((resolve, reject) => {\n __classPrivateFieldSet(this, _EventStream_resolveEndPromise, resolve, \"f\");\n __classPrivateFieldSet(this, _EventStream_rejectEndPromise, reject, \"f\");\n }), \"f\");\n // Don't let these promises cause unhandled rejection errors.\n // we will manually cause an unhandled rejection error later\n // if the user hasn't registered any error listener or called\n // any promise-returning method.\n __classPrivateFieldGet(this, _EventStream_connectedPromise, \"f\").catch(() => { });\n __classPrivateFieldGet(this, _EventStream_endPromise, \"f\").catch(() => { });\n }\n _run(executor) {\n // Unfortunately if we call `executor()` immediately we get runtime errors about\n // references to `this` before the `super()` constructor call returns.\n setTimeout(() => {\n executor().then(() => {\n this._emitFinal();\n this._emit('end');\n }, __classPrivateFieldGet(this, _EventStream_instances, \"m\", _EventStream_handleError).bind(this));\n }, 0);\n }\n _connected() {\n if (this.ended)\n return;\n __classPrivateFieldGet(this, _EventStream_resolveConnectedPromise, \"f\").call(this);\n this._emit('connect');\n }\n get ended() {\n return __classPrivateFieldGet(this, _EventStream_ended, \"f\");\n }\n get errored() {\n return __classPrivateFieldGet(this, _EventStream_errored, \"f\");\n }\n get aborted() {\n return __classPrivateFieldGet(this, _EventStream_aborted, \"f\");\n }\n abort() {\n this.controller.abort();\n }\n /**\n * Adds the listener function to the end of the listeners array for the event.\n * No checks are made to see if the listener has already been added. Multiple calls passing\n * the same combination of event and listener will result in the listener being added, and\n * called, multiple times.\n * @returns this ChatCompletionStream, so that calls can be chained\n */\n on(event, listener) {\n const listeners = __classPrivateFieldGet(this, _EventStream_listeners, \"f\")[event] || (__classPrivateFieldGet(this, _EventStream_listeners, \"f\")[event] = []);\n listeners.push({ listener });\n return this;\n }\n /**\n * Removes the specified listener from the listener array for the event.\n * off() will remove, at most, one instance of a listener from the listener array. If any single\n * listener has been added multiple times to the listener array for the specified event, then\n * off() must be called multiple times to remove each instance.\n * @returns this ChatCompletionStream, so that calls can be chained\n */\n off(event, listener) {\n const listeners = __classPrivateFieldGet(this, _EventStream_listeners, \"f\")[event];\n if (!listeners)\n return this;\n const index = listeners.findIndex((l) => l.listener === listener);\n if (index >= 0)\n listeners.splice(index, 1);\n return this;\n }\n /**\n * Adds a one-time listener function for the event. The next time the event is triggered,\n * this listener is removed and then invoked.\n * @returns this ChatCompletionStream, so that calls can be chained\n */\n once(event, listener) {\n const listeners = __classPrivateFieldGet(this, _EventStream_listeners, \"f\")[event] || (__classPrivateFieldGet(this, _EventStream_listeners, \"f\")[event] = []);\n listeners.push({ listener, once: true });\n return this;\n }\n /**\n * This is similar to `.once()`, but returns a Promise that resolves the next time\n * the event is triggered, instead of calling a listener callback.\n * @returns a Promise that resolves the next time given event is triggered,\n * or rejects if an error is emitted. (If you request the 'error' event,\n * returns a promise that resolves with the error).\n *\n * Example:\n *\n * const message = await stream.emitted('message') // rejects if the stream errors\n */\n emitted(event) {\n return new Promise((resolve, reject) => {\n __classPrivateFieldSet(this, _EventStream_catchingPromiseCreated, true, \"f\");\n if (event !== 'error')\n this.once('error', reject);\n this.once(event, resolve);\n });\n }\n async done() {\n __classPrivateFieldSet(this, _EventStream_catchingPromiseCreated, true, \"f\");\n await __classPrivateFieldGet(this, _EventStream_endPromise, \"f\");\n }\n _emit(event, ...args) {\n // make sure we don't emit any events after end\n if (__classPrivateFieldGet(this, _EventStream_ended, \"f\")) {\n return;\n }\n if (event === 'end') {\n __classPrivateFieldSet(this, _EventStream_ended, true, \"f\");\n __classPrivateFieldGet(this, _EventStream_resolveEndPromise, \"f\").call(this);\n }\n const listeners = __classPrivateFieldGet(this, _EventStream_listeners, \"f\")[event];\n if (listeners) {\n __classPrivateFieldGet(this, _EventStream_listeners, \"f\")[event] = listeners.filter((l) => !l.once);\n listeners.forEach(({ listener }) => listener(...args));\n }\n if (event === 'abort') {\n const error = args[0];\n if (!__classPrivateFieldGet(this, _EventStream_catchingPromiseCreated, \"f\") && !listeners?.length) {\n Promise.reject(error);\n }\n __classPrivateFieldGet(this, _EventStream_rejectConnectedPromise, \"f\").call(this, error);\n __classPrivateFieldGet(this, _EventStream_rejectEndPromise, \"f\").call(this, error);\n this._emit('end');\n return;\n }\n if (event === 'error') {\n // NOTE: _emit('error', error) should only be called from #handleError().\n const error = args[0];\n if (!__classPrivateFieldGet(this, _EventStream_catchingPromiseCreated, \"f\") && !listeners?.length) {\n // Trigger an unhandled rejection if the user hasn't registered any error handlers.\n // If you are seeing stack traces here, make sure to handle errors via either:\n // - runner.on('error', () => ...)\n // - await runner.done()\n // - await runner.finalChatCompletion()\n // - etc.\n Promise.reject(error);\n }\n __classPrivateFieldGet(this, _EventStream_rejectConnectedPromise, \"f\").call(this, error);\n __classPrivateFieldGet(this, _EventStream_rejectEndPromise, \"f\").call(this, error);\n this._emit('end');\n }\n }\n _emitFinal() { }\n}\n_EventStream_connectedPromise = new WeakMap(), _EventStream_resolveConnectedPromise = new WeakMap(), _EventStream_rejectConnectedPromise = new WeakMap(), _EventStream_endPromise = new WeakMap(), _EventStream_resolveEndPromise = new WeakMap(), _EventStream_rejectEndPromise = new WeakMap(), _EventStream_listeners = new WeakMap(), _EventStream_ended = new WeakMap(), _EventStream_errored = new WeakMap(), _EventStream_aborted = new WeakMap(), _EventStream_catchingPromiseCreated = new WeakMap(), _EventStream_instances = new WeakSet(), _EventStream_handleError = function _EventStream_handleError(error) {\n __classPrivateFieldSet(this, _EventStream_errored, true, \"f\");\n if (error instanceof Error && error.name === 'AbortError') {\n error = new APIUserAbortError();\n }\n if (error instanceof APIUserAbortError) {\n __classPrivateFieldSet(this, _EventStream_aborted, true, \"f\");\n return this._emit('abort', error);\n }\n if (error instanceof OpenAIError) {\n return this._emit('error', error);\n }\n if (error instanceof Error) {\n const openAIError = new OpenAIError(error.message);\n // @ts-ignore\n openAIError.cause = error;\n return this._emit('error', openAIError);\n }\n return this._emit('error', new OpenAIError(String(error)));\n};\n//# sourceMappingURL=EventStream.mjs.map","var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n};\nvar _AssistantStream_instances, _AssistantStream_events, _AssistantStream_runStepSnapshots, _AssistantStream_messageSnapshots, _AssistantStream_messageSnapshot, _AssistantStream_finalRun, _AssistantStream_currentContentIndex, _AssistantStream_currentContent, _AssistantStream_currentToolCallIndex, _AssistantStream_currentToolCall, _AssistantStream_currentEvent, _AssistantStream_currentRunSnapshot, _AssistantStream_currentRunStepSnapshot, _AssistantStream_addEvent, _AssistantStream_endRequest, _AssistantStream_handleMessage, _AssistantStream_handleRunStep, _AssistantStream_handleEvent, _AssistantStream_accumulateRunStep, _AssistantStream_accumulateMessage, _AssistantStream_accumulateContent, _AssistantStream_handleRun;\nimport * as Core from \"../core.mjs\";\nimport { Stream } from \"../streaming.mjs\";\nimport { APIUserAbortError, OpenAIError } from \"../error.mjs\";\nimport { EventStream } from \"./EventStream.mjs\";\nexport class AssistantStream extends EventStream {\n constructor() {\n super(...arguments);\n _AssistantStream_instances.add(this);\n //Track all events in a single list for reference\n _AssistantStream_events.set(this, []);\n //Used to accumulate deltas\n //We are accumulating many types so the value here is not strict\n _AssistantStream_runStepSnapshots.set(this, {});\n _AssistantStream_messageSnapshots.set(this, {});\n _AssistantStream_messageSnapshot.set(this, void 0);\n _AssistantStream_finalRun.set(this, void 0);\n _AssistantStream_currentContentIndex.set(this, void 0);\n _AssistantStream_currentContent.set(this, void 0);\n _AssistantStream_currentToolCallIndex.set(this, void 0);\n _AssistantStream_currentToolCall.set(this, void 0);\n //For current snapshot methods\n _AssistantStream_currentEvent.set(this, void 0);\n _AssistantStream_currentRunSnapshot.set(this, void 0);\n _AssistantStream_currentRunStepSnapshot.set(this, void 0);\n }\n [(_AssistantStream_events = new WeakMap(), _AssistantStream_runStepSnapshots = new WeakMap(), _AssistantStream_messageSnapshots = new WeakMap(), _AssistantStream_messageSnapshot = new WeakMap(), _AssistantStream_finalRun = new WeakMap(), _AssistantStream_currentContentIndex = new WeakMap(), _AssistantStream_currentContent = new WeakMap(), _AssistantStream_currentToolCallIndex = new WeakMap(), _AssistantStream_currentToolCall = new WeakMap(), _AssistantStream_currentEvent = new WeakMap(), _AssistantStream_currentRunSnapshot = new WeakMap(), _AssistantStream_currentRunStepSnapshot = new WeakMap(), _AssistantStream_instances = new WeakSet(), Symbol.asyncIterator)]() {\n const pushQueue = [];\n const readQueue = [];\n let done = false;\n //Catch all for passing along all events\n this.on('event', (event) => {\n const reader = readQueue.shift();\n if (reader) {\n reader.resolve(event);\n }\n else {\n pushQueue.push(event);\n }\n });\n this.on('end', () => {\n done = true;\n for (const reader of readQueue) {\n reader.resolve(undefined);\n }\n readQueue.length = 0;\n });\n this.on('abort', (err) => {\n done = true;\n for (const reader of readQueue) {\n reader.reject(err);\n }\n readQueue.length = 0;\n });\n this.on('error', (err) => {\n done = true;\n for (const reader of readQueue) {\n reader.reject(err);\n }\n readQueue.length = 0;\n });\n return {\n next: async () => {\n if (!pushQueue.length) {\n if (done) {\n return { value: undefined, done: true };\n }\n return new Promise((resolve, reject) => readQueue.push({ resolve, reject })).then((chunk) => (chunk ? { value: chunk, done: false } : { value: undefined, done: true }));\n }\n const chunk = pushQueue.shift();\n return { value: chunk, done: false };\n },\n return: async () => {\n this.abort();\n return { value: undefined, done: true };\n },\n };\n }\n static fromReadableStream(stream) {\n const runner = new AssistantStream();\n runner._run(() => runner._fromReadableStream(stream));\n return runner;\n }\n async _fromReadableStream(readableStream, options) {\n const signal = options?.signal;\n if (signal) {\n if (signal.aborted)\n this.controller.abort();\n signal.addEventListener('abort', () => this.controller.abort());\n }\n this._connected();\n const stream = Stream.fromReadableStream(readableStream, this.controller);\n for await (const event of stream) {\n __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_addEvent).call(this, event);\n }\n if (stream.controller.signal?.aborted) {\n throw new APIUserAbortError();\n }\n return this._addRun(__classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_endRequest).call(this));\n }\n toReadableStream() {\n const stream = new Stream(this[Symbol.asyncIterator].bind(this), this.controller);\n return stream.toReadableStream();\n }\n static createToolAssistantStream(threadId, runId, runs, params, options) {\n const runner = new AssistantStream();\n runner._run(() => runner._runToolAssistantStream(threadId, runId, runs, params, {\n ...options,\n headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' },\n }));\n return runner;\n }\n async _createToolAssistantStream(run, threadId, runId, params, options) {\n const signal = options?.signal;\n if (signal) {\n if (signal.aborted)\n this.controller.abort();\n signal.addEventListener('abort', () => this.controller.abort());\n }\n const body = { ...params, stream: true };\n const stream = await run.submitToolOutputs(threadId, runId, body, {\n ...options,\n signal: this.controller.signal,\n });\n this._connected();\n for await (const event of stream) {\n __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_addEvent).call(this, event);\n }\n if (stream.controller.signal?.aborted) {\n throw new APIUserAbortError();\n }\n return this._addRun(__classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_endRequest).call(this));\n }\n static createThreadAssistantStream(params, thread, options) {\n const runner = new AssistantStream();\n runner._run(() => runner._threadAssistantStream(params, thread, {\n ...options,\n headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' },\n }));\n return runner;\n }\n static createAssistantStream(threadId, runs, params, options) {\n const runner = new AssistantStream();\n runner._run(() => runner._runAssistantStream(threadId, runs, params, {\n ...options,\n headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' },\n }));\n return runner;\n }\n currentEvent() {\n return __classPrivateFieldGet(this, _AssistantStream_currentEvent, \"f\");\n }\n currentRun() {\n return __classPrivateFieldGet(this, _AssistantStream_currentRunSnapshot, \"f\");\n }\n currentMessageSnapshot() {\n return __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, \"f\");\n }\n currentRunStepSnapshot() {\n return __classPrivateFieldGet(this, _AssistantStream_currentRunStepSnapshot, \"f\");\n }\n async finalRunSteps() {\n await this.done();\n return Object.values(__classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, \"f\"));\n }\n async finalMessages() {\n await this.done();\n return Object.values(__classPrivateFieldGet(this, _AssistantStream_messageSnapshots, \"f\"));\n }\n async finalRun() {\n await this.done();\n if (!__classPrivateFieldGet(this, _AssistantStream_finalRun, \"f\"))\n throw Error('Final run was not received.');\n return __classPrivateFieldGet(this, _AssistantStream_finalRun, \"f\");\n }\n async _createThreadAssistantStream(thread, params, options) {\n const signal = options?.signal;\n if (signal) {\n if (signal.aborted)\n this.controller.abort();\n signal.addEventListener('abort', () => this.controller.abort());\n }\n const body = { ...params, stream: true };\n const stream = await thread.createAndRun(body, { ...options, signal: this.controller.signal });\n this._connected();\n for await (const event of stream) {\n __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_addEvent).call(this, event);\n }\n if (stream.controller.signal?.aborted) {\n throw new APIUserAbortError();\n }\n return this._addRun(__classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_endRequest).call(this));\n }\n async _createAssistantStream(run, threadId, params, options) {\n const signal = options?.signal;\n if (signal) {\n if (signal.aborted)\n this.controller.abort();\n signal.addEventListener('abort', () => this.controller.abort());\n }\n const body = { ...params, stream: true };\n const stream = await run.create(threadId, body, { ...options, signal: this.controller.signal });\n this._connected();\n for await (const event of stream) {\n __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_addEvent).call(this, event);\n }\n if (stream.controller.signal?.aborted) {\n throw new APIUserAbortError();\n }\n return this._addRun(__classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_endRequest).call(this));\n }\n static accumulateDelta(acc, delta) {\n for (const [key, deltaValue] of Object.entries(delta)) {\n if (!acc.hasOwnProperty(key)) {\n acc[key] = deltaValue;\n continue;\n }\n let accValue = acc[key];\n if (accValue === null || accValue === undefined) {\n acc[key] = deltaValue;\n continue;\n }\n // We don't accumulate these special properties\n if (key === 'index' || key === 'type') {\n acc[key] = deltaValue;\n continue;\n }\n // Type-specific accumulation logic\n if (typeof accValue === 'string' && typeof deltaValue === 'string') {\n accValue += deltaValue;\n }\n else if (typeof accValue === 'number' && typeof deltaValue === 'number') {\n accValue += deltaValue;\n }\n else if (Core.isObj(accValue) && Core.isObj(deltaValue)) {\n accValue = this.accumulateDelta(accValue, deltaValue);\n }\n else if (Array.isArray(accValue) && Array.isArray(deltaValue)) {\n if (accValue.every((x) => typeof x === 'string' || typeof x === 'number')) {\n accValue.push(...deltaValue); // Use spread syntax for efficient addition\n continue;\n }\n for (const deltaEntry of deltaValue) {\n if (!Core.isObj(deltaEntry)) {\n throw new Error(`Expected array delta entry to be an object but got: ${deltaEntry}`);\n }\n const index = deltaEntry['index'];\n if (index == null) {\n console.error(deltaEntry);\n throw new Error('Expected array delta entry to have an `index` property');\n }\n if (typeof index !== 'number') {\n throw new Error(`Expected array delta entry \\`index\\` property to be a number but got ${index}`);\n }\n const accEntry = accValue[index];\n if (accEntry == null) {\n accValue.push(deltaEntry);\n }\n else {\n accValue[index] = this.accumulateDelta(accEntry, deltaEntry);\n }\n }\n continue;\n }\n else {\n throw Error(`Unhandled record type: ${key}, deltaValue: ${deltaValue}, accValue: ${accValue}`);\n }\n acc[key] = accValue;\n }\n return acc;\n }\n _addRun(run) {\n return run;\n }\n async _threadAssistantStream(params, thread, options) {\n return await this._createThreadAssistantStream(thread, params, options);\n }\n async _runAssistantStream(threadId, runs, params, options) {\n return await this._createAssistantStream(runs, threadId, params, options);\n }\n async _runToolAssistantStream(threadId, runId, runs, params, options) {\n return await this._createToolAssistantStream(runs, threadId, runId, params, options);\n }\n}\n_AssistantStream_addEvent = function _AssistantStream_addEvent(event) {\n if (this.ended)\n return;\n __classPrivateFieldSet(this, _AssistantStream_currentEvent, event, \"f\");\n __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_handleEvent).call(this, event);\n switch (event.event) {\n case 'thread.created':\n //No action on this event.\n break;\n case 'thread.run.created':\n case 'thread.run.queued':\n case 'thread.run.in_progress':\n case 'thread.run.requires_action':\n case 'thread.run.completed':\n case 'thread.run.incomplete':\n case 'thread.run.failed':\n case 'thread.run.cancelling':\n case 'thread.run.cancelled':\n case 'thread.run.expired':\n __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_handleRun).call(this, event);\n break;\n case 'thread.run.step.created':\n case 'thread.run.step.in_progress':\n case 'thread.run.step.delta':\n case 'thread.run.step.completed':\n case 'thread.run.step.failed':\n case 'thread.run.step.cancelled':\n case 'thread.run.step.expired':\n __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_handleRunStep).call(this, event);\n break;\n case 'thread.message.created':\n case 'thread.message.in_progress':\n case 'thread.message.delta':\n case 'thread.message.completed':\n case 'thread.message.incomplete':\n __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_handleMessage).call(this, event);\n break;\n case 'error':\n //This is included for completeness, but errors are processed in the SSE event processing so this should not occur\n throw new Error('Encountered an error event in event processing - errors should be processed earlier');\n default:\n assertNever(event);\n }\n}, _AssistantStream_endRequest = function _AssistantStream_endRequest() {\n if (this.ended) {\n throw new OpenAIError(`stream has ended, this shouldn't happen`);\n }\n if (!__classPrivateFieldGet(this, _AssistantStream_finalRun, \"f\"))\n throw Error('Final run has not been received');\n return __classPrivateFieldGet(this, _AssistantStream_finalRun, \"f\");\n}, _AssistantStream_handleMessage = function _AssistantStream_handleMessage(event) {\n const [accumulatedMessage, newContent] = __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_accumulateMessage).call(this, event, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, \"f\"));\n __classPrivateFieldSet(this, _AssistantStream_messageSnapshot, accumulatedMessage, \"f\");\n __classPrivateFieldGet(this, _AssistantStream_messageSnapshots, \"f\")[accumulatedMessage.id] = accumulatedMessage;\n for (const content of newContent) {\n const snapshotContent = accumulatedMessage.content[content.index];\n if (snapshotContent?.type == 'text') {\n this._emit('textCreated', snapshotContent.text);\n }\n }\n switch (event.event) {\n case 'thread.message.created':\n this._emit('messageCreated', event.data);\n break;\n case 'thread.message.in_progress':\n break;\n case 'thread.message.delta':\n this._emit('messageDelta', event.data.delta, accumulatedMessage);\n if (event.data.delta.content) {\n for (const content of event.data.delta.content) {\n //If it is text delta, emit a text delta event\n if (content.type == 'text' && content.text) {\n let textDelta = content.text;\n let snapshot = accumulatedMessage.content[content.index];\n if (snapshot && snapshot.type == 'text') {\n this._emit('textDelta', textDelta, snapshot.text);\n }\n else {\n throw Error('The snapshot associated with this text delta is not text or missing');\n }\n }\n if (content.index != __classPrivateFieldGet(this, _AssistantStream_currentContentIndex, \"f\")) {\n //See if we have in progress content\n if (__classPrivateFieldGet(this, _AssistantStream_currentContent, \"f\")) {\n switch (__classPrivateFieldGet(this, _AssistantStream_currentContent, \"f\").type) {\n case 'text':\n this._emit('textDone', __classPrivateFieldGet(this, _AssistantStream_currentContent, \"f\").text, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, \"f\"));\n break;\n case 'image_file':\n this._emit('imageFileDone', __classPrivateFieldGet(this, _AssistantStream_currentContent, \"f\").image_file, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, \"f\"));\n break;\n }\n }\n __classPrivateFieldSet(this, _AssistantStream_currentContentIndex, content.index, \"f\");\n }\n __classPrivateFieldSet(this, _AssistantStream_currentContent, accumulatedMessage.content[content.index], \"f\");\n }\n }\n break;\n case 'thread.message.completed':\n case 'thread.message.incomplete':\n //We emit the latest content we were working on on completion (including incomplete)\n if (__classPrivateFieldGet(this, _AssistantStream_currentContentIndex, \"f\") !== undefined) {\n const currentContent = event.data.content[__classPrivateFieldGet(this, _AssistantStream_currentContentIndex, \"f\")];\n if (currentContent) {\n switch (currentContent.type) {\n case 'image_file':\n this._emit('imageFileDone', currentContent.image_file, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, \"f\"));\n break;\n case 'text':\n this._emit('textDone', currentContent.text, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, \"f\"));\n break;\n }\n }\n }\n if (__classPrivateFieldGet(this, _AssistantStream_messageSnapshot, \"f\")) {\n this._emit('messageDone', event.data);\n }\n __classPrivateFieldSet(this, _AssistantStream_messageSnapshot, undefined, \"f\");\n }\n}, _AssistantStream_handleRunStep = function _AssistantStream_handleRunStep(event) {\n const accumulatedRunStep = __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_accumulateRunStep).call(this, event);\n __classPrivateFieldSet(this, _AssistantStream_currentRunStepSnapshot, accumulatedRunStep, \"f\");\n switch (event.event) {\n case 'thread.run.step.created':\n this._emit('runStepCreated', event.data);\n break;\n case 'thread.run.step.delta':\n const delta = event.data.delta;\n if (delta.step_details &&\n delta.step_details.type == 'tool_calls' &&\n delta.step_details.tool_calls &&\n accumulatedRunStep.step_details.type == 'tool_calls') {\n for (const toolCall of delta.step_details.tool_calls) {\n if (toolCall.index == __classPrivateFieldGet(this, _AssistantStream_currentToolCallIndex, \"f\")) {\n this._emit('toolCallDelta', toolCall, accumulatedRunStep.step_details.tool_calls[toolCall.index]);\n }\n else {\n if (__classPrivateFieldGet(this, _AssistantStream_currentToolCall, \"f\")) {\n this._emit('toolCallDone', __classPrivateFieldGet(this, _AssistantStream_currentToolCall, \"f\"));\n }\n __classPrivateFieldSet(this, _AssistantStream_currentToolCallIndex, toolCall.index, \"f\");\n __classPrivateFieldSet(this, _AssistantStream_currentToolCall, accumulatedRunStep.step_details.tool_calls[toolCall.index], \"f\");\n if (__classPrivateFieldGet(this, _AssistantStream_currentToolCall, \"f\"))\n this._emit('toolCallCreated', __classPrivateFieldGet(this, _AssistantStream_currentToolCall, \"f\"));\n }\n }\n }\n this._emit('runStepDelta', event.data.delta, accumulatedRunStep);\n break;\n case 'thread.run.step.completed':\n case 'thread.run.step.failed':\n case 'thread.run.step.cancelled':\n case 'thread.run.step.expired':\n __classPrivateFieldSet(this, _AssistantStream_currentRunStepSnapshot, undefined, \"f\");\n const details = event.data.step_details;\n if (details.type == 'tool_calls') {\n if (__classPrivateFieldGet(this, _AssistantStream_currentToolCall, \"f\")) {\n this._emit('toolCallDone', __classPrivateFieldGet(this, _AssistantStream_currentToolCall, \"f\"));\n __classPrivateFieldSet(this, _AssistantStream_currentToolCall, undefined, \"f\");\n }\n }\n this._emit('runStepDone', event.data, accumulatedRunStep);\n break;\n case 'thread.run.step.in_progress':\n break;\n }\n}, _AssistantStream_handleEvent = function _AssistantStream_handleEvent(event) {\n __classPrivateFieldGet(this, _AssistantStream_events, \"f\").push(event);\n this._emit('event', event);\n}, _AssistantStream_accumulateRunStep = function _AssistantStream_accumulateRunStep(event) {\n switch (event.event) {\n case 'thread.run.step.created':\n __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, \"f\")[event.data.id] = event.data;\n return event.data;\n case 'thread.run.step.delta':\n let snapshot = __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, \"f\")[event.data.id];\n if (!snapshot) {\n throw Error('Received a RunStepDelta before creation of a snapshot');\n }\n let data = event.data;\n if (data.delta) {\n const accumulated = AssistantStream.accumulateDelta(snapshot, data.delta);\n __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, \"f\")[event.data.id] = accumulated;\n }\n return __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, \"f\")[event.data.id];\n case 'thread.run.step.completed':\n case 'thread.run.step.failed':\n case 'thread.run.step.cancelled':\n case 'thread.run.step.expired':\n case 'thread.run.step.in_progress':\n __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, \"f\")[event.data.id] = event.data;\n break;\n }\n if (__classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, \"f\")[event.data.id])\n return __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, \"f\")[event.data.id];\n throw new Error('No snapshot available');\n}, _AssistantStream_accumulateMessage = function _AssistantStream_accumulateMessage(event, snapshot) {\n let newContent = [];\n switch (event.event) {\n case 'thread.message.created':\n //On creation the snapshot is just the initial message\n return [event.data, newContent];\n case 'thread.message.delta':\n if (!snapshot) {\n throw Error('Received a delta with no existing snapshot (there should be one from message creation)');\n }\n let data = event.data;\n //If this delta does not have content, nothing to process\n if (data.delta.content) {\n for (const contentElement of data.delta.content) {\n if (contentElement.index in snapshot.content) {\n let currentContent = snapshot.content[contentElement.index];\n snapshot.content[contentElement.index] = __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_accumulateContent).call(this, contentElement, currentContent);\n }\n else {\n snapshot.content[contentElement.index] = contentElement;\n // This is a new element\n newContent.push(contentElement);\n }\n }\n }\n return [snapshot, newContent];\n case 'thread.message.in_progress':\n case 'thread.message.completed':\n case 'thread.message.incomplete':\n //No changes on other thread events\n if (snapshot) {\n return [snapshot, newContent];\n }\n else {\n throw Error('Received thread message event with no existing snapshot');\n }\n }\n throw Error('Tried to accumulate a non-message event');\n}, _AssistantStream_accumulateContent = function _AssistantStream_accumulateContent(contentElement, currentContent) {\n return AssistantStream.accumulateDelta(currentContent, contentElement);\n}, _AssistantStream_handleRun = function _AssistantStream_handleRun(event) {\n __classPrivateFieldSet(this, _AssistantStream_currentRunSnapshot, event.data, \"f\");\n switch (event.event) {\n case 'thread.run.created':\n break;\n case 'thread.run.queued':\n break;\n case 'thread.run.in_progress':\n break;\n case 'thread.run.requires_action':\n case 'thread.run.cancelled':\n case 'thread.run.failed':\n case 'thread.run.completed':\n case 'thread.run.expired':\n __classPrivateFieldSet(this, _AssistantStream_finalRun, event.data, \"f\");\n if (__classPrivateFieldGet(this, _AssistantStream_currentToolCall, \"f\")) {\n this._emit('toolCallDone', __classPrivateFieldGet(this, _AssistantStream_currentToolCall, \"f\"));\n __classPrivateFieldSet(this, _AssistantStream_currentToolCall, undefined, \"f\");\n }\n break;\n case 'thread.run.cancelling':\n break;\n }\n};\nfunction assertNever(_x) { }\n//# sourceMappingURL=AssistantStream.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport { isRequestOptions } from \"../../core.mjs\";\nimport { CursorPage } from \"../../pagination.mjs\";\nimport { AssistantStream } from \"../../lib/AssistantStream.mjs\";\nexport class Assistants extends APIResource {\n /**\n * Create an assistant with a model and instructions.\n *\n * @example\n * ```ts\n * const assistant = await client.beta.assistants.create({\n * model: 'gpt-4o',\n * });\n * ```\n */\n create(body, options) {\n return this._client.post('/assistants', {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Retrieves an assistant.\n *\n * @example\n * ```ts\n * const assistant = await client.beta.assistants.retrieve(\n * 'assistant_id',\n * );\n * ```\n */\n retrieve(assistantId, options) {\n return this._client.get(`/assistants/${assistantId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Modifies an assistant.\n *\n * @example\n * ```ts\n * const assistant = await client.beta.assistants.update(\n * 'assistant_id',\n * );\n * ```\n */\n update(assistantId, body, options) {\n return this._client.post(`/assistants/${assistantId}`, {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n list(query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list({}, query);\n }\n return this._client.getAPIList('/assistants', AssistantsPage, {\n query,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Delete an assistant.\n *\n * @example\n * ```ts\n * const assistantDeleted = await client.beta.assistants.del(\n * 'assistant_id',\n * );\n * ```\n */\n del(assistantId, options) {\n return this._client.delete(`/assistants/${assistantId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n}\nexport class AssistantsPage extends CursorPage {\n}\nAssistants.AssistantsPage = AssistantsPage;\n//# sourceMappingURL=assistants.mjs.map","export function isRunnableFunctionWithParse(fn) {\n return typeof fn.parse === 'function';\n}\n/**\n * This is helper class for passing a `function` and `parse` where the `function`\n * argument type matches the `parse` return type.\n *\n * @deprecated - please use ParsingToolFunction instead.\n */\nexport class ParsingFunction {\n constructor(input) {\n this.function = input.function;\n this.parse = input.parse;\n this.parameters = input.parameters;\n this.description = input.description;\n this.name = input.name;\n }\n}\n/**\n * This is helper class for passing a `function` and `parse` where the `function`\n * argument type matches the `parse` return type.\n */\nexport class ParsingToolFunction {\n constructor(input) {\n this.type = 'function';\n this.function = input;\n }\n}\n//# sourceMappingURL=RunnableFunction.mjs.map","export const isAssistantMessage = (message) => {\n return message?.role === 'assistant';\n};\nexport const isFunctionMessage = (message) => {\n return message?.role === 'function';\n};\nexport const isToolMessage = (message) => {\n return message?.role === 'tool';\n};\nexport function isPresent(obj) {\n return obj != null;\n}\n//# sourceMappingURL=chatCompletionUtils.mjs.map","import { ContentFilterFinishReasonError, LengthFinishReasonError, OpenAIError } from \"../error.mjs\";\nexport function makeParseableResponseFormat(response_format, parser) {\n const obj = { ...response_format };\n Object.defineProperties(obj, {\n $brand: {\n value: 'auto-parseable-response-format',\n enumerable: false,\n },\n $parseRaw: {\n value: parser,\n enumerable: false,\n },\n });\n return obj;\n}\nexport function makeParseableTextFormat(response_format, parser) {\n const obj = { ...response_format };\n Object.defineProperties(obj, {\n $brand: {\n value: 'auto-parseable-response-format',\n enumerable: false,\n },\n $parseRaw: {\n value: parser,\n enumerable: false,\n },\n });\n return obj;\n}\nexport function isAutoParsableResponseFormat(response_format) {\n return response_format?.['$brand'] === 'auto-parseable-response-format';\n}\nexport function makeParseableTool(tool, { parser, callback, }) {\n const obj = { ...tool };\n Object.defineProperties(obj, {\n $brand: {\n value: 'auto-parseable-tool',\n enumerable: false,\n },\n $parseRaw: {\n value: parser,\n enumerable: false,\n },\n $callback: {\n value: callback,\n enumerable: false,\n },\n });\n return obj;\n}\nexport function isAutoParsableTool(tool) {\n return tool?.['$brand'] === 'auto-parseable-tool';\n}\nexport function maybeParseChatCompletion(completion, params) {\n if (!params || !hasAutoParseableInput(params)) {\n return {\n ...completion,\n choices: completion.choices.map((choice) => ({\n ...choice,\n message: {\n ...choice.message,\n parsed: null,\n ...(choice.message.tool_calls ?\n {\n tool_calls: choice.message.tool_calls,\n }\n : undefined),\n },\n })),\n };\n }\n return parseChatCompletion(completion, params);\n}\nexport function parseChatCompletion(completion, params) {\n const choices = completion.choices.map((choice) => {\n if (choice.finish_reason === 'length') {\n throw new LengthFinishReasonError();\n }\n if (choice.finish_reason === 'content_filter') {\n throw new ContentFilterFinishReasonError();\n }\n return {\n ...choice,\n message: {\n ...choice.message,\n ...(choice.message.tool_calls ?\n {\n tool_calls: choice.message.tool_calls?.map((toolCall) => parseToolCall(params, toolCall)) ?? undefined,\n }\n : undefined),\n parsed: choice.message.content && !choice.message.refusal ?\n parseResponseFormat(params, choice.message.content)\n : null,\n },\n };\n });\n return { ...completion, choices };\n}\nfunction parseResponseFormat(params, content) {\n if (params.response_format?.type !== 'json_schema') {\n return null;\n }\n if (params.response_format?.type === 'json_schema') {\n if ('$parseRaw' in params.response_format) {\n const response_format = params.response_format;\n return response_format.$parseRaw(content);\n }\n return JSON.parse(content);\n }\n return null;\n}\nfunction parseToolCall(params, toolCall) {\n const inputTool = params.tools?.find((inputTool) => inputTool.function?.name === toolCall.function.name);\n return {\n ...toolCall,\n function: {\n ...toolCall.function,\n parsed_arguments: isAutoParsableTool(inputTool) ? inputTool.$parseRaw(toolCall.function.arguments)\n : inputTool?.function.strict ? JSON.parse(toolCall.function.arguments)\n : null,\n },\n };\n}\nexport function shouldParseToolCall(params, toolCall) {\n if (!params) {\n return false;\n }\n const inputTool = params.tools?.find((inputTool) => inputTool.function?.name === toolCall.function.name);\n return isAutoParsableTool(inputTool) || inputTool?.function.strict || false;\n}\nexport function hasAutoParseableInput(params) {\n if (isAutoParsableResponseFormat(params.response_format)) {\n return true;\n }\n return (params.tools?.some((t) => isAutoParsableTool(t) || (t.type === 'function' && t.function.strict === true)) ?? false);\n}\nexport function validateInputTools(tools) {\n for (const tool of tools ?? []) {\n if (tool.type !== 'function') {\n throw new OpenAIError(`Currently only \\`function\\` tool types support auto-parsing; Received \\`${tool.type}\\``);\n }\n if (tool.function.strict !== true) {\n throw new OpenAIError(`The \\`${tool.function.name}\\` tool is not marked with \\`strict: true\\`. Only strict function tools can be auto-parsed`);\n }\n }\n}\n//# sourceMappingURL=parser.mjs.map","var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar _AbstractChatCompletionRunner_instances, _AbstractChatCompletionRunner_getFinalContent, _AbstractChatCompletionRunner_getFinalMessage, _AbstractChatCompletionRunner_getFinalFunctionCall, _AbstractChatCompletionRunner_getFinalFunctionCallResult, _AbstractChatCompletionRunner_calculateTotalUsage, _AbstractChatCompletionRunner_validateParams, _AbstractChatCompletionRunner_stringifyFunctionCallResult;\nimport { OpenAIError } from \"../error.mjs\";\nimport { isRunnableFunctionWithParse, } from \"./RunnableFunction.mjs\";\nimport { isAssistantMessage, isFunctionMessage, isToolMessage } from \"./chatCompletionUtils.mjs\";\nimport { EventStream } from \"./EventStream.mjs\";\nimport { isAutoParsableTool, parseChatCompletion } from \"../lib/parser.mjs\";\nconst DEFAULT_MAX_CHAT_COMPLETIONS = 10;\nexport class AbstractChatCompletionRunner extends EventStream {\n constructor() {\n super(...arguments);\n _AbstractChatCompletionRunner_instances.add(this);\n this._chatCompletions = [];\n this.messages = [];\n }\n _addChatCompletion(chatCompletion) {\n this._chatCompletions.push(chatCompletion);\n this._emit('chatCompletion', chatCompletion);\n const message = chatCompletion.choices[0]?.message;\n if (message)\n this._addMessage(message);\n return chatCompletion;\n }\n _addMessage(message, emit = true) {\n if (!('content' in message))\n message.content = null;\n this.messages.push(message);\n if (emit) {\n this._emit('message', message);\n if ((isFunctionMessage(message) || isToolMessage(message)) && message.content) {\n // Note, this assumes that {role: 'tool', content: …} is always the result of a call of tool of type=function.\n this._emit('functionCallResult', message.content);\n }\n else if (isAssistantMessage(message) && message.function_call) {\n this._emit('functionCall', message.function_call);\n }\n else if (isAssistantMessage(message) && message.tool_calls) {\n for (const tool_call of message.tool_calls) {\n if (tool_call.type === 'function') {\n this._emit('functionCall', tool_call.function);\n }\n }\n }\n }\n }\n /**\n * @returns a promise that resolves with the final ChatCompletion, or rejects\n * if an error occurred or the stream ended prematurely without producing a ChatCompletion.\n */\n async finalChatCompletion() {\n await this.done();\n const completion = this._chatCompletions[this._chatCompletions.length - 1];\n if (!completion)\n throw new OpenAIError('stream ended without producing a ChatCompletion');\n return completion;\n }\n /**\n * @returns a promise that resolves with the content of the final ChatCompletionMessage, or rejects\n * if an error occurred or the stream ended prematurely without producing a ChatCompletionMessage.\n */\n async finalContent() {\n await this.done();\n return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_getFinalContent).call(this);\n }\n /**\n * @returns a promise that resolves with the the final assistant ChatCompletionMessage response,\n * or rejects if an error occurred or the stream ended prematurely without producing a ChatCompletionMessage.\n */\n async finalMessage() {\n await this.done();\n return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_getFinalMessage).call(this);\n }\n /**\n * @returns a promise that resolves with the content of the final FunctionCall, or rejects\n * if an error occurred or the stream ended prematurely without producing a ChatCompletionMessage.\n */\n async finalFunctionCall() {\n await this.done();\n return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_getFinalFunctionCall).call(this);\n }\n async finalFunctionCallResult() {\n await this.done();\n return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_getFinalFunctionCallResult).call(this);\n }\n async totalUsage() {\n await this.done();\n return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_calculateTotalUsage).call(this);\n }\n allChatCompletions() {\n return [...this._chatCompletions];\n }\n _emitFinal() {\n const completion = this._chatCompletions[this._chatCompletions.length - 1];\n if (completion)\n this._emit('finalChatCompletion', completion);\n const finalMessage = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_getFinalMessage).call(this);\n if (finalMessage)\n this._emit('finalMessage', finalMessage);\n const finalContent = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_getFinalContent).call(this);\n if (finalContent)\n this._emit('finalContent', finalContent);\n const finalFunctionCall = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_getFinalFunctionCall).call(this);\n if (finalFunctionCall)\n this._emit('finalFunctionCall', finalFunctionCall);\n const finalFunctionCallResult = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_getFinalFunctionCallResult).call(this);\n if (finalFunctionCallResult != null)\n this._emit('finalFunctionCallResult', finalFunctionCallResult);\n if (this._chatCompletions.some((c) => c.usage)) {\n this._emit('totalUsage', __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_calculateTotalUsage).call(this));\n }\n }\n async _createChatCompletion(client, params, options) {\n const signal = options?.signal;\n if (signal) {\n if (signal.aborted)\n this.controller.abort();\n signal.addEventListener('abort', () => this.controller.abort());\n }\n __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_validateParams).call(this, params);\n const chatCompletion = await client.chat.completions.create({ ...params, stream: false }, { ...options, signal: this.controller.signal });\n this._connected();\n return this._addChatCompletion(parseChatCompletion(chatCompletion, params));\n }\n async _runChatCompletion(client, params, options) {\n for (const message of params.messages) {\n this._addMessage(message, false);\n }\n return await this._createChatCompletion(client, params, options);\n }\n async _runFunctions(client, params, options) {\n const role = 'function';\n const { function_call = 'auto', stream, ...restParams } = params;\n const singleFunctionToCall = typeof function_call !== 'string' && function_call?.name;\n const { maxChatCompletions = DEFAULT_MAX_CHAT_COMPLETIONS } = options || {};\n const functionsByName = {};\n for (const f of params.functions) {\n functionsByName[f.name || f.function.name] = f;\n }\n const functions = params.functions.map((f) => ({\n name: f.name || f.function.name,\n parameters: f.parameters,\n description: f.description,\n }));\n for (const message of params.messages) {\n this._addMessage(message, false);\n }\n for (let i = 0; i < maxChatCompletions; ++i) {\n const chatCompletion = await this._createChatCompletion(client, {\n ...restParams,\n function_call,\n functions,\n messages: [...this.messages],\n }, options);\n const message = chatCompletion.choices[0]?.message;\n if (!message) {\n throw new OpenAIError(`missing message in ChatCompletion response`);\n }\n if (!message.function_call)\n return;\n const { name, arguments: args } = message.function_call;\n const fn = functionsByName[name];\n if (!fn) {\n const content = `Invalid function_call: ${JSON.stringify(name)}. Available options are: ${functions\n .map((f) => JSON.stringify(f.name))\n .join(', ')}. Please try again`;\n this._addMessage({ role, name, content });\n continue;\n }\n else if (singleFunctionToCall && singleFunctionToCall !== name) {\n const content = `Invalid function_call: ${JSON.stringify(name)}. ${JSON.stringify(singleFunctionToCall)} requested. Please try again`;\n this._addMessage({ role, name, content });\n continue;\n }\n let parsed;\n try {\n parsed = isRunnableFunctionWithParse(fn) ? await fn.parse(args) : args;\n }\n catch (error) {\n this._addMessage({\n role,\n name,\n content: error instanceof Error ? error.message : String(error),\n });\n continue;\n }\n // @ts-expect-error it can't rule out `never` type.\n const rawContent = await fn.function(parsed, this);\n const content = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_stringifyFunctionCallResult).call(this, rawContent);\n this._addMessage({ role, name, content });\n if (singleFunctionToCall)\n return;\n }\n }\n async _runTools(client, params, options) {\n const role = 'tool';\n const { tool_choice = 'auto', stream, ...restParams } = params;\n const singleFunctionToCall = typeof tool_choice !== 'string' && tool_choice?.function?.name;\n const { maxChatCompletions = DEFAULT_MAX_CHAT_COMPLETIONS } = options || {};\n // TODO(someday): clean this logic up\n const inputTools = params.tools.map((tool) => {\n if (isAutoParsableTool(tool)) {\n if (!tool.$callback) {\n throw new OpenAIError('Tool given to `.runTools()` that does not have an associated function');\n }\n return {\n type: 'function',\n function: {\n function: tool.$callback,\n name: tool.function.name,\n description: tool.function.description || '',\n parameters: tool.function.parameters,\n parse: tool.$parseRaw,\n strict: true,\n },\n };\n }\n return tool;\n });\n const functionsByName = {};\n for (const f of inputTools) {\n if (f.type === 'function') {\n functionsByName[f.function.name || f.function.function.name] = f.function;\n }\n }\n const tools = 'tools' in params ?\n inputTools.map((t) => t.type === 'function' ?\n {\n type: 'function',\n function: {\n name: t.function.name || t.function.function.name,\n parameters: t.function.parameters,\n description: t.function.description,\n strict: t.function.strict,\n },\n }\n : t)\n : undefined;\n for (const message of params.messages) {\n this._addMessage(message, false);\n }\n for (let i = 0; i < maxChatCompletions; ++i) {\n const chatCompletion = await this._createChatCompletion(client, {\n ...restParams,\n tool_choice,\n tools,\n messages: [...this.messages],\n }, options);\n const message = chatCompletion.choices[0]?.message;\n if (!message) {\n throw new OpenAIError(`missing message in ChatCompletion response`);\n }\n if (!message.tool_calls?.length) {\n return;\n }\n for (const tool_call of message.tool_calls) {\n if (tool_call.type !== 'function')\n continue;\n const tool_call_id = tool_call.id;\n const { name, arguments: args } = tool_call.function;\n const fn = functionsByName[name];\n if (!fn) {\n const content = `Invalid tool_call: ${JSON.stringify(name)}. Available options are: ${Object.keys(functionsByName)\n .map((name) => JSON.stringify(name))\n .join(', ')}. Please try again`;\n this._addMessage({ role, tool_call_id, content });\n continue;\n }\n else if (singleFunctionToCall && singleFunctionToCall !== name) {\n const content = `Invalid tool_call: ${JSON.stringify(name)}. ${JSON.stringify(singleFunctionToCall)} requested. Please try again`;\n this._addMessage({ role, tool_call_id, content });\n continue;\n }\n let parsed;\n try {\n parsed = isRunnableFunctionWithParse(fn) ? await fn.parse(args) : args;\n }\n catch (error) {\n const content = error instanceof Error ? error.message : String(error);\n this._addMessage({ role, tool_call_id, content });\n continue;\n }\n // @ts-expect-error it can't rule out `never` type.\n const rawContent = await fn.function(parsed, this);\n const content = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_stringifyFunctionCallResult).call(this, rawContent);\n this._addMessage({ role, tool_call_id, content });\n if (singleFunctionToCall) {\n return;\n }\n }\n }\n return;\n }\n}\n_AbstractChatCompletionRunner_instances = new WeakSet(), _AbstractChatCompletionRunner_getFinalContent = function _AbstractChatCompletionRunner_getFinalContent() {\n return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_getFinalMessage).call(this).content ?? null;\n}, _AbstractChatCompletionRunner_getFinalMessage = function _AbstractChatCompletionRunner_getFinalMessage() {\n let i = this.messages.length;\n while (i-- > 0) {\n const message = this.messages[i];\n if (isAssistantMessage(message)) {\n const { function_call, ...rest } = message;\n // TODO: support audio here\n const ret = {\n ...rest,\n content: message.content ?? null,\n refusal: message.refusal ?? null,\n };\n if (function_call) {\n ret.function_call = function_call;\n }\n return ret;\n }\n }\n throw new OpenAIError('stream ended without producing a ChatCompletionMessage with role=assistant');\n}, _AbstractChatCompletionRunner_getFinalFunctionCall = function _AbstractChatCompletionRunner_getFinalFunctionCall() {\n for (let i = this.messages.length - 1; i >= 0; i--) {\n const message = this.messages[i];\n if (isAssistantMessage(message) && message?.function_call) {\n return message.function_call;\n }\n if (isAssistantMessage(message) && message?.tool_calls?.length) {\n return message.tool_calls.at(-1)?.function;\n }\n }\n return;\n}, _AbstractChatCompletionRunner_getFinalFunctionCallResult = function _AbstractChatCompletionRunner_getFinalFunctionCallResult() {\n for (let i = this.messages.length - 1; i >= 0; i--) {\n const message = this.messages[i];\n if (isFunctionMessage(message) && message.content != null) {\n return message.content;\n }\n if (isToolMessage(message) &&\n message.content != null &&\n typeof message.content === 'string' &&\n this.messages.some((x) => x.role === 'assistant' &&\n x.tool_calls?.some((y) => y.type === 'function' && y.id === message.tool_call_id))) {\n return message.content;\n }\n }\n return;\n}, _AbstractChatCompletionRunner_calculateTotalUsage = function _AbstractChatCompletionRunner_calculateTotalUsage() {\n const total = {\n completion_tokens: 0,\n prompt_tokens: 0,\n total_tokens: 0,\n };\n for (const { usage } of this._chatCompletions) {\n if (usage) {\n total.completion_tokens += usage.completion_tokens;\n total.prompt_tokens += usage.prompt_tokens;\n total.total_tokens += usage.total_tokens;\n }\n }\n return total;\n}, _AbstractChatCompletionRunner_validateParams = function _AbstractChatCompletionRunner_validateParams(params) {\n if (params.n != null && params.n > 1) {\n throw new OpenAIError('ChatCompletion convenience helpers only support n=1 at this time. To use n>1, please use chat.completions.create() directly.');\n }\n}, _AbstractChatCompletionRunner_stringifyFunctionCallResult = function _AbstractChatCompletionRunner_stringifyFunctionCallResult(rawContent) {\n return (typeof rawContent === 'string' ? rawContent\n : rawContent === undefined ? 'undefined'\n : JSON.stringify(rawContent));\n};\n//# sourceMappingURL=AbstractChatCompletionRunner.mjs.map","import { AbstractChatCompletionRunner, } from \"./AbstractChatCompletionRunner.mjs\";\nimport { isAssistantMessage } from \"./chatCompletionUtils.mjs\";\nexport class ChatCompletionRunner extends AbstractChatCompletionRunner {\n /** @deprecated - please use `runTools` instead. */\n static runFunctions(client, params, options) {\n const runner = new ChatCompletionRunner();\n const opts = {\n ...options,\n headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'runFunctions' },\n };\n runner._run(() => runner._runFunctions(client, params, opts));\n return runner;\n }\n static runTools(client, params, options) {\n const runner = new ChatCompletionRunner();\n const opts = {\n ...options,\n headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'runTools' },\n };\n runner._run(() => runner._runTools(client, params, opts));\n return runner;\n }\n _addMessage(message, emit = true) {\n super._addMessage(message, emit);\n if (isAssistantMessage(message) && message.content) {\n this._emit('content', message.content);\n }\n }\n}\n//# sourceMappingURL=ChatCompletionRunner.mjs.map","const STR = 0b000000001;\nconst NUM = 0b000000010;\nconst ARR = 0b000000100;\nconst OBJ = 0b000001000;\nconst NULL = 0b000010000;\nconst BOOL = 0b000100000;\nconst NAN = 0b001000000;\nconst INFINITY = 0b010000000;\nconst MINUS_INFINITY = 0b100000000;\nconst INF = INFINITY | MINUS_INFINITY;\nconst SPECIAL = NULL | BOOL | INF | NAN;\nconst ATOM = STR | NUM | SPECIAL;\nconst COLLECTION = ARR | OBJ;\nconst ALL = ATOM | COLLECTION;\nconst Allow = {\n STR,\n NUM,\n ARR,\n OBJ,\n NULL,\n BOOL,\n NAN,\n INFINITY,\n MINUS_INFINITY,\n INF,\n SPECIAL,\n ATOM,\n COLLECTION,\n ALL,\n};\n// The JSON string segment was unable to be parsed completely\nclass PartialJSON extends Error {\n}\nclass MalformedJSON extends Error {\n}\n/**\n * Parse incomplete JSON\n * @param {string} jsonString Partial JSON to be parsed\n * @param {number} allowPartial Specify what types are allowed to be partial, see {@link Allow} for details\n * @returns The parsed JSON\n * @throws {PartialJSON} If the JSON is incomplete (related to the `allow` parameter)\n * @throws {MalformedJSON} If the JSON is malformed\n */\nfunction parseJSON(jsonString, allowPartial = Allow.ALL) {\n if (typeof jsonString !== 'string') {\n throw new TypeError(`expecting str, got ${typeof jsonString}`);\n }\n if (!jsonString.trim()) {\n throw new Error(`${jsonString} is empty`);\n }\n return _parseJSON(jsonString.trim(), allowPartial);\n}\nconst _parseJSON = (jsonString, allow) => {\n const length = jsonString.length;\n let index = 0;\n const markPartialJSON = (msg) => {\n throw new PartialJSON(`${msg} at position ${index}`);\n };\n const throwMalformedError = (msg) => {\n throw new MalformedJSON(`${msg} at position ${index}`);\n };\n const parseAny = () => {\n skipBlank();\n if (index >= length)\n markPartialJSON('Unexpected end of input');\n if (jsonString[index] === '\"')\n return parseStr();\n if (jsonString[index] === '{')\n return parseObj();\n if (jsonString[index] === '[')\n return parseArr();\n if (jsonString.substring(index, index + 4) === 'null' ||\n (Allow.NULL & allow && length - index < 4 && 'null'.startsWith(jsonString.substring(index)))) {\n index += 4;\n return null;\n }\n if (jsonString.substring(index, index + 4) === 'true' ||\n (Allow.BOOL & allow && length - index < 4 && 'true'.startsWith(jsonString.substring(index)))) {\n index += 4;\n return true;\n }\n if (jsonString.substring(index, index + 5) === 'false' ||\n (Allow.BOOL & allow && length - index < 5 && 'false'.startsWith(jsonString.substring(index)))) {\n index += 5;\n return false;\n }\n if (jsonString.substring(index, index + 8) === 'Infinity' ||\n (Allow.INFINITY & allow && length - index < 8 && 'Infinity'.startsWith(jsonString.substring(index)))) {\n index += 8;\n return Infinity;\n }\n if (jsonString.substring(index, index + 9) === '-Infinity' ||\n (Allow.MINUS_INFINITY & allow &&\n 1 < length - index &&\n length - index < 9 &&\n '-Infinity'.startsWith(jsonString.substring(index)))) {\n index += 9;\n return -Infinity;\n }\n if (jsonString.substring(index, index + 3) === 'NaN' ||\n (Allow.NAN & allow && length - index < 3 && 'NaN'.startsWith(jsonString.substring(index)))) {\n index += 3;\n return NaN;\n }\n return parseNum();\n };\n const parseStr = () => {\n const start = index;\n let escape = false;\n index++; // skip initial quote\n while (index < length && (jsonString[index] !== '\"' || (escape && jsonString[index - 1] === '\\\\'))) {\n escape = jsonString[index] === '\\\\' ? !escape : false;\n index++;\n }\n if (jsonString.charAt(index) == '\"') {\n try {\n return JSON.parse(jsonString.substring(start, ++index - Number(escape)));\n }\n catch (e) {\n throwMalformedError(String(e));\n }\n }\n else if (Allow.STR & allow) {\n try {\n return JSON.parse(jsonString.substring(start, index - Number(escape)) + '\"');\n }\n catch (e) {\n // SyntaxError: Invalid escape sequence\n return JSON.parse(jsonString.substring(start, jsonString.lastIndexOf('\\\\')) + '\"');\n }\n }\n markPartialJSON('Unterminated string literal');\n };\n const parseObj = () => {\n index++; // skip initial brace\n skipBlank();\n const obj = {};\n try {\n while (jsonString[index] !== '}') {\n skipBlank();\n if (index >= length && Allow.OBJ & allow)\n return obj;\n const key = parseStr();\n skipBlank();\n index++; // skip colon\n try {\n const value = parseAny();\n Object.defineProperty(obj, key, { value, writable: true, enumerable: true, configurable: true });\n }\n catch (e) {\n if (Allow.OBJ & allow)\n return obj;\n else\n throw e;\n }\n skipBlank();\n if (jsonString[index] === ',')\n index++; // skip comma\n }\n }\n catch (e) {\n if (Allow.OBJ & allow)\n return obj;\n else\n markPartialJSON(\"Expected '}' at end of object\");\n }\n index++; // skip final brace\n return obj;\n };\n const parseArr = () => {\n index++; // skip initial bracket\n const arr = [];\n try {\n while (jsonString[index] !== ']') {\n arr.push(parseAny());\n skipBlank();\n if (jsonString[index] === ',') {\n index++; // skip comma\n }\n }\n }\n catch (e) {\n if (Allow.ARR & allow) {\n return arr;\n }\n markPartialJSON(\"Expected ']' at end of array\");\n }\n index++; // skip final bracket\n return arr;\n };\n const parseNum = () => {\n if (index === 0) {\n if (jsonString === '-' && Allow.NUM & allow)\n markPartialJSON(\"Not sure what '-' is\");\n try {\n return JSON.parse(jsonString);\n }\n catch (e) {\n if (Allow.NUM & allow) {\n try {\n if ('.' === jsonString[jsonString.length - 1])\n return JSON.parse(jsonString.substring(0, jsonString.lastIndexOf('.')));\n return JSON.parse(jsonString.substring(0, jsonString.lastIndexOf('e')));\n }\n catch (e) { }\n }\n throwMalformedError(String(e));\n }\n }\n const start = index;\n if (jsonString[index] === '-')\n index++;\n while (jsonString[index] && !',]}'.includes(jsonString[index]))\n index++;\n if (index == length && !(Allow.NUM & allow))\n markPartialJSON('Unterminated number literal');\n try {\n return JSON.parse(jsonString.substring(start, index));\n }\n catch (e) {\n if (jsonString.substring(start, index) === '-' && Allow.NUM & allow)\n markPartialJSON(\"Not sure what '-' is\");\n try {\n return JSON.parse(jsonString.substring(start, jsonString.lastIndexOf('e')));\n }\n catch (e) {\n throwMalformedError(String(e));\n }\n }\n };\n const skipBlank = () => {\n while (index < length && ' \\n\\r\\t'.includes(jsonString[index])) {\n index++;\n }\n };\n return parseAny();\n};\n// using this function with malformed JSON is undefined behavior\nconst partialParse = (input) => parseJSON(input, Allow.ALL ^ Allow.NUM);\nexport { partialParse, PartialJSON, MalformedJSON };\n//# sourceMappingURL=parser.mjs.map","var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n};\nvar __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar _ChatCompletionStream_instances, _ChatCompletionStream_params, _ChatCompletionStream_choiceEventStates, _ChatCompletionStream_currentChatCompletionSnapshot, _ChatCompletionStream_beginRequest, _ChatCompletionStream_getChoiceEventState, _ChatCompletionStream_addChunk, _ChatCompletionStream_emitToolCallDoneEvent, _ChatCompletionStream_emitContentDoneEvents, _ChatCompletionStream_endRequest, _ChatCompletionStream_getAutoParseableResponseFormat, _ChatCompletionStream_accumulateChatCompletion;\nimport { OpenAIError, APIUserAbortError, LengthFinishReasonError, ContentFilterFinishReasonError, } from \"../error.mjs\";\nimport { AbstractChatCompletionRunner, } from \"./AbstractChatCompletionRunner.mjs\";\nimport { Stream } from \"../streaming.mjs\";\nimport { hasAutoParseableInput, isAutoParsableResponseFormat, isAutoParsableTool, maybeParseChatCompletion, shouldParseToolCall, } from \"../lib/parser.mjs\";\nimport { partialParse } from \"../_vendor/partial-json-parser/parser.mjs\";\nexport class ChatCompletionStream extends AbstractChatCompletionRunner {\n constructor(params) {\n super();\n _ChatCompletionStream_instances.add(this);\n _ChatCompletionStream_params.set(this, void 0);\n _ChatCompletionStream_choiceEventStates.set(this, void 0);\n _ChatCompletionStream_currentChatCompletionSnapshot.set(this, void 0);\n __classPrivateFieldSet(this, _ChatCompletionStream_params, params, \"f\");\n __classPrivateFieldSet(this, _ChatCompletionStream_choiceEventStates, [], \"f\");\n }\n get currentChatCompletionSnapshot() {\n return __classPrivateFieldGet(this, _ChatCompletionStream_currentChatCompletionSnapshot, \"f\");\n }\n /**\n * Intended for use on the frontend, consuming a stream produced with\n * `.toReadableStream()` on the backend.\n *\n * Note that messages sent to the model do not appear in `.on('message')`\n * in this context.\n */\n static fromReadableStream(stream) {\n const runner = new ChatCompletionStream(null);\n runner._run(() => runner._fromReadableStream(stream));\n return runner;\n }\n static createChatCompletion(client, params, options) {\n const runner = new ChatCompletionStream(params);\n runner._run(() => runner._runChatCompletion(client, { ...params, stream: true }, { ...options, headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' } }));\n return runner;\n }\n async _createChatCompletion(client, params, options) {\n super._createChatCompletion;\n const signal = options?.signal;\n if (signal) {\n if (signal.aborted)\n this.controller.abort();\n signal.addEventListener('abort', () => this.controller.abort());\n }\n __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_beginRequest).call(this);\n const stream = await client.chat.completions.create({ ...params, stream: true }, { ...options, signal: this.controller.signal });\n this._connected();\n for await (const chunk of stream) {\n __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_addChunk).call(this, chunk);\n }\n if (stream.controller.signal?.aborted) {\n throw new APIUserAbortError();\n }\n return this._addChatCompletion(__classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_endRequest).call(this));\n }\n async _fromReadableStream(readableStream, options) {\n const signal = options?.signal;\n if (signal) {\n if (signal.aborted)\n this.controller.abort();\n signal.addEventListener('abort', () => this.controller.abort());\n }\n __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_beginRequest).call(this);\n this._connected();\n const stream = Stream.fromReadableStream(readableStream, this.controller);\n let chatId;\n for await (const chunk of stream) {\n if (chatId && chatId !== chunk.id) {\n // A new request has been made.\n this._addChatCompletion(__classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_endRequest).call(this));\n }\n __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_addChunk).call(this, chunk);\n chatId = chunk.id;\n }\n if (stream.controller.signal?.aborted) {\n throw new APIUserAbortError();\n }\n return this._addChatCompletion(__classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_endRequest).call(this));\n }\n [(_ChatCompletionStream_params = new WeakMap(), _ChatCompletionStream_choiceEventStates = new WeakMap(), _ChatCompletionStream_currentChatCompletionSnapshot = new WeakMap(), _ChatCompletionStream_instances = new WeakSet(), _ChatCompletionStream_beginRequest = function _ChatCompletionStream_beginRequest() {\n if (this.ended)\n return;\n __classPrivateFieldSet(this, _ChatCompletionStream_currentChatCompletionSnapshot, undefined, \"f\");\n }, _ChatCompletionStream_getChoiceEventState = function _ChatCompletionStream_getChoiceEventState(choice) {\n let state = __classPrivateFieldGet(this, _ChatCompletionStream_choiceEventStates, \"f\")[choice.index];\n if (state) {\n return state;\n }\n state = {\n content_done: false,\n refusal_done: false,\n logprobs_content_done: false,\n logprobs_refusal_done: false,\n done_tool_calls: new Set(),\n current_tool_call_index: null,\n };\n __classPrivateFieldGet(this, _ChatCompletionStream_choiceEventStates, \"f\")[choice.index] = state;\n return state;\n }, _ChatCompletionStream_addChunk = function _ChatCompletionStream_addChunk(chunk) {\n if (this.ended)\n return;\n const completion = __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_accumulateChatCompletion).call(this, chunk);\n this._emit('chunk', chunk, completion);\n for (const choice of chunk.choices) {\n const choiceSnapshot = completion.choices[choice.index];\n if (choice.delta.content != null &&\n choiceSnapshot.message?.role === 'assistant' &&\n choiceSnapshot.message?.content) {\n this._emit('content', choice.delta.content, choiceSnapshot.message.content);\n this._emit('content.delta', {\n delta: choice.delta.content,\n snapshot: choiceSnapshot.message.content,\n parsed: choiceSnapshot.message.parsed,\n });\n }\n if (choice.delta.refusal != null &&\n choiceSnapshot.message?.role === 'assistant' &&\n choiceSnapshot.message?.refusal) {\n this._emit('refusal.delta', {\n delta: choice.delta.refusal,\n snapshot: choiceSnapshot.message.refusal,\n });\n }\n if (choice.logprobs?.content != null && choiceSnapshot.message?.role === 'assistant') {\n this._emit('logprobs.content.delta', {\n content: choice.logprobs?.content,\n snapshot: choiceSnapshot.logprobs?.content ?? [],\n });\n }\n if (choice.logprobs?.refusal != null && choiceSnapshot.message?.role === 'assistant') {\n this._emit('logprobs.refusal.delta', {\n refusal: choice.logprobs?.refusal,\n snapshot: choiceSnapshot.logprobs?.refusal ?? [],\n });\n }\n const state = __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_getChoiceEventState).call(this, choiceSnapshot);\n if (choiceSnapshot.finish_reason) {\n __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_emitContentDoneEvents).call(this, choiceSnapshot);\n if (state.current_tool_call_index != null) {\n __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_emitToolCallDoneEvent).call(this, choiceSnapshot, state.current_tool_call_index);\n }\n }\n for (const toolCall of choice.delta.tool_calls ?? []) {\n if (state.current_tool_call_index !== toolCall.index) {\n __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_emitContentDoneEvents).call(this, choiceSnapshot);\n // new tool call started, the previous one is done\n if (state.current_tool_call_index != null) {\n __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_emitToolCallDoneEvent).call(this, choiceSnapshot, state.current_tool_call_index);\n }\n }\n state.current_tool_call_index = toolCall.index;\n }\n for (const toolCallDelta of choice.delta.tool_calls ?? []) {\n const toolCallSnapshot = choiceSnapshot.message.tool_calls?.[toolCallDelta.index];\n if (!toolCallSnapshot?.type) {\n continue;\n }\n if (toolCallSnapshot?.type === 'function') {\n this._emit('tool_calls.function.arguments.delta', {\n name: toolCallSnapshot.function?.name,\n index: toolCallDelta.index,\n arguments: toolCallSnapshot.function.arguments,\n parsed_arguments: toolCallSnapshot.function.parsed_arguments,\n arguments_delta: toolCallDelta.function?.arguments ?? '',\n });\n }\n else {\n assertNever(toolCallSnapshot?.type);\n }\n }\n }\n }, _ChatCompletionStream_emitToolCallDoneEvent = function _ChatCompletionStream_emitToolCallDoneEvent(choiceSnapshot, toolCallIndex) {\n const state = __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_getChoiceEventState).call(this, choiceSnapshot);\n if (state.done_tool_calls.has(toolCallIndex)) {\n // we've already fired the done event\n return;\n }\n const toolCallSnapshot = choiceSnapshot.message.tool_calls?.[toolCallIndex];\n if (!toolCallSnapshot) {\n throw new Error('no tool call snapshot');\n }\n if (!toolCallSnapshot.type) {\n throw new Error('tool call snapshot missing `type`');\n }\n if (toolCallSnapshot.type === 'function') {\n const inputTool = __classPrivateFieldGet(this, _ChatCompletionStream_params, \"f\")?.tools?.find((tool) => tool.type === 'function' && tool.function.name === toolCallSnapshot.function.name);\n this._emit('tool_calls.function.arguments.done', {\n name: toolCallSnapshot.function.name,\n index: toolCallIndex,\n arguments: toolCallSnapshot.function.arguments,\n parsed_arguments: isAutoParsableTool(inputTool) ? inputTool.$parseRaw(toolCallSnapshot.function.arguments)\n : inputTool?.function.strict ? JSON.parse(toolCallSnapshot.function.arguments)\n : null,\n });\n }\n else {\n assertNever(toolCallSnapshot.type);\n }\n }, _ChatCompletionStream_emitContentDoneEvents = function _ChatCompletionStream_emitContentDoneEvents(choiceSnapshot) {\n const state = __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_getChoiceEventState).call(this, choiceSnapshot);\n if (choiceSnapshot.message.content && !state.content_done) {\n state.content_done = true;\n const responseFormat = __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_getAutoParseableResponseFormat).call(this);\n this._emit('content.done', {\n content: choiceSnapshot.message.content,\n parsed: responseFormat ? responseFormat.$parseRaw(choiceSnapshot.message.content) : null,\n });\n }\n if (choiceSnapshot.message.refusal && !state.refusal_done) {\n state.refusal_done = true;\n this._emit('refusal.done', { refusal: choiceSnapshot.message.refusal });\n }\n if (choiceSnapshot.logprobs?.content && !state.logprobs_content_done) {\n state.logprobs_content_done = true;\n this._emit('logprobs.content.done', { content: choiceSnapshot.logprobs.content });\n }\n if (choiceSnapshot.logprobs?.refusal && !state.logprobs_refusal_done) {\n state.logprobs_refusal_done = true;\n this._emit('logprobs.refusal.done', { refusal: choiceSnapshot.logprobs.refusal });\n }\n }, _ChatCompletionStream_endRequest = function _ChatCompletionStream_endRequest() {\n if (this.ended) {\n throw new OpenAIError(`stream has ended, this shouldn't happen`);\n }\n const snapshot = __classPrivateFieldGet(this, _ChatCompletionStream_currentChatCompletionSnapshot, \"f\");\n if (!snapshot) {\n throw new OpenAIError(`request ended without sending any chunks`);\n }\n __classPrivateFieldSet(this, _ChatCompletionStream_currentChatCompletionSnapshot, undefined, \"f\");\n __classPrivateFieldSet(this, _ChatCompletionStream_choiceEventStates, [], \"f\");\n return finalizeChatCompletion(snapshot, __classPrivateFieldGet(this, _ChatCompletionStream_params, \"f\"));\n }, _ChatCompletionStream_getAutoParseableResponseFormat = function _ChatCompletionStream_getAutoParseableResponseFormat() {\n const responseFormat = __classPrivateFieldGet(this, _ChatCompletionStream_params, \"f\")?.response_format;\n if (isAutoParsableResponseFormat(responseFormat)) {\n return responseFormat;\n }\n return null;\n }, _ChatCompletionStream_accumulateChatCompletion = function _ChatCompletionStream_accumulateChatCompletion(chunk) {\n var _a, _b, _c, _d;\n let snapshot = __classPrivateFieldGet(this, _ChatCompletionStream_currentChatCompletionSnapshot, \"f\");\n const { choices, ...rest } = chunk;\n if (!snapshot) {\n snapshot = __classPrivateFieldSet(this, _ChatCompletionStream_currentChatCompletionSnapshot, {\n ...rest,\n choices: [],\n }, \"f\");\n }\n else {\n Object.assign(snapshot, rest);\n }\n for (const { delta, finish_reason, index, logprobs = null, ...other } of chunk.choices) {\n let choice = snapshot.choices[index];\n if (!choice) {\n choice = snapshot.choices[index] = { finish_reason, index, message: {}, logprobs, ...other };\n }\n if (logprobs) {\n if (!choice.logprobs) {\n choice.logprobs = Object.assign({}, logprobs);\n }\n else {\n const { content, refusal, ...rest } = logprobs;\n assertIsEmpty(rest);\n Object.assign(choice.logprobs, rest);\n if (content) {\n (_a = choice.logprobs).content ?? (_a.content = []);\n choice.logprobs.content.push(...content);\n }\n if (refusal) {\n (_b = choice.logprobs).refusal ?? (_b.refusal = []);\n choice.logprobs.refusal.push(...refusal);\n }\n }\n }\n if (finish_reason) {\n choice.finish_reason = finish_reason;\n if (__classPrivateFieldGet(this, _ChatCompletionStream_params, \"f\") && hasAutoParseableInput(__classPrivateFieldGet(this, _ChatCompletionStream_params, \"f\"))) {\n if (finish_reason === 'length') {\n throw new LengthFinishReasonError();\n }\n if (finish_reason === 'content_filter') {\n throw new ContentFilterFinishReasonError();\n }\n }\n }\n Object.assign(choice, other);\n if (!delta)\n continue; // Shouldn't happen; just in case.\n const { content, refusal, function_call, role, tool_calls, ...rest } = delta;\n assertIsEmpty(rest);\n Object.assign(choice.message, rest);\n if (refusal) {\n choice.message.refusal = (choice.message.refusal || '') + refusal;\n }\n if (role)\n choice.message.role = role;\n if (function_call) {\n if (!choice.message.function_call) {\n choice.message.function_call = function_call;\n }\n else {\n if (function_call.name)\n choice.message.function_call.name = function_call.name;\n if (function_call.arguments) {\n (_c = choice.message.function_call).arguments ?? (_c.arguments = '');\n choice.message.function_call.arguments += function_call.arguments;\n }\n }\n }\n if (content) {\n choice.message.content = (choice.message.content || '') + content;\n if (!choice.message.refusal && __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_getAutoParseableResponseFormat).call(this)) {\n choice.message.parsed = partialParse(choice.message.content);\n }\n }\n if (tool_calls) {\n if (!choice.message.tool_calls)\n choice.message.tool_calls = [];\n for (const { index, id, type, function: fn, ...rest } of tool_calls) {\n const tool_call = ((_d = choice.message.tool_calls)[index] ?? (_d[index] = {}));\n Object.assign(tool_call, rest);\n if (id)\n tool_call.id = id;\n if (type)\n tool_call.type = type;\n if (fn)\n tool_call.function ?? (tool_call.function = { name: fn.name ?? '', arguments: '' });\n if (fn?.name)\n tool_call.function.name = fn.name;\n if (fn?.arguments) {\n tool_call.function.arguments += fn.arguments;\n if (shouldParseToolCall(__classPrivateFieldGet(this, _ChatCompletionStream_params, \"f\"), tool_call)) {\n tool_call.function.parsed_arguments = partialParse(tool_call.function.arguments);\n }\n }\n }\n }\n }\n return snapshot;\n }, Symbol.asyncIterator)]() {\n const pushQueue = [];\n const readQueue = [];\n let done = false;\n this.on('chunk', (chunk) => {\n const reader = readQueue.shift();\n if (reader) {\n reader.resolve(chunk);\n }\n else {\n pushQueue.push(chunk);\n }\n });\n this.on('end', () => {\n done = true;\n for (const reader of readQueue) {\n reader.resolve(undefined);\n }\n readQueue.length = 0;\n });\n this.on('abort', (err) => {\n done = true;\n for (const reader of readQueue) {\n reader.reject(err);\n }\n readQueue.length = 0;\n });\n this.on('error', (err) => {\n done = true;\n for (const reader of readQueue) {\n reader.reject(err);\n }\n readQueue.length = 0;\n });\n return {\n next: async () => {\n if (!pushQueue.length) {\n if (done) {\n return { value: undefined, done: true };\n }\n return new Promise((resolve, reject) => readQueue.push({ resolve, reject })).then((chunk) => (chunk ? { value: chunk, done: false } : { value: undefined, done: true }));\n }\n const chunk = pushQueue.shift();\n return { value: chunk, done: false };\n },\n return: async () => {\n this.abort();\n return { value: undefined, done: true };\n },\n };\n }\n toReadableStream() {\n const stream = new Stream(this[Symbol.asyncIterator].bind(this), this.controller);\n return stream.toReadableStream();\n }\n}\nfunction finalizeChatCompletion(snapshot, params) {\n const { id, choices, created, model, system_fingerprint, ...rest } = snapshot;\n const completion = {\n ...rest,\n id,\n choices: choices.map(({ message, finish_reason, index, logprobs, ...choiceRest }) => {\n if (!finish_reason) {\n throw new OpenAIError(`missing finish_reason for choice ${index}`);\n }\n const { content = null, function_call, tool_calls, ...messageRest } = message;\n const role = message.role; // this is what we expect; in theory it could be different which would make our types a slight lie but would be fine.\n if (!role) {\n throw new OpenAIError(`missing role for choice ${index}`);\n }\n if (function_call) {\n const { arguments: args, name } = function_call;\n if (args == null) {\n throw new OpenAIError(`missing function_call.arguments for choice ${index}`);\n }\n if (!name) {\n throw new OpenAIError(`missing function_call.name for choice ${index}`);\n }\n return {\n ...choiceRest,\n message: {\n content,\n function_call: { arguments: args, name },\n role,\n refusal: message.refusal ?? null,\n },\n finish_reason,\n index,\n logprobs,\n };\n }\n if (tool_calls) {\n return {\n ...choiceRest,\n index,\n finish_reason,\n logprobs,\n message: {\n ...messageRest,\n role,\n content,\n refusal: message.refusal ?? null,\n tool_calls: tool_calls.map((tool_call, i) => {\n const { function: fn, type, id, ...toolRest } = tool_call;\n const { arguments: args, name, ...fnRest } = fn || {};\n if (id == null) {\n throw new OpenAIError(`missing choices[${index}].tool_calls[${i}].id\\n${str(snapshot)}`);\n }\n if (type == null) {\n throw new OpenAIError(`missing choices[${index}].tool_calls[${i}].type\\n${str(snapshot)}`);\n }\n if (name == null) {\n throw new OpenAIError(`missing choices[${index}].tool_calls[${i}].function.name\\n${str(snapshot)}`);\n }\n if (args == null) {\n throw new OpenAIError(`missing choices[${index}].tool_calls[${i}].function.arguments\\n${str(snapshot)}`);\n }\n return { ...toolRest, id, type, function: { ...fnRest, name, arguments: args } };\n }),\n },\n };\n }\n return {\n ...choiceRest,\n message: { ...messageRest, content, role, refusal: message.refusal ?? null },\n finish_reason,\n index,\n logprobs,\n };\n }),\n created,\n model,\n object: 'chat.completion',\n ...(system_fingerprint ? { system_fingerprint } : {}),\n };\n return maybeParseChatCompletion(completion, params);\n}\nfunction str(x) {\n return JSON.stringify(x);\n}\n/**\n * Ensures the given argument is an empty object, useful for\n * asserting that all known properties on an object have been\n * destructured.\n */\nfunction assertIsEmpty(obj) {\n return;\n}\nfunction assertNever(_x) { }\n//# sourceMappingURL=ChatCompletionStream.mjs.map","import { ChatCompletionStream } from \"./ChatCompletionStream.mjs\";\nexport class ChatCompletionStreamingRunner extends ChatCompletionStream {\n static fromReadableStream(stream) {\n const runner = new ChatCompletionStreamingRunner(null);\n runner._run(() => runner._fromReadableStream(stream));\n return runner;\n }\n /** @deprecated - please use `runTools` instead. */\n static runFunctions(client, params, options) {\n const runner = new ChatCompletionStreamingRunner(null);\n const opts = {\n ...options,\n headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'runFunctions' },\n };\n runner._run(() => runner._runFunctions(client, params, opts));\n return runner;\n }\n static runTools(client, params, options) {\n const runner = new ChatCompletionStreamingRunner(\n // @ts-expect-error TODO these types are incompatible\n params);\n const opts = {\n ...options,\n headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'runTools' },\n };\n runner._run(() => runner._runTools(client, params, opts));\n return runner;\n }\n}\n//# sourceMappingURL=ChatCompletionStreamingRunner.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { ChatCompletionRunner } from \"../../../lib/ChatCompletionRunner.mjs\";\nimport { ChatCompletionStreamingRunner, } from \"../../../lib/ChatCompletionStreamingRunner.mjs\";\nimport { ChatCompletionStream } from \"../../../lib/ChatCompletionStream.mjs\";\nimport { parseChatCompletion, validateInputTools } from \"../../../lib/parser.mjs\";\nexport { ChatCompletionStreamingRunner, } from \"../../../lib/ChatCompletionStreamingRunner.mjs\";\nexport { ParsingFunction, ParsingToolFunction, } from \"../../../lib/RunnableFunction.mjs\";\nexport { ChatCompletionStream } from \"../../../lib/ChatCompletionStream.mjs\";\nexport { ChatCompletionRunner, } from \"../../../lib/ChatCompletionRunner.mjs\";\nexport class Completions extends APIResource {\n parse(body, options) {\n validateInputTools(body.tools);\n return this._client.chat.completions\n .create(body, {\n ...options,\n headers: {\n ...options?.headers,\n 'X-Stainless-Helper-Method': 'beta.chat.completions.parse',\n },\n })\n ._thenUnwrap((completion) => parseChatCompletion(completion, body));\n }\n runFunctions(body, options) {\n if (body.stream) {\n return ChatCompletionStreamingRunner.runFunctions(this._client, body, options);\n }\n return ChatCompletionRunner.runFunctions(this._client, body, options);\n }\n runTools(body, options) {\n if (body.stream) {\n return ChatCompletionStreamingRunner.runTools(this._client, body, options);\n }\n return ChatCompletionRunner.runTools(this._client, body, options);\n }\n /**\n * Creates a chat completion stream\n */\n stream(body, options) {\n return ChatCompletionStream.createChatCompletion(this._client, body, options);\n }\n}\n//# sourceMappingURL=completions.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport * as CompletionsAPI from \"./completions.mjs\";\nexport class Chat extends APIResource {\n constructor() {\n super(...arguments);\n this.completions = new CompletionsAPI.Completions(this._client);\n }\n}\n(function (Chat) {\n Chat.Completions = CompletionsAPI.Completions;\n})(Chat || (Chat = {}));\n//# sourceMappingURL=chat.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nexport class Sessions extends APIResource {\n /**\n * Create an ephemeral API token for use in client-side applications with the\n * Realtime API. Can be configured with the same session parameters as the\n * `session.update` client event.\n *\n * It responds with a session object, plus a `client_secret` key which contains a\n * usable ephemeral API token that can be used to authenticate browser clients for\n * the Realtime API.\n *\n * @example\n * ```ts\n * const session =\n * await client.beta.realtime.sessions.create();\n * ```\n */\n create(body, options) {\n return this._client.post('/realtime/sessions', {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n}\n//# sourceMappingURL=sessions.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nexport class TranscriptionSessions extends APIResource {\n /**\n * Create an ephemeral API token for use in client-side applications with the\n * Realtime API specifically for realtime transcriptions. Can be configured with\n * the same session parameters as the `transcription_session.update` client event.\n *\n * It responds with a session object, plus a `client_secret` key which contains a\n * usable ephemeral API token that can be used to authenticate browser clients for\n * the Realtime API.\n *\n * @example\n * ```ts\n * const transcriptionSession =\n * await client.beta.realtime.transcriptionSessions.create();\n * ```\n */\n create(body, options) {\n return this._client.post('/realtime/transcription_sessions', {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n}\n//# sourceMappingURL=transcription-sessions.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport * as SessionsAPI from \"./sessions.mjs\";\nimport { Sessions, } from \"./sessions.mjs\";\nimport * as TranscriptionSessionsAPI from \"./transcription-sessions.mjs\";\nimport { TranscriptionSessions, } from \"./transcription-sessions.mjs\";\nexport class Realtime extends APIResource {\n constructor() {\n super(...arguments);\n this.sessions = new SessionsAPI.Sessions(this._client);\n this.transcriptionSessions = new TranscriptionSessionsAPI.TranscriptionSessions(this._client);\n }\n}\nRealtime.Sessions = Sessions;\nRealtime.TranscriptionSessions = TranscriptionSessions;\n//# sourceMappingURL=realtime.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../core.mjs\";\nimport { CursorPage } from \"../../../pagination.mjs\";\n/**\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\nexport class Messages extends APIResource {\n /**\n * Create a message.\n *\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\n create(threadId, body, options) {\n return this._client.post(`/threads/${threadId}/messages`, {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Retrieve a message.\n *\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\n retrieve(threadId, messageId, options) {\n return this._client.get(`/threads/${threadId}/messages/${messageId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Modifies a message.\n *\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\n update(threadId, messageId, body, options) {\n return this._client.post(`/threads/${threadId}/messages/${messageId}`, {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n list(threadId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list(threadId, {}, query);\n }\n return this._client.getAPIList(`/threads/${threadId}/messages`, MessagesPage, {\n query,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Deletes a message.\n *\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\n del(threadId, messageId, options) {\n return this._client.delete(`/threads/${threadId}/messages/${messageId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n}\nexport class MessagesPage extends CursorPage {\n}\nMessages.MessagesPage = MessagesPage;\n//# sourceMappingURL=messages.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../../core.mjs\";\nimport { CursorPage } from \"../../../../pagination.mjs\";\n/**\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\nexport class Steps extends APIResource {\n retrieve(threadId, runId, stepId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.retrieve(threadId, runId, stepId, {}, query);\n }\n return this._client.get(`/threads/${threadId}/runs/${runId}/steps/${stepId}`, {\n query,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n list(threadId, runId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list(threadId, runId, {}, query);\n }\n return this._client.getAPIList(`/threads/${threadId}/runs/${runId}/steps`, RunStepsPage, {\n query,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n}\nexport class RunStepsPage extends CursorPage {\n}\nSteps.RunStepsPage = RunStepsPage;\n//# sourceMappingURL=steps.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../../core.mjs\";\nimport { AssistantStream } from \"../../../../lib/AssistantStream.mjs\";\nimport { sleep } from \"../../../../core.mjs\";\nimport * as StepsAPI from \"./steps.mjs\";\nimport { RunStepsPage, Steps, } from \"./steps.mjs\";\nimport { CursorPage } from \"../../../../pagination.mjs\";\n/**\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\nexport class Runs extends APIResource {\n constructor() {\n super(...arguments);\n this.steps = new StepsAPI.Steps(this._client);\n }\n create(threadId, params, options) {\n const { include, ...body } = params;\n return this._client.post(`/threads/${threadId}/runs`, {\n query: { include },\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n stream: params.stream ?? false,\n });\n }\n /**\n * Retrieves a run.\n *\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\n retrieve(threadId, runId, options) {\n return this._client.get(`/threads/${threadId}/runs/${runId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Modifies a run.\n *\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\n update(threadId, runId, body, options) {\n return this._client.post(`/threads/${threadId}/runs/${runId}`, {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n list(threadId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list(threadId, {}, query);\n }\n return this._client.getAPIList(`/threads/${threadId}/runs`, RunsPage, {\n query,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Cancels a run that is `in_progress`.\n *\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\n cancel(threadId, runId, options) {\n return this._client.post(`/threads/${threadId}/runs/${runId}/cancel`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * A helper to create a run an poll for a terminal state. More information on Run\n * lifecycles can be found here:\n * https://platform.openai.com/docs/assistants/how-it-works/runs-and-run-steps\n */\n async createAndPoll(threadId, body, options) {\n const run = await this.create(threadId, body, options);\n return await this.poll(threadId, run.id, options);\n }\n /**\n * Create a Run stream\n *\n * @deprecated use `stream` instead\n */\n createAndStream(threadId, body, options) {\n return AssistantStream.createAssistantStream(threadId, this._client.beta.threads.runs, body, options);\n }\n /**\n * A helper to poll a run status until it reaches a terminal state. More\n * information on Run lifecycles can be found here:\n * https://platform.openai.com/docs/assistants/how-it-works/runs-and-run-steps\n */\n async poll(threadId, runId, options) {\n const headers = { ...options?.headers, 'X-Stainless-Poll-Helper': 'true' };\n if (options?.pollIntervalMs) {\n headers['X-Stainless-Custom-Poll-Interval'] = options.pollIntervalMs.toString();\n }\n while (true) {\n const { data: run, response } = await this.retrieve(threadId, runId, {\n ...options,\n headers: { ...options?.headers, ...headers },\n }).withResponse();\n switch (run.status) {\n //If we are in any sort of intermediate state we poll\n case 'queued':\n case 'in_progress':\n case 'cancelling':\n let sleepInterval = 5000;\n if (options?.pollIntervalMs) {\n sleepInterval = options.pollIntervalMs;\n }\n else {\n const headerInterval = response.headers.get('openai-poll-after-ms');\n if (headerInterval) {\n const headerIntervalMs = parseInt(headerInterval);\n if (!isNaN(headerIntervalMs)) {\n sleepInterval = headerIntervalMs;\n }\n }\n }\n await sleep(sleepInterval);\n break;\n //We return the run in any terminal state.\n case 'requires_action':\n case 'incomplete':\n case 'cancelled':\n case 'completed':\n case 'failed':\n case 'expired':\n return run;\n }\n }\n }\n /**\n * Create a Run stream\n */\n stream(threadId, body, options) {\n return AssistantStream.createAssistantStream(threadId, this._client.beta.threads.runs, body, options);\n }\n submitToolOutputs(threadId, runId, body, options) {\n return this._client.post(`/threads/${threadId}/runs/${runId}/submit_tool_outputs`, {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n stream: body.stream ?? false,\n });\n }\n /**\n * A helper to submit a tool output to a run and poll for a terminal run state.\n * More information on Run lifecycles can be found here:\n * https://platform.openai.com/docs/assistants/how-it-works/runs-and-run-steps\n */\n async submitToolOutputsAndPoll(threadId, runId, body, options) {\n const run = await this.submitToolOutputs(threadId, runId, body, options);\n return await this.poll(threadId, run.id, options);\n }\n /**\n * Submit the tool outputs from a previous run and stream the run to a terminal\n * state. More information on Run lifecycles can be found here:\n * https://platform.openai.com/docs/assistants/how-it-works/runs-and-run-steps\n */\n submitToolOutputsStream(threadId, runId, body, options) {\n return AssistantStream.createToolAssistantStream(threadId, runId, this._client.beta.threads.runs, body, options);\n }\n}\nexport class RunsPage extends CursorPage {\n}\nRuns.RunsPage = RunsPage;\nRuns.Steps = Steps;\nRuns.RunStepsPage = RunStepsPage;\n//# sourceMappingURL=runs.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../core.mjs\";\nimport { AssistantStream } from \"../../../lib/AssistantStream.mjs\";\nimport * as MessagesAPI from \"./messages.mjs\";\nimport { Messages, MessagesPage, } from \"./messages.mjs\";\nimport * as RunsAPI from \"./runs/runs.mjs\";\nimport { Runs, RunsPage, } from \"./runs/runs.mjs\";\n/**\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\nexport class Threads extends APIResource {\n constructor() {\n super(...arguments);\n this.runs = new RunsAPI.Runs(this._client);\n this.messages = new MessagesAPI.Messages(this._client);\n }\n create(body = {}, options) {\n if (isRequestOptions(body)) {\n return this.create({}, body);\n }\n return this._client.post('/threads', {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Retrieves a thread.\n *\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\n retrieve(threadId, options) {\n return this._client.get(`/threads/${threadId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Modifies a thread.\n *\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\n update(threadId, body, options) {\n return this._client.post(`/threads/${threadId}`, {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Delete a thread.\n *\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\n del(threadId, options) {\n return this._client.delete(`/threads/${threadId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n createAndRun(body, options) {\n return this._client.post('/threads/runs', {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n stream: body.stream ?? false,\n });\n }\n /**\n * A helper to create a thread, start a run and then poll for a terminal state.\n * More information on Run lifecycles can be found here:\n * https://platform.openai.com/docs/assistants/how-it-works/runs-and-run-steps\n */\n async createAndRunPoll(body, options) {\n const run = await this.createAndRun(body, options);\n return await this.runs.poll(run.thread_id, run.id, options);\n }\n /**\n * Create a thread and stream the run back\n */\n createAndRunStream(body, options) {\n return AssistantStream.createThreadAssistantStream(body, this._client.beta.threads, options);\n }\n}\nThreads.Runs = Runs;\nThreads.RunsPage = RunsPage;\nThreads.Messages = Messages;\nThreads.MessagesPage = MessagesPage;\n//# sourceMappingURL=threads.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport * as AssistantsAPI from \"./assistants.mjs\";\nimport * as ChatAPI from \"./chat/chat.mjs\";\nimport { Assistants, AssistantsPage, } from \"./assistants.mjs\";\nimport * as RealtimeAPI from \"./realtime/realtime.mjs\";\nimport { Realtime, } from \"./realtime/realtime.mjs\";\nimport * as ThreadsAPI from \"./threads/threads.mjs\";\nimport { Threads, } from \"./threads/threads.mjs\";\nimport { Chat } from \"./chat/chat.mjs\";\nexport class Beta extends APIResource {\n constructor() {\n super(...arguments);\n this.realtime = new RealtimeAPI.Realtime(this._client);\n this.chat = new ChatAPI.Chat(this._client);\n this.assistants = new AssistantsAPI.Assistants(this._client);\n this.threads = new ThreadsAPI.Threads(this._client);\n }\n}\nBeta.Realtime = Realtime;\nBeta.Assistants = Assistants;\nBeta.AssistantsPage = AssistantsPage;\nBeta.Threads = Threads;\n//# sourceMappingURL=beta.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../resource.mjs\";\nexport class Completions extends APIResource {\n create(body, options) {\n return this._client.post('/completions', { body, ...options, stream: body.stream ?? false });\n }\n}\n//# sourceMappingURL=completions.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nexport class Content extends APIResource {\n /**\n * Retrieve Container File Content\n */\n retrieve(containerId, fileId, options) {\n return this._client.get(`/containers/${containerId}/files/${fileId}/content`, {\n ...options,\n headers: { Accept: 'application/binary', ...options?.headers },\n __binaryResponse: true,\n });\n }\n}\n//# sourceMappingURL=content.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../core.mjs\";\nimport * as Core from \"../../../core.mjs\";\nimport * as ContentAPI from \"./content.mjs\";\nimport { Content } from \"./content.mjs\";\nimport { CursorPage } from \"../../../pagination.mjs\";\nexport class Files extends APIResource {\n constructor() {\n super(...arguments);\n this.content = new ContentAPI.Content(this._client);\n }\n /**\n * Create a Container File\n *\n * You can send either a multipart/form-data request with the raw file content, or\n * a JSON request with a file ID.\n */\n create(containerId, body, options) {\n return this._client.post(`/containers/${containerId}/files`, Core.multipartFormRequestOptions({ body, ...options }));\n }\n /**\n * Retrieve Container File\n */\n retrieve(containerId, fileId, options) {\n return this._client.get(`/containers/${containerId}/files/${fileId}`, options);\n }\n list(containerId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list(containerId, {}, query);\n }\n return this._client.getAPIList(`/containers/${containerId}/files`, FileListResponsesPage, {\n query,\n ...options,\n });\n }\n /**\n * Delete Container File\n */\n del(containerId, fileId, options) {\n return this._client.delete(`/containers/${containerId}/files/${fileId}`, {\n ...options,\n headers: { Accept: '*/*', ...options?.headers },\n });\n }\n}\nexport class FileListResponsesPage extends CursorPage {\n}\nFiles.FileListResponsesPage = FileListResponsesPage;\nFiles.Content = Content;\n//# sourceMappingURL=files.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport { isRequestOptions } from \"../../core.mjs\";\nimport * as FilesAPI from \"./files/files.mjs\";\nimport { FileListResponsesPage, Files, } from \"./files/files.mjs\";\nimport { CursorPage } from \"../../pagination.mjs\";\nexport class Containers extends APIResource {\n constructor() {\n super(...arguments);\n this.files = new FilesAPI.Files(this._client);\n }\n /**\n * Create Container\n */\n create(body, options) {\n return this._client.post('/containers', { body, ...options });\n }\n /**\n * Retrieve Container\n */\n retrieve(containerId, options) {\n return this._client.get(`/containers/${containerId}`, options);\n }\n list(query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list({}, query);\n }\n return this._client.getAPIList('/containers', ContainerListResponsesPage, { query, ...options });\n }\n /**\n * Delete Container\n */\n del(containerId, options) {\n return this._client.delete(`/containers/${containerId}`, {\n ...options,\n headers: { Accept: '*/*', ...options?.headers },\n });\n }\n}\nexport class ContainerListResponsesPage extends CursorPage {\n}\nContainers.ContainerListResponsesPage = ContainerListResponsesPage;\nContainers.Files = Files;\nContainers.FileListResponsesPage = FileListResponsesPage;\n//# sourceMappingURL=containers.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../resource.mjs\";\nimport * as Core from \"../core.mjs\";\nexport class Embeddings extends APIResource {\n /**\n * Creates an embedding vector representing the input text.\n *\n * @example\n * ```ts\n * const createEmbeddingResponse =\n * await client.embeddings.create({\n * input: 'The quick brown fox jumped over the lazy dog',\n * model: 'text-embedding-3-small',\n * });\n * ```\n */\n create(body, options) {\n const hasUserProvidedEncodingFormat = !!body.encoding_format;\n // No encoding_format specified, defaulting to base64 for performance reasons\n // See https://github.com/openai/openai-node/pull/1312\n let encoding_format = hasUserProvidedEncodingFormat ? body.encoding_format : 'base64';\n if (hasUserProvidedEncodingFormat) {\n Core.debug('Request', 'User defined encoding_format:', body.encoding_format);\n }\n const response = this._client.post('/embeddings', {\n body: {\n ...body,\n encoding_format: encoding_format,\n },\n ...options,\n });\n // if the user specified an encoding_format, return the response as-is\n if (hasUserProvidedEncodingFormat) {\n return response;\n }\n // in this stage, we are sure the user did not specify an encoding_format\n // and we defaulted to base64 for performance reasons\n // we are sure then that the response is base64 encoded, let's decode it\n // the returned result will be a float32 array since this is OpenAI API's default encoding\n Core.debug('response', 'Decoding base64 embeddings to float32 array');\n return response._thenUnwrap((response) => {\n if (response && response.data) {\n response.data.forEach((embeddingBase64Obj) => {\n const embeddingBase64Str = embeddingBase64Obj.embedding;\n embeddingBase64Obj.embedding = Core.toFloat32Array(embeddingBase64Str);\n });\n }\n return response;\n });\n }\n}\n//# sourceMappingURL=embeddings.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../core.mjs\";\nimport { CursorPage } from \"../../../pagination.mjs\";\nexport class OutputItems extends APIResource {\n /**\n * Get an evaluation run output item by ID.\n */\n retrieve(evalId, runId, outputItemId, options) {\n return this._client.get(`/evals/${evalId}/runs/${runId}/output_items/${outputItemId}`, options);\n }\n list(evalId, runId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list(evalId, runId, {}, query);\n }\n return this._client.getAPIList(`/evals/${evalId}/runs/${runId}/output_items`, OutputItemListResponsesPage, { query, ...options });\n }\n}\nexport class OutputItemListResponsesPage extends CursorPage {\n}\nOutputItems.OutputItemListResponsesPage = OutputItemListResponsesPage;\n//# sourceMappingURL=output-items.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../core.mjs\";\nimport * as OutputItemsAPI from \"./output-items.mjs\";\nimport { OutputItemListResponsesPage, OutputItems, } from \"./output-items.mjs\";\nimport { CursorPage } from \"../../../pagination.mjs\";\nexport class Runs extends APIResource {\n constructor() {\n super(...arguments);\n this.outputItems = new OutputItemsAPI.OutputItems(this._client);\n }\n /**\n * Kicks off a new run for a given evaluation, specifying the data source, and what\n * model configuration to use to test. The datasource will be validated against the\n * schema specified in the config of the evaluation.\n */\n create(evalId, body, options) {\n return this._client.post(`/evals/${evalId}/runs`, { body, ...options });\n }\n /**\n * Get an evaluation run by ID.\n */\n retrieve(evalId, runId, options) {\n return this._client.get(`/evals/${evalId}/runs/${runId}`, options);\n }\n list(evalId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list(evalId, {}, query);\n }\n return this._client.getAPIList(`/evals/${evalId}/runs`, RunListResponsesPage, { query, ...options });\n }\n /**\n * Delete an eval run.\n */\n del(evalId, runId, options) {\n return this._client.delete(`/evals/${evalId}/runs/${runId}`, options);\n }\n /**\n * Cancel an ongoing evaluation run.\n */\n cancel(evalId, runId, options) {\n return this._client.post(`/evals/${evalId}/runs/${runId}`, options);\n }\n}\nexport class RunListResponsesPage extends CursorPage {\n}\nRuns.RunListResponsesPage = RunListResponsesPage;\nRuns.OutputItems = OutputItems;\nRuns.OutputItemListResponsesPage = OutputItemListResponsesPage;\n//# sourceMappingURL=runs.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport { isRequestOptions } from \"../../core.mjs\";\nimport * as RunsAPI from \"./runs/runs.mjs\";\nimport { RunListResponsesPage, Runs, } from \"./runs/runs.mjs\";\nimport { CursorPage } from \"../../pagination.mjs\";\nexport class Evals extends APIResource {\n constructor() {\n super(...arguments);\n this.runs = new RunsAPI.Runs(this._client);\n }\n /**\n * Create the structure of an evaluation that can be used to test a model's\n * performance. An evaluation is a set of testing criteria and the config for a\n * data source, which dictates the schema of the data used in the evaluation. After\n * creating an evaluation, you can run it on different models and model parameters.\n * We support several types of graders and datasources. For more information, see\n * the [Evals guide](https://platform.openai.com/docs/guides/evals).\n */\n create(body, options) {\n return this._client.post('/evals', { body, ...options });\n }\n /**\n * Get an evaluation by ID.\n */\n retrieve(evalId, options) {\n return this._client.get(`/evals/${evalId}`, options);\n }\n /**\n * Update certain properties of an evaluation.\n */\n update(evalId, body, options) {\n return this._client.post(`/evals/${evalId}`, { body, ...options });\n }\n list(query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list({}, query);\n }\n return this._client.getAPIList('/evals', EvalListResponsesPage, { query, ...options });\n }\n /**\n * Delete an evaluation.\n */\n del(evalId, options) {\n return this._client.delete(`/evals/${evalId}`, options);\n }\n}\nexport class EvalListResponsesPage extends CursorPage {\n}\nEvals.EvalListResponsesPage = EvalListResponsesPage;\nEvals.Runs = Runs;\nEvals.RunListResponsesPage = RunListResponsesPage;\n//# sourceMappingURL=evals.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../resource.mjs\";\nimport { isRequestOptions } from \"../core.mjs\";\nimport { sleep } from \"../core.mjs\";\nimport { APIConnectionTimeoutError } from \"../error.mjs\";\nimport * as Core from \"../core.mjs\";\nimport { CursorPage } from \"../pagination.mjs\";\nexport class Files extends APIResource {\n /**\n * Upload a file that can be used across various endpoints. Individual files can be\n * up to 512 MB, and the size of all files uploaded by one organization can be up\n * to 100 GB.\n *\n * The Assistants API supports files up to 2 million tokens and of specific file\n * types. See the\n * [Assistants Tools guide](https://platform.openai.com/docs/assistants/tools) for\n * details.\n *\n * The Fine-tuning API only supports `.jsonl` files. The input also has certain\n * required formats for fine-tuning\n * [chat](https://platform.openai.com/docs/api-reference/fine-tuning/chat-input) or\n * [completions](https://platform.openai.com/docs/api-reference/fine-tuning/completions-input)\n * models.\n *\n * The Batch API only supports `.jsonl` files up to 200 MB in size. The input also\n * has a specific required\n * [format](https://platform.openai.com/docs/api-reference/batch/request-input).\n *\n * Please [contact us](https://help.openai.com/) if you need to increase these\n * storage limits.\n */\n create(body, options) {\n return this._client.post('/files', Core.multipartFormRequestOptions({ body, ...options }));\n }\n /**\n * Returns information about a specific file.\n */\n retrieve(fileId, options) {\n return this._client.get(`/files/${fileId}`, options);\n }\n list(query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list({}, query);\n }\n return this._client.getAPIList('/files', FileObjectsPage, { query, ...options });\n }\n /**\n * Delete a file.\n */\n del(fileId, options) {\n return this._client.delete(`/files/${fileId}`, options);\n }\n /**\n * Returns the contents of the specified file.\n */\n content(fileId, options) {\n return this._client.get(`/files/${fileId}/content`, {\n ...options,\n headers: { Accept: 'application/binary', ...options?.headers },\n __binaryResponse: true,\n });\n }\n /**\n * Returns the contents of the specified file.\n *\n * @deprecated The `.content()` method should be used instead\n */\n retrieveContent(fileId, options) {\n return this._client.get(`/files/${fileId}/content`, options);\n }\n /**\n * Waits for the given file to be processed, default timeout is 30 mins.\n */\n async waitForProcessing(id, { pollInterval = 5000, maxWait = 30 * 60 * 1000 } = {}) {\n const TERMINAL_STATES = new Set(['processed', 'error', 'deleted']);\n const start = Date.now();\n let file = await this.retrieve(id);\n while (!file.status || !TERMINAL_STATES.has(file.status)) {\n await sleep(pollInterval);\n file = await this.retrieve(id);\n if (Date.now() - start > maxWait) {\n throw new APIConnectionTimeoutError({\n message: `Giving up on waiting for file ${id} to finish processing after ${maxWait} milliseconds.`,\n });\n }\n }\n return file;\n }\n}\nexport class FileObjectsPage extends CursorPage {\n}\nFiles.FileObjectsPage = FileObjectsPage;\n//# sourceMappingURL=files.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nexport class Methods extends APIResource {\n}\n//# sourceMappingURL=methods.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nexport class Graders extends APIResource {\n /**\n * Run a grader.\n *\n * @example\n * ```ts\n * const response = await client.fineTuning.alpha.graders.run({\n * grader: {\n * input: 'input',\n * name: 'name',\n * operation: 'eq',\n * reference: 'reference',\n * type: 'string_check',\n * },\n * model_sample: 'model_sample',\n * reference_answer: 'string',\n * });\n * ```\n */\n run(body, options) {\n return this._client.post('/fine_tuning/alpha/graders/run', { body, ...options });\n }\n /**\n * Validate a grader.\n *\n * @example\n * ```ts\n * const response =\n * await client.fineTuning.alpha.graders.validate({\n * grader: {\n * input: 'input',\n * name: 'name',\n * operation: 'eq',\n * reference: 'reference',\n * type: 'string_check',\n * },\n * });\n * ```\n */\n validate(body, options) {\n return this._client.post('/fine_tuning/alpha/graders/validate', { body, ...options });\n }\n}\n//# sourceMappingURL=graders.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport * as GradersAPI from \"./graders.mjs\";\nimport { Graders, } from \"./graders.mjs\";\nexport class Alpha extends APIResource {\n constructor() {\n super(...arguments);\n this.graders = new GradersAPI.Graders(this._client);\n }\n}\nAlpha.Graders = Graders;\n//# sourceMappingURL=alpha.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../core.mjs\";\nimport { Page } from \"../../../pagination.mjs\";\nexport class Permissions extends APIResource {\n /**\n * **NOTE:** Calling this endpoint requires an [admin API key](../admin-api-keys).\n *\n * This enables organization owners to share fine-tuned models with other projects\n * in their organization.\n *\n * @example\n * ```ts\n * // Automatically fetches more pages as needed.\n * for await (const permissionCreateResponse of client.fineTuning.checkpoints.permissions.create(\n * 'ft:gpt-4o-mini-2024-07-18:org:weather:B7R9VjQd',\n * { project_ids: ['string'] },\n * )) {\n * // ...\n * }\n * ```\n */\n create(fineTunedModelCheckpoint, body, options) {\n return this._client.getAPIList(`/fine_tuning/checkpoints/${fineTunedModelCheckpoint}/permissions`, PermissionCreateResponsesPage, { body, method: 'post', ...options });\n }\n retrieve(fineTunedModelCheckpoint, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.retrieve(fineTunedModelCheckpoint, {}, query);\n }\n return this._client.get(`/fine_tuning/checkpoints/${fineTunedModelCheckpoint}/permissions`, {\n query,\n ...options,\n });\n }\n /**\n * **NOTE:** This endpoint requires an [admin API key](../admin-api-keys).\n *\n * Organization owners can use this endpoint to delete a permission for a\n * fine-tuned model checkpoint.\n *\n * @example\n * ```ts\n * const permission =\n * await client.fineTuning.checkpoints.permissions.del(\n * 'ft:gpt-4o-mini-2024-07-18:org:weather:B7R9VjQd',\n * 'cp_zc4Q7MP6XxulcVzj4MZdwsAB',\n * );\n * ```\n */\n del(fineTunedModelCheckpoint, permissionId, options) {\n return this._client.delete(`/fine_tuning/checkpoints/${fineTunedModelCheckpoint}/permissions/${permissionId}`, options);\n }\n}\n/**\n * Note: no pagination actually occurs yet, this is for forwards-compatibility.\n */\nexport class PermissionCreateResponsesPage extends Page {\n}\nPermissions.PermissionCreateResponsesPage = PermissionCreateResponsesPage;\n//# sourceMappingURL=permissions.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport * as PermissionsAPI from \"./permissions.mjs\";\nimport { PermissionCreateResponsesPage, Permissions, } from \"./permissions.mjs\";\nexport class Checkpoints extends APIResource {\n constructor() {\n super(...arguments);\n this.permissions = new PermissionsAPI.Permissions(this._client);\n }\n}\nCheckpoints.Permissions = Permissions;\nCheckpoints.PermissionCreateResponsesPage = PermissionCreateResponsesPage;\n//# sourceMappingURL=checkpoints.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../core.mjs\";\nimport { CursorPage } from \"../../../pagination.mjs\";\nexport class Checkpoints extends APIResource {\n list(fineTuningJobId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list(fineTuningJobId, {}, query);\n }\n return this._client.getAPIList(`/fine_tuning/jobs/${fineTuningJobId}/checkpoints`, FineTuningJobCheckpointsPage, { query, ...options });\n }\n}\nexport class FineTuningJobCheckpointsPage extends CursorPage {\n}\nCheckpoints.FineTuningJobCheckpointsPage = FineTuningJobCheckpointsPage;\n//# sourceMappingURL=checkpoints.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../core.mjs\";\nimport * as CheckpointsAPI from \"./checkpoints.mjs\";\nimport { Checkpoints, FineTuningJobCheckpointsPage, } from \"./checkpoints.mjs\";\nimport { CursorPage } from \"../../../pagination.mjs\";\nexport class Jobs extends APIResource {\n constructor() {\n super(...arguments);\n this.checkpoints = new CheckpointsAPI.Checkpoints(this._client);\n }\n /**\n * Creates a fine-tuning job which begins the process of creating a new model from\n * a given dataset.\n *\n * Response includes details of the enqueued job including job status and the name\n * of the fine-tuned models once complete.\n *\n * [Learn more about fine-tuning](https://platform.openai.com/docs/guides/fine-tuning)\n *\n * @example\n * ```ts\n * const fineTuningJob = await client.fineTuning.jobs.create({\n * model: 'gpt-4o-mini',\n * training_file: 'file-abc123',\n * });\n * ```\n */\n create(body, options) {\n return this._client.post('/fine_tuning/jobs', { body, ...options });\n }\n /**\n * Get info about a fine-tuning job.\n *\n * [Learn more about fine-tuning](https://platform.openai.com/docs/guides/fine-tuning)\n *\n * @example\n * ```ts\n * const fineTuningJob = await client.fineTuning.jobs.retrieve(\n * 'ft-AF1WoRqd3aJAHsqc9NY7iL8F',\n * );\n * ```\n */\n retrieve(fineTuningJobId, options) {\n return this._client.get(`/fine_tuning/jobs/${fineTuningJobId}`, options);\n }\n list(query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list({}, query);\n }\n return this._client.getAPIList('/fine_tuning/jobs', FineTuningJobsPage, { query, ...options });\n }\n /**\n * Immediately cancel a fine-tune job.\n *\n * @example\n * ```ts\n * const fineTuningJob = await client.fineTuning.jobs.cancel(\n * 'ft-AF1WoRqd3aJAHsqc9NY7iL8F',\n * );\n * ```\n */\n cancel(fineTuningJobId, options) {\n return this._client.post(`/fine_tuning/jobs/${fineTuningJobId}/cancel`, options);\n }\n listEvents(fineTuningJobId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.listEvents(fineTuningJobId, {}, query);\n }\n return this._client.getAPIList(`/fine_tuning/jobs/${fineTuningJobId}/events`, FineTuningJobEventsPage, {\n query,\n ...options,\n });\n }\n /**\n * Pause a fine-tune job.\n *\n * @example\n * ```ts\n * const fineTuningJob = await client.fineTuning.jobs.pause(\n * 'ft-AF1WoRqd3aJAHsqc9NY7iL8F',\n * );\n * ```\n */\n pause(fineTuningJobId, options) {\n return this._client.post(`/fine_tuning/jobs/${fineTuningJobId}/pause`, options);\n }\n /**\n * Resume a fine-tune job.\n *\n * @example\n * ```ts\n * const fineTuningJob = await client.fineTuning.jobs.resume(\n * 'ft-AF1WoRqd3aJAHsqc9NY7iL8F',\n * );\n * ```\n */\n resume(fineTuningJobId, options) {\n return this._client.post(`/fine_tuning/jobs/${fineTuningJobId}/resume`, options);\n }\n}\nexport class FineTuningJobsPage extends CursorPage {\n}\nexport class FineTuningJobEventsPage extends CursorPage {\n}\nJobs.FineTuningJobsPage = FineTuningJobsPage;\nJobs.FineTuningJobEventsPage = FineTuningJobEventsPage;\nJobs.Checkpoints = Checkpoints;\nJobs.FineTuningJobCheckpointsPage = FineTuningJobCheckpointsPage;\n//# sourceMappingURL=jobs.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport * as MethodsAPI from \"./methods.mjs\";\nimport { Methods, } from \"./methods.mjs\";\nimport * as AlphaAPI from \"./alpha/alpha.mjs\";\nimport { Alpha } from \"./alpha/alpha.mjs\";\nimport * as CheckpointsAPI from \"./checkpoints/checkpoints.mjs\";\nimport { Checkpoints } from \"./checkpoints/checkpoints.mjs\";\nimport * as JobsAPI from \"./jobs/jobs.mjs\";\nimport { FineTuningJobEventsPage, FineTuningJobsPage, Jobs, } from \"./jobs/jobs.mjs\";\nexport class FineTuning extends APIResource {\n constructor() {\n super(...arguments);\n this.methods = new MethodsAPI.Methods(this._client);\n this.jobs = new JobsAPI.Jobs(this._client);\n this.checkpoints = new CheckpointsAPI.Checkpoints(this._client);\n this.alpha = new AlphaAPI.Alpha(this._client);\n }\n}\nFineTuning.Methods = Methods;\nFineTuning.Jobs = Jobs;\nFineTuning.FineTuningJobsPage = FineTuningJobsPage;\nFineTuning.FineTuningJobEventsPage = FineTuningJobEventsPage;\nFineTuning.Checkpoints = Checkpoints;\nFineTuning.Alpha = Alpha;\n//# sourceMappingURL=fine-tuning.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nexport class GraderModels extends APIResource {\n}\n//# sourceMappingURL=grader-models.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport * as GraderModelsAPI from \"./grader-models.mjs\";\nimport { GraderModels, } from \"./grader-models.mjs\";\nexport class Graders extends APIResource {\n constructor() {\n super(...arguments);\n this.graderModels = new GraderModelsAPI.GraderModels(this._client);\n }\n}\nGraders.GraderModels = GraderModels;\n//# sourceMappingURL=graders.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../resource.mjs\";\nimport * as Core from \"../core.mjs\";\nexport class Images extends APIResource {\n /**\n * Creates a variation of a given image. This endpoint only supports `dall-e-2`.\n *\n * @example\n * ```ts\n * const imagesResponse = await client.images.createVariation({\n * image: fs.createReadStream('otter.png'),\n * });\n * ```\n */\n createVariation(body, options) {\n return this._client.post('/images/variations', Core.multipartFormRequestOptions({ body, ...options }));\n }\n /**\n * Creates an edited or extended image given one or more source images and a\n * prompt. This endpoint only supports `gpt-image-1` and `dall-e-2`.\n *\n * @example\n * ```ts\n * const imagesResponse = await client.images.edit({\n * image: fs.createReadStream('path/to/file'),\n * prompt: 'A cute baby sea otter wearing a beret',\n * });\n * ```\n */\n edit(body, options) {\n return this._client.post('/images/edits', Core.multipartFormRequestOptions({ body, ...options }));\n }\n /**\n * Creates an image given a prompt.\n * [Learn more](https://platform.openai.com/docs/guides/images).\n *\n * @example\n * ```ts\n * const imagesResponse = await client.images.generate({\n * prompt: 'A cute baby sea otter',\n * });\n * ```\n */\n generate(body, options) {\n return this._client.post('/images/generations', { body, ...options });\n }\n}\n//# sourceMappingURL=images.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../resource.mjs\";\nimport { Page } from \"../pagination.mjs\";\nexport class Models extends APIResource {\n /**\n * Retrieves a model instance, providing basic information about the model such as\n * the owner and permissioning.\n */\n retrieve(model, options) {\n return this._client.get(`/models/${model}`, options);\n }\n /**\n * Lists the currently available models, and provides basic information about each\n * one such as the owner and availability.\n */\n list(options) {\n return this._client.getAPIList('/models', ModelsPage, options);\n }\n /**\n * Delete a fine-tuned model. You must have the Owner role in your organization to\n * delete a model.\n */\n del(model, options) {\n return this._client.delete(`/models/${model}`, options);\n }\n}\n/**\n * Note: no pagination actually occurs yet, this is for forwards-compatibility.\n */\nexport class ModelsPage extends Page {\n}\nModels.ModelsPage = ModelsPage;\n//# sourceMappingURL=models.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../resource.mjs\";\nexport class Moderations extends APIResource {\n /**\n * Classifies if text and/or image inputs are potentially harmful. Learn more in\n * the [moderation guide](https://platform.openai.com/docs/guides/moderation).\n */\n create(body, options) {\n return this._client.post('/moderations', { body, ...options });\n }\n}\n//# sourceMappingURL=moderations.mjs.map","import { OpenAIError } from \"../error.mjs\";\nimport { isAutoParsableResponseFormat } from \"../lib/parser.mjs\";\nexport function maybeParseResponse(response, params) {\n if (!params || !hasAutoParseableInput(params)) {\n return {\n ...response,\n output_parsed: null,\n output: response.output.map((item) => {\n if (item.type === 'function_call') {\n return {\n ...item,\n parsed_arguments: null,\n };\n }\n if (item.type === 'message') {\n return {\n ...item,\n content: item.content.map((content) => ({\n ...content,\n parsed: null,\n })),\n };\n }\n else {\n return item;\n }\n }),\n };\n }\n return parseResponse(response, params);\n}\nexport function parseResponse(response, params) {\n const output = response.output.map((item) => {\n if (item.type === 'function_call') {\n return {\n ...item,\n parsed_arguments: parseToolCall(params, item),\n };\n }\n if (item.type === 'message') {\n const content = item.content.map((content) => {\n if (content.type === 'output_text') {\n return {\n ...content,\n parsed: parseTextFormat(params, content.text),\n };\n }\n return content;\n });\n return {\n ...item,\n content,\n };\n }\n return item;\n });\n const parsed = Object.assign({}, response, { output });\n if (!Object.getOwnPropertyDescriptor(response, 'output_text')) {\n addOutputText(parsed);\n }\n Object.defineProperty(parsed, 'output_parsed', {\n enumerable: true,\n get() {\n for (const output of parsed.output) {\n if (output.type !== 'message') {\n continue;\n }\n for (const content of output.content) {\n if (content.type === 'output_text' && content.parsed !== null) {\n return content.parsed;\n }\n }\n }\n return null;\n },\n });\n return parsed;\n}\nfunction parseTextFormat(params, content) {\n if (params.text?.format?.type !== 'json_schema') {\n return null;\n }\n if ('$parseRaw' in params.text?.format) {\n const text_format = params.text?.format;\n return text_format.$parseRaw(content);\n }\n return JSON.parse(content);\n}\nexport function hasAutoParseableInput(params) {\n if (isAutoParsableResponseFormat(params.text?.format)) {\n return true;\n }\n return false;\n}\nexport function makeParseableResponseTool(tool, { parser, callback, }) {\n const obj = { ...tool };\n Object.defineProperties(obj, {\n $brand: {\n value: 'auto-parseable-tool',\n enumerable: false,\n },\n $parseRaw: {\n value: parser,\n enumerable: false,\n },\n $callback: {\n value: callback,\n enumerable: false,\n },\n });\n return obj;\n}\nexport function isAutoParsableTool(tool) {\n return tool?.['$brand'] === 'auto-parseable-tool';\n}\nfunction getInputToolByName(input_tools, name) {\n return input_tools.find((tool) => tool.type === 'function' && tool.name === name);\n}\nfunction parseToolCall(params, toolCall) {\n const inputTool = getInputToolByName(params.tools ?? [], toolCall.name);\n return {\n ...toolCall,\n ...toolCall,\n parsed_arguments: isAutoParsableTool(inputTool) ? inputTool.$parseRaw(toolCall.arguments)\n : inputTool?.strict ? JSON.parse(toolCall.arguments)\n : null,\n };\n}\nexport function shouldParseToolCall(params, toolCall) {\n if (!params) {\n return false;\n }\n const inputTool = getInputToolByName(params.tools ?? [], toolCall.name);\n return isAutoParsableTool(inputTool) || inputTool?.strict || false;\n}\nexport function validateInputTools(tools) {\n for (const tool of tools ?? []) {\n if (tool.type !== 'function') {\n throw new OpenAIError(`Currently only \\`function\\` tool types support auto-parsing; Received \\`${tool.type}\\``);\n }\n if (tool.function.strict !== true) {\n throw new OpenAIError(`The \\`${tool.function.name}\\` tool is not marked with \\`strict: true\\`. Only strict function tools can be auto-parsed`);\n }\n }\n}\nexport function addOutputText(rsp) {\n const texts = [];\n for (const output of rsp.output) {\n if (output.type !== 'message') {\n continue;\n }\n for (const content of output.content) {\n if (content.type === 'output_text') {\n texts.push(content.text);\n }\n }\n }\n rsp.output_text = texts.join('');\n}\n//# sourceMappingURL=ResponsesParser.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport { isRequestOptions } from \"../../core.mjs\";\nimport { ResponseItemsPage } from \"./responses.mjs\";\nexport class InputItems extends APIResource {\n list(responseId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list(responseId, {}, query);\n }\n return this._client.getAPIList(`/responses/${responseId}/input_items`, ResponseItemsPage, {\n query,\n ...options,\n });\n }\n}\nexport { ResponseItemsPage };\n//# sourceMappingURL=input-items.mjs.map","var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n};\nvar __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar _ResponseStream_instances, _ResponseStream_params, _ResponseStream_currentResponseSnapshot, _ResponseStream_finalResponse, _ResponseStream_beginRequest, _ResponseStream_addEvent, _ResponseStream_endRequest, _ResponseStream_accumulateResponse;\nimport { APIUserAbortError, OpenAIError } from \"../../error.mjs\";\nimport { EventStream } from \"../EventStream.mjs\";\nimport { maybeParseResponse } from \"../ResponsesParser.mjs\";\nexport class ResponseStream extends EventStream {\n constructor(params) {\n super();\n _ResponseStream_instances.add(this);\n _ResponseStream_params.set(this, void 0);\n _ResponseStream_currentResponseSnapshot.set(this, void 0);\n _ResponseStream_finalResponse.set(this, void 0);\n __classPrivateFieldSet(this, _ResponseStream_params, params, \"f\");\n }\n static createResponse(client, params, options) {\n const runner = new ResponseStream(params);\n runner._run(() => runner._createOrRetrieveResponse(client, params, {\n ...options,\n headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' },\n }));\n return runner;\n }\n async _createOrRetrieveResponse(client, params, options) {\n const signal = options?.signal;\n if (signal) {\n if (signal.aborted)\n this.controller.abort();\n signal.addEventListener('abort', () => this.controller.abort());\n }\n __classPrivateFieldGet(this, _ResponseStream_instances, \"m\", _ResponseStream_beginRequest).call(this);\n let stream;\n let starting_after = null;\n if ('response_id' in params) {\n stream = await client.responses.retrieve(params.response_id, { stream: true }, { ...options, signal: this.controller.signal, stream: true });\n starting_after = params.starting_after ?? null;\n }\n else {\n stream = await client.responses.create({ ...params, stream: true }, { ...options, signal: this.controller.signal });\n }\n this._connected();\n for await (const event of stream) {\n __classPrivateFieldGet(this, _ResponseStream_instances, \"m\", _ResponseStream_addEvent).call(this, event, starting_after);\n }\n if (stream.controller.signal?.aborted) {\n throw new APIUserAbortError();\n }\n return __classPrivateFieldGet(this, _ResponseStream_instances, \"m\", _ResponseStream_endRequest).call(this);\n }\n [(_ResponseStream_params = new WeakMap(), _ResponseStream_currentResponseSnapshot = new WeakMap(), _ResponseStream_finalResponse = new WeakMap(), _ResponseStream_instances = new WeakSet(), _ResponseStream_beginRequest = function _ResponseStream_beginRequest() {\n if (this.ended)\n return;\n __classPrivateFieldSet(this, _ResponseStream_currentResponseSnapshot, undefined, \"f\");\n }, _ResponseStream_addEvent = function _ResponseStream_addEvent(event, starting_after) {\n if (this.ended)\n return;\n const maybeEmit = (name, event) => {\n if (starting_after == null || event.sequence_number > starting_after) {\n this._emit(name, event);\n }\n };\n const response = __classPrivateFieldGet(this, _ResponseStream_instances, \"m\", _ResponseStream_accumulateResponse).call(this, event);\n maybeEmit('event', event);\n switch (event.type) {\n case 'response.output_text.delta': {\n const output = response.output[event.output_index];\n if (!output) {\n throw new OpenAIError(`missing output at index ${event.output_index}`);\n }\n if (output.type === 'message') {\n const content = output.content[event.content_index];\n if (!content) {\n throw new OpenAIError(`missing content at index ${event.content_index}`);\n }\n if (content.type !== 'output_text') {\n throw new OpenAIError(`expected content to be 'output_text', got ${content.type}`);\n }\n maybeEmit('response.output_text.delta', {\n ...event,\n snapshot: content.text,\n });\n }\n break;\n }\n case 'response.function_call_arguments.delta': {\n const output = response.output[event.output_index];\n if (!output) {\n throw new OpenAIError(`missing output at index ${event.output_index}`);\n }\n if (output.type === 'function_call') {\n maybeEmit('response.function_call_arguments.delta', {\n ...event,\n snapshot: output.arguments,\n });\n }\n break;\n }\n default:\n maybeEmit(event.type, event);\n break;\n }\n }, _ResponseStream_endRequest = function _ResponseStream_endRequest() {\n if (this.ended) {\n throw new OpenAIError(`stream has ended, this shouldn't happen`);\n }\n const snapshot = __classPrivateFieldGet(this, _ResponseStream_currentResponseSnapshot, \"f\");\n if (!snapshot) {\n throw new OpenAIError(`request ended without sending any events`);\n }\n __classPrivateFieldSet(this, _ResponseStream_currentResponseSnapshot, undefined, \"f\");\n const parsedResponse = finalizeResponse(snapshot, __classPrivateFieldGet(this, _ResponseStream_params, \"f\"));\n __classPrivateFieldSet(this, _ResponseStream_finalResponse, parsedResponse, \"f\");\n return parsedResponse;\n }, _ResponseStream_accumulateResponse = function _ResponseStream_accumulateResponse(event) {\n let snapshot = __classPrivateFieldGet(this, _ResponseStream_currentResponseSnapshot, \"f\");\n if (!snapshot) {\n if (event.type !== 'response.created') {\n throw new OpenAIError(`When snapshot hasn't been set yet, expected 'response.created' event, got ${event.type}`);\n }\n snapshot = __classPrivateFieldSet(this, _ResponseStream_currentResponseSnapshot, event.response, \"f\");\n return snapshot;\n }\n switch (event.type) {\n case 'response.output_item.added': {\n snapshot.output.push(event.item);\n break;\n }\n case 'response.content_part.added': {\n const output = snapshot.output[event.output_index];\n if (!output) {\n throw new OpenAIError(`missing output at index ${event.output_index}`);\n }\n if (output.type === 'message') {\n output.content.push(event.part);\n }\n break;\n }\n case 'response.output_text.delta': {\n const output = snapshot.output[event.output_index];\n if (!output) {\n throw new OpenAIError(`missing output at index ${event.output_index}`);\n }\n if (output.type === 'message') {\n const content = output.content[event.content_index];\n if (!content) {\n throw new OpenAIError(`missing content at index ${event.content_index}`);\n }\n if (content.type !== 'output_text') {\n throw new OpenAIError(`expected content to be 'output_text', got ${content.type}`);\n }\n content.text += event.delta;\n }\n break;\n }\n case 'response.function_call_arguments.delta': {\n const output = snapshot.output[event.output_index];\n if (!output) {\n throw new OpenAIError(`missing output at index ${event.output_index}`);\n }\n if (output.type === 'function_call') {\n output.arguments += event.delta;\n }\n break;\n }\n case 'response.completed': {\n __classPrivateFieldSet(this, _ResponseStream_currentResponseSnapshot, event.response, \"f\");\n break;\n }\n }\n return snapshot;\n }, Symbol.asyncIterator)]() {\n const pushQueue = [];\n const readQueue = [];\n let done = false;\n this.on('event', (event) => {\n const reader = readQueue.shift();\n if (reader) {\n reader.resolve(event);\n }\n else {\n pushQueue.push(event);\n }\n });\n this.on('end', () => {\n done = true;\n for (const reader of readQueue) {\n reader.resolve(undefined);\n }\n readQueue.length = 0;\n });\n this.on('abort', (err) => {\n done = true;\n for (const reader of readQueue) {\n reader.reject(err);\n }\n readQueue.length = 0;\n });\n this.on('error', (err) => {\n done = true;\n for (const reader of readQueue) {\n reader.reject(err);\n }\n readQueue.length = 0;\n });\n return {\n next: async () => {\n if (!pushQueue.length) {\n if (done) {\n return { value: undefined, done: true };\n }\n return new Promise((resolve, reject) => readQueue.push({ resolve, reject })).then((event) => (event ? { value: event, done: false } : { value: undefined, done: true }));\n }\n const event = pushQueue.shift();\n return { value: event, done: false };\n },\n return: async () => {\n this.abort();\n return { value: undefined, done: true };\n },\n };\n }\n /**\n * @returns a promise that resolves with the final Response, or rejects\n * if an error occurred or the stream ended prematurely without producing a REsponse.\n */\n async finalResponse() {\n await this.done();\n const response = __classPrivateFieldGet(this, _ResponseStream_finalResponse, \"f\");\n if (!response)\n throw new OpenAIError('stream ended without producing a ChatCompletion');\n return response;\n }\n}\nfunction finalizeResponse(snapshot, params) {\n return maybeParseResponse(snapshot, params);\n}\n//# sourceMappingURL=ResponseStream.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { parseResponse, addOutputText, } from \"../../lib/ResponsesParser.mjs\";\nimport { APIResource } from \"../../resource.mjs\";\nimport * as InputItemsAPI from \"./input-items.mjs\";\nimport { InputItems } from \"./input-items.mjs\";\nimport { ResponseStream } from \"../../lib/responses/ResponseStream.mjs\";\nimport { CursorPage } from \"../../pagination.mjs\";\nexport class Responses extends APIResource {\n constructor() {\n super(...arguments);\n this.inputItems = new InputItemsAPI.InputItems(this._client);\n }\n create(body, options) {\n return this._client.post('/responses', { body, ...options, stream: body.stream ?? false })._thenUnwrap((rsp) => {\n if ('object' in rsp && rsp.object === 'response') {\n addOutputText(rsp);\n }\n return rsp;\n });\n }\n retrieve(responseId, query = {}, options) {\n return this._client.get(`/responses/${responseId}`, {\n query,\n ...options,\n stream: query?.stream ?? false,\n });\n }\n /**\n * Deletes a model response with the given ID.\n *\n * @example\n * ```ts\n * await client.responses.del(\n * 'resp_677efb5139a88190b512bc3fef8e535d',\n * );\n * ```\n */\n del(responseId, options) {\n return this._client.delete(`/responses/${responseId}`, {\n ...options,\n headers: { Accept: '*/*', ...options?.headers },\n });\n }\n parse(body, options) {\n return this._client.responses\n .create(body, options)\n ._thenUnwrap((response) => parseResponse(response, body));\n }\n /**\n * Creates a model response stream\n */\n stream(body, options) {\n return ResponseStream.createResponse(this._client, body, options);\n }\n /**\n * Cancels a model response with the given ID. Only responses created with the\n * `background` parameter set to `true` can be cancelled.\n * [Learn more](https://platform.openai.com/docs/guides/background).\n *\n * @example\n * ```ts\n * await client.responses.cancel(\n * 'resp_677efb5139a88190b512bc3fef8e535d',\n * );\n * ```\n */\n cancel(responseId, options) {\n return this._client.post(`/responses/${responseId}/cancel`, {\n ...options,\n headers: { Accept: '*/*', ...options?.headers },\n });\n }\n}\nexport class ResponseItemsPage extends CursorPage {\n}\nResponses.InputItems = InputItems;\n//# sourceMappingURL=responses.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport * as Core from \"../../core.mjs\";\nexport class Parts extends APIResource {\n /**\n * Adds a\n * [Part](https://platform.openai.com/docs/api-reference/uploads/part-object) to an\n * [Upload](https://platform.openai.com/docs/api-reference/uploads/object) object.\n * A Part represents a chunk of bytes from the file you are trying to upload.\n *\n * Each Part can be at most 64 MB, and you can add Parts until you hit the Upload\n * maximum of 8 GB.\n *\n * It is possible to add multiple Parts in parallel. You can decide the intended\n * order of the Parts when you\n * [complete the Upload](https://platform.openai.com/docs/api-reference/uploads/complete).\n */\n create(uploadId, body, options) {\n return this._client.post(`/uploads/${uploadId}/parts`, Core.multipartFormRequestOptions({ body, ...options }));\n }\n}\n//# sourceMappingURL=parts.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport * as PartsAPI from \"./parts.mjs\";\nimport { Parts } from \"./parts.mjs\";\nexport class Uploads extends APIResource {\n constructor() {\n super(...arguments);\n this.parts = new PartsAPI.Parts(this._client);\n }\n /**\n * Creates an intermediate\n * [Upload](https://platform.openai.com/docs/api-reference/uploads/object) object\n * that you can add\n * [Parts](https://platform.openai.com/docs/api-reference/uploads/part-object) to.\n * Currently, an Upload can accept at most 8 GB in total and expires after an hour\n * after you create it.\n *\n * Once you complete the Upload, we will create a\n * [File](https://platform.openai.com/docs/api-reference/files/object) object that\n * contains all the parts you uploaded. This File is usable in the rest of our\n * platform as a regular File object.\n *\n * For certain `purpose` values, the correct `mime_type` must be specified. Please\n * refer to documentation for the\n * [supported MIME types for your use case](https://platform.openai.com/docs/assistants/tools/file-search#supported-files).\n *\n * For guidance on the proper filename extensions for each purpose, please follow\n * the documentation on\n * [creating a File](https://platform.openai.com/docs/api-reference/files/create).\n */\n create(body, options) {\n return this._client.post('/uploads', { body, ...options });\n }\n /**\n * Cancels the Upload. No Parts may be added after an Upload is cancelled.\n */\n cancel(uploadId, options) {\n return this._client.post(`/uploads/${uploadId}/cancel`, options);\n }\n /**\n * Completes the\n * [Upload](https://platform.openai.com/docs/api-reference/uploads/object).\n *\n * Within the returned Upload object, there is a nested\n * [File](https://platform.openai.com/docs/api-reference/files/object) object that\n * is ready to use in the rest of the platform.\n *\n * You can specify the order of the Parts by passing in an ordered list of the Part\n * IDs.\n *\n * The number of bytes uploaded upon completion must match the number of bytes\n * initially specified when creating the Upload object. No Parts may be added after\n * an Upload is completed.\n */\n complete(uploadId, body, options) {\n return this._client.post(`/uploads/${uploadId}/complete`, { body, ...options });\n }\n}\nUploads.Parts = Parts;\n//# sourceMappingURL=uploads.mjs.map","/**\n * Like `Promise.allSettled()` but throws an error if any promises are rejected.\n */\nexport const allSettledWithThrow = async (promises) => {\n const results = await Promise.allSettled(promises);\n const rejected = results.filter((result) => result.status === 'rejected');\n if (rejected.length) {\n for (const result of rejected) {\n console.error(result.reason);\n }\n throw new Error(`${rejected.length} promise(s) failed - see the above errors`);\n }\n // Note: TS was complaining about using `.filter().map()` here for some reason\n const values = [];\n for (const result of results) {\n if (result.status === 'fulfilled') {\n values.push(result.value);\n }\n }\n return values;\n};\n//# sourceMappingURL=Util.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport { sleep, isRequestOptions } from \"../../core.mjs\";\nimport { CursorPage, Page } from \"../../pagination.mjs\";\nexport class Files extends APIResource {\n /**\n * Create a vector store file by attaching a\n * [File](https://platform.openai.com/docs/api-reference/files) to a\n * [vector store](https://platform.openai.com/docs/api-reference/vector-stores/object).\n */\n create(vectorStoreId, body, options) {\n return this._client.post(`/vector_stores/${vectorStoreId}/files`, {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Retrieves a vector store file.\n */\n retrieve(vectorStoreId, fileId, options) {\n return this._client.get(`/vector_stores/${vectorStoreId}/files/${fileId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Update attributes on a vector store file.\n */\n update(vectorStoreId, fileId, body, options) {\n return this._client.post(`/vector_stores/${vectorStoreId}/files/${fileId}`, {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n list(vectorStoreId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list(vectorStoreId, {}, query);\n }\n return this._client.getAPIList(`/vector_stores/${vectorStoreId}/files`, VectorStoreFilesPage, {\n query,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Delete a vector store file. This will remove the file from the vector store but\n * the file itself will not be deleted. To delete the file, use the\n * [delete file](https://platform.openai.com/docs/api-reference/files/delete)\n * endpoint.\n */\n del(vectorStoreId, fileId, options) {\n return this._client.delete(`/vector_stores/${vectorStoreId}/files/${fileId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Attach a file to the given vector store and wait for it to be processed.\n */\n async createAndPoll(vectorStoreId, body, options) {\n const file = await this.create(vectorStoreId, body, options);\n return await this.poll(vectorStoreId, file.id, options);\n }\n /**\n * Wait for the vector store file to finish processing.\n *\n * Note: this will return even if the file failed to process, you need to check\n * file.last_error and file.status to handle these cases\n */\n async poll(vectorStoreId, fileId, options) {\n const headers = { ...options?.headers, 'X-Stainless-Poll-Helper': 'true' };\n if (options?.pollIntervalMs) {\n headers['X-Stainless-Custom-Poll-Interval'] = options.pollIntervalMs.toString();\n }\n while (true) {\n const fileResponse = await this.retrieve(vectorStoreId, fileId, {\n ...options,\n headers,\n }).withResponse();\n const file = fileResponse.data;\n switch (file.status) {\n case 'in_progress':\n let sleepInterval = 5000;\n if (options?.pollIntervalMs) {\n sleepInterval = options.pollIntervalMs;\n }\n else {\n const headerInterval = fileResponse.response.headers.get('openai-poll-after-ms');\n if (headerInterval) {\n const headerIntervalMs = parseInt(headerInterval);\n if (!isNaN(headerIntervalMs)) {\n sleepInterval = headerIntervalMs;\n }\n }\n }\n await sleep(sleepInterval);\n break;\n case 'failed':\n case 'completed':\n return file;\n }\n }\n }\n /**\n * Upload a file to the `files` API and then attach it to the given vector store.\n *\n * Note the file will be asynchronously processed (you can use the alternative\n * polling helper method to wait for processing to complete).\n */\n async upload(vectorStoreId, file, options) {\n const fileInfo = await this._client.files.create({ file: file, purpose: 'assistants' }, options);\n return this.create(vectorStoreId, { file_id: fileInfo.id }, options);\n }\n /**\n * Add a file to a vector store and poll until processing is complete.\n */\n async uploadAndPoll(vectorStoreId, file, options) {\n const fileInfo = await this.upload(vectorStoreId, file, options);\n return await this.poll(vectorStoreId, fileInfo.id, options);\n }\n /**\n * Retrieve the parsed contents of a vector store file.\n */\n content(vectorStoreId, fileId, options) {\n return this._client.getAPIList(`/vector_stores/${vectorStoreId}/files/${fileId}/content`, FileContentResponsesPage, { ...options, headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers } });\n }\n}\nexport class VectorStoreFilesPage extends CursorPage {\n}\n/**\n * Note: no pagination actually occurs yet, this is for forwards-compatibility.\n */\nexport class FileContentResponsesPage extends Page {\n}\nFiles.VectorStoreFilesPage = VectorStoreFilesPage;\nFiles.FileContentResponsesPage = FileContentResponsesPage;\n//# sourceMappingURL=files.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport { isRequestOptions } from \"../../core.mjs\";\nimport { sleep } from \"../../core.mjs\";\nimport { allSettledWithThrow } from \"../../lib/Util.mjs\";\nimport { VectorStoreFilesPage } from \"./files.mjs\";\nexport class FileBatches extends APIResource {\n /**\n * Create a vector store file batch.\n */\n create(vectorStoreId, body, options) {\n return this._client.post(`/vector_stores/${vectorStoreId}/file_batches`, {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Retrieves a vector store file batch.\n */\n retrieve(vectorStoreId, batchId, options) {\n return this._client.get(`/vector_stores/${vectorStoreId}/file_batches/${batchId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Cancel a vector store file batch. This attempts to cancel the processing of\n * files in this batch as soon as possible.\n */\n cancel(vectorStoreId, batchId, options) {\n return this._client.post(`/vector_stores/${vectorStoreId}/file_batches/${batchId}/cancel`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Create a vector store batch and poll until all files have been processed.\n */\n async createAndPoll(vectorStoreId, body, options) {\n const batch = await this.create(vectorStoreId, body);\n return await this.poll(vectorStoreId, batch.id, options);\n }\n listFiles(vectorStoreId, batchId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.listFiles(vectorStoreId, batchId, {}, query);\n }\n return this._client.getAPIList(`/vector_stores/${vectorStoreId}/file_batches/${batchId}/files`, VectorStoreFilesPage, { query, ...options, headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers } });\n }\n /**\n * Wait for the given file batch to be processed.\n *\n * Note: this will return even if one of the files failed to process, you need to\n * check batch.file_counts.failed_count to handle this case.\n */\n async poll(vectorStoreId, batchId, options) {\n const headers = { ...options?.headers, 'X-Stainless-Poll-Helper': 'true' };\n if (options?.pollIntervalMs) {\n headers['X-Stainless-Custom-Poll-Interval'] = options.pollIntervalMs.toString();\n }\n while (true) {\n const { data: batch, response } = await this.retrieve(vectorStoreId, batchId, {\n ...options,\n headers,\n }).withResponse();\n switch (batch.status) {\n case 'in_progress':\n let sleepInterval = 5000;\n if (options?.pollIntervalMs) {\n sleepInterval = options.pollIntervalMs;\n }\n else {\n const headerInterval = response.headers.get('openai-poll-after-ms');\n if (headerInterval) {\n const headerIntervalMs = parseInt(headerInterval);\n if (!isNaN(headerIntervalMs)) {\n sleepInterval = headerIntervalMs;\n }\n }\n }\n await sleep(sleepInterval);\n break;\n case 'failed':\n case 'cancelled':\n case 'completed':\n return batch;\n }\n }\n }\n /**\n * Uploads the given files concurrently and then creates a vector store file batch.\n *\n * The concurrency limit is configurable using the `maxConcurrency` parameter.\n */\n async uploadAndPoll(vectorStoreId, { files, fileIds = [] }, options) {\n if (files == null || files.length == 0) {\n throw new Error(`No \\`files\\` provided to process. If you've already uploaded files you should use \\`.createAndPoll()\\` instead`);\n }\n const configuredConcurrency = options?.maxConcurrency ?? 5;\n // We cap the number of workers at the number of files (so we don't start any unnecessary workers)\n const concurrencyLimit = Math.min(configuredConcurrency, files.length);\n const client = this._client;\n const fileIterator = files.values();\n const allFileIds = [...fileIds];\n // This code is based on this design. The libraries don't accommodate our environment limits.\n // https://stackoverflow.com/questions/40639432/what-is-the-best-way-to-limit-concurrency-when-using-es6s-promise-all\n async function processFiles(iterator) {\n for (let item of iterator) {\n const fileObj = await client.files.create({ file: item, purpose: 'assistants' }, options);\n allFileIds.push(fileObj.id);\n }\n }\n // Start workers to process results\n const workers = Array(concurrencyLimit).fill(fileIterator).map(processFiles);\n // Wait for all processing to complete.\n await allSettledWithThrow(workers);\n return await this.createAndPoll(vectorStoreId, {\n file_ids: allFileIds,\n });\n }\n}\nexport { VectorStoreFilesPage };\n//# sourceMappingURL=file-batches.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport { isRequestOptions } from \"../../core.mjs\";\nimport * as FileBatchesAPI from \"./file-batches.mjs\";\nimport { FileBatches, } from \"./file-batches.mjs\";\nimport * as FilesAPI from \"./files.mjs\";\nimport { FileContentResponsesPage, Files, VectorStoreFilesPage, } from \"./files.mjs\";\nimport { CursorPage, Page } from \"../../pagination.mjs\";\nexport class VectorStores extends APIResource {\n constructor() {\n super(...arguments);\n this.files = new FilesAPI.Files(this._client);\n this.fileBatches = new FileBatchesAPI.FileBatches(this._client);\n }\n /**\n * Create a vector store.\n */\n create(body, options) {\n return this._client.post('/vector_stores', {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Retrieves a vector store.\n */\n retrieve(vectorStoreId, options) {\n return this._client.get(`/vector_stores/${vectorStoreId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Modifies a vector store.\n */\n update(vectorStoreId, body, options) {\n return this._client.post(`/vector_stores/${vectorStoreId}`, {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n list(query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list({}, query);\n }\n return this._client.getAPIList('/vector_stores', VectorStoresPage, {\n query,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Delete a vector store.\n */\n del(vectorStoreId, options) {\n return this._client.delete(`/vector_stores/${vectorStoreId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Search a vector store for relevant chunks based on a query and file attributes\n * filter.\n */\n search(vectorStoreId, body, options) {\n return this._client.getAPIList(`/vector_stores/${vectorStoreId}/search`, VectorStoreSearchResponsesPage, {\n body,\n method: 'post',\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n}\nexport class VectorStoresPage extends CursorPage {\n}\n/**\n * Note: no pagination actually occurs yet, this is for forwards-compatibility.\n */\nexport class VectorStoreSearchResponsesPage extends Page {\n}\nVectorStores.VectorStoresPage = VectorStoresPage;\nVectorStores.VectorStoreSearchResponsesPage = VectorStoreSearchResponsesPage;\nVectorStores.Files = Files;\nVectorStores.VectorStoreFilesPage = VectorStoreFilesPage;\nVectorStores.FileContentResponsesPage = FileContentResponsesPage;\nVectorStores.FileBatches = FileBatches;\n//# sourceMappingURL=vector-stores.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nvar _a;\nimport * as qs from \"./internal/qs/index.mjs\";\nimport * as Core from \"./core.mjs\";\nimport * as Errors from \"./error.mjs\";\nimport * as Pagination from \"./pagination.mjs\";\nimport * as Uploads from \"./uploads.mjs\";\nimport * as API from \"./resources/index.mjs\";\nimport { Batches, BatchesPage, } from \"./resources/batches.mjs\";\nimport { Completions, } from \"./resources/completions.mjs\";\nimport { Embeddings, } from \"./resources/embeddings.mjs\";\nimport { FileObjectsPage, Files, } from \"./resources/files.mjs\";\nimport { Images, } from \"./resources/images.mjs\";\nimport { Models, ModelsPage } from \"./resources/models.mjs\";\nimport { Moderations, } from \"./resources/moderations.mjs\";\nimport { Audio } from \"./resources/audio/audio.mjs\";\nimport { Beta } from \"./resources/beta/beta.mjs\";\nimport { Chat } from \"./resources/chat/chat.mjs\";\nimport { ContainerListResponsesPage, Containers, } from \"./resources/containers/containers.mjs\";\nimport { EvalListResponsesPage, Evals, } from \"./resources/evals/evals.mjs\";\nimport { FineTuning } from \"./resources/fine-tuning/fine-tuning.mjs\";\nimport { Graders } from \"./resources/graders/graders.mjs\";\nimport { Responses } from \"./resources/responses/responses.mjs\";\nimport { Uploads as UploadsAPIUploads, } from \"./resources/uploads/uploads.mjs\";\nimport { VectorStoreSearchResponsesPage, VectorStores, VectorStoresPage, } from \"./resources/vector-stores/vector-stores.mjs\";\nimport { ChatCompletionsPage, } from \"./resources/chat/completions/completions.mjs\";\n/**\n * API Client for interfacing with the OpenAI API.\n */\nexport class OpenAI extends Core.APIClient {\n /**\n * API Client for interfacing with the OpenAI API.\n *\n * @param {string | undefined} [opts.apiKey=process.env['OPENAI_API_KEY'] ?? undefined]\n * @param {string | null | undefined} [opts.organization=process.env['OPENAI_ORG_ID'] ?? null]\n * @param {string | null | undefined} [opts.project=process.env['OPENAI_PROJECT_ID'] ?? null]\n * @param {string} [opts.baseURL=process.env['OPENAI_BASE_URL'] ?? https://api.openai.com/v1] - Override the default base URL for the API.\n * @param {number} [opts.timeout=10 minutes] - The maximum amount of time (in milliseconds) the client will wait for a response before timing out.\n * @param {number} [opts.httpAgent] - An HTTP agent used to manage HTTP(s) connections.\n * @param {Core.Fetch} [opts.fetch] - Specify a custom `fetch` function implementation.\n * @param {number} [opts.maxRetries=2] - The maximum number of times the client will retry a request.\n * @param {Core.Headers} opts.defaultHeaders - Default headers to include with every request to the API.\n * @param {Core.DefaultQuery} opts.defaultQuery - Default query parameters to include with every request to the API.\n * @param {boolean} [opts.dangerouslyAllowBrowser=false] - By default, client-side use of this library is not allowed, as it risks exposing your secret API credentials to attackers.\n */\n constructor({ baseURL = Core.readEnv('OPENAI_BASE_URL'), apiKey = Core.readEnv('OPENAI_API_KEY'), organization = Core.readEnv('OPENAI_ORG_ID') ?? null, project = Core.readEnv('OPENAI_PROJECT_ID') ?? null, ...opts } = {}) {\n if (apiKey === undefined) {\n throw new Errors.OpenAIError(\"The OPENAI_API_KEY environment variable is missing or empty; either provide it, or instantiate the OpenAI client with an apiKey option, like new OpenAI({ apiKey: 'My API Key' }).\");\n }\n const options = {\n apiKey,\n organization,\n project,\n ...opts,\n baseURL: baseURL || `https://api.openai.com/v1`,\n };\n if (!options.dangerouslyAllowBrowser && Core.isRunningInBrowser()) {\n throw new Errors.OpenAIError(\"It looks like you're running in a browser-like environment.\\n\\nThis is disabled by default, as it risks exposing your secret API credentials to attackers.\\nIf you understand the risks and have appropriate mitigations in place,\\nyou can set the `dangerouslyAllowBrowser` option to `true`, e.g.,\\n\\nnew OpenAI({ apiKey, dangerouslyAllowBrowser: true });\\n\\nhttps://help.openai.com/en/articles/5112595-best-practices-for-api-key-safety\\n\");\n }\n super({\n baseURL: options.baseURL,\n timeout: options.timeout ?? 600000 /* 10 minutes */,\n httpAgent: options.httpAgent,\n maxRetries: options.maxRetries,\n fetch: options.fetch,\n });\n this.completions = new API.Completions(this);\n this.chat = new API.Chat(this);\n this.embeddings = new API.Embeddings(this);\n this.files = new API.Files(this);\n this.images = new API.Images(this);\n this.audio = new API.Audio(this);\n this.moderations = new API.Moderations(this);\n this.models = new API.Models(this);\n this.fineTuning = new API.FineTuning(this);\n this.graders = new API.Graders(this);\n this.vectorStores = new API.VectorStores(this);\n this.beta = new API.Beta(this);\n this.batches = new API.Batches(this);\n this.uploads = new API.Uploads(this);\n this.responses = new API.Responses(this);\n this.evals = new API.Evals(this);\n this.containers = new API.Containers(this);\n this._options = options;\n this.apiKey = apiKey;\n this.organization = organization;\n this.project = project;\n }\n defaultQuery() {\n return this._options.defaultQuery;\n }\n defaultHeaders(opts) {\n return {\n ...super.defaultHeaders(opts),\n 'OpenAI-Organization': this.organization,\n 'OpenAI-Project': this.project,\n ...this._options.defaultHeaders,\n };\n }\n authHeaders(opts) {\n return { Authorization: `Bearer ${this.apiKey}` };\n }\n stringifyQuery(query) {\n return qs.stringify(query, { arrayFormat: 'brackets' });\n }\n}\n_a = OpenAI;\nOpenAI.OpenAI = _a;\nOpenAI.DEFAULT_TIMEOUT = 600000; // 10 minutes\nOpenAI.OpenAIError = Errors.OpenAIError;\nOpenAI.APIError = Errors.APIError;\nOpenAI.APIConnectionError = Errors.APIConnectionError;\nOpenAI.APIConnectionTimeoutError = Errors.APIConnectionTimeoutError;\nOpenAI.APIUserAbortError = Errors.APIUserAbortError;\nOpenAI.NotFoundError = Errors.NotFoundError;\nOpenAI.ConflictError = Errors.ConflictError;\nOpenAI.RateLimitError = Errors.RateLimitError;\nOpenAI.BadRequestError = Errors.BadRequestError;\nOpenAI.AuthenticationError = Errors.AuthenticationError;\nOpenAI.InternalServerError = Errors.InternalServerError;\nOpenAI.PermissionDeniedError = Errors.PermissionDeniedError;\nOpenAI.UnprocessableEntityError = Errors.UnprocessableEntityError;\nOpenAI.toFile = Uploads.toFile;\nOpenAI.fileFromPath = Uploads.fileFromPath;\nOpenAI.Completions = Completions;\nOpenAI.Chat = Chat;\nOpenAI.ChatCompletionsPage = ChatCompletionsPage;\nOpenAI.Embeddings = Embeddings;\nOpenAI.Files = Files;\nOpenAI.FileObjectsPage = FileObjectsPage;\nOpenAI.Images = Images;\nOpenAI.Audio = Audio;\nOpenAI.Moderations = Moderations;\nOpenAI.Models = Models;\nOpenAI.ModelsPage = ModelsPage;\nOpenAI.FineTuning = FineTuning;\nOpenAI.Graders = Graders;\nOpenAI.VectorStores = VectorStores;\nOpenAI.VectorStoresPage = VectorStoresPage;\nOpenAI.VectorStoreSearchResponsesPage = VectorStoreSearchResponsesPage;\nOpenAI.Beta = Beta;\nOpenAI.Batches = Batches;\nOpenAI.BatchesPage = BatchesPage;\nOpenAI.Uploads = UploadsAPIUploads;\nOpenAI.Responses = Responses;\nOpenAI.Evals = Evals;\nOpenAI.EvalListResponsesPage = EvalListResponsesPage;\nOpenAI.Containers = Containers;\nOpenAI.ContainerListResponsesPage = ContainerListResponsesPage;\n/** API Client for interfacing with the Azure OpenAI API. */\nexport class AzureOpenAI extends OpenAI {\n /**\n * API Client for interfacing with the Azure OpenAI API.\n *\n * @param {string | undefined} [opts.apiVersion=process.env['OPENAI_API_VERSION'] ?? undefined]\n * @param {string | undefined} [opts.endpoint=process.env['AZURE_OPENAI_ENDPOINT'] ?? undefined] - Your Azure endpoint, including the resource, e.g. `https://example-resource.azure.openai.com/`\n * @param {string | undefined} [opts.apiKey=process.env['AZURE_OPENAI_API_KEY'] ?? undefined]\n * @param {string | undefined} opts.deployment - A model deployment, if given, sets the base client URL to include `/deployments/{deployment}`.\n * @param {string | null | undefined} [opts.organization=process.env['OPENAI_ORG_ID'] ?? null]\n * @param {string} [opts.baseURL=process.env['OPENAI_BASE_URL']] - Sets the base URL for the API, e.g. `https://example-resource.azure.openai.com/openai/`.\n * @param {number} [opts.timeout=10 minutes] - The maximum amount of time (in milliseconds) the client will wait for a response before timing out.\n * @param {number} [opts.httpAgent] - An HTTP agent used to manage HTTP(s) connections.\n * @param {Core.Fetch} [opts.fetch] - Specify a custom `fetch` function implementation.\n * @param {number} [opts.maxRetries=2] - The maximum number of times the client will retry a request.\n * @param {Core.Headers} opts.defaultHeaders - Default headers to include with every request to the API.\n * @param {Core.DefaultQuery} opts.defaultQuery - Default query parameters to include with every request to the API.\n * @param {boolean} [opts.dangerouslyAllowBrowser=false] - By default, client-side use of this library is not allowed, as it risks exposing your secret API credentials to attackers.\n */\n constructor({ baseURL = Core.readEnv('OPENAI_BASE_URL'), apiKey = Core.readEnv('AZURE_OPENAI_API_KEY'), apiVersion = Core.readEnv('OPENAI_API_VERSION'), endpoint, deployment, azureADTokenProvider, dangerouslyAllowBrowser, ...opts } = {}) {\n if (!apiVersion) {\n throw new Errors.OpenAIError(\"The OPENAI_API_VERSION environment variable is missing or empty; either provide it, or instantiate the AzureOpenAI client with an apiVersion option, like new AzureOpenAI({ apiVersion: 'My API Version' }).\");\n }\n if (typeof azureADTokenProvider === 'function') {\n dangerouslyAllowBrowser = true;\n }\n if (!azureADTokenProvider && !apiKey) {\n throw new Errors.OpenAIError('Missing credentials. Please pass one of `apiKey` and `azureADTokenProvider`, or set the `AZURE_OPENAI_API_KEY` environment variable.');\n }\n if (azureADTokenProvider && apiKey) {\n throw new Errors.OpenAIError('The `apiKey` and `azureADTokenProvider` arguments are mutually exclusive; only one can be passed at a time.');\n }\n // define a sentinel value to avoid any typing issues\n apiKey ?? (apiKey = API_KEY_SENTINEL);\n opts.defaultQuery = { ...opts.defaultQuery, 'api-version': apiVersion };\n if (!baseURL) {\n if (!endpoint) {\n endpoint = process.env['AZURE_OPENAI_ENDPOINT'];\n }\n if (!endpoint) {\n throw new Errors.OpenAIError('Must provide one of the `baseURL` or `endpoint` arguments, or the `AZURE_OPENAI_ENDPOINT` environment variable');\n }\n baseURL = `${endpoint}/openai`;\n }\n else {\n if (endpoint) {\n throw new Errors.OpenAIError('baseURL and endpoint are mutually exclusive');\n }\n }\n super({\n apiKey,\n baseURL,\n ...opts,\n ...(dangerouslyAllowBrowser !== undefined ? { dangerouslyAllowBrowser } : {}),\n });\n this.apiVersion = '';\n this._azureADTokenProvider = azureADTokenProvider;\n this.apiVersion = apiVersion;\n this.deploymentName = deployment;\n }\n buildRequest(options, props = {}) {\n if (_deployments_endpoints.has(options.path) && options.method === 'post' && options.body !== undefined) {\n if (!Core.isObj(options.body)) {\n throw new Error('Expected request body to be an object');\n }\n const model = this.deploymentName || options.body['model'] || options.__metadata?.['model'];\n if (model !== undefined && !this.baseURL.includes('/deployments')) {\n options.path = `/deployments/${model}${options.path}`;\n }\n }\n return super.buildRequest(options, props);\n }\n async _getAzureADToken() {\n if (typeof this._azureADTokenProvider === 'function') {\n const token = await this._azureADTokenProvider();\n if (!token || typeof token !== 'string') {\n throw new Errors.OpenAIError(`Expected 'azureADTokenProvider' argument to return a string but it returned ${token}`);\n }\n return token;\n }\n return undefined;\n }\n authHeaders(opts) {\n return {};\n }\n async prepareOptions(opts) {\n /**\n * The user should provide a bearer token provider if they want\n * to use Azure AD authentication. The user shouldn't set the\n * Authorization header manually because the header is overwritten\n * with the Azure AD token if a bearer token provider is provided.\n */\n if (opts.headers?.['api-key']) {\n return super.prepareOptions(opts);\n }\n const token = await this._getAzureADToken();\n opts.headers ?? (opts.headers = {});\n if (token) {\n opts.headers['Authorization'] = `Bearer ${token}`;\n }\n else if (this.apiKey !== API_KEY_SENTINEL) {\n opts.headers['api-key'] = this.apiKey;\n }\n else {\n throw new Errors.OpenAIError('Unable to handle auth');\n }\n return super.prepareOptions(opts);\n }\n}\nconst _deployments_endpoints = new Set([\n '/completions',\n '/chat/completions',\n '/embeddings',\n '/audio/transcriptions',\n '/audio/translations',\n '/audio/speech',\n '/images/generations',\n '/images/edits',\n]);\nconst API_KEY_SENTINEL = '<Missing Key>';\nexport { toFile, fileFromPath } from \"./uploads.mjs\";\nexport { OpenAIError, APIError, APIConnectionError, APIConnectionTimeoutError, APIUserAbortError, NotFoundError, ConflictError, RateLimitError, BadRequestError, AuthenticationError, InternalServerError, PermissionDeniedError, UnprocessableEntityError, } from \"./error.mjs\";\nexport default OpenAI;\n//# sourceMappingURL=index.mjs.map","/**\n * LLM Service - Core OpenAI wrapper for HoloSphere\n * Provides simple chat completions without Assistants API\n */\n\nimport OpenAI from 'openai';\n\n/**\n * LLM Service class for interacting with OpenAI\n */\nexport class LLMService {\n /**\n * @param {string} apiKey - OpenAI API key\n * @param {Object} options - Configuration options\n * @param {string} options.model - Model to use (default: 'gpt-4o-mini')\n * @param {number} options.maxTokens - Max tokens (default: 2000)\n * @param {number} options.temperature - Temperature (default: 0.7)\n */\n constructor(apiKey, options = {}) {\n if (!apiKey) {\n throw new Error('OpenAI API key is required');\n }\n\n this.openai = new OpenAI({ apiKey });\n this.model = options.model || 'gpt-4o-mini';\n this.maxTokens = options.maxTokens || 2000;\n this.temperature = options.temperature || 0.7;\n }\n\n /**\n * Send a message to the LLM\n * @param {string} systemPrompt - System prompt\n * @param {string} userMessage - User message\n * @param {Object} options - Override options\n * @returns {Promise<string>} Response content\n */\n async sendMessage(systemPrompt, userMessage, options = {}) {\n try {\n const response = await this.openai.chat.completions.create({\n model: options.model || this.model,\n messages: [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: userMessage }\n ],\n max_tokens: options.maxTokens || this.maxTokens,\n temperature: options.temperature ?? this.temperature,\n });\n\n return response.choices[0]?.message?.content?.trim() || '';\n } catch (error) {\n throw new Error(`LLM request failed: ${error.message}`);\n }\n }\n\n /**\n * Send multiple messages (conversation)\n * @param {Array<{role: string, content: string}>} messages - Messages array\n * @param {Object} options - Override options\n * @returns {Promise<string>} Response content\n */\n async chat(messages, options = {}) {\n try {\n const response = await this.openai.chat.completions.create({\n model: options.model || this.model,\n messages,\n max_tokens: options.maxTokens || this.maxTokens,\n temperature: options.temperature ?? this.temperature,\n });\n\n return response.choices[0]?.message?.content?.trim() || '';\n } catch (error) {\n throw new Error(`LLM chat failed: ${error.message}`);\n }\n }\n\n /**\n * Summarize text\n * @param {string} text - Text to summarize\n * @param {Object} options - Options (maxLength, style)\n * @returns {Promise<string>} Summary\n */\n async summarize(text, options = {}) {\n const systemPrompt = `You are a helpful assistant that summarizes text concisely while preserving key information. Keep summaries clear and focused.${\n options.maxLength ? ` Keep the summary under ${options.maxLength} words.` : ''\n }${options.style ? ` Style: ${options.style}.` : ''}`;\n\n return this.sendMessage(systemPrompt, text, { temperature: 0.5 });\n }\n\n /**\n * Analyze text from a specific perspective\n * @param {string} text - Text to analyze\n * @param {string} aspect - Aspect to analyze (sentiment, themes, tone, etc.)\n * @returns {Promise<string>} Analysis\n */\n async analyze(text, aspect) {\n const systemPrompt = `You are an expert analyst. Analyze the following text from the perspective of \"${aspect}\". Provide a clear, structured analysis.`;\n return this.sendMessage(systemPrompt, text, { temperature: 0.3 });\n }\n\n /**\n * Extract keywords from text\n * @param {string} text - Text to extract keywords from\n * @param {number} maxKeywords - Maximum keywords (default: 10)\n * @returns {Promise<string[]>} Array of keywords\n */\n async extractKeywords(text, maxKeywords = 10) {\n const systemPrompt = `Extract the ${maxKeywords} most important keywords or key phrases from the text. Return ONLY a JSON array of strings, nothing else. Example: [\"keyword1\", \"keyword2\"]`;\n const response = await this.sendMessage(systemPrompt, text, { temperature: 0.2 });\n\n try {\n return JSON.parse(response);\n } catch {\n // Try to extract array from response if JSON parsing fails\n const match = response.match(/\\[[\\s\\S]*\\]/);\n if (match) {\n return JSON.parse(match[0]);\n }\n return response.split(',').map(k => k.trim().replace(/[\"\\[\\]]/g, ''));\n }\n }\n\n /**\n * Categorize text into given categories\n * @param {string} text - Text to categorize\n * @param {string[]} categories - Available categories\n * @returns {Promise<{category: string, confidence: number, reasoning: string}>}\n */\n async categorize(text, categories) {\n const systemPrompt = `Categorize the following text into one of these categories: ${categories.join(', ')}.\nReturn ONLY a JSON object with: {\"category\": \"chosen_category\", \"confidence\": 0.0-1.0, \"reasoning\": \"brief explanation\"}`;\n\n const response = await this.sendMessage(systemPrompt, text, { temperature: 0.2 });\n\n try {\n return JSON.parse(response);\n } catch {\n const match = response.match(/\\{[\\s\\S]*\\}/);\n if (match) {\n return JSON.parse(match[0]);\n }\n return { category: categories[0], confidence: 0.5, reasoning: response };\n }\n }\n\n /**\n * Translate text to target language\n * @param {string} text - Text to translate\n * @param {string} targetLanguage - Target language\n * @returns {Promise<string>} Translated text\n */\n async translate(text, targetLanguage) {\n const systemPrompt = `Translate the following text to ${targetLanguage}. Return ONLY the translation, nothing else.`;\n return this.sendMessage(systemPrompt, text, { temperature: 0.3 });\n }\n\n /**\n * Generate questions about content\n * @param {string} text - Text to generate questions about\n * @param {number} count - Number of questions (default: 5)\n * @returns {Promise<string[]>} Array of questions\n */\n async generateQuestions(text, count = 5) {\n const systemPrompt = `Generate ${count} insightful questions about the following text. Return ONLY a JSON array of question strings, nothing else. Example: [\"Question 1?\", \"Question 2?\"]`;\n const response = await this.sendMessage(systemPrompt, text, { temperature: 0.7 });\n\n try {\n return JSON.parse(response);\n } catch {\n const match = response.match(/\\[[\\s\\S]*\\]/);\n if (match) {\n return JSON.parse(match[0]);\n }\n return response.split('\\n').filter(q => q.trim().endsWith('?'));\n }\n }\n\n /**\n * Get JSON response from LLM\n * @param {string} systemPrompt - System prompt\n * @param {string} userMessage - User message\n * @param {Object} options - Options\n * @returns {Promise<Object>} Parsed JSON response\n */\n async getJSON(systemPrompt, userMessage, options = {}) {\n const response = await this.sendMessage(\n systemPrompt + '\\n\\nReturn ONLY valid JSON, no additional text.',\n userMessage,\n { ...options, temperature: options.temperature ?? 0.2 }\n );\n\n try {\n return JSON.parse(response);\n } catch {\n // Try to extract JSON from response\n const match = response.match(/[\\[{][\\s\\S]*[\\]}]/);\n if (match) {\n return JSON.parse(match[0]);\n }\n throw new Error(`Failed to parse JSON response: ${response.substring(0, 100)}`);\n }\n }\n}\n\nexport default LLMService;\n","/**\n * Schema Extractor - Extract structured data from text using JSON schemas\n */\n\n/**\n * Schema Extractor class\n */\nexport class SchemaExtractor {\n /**\n * @param {LLMService} llmService - LLM service instance\n */\n constructor(llmService) {\n this.llm = llmService;\n }\n\n /**\n * Extract data from text based on JSON schema\n * @param {string} text - Text to extract from\n * @param {Object} schema - JSON schema defining expected structure\n * @param {Object} options - Extraction options\n * @returns {Promise<Object>} Extracted data conforming to schema\n */\n async extractToSchema(text, schema, options = {}) {\n const schemaDescription = this._describeSchema(schema);\n\n const systemPrompt = `You are a data extraction expert. Extract structured information from the provided text according to this JSON schema:\n\n${JSON.stringify(schema, null, 2)}\n\nSchema field descriptions:\n${schemaDescription}\n\nRules:\n1. Extract ONLY information present in the text\n2. Use null for fields where information is not available\n3. Follow the exact schema structure and field types\n4. For arrays, include all relevant items found\n5. Return ONLY valid JSON matching the schema`;\n\n const response = await this.llm.getJSON(systemPrompt, text, {\n temperature: 0.2,\n maxTokens: options.maxTokens || 2000\n });\n\n return response;\n }\n\n /**\n * Generate a human-readable description of the schema\n * @private\n */\n _describeSchema(schema, path = '') {\n const descriptions = [];\n\n if (schema.description) {\n descriptions.push(`${path || 'root'}: ${schema.description}`);\n }\n\n if (schema.properties) {\n for (const [key, prop] of Object.entries(schema.properties)) {\n const fieldPath = path ? `${path}.${key}` : key;\n const type = prop.type || 'any';\n const required = schema.required?.includes(key) ? ' (required)' : '';\n const desc = prop.description || '';\n\n descriptions.push(`- ${fieldPath} [${type}]${required}: ${desc}`);\n\n if (prop.type === 'object' && prop.properties) {\n descriptions.push(this._describeSchema(prop, fieldPath));\n }\n\n if (prop.type === 'array' && prop.items) {\n if (prop.items.properties) {\n descriptions.push(this._describeSchema(prop.items, `${fieldPath}[]`));\n }\n }\n }\n }\n\n return descriptions.join('\\n');\n }\n\n /**\n * Extract multiple items from text\n * @param {string} text - Text containing multiple items\n * @param {Object} itemSchema - Schema for each item\n * @param {Object} options - Options\n * @returns {Promise<Object[]>} Array of extracted items\n */\n async extractMultiple(text, itemSchema, options = {}) {\n const systemPrompt = `You are a data extraction expert. Extract ALL items matching this schema from the text:\n\n${JSON.stringify(itemSchema, null, 2)}\n\nReturn a JSON array of all items found. If no items found, return [].\nReturn ONLY valid JSON array.`;\n\n const response = await this.llm.getJSON(systemPrompt, text, {\n temperature: 0.2,\n maxTokens: options.maxTokens || 3000\n });\n\n return Array.isArray(response) ? response : [response];\n }\n\n /**\n * Fill missing fields in existing data\n * @param {Object} data - Existing data with some fields\n * @param {string} text - Text to extract missing data from\n * @param {Object} schema - Full schema\n * @returns {Promise<Object>} Complete data\n */\n async fillMissing(data, text, schema) {\n const missingFields = this._findMissingFields(data, schema);\n\n if (missingFields.length === 0) {\n return data;\n }\n\n const systemPrompt = `You have existing data:\n${JSON.stringify(data, null, 2)}\n\nExtract ONLY the following missing fields from the text:\n${missingFields.join(', ')}\n\nBased on this schema:\n${JSON.stringify(schema, null, 2)}\n\nReturn JSON with ONLY the missing fields that you can extract. Do not modify existing fields.`;\n\n const extracted = await this.llm.getJSON(systemPrompt, text, { temperature: 0.2 });\n\n return { ...data, ...extracted };\n }\n\n /**\n * Find fields missing from data based on schema\n * @private\n */\n _findMissingFields(data, schema, path = '') {\n const missing = [];\n\n if (schema.properties) {\n for (const [key, prop] of Object.entries(schema.properties)) {\n const fieldPath = path ? `${path}.${key}` : key;\n const value = data[key];\n\n if (value === undefined || value === null) {\n missing.push(fieldPath);\n } else if (prop.type === 'object' && prop.properties) {\n missing.push(...this._findMissingFields(value, prop, fieldPath));\n }\n }\n }\n\n return missing;\n }\n\n /**\n * Validate extracted data against schema\n * @param {Object} data - Extracted data\n * @param {Object} schema - JSON schema\n * @returns {{valid: boolean, errors: string[]}}\n */\n validateExtraction(data, schema) {\n const errors = [];\n\n if (schema.required) {\n for (const field of schema.required) {\n if (data[field] === undefined || data[field] === null) {\n errors.push(`Missing required field: ${field}`);\n }\n }\n }\n\n if (schema.properties) {\n for (const [key, prop] of Object.entries(schema.properties)) {\n const value = data[key];\n\n if (value !== undefined && value !== null) {\n const typeValid = this._validateType(value, prop.type);\n if (!typeValid) {\n errors.push(`Invalid type for ${key}: expected ${prop.type}, got ${typeof value}`);\n }\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors\n };\n }\n\n /**\n * Validate value type\n * @private\n */\n _validateType(value, type) {\n switch (type) {\n case 'string':\n return typeof value === 'string';\n case 'number':\n case 'integer':\n return typeof value === 'number';\n case 'boolean':\n return typeof value === 'boolean';\n case 'array':\n return Array.isArray(value);\n case 'object':\n return typeof value === 'object' && !Array.isArray(value);\n default:\n return true;\n }\n }\n}\n\nexport default SchemaExtractor;\n","/**\n * Fuzzy JSON Operations - AI-assisted semantic operations on JSON structures\n */\n\n/**\n * JSON Operations class for semantic JSON manipulation\n */\nexport class JSONOps {\n /**\n * @param {LLMService} llmService - LLM service instance\n */\n constructor(llmService) {\n this.llm = llmService;\n }\n\n /**\n * Semantically merge two JSON objects\n * @param {Object} obj1 - First object\n * @param {Object} obj2 - Second object\n * @param {Object} options - Merge options\n * @returns {Promise<Object>} Merged object\n */\n async add(obj1, obj2, options = {}) {\n const systemPrompt = `You are a JSON merge expert. Semantically merge these two JSON objects.\n\nRules:\n1. Combine information from both objects intelligently\n2. For conflicting values, prefer the more complete/detailed one${options.preferSecond ? ', or prefer the second object' : ''}\n3. Merge arrays by combining items, removing duplicates by semantic similarity\n4. Preserve all unique information from both objects\n5. Return ONLY valid JSON`;\n\n const userMessage = `Object 1:\n${JSON.stringify(obj1, null, 2)}\n\nObject 2:\n${JSON.stringify(obj2, null, 2)}`;\n\n return this.llm.getJSON(systemPrompt, userMessage, { temperature: 0.2 });\n }\n\n /**\n * Remove concepts from obj1 based on obj2\n * @param {Object} obj1 - Base object\n * @param {Object} obj2 - Object containing concepts to remove\n * @returns {Promise<Object>} Result with concepts removed\n */\n async subtract(obj1, obj2) {\n const systemPrompt = `You are a JSON manipulation expert. Remove concepts from the first object that are semantically present in the second object.\n\nRules:\n1. Remove fields from obj1 that have semantic equivalents in obj2\n2. For arrays, remove items that are semantically similar to items in obj2\n3. Preserve fields/items in obj1 that have no semantic match in obj2\n4. Remove nested content that matches semantically\n5. Return ONLY valid JSON`;\n\n const userMessage = `Base object (to modify):\n${JSON.stringify(obj1, null, 2)}\n\nConcepts to remove:\n${JSON.stringify(obj2, null, 2)}`;\n\n return this.llm.getJSON(systemPrompt, userMessage, { temperature: 0.2 });\n }\n\n /**\n * Combine objects with semantic deduplication\n * @param {Object} obj1 - First object\n * @param {Object} obj2 - Second object\n * @returns {Promise<Object>} Union of objects\n */\n async union(obj1, obj2) {\n const systemPrompt = `You are a JSON merge expert. Create a semantic union of these two JSON objects.\n\nRules:\n1. Include all unique information from both objects\n2. For duplicate concepts, keep only one (the more complete version)\n3. Deduplicate array items by semantic similarity, not just exact match\n4. Merge nested objects recursively with the same rules\n5. Return ONLY valid JSON`;\n\n const userMessage = `Object 1:\n${JSON.stringify(obj1, null, 2)}\n\nObject 2:\n${JSON.stringify(obj2, null, 2)}`;\n\n return this.llm.getJSON(systemPrompt, userMessage, { temperature: 0.2 });\n }\n\n /**\n * Find differences between two objects\n * @param {Object} obj1 - First object\n * @param {Object} obj2 - Second object\n * @returns {Promise<{added: Object, removed: Object, changed: Object}>} Differences\n */\n async difference(obj1, obj2) {\n const systemPrompt = `You are a JSON comparison expert. Find the semantic differences between these two JSON objects.\n\nReturn a JSON object with:\n- \"added\": fields/values present in obj2 but not in obj1\n- \"removed\": fields/values present in obj1 but not in obj2\n- \"changed\": fields where the value changed (show both old and new)\n\nConsider semantic similarity - fields with different names but same meaning should be considered the same.\nReturn ONLY valid JSON with the structure: {\"added\": {}, \"removed\": {}, \"changed\": {}}`;\n\n const userMessage = `Object 1 (original):\n${JSON.stringify(obj1, null, 2)}\n\nObject 2 (new):\n${JSON.stringify(obj2, null, 2)}`;\n\n return this.llm.getJSON(systemPrompt, userMessage, { temperature: 0.2 });\n }\n\n /**\n * Concatenate arrays and text fields semantically\n * @param {Object} obj1 - First object\n * @param {Object} obj2 - Second object\n * @returns {Promise<Object>} Concatenated object\n */\n async concatenate(obj1, obj2) {\n const systemPrompt = `You are a JSON concatenation expert. Concatenate these two JSON objects.\n\nRules:\n1. For string fields: append obj2 values to obj1 values with appropriate separators\n2. For array fields: append obj2 arrays to obj1 arrays\n3. For number fields: sum the values\n4. For object fields: recursively concatenate\n5. For boolean fields: use logical OR\n6. Preserve the structure of obj1\n7. Return ONLY valid JSON`;\n\n const userMessage = `Object 1:\n${JSON.stringify(obj1, null, 2)}\n\nObject 2:\n${JSON.stringify(obj2, null, 2)}`;\n\n return this.llm.getJSON(systemPrompt, userMessage, { temperature: 0.2 });\n }\n\n /**\n * Find intersection - common concepts between objects\n * @param {Object} obj1 - First object\n * @param {Object} obj2 - Second object\n * @returns {Promise<Object>} Common elements\n */\n async intersection(obj1, obj2) {\n const systemPrompt = `You are a JSON comparison expert. Find the semantic intersection of these two JSON objects.\n\nRules:\n1. Return only fields/values that are semantically present in BOTH objects\n2. For arrays, return only items that have semantic matches in both\n3. Consider semantic similarity, not just exact matches\n4. Return ONLY valid JSON`;\n\n const userMessage = `Object 1:\n${JSON.stringify(obj1, null, 2)}\n\nObject 2:\n${JSON.stringify(obj2, null, 2)}`;\n\n return this.llm.getJSON(systemPrompt, userMessage, { temperature: 0.2 });\n }\n\n /**\n * Transform object structure\n * @param {Object} obj - Object to transform\n * @param {string} targetStructure - Description of target structure\n * @returns {Promise<Object>} Transformed object\n */\n async transform(obj, targetStructure) {\n const systemPrompt = `You are a JSON transformation expert. Transform this JSON object according to the target structure description.\n\nTarget structure: ${targetStructure}\n\nRules:\n1. Map existing fields to the new structure\n2. Preserve all information, reorganizing as needed\n3. Use appropriate type conversions\n4. Return ONLY valid JSON`;\n\n return this.llm.getJSON(systemPrompt, JSON.stringify(obj, null, 2), { temperature: 0.3 });\n }\n\n /**\n * Simplify/flatten nested object\n * @param {Object} obj - Object to simplify\n * @param {Object} options - Options\n * @returns {Promise<Object>} Simplified object\n */\n async simplify(obj, options = {}) {\n const systemPrompt = `You are a JSON simplification expert. Simplify this nested JSON object.\n\nRules:\n1. Flatten deeply nested structures where appropriate\n2. Combine redundant fields\n3. Remove null/empty values${options.keepEmpty ? ' (unless specified to keep)' : ''}\n4. Use clear, concise field names\n5. Return ONLY valid JSON`;\n\n return this.llm.getJSON(systemPrompt, JSON.stringify(obj, null, 2), { temperature: 0.3 });\n }\n\n /**\n * Apply a natural language operation to JSON\n * @param {Object} obj - Object to modify\n * @param {string} operation - Natural language description of operation\n * @returns {Promise<Object>} Modified object\n */\n async apply(obj, operation) {\n const systemPrompt = `You are a JSON manipulation expert. Apply the following operation to the JSON object:\n\nOperation: ${operation}\n\nReturn ONLY valid JSON with the operation applied.`;\n\n return this.llm.getJSON(systemPrompt, JSON.stringify(obj, null, 2), { temperature: 0.3 });\n }\n}\n\nexport default JSONOps;\n","/**\n * Embeddings - Vector embedding generation and semantic search\n */\n\n/**\n * Embeddings class for vector operations\n */\nexport class Embeddings {\n /**\n * @param {Object} openai - OpenAI client instance\n * @param {Object} holosphere - HoloSphere instance for storage\n */\n constructor(openai, holosphere = null) {\n this.openai = openai;\n this.holosphere = holosphere;\n this.model = 'text-embedding-3-small';\n this.dimensions = 1536;\n }\n\n /**\n * Set HoloSphere instance for storage\n * @param {Object} holosphere - HoloSphere instance\n */\n setHoloSphere(holosphere) {\n this.holosphere = holosphere;\n }\n\n /**\n * Generate embedding for text\n * @param {string} text - Text to embed\n * @returns {Promise<number[]>} Embedding vector\n */\n async embed(text) {\n try {\n const response = await this.openai.embeddings.create({\n model: this.model,\n input: text,\n });\n\n return response.data[0].embedding;\n } catch (error) {\n throw new Error(`Embedding generation failed: ${error.message}`);\n }\n }\n\n /**\n * Generate embeddings for multiple texts\n * @param {string[]} texts - Array of texts\n * @returns {Promise<number[][]>} Array of embeddings\n */\n async embedBatch(texts) {\n try {\n const response = await this.openai.embeddings.create({\n model: this.model,\n input: texts,\n });\n\n return response.data.map(d => d.embedding);\n } catch (error) {\n throw new Error(`Batch embedding failed: ${error.message}`);\n }\n }\n\n /**\n * Calculate cosine similarity between two vectors\n * @param {number[]} vec1 - First vector\n * @param {number[]} vec2 - Second vector\n * @returns {number} Similarity score (0-1)\n */\n cosineSimilarity(vec1, vec2) {\n if (vec1.length !== vec2.length) {\n throw new Error('Vectors must have same length');\n }\n\n let dotProduct = 0;\n let norm1 = 0;\n let norm2 = 0;\n\n for (let i = 0; i < vec1.length; i++) {\n dotProduct += vec1[i] * vec2[i];\n norm1 += vec1[i] * vec1[i];\n norm2 += vec2[i] * vec2[i];\n }\n\n return dotProduct / (Math.sqrt(norm1) * Math.sqrt(norm2));\n }\n\n /**\n * Store item with embedding in HoloSphere\n * @param {string} holon - Holon identifier\n * @param {string} lens - Lens name\n * @param {Object} item - Item to store\n * @param {string} textField - Field to embed (default: 'content' or 'text')\n * @returns {Promise<Object>} Stored item with embedding\n */\n async storeWithEmbedding(holon, lens, item, textField = null) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required for storage');\n }\n\n // Determine text to embed\n const text = textField\n ? item[textField]\n : item.content || item.text || item.description || JSON.stringify(item);\n\n if (!text) {\n throw new Error('No text found to embed');\n }\n\n // Generate embedding\n const embedding = await this.embed(text);\n\n // Store with embedding\n const itemWithEmbedding = {\n ...item,\n _embedding: embedding,\n _embeddedField: textField || 'auto',\n _embeddedAt: Date.now(),\n };\n\n await this.holosphere.put(holon, lens, itemWithEmbedding);\n\n return itemWithEmbedding;\n }\n\n /**\n * Semantic search within a holon/lens\n * @param {string} query - Search query\n * @param {string} holon - Holon identifier\n * @param {string} lens - Lens name\n * @param {Object} options - Search options\n * @returns {Promise<Array<{item: Object, similarity: number}>>} Ranked results\n */\n async semanticSearch(query, holon, lens, options = {}) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required for search');\n }\n\n const { limit = 10, threshold = 0.5 } = options;\n\n // Get query embedding\n const queryEmbedding = await this.embed(query);\n\n // Get all items from holon/lens\n const items = await this.holosphere.getAll(holon, lens);\n\n // Calculate similarities\n const results = [];\n\n for (const item of items) {\n if (item._embedding) {\n const similarity = this.cosineSimilarity(queryEmbedding, item._embedding);\n\n if (similarity >= threshold) {\n results.push({\n item: { ...item, _embedding: undefined }, // Don't return embedding\n similarity,\n });\n }\n }\n }\n\n // Sort by similarity and limit\n results.sort((a, b) => b.similarity - a.similarity);\n\n return results.slice(0, limit);\n }\n\n /**\n * Find similar items to a given item\n * @param {Object} item - Item to find similar items for\n * @param {string} holon - Holon identifier\n * @param {string} lens - Lens name\n * @param {Object} options - Search options\n * @returns {Promise<Array>} Similar items\n */\n async findSimilar(item, holon, lens, options = {}) {\n const text = item.content || item.text || item.description || JSON.stringify(item);\n return this.semanticSearch(text, holon, lens, options);\n }\n\n /**\n * Cluster items by semantic similarity\n * @param {Object[]} items - Items to cluster\n * @param {number} numClusters - Approximate number of clusters\n * @returns {Promise<Object[][]>} Clustered items\n */\n async cluster(items, numClusters = 5) {\n // Get embeddings for items that don't have them\n const itemsWithEmbeddings = await Promise.all(\n items.map(async (item) => {\n if (item._embedding) {\n return item;\n }\n const text = item.content || item.text || item.description || JSON.stringify(item);\n const embedding = await this.embed(text);\n return { ...item, _embedding: embedding };\n })\n );\n\n // Simple k-means clustering\n const clusters = this._kMeans(itemsWithEmbeddings, numClusters);\n\n // Return clusters without embeddings\n return clusters.map(cluster =>\n cluster.map(item => ({ ...item, _embedding: undefined }))\n );\n }\n\n /**\n * Simple k-means clustering\n * @private\n */\n _kMeans(items, k, maxIterations = 100) {\n if (items.length <= k) {\n return items.map(item => [item]);\n }\n\n // Initialize centroids randomly\n const shuffled = [...items].sort(() => Math.random() - 0.5);\n let centroids = shuffled.slice(0, k).map(item => [...item._embedding]);\n\n let assignments = new Array(items.length);\n\n for (let iter = 0; iter < maxIterations; iter++) {\n // Assign items to nearest centroid\n const newAssignments = items.map((item) => {\n let minDist = Infinity;\n let nearest = 0;\n\n for (let c = 0; c < centroids.length; c++) {\n const dist = 1 - this.cosineSimilarity(item._embedding, centroids[c]);\n if (dist < minDist) {\n minDist = dist;\n nearest = c;\n }\n }\n\n return nearest;\n });\n\n // Check for convergence\n if (JSON.stringify(newAssignments) === JSON.stringify(assignments)) {\n break;\n }\n\n assignments = newAssignments;\n\n // Update centroids\n for (let c = 0; c < k; c++) {\n const clusterItems = items.filter((_, i) => assignments[i] === c);\n\n if (clusterItems.length > 0) {\n centroids[c] = new Array(this.dimensions).fill(0);\n\n for (const item of clusterItems) {\n for (let d = 0; d < this.dimensions; d++) {\n centroids[c][d] += item._embedding[d];\n }\n }\n\n for (let d = 0; d < this.dimensions; d++) {\n centroids[c][d] /= clusterItems.length;\n }\n }\n }\n }\n\n // Group items by cluster\n const clusters = Array.from({ length: k }, () => []);\n items.forEach((item, i) => {\n clusters[assignments[i]].push(item);\n });\n\n return clusters.filter(c => c.length > 0);\n }\n}\n\nexport default Embeddings;\n","/**\n * Council - Multi-perspective wisdom from different viewpoints\n */\n\n// Default 12 perspectives based on HolonsBot\nconst DEFAULT_PERSPECTIVES = [\n { name: 'Values & Worldview', prompt: 'Answer from the embodied perspective of Values and Worldview - considering ethics, beliefs, culture, and meaning.' },\n { name: 'Health & Wellbeing', prompt: 'Answer from the embodied perspective of Health & Wellbeing - considering physical, mental, and social health.' },\n { name: 'Food & Agriculture', prompt: 'Answer from the embodied perspective of Food & Agriculture - considering food systems, nutrition, and farming.' },\n { name: 'Business & Trade', prompt: 'Answer from the embodied perspective of Business & Trade - considering commerce, markets, and economic exchange.' },\n { name: 'Energy & Resources', prompt: 'Answer from the embodied perspective of Energy & Resources - considering power, materials, and sustainability.' },\n { name: 'Climate & Environment', prompt: 'Answer from the embodied perspective of Climate Change - considering environmental impact and adaptation.' },\n { name: 'Ecosystems & Biosphere', prompt: 'Answer from the embodied perspective of Ecosystems & Biosphere - considering biodiversity and natural systems.' },\n { name: 'Water Availability', prompt: 'Answer from the embodied perspective of Water Availability - considering water access, quality, and management.' },\n { name: 'Habitat & Infrastructure', prompt: 'Answer from the embodied perspective of Habitat & Infrastructure - considering built environment and housing.' },\n { name: 'Economy & Wealth', prompt: 'Answer from the embodied perspective of Economy & Wealth - considering prosperity, inequality, and resources.' },\n { name: 'Governance & Institutions', prompt: 'Answer from the embodied perspective of Governance & Institutions - considering power, policy, and organization.' },\n { name: 'Community & Resilience', prompt: 'Answer from the embodied perspective of Community & Resilience - considering social bonds and adaptability.' },\n];\n\n/**\n * Council class for multi-perspective answers\n */\nexport class Council {\n /**\n * @param {LLMService} llmService - LLM service instance\n * @param {Array} perspectives - Custom perspectives (optional)\n */\n constructor(llmService, perspectives = null) {\n this.llm = llmService;\n this.perspectives = perspectives || DEFAULT_PERSPECTIVES;\n }\n\n /**\n * Set custom perspectives\n * @param {Array<{name: string, prompt: string}>} perspectives\n */\n setPerspectives(perspectives) {\n this.perspectives = perspectives;\n }\n\n /**\n * Get default perspectives\n * @returns {Array} Default perspectives\n */\n static getDefaultPerspectives() {\n return DEFAULT_PERSPECTIVES;\n }\n\n /**\n * Ask a question to the council\n * @param {string} question - Question to ask\n * @param {Object} options - Options\n * @returns {Promise<{perspectives: Array, summary: string}>}\n */\n async ask(question, options = {}) {\n const { parallel = true, includeSummary = true } = options;\n const perspectives = options.perspectives || this.perspectives;\n\n // Get answers from all perspectives\n let answers;\n\n if (parallel) {\n answers = await Promise.all(\n perspectives.map(async (perspective) => {\n const answer = await this._askPerspective(question, perspective);\n return {\n perspective: perspective.name,\n answer,\n };\n })\n );\n } else {\n answers = [];\n for (const perspective of perspectives) {\n const answer = await this._askPerspective(question, perspective);\n answers.push({\n perspective: perspective.name,\n answer,\n });\n }\n }\n\n // Generate summary\n let summary = null;\n if (includeSummary) {\n summary = await this._summarize(question, answers);\n }\n\n return {\n question,\n perspectives: answers,\n summary,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Ask a question from specific perspective\n * @private\n */\n async _askPerspective(question, perspective) {\n const systemPrompt = `You are a wise council member representing a specific perspective.\n\n${perspective.prompt}\n\nProvide thoughtful, nuanced answers that honor your unique perspective while being constructive and helpful. Be concise but insightful.`;\n\n return this.llm.sendMessage(systemPrompt, question, { temperature: 0.7 });\n }\n\n /**\n * Summarize all perspectives\n * @private\n */\n async _summarize(question, answers) {\n const perspectiveTexts = answers\n .map(a => `**${a.perspective}**: ${a.answer}`)\n .join('\\n\\n');\n\n const systemPrompt = `You are a wise facilitator. Synthesize the following perspectives into a balanced summary that:\n1. Identifies common themes and agreements\n2. Notes important tensions or tradeoffs\n3. Provides actionable wisdom\n4. Remains neutral and balanced\n\nBe concise but comprehensive.`;\n\n const userMessage = `Question: ${question}\n\nPerspectives:\n${perspectiveTexts}`;\n\n return this.llm.sendMessage(systemPrompt, userMessage, { temperature: 0.5 });\n }\n\n /**\n * Create custom perspectives from a list of names\n * @param {string[]} names - Perspective names\n * @returns {Array} Custom perspectives\n */\n static createPerspectives(names) {\n return names.map(name => ({\n name,\n prompt: `Answer from the embodied perspective of ${name} - considering all aspects related to ${name.toLowerCase()}.`,\n }));\n }\n\n /**\n * Ask with custom perspectives (convenience method)\n * @param {string} question - Question\n * @param {string[]} perspectiveNames - List of perspective names\n * @param {Object} options - Options\n * @returns {Promise<Object>} Council response\n */\n async askCustom(question, perspectiveNames, options = {}) {\n const perspectives = Council.createPerspectives(perspectiveNames);\n return this.ask(question, { ...options, perspectives });\n }\n\n /**\n * Get a single perspective answer\n * @param {string} question - Question\n * @param {string} perspectiveName - Perspective name\n * @returns {Promise<string>} Answer\n */\n async askSingle(question, perspectiveName) {\n const perspective = this.perspectives.find(p => p.name === perspectiveName)\n || { name: perspectiveName, prompt: `Answer from the perspective of ${perspectiveName}.` };\n\n return this._askPerspective(question, perspective);\n }\n\n /**\n * Debate between perspectives\n * @param {string} topic - Topic to debate\n * @param {string[]} perspectiveNames - Two perspectives to debate\n * @param {number} rounds - Number of exchange rounds\n * @returns {Promise<Object>} Debate result\n */\n async debate(topic, perspectiveNames, rounds = 3) {\n if (perspectiveNames.length !== 2) {\n throw new Error('Debate requires exactly 2 perspectives');\n }\n\n const perspectives = perspectiveNames.map(name =>\n this.perspectives.find(p => p.name === name)\n || { name, prompt: `Argue from the perspective of ${name}.` }\n );\n\n const exchanges = [];\n let context = `Topic: ${topic}`;\n\n for (let i = 0; i < rounds; i++) {\n for (const perspective of perspectives) {\n const systemPrompt = `You are debating from the perspective of ${perspective.name}.\n${perspective.prompt}\nRespond to the previous arguments constructively, acknowledging good points but advocating for your perspective.`;\n\n const response = await this.llm.sendMessage(systemPrompt, context, { temperature: 0.7 });\n\n exchanges.push({\n perspective: perspective.name,\n round: i + 1,\n response,\n });\n\n context += `\\n\\n${perspective.name}: ${response}`;\n }\n }\n\n // Generate conclusion\n const conclusion = await this.llm.sendMessage(\n 'As a neutral moderator, summarize the key insights from this debate and identify areas of agreement and disagreement.',\n context,\n { temperature: 0.5 }\n );\n\n return {\n topic,\n perspectives: perspectiveNames,\n exchanges,\n conclusion,\n };\n }\n}\n\nexport default Council;\n","/**\n * Text-to-Speech - OpenAI TTS integration\n */\n\n/**\n * Available voices for TTS\n */\nexport const VOICES = {\n ALLOY: 'alloy',\n ECHO: 'echo',\n FABLE: 'fable',\n ONYX: 'onyx',\n NOVA: 'nova',\n SHIMMER: 'shimmer',\n};\n\n/**\n * Available TTS models\n */\nexport const MODELS = {\n TTS_1: 'tts-1',\n TTS_1_HD: 'tts-1-hd',\n};\n\n/**\n * TTS class for text-to-speech conversion\n */\nexport class TTS {\n /**\n * @param {Object} openai - OpenAI client instance\n */\n constructor(openai) {\n this.openai = openai;\n this.defaultVoice = VOICES.ECHO;\n this.defaultModel = MODELS.TTS_1;\n }\n\n /**\n * Convert text to speech\n * @param {string} text - Text to convert\n * @param {Object} options - TTS options\n * @returns {Promise<Buffer>} Audio buffer (MP3)\n */\n async speak(text, options = {}) {\n const {\n voice = this.defaultVoice,\n model = this.defaultModel,\n speed = 1.0,\n responseFormat = 'mp3',\n } = options;\n\n try {\n const response = await this.openai.audio.speech.create({\n model,\n voice,\n input: text,\n speed,\n response_format: responseFormat,\n });\n\n // Convert response to Buffer\n const arrayBuffer = await response.arrayBuffer();\n return Buffer.from(arrayBuffer);\n } catch (error) {\n throw new Error(`TTS failed: ${error.message}`);\n }\n }\n\n /**\n * Convert text to speech and return as base64\n * @param {string} text - Text to convert\n * @param {Object} options - TTS options\n * @returns {Promise<string>} Base64 encoded audio\n */\n async speakBase64(text, options = {}) {\n const buffer = await this.speak(text, options);\n return buffer.toString('base64');\n }\n\n /**\n * Convert text to speech and return as data URL\n * @param {string} text - Text to convert\n * @param {Object} options - TTS options\n * @returns {Promise<string>} Data URL for audio\n */\n async speakDataUrl(text, options = {}) {\n const format = options.responseFormat || 'mp3';\n const mimeType = format === 'mp3' ? 'audio/mpeg' : `audio/${format}`;\n const base64 = await this.speakBase64(text, options);\n return `data:${mimeType};base64,${base64}`;\n }\n\n /**\n * Set default voice\n * @param {string} voice - Voice name\n */\n setDefaultVoice(voice) {\n if (!Object.values(VOICES).includes(voice)) {\n throw new Error(`Invalid voice: ${voice}. Use one of: ${Object.values(VOICES).join(', ')}`);\n }\n this.defaultVoice = voice;\n }\n\n /**\n * Set default model\n * @param {string} model - Model name\n */\n setDefaultModel(model) {\n if (!Object.values(MODELS).includes(model)) {\n throw new Error(`Invalid model: ${model}. Use one of: ${Object.values(MODELS).join(', ')}`);\n }\n this.defaultModel = model;\n }\n\n /**\n * Get available voices\n * @returns {string[]} Available voice names\n */\n static getVoices() {\n return Object.values(VOICES);\n }\n\n /**\n * Get available models\n * @returns {string[]} Available model names\n */\n static getModels() {\n return Object.values(MODELS);\n }\n\n /**\n * Estimate audio duration (approximate)\n * @param {string} text - Text to estimate\n * @param {number} speed - Speech speed (default: 1.0)\n * @returns {number} Estimated duration in seconds\n */\n static estimateDuration(text, speed = 1.0) {\n // Average speaking rate: ~150 words per minute\n const words = text.split(/\\s+/).length;\n const minutes = words / 150;\n return (minutes * 60) / speed;\n }\n\n /**\n * Split text into chunks for long content\n * @param {string} text - Long text\n * @param {number} maxChars - Max characters per chunk (default: 4000)\n * @returns {string[]} Text chunks\n */\n static splitText(text, maxChars = 4000) {\n if (text.length <= maxChars) {\n return [text];\n }\n\n const chunks = [];\n const sentences = text.split(/(?<=[.!?])\\s+/);\n let currentChunk = '';\n\n for (const sentence of sentences) {\n if ((currentChunk + sentence).length > maxChars) {\n if (currentChunk) {\n chunks.push(currentChunk.trim());\n }\n currentChunk = sentence;\n } else {\n currentChunk += (currentChunk ? ' ' : '') + sentence;\n }\n }\n\n if (currentChunk) {\n chunks.push(currentChunk.trim());\n }\n\n return chunks;\n }\n\n /**\n * Convert long text to speech (handles chunking)\n * @param {string} text - Long text\n * @param {Object} options - TTS options\n * @returns {Promise<Buffer[]>} Array of audio buffers\n */\n async speakLong(text, options = {}) {\n const chunks = TTS.splitText(text, options.maxChars || 4000);\n\n const buffers = await Promise.all(\n chunks.map(chunk => this.speak(chunk, options))\n );\n\n return buffers;\n }\n}\n\nexport default TTS;\n","/**\n * Natural Language Query - Query HoloSphere data using natural language\n */\n\n/**\n * NL Query class for natural language to structured query conversion\n */\nexport class NLQuery {\n /**\n * @param {LLMService} llmService - LLM service instance\n * @param {Object} holosphere - HoloSphere instance\n */\n constructor(llmService, holosphere = null) {\n this.llm = llmService;\n this.holosphere = holosphere;\n }\n\n /**\n * Set HoloSphere instance\n * @param {Object} holosphere - HoloSphere instance\n */\n setHoloSphere(holosphere) {\n this.holosphere = holosphere;\n }\n\n /**\n * Parse natural language query into structured format\n * @param {string} query - Natural language query\n * @param {Object} context - Context (available holons, lenses, etc.)\n * @returns {Promise<Object>} Structured query\n */\n async parse(query, context = {}) {\n const systemPrompt = `You are a query parser. Convert natural language queries into structured JSON filters for a geospatial database.\n\nAvailable holons: ${context.holons?.join(', ') || 'any'}\nAvailable lenses: ${context.lenses?.join(', ') || 'any'}\n\nReturn a JSON object with:\n{\n \"holon\": \"holon_id or null\",\n \"lens\": \"lens_name or null\",\n \"filters\": {\n \"field_name\": { \"op\": \"eq|ne|gt|gte|lt|lte|contains|in\", \"value\": value }\n },\n \"sort\": { \"field\": \"field_name\", \"order\": \"asc|desc\" } or null,\n \"limit\": number or null,\n \"spatial\": { \"near\": \"location_name\", \"radius\": \"distance\" } or null,\n \"temporal\": { \"after\": \"date\", \"before\": \"date\" } or null\n}\n\nExamples:\n- \"show projects near Rome\" -> { \"lens\": \"projects\", \"spatial\": { \"near\": \"Rome\" } }\n- \"find quests with more than 10 participants\" -> { \"lens\": \"quests\", \"filters\": { \"participants\": { \"op\": \"gt\", \"value\": 10 } } }`;\n\n const result = await this.llm.getJSON(systemPrompt, query, { temperature: 0.2 });\n return result;\n }\n\n /**\n * Execute natural language query\n * @param {string} query - Natural language query\n * @param {Object} options - Query options\n * @returns {Promise<Array>} Query results\n */\n async execute(query, options = {}) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required for query execution');\n }\n\n // Parse the query\n const parsed = await this.parse(query, options.context);\n\n // Get data from HoloSphere\n let results = [];\n\n if (parsed.holon && parsed.lens) {\n results = await this.holosphere.getAll(parsed.holon, parsed.lens);\n } else if (parsed.lens) {\n // Search across all holons for this lens (would need holon list)\n if (options.holons) {\n for (const holon of options.holons) {\n const data = await this.holosphere.getAll(holon, parsed.lens);\n results.push(...data.map(item => ({ ...item, _holon: holon })));\n }\n }\n }\n\n // Apply filters\n if (parsed.filters) {\n results = this._applyFilters(results, parsed.filters);\n }\n\n // Apply sorting\n if (parsed.sort) {\n results = this._applySort(results, parsed.sort);\n }\n\n // Apply limit\n if (parsed.limit) {\n results = results.slice(0, parsed.limit);\n }\n\n return {\n query,\n parsed,\n results,\n count: results.length,\n };\n }\n\n /**\n * Apply filters to results\n * @private\n */\n _applyFilters(results, filters) {\n return results.filter(item => {\n for (const [field, condition] of Object.entries(filters)) {\n const value = this._getNestedValue(item, field);\n\n if (!this._matchCondition(value, condition)) {\n return false;\n }\n }\n return true;\n });\n }\n\n /**\n * Get nested value from object\n * @private\n */\n _getNestedValue(obj, path) {\n return path.split('.').reduce((acc, key) => acc?.[key], obj);\n }\n\n /**\n * Check if value matches condition\n * @private\n */\n _matchCondition(value, condition) {\n const { op, value: targetValue } = condition;\n\n switch (op) {\n case 'eq':\n return value === targetValue;\n case 'ne':\n return value !== targetValue;\n case 'gt':\n return value > targetValue;\n case 'gte':\n return value >= targetValue;\n case 'lt':\n return value < targetValue;\n case 'lte':\n return value <= targetValue;\n case 'contains':\n return String(value).toLowerCase().includes(String(targetValue).toLowerCase());\n case 'in':\n return Array.isArray(targetValue) && targetValue.includes(value);\n default:\n return true;\n }\n }\n\n /**\n * Apply sorting to results\n * @private\n */\n _applySort(results, sort) {\n const { field, order } = sort;\n const multiplier = order === 'desc' ? -1 : 1;\n\n return [...results].sort((a, b) => {\n const aVal = this._getNestedValue(a, field);\n const bVal = this._getNestedValue(b, field);\n\n if (aVal < bVal) return -1 * multiplier;\n if (aVal > bVal) return 1 * multiplier;\n return 0;\n });\n }\n\n /**\n * Suggest queries based on context\n * @param {Object} context - Current context\n * @returns {Promise<string[]>} Suggested queries\n */\n async suggest(context = {}) {\n const systemPrompt = `Suggest 5 useful natural language queries for exploring geospatial data.\n\nAvailable holons: ${context.holons?.join(', ') || 'geographic areas'}\nAvailable lenses: ${context.lenses?.join(', ') || 'projects, quests, events, resources'}\n\nReturn ONLY a JSON array of query strings.`;\n\n return this.llm.getJSON(systemPrompt, 'Generate query suggestions', { temperature: 0.7 });\n }\n\n /**\n * Explain query results in natural language\n * @param {string} query - Original query\n * @param {Array} results - Query results\n * @returns {Promise<string>} Natural language explanation\n */\n async explain(query, results) {\n const systemPrompt = `You are a helpful data analyst. Explain the results of a query in natural language.\n\nOriginal query: ${query}\nNumber of results: ${results.length}\n\nProvide a brief, helpful summary of what was found.`;\n\n const sampleResults = results.slice(0, 5);\n\n return this.llm.sendMessage(\n systemPrompt,\n `Results sample: ${JSON.stringify(sampleResults, null, 2)}`,\n { temperature: 0.5 }\n );\n }\n}\n\nexport default NLQuery;\n","/**\n * Classifier - Auto-classification of content to appropriate lenses\n */\n\n/**\n * Classifier class for content categorization\n */\nexport class Classifier {\n /**\n * @param {LLMService} llmService - LLM service instance\n * @param {Object} holosphere - HoloSphere instance (optional)\n */\n constructor(llmService, holosphere = null) {\n this.llm = llmService;\n this.holosphere = holosphere;\n this.lensDescriptions = new Map();\n }\n\n /**\n * Set HoloSphere instance\n * @param {Object} holosphere - HoloSphere instance\n */\n setHoloSphere(holosphere) {\n this.holosphere = holosphere;\n }\n\n /**\n * Register a lens with its description\n * @param {string} lensName - Lens name\n * @param {string} description - Description of what goes in this lens\n * @param {Object} schema - Optional JSON schema for the lens\n */\n registerLens(lensName, description, schema = null) {\n this.lensDescriptions.set(lensName, { description, schema });\n }\n\n /**\n * Register multiple lenses\n * @param {Object<string, {description: string, schema?: Object}>} lenses\n */\n registerLenses(lenses) {\n for (const [name, config] of Object.entries(lenses)) {\n this.registerLens(name, config.description, config.schema);\n }\n }\n\n /**\n * Classify content into the best lens\n * @param {Object|string} content - Content to classify\n * @returns {Promise<{lens: string, confidence: number, reasoning: string}>}\n */\n async classifyToLens(content) {\n const lenses = Array.from(this.lensDescriptions.entries());\n\n if (lenses.length === 0) {\n throw new Error('No lenses registered. Use registerLens() first.');\n }\n\n const lensDescriptions = lenses\n .map(([name, config]) => `- ${name}: ${config.description}`)\n .join('\\n');\n\n const contentStr = typeof content === 'string' ? content : JSON.stringify(content, null, 2);\n\n const systemPrompt = `You are a content classifier. Classify the following content into the most appropriate lens.\n\nAvailable lenses:\n${lensDescriptions}\n\nReturn JSON: {\"lens\": \"lens_name\", \"confidence\": 0.0-1.0, \"reasoning\": \"brief explanation\"}`;\n\n return this.llm.getJSON(systemPrompt, contentStr, { temperature: 0.2 });\n }\n\n /**\n * Classify content into multiple possible lenses\n * @param {Object|string} content - Content to classify\n * @param {number} maxLenses - Maximum lenses to return\n * @returns {Promise<Array<{lens: string, confidence: number}>>}\n */\n async classifyMultiple(content, maxLenses = 3) {\n const lenses = Array.from(this.lensDescriptions.entries());\n\n if (lenses.length === 0) {\n throw new Error('No lenses registered');\n }\n\n const lensDescriptions = lenses\n .map(([name, config]) => `- ${name}: ${config.description}`)\n .join('\\n');\n\n const contentStr = typeof content === 'string' ? content : JSON.stringify(content, null, 2);\n\n const systemPrompt = `You are a content classifier. Classify the content into up to ${maxLenses} appropriate lenses, ranked by fit.\n\nAvailable lenses:\n${lensDescriptions}\n\nReturn JSON array: [{\"lens\": \"name\", \"confidence\": 0.0-1.0}, ...]\nOrder by confidence descending.`;\n\n return this.llm.getJSON(systemPrompt, contentStr, { temperature: 0.2 });\n }\n\n /**\n * Auto-store content in the best lens\n * @param {string} holon - Holon identifier\n * @param {Object} content - Content to store\n * @returns {Promise<{lens: string, stored: boolean, result: Object}>}\n */\n async autoStore(holon, content) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required for storage');\n }\n\n const classification = await this.classifyToLens(content);\n\n // Store in classified lens\n const result = await this.holosphere.put(holon, classification.lens, content);\n\n return {\n lens: classification.lens,\n confidence: classification.confidence,\n reasoning: classification.reasoning,\n stored: true,\n result,\n };\n }\n\n /**\n * Suggest lens for new content type\n * @param {string} contentDescription - Description of the new content type\n * @returns {Promise<{name: string, description: string}>}\n */\n async suggestNewLens(contentDescription) {\n const existingLenses = Array.from(this.lensDescriptions.keys());\n\n const systemPrompt = `You are helping design a data organization system. Suggest a new lens (category) for this type of content.\n\nExisting lenses: ${existingLenses.join(', ')}\n\nReturn JSON: {\"name\": \"lens_name\", \"description\": \"what this lens contains\"}\nUse lowercase_snake_case for names.`;\n\n return this.llm.getJSON(systemPrompt, contentDescription, { temperature: 0.5 });\n }\n\n /**\n * Analyze content and extract fields for schema\n * @param {Object} content - Sample content\n * @returns {Promise<Object>} Suggested JSON schema\n */\n async suggestSchema(content) {\n const contentStr = JSON.stringify(content, null, 2);\n\n const systemPrompt = `You are a data modeling expert. Analyze this content and suggest a JSON schema for validating similar content.\n\nReturn a valid JSON schema with:\n- Type definitions\n- Required fields\n- Field descriptions\n- Reasonable constraints`;\n\n return this.llm.getJSON(systemPrompt, contentStr, { temperature: 0.3 });\n }\n\n /**\n * Validate content against lens schema\n * @param {Object} content - Content to validate\n * @param {string} lensName - Lens to validate against\n * @returns {Promise<{valid: boolean, issues: string[]}>}\n */\n async validateForLens(content, lensName) {\n const lensConfig = this.lensDescriptions.get(lensName);\n\n if (!lensConfig) {\n throw new Error(`Lens not found: ${lensName}`);\n }\n\n if (!lensConfig.schema) {\n // If no schema, use AI to validate\n const systemPrompt = `Validate if this content is appropriate for the \"${lensName}\" lens.\nLens description: ${lensConfig.description}\n\nReturn JSON: {\"valid\": true/false, \"issues\": [\"issue1\", \"issue2\"] or []}`;\n\n return this.llm.getJSON(systemPrompt, JSON.stringify(content, null, 2), { temperature: 0.2 });\n }\n\n // Use schema validation (would integrate with schema validator)\n return { valid: true, issues: [] };\n }\n\n /**\n * Get classification stats for a collection\n * @param {Object[]} items - Items to analyze\n * @returns {Promise<Object>} Classification statistics\n */\n async analyzeCollection(items) {\n const classifications = await Promise.all(\n items.map(item => this.classifyToLens(item))\n );\n\n const stats = {};\n for (const c of classifications) {\n stats[c.lens] = (stats[c.lens] || 0) + 1;\n }\n\n return {\n total: items.length,\n byLens: stats,\n classifications,\n };\n }\n}\n\nexport default Classifier;\n","/**\n * Spatial Analysis - AI-powered analysis of data patterns across geographic regions\n */\n\n/**\n * Spatial Analysis class\n */\nexport class SpatialAnalysis {\n /**\n * @param {LLMService} llmService - LLM service instance\n * @param {Object} holosphere - HoloSphere instance\n */\n constructor(llmService, holosphere = null) {\n this.llm = llmService;\n this.holosphere = holosphere;\n }\n\n /**\n * Set HoloSphere instance\n * @param {Object} holosphere - HoloSphere instance\n */\n setHoloSphere(holosphere) {\n this.holosphere = holosphere;\n }\n\n /**\n * Analyze data patterns in a region\n * @param {string} holon - Holon identifier\n * @param {string} lens - Lens to analyze (optional, all if null)\n * @param {string} aspect - Analysis aspect (activity, trends, distribution, etc.)\n * @returns {Promise<Object>} Analysis results\n */\n async analyzeRegion(holon, lens = null, aspect = 'general') {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n // Get data from holon\n let data = [];\n if (lens) {\n data = await this.holosphere.getAll(holon, lens);\n } else {\n // Get from all known lenses - would need lens list\n data = await this.holosphere.getAll(holon, 'default');\n }\n\n const dataStr = JSON.stringify(data.slice(0, 50), null, 2); // Sample for analysis\n\n const systemPrompt = `You are a geospatial data analyst. Analyze the following data from a geographic region.\n\nRegion (holon): ${holon}\nLens: ${lens || 'all'}\nAnalysis aspect: ${aspect}\nTotal items: ${data.length}\n\nProvide insights about:\n1. Key patterns and trends\n2. Notable clusters or concentrations\n3. Anomalies or outliers\n4. Recommendations for the region\n\nReturn JSON:\n{\n \"summary\": \"brief overview\",\n \"patterns\": [\"pattern1\", \"pattern2\"],\n \"insights\": [\"insight1\", \"insight2\"],\n \"metrics\": {\"metric1\": value},\n \"recommendations\": [\"rec1\", \"rec2\"],\n \"confidence\": 0.0-1.0\n}`;\n\n const analysis = await this.llm.getJSON(systemPrompt, dataStr, { temperature: 0.3 });\n\n return {\n holon,\n lens,\n aspect,\n dataCount: data.length,\n analysis,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Compare data between two regions\n * @param {string} holon1 - First holon\n * @param {string} holon2 - Second holon\n * @param {string} lens - Lens to compare\n * @returns {Promise<Object>} Comparison results\n */\n async compareRegions(holon1, holon2, lens) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n const data1 = await this.holosphere.getAll(holon1, lens);\n const data2 = await this.holosphere.getAll(holon2, lens);\n\n const systemPrompt = `You are a comparative analyst. Compare data between two geographic regions.\n\nRegion 1 (${holon1}): ${data1.length} items\nRegion 2 (${holon2}): ${data2.length} items\nLens: ${lens}\n\nAnalyze and compare:\n1. Similarities between regions\n2. Key differences\n3. Relative strengths of each region\n4. Opportunities for collaboration\n\nReturn JSON:\n{\n \"summary\": \"brief comparison\",\n \"similarities\": [\"sim1\", \"sim2\"],\n \"differences\": [\"diff1\", \"diff2\"],\n \"region1_strengths\": [\"strength1\"],\n \"region2_strengths\": [\"strength1\"],\n \"collaboration_opportunities\": [\"opp1\"],\n \"metrics_comparison\": {\"metric\": {\"region1\": val, \"region2\": val}}\n}`;\n\n const userMessage = `Region 1 data sample:\n${JSON.stringify(data1.slice(0, 25), null, 2)}\n\nRegion 2 data sample:\n${JSON.stringify(data2.slice(0, 25), null, 2)}`;\n\n const comparison = await this.llm.getJSON(systemPrompt, userMessage, { temperature: 0.3 });\n\n return {\n regions: [holon1, holon2],\n lens,\n dataCounts: { [holon1]: data1.length, [holon2]: data2.length },\n comparison,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Identify spatial trends over time\n * @param {string} holon - Holon identifier\n * @param {string} lens - Lens to analyze\n * @param {Object} timeRange - Time range {start, end}\n * @returns {Promise<Object>} Trend analysis\n */\n async spatialTrends(holon, lens, timeRange = {}) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n const data = await this.holosphere.getAll(holon, lens);\n\n // Filter by time if timestamps available\n let filteredData = data;\n if (timeRange.start || timeRange.end) {\n filteredData = data.filter(item => {\n const ts = item.timestamp || item.created_at || item.date;\n if (!ts) return true;\n\n const itemTime = new Date(ts).getTime();\n if (timeRange.start && itemTime < new Date(timeRange.start).getTime()) return false;\n if (timeRange.end && itemTime > new Date(timeRange.end).getTime()) return false;\n return true;\n });\n }\n\n const systemPrompt = `You are a trend analyst. Analyze temporal patterns in geographic data.\n\nRegion: ${holon}\nLens: ${lens}\nTime range: ${JSON.stringify(timeRange)}\nItems analyzed: ${filteredData.length}\n\nIdentify:\n1. Growth/decline trends\n2. Seasonal patterns\n3. Emerging themes\n4. Predictions\n\nReturn JSON:\n{\n \"trends\": [{\"trend\": \"description\", \"direction\": \"up|down|stable\", \"strength\": 0.0-1.0}],\n \"patterns\": [\"pattern1\"],\n \"emerging_themes\": [\"theme1\"],\n \"predictions\": [\"pred1\"],\n \"summary\": \"overview\"\n}`;\n\n const trends = await this.llm.getJSON(\n systemPrompt,\n JSON.stringify(filteredData.slice(0, 50), null, 2),\n { temperature: 0.3 }\n );\n\n return {\n holon,\n lens,\n timeRange,\n dataCount: filteredData.length,\n trends,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Find hotspots in hierarchical data\n * @param {string} holon - Starting holon\n * @param {string} lens - Lens to analyze\n * @param {string} metric - Metric to identify hotspots by\n * @returns {Promise<Object>} Hotspot analysis\n */\n async findHotspots(holon, lens, metric = 'count') {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n // Get data from holon and children\n const data = await this.holosphere.getAll(holon, lens);\n\n const systemPrompt = `You are a spatial analyst. Identify hotspots (areas of high concentration/activity) in geographic data.\n\nRegion: ${holon}\nLens: ${lens}\nMetric: ${metric}\nData points: ${data.length}\n\nIdentify:\n1. High-activity areas\n2. Emerging areas\n3. Underserved areas\n4. Recommended focus areas\n\nReturn JSON:\n{\n \"hotspots\": [{\"location\": \"desc\", \"intensity\": 0.0-1.0, \"type\": \"high_activity|emerging|underserved\"}],\n \"concentration_patterns\": [\"pattern1\"],\n \"recommendations\": [\"rec1\"],\n \"summary\": \"overview\"\n}`;\n\n return this.llm.getJSON(\n systemPrompt,\n JSON.stringify(data.slice(0, 50), null, 2),\n { temperature: 0.3 }\n );\n }\n\n /**\n * Generate spatial report for a region\n * @param {string} holon - Holon identifier\n * @param {Object} options - Report options\n * @returns {Promise<string>} Formatted report\n */\n async generateReport(holon, options = {}) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n const lenses = options.lenses || ['default'];\n const allData = {};\n\n for (const lens of lenses) {\n allData[lens] = await this.holosphere.getAll(holon, lens);\n }\n\n const systemPrompt = `You are a regional analyst. Generate a comprehensive report for this geographic region.\n\nRegion: ${holon}\nData by lens: ${Object.entries(allData).map(([l, d]) => `${l}: ${d.length} items`).join(', ')}\n\nGenerate a professional report including:\n1. Executive Summary\n2. Key Statistics\n3. Notable Patterns\n4. Opportunities\n5. Recommendations\n\nFormat as markdown.`;\n\n const dataSample = {};\n for (const [lens, data] of Object.entries(allData)) {\n dataSample[lens] = data.slice(0, 20);\n }\n\n return this.llm.sendMessage(\n systemPrompt,\n JSON.stringify(dataSample, null, 2),\n { temperature: 0.5, maxTokens: 2000 }\n );\n }\n}\n\nexport default SpatialAnalysis;\n","/**\n * Smart Aggregation - AI-assisted hierarchical data aggregation up the holon tree\n */\n\nimport * as h3 from 'h3-js';\n\n/**\n * Smart Aggregation class\n */\nexport class SmartAggregation {\n /**\n * @param {LLMService} llmService - LLM service instance\n * @param {Object} holosphere - HoloSphere instance\n */\n constructor(llmService, holosphere = null) {\n this.llm = llmService;\n this.holosphere = holosphere;\n }\n\n /**\n * Set HoloSphere instance\n * @param {Object} holosphere - HoloSphere instance\n */\n setHoloSphere(holosphere) {\n this.holosphere = holosphere;\n }\n\n /**\n * Smart upcast - AI-summarized hierarchical aggregation\n * @param {string} holon - Starting holon\n * @param {string} lens - Lens to aggregate\n * @param {Object} options - Options\n * @returns {Promise<Object>} Aggregation result\n */\n async smartUpcast(holon, lens, options = {}) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n const { maxLevels = 5, storeResults = true } = options;\n\n // Get current data\n const data = await this.holosphere.getAll(holon, lens);\n\n // Generate summary for current level\n const summary = await this._generateSummary(data, holon, lens);\n\n // Get parent holon\n const resolution = h3.getResolution(holon);\n if (resolution <= 0 || maxLevels <= 0) {\n return { holon, lens, summary, level: resolution };\n }\n\n const parent = h3.cellToParent(holon, resolution - 1);\n\n // Store summary at parent level\n if (storeResults) {\n await this.holosphere.put(parent, `${lens}_summaries`, {\n id: holon,\n childHolon: holon,\n summary,\n dataCount: data.length,\n timestamp: Date.now(),\n });\n }\n\n // Recursively upcast to parent\n const parentResult = await this.smartUpcast(parent, lens, {\n ...options,\n maxLevels: maxLevels - 1,\n });\n\n return {\n holon,\n lens,\n summary,\n dataCount: data.length,\n parent: parentResult,\n };\n }\n\n /**\n * Generate AI summary for data\n * @private\n */\n async _generateSummary(data, holon, lens) {\n if (data.length === 0) {\n return { text: 'No data in this region', stats: { count: 0 } };\n }\n\n const systemPrompt = `You are a data summarization expert. Create a concise summary of this geographic data.\n\nRegion: ${holon}\nCategory: ${lens}\nItems: ${data.length}\n\nGenerate:\n1. A brief text summary (2-3 sentences)\n2. Key statistics\n3. Notable items\n4. Themes/patterns\n\nReturn JSON:\n{\n \"text\": \"summary text\",\n \"stats\": {\"count\": n, \"key_metric\": value},\n \"notable\": [\"item1\", \"item2\"],\n \"themes\": [\"theme1\", \"theme2\"]\n}`;\n\n return this.llm.getJSON(\n systemPrompt,\n JSON.stringify(data.slice(0, 30), null, 2),\n { temperature: 0.3 }\n );\n }\n\n /**\n * Generate comprehensive holon summary\n * @param {string} holon - Holon identifier\n * @returns {Promise<Object>} Comprehensive summary\n */\n async generateHolonSummary(holon) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n // Get all available lenses (would need to discover)\n const lenses = ['projects', 'quests', 'events', 'resources', 'default'];\n const allData = {};\n\n for (const lens of lenses) {\n try {\n const data = await this.holosphere.getAll(holon, lens);\n if (data.length > 0) {\n allData[lens] = data;\n }\n } catch {\n // Skip unavailable lenses\n }\n }\n\n const systemPrompt = `You are a regional analyst. Generate a comprehensive summary of this geographic area.\n\nRegion: ${holon}\nData available: ${Object.entries(allData).map(([l, d]) => `${l}: ${d.length}`).join(', ')}\n\nGenerate a complete overview including:\n1. Executive summary\n2. Key activities and projects\n3. Community engagement\n4. Resources and assets\n5. Challenges and opportunities\n6. Overall health assessment\n\nReturn JSON:\n{\n \"title\": \"Region Title\",\n \"executive_summary\": \"brief overview\",\n \"highlights\": [\"highlight1\", \"highlight2\"],\n \"activities\": {\"count\": n, \"summary\": \"text\"},\n \"community\": {\"engagement_level\": \"high|medium|low\", \"notes\": \"text\"},\n \"resources\": [\"resource1\"],\n \"challenges\": [\"challenge1\"],\n \"opportunities\": [\"opp1\"],\n \"health_score\": 0.0-1.0,\n \"recommendations\": [\"rec1\"]\n}`;\n\n const dataSample = {};\n for (const [lens, data] of Object.entries(allData)) {\n dataSample[lens] = data.slice(0, 15);\n }\n\n const summary = await this.llm.getJSON(\n systemPrompt,\n JSON.stringify(dataSample, null, 2),\n { temperature: 0.4, maxTokens: 2000 }\n );\n\n return {\n holon,\n summary,\n lensesAnalyzed: Object.keys(allData),\n totalItems: Object.values(allData).reduce((sum, d) => sum + d.length, 0),\n timestamp: Date.now(),\n };\n }\n\n /**\n * Aggregate child summaries into parent\n * @param {string} parentHolon - Parent holon\n * @param {string} lens - Lens\n * @returns {Promise<Object>} Aggregated summary\n */\n async aggregateChildren(parentHolon, lens) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n // Get children holons\n const resolution = h3.getResolution(parentHolon);\n const children = h3.cellToChildren(parentHolon, resolution + 1);\n\n // Collect summaries from children\n const childSummaries = [];\n for (const child of children.slice(0, 7)) { // Limit to 7 children for token limits\n try {\n const data = await this.holosphere.getAll(child, lens);\n if (data.length > 0) {\n const summary = await this._generateSummary(data, child, lens);\n childSummaries.push({ holon: child, summary });\n }\n } catch {\n // Skip\n }\n }\n\n if (childSummaries.length === 0) {\n return { holon: parentHolon, summary: null, message: 'No child data found' };\n }\n\n // Aggregate child summaries\n const systemPrompt = `You are aggregating summaries from child regions into a parent region summary.\n\nParent region: ${parentHolon}\nChild summaries: ${childSummaries.length}\n\nCreate an aggregated summary that:\n1. Synthesizes common themes\n2. Highlights regional diversity\n3. Identifies cross-cutting patterns\n4. Notes outliers\n\nReturn JSON:\n{\n \"aggregated_summary\": \"text\",\n \"common_themes\": [\"theme1\"],\n \"regional_diversity\": [\"diff1\"],\n \"patterns\": [\"pattern1\"],\n \"total_activity\": {\"count\": n, \"trend\": \"growing|stable|declining\"}\n}`;\n\n const summary = await this.llm.getJSON(\n systemPrompt,\n JSON.stringify(childSummaries, null, 2),\n { temperature: 0.3 }\n );\n\n return {\n holon: parentHolon,\n lens,\n childCount: childSummaries.length,\n summary,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Compare aggregations across different time periods\n * @param {string} holon - Holon\n * @param {string} lens - Lens\n * @param {Object} period1 - First period {start, end}\n * @param {Object} period2 - Second period {start, end}\n * @returns {Promise<Object>} Comparison\n */\n async comparePeriods(holon, lens, period1, period2) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n const allData = await this.holosphere.getAll(holon, lens);\n\n const filterByPeriod = (data, period) => {\n return data.filter(item => {\n const ts = item.timestamp || item.created_at;\n if (!ts) return false;\n const itemTime = new Date(ts).getTime();\n return itemTime >= new Date(period.start).getTime() &&\n itemTime <= new Date(period.end).getTime();\n });\n };\n\n const data1 = filterByPeriod(allData, period1);\n const data2 = filterByPeriod(allData, period2);\n\n const systemPrompt = `Compare data between two time periods for a geographic region.\n\nRegion: ${holon}\nPeriod 1: ${JSON.stringify(period1)} - ${data1.length} items\nPeriod 2: ${JSON.stringify(period2)} - ${data2.length} items\n\nAnalyze:\n1. Growth/decline\n2. New themes in period 2\n3. Themes that disappeared\n4. Key changes\n\nReturn JSON:\n{\n \"growth_rate\": percentage,\n \"direction\": \"growth|decline|stable\",\n \"new_themes\": [\"theme1\"],\n \"disappeared\": [\"theme1\"],\n \"key_changes\": [\"change1\"],\n \"summary\": \"text\"\n}`;\n\n const userMessage = `Period 1 data:\n${JSON.stringify(data1.slice(0, 20), null, 2)}\n\nPeriod 2 data:\n${JSON.stringify(data2.slice(0, 20), null, 2)}`;\n\n return this.llm.getJSON(systemPrompt, userMessage, { temperature: 0.3 });\n }\n}\n\nexport default SmartAggregation;\n","/**\n * Federation Advisor - AI-powered federation suggestions and analysis\n */\n\n/**\n * Federation Advisor class\n */\nexport class FederationAdvisor {\n /**\n * @param {LLMService} llmService - LLM service instance\n * @param {Object} holosphere - HoloSphere instance\n * @param {Object} embeddings - Embeddings instance (optional)\n */\n constructor(llmService, holosphere = null, embeddings = null) {\n this.llm = llmService;\n this.holosphere = holosphere;\n this.embeddings = embeddings;\n }\n\n /**\n * Set HoloSphere instance\n * @param {Object} holosphere - HoloSphere instance\n */\n setHoloSphere(holosphere) {\n this.holosphere = holosphere;\n }\n\n /**\n * Set Embeddings instance\n * @param {Object} embeddings - Embeddings instance\n */\n setEmbeddings(embeddings) {\n this.embeddings = embeddings;\n }\n\n /**\n * Suggest federations based on content similarity\n * @param {string} holon - Holon to find federation partners for\n * @param {Object} options - Options\n * @returns {Promise<Array>} Suggested federations\n */\n async suggestFederations(holon, options = {}) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n const { candidateHolons = [], lens = 'default', maxSuggestions = 5 } = options;\n\n // Get data from source holon\n const sourceData = await this.holosphere.getAll(holon, lens);\n\n if (sourceData.length === 0) {\n return { holon, suggestions: [], message: 'No data in source holon' };\n }\n\n // If we have candidate holons, compare with each\n const comparisons = [];\n\n for (const candidate of candidateHolons.slice(0, 10)) {\n if (candidate === holon) continue;\n\n try {\n const candidateData = await this.holosphere.getAll(candidate, lens);\n if (candidateData.length > 0) {\n comparisons.push({\n holon: candidate,\n dataCount: candidateData.length,\n dataSample: candidateData.slice(0, 10),\n });\n }\n } catch {\n // Skip unavailable holons\n }\n }\n\n if (comparisons.length === 0) {\n return { holon, suggestions: [], message: 'No candidate holons with data' };\n }\n\n const systemPrompt = `You are a federation advisor. Analyze which regions would benefit from federating (sharing data) with the source region.\n\nSource region: ${holon}\nSource data count: ${sourceData.length}\n\nConsider:\n1. Content similarity - similar topics benefit from shared visibility\n2. Complementary content - different but related content enables collaboration\n3. Geographic proximity relevance\n4. Potential for knowledge sharing\n\nReturn JSON array:\n[\n {\n \"holon\": \"id\",\n \"score\": 0.0-1.0,\n \"reasoning\": \"why federate\",\n \"benefits\": [\"benefit1\"],\n \"type\": \"similarity|complementary|geographic\"\n }\n]\n\nOrder by score descending, max ${maxSuggestions} suggestions.`;\n\n const userMessage = `Source data sample:\n${JSON.stringify(sourceData.slice(0, 15), null, 2)}\n\nCandidate regions:\n${JSON.stringify(comparisons, null, 2)}`;\n\n const suggestions = await this.llm.getJSON(systemPrompt, userMessage, { temperature: 0.3 });\n\n return {\n holon,\n lens,\n suggestions: suggestions.slice(0, maxSuggestions),\n timestamp: Date.now(),\n };\n }\n\n /**\n * Analyze federation health\n * @param {string} holon - Holon to analyze\n * @returns {Promise<Object>} Federation health analysis\n */\n async analyzeFederationHealth(holon) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n // Get federation info\n const federation = await this.holosphere.getFederation(holon);\n\n if (!federation || !federation.federation || federation.federation.length === 0) {\n return {\n holon,\n health: 'none',\n message: 'No federations configured',\n score: 0,\n };\n }\n\n // Analyze each federation\n const federationAnalysis = [];\n\n for (const fedHolon of federation.federation.slice(0, 5)) {\n try {\n const fedData = await this.holosphere.getAll(fedHolon, 'default');\n federationAnalysis.push({\n holon: fedHolon,\n active: fedData.length > 0,\n dataCount: fedData.length,\n });\n } catch {\n federationAnalysis.push({\n holon: fedHolon,\n active: false,\n error: true,\n });\n }\n }\n\n const systemPrompt = `You are a federation health analyst. Assess the health of this holon's federation relationships.\n\nSource holon: ${holon}\nFederation partners: ${federation.federation.length}\nActive federations: ${federationAnalysis.filter(f => f.active).length}\n\nFederation details:\n${JSON.stringify(federationAnalysis, null, 2)}\n\nAnalyze:\n1. Overall federation health\n2. Active vs inactive relationships\n3. Balance of the federation network\n4. Recommendations\n\nReturn JSON:\n{\n \"health_score\": 0.0-1.0,\n \"status\": \"healthy|degraded|unhealthy\",\n \"active_count\": n,\n \"inactive_count\": n,\n \"issues\": [\"issue1\"],\n \"recommendations\": [\"rec1\"],\n \"summary\": \"text\"\n}`;\n\n const analysis = await this.llm.getJSON(systemPrompt, '', { temperature: 0.3 });\n\n return {\n holon,\n federation: federation.federation,\n analysis,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Suggest federation optimizations\n * @param {string} holon - Holon to optimize\n * @returns {Promise<Object>} Optimization suggestions\n */\n async optimizeFederation(holon) {\n const health = await this.analyzeFederationHealth(holon);\n\n if (health.health === 'none') {\n return { holon, suggestions: ['Consider establishing initial federations'] };\n }\n\n const systemPrompt = `Based on federation health analysis, suggest optimizations.\n\nHealth analysis:\n${JSON.stringify(health.analysis, null, 2)}\n\nSuggest:\n1. Federations to strengthen\n2. Federations to reconsider\n3. New potential federations\n4. Data flow improvements\n\nReturn JSON:\n{\n \"strengthen\": [\"holon_id\"],\n \"reconsider\": [\"holon_id\"],\n \"new_potential\": [\"description\"],\n \"improvements\": [\"improvement1\"],\n \"priority\": \"high|medium|low\"\n}`;\n\n return this.llm.getJSON(systemPrompt, '', { temperature: 0.4 });\n }\n\n /**\n * Analyze data flow in federation network\n * @param {string} holon - Starting holon\n * @returns {Promise<Object>} Data flow analysis\n */\n async analyzeDataFlow(holon) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n const federation = await this.holosphere.getFederation(holon);\n\n if (!federation) {\n return { holon, message: 'No federation configured' };\n }\n\n const systemPrompt = `Analyze the data flow patterns in a federation network.\n\nSource holon: ${holon}\nFederated with: ${federation.federation?.join(', ') || 'none'}\nNotifies: ${federation.notify?.join(', ') || 'none'}\n\nConsider:\n1. Bidirectional vs unidirectional relationships\n2. Hub patterns (many connections)\n3. Data propagation paths\n4. Potential bottlenecks\n\nReturn JSON:\n{\n \"flow_type\": \"bidirectional|unidirectional|mixed\",\n \"topology\": \"hub|mesh|chain|star\",\n \"propagation_depth\": n,\n \"bottlenecks\": [\"desc\"],\n \"recommendations\": [\"rec1\"]\n}`;\n\n return this.llm.getJSON(systemPrompt, JSON.stringify(federation, null, 2), { temperature: 0.3 });\n }\n\n /**\n * Find federation bridges - holons that connect disparate networks\n * @param {string[]} holons - List of holons to analyze\n * @returns {Promise<Object>} Bridge analysis\n */\n async findBridges(holons) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n const network = [];\n\n for (const holon of holons.slice(0, 20)) {\n try {\n const fed = await this.holosphere.getFederation(holon);\n if (fed) {\n network.push({\n holon,\n federations: fed.federation || [],\n notifies: fed.notify || [],\n });\n }\n } catch {\n // Skip\n }\n }\n\n const systemPrompt = `Analyze a federation network to identify bridge holons (connectors between clusters).\n\nNetwork:\n${JSON.stringify(network, null, 2)}\n\nIdentify:\n1. Bridge holons that connect clusters\n2. Isolated holons\n3. Central hubs\n4. Network clusters\n\nReturn JSON:\n{\n \"bridges\": [{\"holon\": \"id\", \"connects\": [\"cluster1\", \"cluster2\"]}],\n \"isolated\": [\"holon_id\"],\n \"hubs\": [{\"holon\": \"id\", \"connections\": n}],\n \"clusters\": [[\"holon1\", \"holon2\"]],\n \"network_health\": 0.0-1.0\n}`;\n\n return this.llm.getJSON(systemPrompt, '', { temperature: 0.3 });\n }\n}\n\nexport default FederationAdvisor;\n","/**\n * Relationship Discovery - Find hidden connections across data\n */\n\n/**\n * Relationship Discovery class\n */\nexport class RelationshipDiscovery {\n /**\n * @param {LLMService} llmService - LLM service instance\n * @param {Object} holosphere - HoloSphere instance\n * @param {Object} embeddings - Embeddings instance (optional)\n */\n constructor(llmService, holosphere = null, embeddings = null) {\n this.llm = llmService;\n this.holosphere = holosphere;\n this.embeddings = embeddings;\n }\n\n /**\n * Set HoloSphere instance\n * @param {Object} holosphere - HoloSphere instance\n */\n setHoloSphere(holosphere) {\n this.holosphere = holosphere;\n }\n\n /**\n * Set Embeddings instance\n * @param {Object} embeddings - Embeddings instance\n */\n setEmbeddings(embeddings) {\n this.embeddings = embeddings;\n }\n\n /**\n * Discover relationships in holon data\n * @param {string} holon - Holon identifier\n * @param {string} lens - Lens to analyze (optional)\n * @returns {Promise<Object>} Discovered relationships\n */\n async discoverRelationships(holon, lens = null) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n // Get data from holon\n let data = [];\n const lenses = lens ? [lens] : ['projects', 'quests', 'events', 'resources', 'default'];\n\n for (const l of lenses) {\n try {\n const lensData = await this.holosphere.getAll(holon, l);\n data.push(...lensData.map(item => ({ ...item, _lens: l })));\n } catch {\n // Skip unavailable lenses\n }\n }\n\n if (data.length < 2) {\n return { holon, relationships: [], message: 'Not enough data for relationship discovery' };\n }\n\n const systemPrompt = `You are a relationship discovery expert. Find hidden connections between items in this dataset.\n\nRegion: ${holon}\nItems: ${data.length}\n\nLook for:\n1. Thematic connections (shared topics, goals)\n2. Entity connections (shared people, organizations)\n3. Temporal connections (same timeframes)\n4. Causal connections (one enables/requires another)\n5. Geographic connections (same sub-regions)\n\nReturn JSON:\n{\n \"relationships\": [\n {\n \"item1\": {\"id\": \"id1\", \"title\": \"title\"},\n \"item2\": {\"id\": \"id2\", \"title\": \"title\"},\n \"type\": \"thematic|entity|temporal|causal|geographic\",\n \"strength\": 0.0-1.0,\n \"description\": \"relationship description\"\n }\n ],\n \"clusters\": [\n {\n \"theme\": \"cluster theme\",\n \"items\": [\"id1\", \"id2\"]\n }\n ],\n \"key_entities\": [\"entity1\", \"entity2\"],\n \"summary\": \"overview of relationship network\"\n}`;\n\n const relationships = await this.llm.getJSON(\n systemPrompt,\n JSON.stringify(data.slice(0, 40), null, 2),\n { temperature: 0.3 }\n );\n\n return {\n holon,\n lens,\n itemCount: data.length,\n relationships,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Find items similar to a given item\n * @param {Object} item - Item to find similar items for\n * @param {string} holon - Holon to search in (optional)\n * @param {string} lens - Lens to search in (optional)\n * @param {Object} options - Search options\n * @returns {Promise<Array>} Similar items\n */\n async findSimilar(item, holon = null, lens = null, options = {}) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n const { limit = 10, threshold = 0.5, useEmbeddings = true } = options;\n\n // If embeddings available, use semantic search\n if (useEmbeddings && this.embeddings && holon && lens) {\n return this.embeddings.findSimilar(item, holon, lens, { limit, threshold });\n }\n\n // Fall back to LLM-based similarity\n if (!holon) {\n throw new Error('Holon required for LLM-based similarity');\n }\n\n const searchLenses = lens ? [lens] : ['projects', 'quests', 'events', 'resources', 'default'];\n let candidates = [];\n\n for (const l of searchLenses) {\n try {\n const data = await this.holosphere.getAll(holon, l);\n candidates.push(...data.map(d => ({ ...d, _lens: l })));\n } catch {\n // Skip\n }\n }\n\n if (candidates.length === 0) {\n return [];\n }\n\n const systemPrompt = `Find items most similar to the reference item.\n\nReference item:\n${JSON.stringify(item, null, 2)}\n\nConsider:\n1. Topic/theme similarity\n2. Goal alignment\n3. Participant overlap\n4. Resource requirements\n5. Timeline compatibility\n\nReturn JSON array of similar items with similarity scores:\n[\n {\n \"item\": {item object},\n \"similarity\": 0.0-1.0,\n \"reasons\": [\"reason1\"]\n }\n]\n\nOrder by similarity descending. Max ${limit} items with similarity >= ${threshold}.`;\n\n const results = await this.llm.getJSON(\n systemPrompt,\n JSON.stringify(candidates.slice(0, 50), null, 2),\n { temperature: 0.2 }\n );\n\n return results.slice(0, limit).filter(r => r.similarity >= threshold);\n }\n\n /**\n * Build relationship graph\n * @param {string} holon - Holon\n * @param {string} lens - Lens\n * @returns {Promise<Object>} Graph structure\n */\n async buildGraph(holon, lens) {\n const discovered = await this.discoverRelationships(holon, lens);\n\n const nodes = new Map();\n const edges = [];\n\n // Build nodes from relationships\n for (const rel of discovered.relationships?.relationships || []) {\n if (!nodes.has(rel.item1.id)) {\n nodes.set(rel.item1.id, { id: rel.item1.id, label: rel.item1.title });\n }\n if (!nodes.has(rel.item2.id)) {\n nodes.set(rel.item2.id, { id: rel.item2.id, label: rel.item2.title });\n }\n\n edges.push({\n source: rel.item1.id,\n target: rel.item2.id,\n type: rel.type,\n weight: rel.strength,\n });\n }\n\n return {\n nodes: Array.from(nodes.values()),\n edges,\n clusters: discovered.relationships?.clusters || [],\n };\n }\n\n /**\n * Find cross-holon relationships\n * @param {string[]} holons - Holons to analyze\n * @param {string} lens - Lens\n * @returns {Promise<Object>} Cross-holon relationships\n */\n async findCrossHolonRelationships(holons, lens) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n const allData = {};\n\n for (const holon of holons.slice(0, 5)) {\n try {\n const data = await this.holosphere.getAll(holon, lens);\n if (data.length > 0) {\n allData[holon] = data.slice(0, 15);\n }\n } catch {\n // Skip\n }\n }\n\n if (Object.keys(allData).length < 2) {\n return { message: 'Need at least 2 holons with data' };\n }\n\n const systemPrompt = `Find relationships between items across different geographic regions.\n\nRegions and their data:\n${JSON.stringify(allData, null, 2)}\n\nIdentify:\n1. Cross-region collaborations\n2. Shared themes across regions\n3. Potential synergies\n4. Knowledge transfer opportunities\n\nReturn JSON:\n{\n \"cross_relationships\": [\n {\n \"holon1\": \"id\",\n \"item1\": \"item_id\",\n \"holon2\": \"id\",\n \"item2\": \"item_id\",\n \"type\": \"type\",\n \"potential\": \"collaboration|knowledge_share|synergy\"\n }\n ],\n \"shared_themes\": [{\"theme\": \"theme\", \"holons\": [\"id1\", \"id2\"]}],\n \"opportunities\": [\"opp1\"]\n}`;\n\n return this.llm.getJSON(systemPrompt, '', { temperature: 0.4 });\n }\n\n /**\n * Suggest connections for an item\n * @param {Object} item - Item to find connections for\n * @param {string} holon - Holon\n * @param {string} lens - Lens\n * @returns {Promise<Object>} Suggested connections\n */\n async suggestConnections(item, holon, lens) {\n const similar = await this.findSimilar(item, holon, lens, { limit: 10 });\n\n const systemPrompt = `Based on similar items found, suggest specific actions to create connections.\n\nReference item:\n${JSON.stringify(item, null, 2)}\n\nSimilar items found:\n${JSON.stringify(similar, null, 2)}\n\nSuggest:\n1. Collaboration opportunities\n2. Resource sharing possibilities\n3. Joint initiatives\n4. Knowledge exchange\n\nReturn JSON:\n{\n \"collaborations\": [{\"with\": \"item_id\", \"action\": \"suggested action\"}],\n \"resource_sharing\": [{\"items\": [\"id1\", \"id2\"], \"resource\": \"what to share\"}],\n \"initiatives\": [{\"description\": \"joint initiative\", \"participants\": [\"id1\"]}],\n \"knowledge_exchange\": [{\"from\": \"id\", \"to\": \"id\", \"topic\": \"topic\"}]\n}`;\n\n return this.llm.getJSON(systemPrompt, '', { temperature: 0.5 });\n }\n\n /**\n * Detect relationship patterns\n * @param {string} holon - Holon\n * @param {string} lens - Lens\n * @returns {Promise<Object>} Detected patterns\n */\n async detectPatterns(holon, lens) {\n const relationships = await this.discoverRelationships(holon, lens);\n\n const systemPrompt = `Analyze relationships and detect higher-level patterns.\n\nRelationships:\n${JSON.stringify(relationships.relationships, null, 2)}\n\nDetect:\n1. Hub-spoke patterns (central connectors)\n2. Cluster patterns (tight groups)\n3. Bridge patterns (connecting different groups)\n4. Chain patterns (sequential relationships)\n5. Cyclical patterns (mutual dependencies)\n\nReturn JSON:\n{\n \"patterns\": [\n {\n \"type\": \"hub|cluster|bridge|chain|cycle\",\n \"description\": \"pattern description\",\n \"items\": [\"id1\", \"id2\"],\n \"significance\": \"why this matters\"\n }\n ],\n \"network_structure\": \"description of overall structure\",\n \"recommendations\": [\"rec1\"]\n}`;\n\n return this.llm.getJSON(systemPrompt, '', { temperature: 0.3 });\n }\n}\n\nexport default RelationshipDiscovery;\n","/**\n * Task Breakdown - Recursively decompose tasks/quests into subtasks\n */\n\n/**\n * Task Breakdown class\n */\nexport class TaskBreakdown {\n /**\n * @param {LLMService} llmService - LLM service instance\n * @param {Object} holosphere - HoloSphere instance\n */\n constructor(llmService, holosphere = null) {\n this.llm = llmService;\n this.holosphere = holosphere;\n }\n\n /**\n * Set HoloSphere instance\n * @param {Object} holosphere - HoloSphere instance\n */\n setHoloSphere(holosphere) {\n this.holosphere = holosphere;\n }\n\n /**\n * Recursively break down a task/quest into subtasks\n * @param {Object} item - The item to break down (must have id)\n * @param {string} holonId - Holon where the item lives\n * @param {string} lensName - Lens name (e.g., 'quests', 'tasks')\n * @param {Object} options - Breakdown options\n * @param {number} options.depth - Maximum recursion depth (default: 2)\n * @param {number} options.stepsPerLevel - Number of subtasks per level (default: 3-5)\n * @param {boolean} options.useContext - Look at other items for context (default: true)\n * @param {boolean} options.storeResults - Store generated subtasks (default: true)\n * @param {string} options.dependencyField - Field name for dependencies (default: 'dependencies')\n * @param {string} options.parentField - Field name for parent reference (default: 'parent')\n * @returns {Promise<Object>} Breakdown result with tree structure\n */\n async breakdown(item, holonId, lensName, options = {}) {\n if (!item || !item.id) {\n throw new Error('Item must have an id property');\n }\n\n const {\n depth = 2,\n stepsPerLevel = { min: 3, max: 5 },\n useContext = true,\n storeResults = true,\n dependencyField = 'dependencies',\n parentField = 'parent',\n } = options;\n\n // Normalize stepsPerLevel\n const steps = typeof stepsPerLevel === 'number'\n ? { min: stepsPerLevel, max: stepsPerLevel }\n : stepsPerLevel;\n\n // Get context from other items in the holon\n let context = [];\n if (useContext && this.holosphere) {\n try {\n const allItems = await this.holosphere.getAll(holonId, lensName);\n context = allItems\n .filter(i => i.id !== item.id)\n .slice(0, 10); // Limit context items\n } catch {\n // Skip if can't get context\n }\n }\n\n // Get schema for the lens if available\n let schema = null;\n if (this.holosphere) {\n try {\n schema = await this.holosphere.getSchema(lensName);\n } catch {\n // No schema available\n }\n }\n\n // Perform recursive breakdown\n const result = await this._breakdownRecursive(\n item,\n holonId,\n lensName,\n depth,\n steps,\n context,\n schema,\n dependencyField,\n parentField,\n storeResults,\n 0 // current depth\n );\n\n return {\n original: item,\n holonId,\n lensName,\n breakdown: result,\n totalSubtasks: this._countSubtasks(result),\n maxDepth: depth,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Recursive breakdown implementation\n * @private\n */\n async _breakdownRecursive(\n item,\n holonId,\n lensName,\n maxDepth,\n stepsPerLevel,\n context,\n schema,\n dependencyField,\n parentField,\n storeResults,\n currentDepth\n ) {\n if (currentDepth >= maxDepth) {\n return {\n item,\n children: [],\n depth: currentDepth,\n };\n }\n\n // Generate subtasks for this item\n const subtasks = await this._generateSubtasks(\n item,\n context,\n schema,\n stepsPerLevel,\n dependencyField,\n parentField\n );\n\n // Store subtasks if requested\n if (storeResults && this.holosphere && subtasks.length > 0) {\n for (const subtask of subtasks) {\n try {\n await this.holosphere.write(holonId, lensName, subtask);\n } catch (err) {\n console.warn(`Failed to store subtask ${subtask.id}:`, err.message);\n }\n }\n\n // Update parent item with child references if it doesn't have them\n if (item._meta?.childTasks !== subtasks.map(s => s.id)) {\n try {\n await this.holosphere.update(holonId, lensName, item.id, {\n _meta: {\n ...item._meta,\n childTasks: subtasks.map(s => s.id),\n breakdownTimestamp: Date.now(),\n }\n });\n } catch {\n // Skip if can't update\n }\n }\n }\n\n // Recursively break down each subtask\n const children = [];\n for (const subtask of subtasks) {\n const childResult = await this._breakdownRecursive(\n subtask,\n holonId,\n lensName,\n maxDepth,\n stepsPerLevel,\n context,\n schema,\n dependencyField,\n parentField,\n storeResults,\n currentDepth + 1\n );\n children.push(childResult);\n }\n\n return {\n item,\n children,\n depth: currentDepth,\n };\n }\n\n /**\n * Generate subtasks for an item using AI\n * @private\n */\n async _generateSubtasks(item, context, schema, stepsPerLevel, dependencyField, parentField) {\n const { min, max } = stepsPerLevel;\n\n const systemPrompt = `You are a task decomposition expert. Break down the given task/quest into ${min}-${max} concrete, actionable subtasks.\n\nEach subtask should:\n1. Be a clear, specific action\n2. Be smaller and more manageable than the parent\n3. Together with siblings, fully accomplish the parent task\n4. Have a unique ID (format: parentId-1, parentId-2, etc.)\n5. Reference the parent task in the \"${parentField}\" field\n6. List any dependencies on sibling tasks in \"${dependencyField}\" array\n\n${schema ? `Follow this schema structure:\\n${JSON.stringify(schema, null, 2)}` : ''}\n\n${context.length > 0 ? `Consider these existing items for context and avoid duplication:\\n${JSON.stringify(context.slice(0, 5), null, 2)}` : ''}\n\nReturn a JSON array of subtasks. Each subtask must have:\n- id: unique identifier (parentId-1, parentId-2, etc.)\n- title/name: clear action title\n- description: what needs to be done\n- ${parentField}: reference to parent id\n- ${dependencyField}: array of sibling task ids this depends on (empty if first task)\n- status: \"pending\"\n- Any other relevant fields from the parent schema\n\nExample output format:\n[\n {\n \"id\": \"parent-1\",\n \"title\": \"First subtask\",\n \"description\": \"Details...\",\n \"${parentField}\": \"parentId\",\n \"${dependencyField}\": [],\n \"status\": \"pending\"\n },\n {\n \"id\": \"parent-2\",\n \"title\": \"Second subtask (depends on first)\",\n \"description\": \"Details...\",\n \"${parentField}\": \"parentId\",\n \"${dependencyField}\": [\"parent-1\"],\n \"status\": \"pending\"\n }\n]`;\n\n const userMessage = `Break down this task into ${min}-${max} subtasks:\n\n${JSON.stringify(item, null, 2)}`;\n\n try {\n const subtasks = await this.llm.getJSON(systemPrompt, userMessage, {\n temperature: 0.4,\n maxTokens: 2000\n });\n\n // Ensure all subtasks have proper parent reference and IDs\n return subtasks.map((subtask, index) => ({\n ...subtask,\n id: subtask.id || `${item.id}-${index + 1}`,\n [parentField]: item.id,\n [dependencyField]: subtask[dependencyField] || [],\n status: subtask.status || 'pending',\n _meta: {\n ...subtask._meta,\n generatedFrom: item.id,\n generatedAt: Date.now(),\n depth: (item._meta?.depth || 0) + 1,\n }\n }));\n } catch (error) {\n console.error('Failed to generate subtasks:', error);\n return [];\n }\n }\n\n /**\n * Count total subtasks in a breakdown tree\n * @private\n */\n _countSubtasks(node) {\n if (!node.children || node.children.length === 0) {\n return 0;\n }\n return node.children.length +\n node.children.reduce((sum, child) => sum + this._countSubtasks(child), 0);\n }\n\n /**\n * Flatten a breakdown tree into a list\n * @param {Object} breakdownResult - Result from breakdown()\n * @returns {Object[]} Flat list of all items\n */\n flatten(breakdownResult) {\n const items = [];\n\n const traverse = (node) => {\n if (node.item) {\n items.push(node.item);\n }\n if (node.children) {\n for (const child of node.children) {\n traverse(child);\n }\n }\n };\n\n if (breakdownResult.breakdown) {\n traverse(breakdownResult.breakdown);\n }\n\n return items;\n }\n\n /**\n * Get dependency order for execution\n * @param {Object} breakdownResult - Result from breakdown()\n * @returns {Object[]} Items in dependency order (parents before children)\n */\n getDependencyOrder(breakdownResult) {\n const items = this.flatten(breakdownResult);\n\n // Sort by depth (parents first) then by dependency order within same depth\n return items.sort((a, b) => {\n const depthA = a._meta?.depth || 0;\n const depthB = b._meta?.depth || 0;\n if (depthA !== depthB) return depthA - depthB;\n\n // At same depth, check if b depends on a\n const bDeps = b.dependencies || [];\n if (bDeps.includes(a.id)) return -1;\n\n const aDeps = a.dependencies || [];\n if (aDeps.includes(b.id)) return 1;\n\n return 0;\n });\n }\n\n /**\n * Suggest breakdown strategy for an item\n * @param {Object} item - Item to analyze\n * @returns {Promise<Object>} Suggested breakdown strategy\n */\n async suggestStrategy(item) {\n const systemPrompt = `You are a task decomposition expert. Analyze this task and suggest the best breakdown strategy.\n\nConsider:\n1. Task complexity\n2. Recommended depth (1-4 levels)\n3. Recommended subtasks per level (2-7)\n4. Key areas to focus on\n5. Potential dependencies between subtasks\n\nReturn JSON:\n{\n \"complexity\": \"simple|moderate|complex|very_complex\",\n \"recommendedDepth\": n,\n \"recommendedStepsPerLevel\": {\"min\": n, \"max\": n},\n \"focusAreas\": [\"area1\", \"area2\"],\n \"potentialChallenges\": [\"challenge1\"],\n \"estimatedTotalSubtasks\": n,\n \"reasoning\": \"explanation\"\n}`;\n\n return this.llm.getJSON(\n systemPrompt,\n JSON.stringify(item, null, 2),\n { temperature: 0.3 }\n );\n }\n\n /**\n * Rebalance a breakdown tree (redistribute subtasks)\n * @param {Object} breakdownResult - Existing breakdown result\n * @param {Object} options - Rebalancing options\n * @returns {Promise<Object>} Rebalanced breakdown\n */\n async rebalance(breakdownResult, options = {}) {\n const { targetStepsPerLevel = { min: 3, max: 5 } } = options;\n\n const items = this.flatten(breakdownResult);\n\n const systemPrompt = `You are a task organization expert. Rebalance these tasks to have ${targetStepsPerLevel.min}-${targetStepsPerLevel.max} items per level.\n\nCurrent tasks:\n${JSON.stringify(items, null, 2)}\n\nReorganize by:\n1. Merging tasks that are too granular\n2. Splitting tasks that are too large\n3. Maintaining proper dependency chains\n4. Keeping the same overall scope\n\nReturn JSON with the rebalanced structure:\n{\n \"tasks\": [...],\n \"changes\": [{\"type\": \"merge|split|move\", \"description\": \"...\"}],\n \"summary\": \"what changed\"\n}`;\n\n return this.llm.getJSON(systemPrompt, '', { temperature: 0.3 });\n }\n\n /**\n * Update progress on a breakdown tree\n * @param {string} holonId - Holon ID\n * @param {string} lensName - Lens name\n * @param {string} itemId - Root item ID\n * @returns {Promise<Object>} Progress summary\n */\n async getProgress(holonId, lensName, itemId) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n // Get all items\n const allItems = await this.holosphere.getAll(holonId, lensName);\n\n // Find root and all descendants\n const root = allItems.find(i => i.id === itemId);\n if (!root) {\n throw new Error(`Item ${itemId} not found`);\n }\n\n const descendants = this._findDescendants(itemId, allItems);\n\n // Calculate progress\n const total = descendants.length;\n const completed = descendants.filter(i =>\n i.status === 'completed' || i.status === 'done'\n ).length;\n const inProgress = descendants.filter(i =>\n i.status === 'in_progress' || i.status === 'active'\n ).length;\n const pending = total - completed - inProgress;\n\n return {\n itemId,\n title: root.title || root.name,\n total,\n completed,\n inProgress,\n pending,\n percentComplete: total > 0 ? Math.round((completed / total) * 100) : 0,\n blockers: this._findBlockers(descendants),\n nextUp: this._findNextTasks(descendants),\n };\n }\n\n /**\n * Find all descendants of an item\n * @private\n */\n _findDescendants(itemId, allItems, parentField = 'parent') {\n const descendants = [];\n const children = allItems.filter(i => i[parentField] === itemId);\n\n for (const child of children) {\n descendants.push(child);\n descendants.push(...this._findDescendants(child.id, allItems, parentField));\n }\n\n return descendants;\n }\n\n /**\n * Find blocked tasks\n * @private\n */\n _findBlockers(items, dependencyField = 'dependencies') {\n return items.filter(item => {\n const deps = item[dependencyField] || [];\n if (deps.length === 0) return false;\n\n // Check if any dependency is not completed\n return deps.some(depId => {\n const dep = items.find(i => i.id === depId);\n return dep && dep.status !== 'completed' && dep.status !== 'done';\n });\n }).map(item => ({\n id: item.id,\n title: item.title || item.name,\n blockedBy: item[dependencyField],\n }));\n }\n\n /**\n * Find next tasks ready to work on\n * @private\n */\n _findNextTasks(items, dependencyField = 'dependencies') {\n return items.filter(item => {\n if (item.status === 'completed' || item.status === 'done') return false;\n if (item.status === 'in_progress' || item.status === 'active') return false;\n\n const deps = item[dependencyField] || [];\n if (deps.length === 0) return true;\n\n // All dependencies must be completed\n return deps.every(depId => {\n const dep = items.find(i => i.id === depId);\n return !dep || dep.status === 'completed' || dep.status === 'done';\n });\n }).slice(0, 5).map(item => ({\n id: item.id,\n title: item.title || item.name,\n description: item.description,\n }));\n }\n}\n\nexport default TaskBreakdown;\n","/**\n * H3 AI - Geospatial intelligence for H3 hexagonal hierarchies\n */\n\nimport * as h3 from 'h3-js';\n\n/**\n * H3 AI class for geospatial intelligence\n */\nexport class H3AI {\n /**\n * @param {LLMService} llmService - LLM service instance\n * @param {Object} holosphere - HoloSphere instance\n */\n constructor(llmService, holosphere = null) {\n this.llm = llmService;\n this.holosphere = holosphere;\n }\n\n /**\n * Set HoloSphere instance\n * @param {Object} holosphere - HoloSphere instance\n */\n setHoloSphere(holosphere) {\n this.holosphere = holosphere;\n }\n\n /**\n * Suggest optimal H3 resolution for a task/project based on its scope\n * @param {Object} item - Item to analyze (task, project, quest)\n * @param {Object} options - Options\n * @returns {Promise<Object>} Resolution recommendation\n */\n async suggestResolution(item, options = {}) {\n const { currentResolution = null, context = null } = options;\n\n const systemPrompt = `You are a geospatial planning expert. Analyze this item and suggest the optimal H3 hexagonal resolution (0-15) for organizing it.\n\nH3 Resolution Guide:\n- Resolution 0-2: Continental/country scale (thousands of km)\n- Resolution 3-4: Regional/state scale (hundreds of km)\n- Resolution 5-6: Metropolitan/city scale (tens of km)\n- Resolution 7-8: District/neighborhood scale (km)\n- Resolution 9-10: Block/street scale (hundreds of meters)\n- Resolution 11-12: Building/lot scale (tens of meters)\n- Resolution 13-15: Room/precise scale (meters)\n\nConsider:\n1. Geographic scope mentioned in the item\n2. Number of potential participants/stakeholders\n3. Type of activity (local vs regional)\n4. Resource requirements and logistics\n5. Similar projects' typical scale\n\n${currentResolution !== null ? `Current resolution: ${currentResolution}` : ''}\n${context ? `Context:\\n${JSON.stringify(context, null, 2)}` : ''}\n\nReturn JSON:\n{\n \"recommendedResolution\": n,\n \"reasoning\": \"why this resolution\",\n \"alternativeResolutions\": [{\"resolution\": n, \"useCase\": \"when to use\"}],\n \"geographicScope\": \"description of area covered\",\n \"scaleSuggestions\": {\n \"expansion\": {\"resolution\": n, \"reason\": \"when to expand\"},\n \"contraction\": {\"resolution\": n, \"reason\": \"when to focus\"}\n }\n}`;\n\n return this.llm.getJSON(\n systemPrompt,\n JSON.stringify(item, null, 2),\n { temperature: 0.3 }\n );\n }\n\n /**\n * Analyze geographic distribution of data across H3 cells\n * @param {string} holonId - Parent holon to analyze\n * @param {string} lensName - Lens to analyze\n * @param {Object} options - Options\n * @returns {Promise<Object>} Distribution analysis\n */\n async analyzeDistribution(holonId, lensName, options = {}) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n const { includeChildren = true, maxChildren = 20 } = options;\n\n // Get data from the holon\n const parentData = await this.holosphere.getAll(holonId, lensName);\n\n // Get data from children if requested\n const childrenData = {};\n if (includeChildren && h3.isValidCell(holonId)) {\n const resolution = h3.getResolution(holonId);\n if (resolution < 15) {\n const children = h3.cellToChildren(holonId, resolution + 1);\n for (const child of children.slice(0, maxChildren)) {\n try {\n const data = await this.holosphere.getAll(child, lensName);\n if (data.length > 0) {\n childrenData[child] = {\n count: data.length,\n sample: data.slice(0, 3),\n };\n }\n } catch {\n // Skip unavailable children\n }\n }\n }\n }\n\n const systemPrompt = `You are a geospatial analyst. Analyze the distribution of data across this H3 hexagonal region.\n\nParent holon: ${holonId}\nResolution: ${h3.isValidCell(holonId) ? h3.getResolution(holonId) : 'N/A'}\nParent data count: ${parentData.length}\nChildren with data: ${Object.keys(childrenData).length}\n\nAnalyze:\n1. Data density and distribution patterns\n2. Geographic hotspots and cold spots\n3. Coverage gaps\n4. Clustering patterns\n5. Recommendations for better coverage\n\nReturn JSON:\n{\n \"distribution\": {\n \"pattern\": \"clustered|uniform|sparse|concentrated\",\n \"density\": \"high|medium|low\",\n \"coverage\": 0.0-1.0\n },\n \"hotspots\": [{\"holonId\": \"id\", \"reason\": \"why\"}],\n \"gaps\": [{\"description\": \"gap description\", \"suggestedAction\": \"what to do\"}],\n \"clusters\": [{\"theme\": \"cluster theme\", \"holons\": [\"id1\"]}],\n \"recommendations\": [\"rec1\"],\n \"summary\": \"overview\"\n}`;\n\n const userMessage = `Parent data sample:\n${JSON.stringify(parentData.slice(0, 10), null, 2)}\n\nChildren distribution:\n${JSON.stringify(childrenData, null, 2)}`;\n\n const analysis = await this.llm.getJSON(systemPrompt, userMessage, { temperature: 0.3 });\n\n return {\n holonId,\n lensName,\n resolution: h3.isValidCell(holonId) ? h3.getResolution(holonId) : null,\n parentDataCount: parentData.length,\n childrenAnalyzed: Object.keys(childrenData).length,\n analysis,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Find relevant data from neighboring H3 cells\n * @param {string} holonId - Center holon\n * @param {string} lensName - Lens to search\n * @param {Object} options - Options\n * @returns {Promise<Object>} Neighbor recommendations\n */\n async findNeighborRelevance(holonId, lensName, options = {}) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n if (!h3.isValidCell(holonId)) {\n throw new Error('Invalid H3 cell');\n }\n\n const { ringSize = 1, relevanceThreshold = 0.5 } = options;\n\n // Get center data\n const centerData = await this.holosphere.getAll(holonId, lensName);\n\n // Get neighbor data\n const neighbors = h3.gridDisk(holonId, ringSize).filter(n => n !== holonId);\n const neighborData = {};\n\n for (const neighbor of neighbors) {\n try {\n const data = await this.holosphere.getAll(neighbor, lensName);\n if (data.length > 0) {\n neighborData[neighbor] = data.slice(0, 5);\n }\n } catch {\n // Skip\n }\n }\n\n if (Object.keys(neighborData).length === 0) {\n return {\n holonId,\n neighbors: [],\n message: 'No data found in neighboring cells',\n };\n }\n\n const systemPrompt = `You are a geospatial relevance analyst. Find items in neighboring H3 cells that are relevant to the center cell's data.\n\nCenter cell: ${holonId}\nRing size: ${ringSize} (immediate neighbors)\n\nConsider:\n1. Thematic overlap\n2. Potential collaborations\n3. Shared resources\n4. Cross-boundary projects\n5. Geographic continuity of activities\n\nReturn JSON:\n{\n \"relevantNeighbors\": [\n {\n \"holonId\": \"neighbor_id\",\n \"relevanceScore\": 0.0-1.0,\n \"relevantItems\": [{\"id\": \"item_id\", \"reason\": \"why relevant\"}],\n \"collaborationPotential\": \"description\"\n }\n ],\n \"crossBoundaryOpportunities\": [\n {\n \"description\": \"opportunity\",\n \"involvedHolons\": [\"id1\", \"id2\"],\n \"suggestedAction\": \"what to do\"\n }\n ],\n \"geographicPatterns\": [\"pattern1\"],\n \"summary\": \"overview\"\n}`;\n\n const userMessage = `Center cell data:\n${JSON.stringify(centerData.slice(0, 10), null, 2)}\n\nNeighbor data:\n${JSON.stringify(neighborData, null, 2)}`;\n\n const analysis = await this.llm.getJSON(systemPrompt, userMessage, { temperature: 0.4 });\n\n // Filter by threshold\n if (analysis.relevantNeighbors) {\n analysis.relevantNeighbors = analysis.relevantNeighbors\n .filter(n => n.relevanceScore >= relevanceThreshold);\n }\n\n return {\n holonId,\n lensName,\n ringSize,\n neighborsAnalyzed: Object.keys(neighborData).length,\n analysis,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Suggest geographic expansion or contraction for an item\n * @param {Object} item - Item to analyze\n * @param {string} currentHolonId - Current holon\n * @param {string} lensName - Lens name\n * @param {Object} options - Options\n * @returns {Promise<Object>} Expansion/contraction suggestions\n */\n async suggestGeographicScope(item, currentHolonId, lensName, options = {}) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n if (!h3.isValidCell(currentHolonId)) {\n throw new Error('Invalid H3 cell');\n }\n\n const currentResolution = h3.getResolution(currentHolonId);\n\n // Get parent data\n let parentData = [];\n if (currentResolution > 0) {\n const parent = h3.cellToParent(currentHolonId, currentResolution - 1);\n try {\n parentData = await this.holosphere.getAll(parent, lensName);\n } catch {\n // No parent data\n }\n }\n\n // Get sample children data\n let childrenData = [];\n if (currentResolution < 15) {\n const children = h3.cellToChildren(currentHolonId, currentResolution + 1);\n for (const child of children.slice(0, 7)) {\n try {\n const data = await this.holosphere.getAll(child, lensName);\n childrenData.push(...data.slice(0, 2));\n } catch {\n // Skip\n }\n }\n }\n\n const systemPrompt = `You are a geographic scope advisor. Analyze whether this item should expand to a larger region (parent holon) or focus on smaller sub-regions (children holons).\n\nCurrent holon: ${currentHolonId}\nCurrent resolution: ${currentResolution}\n\nFactors to consider:\n1. Item's stated scope and goals\n2. Current participation/activity level\n3. Resource requirements\n4. Similar activities in parent/children\n5. Natural geographic boundaries\n\nReturn JSON:\n{\n \"currentScopeAssessment\": {\n \"appropriate\": true/false,\n \"reasoning\": \"why\"\n },\n \"expansionRecommendation\": {\n \"recommended\": true/false,\n \"targetResolution\": n,\n \"reasoning\": \"why expand\",\n \"benefits\": [\"benefit1\"],\n \"risks\": [\"risk1\"]\n },\n \"contractionRecommendation\": {\n \"recommended\": true/false,\n \"targetResolution\": n,\n \"reasoning\": \"why contract\",\n \"suggestedFocusAreas\": [\"description\"],\n \"benefits\": [\"benefit1\"],\n \"risks\": [\"risk1\"]\n },\n \"optimalAction\": \"expand|contract|maintain\",\n \"summary\": \"recommendation summary\"\n}`;\n\n const userMessage = `Item to analyze:\n${JSON.stringify(item, null, 2)}\n\nParent region data (${parentData.length} items):\n${JSON.stringify(parentData.slice(0, 5), null, 2)}\n\nChildren regions data (${childrenData.length} items):\n${JSON.stringify(childrenData.slice(0, 5), null, 2)}`;\n\n return this.llm.getJSON(systemPrompt, userMessage, { temperature: 0.3 });\n }\n\n /**\n * Analyze coverage gaps in a region\n * @param {string} holonId - Region to analyze\n * @param {string} lensName - Lens\n * @param {Object} options - Options\n * @returns {Promise<Object>} Coverage analysis\n */\n async analyzeCoverage(holonId, lensName, options = {}) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n if (!h3.isValidCell(holonId)) {\n throw new Error('Invalid H3 cell');\n }\n\n const { targetResolution = null } = options;\n const currentResolution = h3.getResolution(holonId);\n const childResolution = targetResolution || Math.min(currentResolution + 1, 15);\n\n // Get all children at target resolution\n const children = h3.cellToChildren(holonId, childResolution);\n\n // Check which children have data\n const coverage = {\n total: children.length,\n withData: 0,\n withoutData: 0,\n dataDistribution: {},\n };\n\n const childrenWithData = [];\n const childrenWithoutData = [];\n\n for (const child of children) {\n try {\n const data = await this.holosphere.getAll(child, lensName);\n if (data.length > 0) {\n coverage.withData++;\n coverage.dataDistribution[child] = data.length;\n childrenWithData.push({ holon: child, count: data.length });\n } else {\n coverage.withoutData++;\n childrenWithoutData.push(child);\n }\n } catch {\n coverage.withoutData++;\n childrenWithoutData.push(child);\n }\n }\n\n const systemPrompt = `You are a geographic coverage analyst. Analyze the data coverage in this H3 region.\n\nRegion: ${holonId}\nResolution: ${currentResolution}\nChild resolution analyzed: ${childResolution}\nTotal children: ${coverage.total}\nChildren with data: ${coverage.withData}\nChildren without data: ${coverage.withoutData}\nCoverage ratio: ${(coverage.withData / coverage.total * 100).toFixed(1)}%\n\nAnalyze:\n1. Coverage patterns\n2. Potential reasons for gaps\n3. Priority areas for expansion\n4. Whether gaps are concerning or expected\n\nReturn JSON:\n{\n \"coverageScore\": 0.0-1.0,\n \"coverageQuality\": \"excellent|good|moderate|poor|minimal\",\n \"patterns\": {\n \"type\": \"clustered|scattered|peripheral|central|uniform\",\n \"description\": \"pattern description\"\n },\n \"gaps\": {\n \"count\": n,\n \"significance\": \"high|medium|low\",\n \"likelyReasons\": [\"reason1\"],\n \"priorityAreas\": [\"description of areas to focus\"]\n },\n \"recommendations\": [\n {\n \"action\": \"what to do\",\n \"priority\": \"high|medium|low\",\n \"targetArea\": \"description\"\n }\n ],\n \"summary\": \"overview\"\n}`;\n\n const analysis = await this.llm.getJSON(systemPrompt, '', { temperature: 0.3 });\n\n return {\n holonId,\n lensName,\n resolution: currentResolution,\n childResolution,\n coverage: {\n ...coverage,\n ratio: coverage.withData / coverage.total,\n },\n childrenWithData: childrenWithData.slice(0, 10),\n gapCount: childrenWithoutData.length,\n analysis,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Find patterns across multiple H3 resolutions\n * @param {string} holonId - Starting holon\n * @param {string} lensName - Lens\n * @param {Object} options - Options\n * @returns {Promise<Object>} Cross-resolution insights\n */\n async crossResolutionInsights(holonId, lensName, options = {}) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n if (!h3.isValidCell(holonId)) {\n throw new Error('Invalid H3 cell');\n }\n\n const { levels = 3 } = options;\n const currentResolution = h3.getResolution(holonId);\n\n // Collect data at multiple resolutions\n const resolutionData = {};\n\n // Current level\n const currentData = await this.holosphere.getAll(holonId, lensName);\n resolutionData[currentResolution] = {\n holon: holonId,\n count: currentData.length,\n sample: currentData.slice(0, 5),\n };\n\n // Parent levels\n let parentHolon = holonId;\n for (let i = 0; i < levels && h3.getResolution(parentHolon) > 0; i++) {\n const res = h3.getResolution(parentHolon) - 1;\n parentHolon = h3.cellToParent(parentHolon, res);\n try {\n const data = await this.holosphere.getAll(parentHolon, lensName);\n resolutionData[res] = {\n holon: parentHolon,\n count: data.length,\n sample: data.slice(0, 5),\n };\n } catch {\n // Skip\n }\n }\n\n // Child level (one level down)\n if (currentResolution < 15) {\n const childRes = currentResolution + 1;\n const children = h3.cellToChildren(holonId, childRes);\n let childTotal = 0;\n const childSamples = [];\n\n for (const child of children.slice(0, 7)) {\n try {\n const data = await this.holosphere.getAll(child, lensName);\n childTotal += data.length;\n if (data.length > 0) {\n childSamples.push(...data.slice(0, 2));\n }\n } catch {\n // Skip\n }\n }\n\n resolutionData[childRes] = {\n holon: `${children.length} children`,\n count: childTotal,\n sample: childSamples.slice(0, 5),\n };\n }\n\n const systemPrompt = `You are a multi-scale geographic analyst. Find patterns that emerge across different H3 resolutions.\n\nStarting holon: ${holonId}\nResolutions analyzed: ${Object.keys(resolutionData).sort().join(', ')}\n\nData at each resolution:\n${JSON.stringify(resolutionData, null, 2)}\n\nAnalyze:\n1. How themes evolve across scales\n2. What appears only at certain resolutions\n3. Aggregation patterns (local vs regional)\n4. Scale-dependent opportunities\n5. Optimal resolution for different activities\n\nReturn JSON:\n{\n \"scalePatterns\": [\n {\n \"pattern\": \"description\",\n \"visibleAt\": [resolution_numbers],\n \"significance\": \"why this matters\"\n }\n ],\n \"themeEvolution\": {\n \"localThemes\": [\"themes at fine resolution\"],\n \"regionalThemes\": [\"themes at coarse resolution\"],\n \"consistentThemes\": [\"themes across all scales\"]\n },\n \"optimalResolutions\": {\n \"forCollaboration\": n,\n \"forResources\": n,\n \"forCommunity\": n,\n \"reasoning\": \"why\"\n },\n \"insights\": [\"insight1\"],\n \"recommendations\": [\"rec1\"],\n \"summary\": \"overview\"\n}`;\n\n return this.llm.getJSON(systemPrompt, '', { temperature: 0.4 });\n }\n\n /**\n * Suggest item migration between holons based on geographic fit\n * @param {Object} item - Item to analyze\n * @param {string} currentHolonId - Current location\n * @param {string} lensName - Lens\n * @param {Object} options - Options\n * @returns {Promise<Object>} Migration suggestions\n */\n async suggestMigration(item, currentHolonId, lensName, options = {}) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n if (!h3.isValidCell(currentHolonId)) {\n throw new Error('Invalid H3 cell');\n }\n\n const { searchRadius = 2 } = options;\n\n // Get data from nearby cells\n const nearby = h3.gridDisk(currentHolonId, searchRadius);\n const nearbyData = {};\n\n for (const cell of nearby) {\n if (cell === currentHolonId) continue;\n try {\n const data = await this.holosphere.getAll(cell, lensName);\n if (data.length > 0) {\n nearbyData[cell] = {\n count: data.length,\n sample: data.slice(0, 3),\n };\n }\n } catch {\n // Skip\n }\n }\n\n // Also check parent\n const currentRes = h3.getResolution(currentHolonId);\n let parentData = null;\n if (currentRes > 0) {\n const parent = h3.cellToParent(currentHolonId, currentRes - 1);\n try {\n const data = await this.holosphere.getAll(parent, lensName);\n parentData = { holon: parent, count: data.length, sample: data.slice(0, 3) };\n } catch {\n // Skip\n }\n }\n\n const systemPrompt = `You are a geographic placement advisor. Determine if this item would be better suited in a different H3 cell.\n\nCurrent location: ${currentHolonId}\nCurrent resolution: ${currentRes}\n\nConsider:\n1. Thematic fit with existing data in each cell\n2. Geographic scope of the item\n3. Collaboration opportunities\n4. Resource proximity\n5. Community alignment\n\nReturn JSON:\n{\n \"currentFit\": {\n \"score\": 0.0-1.0,\n \"reasoning\": \"why current location is/isn't appropriate\"\n },\n \"migrationRecommended\": true/false,\n \"suggestedDestinations\": [\n {\n \"holonId\": \"cell_id\",\n \"fitScore\": 0.0-1.0,\n \"reasoning\": \"why this location\",\n \"benefits\": [\"benefit1\"],\n \"drawbacks\": [\"drawback1\"]\n }\n ],\n \"stayReasons\": [\"reason to stay if applicable\"],\n \"moveReasons\": [\"reason to move if applicable\"],\n \"recommendation\": \"stay|move|duplicate\",\n \"summary\": \"final recommendation\"\n}`;\n\n const userMessage = `Item to place:\n${JSON.stringify(item, null, 2)}\n\nNearby cells with data:\n${JSON.stringify(nearbyData, null, 2)}\n\n${parentData ? `Parent cell data:\\n${JSON.stringify(parentData, null, 2)}` : ''}`;\n\n return this.llm.getJSON(systemPrompt, userMessage, { temperature: 0.3 });\n }\n\n /**\n * Generate a geographic activity report for a region\n * @param {string} holonId - Region to report on\n * @param {Object} options - Options\n * @returns {Promise<Object>} Geographic report\n */\n async generateGeographicReport(holonId, options = {}) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n const { lenses = ['projects', 'quests', 'events', 'resources', 'default'] } = options;\n\n // Collect data from all lenses\n const lensData = {};\n for (const lens of lenses) {\n try {\n const data = await this.holosphere.getAll(holonId, lens);\n if (data.length > 0) {\n lensData[lens] = {\n count: data.length,\n sample: data.slice(0, 5),\n };\n }\n } catch {\n // Skip\n }\n }\n\n // Get geographic context\n let geoContext = {};\n if (h3.isValidCell(holonId)) {\n const res = h3.getResolution(holonId);\n const [lat, lng] = h3.cellToLatLng(holonId);\n const boundary = h3.cellToBoundary(holonId);\n const area = h3.cellArea(holonId, 'km2');\n\n geoContext = {\n resolution: res,\n center: { lat, lng },\n areaKm2: area,\n vertexCount: boundary.length,\n };\n }\n\n const systemPrompt = `You are a regional activity reporter. Generate a comprehensive report on geographic activity in this H3 region.\n\nRegion: ${holonId}\nGeographic context: ${JSON.stringify(geoContext, null, 2)}\nData available in ${Object.keys(lensData).length} categories\n\nGenerate a report covering:\n1. Executive summary\n2. Activity overview by category\n3. Key highlights and achievements\n4. Geographic patterns\n5. Opportunities and challenges\n6. Recommendations\n\nReturn JSON:\n{\n \"title\": \"Region Report Title\",\n \"executiveSummary\": \"2-3 sentence overview\",\n \"activityOverview\": {\n \"totalItems\": n,\n \"categorySummaries\": {\"lens\": \"summary\"}\n },\n \"highlights\": [\n {\"title\": \"highlight\", \"description\": \"details\", \"category\": \"lens\"}\n ],\n \"geographicPatterns\": [\"pattern1\"],\n \"strengths\": [\"strength1\"],\n \"challenges\": [\"challenge1\"],\n \"opportunities\": [\"opportunity1\"],\n \"recommendations\": [\n {\"priority\": \"high|medium|low\", \"action\": \"what to do\", \"rationale\": \"why\"}\n ],\n \"metrics\": {\n \"activityLevel\": \"high|medium|low\",\n \"diversity\": \"high|medium|low\",\n \"growth\": \"growing|stable|declining\"\n }\n}`;\n\n const report = await this.llm.getJSON(\n systemPrompt,\n JSON.stringify(lensData, null, 2),\n { temperature: 0.4, maxTokens: 2000 }\n );\n\n return {\n holonId,\n geoContext,\n lensesAnalyzed: Object.keys(lensData),\n totalItems: Object.values(lensData).reduce((sum, l) => sum + l.count, 0),\n report,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Find geographic clusters of related items\n * @param {string} holonId - Region to analyze\n * @param {string} lensName - Lens\n * @param {Object} options - Options\n * @returns {Promise<Object>} Geographic clusters\n */\n async findGeographicClusters(holonId, lensName, options = {}) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n if (!h3.isValidCell(holonId)) {\n throw new Error('Invalid H3 cell');\n }\n\n const { clusterResolution = null } = options;\n const currentRes = h3.getResolution(holonId);\n const targetRes = clusterResolution || Math.min(currentRes + 1, 15);\n\n // Get data from children at cluster resolution\n const children = h3.cellToChildren(holonId, targetRes);\n const cellData = {};\n\n for (const child of children) {\n try {\n const data = await this.holosphere.getAll(child, lensName);\n if (data.length > 0) {\n cellData[child] = data;\n }\n } catch {\n // Skip\n }\n }\n\n if (Object.keys(cellData).length < 2) {\n return {\n holonId,\n clusters: [],\n message: 'Not enough data for clustering',\n };\n }\n\n const systemPrompt = `You are a geographic clustering expert. Find thematic clusters in this spatial data.\n\nRegion: ${holonId}\nResolution analyzed: ${targetRes}\nCells with data: ${Object.keys(cellData).length}\n\nIdentify:\n1. Thematic clusters (cells with similar content)\n2. Activity clusters (cells with related activities)\n3. Isolated cells (unique content)\n4. Potential connections between clusters\n\nReturn JSON:\n{\n \"clusters\": [\n {\n \"name\": \"cluster name\",\n \"theme\": \"what unifies this cluster\",\n \"cells\": [\"cell_id1\", \"cell_id2\"],\n \"strength\": 0.0-1.0,\n \"characteristics\": [\"char1\"]\n }\n ],\n \"isolatedCells\": [\n {\"cellId\": \"id\", \"uniqueAspect\": \"what makes it unique\"}\n ],\n \"interClusterConnections\": [\n {\"cluster1\": \"name\", \"cluster2\": \"name\", \"connection\": \"how related\"}\n ],\n \"spatialPatterns\": [\"pattern1\"],\n \"recommendations\": [\"rec1\"]\n}`;\n\n const analysis = await this.llm.getJSON(\n systemPrompt,\n JSON.stringify(cellData, null, 2),\n { temperature: 0.4 }\n );\n\n return {\n holonId,\n lensName,\n clusterResolution: targetRes,\n cellsAnalyzed: Object.keys(cellData).length,\n analysis,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Calculate and explain geographic impact of an item\n * @param {Object} item - Item to analyze\n * @param {string} holonId - Item's holon\n * @param {string} lensName - Lens\n * @param {Object} options - Options\n * @returns {Promise<Object>} Impact analysis\n */\n async analyzeGeographicImpact(item, holonId, lensName, options = {}) {\n if (!h3.isValidCell(holonId)) {\n throw new Error('Invalid H3 cell');\n }\n\n const res = h3.getResolution(holonId);\n const [lat, lng] = h3.cellToLatLng(holonId);\n const area = h3.cellArea(holonId, 'km2');\n\n // Get parent info for context\n let parentContext = null;\n if (res > 0) {\n const parent = h3.cellToParent(holonId, Math.max(0, res - 2));\n const parentArea = h3.cellArea(parent, 'km2');\n parentContext = {\n holon: parent,\n resolution: res - 2,\n areaKm2: parentArea,\n };\n }\n\n const systemPrompt = `You are a geographic impact analyst. Analyze the geographic reach and impact of this item.\n\nItem location: ${holonId}\nResolution: ${res}\nCenter: ${lat.toFixed(4)}, ${lng.toFixed(4)}\nArea: ${area.toFixed(2)} km²\n\n${parentContext ? `Broader region: ${parentContext.areaKm2.toFixed(2)} km²` : ''}\n\nAnalyze:\n1. Direct impact area (immediate cell)\n2. Indirect impact area (spillover effects)\n3. Potential reach (if expanded)\n4. Geographic barriers/enablers\n5. Network effects\n\nReturn JSON:\n{\n \"directImpact\": {\n \"areaKm2\": n,\n \"description\": \"direct impact area\",\n \"affectedPopulation\": \"estimate or N/A\"\n },\n \"indirectImpact\": {\n \"estimatedReach\": n,\n \"mechanisms\": [\"how impact spreads\"],\n \"neighboringAreas\": [\"affected areas\"]\n },\n \"potentialReach\": {\n \"ifExpanded\": {\n \"maxAreaKm2\": n,\n \"optimalResolution\": n,\n \"limitingFactors\": [\"factor1\"]\n }\n },\n \"geographicFactors\": {\n \"enablers\": [\"what helps geographic spread\"],\n \"barriers\": [\"what limits spread\"]\n },\n \"impactScore\": {\n \"local\": 0.0-1.0,\n \"regional\": 0.0-1.0,\n \"network\": 0.0-1.0\n },\n \"recommendations\": [\"how to increase impact\"],\n \"summary\": \"impact overview\"\n}`;\n\n return this.llm.getJSON(\n systemPrompt,\n JSON.stringify(item, null, 2),\n { temperature: 0.3 }\n );\n }\n}\n\nexport default H3AI;\n","/**\n * Multi-chain network configurations for Holosphere contracts\n * Supports Ethereum, Polygon, Arbitrum, Base, Optimism and testnets\n */\n\nexport const NETWORKS = {\n // ========== MAINNETS ==========\n ethereum: {\n name: 'Ethereum Mainnet',\n chainId: 1,\n rpc: 'https://eth.llamarpc.com',\n explorer: 'https://etherscan.io',\n currency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n type: 'mainnet'\n },\n polygon: {\n name: 'Polygon Mainnet',\n chainId: 137,\n rpc: 'https://polygon-rpc.com',\n explorer: 'https://polygonscan.com',\n currency: { name: 'MATIC', symbol: 'MATIC', decimals: 18 },\n type: 'mainnet'\n },\n arbitrum: {\n name: 'Arbitrum One',\n chainId: 42161,\n rpc: 'https://arb1.arbitrum.io/rpc',\n explorer: 'https://arbiscan.io',\n currency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n type: 'mainnet'\n },\n base: {\n name: 'Base',\n chainId: 8453,\n rpc: 'https://mainnet.base.org',\n explorer: 'https://basescan.org',\n currency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n type: 'mainnet'\n },\n optimism: {\n name: 'Optimism',\n chainId: 10,\n rpc: 'https://mainnet.optimism.io',\n explorer: 'https://optimistic.etherscan.io',\n currency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n type: 'mainnet'\n },\n avalanche: {\n name: 'Avalanche C-Chain',\n chainId: 43114,\n rpc: 'https://api.avax.network/ext/bc/C/rpc',\n explorer: 'https://snowtrace.io',\n currency: { name: 'AVAX', symbol: 'AVAX', decimals: 18 },\n type: 'mainnet'\n },\n bsc: {\n name: 'BNB Smart Chain',\n chainId: 56,\n rpc: 'https://bsc-dataseed.binance.org',\n explorer: 'https://bscscan.com',\n currency: { name: 'BNB', symbol: 'BNB', decimals: 18 },\n type: 'mainnet'\n },\n\n // ========== TESTNETS ==========\n sepolia: {\n name: 'Sepolia',\n chainId: 11155111,\n rpc: 'https://rpc.sepolia.org',\n explorer: 'https://sepolia.etherscan.io',\n currency: { name: 'Sepolia ETH', symbol: 'ETH', decimals: 18 },\n type: 'testnet',\n faucet: 'https://sepoliafaucet.com'\n },\n goerli: {\n name: 'Goerli',\n chainId: 5,\n rpc: 'https://rpc.goerli.eth.gateway.fm',\n explorer: 'https://goerli.etherscan.io',\n currency: { name: 'Goerli ETH', symbol: 'ETH', decimals: 18 },\n type: 'testnet',\n faucet: 'https://goerlifaucet.com'\n },\n mumbai: {\n name: 'Polygon Mumbai',\n chainId: 80001,\n rpc: 'https://rpc-mumbai.maticvigil.com',\n explorer: 'https://mumbai.polygonscan.com',\n currency: { name: 'MATIC', symbol: 'MATIC', decimals: 18 },\n type: 'testnet',\n faucet: 'https://faucet.polygon.technology'\n },\n amoy: {\n name: 'Polygon Amoy',\n chainId: 80002,\n rpc: 'https://rpc-amoy.polygon.technology',\n explorer: 'https://amoy.polygonscan.com',\n currency: { name: 'MATIC', symbol: 'MATIC', decimals: 18 },\n type: 'testnet',\n faucet: 'https://faucet.polygon.technology'\n },\n arbitrumSepolia: {\n name: 'Arbitrum Sepolia',\n chainId: 421614,\n rpc: 'https://sepolia-rollup.arbitrum.io/rpc',\n explorer: 'https://sepolia.arbiscan.io',\n currency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n type: 'testnet'\n },\n baseSepolia: {\n name: 'Base Sepolia',\n chainId: 84532,\n rpc: 'https://sepolia.base.org',\n explorer: 'https://sepolia.basescan.org',\n currency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n type: 'testnet'\n },\n optimismSepolia: {\n name: 'Optimism Sepolia',\n chainId: 11155420,\n rpc: 'https://sepolia.optimism.io',\n explorer: 'https://sepolia-optimism.etherscan.io',\n currency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n type: 'testnet'\n },\n\n // ========== LOCAL ==========\n hardhat: {\n name: 'Hardhat Local',\n chainId: 31337,\n rpc: 'http://127.0.0.1:8545',\n explorer: null,\n currency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n type: 'local'\n },\n anvil: {\n name: 'Anvil Local',\n chainId: 31337,\n rpc: 'http://127.0.0.1:8545',\n explorer: null,\n currency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n type: 'local'\n },\n ganache: {\n name: 'Ganache Local',\n chainId: 1337,\n rpc: 'http://127.0.0.1:7545',\n explorer: null,\n currency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n type: 'local'\n }\n};\n\n/**\n * Get network configuration by name or chain ID\n * @param {string|number} networkOrChainId - Network name or chain ID\n * @returns {Object|null} Network configuration or null if not found\n */\nexport function getNetwork(networkOrChainId) {\n if (typeof networkOrChainId === 'string') {\n return NETWORKS[networkOrChainId] || null;\n }\n // Search by chain ID\n for (const [name, config] of Object.entries(NETWORKS)) {\n if (config.chainId === networkOrChainId) {\n return { ...config, key: name };\n }\n }\n return null;\n}\n\n/**\n * Get all networks of a specific type\n * @param {'mainnet'|'testnet'|'local'} type - Network type\n * @returns {Object} Networks of the specified type\n */\nexport function getNetworksByType(type) {\n return Object.fromEntries(\n Object.entries(NETWORKS).filter(([_, config]) => config.type === type)\n );\n}\n\n/**\n * List all available network names\n * @returns {string[]} Array of network names\n */\nexport function listNetworks() {\n return Object.keys(NETWORKS);\n}\n\n/**\n * Check if a network is supported\n * @param {string} network - Network name\n * @returns {boolean}\n */\nexport function isNetworkSupported(network) {\n return network in NETWORKS;\n}\n\n/**\n * Get explorer URL for a transaction\n * @param {string} network - Network name\n * @param {string} txHash - Transaction hash\n * @returns {string|null} Explorer URL or null\n */\nexport function getTxUrl(network, txHash) {\n const config = NETWORKS[network];\n if (!config?.explorer) return null;\n return `${config.explorer}/tx/${txHash}`;\n}\n\n/**\n * Get explorer URL for an address\n * @param {string} network - Network name\n * @param {string} address - Contract or wallet address\n * @returns {string|null} Explorer URL or null\n */\nexport function getAddressUrl(network, address) {\n const config = NETWORKS[network];\n if (!config?.explorer) return null;\n return `${config.explorer}/address/${address}`;\n}\n\nexport default NETWORKS;\n","/**\n * ChainManager - Multi-chain connection management for Holosphere contracts\n * Handles provider/signer setup, network switching, and wallet management\n */\n\nimport { NETWORKS, getNetwork, isNetworkSupported } from './networks.js';\n\nexport class ChainManager {\n constructor(config = {}) {\n this.config = config;\n this.provider = null;\n this.signer = null;\n this.network = null;\n this.networkName = null;\n this.ethers = null;\n this._initialized = false;\n }\n\n /**\n * Initialize ethers.js (lazy load)\n * @private\n */\n async _loadEthers() {\n if (!this.ethers) {\n // Dynamic import for ethers\n const ethersModule = await import('ethers');\n this.ethers = ethersModule;\n }\n return this.ethers;\n }\n\n /**\n * Connect to a network\n * @param {string} networkName - Network name (e.g., 'sepolia', 'polygon')\n * @param {string} [privateKey] - Private key for signing transactions\n * @param {string} [rpcUrl] - Custom RPC URL (overrides default)\n * @returns {Promise<{provider, signer, network}>}\n */\n async connect(networkName, privateKey, rpcUrl) {\n const ethers = await this._loadEthers();\n\n if (!isNetworkSupported(networkName) && !rpcUrl) {\n throw new Error(`Unsupported network: ${networkName}. Use a custom rpcUrl or choose from: ${Object.keys(NETWORKS).join(', ')}`);\n }\n\n const networkConfig = getNetwork(networkName) || { chainId: 0, name: networkName };\n const url = rpcUrl || networkConfig.rpc;\n\n // Create provider\n this.provider = new ethers.JsonRpcProvider(url, {\n chainId: networkConfig.chainId,\n name: networkConfig.name\n });\n\n // Wait for provider to be ready\n await this.provider.ready;\n\n // Get actual network info\n this.network = await this.provider.getNetwork();\n this.networkName = networkName;\n\n // Create signer if private key provided\n if (privateKey) {\n // Remove 0x prefix if present\n const cleanKey = privateKey.startsWith('0x') ? privateKey : `0x${privateKey}`;\n this.signer = new ethers.Wallet(cleanKey, this.provider);\n }\n\n this._initialized = true;\n\n return {\n provider: this.provider,\n signer: this.signer,\n network: this.network,\n networkName: this.networkName,\n config: networkConfig\n };\n }\n\n /**\n * Connect using browser wallet (MetaMask, etc.)\n * @param {string} [networkName] - Optionally switch to this network\n * @returns {Promise<{provider, signer, network, address}>}\n */\n async connectBrowser(networkName) {\n const ethers = await this._loadEthers();\n\n if (typeof window === 'undefined' || !window.ethereum) {\n throw new Error('No browser wallet detected. Please install MetaMask or another Web3 wallet.');\n }\n\n // Request account access\n await window.ethereum.request({ method: 'eth_requestAccounts' });\n\n // Create provider from browser\n this.provider = new ethers.BrowserProvider(window.ethereum);\n this.signer = await this.provider.getSigner();\n this.network = await this.provider.getNetwork();\n\n // Switch network if requested\n if (networkName && isNetworkSupported(networkName)) {\n const targetConfig = getNetwork(networkName);\n if (this.network.chainId !== BigInt(targetConfig.chainId)) {\n await this.switchNetwork(networkName);\n }\n }\n\n const address = await this.signer.getAddress();\n this._initialized = true;\n\n return {\n provider: this.provider,\n signer: this.signer,\n network: this.network,\n address\n };\n }\n\n /**\n * Switch to a different network (browser wallet only)\n * @param {string} networkName - Target network name\n */\n async switchNetwork(networkName) {\n if (typeof window === 'undefined' || !window.ethereum) {\n throw new Error('Network switching requires a browser wallet');\n }\n\n const config = getNetwork(networkName);\n if (!config) {\n throw new Error(`Unknown network: ${networkName}`);\n }\n\n const chainIdHex = '0x' + config.chainId.toString(16);\n\n try {\n // Try to switch to the network\n await window.ethereum.request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: chainIdHex }]\n });\n } catch (switchError) {\n // If the network doesn't exist, add it\n if (switchError.code === 4902) {\n await window.ethereum.request({\n method: 'wallet_addEthereumChain',\n params: [{\n chainId: chainIdHex,\n chainName: config.name,\n nativeCurrency: config.currency,\n rpcUrls: [config.rpc],\n blockExplorerUrls: config.explorer ? [config.explorer] : []\n }]\n });\n } else {\n throw switchError;\n }\n }\n\n // Refresh provider/signer after network switch\n const ethers = await this._loadEthers();\n this.provider = new ethers.BrowserProvider(window.ethereum);\n this.signer = await this.provider.getSigner();\n this.network = await this.provider.getNetwork();\n this.networkName = networkName;\n }\n\n /**\n * Get the current provider\n * @returns {Provider}\n */\n getProvider() {\n this._requireInitialized();\n return this.provider;\n }\n\n /**\n * Get the current signer\n * @returns {Signer}\n */\n getSigner() {\n this._requireInitialized();\n if (!this.signer) {\n throw new Error('No signer available. Connect with a private key or use connectBrowser().');\n }\n return this.signer;\n }\n\n /**\n * Get the connected address\n * @returns {Promise<string>}\n */\n async getAddress() {\n const signer = this.getSigner();\n return signer.getAddress();\n }\n\n /**\n * Get ETH balance of an address\n * @param {string} [address] - Address to check (defaults to signer)\n * @returns {Promise<string>} Balance in ETH\n */\n async getBalance(address) {\n this._requireInitialized();\n const ethers = await this._loadEthers();\n const addr = address || (this.signer ? await this.signer.getAddress() : null);\n if (!addr) {\n throw new Error('No address provided and no signer available');\n }\n const balance = await this.provider.getBalance(addr);\n return ethers.formatEther(balance);\n }\n\n /**\n * Get current network configuration\n * @returns {Object}\n */\n getNetworkConfig() {\n this._requireInitialized();\n return getNetwork(this.networkName);\n }\n\n /**\n * Get current chain ID\n * @returns {number}\n */\n getChainId() {\n this._requireInitialized();\n return Number(this.network.chainId);\n }\n\n /**\n * Check if connected to the expected network\n * @param {string} expectedNetwork - Expected network name\n * @returns {boolean}\n */\n isOnNetwork(expectedNetwork) {\n if (!this._initialized) return false;\n const expected = getNetwork(expectedNetwork);\n if (!expected) return false;\n return this.getChainId() === expected.chainId;\n }\n\n /**\n * Create a contract instance\n * @param {string} address - Contract address\n * @param {Array} abi - Contract ABI\n * @param {boolean} [useSigner=true] - Use signer for write operations\n * @returns {Contract}\n */\n async getContract(address, abi, useSigner = true) {\n this._requireInitialized();\n const ethers = await this._loadEthers();\n const signerOrProvider = useSigner && this.signer ? this.signer : this.provider;\n return new ethers.Contract(address, abi, signerOrProvider);\n }\n\n /**\n * Deploy a contract\n * @param {Array} abi - Contract ABI\n * @param {string} bytecode - Contract bytecode\n * @param {Array} [constructorArgs=[]] - Constructor arguments\n * @returns {Promise<{contract, address, deployTx}>}\n */\n async deployContract(abi, bytecode, constructorArgs = []) {\n this._requireInitialized();\n if (!this.signer) {\n throw new Error('Signer required for contract deployment');\n }\n\n const ethers = await this._loadEthers();\n const factory = new ethers.ContractFactory(abi, bytecode, this.signer);\n const contract = await factory.deploy(...constructorArgs);\n\n // Wait for deployment\n await contract.waitForDeployment();\n const address = await contract.getAddress();\n const deployTx = contract.deploymentTransaction();\n\n return {\n contract,\n address,\n deployTx,\n txHash: deployTx?.hash\n };\n }\n\n /**\n * Wait for a transaction to be mined\n * @param {string} txHash - Transaction hash\n * @param {number} [confirmations=1] - Number of confirmations to wait for\n * @returns {Promise<TransactionReceipt>}\n */\n async waitForTransaction(txHash, confirmations = 1) {\n this._requireInitialized();\n return this.provider.waitForTransaction(txHash, confirmations);\n }\n\n /**\n * Estimate gas for a transaction\n * @param {Object} tx - Transaction object\n * @returns {Promise<bigint>}\n */\n async estimateGas(tx) {\n this._requireInitialized();\n return this.provider.estimateGas(tx);\n }\n\n /**\n * Get current gas price\n * @returns {Promise<{gasPrice: string, maxFeePerGas: string, maxPriorityFeePerGas: string}>}\n */\n async getGasPrice() {\n this._requireInitialized();\n const ethers = await this._loadEthers();\n const feeData = await this.provider.getFeeData();\n return {\n gasPrice: feeData.gasPrice ? ethers.formatUnits(feeData.gasPrice, 'gwei') : null,\n maxFeePerGas: feeData.maxFeePerGas ? ethers.formatUnits(feeData.maxFeePerGas, 'gwei') : null,\n maxPriorityFeePerGas: feeData.maxPriorityFeePerGas ? ethers.formatUnits(feeData.maxPriorityFeePerGas, 'gwei') : null\n };\n }\n\n /**\n * Parse units (e.g., ETH to wei)\n * @param {string|number} value - Value to parse\n * @param {string|number} [unit='ether'] - Unit name or decimals\n * @returns {bigint}\n */\n async parseUnits(value, unit = 'ether') {\n const ethers = await this._loadEthers();\n return ethers.parseUnits(value.toString(), unit);\n }\n\n /**\n * Format units (e.g., wei to ETH)\n * @param {bigint|string} value - Value to format\n * @param {string|number} [unit='ether'] - Unit name or decimals\n * @returns {string}\n */\n async formatUnits(value, unit = 'ether') {\n const ethers = await this._loadEthers();\n return ethers.formatUnits(value, unit);\n }\n\n /**\n * Check if manager is initialized\n * @private\n */\n _requireInitialized() {\n if (!this._initialized) {\n throw new Error('ChainManager not initialized. Call connect() or connectBrowser() first.');\n }\n }\n\n /**\n * Check if connected\n * @returns {boolean}\n */\n isConnected() {\n return this._initialized && this.provider !== null;\n }\n\n /**\n * Disconnect and clean up\n */\n disconnect() {\n this.provider = null;\n this.signer = null;\n this.network = null;\n this.networkName = null;\n this._initialized = false;\n }\n}\n\nexport default ChainManager;\n","/**\n * ContractDeployer - 1-Click deployment for Holosphere smart contracts\n * Deploys all factories, registry, and individual holon contracts\n */\n\n// Import ABIs\nimport SplitterABI from './abis/Splitter.json' with { type: 'json' };\nimport ManagedABI from './abis/Managed.json' with { type: 'json' };\nimport ZonedABI from './abis/Zoned.json' with { type: 'json' };\nimport AppreciativeABI from './abis/Appreciative.json' with { type: 'json' };\nimport BundleABI from './abis/Bundle.json' with { type: 'json' };\nimport HolonsABI from './abis/Holons.json' with { type: 'json' };\nimport SplitterFactoryABI from './abis/SplitterFactory.json' with { type: 'json' };\nimport ManagedFactoryABI from './abis/ManagedFactory.json' with { type: 'json' };\nimport ZonedFactoryABI from './abis/ZonedFactory.json' with { type: 'json' };\nimport AppreciativeFactoryABI from './abis/AppreciativeFactory.json' with { type: 'json' };\nimport BundleFactoryABI from './abis/BundleFactory.json' with { type: 'json' };\nimport TestTokenABI from './abis/TestToken.json' with { type: 'json' };\n\nimport { getTxUrl, getAddressUrl } from './networks.js';\n\n// Export ABIs for external use\nexport const ABIs = {\n Splitter: SplitterABI,\n Managed: ManagedABI,\n Zoned: ZonedABI,\n Appreciative: AppreciativeABI,\n Bundle: BundleABI,\n Holons: HolonsABI,\n SplitterFactory: SplitterFactoryABI,\n ManagedFactory: ManagedFactoryABI,\n ZonedFactory: ZonedFactoryABI,\n AppreciativeFactory: AppreciativeFactoryABI,\n BundleFactory: BundleFactoryABI,\n TestToken: TestTokenABI\n};\n\nexport class ContractDeployer {\n constructor(chainManager) {\n this.chainManager = chainManager;\n this.deployedContracts = {};\n this.ethers = null;\n }\n\n /**\n * Load ethers from chain manager\n * @private\n */\n async _loadEthers() {\n if (!this.ethers) {\n this.ethers = await import('ethers');\n }\n return this.ethers;\n }\n\n /**\n * 1-CLICK DEPLOY: Deploy entire Holosphere contract infrastructure\n * Deploys: All factories + Holons registry + optional TestToken\n *\n * @param {Object} options - Deployment options\n * @param {string} [options.botAddress] - Bot address for managed operations (defaults to deployer)\n * @param {string} [options.testTokenSupply='1000000'] - Initial supply for test token (in whole tokens)\n * @param {boolean} [options.deployTestToken=true] - Whether to deploy test token\n * @param {Function} [options.onProgress] - Callback for deployment progress\n * @returns {Promise<Object>} Deployed contract addresses and instances\n */\n async deployAll(options = {}) {\n const ethers = await this._loadEthers();\n const signer = this.chainManager.getSigner();\n const deployerAddress = await signer.getAddress();\n\n const botAddress = options.botAddress || deployerAddress;\n const testTokenSupply = options.testTokenSupply || '1000000';\n const deployTestToken = options.deployTestToken !== false;\n const onProgress = options.onProgress || (() => {});\n\n const deployment = {\n network: this.chainManager.networkName,\n chainId: this.chainManager.getChainId(),\n deployer: deployerAddress,\n botAddress,\n timestamp: new Date().toISOString(),\n contracts: {}\n };\n\n try {\n // Step 1: Deploy ManagedFactory\n onProgress({ step: 1, total: deployTestToken ? 8 : 7, message: 'Deploying ManagedFactory...' });\n const managedFactory = await this._deployContract(\n ManagedFactoryABI.abi,\n ManagedFactoryABI.bytecode,\n [botAddress]\n );\n deployment.contracts.managedFactory = managedFactory.address;\n onProgress({ step: 1, done: true, address: managedFactory.address });\n\n // Step 2: Deploy ZonedFactory\n onProgress({ step: 2, total: deployTestToken ? 8 : 7, message: 'Deploying ZonedFactory...' });\n const zonedFactory = await this._deployContract(\n ZonedFactoryABI.abi,\n ZonedFactoryABI.bytecode,\n [botAddress]\n );\n deployment.contracts.zonedFactory = zonedFactory.address;\n onProgress({ step: 2, done: true, address: zonedFactory.address });\n\n // Step 3: Deploy SplitterFactory\n onProgress({ step: 3, total: deployTestToken ? 8 : 7, message: 'Deploying SplitterFactory...' });\n const splitterFactory = await this._deployContract(\n SplitterFactoryABI.abi,\n SplitterFactoryABI.bytecode,\n []\n );\n deployment.contracts.splitterFactory = splitterFactory.address;\n onProgress({ step: 3, done: true, address: splitterFactory.address });\n\n // Step 4: Deploy AppreciativeFactory\n onProgress({ step: 4, total: deployTestToken ? 8 : 7, message: 'Deploying AppreciativeFactory...' });\n const appreciativeFactory = await this._deployContract(\n AppreciativeFactoryABI.abi,\n AppreciativeFactoryABI.bytecode,\n []\n );\n deployment.contracts.appreciativeFactory = appreciativeFactory.address;\n onProgress({ step: 4, done: true, address: appreciativeFactory.address });\n\n // Step 5: Deploy BundleFactory\n onProgress({ step: 5, total: deployTestToken ? 8 : 7, message: 'Deploying BundleFactory...' });\n const bundleFactory = await this._deployContract(\n BundleFactoryABI.abi,\n BundleFactoryABI.bytecode,\n []\n );\n deployment.contracts.bundleFactory = bundleFactory.address;\n onProgress({ step: 5, done: true, address: bundleFactory.address });\n\n // Step 6: Deploy Holons (Central Registry)\n onProgress({ step: 6, total: deployTestToken ? 8 : 7, message: 'Deploying Holons Registry...' });\n const holons = await this._deployContract(\n HolonsABI.abi,\n HolonsABI.bytecode,\n []\n );\n deployment.contracts.holons = holons.address;\n onProgress({ step: 6, done: true, address: holons.address });\n\n // Step 7: Configure Holons Registry\n onProgress({ step: 7, total: deployTestToken ? 8 : 7, message: 'Configuring Holons Registry...' });\n\n // Set factories\n await holons.contract.setFactories(managedFactory.address, zonedFactory.address);\n\n // Register flavors\n await holons.contract.newFlavor('Splitter', splitterFactory.address);\n await holons.contract.newFlavor('Managed', managedFactory.address);\n await holons.contract.newFlavor('Zoned', zonedFactory.address);\n await holons.contract.newFlavor('Appreciative', appreciativeFactory.address);\n await holons.contract.newFlavor('Bundle', bundleFactory.address);\n\n onProgress({ step: 7, done: true, message: 'Registry configured' });\n\n // Step 8: Deploy TestToken (optional)\n if (deployTestToken) {\n onProgress({ step: 8, total: 8, message: 'Deploying TestToken...' });\n const supply = ethers.parseEther(testTokenSupply);\n const testToken = await this._deployContract(\n TestTokenABI.abi,\n TestTokenABI.bytecode,\n [supply]\n );\n deployment.contracts.testToken = testToken.address;\n onProgress({ step: 8, done: true, address: testToken.address });\n }\n\n // Store deployed contracts\n this.deployedContracts = deployment.contracts;\n\n // Add explorer URLs\n deployment.explorerUrls = {};\n for (const [name, address] of Object.entries(deployment.contracts)) {\n const url = getAddressUrl(deployment.network, address);\n if (url) deployment.explorerUrls[name] = url;\n }\n\n return deployment;\n\n } catch (error) {\n throw new Error(`Deployment failed: ${error.message}`);\n }\n }\n\n /**\n * Deploy a Splitter contract for a holon (fractal ownership)\n * @param {string} holonId - Holon identifier\n * @param {string} name - Contract display name\n * @param {number} [splitPercentage=70] - Internal/External split (e.g., 70 = 70% internal, 30% external)\n * @param {Object} [options] - Additional options\n * @returns {Promise<{contract, address, txHash}>}\n */\n async deploySplitter(holonId, name, splitPercentage = 70, options = {}) {\n const signer = this.chainManager.getSigner();\n const deployerAddress = await signer.getAddress();\n\n const creatorUserId = options.creatorUserId || holonId;\n const managedFactory = options.managedFactory || this.deployedContracts.managedFactory;\n const zonedFactory = options.zonedFactory || this.deployedContracts.zonedFactory;\n\n if (!managedFactory || !zonedFactory) {\n throw new Error('Factories not deployed. Run deployAll() first or provide factory addresses.');\n }\n\n const result = await this._deployContract(\n SplitterABI.abi,\n SplitterABI.bytecode,\n [deployerAddress, creatorUserId, name, splitPercentage, managedFactory, zonedFactory]\n );\n\n // Configure the split\n await result.contract.setContractSplit(splitPercentage, 100 - splitPercentage);\n\n // Create child contracts\n await result.contract.createManagedContract(creatorUserId, name, 0);\n await result.contract.createZonedContract(creatorUserId, name, 6); // 6 zones default\n\n return {\n ...result,\n holonId,\n type: 'Splitter',\n splitPercentage\n };\n }\n\n /**\n * Deploy a Managed contract (appreciation-based distribution)\n * @param {string} name - Contract name\n * @param {Object} [options] - Additional options\n * @returns {Promise<{contract, address, txHash}>}\n */\n async deployManaged(name, options = {}) {\n const signer = this.chainManager.getSigner();\n const deployerAddress = await signer.getAddress();\n const botAddress = options.botAddress || deployerAddress;\n\n const result = await this._deployContract(\n ManagedABI.abi,\n ManagedABI.bytecode,\n [deployerAddress, name, botAddress]\n );\n\n return {\n ...result,\n type: 'Managed'\n };\n }\n\n /**\n * Deploy a Zoned contract (tier-based distribution)\n * @param {string} name - Contract name\n * @param {number} [nZones=6] - Number of zones\n * @param {Object} [options] - Additional options\n * @returns {Promise<{contract, address, txHash}>}\n */\n async deployZoned(name, nZones = 6, options = {}) {\n const signer = this.chainManager.getSigner();\n const deployerAddress = await signer.getAddress();\n const botAddress = options.botAddress || deployerAddress;\n const creatorUserId = options.creatorUserId || 'creator';\n\n const result = await this._deployContract(\n ZonedABI.abi,\n ZonedABI.bytecode,\n [creatorUserId, deployerAddress, name, nZones, botAddress]\n );\n\n return {\n ...result,\n type: 'Zoned',\n nZones\n };\n }\n\n /**\n * Deploy an Appreciative contract (peer-to-peer appreciation)\n * @param {string} name - Contract name\n * @param {string} creatorUserId - Creator's user ID\n * @param {Object} [options] - Additional options\n * @returns {Promise<{contract, address, txHash}>}\n */\n async deployAppreciative(name, creatorUserId, options = {}) {\n const signer = this.chainManager.getSigner();\n const deployerAddress = await signer.getAddress();\n\n const result = await this._deployContract(\n AppreciativeABI.abi,\n AppreciativeABI.bytecode,\n [name, creatorUserId, deployerAddress]\n );\n\n return {\n ...result,\n type: 'Appreciative'\n };\n }\n\n /**\n * Deploy a Bundle contract (2-way split with steepness)\n * This is the simplest way to deploy a holon - no registry needed!\n * @param {string} name - Contract name\n * @param {number} [steepness=500000000000000000n] - Steepness factor (0.5e18 = 50% decay)\n * @param {number} [nZones=6] - Number of zones\n * @param {Object} [options] - Additional options\n * @returns {Promise<{contract, address, txHash}>}\n */\n async deployBundle(name, steepness, nZones = 6, options = {}) {\n const ethers = await this._loadEthers();\n const signer = this.chainManager.getSigner();\n const deployerAddress = await signer.getAddress();\n const creatorUserId = options.creatorUserId || 'creator';\n\n // Default steepness: 0.5e18 (50% decay per zone)\n const steepnessValue = steepness || ethers.parseEther('0.5');\n\n // BundleABI now has { abi, bytecode } structure\n const abi = BundleABI.abi || BundleABI;\n const bytecode = BundleABI.bytecode;\n\n if (!bytecode) {\n throw new Error('Bundle bytecode not available. Please rebuild contracts.');\n }\n\n const result = await this._deployContract(\n abi,\n bytecode,\n [deployerAddress, creatorUserId, name, steepnessValue, nZones]\n );\n\n return {\n ...result,\n type: 'Bundle',\n steepness: steepnessValue,\n nZones,\n creatorUserId,\n name\n };\n }\n\n /**\n * Deploy a Bundle contract directly (simplified 1-click deployment)\n * No registry needed - just deploys and returns the address\n * @param {string} holonId - Unique identifier for the holon\n * @param {string} name - Display name for the holon\n * @param {Object} [options] - Options { steepness, nZones }\n * @returns {Promise<{address, txHash, contract}>}\n */\n async deployBundleDirect(holonId, name, options = {}) {\n const steepness = options.steepness;\n const nZones = options.nZones || 6;\n\n return this.deployBundle(name, steepness, nZones, {\n creatorUserId: holonId,\n ...options\n });\n }\n\n /**\n * Deploy a TestToken (ERC20 for testing)\n * @param {string} [initialSupply='1000000'] - Initial supply in whole tokens\n * @returns {Promise<{contract, address, txHash}>}\n */\n async deployTestToken(initialSupply = '1000000') {\n const ethers = await this._loadEthers();\n const supply = ethers.parseEther(initialSupply);\n\n const result = await this._deployContract(\n TestTokenABI.abi,\n TestTokenABI.bytecode,\n [supply]\n );\n\n return {\n ...result,\n type: 'TestToken',\n initialSupply\n };\n }\n\n /**\n * Create a holon bundle through the Holons registry\n * @param {string} creatorUserId - Creator's user ID\n * @param {string} name - Bundle name\n * @param {number} [parameter=70] - Split parameter\n * @returns {Promise<{address, txHash}>}\n */\n async createHolonBundle(creatorUserId, name, parameter = 70) {\n if (!this.deployedContracts.holons) {\n throw new Error('Holons registry not deployed. Run deployAll() first.');\n }\n\n const holons = await this.chainManager.getContract(\n this.deployedContracts.holons,\n HolonsABI.abi\n );\n\n const tx = await holons.newHolonBundle(creatorUserId, name, parameter);\n const receipt = await tx.wait();\n\n // Get the created address from events\n const event = receipt.logs.find(log => {\n try {\n const parsed = holons.interface.parseLog(log);\n return parsed?.name === 'NewHolon';\n } catch {\n return false;\n }\n });\n\n const address = event ? holons.interface.parseLog(event).args.addr : await holons.toAddress(name);\n\n return {\n address,\n txHash: receipt.hash,\n name,\n creatorUserId\n };\n }\n\n /**\n * Get contract instance by address\n * @param {string} address - Contract address\n * @param {string} type - Contract type (Splitter, Managed, Zoned, etc.)\n * @returns {Promise<Contract>}\n */\n async getContract(address, type) {\n const abi = ABIs[type];\n if (!abi) {\n throw new Error(`Unknown contract type: ${type}`);\n }\n return this.chainManager.getContract(address, abi.abi);\n }\n\n /**\n * Get deployed contract addresses\n * @returns {Object}\n */\n getDeployedAddresses() {\n return { ...this.deployedContracts };\n }\n\n /**\n * Load previously deployed contracts\n * @param {Object} addresses - Contract addresses\n */\n loadDeployedAddresses(addresses) {\n this.deployedContracts = { ...addresses };\n }\n\n /**\n * Internal: Deploy a contract\n * @private\n */\n async _deployContract(abi, bytecode, constructorArgs) {\n const result = await this.chainManager.deployContract(abi, bytecode, constructorArgs);\n return {\n contract: result.contract,\n address: result.address,\n txHash: result.txHash,\n explorerUrl: getAddressUrl(this.chainManager.networkName, result.address)\n };\n }\n}\n\nexport default ContractDeployer;\n","/**\n * ContractOperations - All contract functions exposed with clear parameters\n * Provides a unified interface for interacting with all Holosphere contract types\n */\n\nexport class ContractOperations {\n constructor(contract, type, chainManager) {\n this.contract = contract;\n this.type = type;\n this.chainManager = chainManager;\n this.ethers = null;\n }\n\n /**\n * Load ethers dynamically\n * @private\n */\n async _loadEthers() {\n if (!this.ethers) {\n this.ethers = await import('ethers');\n }\n return this.ethers;\n }\n\n // ========================================================================\n // MEMBER MANAGEMENT\n // ========================================================================\n\n /**\n * Add a single member to the contract\n * @param {string} userId - User identifier (string-based, e.g., 'alice', 'telegram_12345')\n * @returns {Promise<{txHash, receipt}>}\n */\n async addMember(userId) {\n const tx = await this.contract.addMember(userId);\n const receipt = await tx.wait();\n return { txHash: receipt.hash, receipt };\n }\n\n /**\n * Add multiple members at once (batch operation)\n * @param {string[]} userIds - Array of user identifiers\n * @returns {Promise<{txHash, receipt}>}\n */\n async addMembers(userIds) {\n const tx = await this.contract.addMembers(userIds);\n const receipt = await tx.wait();\n return { txHash: receipt.hash, receipt };\n }\n\n /**\n * Get all member user IDs\n * @returns {Promise<string[]>}\n */\n async getMembers() {\n const userIds = await this.contract.userIds();\n // userIds is typically a getter for the array - try different approaches\n try {\n // Try to get all members by iterating\n const members = [];\n let i = 0;\n while (true) {\n try {\n const userId = await this.contract.userIds(i);\n members.push(userId);\n i++;\n } catch {\n break;\n }\n }\n return members;\n } catch {\n return [];\n }\n }\n\n /**\n * Check if a user is a member\n * @param {string} userId - User identifier\n * @returns {Promise<boolean>}\n */\n async isMember(userId) {\n try {\n // Different contracts use different naming conventions\n if (this.type === 'Splitter') {\n return await this.contract.isSplitterMember(userId);\n }\n return await this.contract.isMember(userId);\n } catch {\n return false;\n }\n }\n\n /**\n * Get the address associated with a user ID\n * @param {string} userId - User identifier\n * @returns {Promise<string>} Ethereum address (or zero address if not set)\n */\n async getUserAddress(userId) {\n return this.contract.userIdToAddress(userId);\n }\n\n // ========================================================================\n // FUND DISTRIBUTION\n // ========================================================================\n\n /**\n * Trigger reward distribution for ERC20 tokens\n * @param {string} tokenAddress - ERC20 token contract address\n * @param {string|bigint} amount - Amount in wei (or token's smallest unit)\n * @returns {Promise<{txHash, receipt}>}\n */\n async reward(tokenAddress, amount) {\n const ethers = await this._loadEthers();\n const amountBigInt = typeof amount === 'string' ? ethers.parseUnits(amount, 18) : amount;\n const tx = await this.contract.reward(tokenAddress, amountBigInt);\n const receipt = await tx.wait();\n return { txHash: receipt.hash, receipt };\n }\n\n /**\n * Trigger reward distribution for ETH\n * @param {string} amount - Amount in ETH (e.g., '1.5' for 1.5 ETH)\n * @returns {Promise<{txHash, receipt}>}\n */\n async rewardEth(amount) {\n const ethers = await this._loadEthers();\n const amountWei = ethers.parseEther(amount);\n const tx = await this.contract.reward(\n '0x0000000000000000000000000000000000000000',\n amountWei,\n { value: amountWei }\n );\n const receipt = await tx.wait();\n return { txHash: receipt.hash, receipt };\n }\n\n /**\n * Send ETH directly to contract (triggers receive/fallback)\n * @param {string} amount - Amount in ETH\n * @returns {Promise<{txHash, receipt}>}\n */\n async sendEth(amount) {\n const ethers = await this._loadEthers();\n const signer = this.chainManager.getSigner();\n const amountWei = ethers.parseEther(amount);\n const tx = await signer.sendTransaction({\n to: await this.contract.getAddress(),\n value: amountWei\n });\n const receipt = await tx.wait();\n return { txHash: receipt.hash, receipt };\n }\n\n /**\n * Claim accumulated rewards for a user\n * @param {string} userId - User identifier\n * @param {string} beneficiaryAddress - Ethereum address to receive funds\n * @returns {Promise<{txHash, receipt}>}\n */\n async claim(userId, beneficiaryAddress) {\n const tx = await this.contract.claim(userId, beneficiaryAddress);\n const receipt = await tx.wait();\n return { txHash: receipt.hash, receipt };\n }\n\n /**\n * Get ETH balance for a user\n * @param {string} userId - User identifier\n * @returns {Promise<string>} Balance in ETH\n */\n async getEthBalance(userId) {\n const ethers = await this._loadEthers();\n const balance = await this.contract.etherBalance(userId);\n return ethers.formatEther(balance);\n }\n\n /**\n * Get ERC20 token balance for a user\n * @param {string} userId - User identifier\n * @param {string} tokenAddress - ERC20 token address\n * @returns {Promise<string>} Balance in tokens (18 decimals assumed)\n */\n async getTokenBalance(userId, tokenAddress) {\n const ethers = await this._loadEthers();\n const balance = await this.contract.tokenBalance(userId, tokenAddress);\n return ethers.formatUnits(balance, 18);\n }\n\n /**\n * Check if user has already claimed\n * @param {string} userId - User identifier\n * @returns {Promise<boolean>}\n */\n async hasClaimed(userId) {\n return this.contract.hasClaimed(userId);\n }\n\n /**\n * Get total deposited amount for a token\n * @param {string} tokenAddress - Token address (use zero address for ETH)\n * @returns {Promise<string>}\n */\n async getTotalDeposited(tokenAddress) {\n const ethers = await this._loadEthers();\n const total = await this.contract.totalDeposited(tokenAddress);\n return ethers.formatUnits(total, 18);\n }\n\n // ========================================================================\n // SPLITTER OPERATIONS\n // ========================================================================\n\n /**\n * Set the internal/external split percentages (Splitter only)\n * @param {number} internalPct - Internal percentage (0-100)\n * @param {number} externalPct - External percentage (0-100, must sum to 100 with internal)\n * @returns {Promise<{txHash, receipt}>}\n */\n async setContractSplit(internalPct, externalPct) {\n this._requireType(['Splitter']);\n if (internalPct + externalPct !== 100) {\n throw new Error('Percentages must sum to 100');\n }\n const tx = await this.contract.setContractSplit(internalPct, externalPct);\n const receipt = await tx.wait();\n return { txHash: receipt.hash, receipt };\n }\n\n /**\n * Get current split percentages (Splitter only)\n * @returns {Promise<{internal: number, external: number}>}\n */\n async getContractSplit() {\n this._requireType(['Splitter']);\n const internal = await this.contract.internalContractSplitPercentage();\n const external = await this.contract.externalContractSplitPercentage();\n return {\n internal: Number(internal),\n external: Number(external)\n };\n }\n\n /**\n * Create a Managed child contract (Splitter only)\n * @param {string} creatorUserId - Creator's user ID\n * @param {string} name - Contract name\n * @param {number} [parameter=0] - Optional parameter\n * @returns {Promise<{address, txHash, receipt}>}\n */\n async createManagedContract(creatorUserId, name, parameter = 0) {\n this._requireType(['Splitter']);\n const tx = await this.contract.createManagedContract(creatorUserId, name, parameter);\n const receipt = await tx.wait();\n const address = await this.contract.contractsByType(`${name}_managed`);\n return { address, txHash: receipt.hash, receipt };\n }\n\n /**\n * Create a Zoned child contract (Splitter only)\n * @param {string} creatorUserId - Creator's user ID\n * @param {string} name - Contract name\n * @param {number} [nZones=6] - Number of zones\n * @returns {Promise<{address, txHash, receipt}>}\n */\n async createZonedContract(creatorUserId, name, nZones = 6) {\n this._requireType(['Splitter']);\n const tx = await this.contract.createZonedContract(creatorUserId, name, nZones);\n const receipt = await tx.wait();\n const address = await this.contract.contractsByType(`${name}_zoned`);\n return { address, txHash: receipt.hash, receipt };\n }\n\n /**\n * Get all child contract keys (Splitter only)\n * @returns {Promise<string[]>}\n */\n async getChildContractKeys() {\n this._requireType(['Splitter']);\n return this.contract.getContractKeys();\n }\n\n /**\n * Get child contract addresses (Splitter only)\n * @returns {Promise<{keys: string[], addresses: string[]}>}\n */\n async getChildContracts() {\n this._requireType(['Splitter']);\n const [keys, addresses] = await this.contract.getContractAddresses();\n return { keys, addresses };\n }\n\n /**\n * Get child contract address by key (Splitter only)\n * @param {string} key - Contract key (e.g., 'MyHolon_managed')\n * @returns {Promise<string>}\n */\n async getChildContract(key) {\n this._requireType(['Splitter']);\n return this.contract.contractsByType(key);\n }\n\n // ========================================================================\n // MANAGED OPERATIONS (Appreciation-Based)\n // ========================================================================\n\n /**\n * Set appreciation values for members (Managed only)\n * Appreciation determines reward distribution proportionally\n * @param {string[]} userIds - Array of user identifiers\n * @param {number[]} amounts - Array of appreciation amounts (integers)\n * @returns {Promise<{txHash, receipt}>}\n * @example\n * // Alice gets 60%, Bob gets 40%\n * await ops.setAppreciation(['alice', 'bob'], [300, 200]);\n */\n async setAppreciation(userIds, amounts) {\n this._requireType(['Managed']);\n if (userIds.length !== amounts.length) {\n throw new Error('userIds and amounts arrays must have same length');\n }\n const tx = await this.contract.setAppreciation(userIds, amounts);\n const receipt = await tx.wait();\n return { txHash: receipt.hash, receipt };\n }\n\n /**\n * Get appreciation value for a user (Managed only)\n * @param {string} userId - User identifier\n * @returns {Promise<number>}\n */\n async getAppreciation(userId) {\n this._requireType(['Managed']);\n const appreciation = await this.contract.appreciation(userId);\n return Number(appreciation);\n }\n\n /**\n * Get total appreciation across all members (Managed only)\n * @returns {Promise<number>}\n */\n async getTotalAppreciation() {\n this._requireType(['Managed']);\n const total = await this.contract.totalappreciation();\n return Number(total);\n }\n\n // ========================================================================\n // ZONED OPERATIONS (Tier-Based)\n // ========================================================================\n\n /**\n * Add a user to a zone (Zoned only)\n * Higher zones receive more rewards based on quadratic formula\n * @param {string} senderUserId - Sender's user ID (for authorization)\n * @param {string} userId - User to add to zone\n * @param {number} zone - Zone number (0 = unassigned, 1-N = contribution tiers)\n * @returns {Promise<{txHash, receipt}>}\n */\n async addToZone(senderUserId, userId, zone) {\n this._requireType(['Zoned']);\n const tx = await this.contract.addToZone(senderUserId, userId, zone);\n const receipt = await tx.wait();\n return { txHash: receipt.hash, receipt };\n }\n\n /**\n * Remove a user from their zone (Zoned only)\n * @param {string} senderUserId - Sender's user ID\n * @param {string} userId - User to remove\n * @returns {Promise<{txHash, receipt}>}\n */\n async removeFromZone(senderUserId, userId) {\n this._requireType(['Zoned']);\n const tx = await this.contract.removeFromZone(senderUserId, userId);\n const receipt = await tx.wait();\n return { txHash: receipt.hash, receipt };\n }\n\n /**\n * Get a user's zone (Zoned only)\n * @param {string} userId - User identifier\n * @returns {Promise<number>}\n */\n async getZone(userId) {\n this._requireType(['Zoned']);\n const zone = await this.contract.zones(userId);\n return Number(zone);\n }\n\n /**\n * Get number of zones (Zoned only)\n * @returns {Promise<number>}\n */\n async getNumZones() {\n this._requireType(['Zoned']);\n const nzones = await this.contract.nzones();\n return Number(nzones);\n }\n\n /**\n * Set the reward function parameters (Zoned only)\n * Formula: reward_units = a*zone² + b*zone + c\n * @param {string} senderUserId - Sender's user ID\n * @param {number} a - Quadratic coefficient\n * @param {number} b - Linear coefficient\n * @param {number} c - Constant\n * @returns {Promise<{txHash, receipt}>}\n */\n async setZoneParameters(senderUserId, a, b, c) {\n this._requireType(['Zoned']);\n const tx = await this.contract.setRewardFunction(senderUserId, a, b, c);\n const receipt = await tx.wait();\n return { txHash: receipt.hash, receipt };\n }\n\n // ========================================================================\n // APPRECIATIVE OPERATIONS (Peer-to-Peer)\n // ========================================================================\n\n /**\n * Give appreciation from one user to another (Appreciative only)\n * Each member has a limited appreciation pool to distribute\n * @param {string} fromUserId - Giver's user ID\n * @param {string} toUserId - Receiver's user ID\n * @param {number} amount - Amount of appreciation to give\n * @returns {Promise<{txHash, receipt}>}\n */\n async appreciate(fromUserId, toUserId, amount) {\n this._requireType(['Appreciative']);\n const tx = await this.contract.appreciate(fromUserId, toUserId, amount);\n const receipt = await tx.wait();\n return { txHash: receipt.hash, receipt };\n }\n\n /**\n * Get appreciation given by a user (Appreciative only)\n * @param {string} userId - User identifier\n * @returns {Promise<number>}\n */\n async getAppreciationGiven(userId) {\n this._requireType(['Appreciative']);\n const given = await this.contract.appreciationGiven(userId);\n return Number(given);\n }\n\n /**\n * Get appreciation received by a user (Appreciative only)\n * @param {string} userId - User identifier\n * @returns {Promise<number>}\n */\n async getAppreciationReceived(userId) {\n this._requireType(['Appreciative']);\n const received = await this.contract.appreciationReceived(userId);\n return Number(received);\n }\n\n /**\n * Get remaining appreciation pool for a user (Appreciative only)\n * @param {string} userId - User identifier\n * @returns {Promise<number>}\n */\n async getAppreciationRemaining(userId) {\n this._requireType(['Appreciative']);\n const remaining = await this.contract.appreciationRemaining(userId);\n return Number(remaining);\n }\n\n // ========================================================================\n // BUNDLE OPERATIONS (2-Way Split)\n // ========================================================================\n\n /**\n * Set steepness for zone decay (Bundle only)\n * Higher steepness = faster decay = more concentration in higher zones\n * @param {string|bigint} steepness - Steepness value (0 < s < 1e18, e.g., 0.5e18 for 50% decay)\n * @returns {Promise<{txHash, receipt}>}\n */\n async setSteepness(steepness) {\n this._requireType(['Bundle']);\n const ethers = await this._loadEthers();\n const steepnessValue = typeof steepness === 'string' ? ethers.parseEther(steepness) : steepness;\n const tx = await this.contract.setSteepness(steepnessValue);\n const receipt = await tx.wait();\n return { txHash: receipt.hash, receipt };\n }\n\n /**\n * Get current steepness (Bundle only)\n * @returns {Promise<string>} Steepness as decimal string (e.g., '0.5')\n */\n async getSteepness() {\n this._requireType(['Bundle']);\n const ethers = await this._loadEthers();\n const steepness = await this.contract.steepness();\n return ethers.formatEther(steepness);\n }\n\n /**\n * Set interior split percentages (Bundle only)\n * @param {string[]} userIds - User identifiers\n * @param {number[]} percentages - Percentages (must sum to 100)\n * @returns {Promise<{txHash, receipt}>}\n */\n async setInteriorSplit(userIds, percentages) {\n this._requireType(['Bundle']);\n const total = percentages.reduce((a, b) => a + b, 0);\n if (total !== 100) {\n throw new Error('Percentages must sum to 100');\n }\n const tx = await this.contract.setInteriorSplit(userIds, percentages);\n const receipt = await tx.wait();\n return { txHash: receipt.hash, receipt };\n }\n\n // ========================================================================\n // GOVERNANCE (Bundle)\n // ========================================================================\n\n /**\n * Start an election for new owner (Bundle only)\n * @returns {Promise<{txHash, receipt}>}\n */\n async startElection() {\n this._requireType(['Bundle']);\n const tx = await this.contract.startElection();\n const receipt = await tx.wait();\n return { txHash: receipt.hash, receipt };\n }\n\n /**\n * Nominate yourself as candidate (Bundle only)\n * @returns {Promise<{txHash, receipt}>}\n */\n async nominateSelf() {\n this._requireType(['Bundle']);\n const tx = await this.contract.nominateSelf();\n const receipt = await tx.wait();\n return { txHash: receipt.hash, receipt };\n }\n\n /**\n * Vote for a nominee (Bundle only)\n * @param {string} nomineeAddress - Address of the nominee\n * @returns {Promise<{txHash, receipt}>}\n */\n async vote(nomineeAddress) {\n this._requireType(['Bundle']);\n const tx = await this.contract.vote(nomineeAddress);\n const receipt = await tx.wait();\n return { txHash: receipt.hash, receipt };\n }\n\n /**\n * Finalize election and transfer ownership to winner (Bundle only)\n * @returns {Promise<{txHash, receipt}>}\n */\n async finalizeElection() {\n this._requireType(['Bundle']);\n const tx = await this.contract.finalizeElection();\n const receipt = await tx.wait();\n return { txHash: receipt.hash, receipt };\n }\n\n // ========================================================================\n // READ-ONLY QUERIES\n // ========================================================================\n\n /**\n * Get contract name\n * @returns {Promise<string>}\n */\n async getName() {\n return this.contract.name();\n }\n\n /**\n * Get contract owner address\n * @returns {Promise<string>}\n */\n async getOwner() {\n return this.contract.owner();\n }\n\n /**\n * Get bot address (for Managed/Zoned)\n * @returns {Promise<string>}\n */\n async getBotAddress() {\n try {\n return await this.contract.botAddress();\n } catch {\n return null;\n }\n }\n\n /**\n * Get creator user ID\n * @returns {Promise<string>}\n */\n async getCreatorUserId() {\n try {\n return await this.contract.creatorUserId();\n } catch {\n return null;\n }\n }\n\n /**\n * Get contract address\n * @returns {Promise<string>}\n */\n async getAddress() {\n return this.contract.getAddress();\n }\n\n /**\n * Get contract type\n * @returns {string}\n */\n getType() {\n return this.type;\n }\n\n // ========================================================================\n // UTILITIES\n // ========================================================================\n\n /**\n * Require specific contract type(s)\n * @private\n */\n _requireType(allowedTypes) {\n if (!allowedTypes.includes(this.type)) {\n throw new Error(`Operation only available for ${allowedTypes.join('/')} contracts. This is a ${this.type} contract.`);\n }\n }\n\n /**\n * Get raw contract instance for advanced usage\n * @returns {Contract}\n */\n getRawContract() {\n return this.contract;\n }\n\n /**\n * Execute a raw contract call\n * @param {string} method - Method name\n * @param {Array} args - Method arguments\n * @returns {Promise<any>}\n */\n async call(method, ...args) {\n return this.contract[method](...args);\n }\n\n /**\n * Execute a raw contract transaction\n * @param {string} method - Method name\n * @param {Array} args - Method arguments\n * @returns {Promise<{txHash, receipt}>}\n */\n async send(method, ...args) {\n const tx = await this.contract[method](...args);\n const receipt = await tx.wait();\n return { txHash: receipt.hash, receipt };\n }\n}\n\nexport default ContractOperations;\n","/**\n * HolonContracts - Per-holon contract management\n * Links holons to their smart contracts for fractal fund distribution\n */\n\nimport { ContractDeployer, ABIs } from './deployer.js';\nimport { ContractOperations } from './operations.js';\n\nexport class HolonContracts {\n constructor(chainManager, deployer) {\n this.chainManager = chainManager;\n this.deployer = deployer || new ContractDeployer(chainManager);\n\n // Maps holonId -> { address, type, contract, operations }\n this.holonContracts = new Map();\n\n // Storage for persistence (can be overridden)\n this.storage = null;\n }\n\n /**\n * Set storage adapter for persisting holon-contract mappings\n * @param {Object} storage - Storage adapter with get/set methods\n */\n setStorage(storage) {\n this.storage = storage;\n }\n\n /**\n * Deploy a new contract for a holon\n * @param {string} holonId - Holon identifier\n * @param {string} [type='Splitter'] - Contract type (Splitter, Managed, Zoned, Appreciative, Bundle)\n * @param {Object} [options] - Deployment options\n * @returns {Promise<{contract, address, operations}>}\n */\n async deploy(holonId, type = 'Splitter', options = {}) {\n if (this.holonContracts.has(holonId)) {\n throw new Error(`Holon ${holonId} already has a contract. Use unlink() first to remove it.`);\n }\n\n const name = options.name || holonId;\n const creatorUserId = options.creatorUserId || holonId;\n let result;\n\n switch (type) {\n case 'Splitter':\n result = await this.deployer.deploySplitter(\n holonId,\n name,\n options.splitPercentage || 70,\n { creatorUserId, ...options }\n );\n break;\n\n case 'Managed':\n result = await this.deployer.deployManaged(name, options);\n break;\n\n case 'Zoned':\n result = await this.deployer.deployZoned(name, options.nZones || 6, options);\n break;\n\n case 'Appreciative':\n result = await this.deployer.deployAppreciative(name, creatorUserId, options);\n break;\n\n case 'Bundle':\n result = await this.deployer.deployBundle(\n name,\n options.steepness,\n options.nZones || 6,\n { creatorUserId, ...options }\n );\n break;\n\n default:\n throw new Error(`Unknown contract type: ${type}`);\n }\n\n // Create operations wrapper\n const operations = new ContractOperations(result.contract, type, this.chainManager);\n\n // Store mapping\n const holonData = {\n holonId,\n address: result.address,\n type,\n contract: result.contract,\n operations,\n deployedAt: new Date().toISOString(),\n txHash: result.txHash\n };\n\n this.holonContracts.set(holonId, holonData);\n\n // Persist if storage available\n await this._saveMapping(holonId, holonData);\n\n return {\n contract: result.contract,\n address: result.address,\n operations,\n txHash: result.txHash,\n type\n };\n }\n\n /**\n * Link a holon to an existing contract\n * @param {string} holonId - Holon identifier\n * @param {string} contractAddress - Existing contract address\n * @param {string} [type='Splitter'] - Contract type\n * @returns {Promise<{contract, address, operations}>}\n */\n async link(holonId, contractAddress, type = 'Splitter') {\n if (this.holonContracts.has(holonId)) {\n throw new Error(`Holon ${holonId} already has a contract. Use unlink() first.`);\n }\n\n const abi = ABIs[type];\n if (!abi) {\n throw new Error(`Unknown contract type: ${type}`);\n }\n\n // Create contract instance\n const contract = await this.chainManager.getContract(contractAddress, abi.abi);\n\n // Verify it's a valid contract by calling a read method\n try {\n await contract.name();\n } catch (error) {\n throw new Error(`Invalid contract at ${contractAddress}: ${error.message}`);\n }\n\n // Create operations wrapper\n const operations = new ContractOperations(contract, type, this.chainManager);\n\n // Store mapping\n const holonData = {\n holonId,\n address: contractAddress,\n type,\n contract,\n operations,\n linkedAt: new Date().toISOString()\n };\n\n this.holonContracts.set(holonId, holonData);\n\n // Persist if storage available\n await this._saveMapping(holonId, holonData);\n\n return {\n contract,\n address: contractAddress,\n operations,\n type\n };\n }\n\n /**\n * Unlink a holon from its contract\n * @param {string} holonId - Holon identifier\n * @returns {boolean} True if unlinked, false if no contract was linked\n */\n async unlink(holonId) {\n if (!this.holonContracts.has(holonId)) {\n return false;\n }\n\n this.holonContracts.delete(holonId);\n\n // Remove from storage if available\n if (this.storage) {\n await this.storage.delete?.(`holon_contract:${holonId}`);\n }\n\n return true;\n }\n\n /**\n * Get contract for a holon\n * @param {string} holonId - Holon identifier\n * @returns {Contract|null}\n */\n getContract(holonId) {\n const data = this.holonContracts.get(holonId);\n return data?.contract || null;\n }\n\n /**\n * Get contract address for a holon\n * @param {string} holonId - Holon identifier\n * @returns {string|null}\n */\n getAddress(holonId) {\n const data = this.holonContracts.get(holonId);\n return data?.address || null;\n }\n\n /**\n * Get operations wrapper for a holon\n * @param {string} holonId - Holon identifier\n * @returns {ContractOperations|null}\n */\n getOperations(holonId) {\n const data = this.holonContracts.get(holonId);\n return data?.operations || null;\n }\n\n /**\n * Get contract type for a holon\n * @param {string} holonId - Holon identifier\n * @returns {string|null}\n */\n getType(holonId) {\n const data = this.holonContracts.get(holonId);\n return data?.type || null;\n }\n\n /**\n * Check if a holon has a contract\n * @param {string} holonId - Holon identifier\n * @returns {boolean}\n */\n hasContract(holonId) {\n return this.holonContracts.has(holonId);\n }\n\n /**\n * Get all holon-contract mappings\n * @returns {Array<{holonId, address, type}>}\n */\n listAll() {\n const result = [];\n for (const [holonId, data] of this.holonContracts) {\n result.push({\n holonId,\n address: data.address,\n type: data.type,\n deployedAt: data.deployedAt,\n linkedAt: data.linkedAt\n });\n }\n return result;\n }\n\n /**\n * Get holons by contract type\n * @param {string} type - Contract type\n * @returns {Array<{holonId, address}>}\n */\n getByType(type) {\n const result = [];\n for (const [holonId, data] of this.holonContracts) {\n if (data.type === type) {\n result.push({\n holonId,\n address: data.address\n });\n }\n }\n return result;\n }\n\n /**\n * Load holon-contract mappings from storage\n * @returns {Promise<number>} Number of mappings loaded\n */\n async loadFromStorage() {\n if (!this.storage) {\n return 0;\n }\n\n const mappings = await this.storage.get?.('holon_contracts_index') || [];\n let loaded = 0;\n\n for (const holonId of mappings) {\n try {\n const data = await this.storage.get?.(`holon_contract:${holonId}`);\n if (data && data.address && data.type) {\n // Recreate contract instance\n const abi = ABIs[data.type];\n if (abi) {\n const contract = await this.chainManager.getContract(data.address, abi.abi);\n const operations = new ContractOperations(contract, data.type, this.chainManager);\n\n this.holonContracts.set(holonId, {\n ...data,\n contract,\n operations\n });\n loaded++;\n }\n }\n } catch (error) {\n console.warn(`Failed to load contract for holon ${holonId}: ${error.message}`);\n }\n }\n\n return loaded;\n }\n\n /**\n * Save a holon-contract mapping to storage\n * @private\n */\n async _saveMapping(holonId, data) {\n if (!this.storage) return;\n\n // Save the mapping (without contract/operations which can't be serialized)\n await this.storage.set?.(`holon_contract:${holonId}`, {\n holonId: data.holonId,\n address: data.address,\n type: data.type,\n deployedAt: data.deployedAt,\n linkedAt: data.linkedAt,\n txHash: data.txHash\n });\n\n // Update index\n const index = await this.storage.get?.('holon_contracts_index') || [];\n if (!index.includes(holonId)) {\n index.push(holonId);\n await this.storage.set?.('holon_contracts_index', index);\n }\n }\n\n /**\n * Get required holon operations (throws if not linked)\n * @param {string} holonId - Holon identifier\n * @returns {ContractOperations}\n * @throws {Error} If holon has no contract\n */\n requireOperations(holonId) {\n const ops = this.getOperations(holonId);\n if (!ops) {\n throw new Error(`Holon ${holonId} has no linked contract. Deploy or link one first.`);\n }\n return ops;\n }\n}\n\nexport default HolonContracts;\n","/**\n * Event Listener for Sankey Flow Visualization\n *\n * Listens to contract events and transforms them into a format\n * suitable for Sankey diagram visualization of fund flows.\n */\n\n/**\n * Standard Sankey event types emitted by our contracts\n */\nexport const SANKEY_EVENTS = {\n // Fund flow events\n FundsReceived: 'FundsReceived',\n FundsCascaded: 'FundsCascaded',\n FundsAllocated: 'FundsAllocated',\n FundsClaimed: 'FundsClaimed',\n FundsTransferred: 'FundsTransferred',\n\n // Distribution summary\n DistributionCompleted: 'DistributionCompleted',\n\n // Structure events\n ChildContractCreated: 'ChildContractCreated',\n HolonCreated: 'HolonCreated',\n\n // Membership events\n MemberAdded: 'MemberAdded',\n MemberRemoved: 'MemberRemoved',\n\n // Weight/Zone events\n WeightChanged: 'WeightChanged',\n ZoneAssigned: 'ZoneAssigned',\n AppreciationGiven: 'AppreciationGiven',\n\n // Configuration events\n SplitConfigured: 'SplitConfigured',\n ContractSplitConfigured: 'ContractSplitConfigured'\n};\n\n/**\n * EventListener class for tracking contract events\n */\nexport class EventListener {\n constructor(chainManager) {\n this.chainManager = chainManager;\n this.listeners = new Map();\n this.eventHistory = [];\n this.sankeyNodes = new Map(); // address/userId -> node data\n this.sankeyLinks = []; // {source, target, value, ...}\n }\n\n /**\n * Start listening to all Sankey-relevant events on a contract\n * @param {string} contractAddress - The contract address\n * @param {string} holonId - Human-readable holon identifier\n * @param {Object} contract - ethers.js contract instance\n */\n async listenToContract(contractAddress, holonId, contract) {\n const eventFilters = [\n 'FundsReceived',\n 'FundsCascaded',\n 'FundsAllocated',\n 'FundsClaimed',\n 'FundsTransferred',\n 'DistributionCompleted',\n 'MemberAdded',\n 'WeightChanged',\n 'ZoneAssigned',\n 'AppreciationGiven'\n ];\n\n for (const eventName of eventFilters) {\n try {\n const filter = contract.filters[eventName]?.();\n if (filter) {\n contract.on(eventName, (...args) => {\n this._handleEvent(eventName, args, contractAddress, holonId);\n });\n }\n } catch (e) {\n // Event not found on this contract, skip\n }\n }\n\n this.listeners.set(contractAddress, { contract, holonId });\n }\n\n /**\n * Stop listening to a contract\n */\n stopListening(contractAddress) {\n const listener = this.listeners.get(contractAddress);\n if (listener) {\n listener.contract.removeAllListeners();\n this.listeners.delete(contractAddress);\n }\n }\n\n /**\n * Stop all listeners\n */\n stopAll() {\n for (const [address, listener] of this.listeners) {\n listener.contract.removeAllListeners();\n }\n this.listeners.clear();\n }\n\n /**\n * Handle incoming event and transform to Sankey data\n */\n _handleEvent(eventName, args, contractAddress, holonId) {\n const event = args[args.length - 1]; // Last arg is the event object\n const timestamp = Date.now();\n\n const parsed = {\n type: eventName,\n contractAddress,\n holonId,\n timestamp,\n blockNumber: event?.blockNumber,\n transactionHash: event?.transactionHash,\n data: this._parseEventData(eventName, args)\n };\n\n this.eventHistory.push(parsed);\n this._updateSankeyData(parsed);\n\n // Emit custom event for real-time updates\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('sankey-event', { detail: parsed }));\n }\n }\n\n /**\n * Parse event data based on event type\n */\n _parseEventData(eventName, args) {\n switch (eventName) {\n case 'FundsReceived':\n return {\n contractAddress: args[0],\n sender: args[1],\n tokenAddress: args[2],\n amount: args[3]?.toString()\n };\n\n case 'FundsCascaded':\n return {\n fromContract: args[0],\n toContract: args[1],\n fromHolonId: args[2],\n toHolonId: args[3],\n tokenAddress: args[4],\n amount: args[5]?.toString(),\n splitType: args[6]\n };\n\n case 'FundsAllocated':\n return {\n contractAddress: args[0],\n holonId: args[1],\n userId: args[2],\n tokenAddress: args[3],\n amount: args[4]?.toString(),\n distributionType: args[5]\n };\n\n case 'FundsClaimed':\n return {\n contractAddress: args[0],\n holonId: args[1],\n userId: args[2],\n beneficiary: args[3],\n tokenAddress: args[4],\n amount: args[5]?.toString()\n };\n\n case 'FundsTransferred':\n return {\n contractAddress: args[0],\n holonId: args[1],\n userId: args[2],\n recipient: args[3],\n tokenAddress: args[4],\n amount: args[5]?.toString()\n };\n\n case 'DistributionCompleted':\n return {\n contractAddress: args[0],\n holonId: args[1],\n tokenAddress: args[2],\n totalAmount: args[3]?.toString(),\n recipientCount: Number(args[4]),\n cascadeCount: Number(args[5])\n };\n\n case 'MemberAdded':\n return {\n contractAddress: args[0],\n holonId: args[1],\n userId: args[2],\n addedBy: args[3]\n };\n\n case 'WeightChanged':\n return {\n contractAddress: args[0],\n holonId: args[1],\n userId: args[2],\n oldWeight: args[3]?.toString(),\n newWeight: args[4]?.toString()\n };\n\n case 'ZoneAssigned':\n return {\n contractAddress: args[0],\n holonId: args[1],\n userId: args[2],\n oldZone: args[3]?.toString(),\n newZone: args[4]?.toString()\n };\n\n case 'AppreciationGiven':\n return {\n contractAddress: args[0],\n holonId: args[1],\n fromUserId: args[2],\n toUserId: args[3],\n amount: args[4]?.toString()\n };\n\n default:\n return { raw: args.slice(0, -1) };\n }\n }\n\n /**\n * Update Sankey nodes and links based on event\n */\n _updateSankeyData(event) {\n const { type, data } = event;\n\n switch (type) {\n case 'FundsReceived':\n // Add external source node\n this._ensureNode(data.sender, 'external', 'External');\n this._ensureNode(data.contractAddress, 'contract', event.holonId);\n this.sankeyLinks.push({\n source: data.sender,\n target: data.contractAddress,\n value: BigInt(data.amount),\n token: data.tokenAddress,\n type: 'external_inflow'\n });\n break;\n\n case 'FundsCascaded':\n this._ensureNode(data.fromContract, 'contract', data.fromHolonId);\n this._ensureNode(data.toContract, 'contract', data.toHolonId);\n this.sankeyLinks.push({\n source: data.fromContract,\n target: data.toContract,\n value: BigInt(data.amount),\n token: data.tokenAddress,\n type: 'cascade',\n splitType: data.splitType\n });\n break;\n\n case 'FundsAllocated':\n this._ensureNode(data.contractAddress, 'contract', data.holonId);\n this._ensureNode(data.userId, 'user', data.userId);\n this.sankeyLinks.push({\n source: data.contractAddress,\n target: data.userId,\n value: BigInt(data.amount),\n token: data.tokenAddress,\n type: 'allocation',\n distributionType: data.distributionType\n });\n break;\n\n case 'FundsClaimed':\n case 'FundsTransferred':\n this._ensureNode(data.userId, 'user', data.userId);\n this._ensureNode(data.beneficiary || data.recipient, 'wallet',\n (data.beneficiary || data.recipient).slice(0, 8) + '...');\n this.sankeyLinks.push({\n source: data.userId,\n target: data.beneficiary || data.recipient,\n value: BigInt(data.amount),\n token: data.tokenAddress,\n type: type === 'FundsClaimed' ? 'claim' : 'transfer'\n });\n break;\n\n case 'MemberAdded':\n this._ensureNode(data.userId, 'user', data.userId);\n break;\n }\n }\n\n /**\n * Ensure a node exists in the Sankey graph\n */\n _ensureNode(id, type, label) {\n if (!this.sankeyNodes.has(id)) {\n this.sankeyNodes.set(id, { id, type, label });\n }\n }\n\n /**\n * Get Sankey-compatible data for visualization\n * @param {Object} options - Filter options\n * @returns {Object} { nodes: [], links: [] }\n */\n getSankeyData(options = {}) {\n const { tokenAddress, fromBlock, toBlock, minValue } = options;\n\n let links = [...this.sankeyLinks];\n\n // Filter by token\n if (tokenAddress) {\n links = links.filter(l => l.token === tokenAddress);\n }\n\n // Filter by minimum value\n if (minValue) {\n const minBigInt = BigInt(minValue);\n links = links.filter(l => l.value >= minBigInt);\n }\n\n // Get unique node IDs from filtered links\n const nodeIds = new Set();\n links.forEach(l => {\n nodeIds.add(l.source);\n nodeIds.add(l.target);\n });\n\n // Convert nodes to array format\n const nodeArray = [...nodeIds].map(id => {\n const node = this.sankeyNodes.get(id) || { id, type: 'unknown', label: id };\n return {\n id: node.id,\n name: node.label,\n type: node.type\n };\n });\n\n // Create node index for links\n const nodeIndex = new Map();\n nodeArray.forEach((n, i) => nodeIndex.set(n.id, i));\n\n // Convert links to Sankey format with numeric indices\n const sankeyLinks = links.map(l => ({\n source: nodeIndex.get(l.source),\n target: nodeIndex.get(l.target),\n value: Number(l.value) / 1e18, // Convert from wei to ETH\n type: l.type,\n splitType: l.splitType,\n distributionType: l.distributionType,\n token: l.token\n }));\n\n return {\n nodes: nodeArray,\n links: sankeyLinks\n };\n }\n\n /**\n * Get aggregated flow summary\n * @returns {Object} Summary statistics\n */\n getFlowSummary() {\n const summary = {\n totalInflow: 0n,\n totalOutflow: 0n,\n byHolon: {},\n byUser: {},\n byDistributionType: {\n appreciation: 0n,\n equal: 0n,\n zone: 0n,\n percentage: 0n,\n peer_appreciation: 0n\n }\n };\n\n for (const link of this.sankeyLinks) {\n if (link.type === 'external_inflow') {\n summary.totalInflow += link.value;\n }\n if (link.type === 'claim' || link.type === 'transfer') {\n summary.totalOutflow += link.value;\n }\n if (link.distributionType && summary.byDistributionType[link.distributionType] !== undefined) {\n summary.byDistributionType[link.distributionType] += link.value;\n }\n }\n\n // Convert BigInt to strings for JSON serialization\n return {\n totalInflow: summary.totalInflow.toString(),\n totalOutflow: summary.totalOutflow.toString(),\n totalInflowEth: Number(summary.totalInflow) / 1e18,\n totalOutflowEth: Number(summary.totalOutflow) / 1e18,\n byDistributionType: Object.fromEntries(\n Object.entries(summary.byDistributionType).map(([k, v]) => [k, v.toString()])\n )\n };\n }\n\n /**\n * Query historical events from blockchain\n * @param {Object} contract - ethers.js contract instance\n * @param {string} eventName - Event name to query\n * @param {Object} options - { fromBlock, toBlock }\n */\n async queryPastEvents(contract, eventName, options = {}) {\n const { fromBlock = 0, toBlock = 'latest' } = options;\n\n try {\n const filter = contract.filters[eventName]?.();\n if (!filter) return [];\n\n const events = await contract.queryFilter(filter, fromBlock, toBlock);\n return events.map(e => ({\n type: eventName,\n contractAddress: e.address,\n blockNumber: e.blockNumber,\n transactionHash: e.transactionHash,\n data: this._parseEventData(eventName, e.args)\n }));\n } catch (e) {\n console.error(`Error querying ${eventName}:`, e);\n return [];\n }\n }\n\n /**\n * Build Sankey data from historical events\n * @param {Object} contract - ethers.js contract instance\n * @param {string} holonId - Holon identifier\n * @param {Object} options - Query options\n */\n async buildFromHistory(contract, holonId, options = {}) {\n const eventTypes = [\n 'FundsReceived',\n 'FundsCascaded',\n 'FundsAllocated',\n 'FundsClaimed',\n 'FundsTransferred',\n 'MemberAdded'\n ];\n\n for (const eventName of eventTypes) {\n const events = await this.queryPastEvents(contract, eventName, options);\n for (const event of events) {\n event.holonId = holonId;\n this.eventHistory.push(event);\n this._updateSankeyData(event);\n }\n }\n\n return this.getSankeyData();\n }\n\n /**\n * Clear all stored data\n */\n clear() {\n this.eventHistory = [];\n this.sankeyNodes.clear();\n this.sankeyLinks = [];\n }\n\n /**\n * Export data for persistence\n */\n export() {\n return {\n events: this.eventHistory,\n nodes: Object.fromEntries(this.sankeyNodes),\n links: this.sankeyLinks.map(l => ({\n ...l,\n value: l.value.toString()\n }))\n };\n }\n\n /**\n * Import previously exported data\n */\n import(data) {\n this.eventHistory = data.events || [];\n this.sankeyNodes = new Map(Object.entries(data.nodes || {}));\n this.sankeyLinks = (data.links || []).map(l => ({\n ...l,\n value: BigInt(l.value)\n }));\n }\n}\n\nexport default EventListener;\n","/* Do NOT modify this file; see /src.ts/_admin/update-version.ts */\n/**\n * The current version of Ethers.\n */\nexport const version = \"6.16.0\";\n//# sourceMappingURL=_version.js.map","/**\n * Property helper functions.\n *\n * @_subsection api/utils:Properties [about-properties]\n */\nfunction checkType(value, type, name) {\n const types = type.split(\"|\").map(t => t.trim());\n for (let i = 0; i < types.length; i++) {\n switch (type) {\n case \"any\":\n return;\n case \"bigint\":\n case \"boolean\":\n case \"number\":\n case \"string\":\n if (typeof (value) === type) {\n return;\n }\n }\n }\n const error = new Error(`invalid value for type ${type}`);\n error.code = \"INVALID_ARGUMENT\";\n error.argument = `value.${name}`;\n error.value = value;\n throw error;\n}\n/**\n * Resolves to a new object that is a copy of %%value%%, but with all\n * values resolved.\n */\nexport async function resolveProperties(value) {\n const keys = Object.keys(value);\n const results = await Promise.all(keys.map((k) => Promise.resolve(value[k])));\n return results.reduce((accum, v, index) => {\n accum[keys[index]] = v;\n return accum;\n }, {});\n}\n/**\n * Assigns the %%values%% to %%target%% as read-only values.\n *\n * It %%types%% is specified, the values are checked.\n */\nexport function defineProperties(target, values, types) {\n for (let key in values) {\n let value = values[key];\n const type = (types ? types[key] : null);\n if (type) {\n checkType(value, type, key);\n }\n Object.defineProperty(target, key, { enumerable: true, value, writable: false });\n }\n}\n//# sourceMappingURL=properties.js.map","/**\n * All errors in ethers include properties to ensure they are both\n * human-readable (i.e. ``.message``) and machine-readable (i.e. ``.code``).\n *\n * The [[isError]] function can be used to check the error ``code`` and\n * provide a type guard for the properties present on that error interface.\n *\n * @_section: api/utils/errors:Errors [about-errors]\n */\nimport { version } from \"../_version.js\";\nimport { defineProperties } from \"./properties.js\";\nfunction stringify(value, seen) {\n if (value == null) {\n return \"null\";\n }\n if (seen == null) {\n seen = new Set();\n }\n if (typeof (value) === \"object\") {\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n }\n if (Array.isArray(value)) {\n return \"[ \" + (value.map((v) => stringify(v, seen))).join(\", \") + \" ]\";\n }\n if (value instanceof Uint8Array) {\n const HEX = \"0123456789abcdef\";\n let result = \"0x\";\n for (let i = 0; i < value.length; i++) {\n result += HEX[value[i] >> 4];\n result += HEX[value[i] & 0xf];\n }\n return result;\n }\n if (typeof (value) === \"object\" && typeof (value.toJSON) === \"function\") {\n return stringify(value.toJSON(), seen);\n }\n switch (typeof (value)) {\n case \"boolean\":\n case \"number\":\n case \"symbol\":\n return value.toString();\n case \"bigint\":\n return BigInt(value).toString();\n case \"string\":\n return JSON.stringify(value);\n case \"object\": {\n const keys = Object.keys(value);\n keys.sort();\n return \"{ \" + keys.map((k) => `${stringify(k, seen)}: ${stringify(value[k], seen)}`).join(\", \") + \" }\";\n }\n }\n return `[ COULD NOT SERIALIZE ]`;\n}\n/**\n * Returns true if the %%error%% matches an error thrown by ethers\n * that matches the error %%code%%.\n *\n * In TypeScript environments, this can be used to check that %%error%%\n * matches an EthersError type, which means the expected properties will\n * be set.\n *\n * @See [ErrorCodes](api:ErrorCode)\n * @example\n * try {\n * // code....\n * } catch (e) {\n * if (isError(e, \"CALL_EXCEPTION\")) {\n * // The Type Guard has validated this object\n * console.log(e.data);\n * }\n * }\n */\nexport function isError(error, code) {\n return (error && error.code === code);\n}\n/**\n * Returns true if %%error%% is a [[CallExceptionError].\n */\nexport function isCallException(error) {\n return isError(error, \"CALL_EXCEPTION\");\n}\n/**\n * Returns a new Error configured to the format ethers emits errors, with\n * the %%message%%, [[api:ErrorCode]] %%code%% and additional properties\n * for the corresponding EthersError.\n *\n * Each error in ethers includes the version of ethers, a\n * machine-readable [[ErrorCode]], and depending on %%code%%, additional\n * required properties. The error message will also include the %%message%%,\n * ethers version, %%code%% and all additional properties, serialized.\n */\nexport function makeError(message, code, info) {\n let shortMessage = message;\n {\n const details = [];\n if (info) {\n if (\"message\" in info || \"code\" in info || \"name\" in info) {\n throw new Error(`value will overwrite populated values: ${stringify(info)}`);\n }\n for (const key in info) {\n if (key === \"shortMessage\") {\n continue;\n }\n const value = (info[key]);\n // try {\n details.push(key + \"=\" + stringify(value));\n // } catch (error: any) {\n // console.log(\"MMM\", error.message);\n // details.push(key + \"=[could not serialize object]\");\n // }\n }\n }\n details.push(`code=${code}`);\n details.push(`version=${version}`);\n if (details.length) {\n message += \" (\" + details.join(\", \") + \")\";\n }\n }\n let error;\n switch (code) {\n case \"INVALID_ARGUMENT\":\n error = new TypeError(message);\n break;\n case \"NUMERIC_FAULT\":\n case \"BUFFER_OVERRUN\":\n error = new RangeError(message);\n break;\n default:\n error = new Error(message);\n }\n defineProperties(error, { code });\n if (info) {\n Object.assign(error, info);\n }\n if (error.shortMessage == null) {\n defineProperties(error, { shortMessage });\n }\n return error;\n}\n/**\n * Throws an EthersError with %%message%%, %%code%% and additional error\n * %%info%% when %%check%% is falsish..\n *\n * @see [[api:makeError]]\n */\nexport function assert(check, message, code, info) {\n if (!check) {\n throw makeError(message, code, info);\n }\n}\n/**\n * A simple helper to simply ensuring provided arguments match expected\n * constraints, throwing if not.\n *\n * In TypeScript environments, the %%check%% has been asserted true, so\n * any further code does not need additional compile-time checks.\n */\nexport function assertArgument(check, message, name, value) {\n assert(check, message, \"INVALID_ARGUMENT\", { argument: name, value: value });\n}\nexport function assertArgumentCount(count, expectedCount, message) {\n if (message == null) {\n message = \"\";\n }\n if (message) {\n message = \": \" + message;\n }\n assert(count >= expectedCount, \"missing argument\" + message, \"MISSING_ARGUMENT\", {\n count: count,\n expectedCount: expectedCount\n });\n assert(count <= expectedCount, \"too many arguments\" + message, \"UNEXPECTED_ARGUMENT\", {\n count: count,\n expectedCount: expectedCount\n });\n}\nconst _normalizeForms = [\"NFD\", \"NFC\", \"NFKD\", \"NFKC\"].reduce((accum, form) => {\n try {\n // General test for normalize\n /* c8 ignore start */\n if (\"test\".normalize(form) !== \"test\") {\n throw new Error(\"bad\");\n }\n ;\n /* c8 ignore stop */\n if (form === \"NFD\") {\n const check = String.fromCharCode(0xe9).normalize(\"NFD\");\n const expected = String.fromCharCode(0x65, 0x0301);\n /* c8 ignore start */\n if (check !== expected) {\n throw new Error(\"broken\");\n }\n /* c8 ignore stop */\n }\n accum.push(form);\n }\n catch (error) { }\n return accum;\n}, []);\n/**\n * Throws if the normalization %%form%% is not supported.\n */\nexport function assertNormalize(form) {\n assert(_normalizeForms.indexOf(form) >= 0, \"platform missing String.prototype.normalize\", \"UNSUPPORTED_OPERATION\", {\n operation: \"String.prototype.normalize\", info: { form }\n });\n}\n/**\n * Many classes use file-scoped values to guard the constructor,\n * making it effectively private. This facilitates that pattern\n * by ensuring the %%givenGaurd%% matches the file-scoped %%guard%%,\n * throwing if not, indicating the %%className%% if provided.\n */\nexport function assertPrivate(givenGuard, guard, className) {\n if (className == null) {\n className = \"\";\n }\n if (givenGuard !== guard) {\n let method = className, operation = \"new\";\n if (className) {\n method += \".\";\n operation += \" \" + className;\n }\n assert(false, `private constructor; use ${method}from* methods`, \"UNSUPPORTED_OPERATION\", {\n operation\n });\n }\n}\n//# sourceMappingURL=errors.js.map","/**\n * Some data helpers.\n *\n *\n * @_subsection api/utils:Data Helpers [about-data]\n */\nimport { assert, assertArgument } from \"./errors.js\";\nfunction _getBytes(value, name, copy) {\n if (value instanceof Uint8Array) {\n if (copy) {\n return new Uint8Array(value);\n }\n return value;\n }\n if (typeof (value) === \"string\" && (value.length % 2) === 0 &&\n value.match(/^0x[0-9a-f]*$/i)) {\n const result = new Uint8Array((value.length - 2) / 2);\n let offset = 2;\n for (let i = 0; i < result.length; i++) {\n result[i] = parseInt(value.substring(offset, offset + 2), 16);\n offset += 2;\n }\n return result;\n }\n assertArgument(false, \"invalid BytesLike value\", name || \"value\", value);\n}\n/**\n * Get a typed Uint8Array for %%value%%. If already a Uint8Array\n * the original %%value%% is returned; if a copy is required use\n * [[getBytesCopy]].\n *\n * @see: getBytesCopy\n */\nexport function getBytes(value, name) {\n return _getBytes(value, name, false);\n}\n/**\n * Get a typed Uint8Array for %%value%%, creating a copy if necessary\n * to prevent any modifications of the returned value from being\n * reflected elsewhere.\n *\n * @see: getBytes\n */\nexport function getBytesCopy(value, name) {\n return _getBytes(value, name, true);\n}\n/**\n * Returns true if %%value%% is a valid [[HexString]].\n *\n * If %%length%% is ``true`` or a //number//, it also checks that\n * %%value%% is a valid [[DataHexString]] of %%length%% (if a //number//)\n * bytes of data (e.g. ``0x1234`` is 2 bytes).\n */\nexport function isHexString(value, length) {\n if (typeof (value) !== \"string\" || !value.match(/^0x[0-9A-Fa-f]*$/)) {\n return false;\n }\n if (typeof (length) === \"number\" && value.length !== 2 + 2 * length) {\n return false;\n }\n if (length === true && (value.length % 2) !== 0) {\n return false;\n }\n return true;\n}\n/**\n * Returns true if %%value%% is a valid representation of arbitrary\n * data (i.e. a valid [[DataHexString]] or a Uint8Array).\n */\nexport function isBytesLike(value) {\n return (isHexString(value, true) || (value instanceof Uint8Array));\n}\nconst HexCharacters = \"0123456789abcdef\";\n/**\n * Returns a [[DataHexString]] representation of %%data%%.\n */\nexport function hexlify(data) {\n const bytes = getBytes(data);\n let result = \"0x\";\n for (let i = 0; i < bytes.length; i++) {\n const v = bytes[i];\n result += HexCharacters[(v & 0xf0) >> 4] + HexCharacters[v & 0x0f];\n }\n return result;\n}\n/**\n * Returns a [[DataHexString]] by concatenating all values\n * within %%data%%.\n */\nexport function concat(datas) {\n return \"0x\" + datas.map((d) => hexlify(d).substring(2)).join(\"\");\n}\n/**\n * Returns the length of %%data%%, in bytes.\n */\nexport function dataLength(data) {\n if (isHexString(data, true)) {\n return (data.length - 2) / 2;\n }\n return getBytes(data).length;\n}\n/**\n * Returns a [[DataHexString]] by slicing %%data%% from the %%start%%\n * offset to the %%end%% offset.\n *\n * By default %%start%% is 0 and %%end%% is the length of %%data%%.\n */\nexport function dataSlice(data, start, end) {\n const bytes = getBytes(data);\n if (end != null && end > bytes.length) {\n assert(false, \"cannot slice beyond data bounds\", \"BUFFER_OVERRUN\", {\n buffer: bytes, length: bytes.length, offset: end\n });\n }\n return hexlify(bytes.slice((start == null) ? 0 : start, (end == null) ? bytes.length : end));\n}\n/**\n * Return the [[DataHexString]] result by stripping all **leading**\n ** zero bytes from %%data%%.\n */\nexport function stripZerosLeft(data) {\n let bytes = hexlify(data).substring(2);\n while (bytes.startsWith(\"00\")) {\n bytes = bytes.substring(2);\n }\n return \"0x\" + bytes;\n}\nfunction zeroPad(data, length, left) {\n const bytes = getBytes(data);\n assert(length >= bytes.length, \"padding exceeds data length\", \"BUFFER_OVERRUN\", {\n buffer: new Uint8Array(bytes),\n length: length,\n offset: length + 1\n });\n const result = new Uint8Array(length);\n result.fill(0);\n if (left) {\n result.set(bytes, length - bytes.length);\n }\n else {\n result.set(bytes, 0);\n }\n return hexlify(result);\n}\n/**\n * Return the [[DataHexString]] of %%data%% padded on the **left**\n * to %%length%% bytes.\n *\n * If %%data%% already exceeds %%length%%, a [[BufferOverrunError]] is\n * thrown.\n *\n * This pads data the same as **values** are in Solidity\n * (e.g. ``uint128``).\n */\nexport function zeroPadValue(data, length) {\n return zeroPad(data, length, true);\n}\n/**\n * Return the [[DataHexString]] of %%data%% padded on the **right**\n * to %%length%% bytes.\n *\n * If %%data%% already exceeds %%length%%, a [[BufferOverrunError]] is\n * thrown.\n *\n * This pads data the same as **bytes** are in Solidity\n * (e.g. ``bytes16``).\n */\nexport function zeroPadBytes(data, length) {\n return zeroPad(data, length, false);\n}\n//# sourceMappingURL=data.js.map","/**\n * Some mathematic operations.\n *\n * @_subsection: api/utils:Math Helpers [about-maths]\n */\nimport { hexlify, isBytesLike } from \"./data.js\";\nimport { assert, assertArgument } from \"./errors.js\";\nconst BN_0 = BigInt(0);\nconst BN_1 = BigInt(1);\n//const BN_Max256 = (BN_1 << BigInt(256)) - BN_1;\n// IEEE 754 support 53-bits of mantissa\nconst maxValue = 0x1fffffffffffff;\n/**\n * Convert %%value%% from a twos-compliment representation of %%width%%\n * bits to its value.\n *\n * If the highest bit is ``1``, the result will be negative.\n */\nexport function fromTwos(_value, _width) {\n const value = getUint(_value, \"value\");\n const width = BigInt(getNumber(_width, \"width\"));\n assert((value >> width) === BN_0, \"overflow\", \"NUMERIC_FAULT\", {\n operation: \"fromTwos\", fault: \"overflow\", value: _value\n });\n // Top bit set; treat as a negative value\n if (value >> (width - BN_1)) {\n const mask = (BN_1 << width) - BN_1;\n return -(((~value) & mask) + BN_1);\n }\n return value;\n}\n/**\n * Convert %%value%% to a twos-compliment representation of\n * %%width%% bits.\n *\n * The result will always be positive.\n */\nexport function toTwos(_value, _width) {\n let value = getBigInt(_value, \"value\");\n const width = BigInt(getNumber(_width, \"width\"));\n const limit = (BN_1 << (width - BN_1));\n if (value < BN_0) {\n value = -value;\n assert(value <= limit, \"too low\", \"NUMERIC_FAULT\", {\n operation: \"toTwos\", fault: \"overflow\", value: _value\n });\n const mask = (BN_1 << width) - BN_1;\n return ((~value) & mask) + BN_1;\n }\n else {\n assert(value < limit, \"too high\", \"NUMERIC_FAULT\", {\n operation: \"toTwos\", fault: \"overflow\", value: _value\n });\n }\n return value;\n}\n/**\n * Mask %%value%% with a bitmask of %%bits%% ones.\n */\nexport function mask(_value, _bits) {\n const value = getUint(_value, \"value\");\n const bits = BigInt(getNumber(_bits, \"bits\"));\n return value & ((BN_1 << bits) - BN_1);\n}\n/**\n * Gets a BigInt from %%value%%. If it is an invalid value for\n * a BigInt, then an ArgumentError will be thrown for %%name%%.\n */\nexport function getBigInt(value, name) {\n switch (typeof (value)) {\n case \"bigint\": return value;\n case \"number\":\n assertArgument(Number.isInteger(value), \"underflow\", name || \"value\", value);\n assertArgument(value >= -maxValue && value <= maxValue, \"overflow\", name || \"value\", value);\n return BigInt(value);\n case \"string\":\n try {\n if (value === \"\") {\n throw new Error(\"empty string\");\n }\n if (value[0] === \"-\" && value[1] !== \"-\") {\n return -BigInt(value.substring(1));\n }\n return BigInt(value);\n }\n catch (e) {\n assertArgument(false, `invalid BigNumberish string: ${e.message}`, name || \"value\", value);\n }\n }\n assertArgument(false, \"invalid BigNumberish value\", name || \"value\", value);\n}\n/**\n * Returns %%value%% as a bigint, validating it is valid as a bigint\n * value and that it is positive.\n */\nexport function getUint(value, name) {\n const result = getBigInt(value, name);\n assert(result >= BN_0, \"unsigned value cannot be negative\", \"NUMERIC_FAULT\", {\n fault: \"overflow\", operation: \"getUint\", value\n });\n return result;\n}\nconst Nibbles = \"0123456789abcdef\";\n/*\n * Converts %%value%% to a BigInt. If %%value%% is a Uint8Array, it\n * is treated as Big Endian data.\n */\nexport function toBigInt(value) {\n if (value instanceof Uint8Array) {\n let result = \"0x0\";\n for (const v of value) {\n result += Nibbles[v >> 4];\n result += Nibbles[v & 0x0f];\n }\n return BigInt(result);\n }\n return getBigInt(value);\n}\n/**\n * Gets a //number// from %%value%%. If it is an invalid value for\n * a //number//, then an ArgumentError will be thrown for %%name%%.\n */\nexport function getNumber(value, name) {\n switch (typeof (value)) {\n case \"bigint\":\n assertArgument(value >= -maxValue && value <= maxValue, \"overflow\", name || \"value\", value);\n return Number(value);\n case \"number\":\n assertArgument(Number.isInteger(value), \"underflow\", name || \"value\", value);\n assertArgument(value >= -maxValue && value <= maxValue, \"overflow\", name || \"value\", value);\n return value;\n case \"string\":\n try {\n if (value === \"\") {\n throw new Error(\"empty string\");\n }\n return getNumber(BigInt(value), name);\n }\n catch (e) {\n assertArgument(false, `invalid numeric string: ${e.message}`, name || \"value\", value);\n }\n }\n assertArgument(false, \"invalid numeric value\", name || \"value\", value);\n}\n/**\n * Converts %%value%% to a number. If %%value%% is a Uint8Array, it\n * is treated as Big Endian data. Throws if the value is not safe.\n */\nexport function toNumber(value) {\n return getNumber(toBigInt(value));\n}\n/**\n * Converts %%value%% to a Big Endian hexstring, optionally padded to\n * %%width%% bytes.\n */\nexport function toBeHex(_value, _width) {\n const value = getUint(_value, \"value\");\n let result = value.toString(16);\n if (_width == null) {\n // Ensure the value is of even length\n if (result.length % 2) {\n result = \"0\" + result;\n }\n }\n else {\n const width = getNumber(_width, \"width\");\n // Special case when both value and width are 0 (see: #5025)\n if (width === 0 && value === BN_0) {\n return \"0x\";\n }\n assert(width * 2 >= result.length, `value exceeds width (${width} bytes)`, \"NUMERIC_FAULT\", {\n operation: \"toBeHex\",\n fault: \"overflow\",\n value: _value\n });\n // Pad the value to the required width\n while (result.length < (width * 2)) {\n result = \"0\" + result;\n }\n }\n return \"0x\" + result;\n}\n/**\n * Converts %%value%% to a Big Endian Uint8Array.\n */\nexport function toBeArray(_value, _width) {\n const value = getUint(_value, \"value\");\n if (value === BN_0) {\n const width = (_width != null) ? getNumber(_width, \"width\") : 0;\n return new Uint8Array(width);\n }\n let hex = value.toString(16);\n if (hex.length % 2) {\n hex = \"0\" + hex;\n }\n if (_width != null) {\n const width = getNumber(_width, \"width\");\n while (hex.length < (width * 2)) {\n hex = \"00\" + hex;\n }\n assert((width * 2) === hex.length, `value exceeds width (${width} bytes)`, \"NUMERIC_FAULT\", {\n operation: \"toBeArray\",\n fault: \"overflow\",\n value: _value\n });\n }\n const result = new Uint8Array(hex.length / 2);\n for (let i = 0; i < result.length; i++) {\n const offset = i * 2;\n result[i] = parseInt(hex.substring(offset, offset + 2), 16);\n }\n return result;\n}\n/**\n * Returns a [[HexString]] for %%value%% safe to use as a //Quantity//.\n *\n * A //Quantity// does not have and leading 0 values unless the value is\n * the literal value `0x0`. This is most commonly used for JSSON-RPC\n * numeric values.\n */\nexport function toQuantity(value) {\n let result = hexlify(isBytesLike(value) ? value : toBeArray(value)).substring(2);\n while (result.startsWith(\"0\")) {\n result = result.substring(1);\n }\n if (result === \"\") {\n result = \"0\";\n }\n return \"0x\" + result;\n}\n//# sourceMappingURL=maths.js.map","/**\n * Events allow for applications to use the observer pattern, which\n * allows subscribing and publishing events, outside the normal\n * execution paths.\n *\n * @_section api/utils/events:Events [about-events]\n */\nimport { defineProperties } from \"./properties.js\";\n/**\n * When an [[EventEmitterable]] triggers a [[Listener]], the\n * callback always ahas one additional argument passed, which is\n * an **EventPayload**.\n */\nexport class EventPayload {\n /**\n * The event filter.\n */\n filter;\n /**\n * The **EventEmitterable**.\n */\n emitter;\n #listener;\n /**\n * Create a new **EventPayload** for %%emitter%% with\n * the %%listener%% and for %%filter%%.\n */\n constructor(emitter, listener, filter) {\n this.#listener = listener;\n defineProperties(this, { emitter, filter });\n }\n /**\n * Unregister the triggered listener for future events.\n */\n async removeListener() {\n if (this.#listener == null) {\n return;\n }\n await this.emitter.off(this.filter, this.#listener);\n }\n}\n//# sourceMappingURL=events.js.map","/**\n * Using strings in Ethereum (or any security-basd system) requires\n * additional care. These utilities attempt to mitigate some of the\n * safety issues as well as provide the ability to recover and analyse\n * strings.\n *\n * @_subsection api/utils:Strings and UTF-8 [about-strings]\n */\nimport { getBytes } from \"./data.js\";\nimport { assertArgument, assertNormalize } from \"./errors.js\";\nfunction errorFunc(reason, offset, bytes, output, badCodepoint) {\n assertArgument(false, `invalid codepoint at offset ${offset}; ${reason}`, \"bytes\", bytes);\n}\nfunction ignoreFunc(reason, offset, bytes, output, badCodepoint) {\n // If there is an invalid prefix (including stray continuation), skip any additional continuation bytes\n if (reason === \"BAD_PREFIX\" || reason === \"UNEXPECTED_CONTINUE\") {\n let i = 0;\n for (let o = offset + 1; o < bytes.length; o++) {\n if (bytes[o] >> 6 !== 0x02) {\n break;\n }\n i++;\n }\n return i;\n }\n // This byte runs us past the end of the string, so just jump to the end\n // (but the first byte was read already read and therefore skipped)\n if (reason === \"OVERRUN\") {\n return bytes.length - offset - 1;\n }\n // Nothing to skip\n return 0;\n}\nfunction replaceFunc(reason, offset, bytes, output, badCodepoint) {\n // Overlong representations are otherwise \"valid\" code points; just non-deistingtished\n if (reason === \"OVERLONG\") {\n assertArgument(typeof (badCodepoint) === \"number\", \"invalid bad code point for replacement\", \"badCodepoint\", badCodepoint);\n output.push(badCodepoint);\n return 0;\n }\n // Put the replacement character into the output\n output.push(0xfffd);\n // Otherwise, process as if ignoring errors\n return ignoreFunc(reason, offset, bytes, output, badCodepoint);\n}\n/**\n * A handful of popular, built-in UTF-8 error handling strategies.\n *\n * **``\"error\"``** - throws on ANY illegal UTF-8 sequence or\n * non-canonical (overlong) codepoints (this is the default)\n *\n * **``\"ignore\"``** - silently drops any illegal UTF-8 sequence\n * and accepts non-canonical (overlong) codepoints\n *\n * **``\"replace\"``** - replace any illegal UTF-8 sequence with the\n * UTF-8 replacement character (i.e. ``\"\\\\ufffd\"``) and accepts\n * non-canonical (overlong) codepoints\n *\n * @returns: Record<\"error\" | \"ignore\" | \"replace\", Utf8ErrorFunc>\n */\nexport const Utf8ErrorFuncs = Object.freeze({\n error: errorFunc,\n ignore: ignoreFunc,\n replace: replaceFunc\n});\n// http://stackoverflow.com/questions/13356493/decode-utf-8-with-javascript#13691499\nfunction getUtf8CodePoints(_bytes, onError) {\n if (onError == null) {\n onError = Utf8ErrorFuncs.error;\n }\n const bytes = getBytes(_bytes, \"bytes\");\n const result = [];\n let i = 0;\n // Invalid bytes are ignored\n while (i < bytes.length) {\n const c = bytes[i++];\n // 0xxx xxxx\n if (c >> 7 === 0) {\n result.push(c);\n continue;\n }\n // Multibyte; how many bytes left for this character?\n let extraLength = null;\n let overlongMask = null;\n // 110x xxxx 10xx xxxx\n if ((c & 0xe0) === 0xc0) {\n extraLength = 1;\n overlongMask = 0x7f;\n // 1110 xxxx 10xx xxxx 10xx xxxx\n }\n else if ((c & 0xf0) === 0xe0) {\n extraLength = 2;\n overlongMask = 0x7ff;\n // 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx\n }\n else if ((c & 0xf8) === 0xf0) {\n extraLength = 3;\n overlongMask = 0xffff;\n }\n else {\n if ((c & 0xc0) === 0x80) {\n i += onError(\"UNEXPECTED_CONTINUE\", i - 1, bytes, result);\n }\n else {\n i += onError(\"BAD_PREFIX\", i - 1, bytes, result);\n }\n continue;\n }\n // Do we have enough bytes in our data?\n if (i - 1 + extraLength >= bytes.length) {\n i += onError(\"OVERRUN\", i - 1, bytes, result);\n continue;\n }\n // Remove the length prefix from the char\n let res = c & ((1 << (8 - extraLength - 1)) - 1);\n for (let j = 0; j < extraLength; j++) {\n let nextChar = bytes[i];\n // Invalid continuation byte\n if ((nextChar & 0xc0) != 0x80) {\n i += onError(\"MISSING_CONTINUE\", i, bytes, result);\n res = null;\n break;\n }\n ;\n res = (res << 6) | (nextChar & 0x3f);\n i++;\n }\n // See above loop for invalid continuation byte\n if (res === null) {\n continue;\n }\n // Maximum code point\n if (res > 0x10ffff) {\n i += onError(\"OUT_OF_RANGE\", i - 1 - extraLength, bytes, result, res);\n continue;\n }\n // Reserved for UTF-16 surrogate halves\n if (res >= 0xd800 && res <= 0xdfff) {\n i += onError(\"UTF16_SURROGATE\", i - 1 - extraLength, bytes, result, res);\n continue;\n }\n // Check for overlong sequences (more bytes than needed)\n if (res <= overlongMask) {\n i += onError(\"OVERLONG\", i - 1 - extraLength, bytes, result, res);\n continue;\n }\n result.push(res);\n }\n return result;\n}\n// http://stackoverflow.com/questions/18729405/how-to-convert-utf8-string-to-byte-array\n/**\n * Returns the UTF-8 byte representation of %%str%%.\n *\n * If %%form%% is specified, the string is normalized.\n */\nexport function toUtf8Bytes(str, form) {\n assertArgument(typeof (str) === \"string\", \"invalid string value\", \"str\", str);\n if (form != null) {\n assertNormalize(form);\n str = str.normalize(form);\n }\n let result = [];\n for (let i = 0; i < str.length; i++) {\n const c = str.charCodeAt(i);\n if (c < 0x80) {\n result.push(c);\n }\n else if (c < 0x800) {\n result.push((c >> 6) | 0xc0);\n result.push((c & 0x3f) | 0x80);\n }\n else if ((c & 0xfc00) == 0xd800) {\n i++;\n const c2 = str.charCodeAt(i);\n assertArgument(i < str.length && ((c2 & 0xfc00) === 0xdc00), \"invalid surrogate pair\", \"str\", str);\n // Surrogate Pair\n const pair = 0x10000 + ((c & 0x03ff) << 10) + (c2 & 0x03ff);\n result.push((pair >> 18) | 0xf0);\n result.push(((pair >> 12) & 0x3f) | 0x80);\n result.push(((pair >> 6) & 0x3f) | 0x80);\n result.push((pair & 0x3f) | 0x80);\n }\n else {\n result.push((c >> 12) | 0xe0);\n result.push(((c >> 6) & 0x3f) | 0x80);\n result.push((c & 0x3f) | 0x80);\n }\n }\n return new Uint8Array(result);\n}\n;\n//export \nfunction _toUtf8String(codePoints) {\n return codePoints.map((codePoint) => {\n if (codePoint <= 0xffff) {\n return String.fromCharCode(codePoint);\n }\n codePoint -= 0x10000;\n return String.fromCharCode((((codePoint >> 10) & 0x3ff) + 0xd800), ((codePoint & 0x3ff) + 0xdc00));\n }).join(\"\");\n}\n/**\n * Returns the string represented by the UTF-8 data %%bytes%%.\n *\n * When %%onError%% function is specified, it is called on UTF-8\n * errors allowing recovery using the [[Utf8ErrorFunc]] API.\n * (default: [error](Utf8ErrorFuncs))\n */\nexport function toUtf8String(bytes, onError) {\n return _toUtf8String(getUtf8CodePoints(bytes, onError));\n}\n/**\n * Returns the UTF-8 code-points for %%str%%.\n *\n * If %%form%% is specified, the string is normalized.\n */\nexport function toUtf8CodePoints(str, form) {\n return getUtf8CodePoints(toUtf8Bytes(str, form));\n}\n//# sourceMappingURL=utf8.js.map","/**\n * The **FixedNumber** class permits using values with decimal places,\n * using fixed-pont math.\n *\n * Fixed-point math is still based on integers under-the-hood, but uses an\n * internal offset to store fractional components below, and each operation\n * corrects for this after each operation.\n *\n * @_section: api/utils/fixed-point-math:Fixed-Point Maths [about-fixed-point-math]\n */\nimport { getBytes } from \"./data.js\";\nimport { assert, assertArgument, assertPrivate } from \"./errors.js\";\nimport { getBigInt, getNumber, fromTwos, mask, toBigInt } from \"./maths.js\";\nimport { defineProperties } from \"./properties.js\";\nconst BN_N1 = BigInt(-1);\nconst BN_0 = BigInt(0);\nconst BN_1 = BigInt(1);\nconst BN_5 = BigInt(5);\nconst _guard = {};\n// Constant to pull zeros from for multipliers\nlet Zeros = \"0000\";\nwhile (Zeros.length < 80) {\n Zeros += Zeros;\n}\n// Returns a string \"1\" followed by decimal \"0\"s\nfunction getTens(decimals) {\n let result = Zeros;\n while (result.length < decimals) {\n result += result;\n }\n return BigInt(\"1\" + result.substring(0, decimals));\n}\nfunction checkValue(val, format, safeOp) {\n const width = BigInt(format.width);\n if (format.signed) {\n const limit = (BN_1 << (width - BN_1));\n assert(safeOp == null || (val >= -limit && val < limit), \"overflow\", \"NUMERIC_FAULT\", {\n operation: safeOp, fault: \"overflow\", value: val\n });\n if (val > BN_0) {\n val = fromTwos(mask(val, width), width);\n }\n else {\n val = -fromTwos(mask(-val, width), width);\n }\n }\n else {\n const limit = (BN_1 << width);\n assert(safeOp == null || (val >= 0 && val < limit), \"overflow\", \"NUMERIC_FAULT\", {\n operation: safeOp, fault: \"overflow\", value: val\n });\n val = (((val % limit) + limit) % limit) & (limit - BN_1);\n }\n return val;\n}\nfunction getFormat(value) {\n if (typeof (value) === \"number\") {\n value = `fixed128x${value}`;\n }\n let signed = true;\n let width = 128;\n let decimals = 18;\n if (typeof (value) === \"string\") {\n // Parse the format string\n if (value === \"fixed\") {\n // defaults...\n }\n else if (value === \"ufixed\") {\n signed = false;\n }\n else {\n const match = value.match(/^(u?)fixed([0-9]+)x([0-9]+)$/);\n assertArgument(match, \"invalid fixed format\", \"format\", value);\n signed = (match[1] !== \"u\");\n width = parseInt(match[2]);\n decimals = parseInt(match[3]);\n }\n }\n else if (value) {\n // Extract the values from the object\n const v = value;\n const check = (key, type, defaultValue) => {\n if (v[key] == null) {\n return defaultValue;\n }\n assertArgument(typeof (v[key]) === type, \"invalid fixed format (\" + key + \" not \" + type + \")\", \"format.\" + key, v[key]);\n return v[key];\n };\n signed = check(\"signed\", \"boolean\", signed);\n width = check(\"width\", \"number\", width);\n decimals = check(\"decimals\", \"number\", decimals);\n }\n assertArgument((width % 8) === 0, \"invalid FixedNumber width (not byte aligned)\", \"format.width\", width);\n assertArgument(decimals <= 80, \"invalid FixedNumber decimals (too large)\", \"format.decimals\", decimals);\n const name = (signed ? \"\" : \"u\") + \"fixed\" + String(width) + \"x\" + String(decimals);\n return { signed, width, decimals, name };\n}\nfunction toString(val, decimals) {\n let negative = \"\";\n if (val < BN_0) {\n negative = \"-\";\n val *= BN_N1;\n }\n let str = val.toString();\n // No decimal point for whole values\n if (decimals === 0) {\n return (negative + str);\n }\n // Pad out to the whole component (including a whole digit)\n while (str.length <= decimals) {\n str = Zeros + str;\n }\n // Insert the decimal point\n const index = str.length - decimals;\n str = str.substring(0, index) + \".\" + str.substring(index);\n // Trim the whole component (leaving at least one 0)\n while (str[0] === \"0\" && str[1] !== \".\") {\n str = str.substring(1);\n }\n // Trim the decimal component (leaving at least one 0)\n while (str[str.length - 1] === \"0\" && str[str.length - 2] !== \".\") {\n str = str.substring(0, str.length - 1);\n }\n return (negative + str);\n}\n/**\n * A FixedNumber represents a value over its [[FixedFormat]]\n * arithmetic field.\n *\n * A FixedNumber can be used to perform math, losslessly, on\n * values which have decmial places.\n *\n * A FixedNumber has a fixed bit-width to store values in, and stores all\n * values internally by multiplying the value by 10 raised to the power of\n * %%decimals%%.\n *\n * If operations are performed that cause a value to grow too high (close to\n * positive infinity) or too low (close to negative infinity), the value\n * is said to //overflow//.\n *\n * For example, an 8-bit signed value, with 0 decimals may only be within\n * the range ``-128`` to ``127``; so ``-128 - 1`` will overflow and become\n * ``127``. Likewise, ``127 + 1`` will overflow and become ``-127``.\n *\n * Many operation have a normal and //unsafe// variant. The normal variant\n * will throw a [[NumericFaultError]] on any overflow, while the //unsafe//\n * variant will silently allow overflow, corrupting its value value.\n *\n * If operations are performed that cause a value to become too small\n * (close to zero), the value loses precison and is said to //underflow//.\n *\n * For example, a value with 1 decimal place may store a number as small\n * as ``0.1``, but the value of ``0.1 / 2`` is ``0.05``, which cannot fit\n * into 1 decimal place, so underflow occurs which means precision is lost\n * and the value becomes ``0``.\n *\n * Some operations have a normal and //signalling// variant. The normal\n * variant will silently ignore underflow, while the //signalling// variant\n * will thow a [[NumericFaultError]] on underflow.\n */\nexport class FixedNumber {\n /**\n * The specific fixed-point arithmetic field for this value.\n */\n format;\n #format;\n // The actual value (accounting for decimals)\n #val;\n // A base-10 value to multiple values by to maintain the magnitude\n #tens;\n /**\n * This is a property so console.log shows a human-meaningful value.\n *\n * @private\n */\n _value;\n // Use this when changing this file to get some typing info,\n // but then switch to any to mask the internal type\n //constructor(guard: any, value: bigint, format: _FixedFormat) {\n /**\n * @private\n */\n constructor(guard, value, format) {\n assertPrivate(guard, _guard, \"FixedNumber\");\n this.#val = value;\n this.#format = format;\n const _value = toString(value, format.decimals);\n defineProperties(this, { format: format.name, _value });\n this.#tens = getTens(format.decimals);\n }\n /**\n * If true, negative values are permitted, otherwise only\n * positive values and zero are allowed.\n */\n get signed() { return this.#format.signed; }\n /**\n * The number of bits available to store the value.\n */\n get width() { return this.#format.width; }\n /**\n * The number of decimal places in the fixed-point arithment field.\n */\n get decimals() { return this.#format.decimals; }\n /**\n * The value as an integer, based on the smallest unit the\n * [[decimals]] allow.\n */\n get value() { return this.#val; }\n #checkFormat(other) {\n assertArgument(this.format === other.format, \"incompatible format; use fixedNumber.toFormat\", \"other\", other);\n }\n #checkValue(val, safeOp) {\n /*\n const width = BigInt(this.width);\n if (this.signed) {\n const limit = (BN_1 << (width - BN_1));\n assert(safeOp == null || (val >= -limit && val < limit), \"overflow\", \"NUMERIC_FAULT\", {\n operation: <string>safeOp, fault: \"overflow\", value: val\n });\n \n if (val > BN_0) {\n val = fromTwos(mask(val, width), width);\n } else {\n val = -fromTwos(mask(-val, width), width);\n }\n \n } else {\n const masked = mask(val, width);\n assert(safeOp == null || (val >= 0 && val === masked), \"overflow\", \"NUMERIC_FAULT\", {\n operation: <string>safeOp, fault: \"overflow\", value: val\n });\n val = masked;\n }\n */\n val = checkValue(val, this.#format, safeOp);\n return new FixedNumber(_guard, val, this.#format);\n }\n #add(o, safeOp) {\n this.#checkFormat(o);\n return this.#checkValue(this.#val + o.#val, safeOp);\n }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% added\n * to %%other%%, ignoring overflow.\n */\n addUnsafe(other) { return this.#add(other); }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% added\n * to %%other%%. A [[NumericFaultError]] is thrown if overflow\n * occurs.\n */\n add(other) { return this.#add(other, \"add\"); }\n #sub(o, safeOp) {\n this.#checkFormat(o);\n return this.#checkValue(this.#val - o.#val, safeOp);\n }\n /**\n * Returns a new [[FixedNumber]] with the result of %%other%% subtracted\n * from %%this%%, ignoring overflow.\n */\n subUnsafe(other) { return this.#sub(other); }\n /**\n * Returns a new [[FixedNumber]] with the result of %%other%% subtracted\n * from %%this%%. A [[NumericFaultError]] is thrown if overflow\n * occurs.\n */\n sub(other) { return this.#sub(other, \"sub\"); }\n #mul(o, safeOp) {\n this.#checkFormat(o);\n return this.#checkValue((this.#val * o.#val) / this.#tens, safeOp);\n }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% multiplied\n * by %%other%%, ignoring overflow and underflow (precision loss).\n */\n mulUnsafe(other) { return this.#mul(other); }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% multiplied\n * by %%other%%. A [[NumericFaultError]] is thrown if overflow\n * occurs.\n */\n mul(other) { return this.#mul(other, \"mul\"); }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% multiplied\n * by %%other%%. A [[NumericFaultError]] is thrown if overflow\n * occurs or if underflow (precision loss) occurs.\n */\n mulSignal(other) {\n this.#checkFormat(other);\n const value = this.#val * other.#val;\n assert((value % this.#tens) === BN_0, \"precision lost during signalling mul\", \"NUMERIC_FAULT\", {\n operation: \"mulSignal\", fault: \"underflow\", value: this\n });\n return this.#checkValue(value / this.#tens, \"mulSignal\");\n }\n #div(o, safeOp) {\n assert(o.#val !== BN_0, \"division by zero\", \"NUMERIC_FAULT\", {\n operation: \"div\", fault: \"divide-by-zero\", value: this\n });\n this.#checkFormat(o);\n return this.#checkValue((this.#val * this.#tens) / o.#val, safeOp);\n }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% divided\n * by %%other%%, ignoring underflow (precision loss). A\n * [[NumericFaultError]] is thrown if overflow occurs.\n */\n divUnsafe(other) { return this.#div(other); }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% divided\n * by %%other%%, ignoring underflow (precision loss). A\n * [[NumericFaultError]] is thrown if overflow occurs.\n */\n div(other) { return this.#div(other, \"div\"); }\n /**\n * Returns a new [[FixedNumber]] with the result of %%this%% divided\n * by %%other%%. A [[NumericFaultError]] is thrown if underflow\n * (precision loss) occurs.\n */\n divSignal(other) {\n assert(other.#val !== BN_0, \"division by zero\", \"NUMERIC_FAULT\", {\n operation: \"div\", fault: \"divide-by-zero\", value: this\n });\n this.#checkFormat(other);\n const value = (this.#val * this.#tens);\n assert((value % other.#val) === BN_0, \"precision lost during signalling div\", \"NUMERIC_FAULT\", {\n operation: \"divSignal\", fault: \"underflow\", value: this\n });\n return this.#checkValue(value / other.#val, \"divSignal\");\n }\n /**\n * Returns a comparison result between %%this%% and %%other%%.\n *\n * This is suitable for use in sorting, where ``-1`` implies %%this%%\n * is smaller, ``1`` implies %%this%% is larger and ``0`` implies\n * both are equal.\n */\n cmp(other) {\n let a = this.value, b = other.value;\n // Coerce a and b to the same magnitude\n const delta = this.decimals - other.decimals;\n if (delta > 0) {\n b *= getTens(delta);\n }\n else if (delta < 0) {\n a *= getTens(-delta);\n }\n // Comnpare\n if (a < b) {\n return -1;\n }\n if (a > b) {\n return 1;\n }\n return 0;\n }\n /**\n * Returns true if %%other%% is equal to %%this%%.\n */\n eq(other) { return this.cmp(other) === 0; }\n /**\n * Returns true if %%other%% is less than to %%this%%.\n */\n lt(other) { return this.cmp(other) < 0; }\n /**\n * Returns true if %%other%% is less than or equal to %%this%%.\n */\n lte(other) { return this.cmp(other) <= 0; }\n /**\n * Returns true if %%other%% is greater than to %%this%%.\n */\n gt(other) { return this.cmp(other) > 0; }\n /**\n * Returns true if %%other%% is greater than or equal to %%this%%.\n */\n gte(other) { return this.cmp(other) >= 0; }\n /**\n * Returns a new [[FixedNumber]] which is the largest **integer**\n * that is less than or equal to %%this%%.\n *\n * The decimal component of the result will always be ``0``.\n */\n floor() {\n let val = this.#val;\n if (this.#val < BN_0) {\n val -= this.#tens - BN_1;\n }\n val = (this.#val / this.#tens) * this.#tens;\n return this.#checkValue(val, \"floor\");\n }\n /**\n * Returns a new [[FixedNumber]] which is the smallest **integer**\n * that is greater than or equal to %%this%%.\n *\n * The decimal component of the result will always be ``0``.\n */\n ceiling() {\n let val = this.#val;\n if (this.#val > BN_0) {\n val += this.#tens - BN_1;\n }\n val = (this.#val / this.#tens) * this.#tens;\n return this.#checkValue(val, \"ceiling\");\n }\n /**\n * Returns a new [[FixedNumber]] with the decimal component\n * rounded up on ties at %%decimals%% places.\n */\n round(decimals) {\n if (decimals == null) {\n decimals = 0;\n }\n // Not enough precision to not already be rounded\n if (decimals >= this.decimals) {\n return this;\n }\n const delta = this.decimals - decimals;\n const bump = BN_5 * getTens(delta - 1);\n let value = this.value + bump;\n const tens = getTens(delta);\n value = (value / tens) * tens;\n checkValue(value, this.#format, \"round\");\n return new FixedNumber(_guard, value, this.#format);\n }\n /**\n * Returns true if %%this%% is equal to ``0``.\n */\n isZero() { return (this.#val === BN_0); }\n /**\n * Returns true if %%this%% is less than ``0``.\n */\n isNegative() { return (this.#val < BN_0); }\n /**\n * Returns the string representation of %%this%%.\n */\n toString() { return this._value; }\n /**\n * Returns a float approximation.\n *\n * Due to IEEE 754 precission (or lack thereof), this function\n * can only return an approximation and most values will contain\n * rounding errors.\n */\n toUnsafeFloat() { return parseFloat(this.toString()); }\n /**\n * Return a new [[FixedNumber]] with the same value but has had\n * its field set to %%format%%.\n *\n * This will throw if the value cannot fit into %%format%%.\n */\n toFormat(format) {\n return FixedNumber.fromString(this.toString(), format);\n }\n /**\n * Creates a new [[FixedNumber]] for %%value%% divided by\n * %%decimal%% places with %%format%%.\n *\n * This will throw a [[NumericFaultError]] if %%value%% (once adjusted\n * for %%decimals%%) cannot fit in %%format%%, either due to overflow\n * or underflow (precision loss).\n */\n static fromValue(_value, _decimals, _format) {\n const decimals = (_decimals == null) ? 0 : getNumber(_decimals);\n const format = getFormat(_format);\n let value = getBigInt(_value, \"value\");\n const delta = decimals - format.decimals;\n if (delta > 0) {\n const tens = getTens(delta);\n assert((value % tens) === BN_0, \"value loses precision for format\", \"NUMERIC_FAULT\", {\n operation: \"fromValue\", fault: \"underflow\", value: _value\n });\n value /= tens;\n }\n else if (delta < 0) {\n value *= getTens(-delta);\n }\n checkValue(value, format, \"fromValue\");\n return new FixedNumber(_guard, value, format);\n }\n /**\n * Creates a new [[FixedNumber]] for %%value%% with %%format%%.\n *\n * This will throw a [[NumericFaultError]] if %%value%% cannot fit\n * in %%format%%, either due to overflow or underflow (precision loss).\n */\n static fromString(_value, _format) {\n const match = _value.match(/^(-?)([0-9]*)\\.?([0-9]*)$/);\n assertArgument(match && (match[2].length + match[3].length) > 0, \"invalid FixedNumber string value\", \"value\", _value);\n const format = getFormat(_format);\n let whole = (match[2] || \"0\"), decimal = (match[3] || \"\");\n // Pad out the decimals\n while (decimal.length < format.decimals) {\n decimal += Zeros;\n }\n // Check precision is safe\n assert(decimal.substring(format.decimals).match(/^0*$/), \"too many decimals for format\", \"NUMERIC_FAULT\", {\n operation: \"fromString\", fault: \"underflow\", value: _value\n });\n // Remove extra padding\n decimal = decimal.substring(0, format.decimals);\n const value = BigInt(match[1] + whole + decimal);\n checkValue(value, format, \"fromString\");\n return new FixedNumber(_guard, value, format);\n }\n /**\n * Creates a new [[FixedNumber]] with the big-endian representation\n * %%value%% with %%format%%.\n *\n * This will throw a [[NumericFaultError]] if %%value%% cannot fit\n * in %%format%% due to overflow.\n */\n static fromBytes(_value, _format) {\n let value = toBigInt(getBytes(_value, \"value\"));\n const format = getFormat(_format);\n if (format.signed) {\n value = fromTwos(value, format.width);\n }\n checkValue(value, format, \"fromBytes\");\n return new FixedNumber(_guard, value, format);\n }\n}\n//const f1 = FixedNumber.fromString(\"12.56\", \"fixed16x2\");\n//const f2 = FixedNumber.fromString(\"0.3\", \"fixed16x2\");\n//console.log(f1.divSignal(f2));\n//const BUMP = FixedNumber.from(\"0.5\");\n//# sourceMappingURL=fixednumber.js.map","/**\n * Most interactions with Ethereum requires integer values, which use\n * the smallest magnitude unit.\n *\n * For example, imagine dealing with dollars and cents. Since dollars\n * are divisible, non-integer values are possible, such as ``$10.77``.\n * By using the smallest indivisible unit (i.e. cents), the value can\n * be kept as the integer ``1077``.\n *\n * When receiving decimal input from the user (as a decimal string),\n * the value should be converted to an integer and when showing a user\n * a value, the integer value should be converted to a decimal string.\n *\n * This creates a clear distinction, between values to be used by code\n * (integers) and values used for display logic to users (decimals).\n *\n * The native unit in Ethereum, //ether// is divisible to 18 decimal places,\n * where each individual unit is called a //wei//.\n *\n * @_subsection api/utils:Unit Conversion [about-units]\n */\nimport { assertArgument } from \"./errors.js\";\nimport { FixedNumber } from \"./fixednumber.js\";\nimport { getNumber } from \"./maths.js\";\nconst names = [\n \"wei\",\n \"kwei\",\n \"mwei\",\n \"gwei\",\n \"szabo\",\n \"finney\",\n \"ether\",\n];\n/**\n * Converts %%value%% into a //decimal string//, assuming %%unit%% decimal\n * places. The %%unit%% may be the number of decimal places or the name of\n * a unit (e.g. ``\"gwei\"`` for 9 decimal places).\n *\n */\nexport function formatUnits(value, unit) {\n let decimals = 18;\n if (typeof (unit) === \"string\") {\n const index = names.indexOf(unit);\n assertArgument(index >= 0, \"invalid unit\", \"unit\", unit);\n decimals = 3 * index;\n }\n else if (unit != null) {\n decimals = getNumber(unit, \"unit\");\n }\n return FixedNumber.fromValue(value, decimals, { decimals, width: 512 }).toString();\n}\n/**\n * Converts the //decimal string// %%value%% to a BigInt, assuming\n * %%unit%% decimal places. The %%unit%% may the number of decimal places\n * or the name of a unit (e.g. ``\"gwei\"`` for 9 decimal places).\n */\nexport function parseUnits(value, unit) {\n assertArgument(typeof (value) === \"string\", \"value must be a string\", \"value\", value);\n let decimals = 18;\n if (typeof (unit) === \"string\") {\n const index = names.indexOf(unit);\n assertArgument(index >= 0, \"invalid unit\", \"unit\", unit);\n decimals = 3 * index;\n }\n else if (unit != null) {\n decimals = getNumber(unit, \"unit\");\n }\n return FixedNumber.fromString(value, { decimals, width: 512 }).value;\n}\n/**\n * Converts %%value%% into a //decimal string// using 18 decimal places.\n */\nexport function formatEther(wei) {\n return formatUnits(wei, 18);\n}\n/**\n * Converts the //decimal string// %%ether%% to a BigInt, using 18\n * decimal places.\n */\nexport function parseEther(ether) {\n return parseUnits(ether, 18);\n}\n//# sourceMappingURL=units.js.map","import { defineProperties, concat, getBytesCopy, getNumber, hexlify, toBeArray, toBigInt, toNumber, assert, assertArgument\n/*, isError*/\n } from \"../../utils/index.js\";\n/**\n * @_ignore:\n */\nexport const WordSize = 32;\nconst Padding = new Uint8Array(WordSize);\n// Properties used to immediate pass through to the underlying object\n// - `then` is used to detect if an object is a Promise for await\nconst passProperties = [\"then\"];\nconst _guard = {};\nconst resultNames = new WeakMap();\nfunction getNames(result) {\n return resultNames.get(result);\n}\nfunction setNames(result, names) {\n resultNames.set(result, names);\n}\nfunction throwError(name, error) {\n const wrapped = new Error(`deferred error during ABI decoding triggered accessing ${name}`);\n wrapped.error = error;\n throw wrapped;\n}\nfunction toObject(names, items, deep) {\n if (names.indexOf(null) >= 0) {\n return items.map((item, index) => {\n if (item instanceof Result) {\n return toObject(getNames(item), item, deep);\n }\n return item;\n });\n }\n return names.reduce((accum, name, index) => {\n let item = items.getValue(name);\n if (!(name in accum)) {\n if (deep && item instanceof Result) {\n item = toObject(getNames(item), item, deep);\n }\n accum[name] = item;\n }\n return accum;\n }, {});\n}\n/**\n * A [[Result]] is a sub-class of Array, which allows accessing any\n * of its values either positionally by its index or, if keys are\n * provided by its name.\n *\n * @_docloc: api/abi\n */\nexport class Result extends Array {\n // No longer used; but cannot be removed as it will remove the\n // #private field from the .d.ts which may break backwards\n // compatibility\n #names;\n /**\n * @private\n */\n constructor(...args) {\n // To properly sub-class Array so the other built-in\n // functions work, the constructor has to behave fairly\n // well. So, in the event we are created via fromItems()\n // we build the read-only Result object we want, but on\n // any other input, we use the default constructor\n // constructor(guard: any, items: Array<any>, keys?: Array<null | string>);\n const guard = args[0];\n let items = args[1];\n let names = (args[2] || []).slice();\n let wrap = true;\n if (guard !== _guard) {\n items = args;\n names = [];\n wrap = false;\n }\n // Can't just pass in ...items since an array of length 1\n // is a special case in the super.\n super(items.length);\n items.forEach((item, index) => { this[index] = item; });\n // Find all unique keys\n const nameCounts = names.reduce((accum, name) => {\n if (typeof (name) === \"string\") {\n accum.set(name, (accum.get(name) || 0) + 1);\n }\n return accum;\n }, (new Map()));\n // Remove any key thats not unique\n setNames(this, Object.freeze(items.map((item, index) => {\n const name = names[index];\n if (name != null && nameCounts.get(name) === 1) {\n return name;\n }\n return null;\n })));\n // Dummy operations to prevent TypeScript from complaining\n this.#names = [];\n if (this.#names == null) {\n void (this.#names);\n }\n if (!wrap) {\n return;\n }\n // A wrapped Result is immutable\n Object.freeze(this);\n // Proxy indices and names so we can trap deferred errors\n const proxy = new Proxy(this, {\n get: (target, prop, receiver) => {\n if (typeof (prop) === \"string\") {\n // Index accessor\n if (prop.match(/^[0-9]+$/)) {\n const index = getNumber(prop, \"%index\");\n if (index < 0 || index >= this.length) {\n throw new RangeError(\"out of result range\");\n }\n const item = target[index];\n if (item instanceof Error) {\n throwError(`index ${index}`, item);\n }\n return item;\n }\n // Pass important checks (like `then` for Promise) through\n if (passProperties.indexOf(prop) >= 0) {\n return Reflect.get(target, prop, receiver);\n }\n const value = target[prop];\n if (value instanceof Function) {\n // Make sure functions work with private variables\n // See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy#no_private_property_forwarding\n return function (...args) {\n return value.apply((this === receiver) ? target : this, args);\n };\n }\n else if (!(prop in target)) {\n // Possible name accessor\n return target.getValue.apply((this === receiver) ? target : this, [prop]);\n }\n }\n return Reflect.get(target, prop, receiver);\n }\n });\n setNames(proxy, getNames(this));\n return proxy;\n }\n /**\n * Returns the Result as a normal Array. If %%deep%%, any children\n * which are Result objects are also converted to a normal Array.\n *\n * This will throw if there are any outstanding deferred\n * errors.\n */\n toArray(deep) {\n const result = [];\n this.forEach((item, index) => {\n if (item instanceof Error) {\n throwError(`index ${index}`, item);\n }\n if (deep && item instanceof Result) {\n item = item.toArray(deep);\n }\n result.push(item);\n });\n return result;\n }\n /**\n * Returns the Result as an Object with each name-value pair. If\n * %%deep%%, any children which are Result objects are also\n * converted to an Object.\n *\n * This will throw if any value is unnamed, or if there are\n * any outstanding deferred errors.\n */\n toObject(deep) {\n const names = getNames(this);\n return names.reduce((accum, name, index) => {\n assert(name != null, `value at index ${index} unnamed`, \"UNSUPPORTED_OPERATION\", {\n operation: \"toObject()\"\n });\n return toObject(names, this, deep);\n }, {});\n }\n /**\n * @_ignore\n */\n slice(start, end) {\n if (start == null) {\n start = 0;\n }\n if (start < 0) {\n start += this.length;\n if (start < 0) {\n start = 0;\n }\n }\n if (end == null) {\n end = this.length;\n }\n if (end < 0) {\n end += this.length;\n if (end < 0) {\n end = 0;\n }\n }\n if (end > this.length) {\n end = this.length;\n }\n const _names = getNames(this);\n const result = [], names = [];\n for (let i = start; i < end; i++) {\n result.push(this[i]);\n names.push(_names[i]);\n }\n return new Result(_guard, result, names);\n }\n /**\n * @_ignore\n */\n filter(callback, thisArg) {\n const _names = getNames(this);\n const result = [], names = [];\n for (let i = 0; i < this.length; i++) {\n const item = this[i];\n if (item instanceof Error) {\n throwError(`index ${i}`, item);\n }\n if (callback.call(thisArg, item, i, this)) {\n result.push(item);\n names.push(_names[i]);\n }\n }\n return new Result(_guard, result, names);\n }\n /**\n * @_ignore\n */\n map(callback, thisArg) {\n const result = [];\n for (let i = 0; i < this.length; i++) {\n const item = this[i];\n if (item instanceof Error) {\n throwError(`index ${i}`, item);\n }\n result.push(callback.call(thisArg, item, i, this));\n }\n return result;\n }\n /**\n * Returns the value for %%name%%.\n *\n * Since it is possible to have a key whose name conflicts with\n * a method on a [[Result]] or its superclass Array, or any\n * JavaScript keyword, this ensures all named values are still\n * accessible by name.\n */\n getValue(name) {\n const index = getNames(this).indexOf(name);\n if (index === -1) {\n return undefined;\n }\n const value = this[index];\n if (value instanceof Error) {\n throwError(`property ${JSON.stringify(name)}`, value.error);\n }\n return value;\n }\n /**\n * Creates a new [[Result]] for %%items%% with each entry\n * also accessible by its corresponding name in %%keys%%.\n */\n static fromItems(items, keys) {\n return new Result(_guard, items, keys);\n }\n}\n/**\n * Returns all errors found in a [[Result]].\n *\n * Since certain errors encountered when creating a [[Result]] do\n * not impact the ability to continue parsing data, they are\n * deferred until they are actually accessed. Hence a faulty string\n * in an Event that is never used does not impact the program flow.\n *\n * However, sometimes it may be useful to access, identify or\n * validate correctness of a [[Result]].\n *\n * @_docloc api/abi\n */\nexport function checkResultErrors(result) {\n // Find the first error (if any)\n const errors = [];\n const checkErrors = function (path, object) {\n if (!Array.isArray(object)) {\n return;\n }\n for (let key in object) {\n const childPath = path.slice();\n childPath.push(key);\n try {\n checkErrors(childPath, object[key]);\n }\n catch (error) {\n errors.push({ path: childPath, error: error });\n }\n }\n };\n checkErrors([], result);\n return errors;\n}\nfunction getValue(value) {\n let bytes = toBeArray(value);\n assert(bytes.length <= WordSize, \"value out-of-bounds\", \"BUFFER_OVERRUN\", { buffer: bytes, length: WordSize, offset: bytes.length });\n if (bytes.length !== WordSize) {\n bytes = getBytesCopy(concat([Padding.slice(bytes.length % WordSize), bytes]));\n }\n return bytes;\n}\n/**\n * @_ignore\n */\nexport class Coder {\n // The coder name:\n // - address, uint256, tuple, array, etc.\n name;\n // The fully expanded type, including composite types:\n // - address, uint256, tuple(address,bytes), uint256[3][4][], etc.\n type;\n // The localName bound in the signature, in this example it is \"baz\":\n // - tuple(address foo, uint bar) baz\n localName;\n // Whether this type is dynamic:\n // - Dynamic: bytes, string, address[], tuple(boolean[]), etc.\n // - Not Dynamic: address, uint256, boolean[3], tuple(address, uint8)\n dynamic;\n constructor(name, type, localName, dynamic) {\n defineProperties(this, { name, type, localName, dynamic }, {\n name: \"string\", type: \"string\", localName: \"string\", dynamic: \"boolean\"\n });\n }\n _throwError(message, value) {\n assertArgument(false, message, this.localName, value);\n }\n}\n/**\n * @_ignore\n */\nexport class Writer {\n // An array of WordSize lengthed objects to concatenation\n #data;\n #dataLength;\n constructor() {\n this.#data = [];\n this.#dataLength = 0;\n }\n get data() {\n return concat(this.#data);\n }\n get length() { return this.#dataLength; }\n #writeData(data) {\n this.#data.push(data);\n this.#dataLength += data.length;\n return data.length;\n }\n appendWriter(writer) {\n return this.#writeData(getBytesCopy(writer.data));\n }\n // Arrayish item; pad on the right to *nearest* WordSize\n writeBytes(value) {\n let bytes = getBytesCopy(value);\n const paddingOffset = bytes.length % WordSize;\n if (paddingOffset) {\n bytes = getBytesCopy(concat([bytes, Padding.slice(paddingOffset)]));\n }\n return this.#writeData(bytes);\n }\n // Numeric item; pad on the left *to* WordSize\n writeValue(value) {\n return this.#writeData(getValue(value));\n }\n // Inserts a numeric place-holder, returning a callback that can\n // be used to asjust the value later\n writeUpdatableValue() {\n const offset = this.#data.length;\n this.#data.push(Padding);\n this.#dataLength += WordSize;\n return (value) => {\n this.#data[offset] = getValue(value);\n };\n }\n}\n/**\n * @_ignore\n */\nexport class Reader {\n // Allows incomplete unpadded data to be read; otherwise an error\n // is raised if attempting to overrun the buffer. This is required\n // to deal with an old Solidity bug, in which event data for\n // external (not public thoguh) was tightly packed.\n allowLoose;\n #data;\n #offset;\n #bytesRead;\n #parent;\n #maxInflation;\n constructor(data, allowLoose, maxInflation) {\n defineProperties(this, { allowLoose: !!allowLoose });\n this.#data = getBytesCopy(data);\n this.#bytesRead = 0;\n this.#parent = null;\n this.#maxInflation = (maxInflation != null) ? maxInflation : 1024;\n this.#offset = 0;\n }\n get data() { return hexlify(this.#data); }\n get dataLength() { return this.#data.length; }\n get consumed() { return this.#offset; }\n get bytes() { return new Uint8Array(this.#data); }\n #incrementBytesRead(count) {\n if (this.#parent) {\n return this.#parent.#incrementBytesRead(count);\n }\n this.#bytesRead += count;\n // Check for excessive inflation (see: #4537)\n assert(this.#maxInflation < 1 || this.#bytesRead <= this.#maxInflation * this.dataLength, `compressed ABI data exceeds inflation ratio of ${this.#maxInflation} ( see: https:/\\/github.com/ethers-io/ethers.js/issues/4537 )`, \"BUFFER_OVERRUN\", {\n buffer: getBytesCopy(this.#data), offset: this.#offset,\n length: count, info: {\n bytesRead: this.#bytesRead,\n dataLength: this.dataLength\n }\n });\n }\n #peekBytes(offset, length, loose) {\n let alignedLength = Math.ceil(length / WordSize) * WordSize;\n if (this.#offset + alignedLength > this.#data.length) {\n if (this.allowLoose && loose && this.#offset + length <= this.#data.length) {\n alignedLength = length;\n }\n else {\n assert(false, \"data out-of-bounds\", \"BUFFER_OVERRUN\", {\n buffer: getBytesCopy(this.#data),\n length: this.#data.length,\n offset: this.#offset + alignedLength\n });\n }\n }\n return this.#data.slice(this.#offset, this.#offset + alignedLength);\n }\n // Create a sub-reader with the same underlying data, but offset\n subReader(offset) {\n const reader = new Reader(this.#data.slice(this.#offset + offset), this.allowLoose, this.#maxInflation);\n reader.#parent = this;\n return reader;\n }\n // Read bytes\n readBytes(length, loose) {\n let bytes = this.#peekBytes(0, length, !!loose);\n this.#incrementBytesRead(length);\n this.#offset += bytes.length;\n // @TODO: Make sure the length..end bytes are all 0?\n return bytes.slice(0, length);\n }\n // Read a numeric values\n readValue() {\n return toBigInt(this.readBytes(WordSize));\n }\n readIndex() {\n return toNumber(this.readBytes(WordSize));\n }\n}\n//# sourceMappingURL=abstract-coder.js.map","function number(n) {\n if (!Number.isSafeInteger(n) || n < 0)\n throw new Error(`Wrong positive integer: ${n}`);\n}\nfunction bool(b) {\n if (typeof b !== 'boolean')\n throw new Error(`Expected boolean, not ${b}`);\n}\nfunction bytes(b, ...lengths) {\n if (!(b instanceof Uint8Array))\n throw new Error('Expected Uint8Array');\n if (lengths.length > 0 && !lengths.includes(b.length))\n throw new Error(`Expected Uint8Array of length ${lengths}, not of length=${b.length}`);\n}\nfunction hash(hash) {\n if (typeof hash !== 'function' || typeof hash.create !== 'function')\n throw new Error('Hash should be wrapped by utils.wrapConstructor');\n number(hash.outputLen);\n number(hash.blockLen);\n}\nfunction exists(instance, checkFinished = true) {\n if (instance.destroyed)\n throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished)\n throw new Error('Hash#digest() has already been called');\n}\nfunction output(out, instance) {\n bytes(out);\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error(`digestInto() expects output buffer of length at least ${min}`);\n }\n}\nexport { number, bool, bytes, hash, exists, output };\nconst assert = { number, bool, bytes, hash, exists, output };\nexport default assert;\n//# sourceMappingURL=_assert.js.map","export const crypto = typeof globalThis === 'object' && 'crypto' in globalThis ? globalThis.crypto : undefined;\n//# sourceMappingURL=crypto.js.map","/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.\n// node.js versions earlier than v19 don't declare it in global scope.\n// For node.js, package.json#exports field mapping rewrites import\n// from `crypto` to `cryptoNode`, which imports native module.\n// Makes the utils un-importable in browsers without a bundler.\n// Once node.js 18 is deprecated, we can just drop the import.\nimport { crypto } from '@noble/hashes/crypto';\nconst u8a = (a) => a instanceof Uint8Array;\n// Cast array to different type\nexport const u8 = (arr) => new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\nexport const u32 = (arr) => new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n// Cast array to view\nexport const createView = (arr) => new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n// The rotate right (circular right shift) operation for uint32\nexport const rotr = (word, shift) => (word << (32 - shift)) | (word >>> shift);\n// big-endian hardware is rare. Just in case someone still decides to run hashes:\n// early-throw an error because we don't support BE yet.\nexport const isLE = new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44;\nif (!isLE)\n throw new Error('Non little-endian hardware is not supported');\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0'));\n/**\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes) {\n if (!u8a(bytes))\n throw new Error('Uint8Array expected');\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n/**\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex) {\n if (typeof hex !== 'string')\n throw new Error('hex string expected, got ' + typeof hex);\n const len = hex.length;\n if (len % 2)\n throw new Error('padded hex string expected, got unpadded hex of length ' + len);\n const array = new Uint8Array(len / 2);\n for (let i = 0; i < array.length; i++) {\n const j = i * 2;\n const hexByte = hex.slice(j, j + 2);\n const byte = Number.parseInt(hexByte, 16);\n if (Number.isNaN(byte) || byte < 0)\n throw new Error('Invalid byte sequence');\n array[i] = byte;\n }\n return array;\n}\n// There is no setImmediate in browser and setTimeout is slow.\n// call of async fn will return Promise, which will be fullfiled only on\n// next scheduler queue processing step and this is exactly what we need.\nexport const nextTick = async () => { };\n// Returns control to thread each 'tick' ms to avoid blocking\nexport async function asyncLoop(iters, tick, cb) {\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick)\n continue;\n await nextTick();\n ts += diff;\n }\n}\n/**\n * @example utf8ToBytes('abc') // new Uint8Array([97, 98, 99])\n */\nexport function utf8ToBytes(str) {\n if (typeof str !== 'string')\n throw new Error(`utf8ToBytes expected string, got ${typeof str}`);\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n/**\n * Normalizes (non-hex) string or Uint8Array to Uint8Array.\n * Warning: when Uint8Array is passed, it would NOT get copied.\n * Keep in mind for future mutable operations.\n */\nexport function toBytes(data) {\n if (typeof data === 'string')\n data = utf8ToBytes(data);\n if (!u8a(data))\n throw new Error(`expected Uint8Array, got ${typeof data}`);\n return data;\n}\n/**\n * Copies several Uint8Arrays into one.\n */\nexport function concatBytes(...arrays) {\n const r = new Uint8Array(arrays.reduce((sum, a) => sum + a.length, 0));\n let pad = 0; // walk through each item, ensure they have proper type\n arrays.forEach((a) => {\n if (!u8a(a))\n throw new Error('Uint8Array expected');\n r.set(a, pad);\n pad += a.length;\n });\n return r;\n}\n// For runtime check if class implements interface\nexport class Hash {\n // Safe version that clones internal state\n clone() {\n return this._cloneInto();\n }\n}\nconst toStr = {}.toString;\nexport function checkOpts(defaults, opts) {\n if (opts !== undefined && toStr.call(opts) !== '[object Object]')\n throw new Error('Options should be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged;\n}\nexport function wrapConstructor(hashCons) {\n const hashC = (msg) => hashCons().update(toBytes(msg)).digest();\n const tmp = hashCons();\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = () => hashCons();\n return hashC;\n}\nexport function wrapConstructorWithOpts(hashCons) {\n const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({});\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts) => hashCons(opts);\n return hashC;\n}\nexport function wrapXOFConstructorWithOpts(hashCons) {\n const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({});\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts) => hashCons(opts);\n return hashC;\n}\n/**\n * Secure PRNG. Uses `crypto.getRandomValues`, which defers to OS.\n */\nexport function randomBytes(bytesLength = 32) {\n if (crypto && typeof crypto.getRandomValues === 'function') {\n return crypto.getRandomValues(new Uint8Array(bytesLength));\n }\n throw new Error('crypto.getRandomValues must be defined');\n}\n//# sourceMappingURL=utils.js.map","const U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);\nconst _32n = /* @__PURE__ */ BigInt(32);\n// We are not using BigUint64Array, because they are extremely slow as per 2022\nfunction fromBig(n, le = false) {\n if (le)\n return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\nfunction split(lst, le = false) {\n let Ah = new Uint32Array(lst.length);\n let Al = new Uint32Array(lst.length);\n for (let i = 0; i < lst.length; i++) {\n const { h, l } = fromBig(lst[i], le);\n [Ah[i], Al[i]] = [h, l];\n }\n return [Ah, Al];\n}\nconst toBig = (h, l) => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\n// for Shift in [0, 32)\nconst shrSH = (h, _l, s) => h >>> s;\nconst shrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in [1, 32)\nconst rotrSH = (h, l, s) => (h >>> s) | (l << (32 - s));\nconst rotrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotrBH = (h, l, s) => (h << (64 - s)) | (l >>> (s - 32));\nconst rotrBL = (h, l, s) => (h >>> (s - 32)) | (l << (64 - s));\n// Right rotate for shift===32 (just swaps l&h)\nconst rotr32H = (_h, l) => l;\nconst rotr32L = (h, _l) => h;\n// Left rotate for Shift in [1, 32)\nconst rotlSH = (h, l, s) => (h << s) | (l >>> (32 - s));\nconst rotlSL = (h, l, s) => (l << s) | (h >>> (32 - s));\n// Left rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotlBH = (h, l, s) => (l << (s - 32)) | (h >>> (64 - s));\nconst rotlBL = (h, l, s) => (h << (s - 32)) | (l >>> (64 - s));\n// JS uses 32-bit signed integers for bitwise operations which means we cannot\n// simple take carry out of low bit sum by shift, we need to use division.\nfunction add(Ah, Al, Bh, Bl) {\n const l = (Al >>> 0) + (Bl >>> 0);\n return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\nconst add3L = (Al, Bl, Cl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\nconst add3H = (low, Ah, Bh, Ch) => (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\nconst add4L = (Al, Bl, Cl, Dl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\nconst add4H = (low, Ah, Bh, Ch, Dh) => (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\nconst add5L = (Al, Bl, Cl, Dl, El) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\nconst add5H = (low, Ah, Bh, Ch, Dh, Eh) => (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\n// prettier-ignore\nexport { fromBig, split, toBig, shrSH, shrSL, rotrSH, rotrSL, rotrBH, rotrBL, rotr32H, rotr32L, rotlSH, rotlSL, rotlBH, rotlBL, add, add3L, add3H, add4L, add4H, add5H, add5L, };\n// prettier-ignore\nconst u64 = {\n fromBig, split, toBig,\n shrSH, shrSL,\n rotrSH, rotrSL, rotrBH, rotrBL,\n rotr32H, rotr32L,\n rotlSH, rotlSL, rotlBH, rotlBL,\n add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\nexport default u64;\n//# sourceMappingURL=_u64.js.map","import { bytes, exists, number, output } from './_assert.js';\nimport { rotlBH, rotlBL, rotlSH, rotlSL, split } from './_u64.js';\nimport { Hash, u32, toBytes, wrapConstructor, wrapXOFConstructorWithOpts, } from './utils.js';\n// SHA3 (keccak) is based on a new design: basically, the internal state is bigger than output size.\n// It's called a sponge function.\n// Various per round constants calculations\nconst [SHA3_PI, SHA3_ROTL, _SHA3_IOTA] = [[], [], []];\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\nconst _2n = /* @__PURE__ */ BigInt(2);\nconst _7n = /* @__PURE__ */ BigInt(7);\nconst _256n = /* @__PURE__ */ BigInt(256);\nconst _0x71n = /* @__PURE__ */ BigInt(0x71);\nfor (let round = 0, R = _1n, x = 1, y = 0; round < 24; round++) {\n // Pi\n [x, y] = [y, (2 * x + 3 * y) % 5];\n SHA3_PI.push(2 * (5 * y + x));\n // Rotational\n SHA3_ROTL.push((((round + 1) * (round + 2)) / 2) % 64);\n // Iota\n let t = _0n;\n for (let j = 0; j < 7; j++) {\n R = ((R << _1n) ^ ((R >> _7n) * _0x71n)) % _256n;\n if (R & _2n)\n t ^= _1n << ((_1n << /* @__PURE__ */ BigInt(j)) - _1n);\n }\n _SHA3_IOTA.push(t);\n}\nconst [SHA3_IOTA_H, SHA3_IOTA_L] = /* @__PURE__ */ split(_SHA3_IOTA, true);\n// Left rotation (without 0, 32, 64)\nconst rotlH = (h, l, s) => (s > 32 ? rotlBH(h, l, s) : rotlSH(h, l, s));\nconst rotlL = (h, l, s) => (s > 32 ? rotlBL(h, l, s) : rotlSL(h, l, s));\n// Same as keccakf1600, but allows to skip some rounds\nexport function keccakP(s, rounds = 24) {\n const B = new Uint32Array(5 * 2);\n // NOTE: all indices are x2 since we store state as u32 instead of u64 (bigints to slow in js)\n for (let round = 24 - rounds; round < 24; round++) {\n // Theta θ\n for (let x = 0; x < 10; x++)\n B[x] = s[x] ^ s[x + 10] ^ s[x + 20] ^ s[x + 30] ^ s[x + 40];\n for (let x = 0; x < 10; x += 2) {\n const idx1 = (x + 8) % 10;\n const idx0 = (x + 2) % 10;\n const B0 = B[idx0];\n const B1 = B[idx0 + 1];\n const Th = rotlH(B0, B1, 1) ^ B[idx1];\n const Tl = rotlL(B0, B1, 1) ^ B[idx1 + 1];\n for (let y = 0; y < 50; y += 10) {\n s[x + y] ^= Th;\n s[x + y + 1] ^= Tl;\n }\n }\n // Rho (ρ) and Pi (π)\n let curH = s[2];\n let curL = s[3];\n for (let t = 0; t < 24; t++) {\n const shift = SHA3_ROTL[t];\n const Th = rotlH(curH, curL, shift);\n const Tl = rotlL(curH, curL, shift);\n const PI = SHA3_PI[t];\n curH = s[PI];\n curL = s[PI + 1];\n s[PI] = Th;\n s[PI + 1] = Tl;\n }\n // Chi (χ)\n for (let y = 0; y < 50; y += 10) {\n for (let x = 0; x < 10; x++)\n B[x] = s[y + x];\n for (let x = 0; x < 10; x++)\n s[y + x] ^= ~B[(x + 2) % 10] & B[(x + 4) % 10];\n }\n // Iota (ι)\n s[0] ^= SHA3_IOTA_H[round];\n s[1] ^= SHA3_IOTA_L[round];\n }\n B.fill(0);\n}\nexport class Keccak extends Hash {\n // NOTE: we accept arguments in bytes instead of bits here.\n constructor(blockLen, suffix, outputLen, enableXOF = false, rounds = 24) {\n super();\n this.blockLen = blockLen;\n this.suffix = suffix;\n this.outputLen = outputLen;\n this.enableXOF = enableXOF;\n this.rounds = rounds;\n this.pos = 0;\n this.posOut = 0;\n this.finished = false;\n this.destroyed = false;\n // Can be passed from user as dkLen\n number(outputLen);\n // 1600 = 5x5 matrix of 64bit. 1600 bits === 200 bytes\n if (0 >= this.blockLen || this.blockLen >= 200)\n throw new Error('Sha3 supports only keccak-f1600 function');\n this.state = new Uint8Array(200);\n this.state32 = u32(this.state);\n }\n keccak() {\n keccakP(this.state32, this.rounds);\n this.posOut = 0;\n this.pos = 0;\n }\n update(data) {\n exists(this);\n const { blockLen, state } = this;\n data = toBytes(data);\n const len = data.length;\n for (let pos = 0; pos < len;) {\n const take = Math.min(blockLen - this.pos, len - pos);\n for (let i = 0; i < take; i++)\n state[this.pos++] ^= data[pos++];\n if (this.pos === blockLen)\n this.keccak();\n }\n return this;\n }\n finish() {\n if (this.finished)\n return;\n this.finished = true;\n const { state, suffix, pos, blockLen } = this;\n // Do the padding\n state[pos] ^= suffix;\n if ((suffix & 0x80) !== 0 && pos === blockLen - 1)\n this.keccak();\n state[blockLen - 1] ^= 0x80;\n this.keccak();\n }\n writeInto(out) {\n exists(this, false);\n bytes(out);\n this.finish();\n const bufferOut = this.state;\n const { blockLen } = this;\n for (let pos = 0, len = out.length; pos < len;) {\n if (this.posOut >= blockLen)\n this.keccak();\n const take = Math.min(blockLen - this.posOut, len - pos);\n out.set(bufferOut.subarray(this.posOut, this.posOut + take), pos);\n this.posOut += take;\n pos += take;\n }\n return out;\n }\n xofInto(out) {\n // Sha3/Keccak usage with XOF is probably mistake, only SHAKE instances can do XOF\n if (!this.enableXOF)\n throw new Error('XOF is not possible for this instance');\n return this.writeInto(out);\n }\n xof(bytes) {\n number(bytes);\n return this.xofInto(new Uint8Array(bytes));\n }\n digestInto(out) {\n output(out, this);\n if (this.finished)\n throw new Error('digest() was already called');\n this.writeInto(out);\n this.destroy();\n return out;\n }\n digest() {\n return this.digestInto(new Uint8Array(this.outputLen));\n }\n destroy() {\n this.destroyed = true;\n this.state.fill(0);\n }\n _cloneInto(to) {\n const { blockLen, suffix, outputLen, rounds, enableXOF } = this;\n to || (to = new Keccak(blockLen, suffix, outputLen, enableXOF, rounds));\n to.state32.set(this.state32);\n to.pos = this.pos;\n to.posOut = this.posOut;\n to.finished = this.finished;\n to.rounds = rounds;\n // Suffix can change in cSHAKE\n to.suffix = suffix;\n to.outputLen = outputLen;\n to.enableXOF = enableXOF;\n to.destroyed = this.destroyed;\n return to;\n }\n}\nconst gen = (suffix, blockLen, outputLen) => wrapConstructor(() => new Keccak(blockLen, suffix, outputLen));\nexport const sha3_224 = /* @__PURE__ */ gen(0x06, 144, 224 / 8);\n/**\n * SHA3-256 hash function\n * @param message - that would be hashed\n */\nexport const sha3_256 = /* @__PURE__ */ gen(0x06, 136, 256 / 8);\nexport const sha3_384 = /* @__PURE__ */ gen(0x06, 104, 384 / 8);\nexport const sha3_512 = /* @__PURE__ */ gen(0x06, 72, 512 / 8);\nexport const keccak_224 = /* @__PURE__ */ gen(0x01, 144, 224 / 8);\n/**\n * keccak-256 hash function. Different from SHA3-256.\n * @param message - that would be hashed\n */\nexport const keccak_256 = /* @__PURE__ */ gen(0x01, 136, 256 / 8);\nexport const keccak_384 = /* @__PURE__ */ gen(0x01, 104, 384 / 8);\nexport const keccak_512 = /* @__PURE__ */ gen(0x01, 72, 512 / 8);\nconst genShake = (suffix, blockLen, outputLen) => wrapXOFConstructorWithOpts((opts = {}) => new Keccak(blockLen, suffix, opts.dkLen === undefined ? outputLen : opts.dkLen, true));\nexport const shake128 = /* @__PURE__ */ genShake(0x1f, 168, 128 / 8);\nexport const shake256 = /* @__PURE__ */ genShake(0x1f, 136, 256 / 8);\n//# sourceMappingURL=sha3.js.map","/**\n * Cryptographic hashing functions\n *\n * @_subsection: api/crypto:Hash Functions [about-crypto-hashing]\n */\nimport { keccak_256 } from \"@noble/hashes/sha3\";\nimport { getBytes, hexlify } from \"../utils/index.js\";\nlet locked = false;\nconst _keccak256 = function (data) {\n return keccak_256(data);\n};\nlet __keccak256 = _keccak256;\n/**\n * Compute the cryptographic KECCAK256 hash of %%data%%.\n *\n * The %%data%% **must** be a data representation, to compute the\n * hash of UTF-8 data use the [[id]] function.\n *\n * @returns DataHexstring\n * @example:\n * keccak256(\"0x\")\n * //_result:\n *\n * keccak256(\"0x1337\")\n * //_result:\n *\n * keccak256(new Uint8Array([ 0x13, 0x37 ]))\n * //_result:\n *\n * // Strings are assumed to be DataHexString, otherwise it will\n * // throw. To hash UTF-8 data, see the note above.\n * keccak256(\"Hello World\")\n * //_error:\n */\nexport function keccak256(_data) {\n const data = getBytes(_data, \"data\");\n return hexlify(__keccak256(data));\n}\nkeccak256._ = _keccak256;\nkeccak256.lock = function () { locked = true; };\nkeccak256.register = function (func) {\n if (locked) {\n throw new TypeError(\"keccak256 is locked\");\n }\n __keccak256 = func;\n};\nObject.freeze(keccak256);\n//# sourceMappingURL=keccak.js.map","/**\n * A constant for the zero address.\n *\n * (**i.e.** ``\"0x0000000000000000000000000000000000000000\"``)\n */\nexport const ZeroAddress = \"0x0000000000000000000000000000000000000000\";\n//# sourceMappingURL=addresses.js.map","import { keccak256 } from \"../crypto/index.js\";\nimport { getBytes, assertArgument } from \"../utils/index.js\";\nconst BN_0 = BigInt(0);\nconst BN_36 = BigInt(36);\nfunction getChecksumAddress(address) {\n // if (!isHexString(address, 20)) {\n // logger.throwArgumentError(\"invalid address\", \"address\", address);\n // }\n address = address.toLowerCase();\n const chars = address.substring(2).split(\"\");\n const expanded = new Uint8Array(40);\n for (let i = 0; i < 40; i++) {\n expanded[i] = chars[i].charCodeAt(0);\n }\n const hashed = getBytes(keccak256(expanded));\n for (let i = 0; i < 40; i += 2) {\n if ((hashed[i >> 1] >> 4) >= 8) {\n chars[i] = chars[i].toUpperCase();\n }\n if ((hashed[i >> 1] & 0x0f) >= 8) {\n chars[i + 1] = chars[i + 1].toUpperCase();\n }\n }\n return \"0x\" + chars.join(\"\");\n}\n// See: https://en.wikipedia.org/wiki/International_Bank_Account_Number\n// Create lookup table\nconst ibanLookup = {};\nfor (let i = 0; i < 10; i++) {\n ibanLookup[String(i)] = String(i);\n}\nfor (let i = 0; i < 26; i++) {\n ibanLookup[String.fromCharCode(65 + i)] = String(10 + i);\n}\n// How many decimal digits can we process? (for 64-bit float, this is 15)\n// i.e. Math.floor(Math.log10(Number.MAX_SAFE_INTEGER));\nconst safeDigits = 15;\nfunction ibanChecksum(address) {\n address = address.toUpperCase();\n address = address.substring(4) + address.substring(0, 2) + \"00\";\n let expanded = address.split(\"\").map((c) => { return ibanLookup[c]; }).join(\"\");\n // Javascript can handle integers safely up to 15 (decimal) digits\n while (expanded.length >= safeDigits) {\n let block = expanded.substring(0, safeDigits);\n expanded = parseInt(block, 10) % 97 + expanded.substring(block.length);\n }\n let checksum = String(98 - (parseInt(expanded, 10) % 97));\n while (checksum.length < 2) {\n checksum = \"0\" + checksum;\n }\n return checksum;\n}\n;\nconst Base36 = (function () {\n ;\n const result = {};\n for (let i = 0; i < 36; i++) {\n const key = \"0123456789abcdefghijklmnopqrstuvwxyz\"[i];\n result[key] = BigInt(i);\n }\n return result;\n})();\nfunction fromBase36(value) {\n value = value.toLowerCase();\n let result = BN_0;\n for (let i = 0; i < value.length; i++) {\n result = result * BN_36 + Base36[value[i]];\n }\n return result;\n}\n/**\n * Returns a normalized and checksumed address for %%address%%.\n * This accepts non-checksum addresses, checksum addresses and\n * [[getIcapAddress]] formats.\n *\n * The checksum in Ethereum uses the capitalization (upper-case\n * vs lower-case) of the characters within an address to encode\n * its checksum, which offers, on average, a checksum of 15-bits.\n *\n * If %%address%% contains both upper-case and lower-case, it is\n * assumed to already be a checksum address and its checksum is\n * validated, and if the address fails its expected checksum an\n * error is thrown.\n *\n * If you wish the checksum of %%address%% to be ignore, it should\n * be converted to lower-case (i.e. ``.toLowercase()``) before\n * being passed in. This should be a very rare situation though,\n * that you wish to bypass the safegaurds in place to protect\n * against an address that has been incorrectly copied from another\n * source.\n *\n * @example:\n * // Adds the checksum (via upper-casing specific letters)\n * getAddress(\"0x8ba1f109551bd432803012645ac136ddd64dba72\")\n * //_result:\n *\n * // Converts ICAP address and adds checksum\n * getAddress(\"XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK36\");\n * //_result:\n *\n * // Throws an error if an address contains mixed case,\n * // but the checksum fails\n * getAddress(\"0x8Ba1f109551bD432803012645Ac136ddd64DBA72\")\n * //_error:\n */\nexport function getAddress(address) {\n assertArgument(typeof (address) === \"string\", \"invalid address\", \"address\", address);\n if (address.match(/^(0x)?[0-9a-fA-F]{40}$/)) {\n // Missing the 0x prefix\n if (!address.startsWith(\"0x\")) {\n address = \"0x\" + address;\n }\n const result = getChecksumAddress(address);\n // It is a checksummed address with a bad checksum\n assertArgument(!address.match(/([A-F].*[a-f])|([a-f].*[A-F])/) || result === address, \"bad address checksum\", \"address\", address);\n return result;\n }\n // Maybe ICAP? (we only support direct mode)\n if (address.match(/^XE[0-9]{2}[0-9A-Za-z]{30,31}$/)) {\n // It is an ICAP address with a bad checksum\n assertArgument(address.substring(2, 4) === ibanChecksum(address), \"bad icap checksum\", \"address\", address);\n let result = fromBase36(address.substring(4)).toString(16);\n while (result.length < 40) {\n result = \"0\" + result;\n }\n return getChecksumAddress(\"0x\" + result);\n }\n assertArgument(false, \"invalid address\", \"address\", address);\n}\n/**\n * The [ICAP Address format](link-icap) format is an early checksum\n * format which attempts to be compatible with the banking\n * industry [IBAN format](link-wiki-iban) for bank accounts.\n *\n * It is no longer common or a recommended format.\n *\n * @example:\n * getIcapAddress(\"0x8ba1f109551bd432803012645ac136ddd64dba72\");\n * //_result:\n *\n * getIcapAddress(\"XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK36\");\n * //_result:\n *\n * // Throws an error if the ICAP checksum is wrong\n * getIcapAddress(\"XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK37\");\n * //_error:\n */\nexport function getIcapAddress(address) {\n //let base36 = _base16To36(getAddress(address).substring(2)).toUpperCase();\n let base36 = BigInt(getAddress(address)).toString(36).toUpperCase();\n while (base36.length < 30) {\n base36 = \"0\" + base36;\n }\n return \"XE\" + ibanChecksum(\"XE00\" + base36) + base36;\n}\n//# sourceMappingURL=address.js.map","import { assert, assertArgument } from \"../utils/index.js\";\nimport { getAddress } from \"./address.js\";\n/**\n * Returns true if %%value%% is an object which implements the\n * [[Addressable]] interface.\n *\n * @example:\n * // Wallets and AbstractSigner sub-classes\n * isAddressable(Wallet.createRandom())\n * //_result:\n *\n * // Contracts\n * contract = new Contract(\"dai.tokens.ethers.eth\", [ ], provider)\n * isAddressable(contract)\n * //_result:\n */\nexport function isAddressable(value) {\n return (value && typeof (value.getAddress) === \"function\");\n}\n/**\n * Returns true if %%value%% is a valid address.\n *\n * @example:\n * // Valid address\n * isAddress(\"0x8ba1f109551bD432803012645Ac136ddd64DBA72\")\n * //_result:\n *\n * // Valid ICAP address\n * isAddress(\"XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK36\")\n * //_result:\n *\n * // Invalid checksum\n * isAddress(\"0x8Ba1f109551bD432803012645Ac136ddd64DBa72\")\n * //_result:\n *\n * // Invalid ICAP checksum\n * isAddress(\"0x8Ba1f109551bD432803012645Ac136ddd64DBA72\")\n * //_result:\n *\n * // Not an address (an ENS name requires a provided and an\n * // asynchronous API to access)\n * isAddress(\"ricmoo.eth\")\n * //_result:\n */\nexport function isAddress(value) {\n try {\n getAddress(value);\n return true;\n }\n catch (error) { }\n return false;\n}\nasync function checkAddress(target, promise) {\n const result = await promise;\n if (result == null || result === \"0x0000000000000000000000000000000000000000\") {\n assert(typeof (target) !== \"string\", \"unconfigured name\", \"UNCONFIGURED_NAME\", { value: target });\n assertArgument(false, \"invalid AddressLike value; did not resolve to a value address\", \"target\", target);\n }\n return getAddress(result);\n}\n/**\n * Resolves to an address for the %%target%%, which may be any\n * supported address type, an [[Addressable]] or a Promise which\n * resolves to an address.\n *\n * If an ENS name is provided, but that name has not been correctly\n * configured a [[UnconfiguredNameError]] is thrown.\n *\n * @example:\n * addr = \"0x6B175474E89094C44Da98b954EedeAC495271d0F\"\n *\n * // Addresses are return synchronously\n * resolveAddress(addr, provider)\n * //_result:\n *\n * // Address promises are resolved asynchronously\n * resolveAddress(Promise.resolve(addr))\n * //_result:\n *\n * // ENS names are resolved asynchronously\n * resolveAddress(\"dai.tokens.ethers.eth\", provider)\n * //_result:\n *\n * // Addressable objects are resolved asynchronously\n * contract = new Contract(addr, [ ])\n * resolveAddress(contract, provider)\n * //_result:\n *\n * // Unconfigured ENS names reject\n * resolveAddress(\"nothing-here.ricmoo.eth\", provider)\n * //_error:\n *\n * // ENS names require a NameResolver object passed in\n * // (notice the provider was omitted)\n * resolveAddress(\"nothing-here.ricmoo.eth\")\n * //_error:\n */\nexport function resolveAddress(target, resolver) {\n if (typeof (target) === \"string\") {\n if (target.match(/^0x[0-9a-f]{40}$/i)) {\n return getAddress(target);\n }\n assert(resolver != null, \"ENS resolution requires a provider\", \"UNSUPPORTED_OPERATION\", { operation: \"resolveName\" });\n return checkAddress(target, resolver.resolveName(target));\n }\n else if (isAddressable(target)) {\n return checkAddress(target, target.getAddress());\n }\n else if (target && typeof (target.then) === \"function\") {\n return checkAddress(target, target);\n }\n assertArgument(false, \"unsupported addressable value\", \"target\", target);\n}\n//# sourceMappingURL=checks.js.map","/**\n * A Typed object allows a value to have its type explicitly\n * specified.\n *\n * For example, in Solidity, the value ``45`` could represent a\n * ``uint8`` or a ``uint256``. The value ``0x1234`` could represent\n * a ``bytes2`` or ``bytes``.\n *\n * Since JavaScript has no meaningful way to explicitly inform any\n * APIs which what the type is, this allows transparent interoperation\n * with Soldity.\n *\n * @_subsection: api/abi:Typed Values\n */\nimport { assertPrivate, defineProperties } from \"../utils/index.js\";\nconst _gaurd = {};\nfunction n(value, width) {\n let signed = false;\n if (width < 0) {\n signed = true;\n width *= -1;\n }\n // @TODO: Check range is valid for value\n return new Typed(_gaurd, `${signed ? \"\" : \"u\"}int${width}`, value, { signed, width });\n}\nfunction b(value, size) {\n // @TODO: Check range is valid for value\n return new Typed(_gaurd, `bytes${(size) ? size : \"\"}`, value, { size });\n}\nconst _typedSymbol = Symbol.for(\"_ethers_typed\");\n/**\n * The **Typed** class to wrap values providing explicit type information.\n */\nexport class Typed {\n /**\n * The type, as a Solidity-compatible type.\n */\n type;\n /**\n * The actual value.\n */\n value;\n #options;\n /**\n * @_ignore:\n */\n _typedSymbol;\n /**\n * @_ignore:\n */\n constructor(gaurd, type, value, options) {\n if (options == null) {\n options = null;\n }\n assertPrivate(_gaurd, gaurd, \"Typed\");\n defineProperties(this, { _typedSymbol, type, value });\n this.#options = options;\n // Check the value is valid\n this.format();\n }\n /**\n * Format the type as a Human-Readable type.\n */\n format() {\n if (this.type === \"array\") {\n throw new Error(\"\");\n }\n else if (this.type === \"dynamicArray\") {\n throw new Error(\"\");\n }\n else if (this.type === \"tuple\") {\n return `tuple(${this.value.map((v) => v.format()).join(\",\")})`;\n }\n return this.type;\n }\n /**\n * The default value returned by this type.\n */\n defaultValue() {\n return 0;\n }\n /**\n * The minimum value for numeric types.\n */\n minValue() {\n return 0;\n }\n /**\n * The maximum value for numeric types.\n */\n maxValue() {\n return 0;\n }\n /**\n * Returns ``true`` and provides a type guard is this is a [[TypedBigInt]].\n */\n isBigInt() {\n return !!(this.type.match(/^u?int[0-9]+$/));\n }\n /**\n * Returns ``true`` and provides a type guard is this is a [[TypedData]].\n */\n isData() {\n return this.type.startsWith(\"bytes\");\n }\n /**\n * Returns ``true`` and provides a type guard is this is a [[TypedString]].\n */\n isString() {\n return (this.type === \"string\");\n }\n /**\n * Returns the tuple name, if this is a tuple. Throws otherwise.\n */\n get tupleName() {\n if (this.type !== \"tuple\") {\n throw TypeError(\"not a tuple\");\n }\n return this.#options;\n }\n // Returns the length of this type as an array\n // - `null` indicates the length is unforced, it could be dynamic\n // - `-1` indicates the length is dynamic\n // - any other value indicates it is a static array and is its length\n /**\n * Returns the length of the array type or ``-1`` if it is dynamic.\n *\n * Throws if the type is not an array.\n */\n get arrayLength() {\n if (this.type !== \"array\") {\n throw TypeError(\"not an array\");\n }\n if (this.#options === true) {\n return -1;\n }\n if (this.#options === false) {\n return (this.value).length;\n }\n return null;\n }\n /**\n * Returns a new **Typed** of %%type%% with the %%value%%.\n */\n static from(type, value) {\n return new Typed(_gaurd, type, value);\n }\n /**\n * Return a new ``uint8`` type for %%v%%.\n */\n static uint8(v) { return n(v, 8); }\n /**\n * Return a new ``uint16`` type for %%v%%.\n */\n static uint16(v) { return n(v, 16); }\n /**\n * Return a new ``uint24`` type for %%v%%.\n */\n static uint24(v) { return n(v, 24); }\n /**\n * Return a new ``uint32`` type for %%v%%.\n */\n static uint32(v) { return n(v, 32); }\n /**\n * Return a new ``uint40`` type for %%v%%.\n */\n static uint40(v) { return n(v, 40); }\n /**\n * Return a new ``uint48`` type for %%v%%.\n */\n static uint48(v) { return n(v, 48); }\n /**\n * Return a new ``uint56`` type for %%v%%.\n */\n static uint56(v) { return n(v, 56); }\n /**\n * Return a new ``uint64`` type for %%v%%.\n */\n static uint64(v) { return n(v, 64); }\n /**\n * Return a new ``uint72`` type for %%v%%.\n */\n static uint72(v) { return n(v, 72); }\n /**\n * Return a new ``uint80`` type for %%v%%.\n */\n static uint80(v) { return n(v, 80); }\n /**\n * Return a new ``uint88`` type for %%v%%.\n */\n static uint88(v) { return n(v, 88); }\n /**\n * Return a new ``uint96`` type for %%v%%.\n */\n static uint96(v) { return n(v, 96); }\n /**\n * Return a new ``uint104`` type for %%v%%.\n */\n static uint104(v) { return n(v, 104); }\n /**\n * Return a new ``uint112`` type for %%v%%.\n */\n static uint112(v) { return n(v, 112); }\n /**\n * Return a new ``uint120`` type for %%v%%.\n */\n static uint120(v) { return n(v, 120); }\n /**\n * Return a new ``uint128`` type for %%v%%.\n */\n static uint128(v) { return n(v, 128); }\n /**\n * Return a new ``uint136`` type for %%v%%.\n */\n static uint136(v) { return n(v, 136); }\n /**\n * Return a new ``uint144`` type for %%v%%.\n */\n static uint144(v) { return n(v, 144); }\n /**\n * Return a new ``uint152`` type for %%v%%.\n */\n static uint152(v) { return n(v, 152); }\n /**\n * Return a new ``uint160`` type for %%v%%.\n */\n static uint160(v) { return n(v, 160); }\n /**\n * Return a new ``uint168`` type for %%v%%.\n */\n static uint168(v) { return n(v, 168); }\n /**\n * Return a new ``uint176`` type for %%v%%.\n */\n static uint176(v) { return n(v, 176); }\n /**\n * Return a new ``uint184`` type for %%v%%.\n */\n static uint184(v) { return n(v, 184); }\n /**\n * Return a new ``uint192`` type for %%v%%.\n */\n static uint192(v) { return n(v, 192); }\n /**\n * Return a new ``uint200`` type for %%v%%.\n */\n static uint200(v) { return n(v, 200); }\n /**\n * Return a new ``uint208`` type for %%v%%.\n */\n static uint208(v) { return n(v, 208); }\n /**\n * Return a new ``uint216`` type for %%v%%.\n */\n static uint216(v) { return n(v, 216); }\n /**\n * Return a new ``uint224`` type for %%v%%.\n */\n static uint224(v) { return n(v, 224); }\n /**\n * Return a new ``uint232`` type for %%v%%.\n */\n static uint232(v) { return n(v, 232); }\n /**\n * Return a new ``uint240`` type for %%v%%.\n */\n static uint240(v) { return n(v, 240); }\n /**\n * Return a new ``uint248`` type for %%v%%.\n */\n static uint248(v) { return n(v, 248); }\n /**\n * Return a new ``uint256`` type for %%v%%.\n */\n static uint256(v) { return n(v, 256); }\n /**\n * Return a new ``uint256`` type for %%v%%.\n */\n static uint(v) { return n(v, 256); }\n /**\n * Return a new ``int8`` type for %%v%%.\n */\n static int8(v) { return n(v, -8); }\n /**\n * Return a new ``int16`` type for %%v%%.\n */\n static int16(v) { return n(v, -16); }\n /**\n * Return a new ``int24`` type for %%v%%.\n */\n static int24(v) { return n(v, -24); }\n /**\n * Return a new ``int32`` type for %%v%%.\n */\n static int32(v) { return n(v, -32); }\n /**\n * Return a new ``int40`` type for %%v%%.\n */\n static int40(v) { return n(v, -40); }\n /**\n * Return a new ``int48`` type for %%v%%.\n */\n static int48(v) { return n(v, -48); }\n /**\n * Return a new ``int56`` type for %%v%%.\n */\n static int56(v) { return n(v, -56); }\n /**\n * Return a new ``int64`` type for %%v%%.\n */\n static int64(v) { return n(v, -64); }\n /**\n * Return a new ``int72`` type for %%v%%.\n */\n static int72(v) { return n(v, -72); }\n /**\n * Return a new ``int80`` type for %%v%%.\n */\n static int80(v) { return n(v, -80); }\n /**\n * Return a new ``int88`` type for %%v%%.\n */\n static int88(v) { return n(v, -88); }\n /**\n * Return a new ``int96`` type for %%v%%.\n */\n static int96(v) { return n(v, -96); }\n /**\n * Return a new ``int104`` type for %%v%%.\n */\n static int104(v) { return n(v, -104); }\n /**\n * Return a new ``int112`` type for %%v%%.\n */\n static int112(v) { return n(v, -112); }\n /**\n * Return a new ``int120`` type for %%v%%.\n */\n static int120(v) { return n(v, -120); }\n /**\n * Return a new ``int128`` type for %%v%%.\n */\n static int128(v) { return n(v, -128); }\n /**\n * Return a new ``int136`` type for %%v%%.\n */\n static int136(v) { return n(v, -136); }\n /**\n * Return a new ``int144`` type for %%v%%.\n */\n static int144(v) { return n(v, -144); }\n /**\n * Return a new ``int52`` type for %%v%%.\n */\n static int152(v) { return n(v, -152); }\n /**\n * Return a new ``int160`` type for %%v%%.\n */\n static int160(v) { return n(v, -160); }\n /**\n * Return a new ``int168`` type for %%v%%.\n */\n static int168(v) { return n(v, -168); }\n /**\n * Return a new ``int176`` type for %%v%%.\n */\n static int176(v) { return n(v, -176); }\n /**\n * Return a new ``int184`` type for %%v%%.\n */\n static int184(v) { return n(v, -184); }\n /**\n * Return a new ``int92`` type for %%v%%.\n */\n static int192(v) { return n(v, -192); }\n /**\n * Return a new ``int200`` type for %%v%%.\n */\n static int200(v) { return n(v, -200); }\n /**\n * Return a new ``int208`` type for %%v%%.\n */\n static int208(v) { return n(v, -208); }\n /**\n * Return a new ``int216`` type for %%v%%.\n */\n static int216(v) { return n(v, -216); }\n /**\n * Return a new ``int224`` type for %%v%%.\n */\n static int224(v) { return n(v, -224); }\n /**\n * Return a new ``int232`` type for %%v%%.\n */\n static int232(v) { return n(v, -232); }\n /**\n * Return a new ``int240`` type for %%v%%.\n */\n static int240(v) { return n(v, -240); }\n /**\n * Return a new ``int248`` type for %%v%%.\n */\n static int248(v) { return n(v, -248); }\n /**\n * Return a new ``int256`` type for %%v%%.\n */\n static int256(v) { return n(v, -256); }\n /**\n * Return a new ``int256`` type for %%v%%.\n */\n static int(v) { return n(v, -256); }\n /**\n * Return a new ``bytes1`` type for %%v%%.\n */\n static bytes1(v) { return b(v, 1); }\n /**\n * Return a new ``bytes2`` type for %%v%%.\n */\n static bytes2(v) { return b(v, 2); }\n /**\n * Return a new ``bytes3`` type for %%v%%.\n */\n static bytes3(v) { return b(v, 3); }\n /**\n * Return a new ``bytes4`` type for %%v%%.\n */\n static bytes4(v) { return b(v, 4); }\n /**\n * Return a new ``bytes5`` type for %%v%%.\n */\n static bytes5(v) { return b(v, 5); }\n /**\n * Return a new ``bytes6`` type for %%v%%.\n */\n static bytes6(v) { return b(v, 6); }\n /**\n * Return a new ``bytes7`` type for %%v%%.\n */\n static bytes7(v) { return b(v, 7); }\n /**\n * Return a new ``bytes8`` type for %%v%%.\n */\n static bytes8(v) { return b(v, 8); }\n /**\n * Return a new ``bytes9`` type for %%v%%.\n */\n static bytes9(v) { return b(v, 9); }\n /**\n * Return a new ``bytes10`` type for %%v%%.\n */\n static bytes10(v) { return b(v, 10); }\n /**\n * Return a new ``bytes11`` type for %%v%%.\n */\n static bytes11(v) { return b(v, 11); }\n /**\n * Return a new ``bytes12`` type for %%v%%.\n */\n static bytes12(v) { return b(v, 12); }\n /**\n * Return a new ``bytes13`` type for %%v%%.\n */\n static bytes13(v) { return b(v, 13); }\n /**\n * Return a new ``bytes14`` type for %%v%%.\n */\n static bytes14(v) { return b(v, 14); }\n /**\n * Return a new ``bytes15`` type for %%v%%.\n */\n static bytes15(v) { return b(v, 15); }\n /**\n * Return a new ``bytes16`` type for %%v%%.\n */\n static bytes16(v) { return b(v, 16); }\n /**\n * Return a new ``bytes17`` type for %%v%%.\n */\n static bytes17(v) { return b(v, 17); }\n /**\n * Return a new ``bytes18`` type for %%v%%.\n */\n static bytes18(v) { return b(v, 18); }\n /**\n * Return a new ``bytes19`` type for %%v%%.\n */\n static bytes19(v) { return b(v, 19); }\n /**\n * Return a new ``bytes20`` type for %%v%%.\n */\n static bytes20(v) { return b(v, 20); }\n /**\n * Return a new ``bytes21`` type for %%v%%.\n */\n static bytes21(v) { return b(v, 21); }\n /**\n * Return a new ``bytes22`` type for %%v%%.\n */\n static bytes22(v) { return b(v, 22); }\n /**\n * Return a new ``bytes23`` type for %%v%%.\n */\n static bytes23(v) { return b(v, 23); }\n /**\n * Return a new ``bytes24`` type for %%v%%.\n */\n static bytes24(v) { return b(v, 24); }\n /**\n * Return a new ``bytes25`` type for %%v%%.\n */\n static bytes25(v) { return b(v, 25); }\n /**\n * Return a new ``bytes26`` type for %%v%%.\n */\n static bytes26(v) { return b(v, 26); }\n /**\n * Return a new ``bytes27`` type for %%v%%.\n */\n static bytes27(v) { return b(v, 27); }\n /**\n * Return a new ``bytes28`` type for %%v%%.\n */\n static bytes28(v) { return b(v, 28); }\n /**\n * Return a new ``bytes29`` type for %%v%%.\n */\n static bytes29(v) { return b(v, 29); }\n /**\n * Return a new ``bytes30`` type for %%v%%.\n */\n static bytes30(v) { return b(v, 30); }\n /**\n * Return a new ``bytes31`` type for %%v%%.\n */\n static bytes31(v) { return b(v, 31); }\n /**\n * Return a new ``bytes32`` type for %%v%%.\n */\n static bytes32(v) { return b(v, 32); }\n /**\n * Return a new ``address`` type for %%v%%.\n */\n static address(v) { return new Typed(_gaurd, \"address\", v); }\n /**\n * Return a new ``bool`` type for %%v%%.\n */\n static bool(v) { return new Typed(_gaurd, \"bool\", !!v); }\n /**\n * Return a new ``bytes`` type for %%v%%.\n */\n static bytes(v) { return new Typed(_gaurd, \"bytes\", v); }\n /**\n * Return a new ``string`` type for %%v%%.\n */\n static string(v) { return new Typed(_gaurd, \"string\", v); }\n /**\n * Return a new ``array`` type for %%v%%, allowing %%dynamic%% length.\n */\n static array(v, dynamic) {\n throw new Error(\"not implemented yet\");\n return new Typed(_gaurd, \"array\", v, dynamic);\n }\n /**\n * Return a new ``tuple`` type for %%v%%, with the optional %%name%%.\n */\n static tuple(v, name) {\n throw new Error(\"not implemented yet\");\n return new Typed(_gaurd, \"tuple\", v, name);\n }\n /**\n * Return a new ``uint8`` type for %%v%%.\n */\n static overrides(v) {\n return new Typed(_gaurd, \"overrides\", Object.assign({}, v));\n }\n /**\n * Returns true only if %%value%% is a [[Typed]] instance.\n */\n static isTyped(value) {\n return (value\n && typeof (value) === \"object\"\n && \"_typedSymbol\" in value\n && value._typedSymbol === _typedSymbol);\n }\n /**\n * If the value is a [[Typed]] instance, validates the underlying value\n * and returns it, otherwise returns value directly.\n *\n * This is useful for functions that with to accept either a [[Typed]]\n * object or values.\n */\n static dereference(value, type) {\n if (Typed.isTyped(value)) {\n if (value.type !== type) {\n throw new Error(`invalid type: expecetd ${type}, got ${value.type}`);\n }\n return value.value;\n }\n return value;\n }\n}\n//# sourceMappingURL=typed.js.map","import { getAddress } from \"../../address/index.js\";\nimport { toBeHex } from \"../../utils/maths.js\";\nimport { Typed } from \"../typed.js\";\nimport { Coder } from \"./abstract-coder.js\";\n/**\n * @_ignore\n */\nexport class AddressCoder extends Coder {\n constructor(localName) {\n super(\"address\", \"address\", localName, false);\n }\n defaultValue() {\n return \"0x0000000000000000000000000000000000000000\";\n }\n encode(writer, _value) {\n let value = Typed.dereference(_value, \"string\");\n try {\n value = getAddress(value);\n }\n catch (error) {\n return this._throwError(error.message, _value);\n }\n return writer.writeValue(value);\n }\n decode(reader) {\n return getAddress(toBeHex(reader.readValue(), 20));\n }\n}\n//# sourceMappingURL=address.js.map","import { Coder } from \"./abstract-coder.js\";\n/**\n * Clones the functionality of an existing Coder, but without a localName\n *\n * @_ignore\n */\nexport class AnonymousCoder extends Coder {\n coder;\n constructor(coder) {\n super(coder.name, coder.type, \"_\", coder.dynamic);\n this.coder = coder;\n }\n defaultValue() {\n return this.coder.defaultValue();\n }\n encode(writer, value) {\n return this.coder.encode(writer, value);\n }\n decode(reader) {\n return this.coder.decode(reader);\n }\n}\n//# sourceMappingURL=anonymous.js.map","import { defineProperties, isError, assert, assertArgument, assertArgumentCount } from \"../../utils/index.js\";\nimport { Typed } from \"../typed.js\";\nimport { Coder, Result, WordSize, Writer } from \"./abstract-coder.js\";\nimport { AnonymousCoder } from \"./anonymous.js\";\n/**\n * @_ignore\n */\nexport function pack(writer, coders, values) {\n let arrayValues = [];\n if (Array.isArray(values)) {\n arrayValues = values;\n }\n else if (values && typeof (values) === \"object\") {\n let unique = {};\n arrayValues = coders.map((coder) => {\n const name = coder.localName;\n assert(name, \"cannot encode object for signature with missing names\", \"INVALID_ARGUMENT\", { argument: \"values\", info: { coder }, value: values });\n assert(!unique[name], \"cannot encode object for signature with duplicate names\", \"INVALID_ARGUMENT\", { argument: \"values\", info: { coder }, value: values });\n unique[name] = true;\n return values[name];\n });\n }\n else {\n assertArgument(false, \"invalid tuple value\", \"tuple\", values);\n }\n assertArgument(coders.length === arrayValues.length, \"types/value length mismatch\", \"tuple\", values);\n let staticWriter = new Writer();\n let dynamicWriter = new Writer();\n let updateFuncs = [];\n coders.forEach((coder, index) => {\n let value = arrayValues[index];\n if (coder.dynamic) {\n // Get current dynamic offset (for the future pointer)\n let dynamicOffset = dynamicWriter.length;\n // Encode the dynamic value into the dynamicWriter\n coder.encode(dynamicWriter, value);\n // Prepare to populate the correct offset once we are done\n let updateFunc = staticWriter.writeUpdatableValue();\n updateFuncs.push((baseOffset) => {\n updateFunc(baseOffset + dynamicOffset);\n });\n }\n else {\n coder.encode(staticWriter, value);\n }\n });\n // Backfill all the dynamic offsets, now that we know the static length\n updateFuncs.forEach((func) => { func(staticWriter.length); });\n let length = writer.appendWriter(staticWriter);\n length += writer.appendWriter(dynamicWriter);\n return length;\n}\n/**\n * @_ignore\n */\nexport function unpack(reader, coders) {\n let values = [];\n let keys = [];\n // A reader anchored to this base\n let baseReader = reader.subReader(0);\n coders.forEach((coder) => {\n let value = null;\n if (coder.dynamic) {\n let offset = reader.readIndex();\n let offsetReader = baseReader.subReader(offset);\n try {\n value = coder.decode(offsetReader);\n }\n catch (error) {\n // Cannot recover from this\n if (isError(error, \"BUFFER_OVERRUN\")) {\n throw error;\n }\n value = error;\n value.baseType = coder.name;\n value.name = coder.localName;\n value.type = coder.type;\n }\n }\n else {\n try {\n value = coder.decode(reader);\n }\n catch (error) {\n // Cannot recover from this\n if (isError(error, \"BUFFER_OVERRUN\")) {\n throw error;\n }\n value = error;\n value.baseType = coder.name;\n value.name = coder.localName;\n value.type = coder.type;\n }\n }\n if (value == undefined) {\n throw new Error(\"investigate\");\n }\n values.push(value);\n keys.push(coder.localName || null);\n });\n return Result.fromItems(values, keys);\n}\n/**\n * @_ignore\n */\nexport class ArrayCoder extends Coder {\n coder;\n length;\n constructor(coder, length, localName) {\n const type = (coder.type + \"[\" + (length >= 0 ? length : \"\") + \"]\");\n const dynamic = (length === -1 || coder.dynamic);\n super(\"array\", type, localName, dynamic);\n defineProperties(this, { coder, length });\n }\n defaultValue() {\n // Verifies the child coder is valid (even if the array is dynamic or 0-length)\n const defaultChild = this.coder.defaultValue();\n const result = [];\n for (let i = 0; i < this.length; i++) {\n result.push(defaultChild);\n }\n return result;\n }\n encode(writer, _value) {\n const value = Typed.dereference(_value, \"array\");\n if (!Array.isArray(value)) {\n this._throwError(\"expected array value\", value);\n }\n let count = this.length;\n if (count === -1) {\n count = value.length;\n writer.writeValue(value.length);\n }\n assertArgumentCount(value.length, count, \"coder array\" + (this.localName ? (\" \" + this.localName) : \"\"));\n let coders = [];\n for (let i = 0; i < value.length; i++) {\n coders.push(this.coder);\n }\n return pack(writer, coders, value);\n }\n decode(reader) {\n let count = this.length;\n if (count === -1) {\n count = reader.readIndex();\n // Check that there is *roughly* enough data to ensure\n // stray random data is not being read as a length. Each\n // slot requires at least 32 bytes for their value (or 32\n // bytes as a link to the data). This could use a much\n // tighter bound, but we are erroring on the side of safety.\n assert(count * WordSize <= reader.dataLength, \"insufficient data length\", \"BUFFER_OVERRUN\", { buffer: reader.bytes, offset: count * WordSize, length: reader.dataLength });\n }\n let coders = [];\n for (let i = 0; i < count; i++) {\n coders.push(new AnonymousCoder(this.coder));\n }\n return unpack(reader, coders);\n }\n}\n//# sourceMappingURL=array.js.map","import { Typed } from \"../typed.js\";\nimport { Coder } from \"./abstract-coder.js\";\n/**\n * @_ignore\n */\nexport class BooleanCoder extends Coder {\n constructor(localName) {\n super(\"bool\", \"bool\", localName, false);\n }\n defaultValue() {\n return false;\n }\n encode(writer, _value) {\n const value = Typed.dereference(_value, \"bool\");\n return writer.writeValue(value ? 1 : 0);\n }\n decode(reader) {\n return !!reader.readValue();\n }\n}\n//# sourceMappingURL=boolean.js.map","import { getBytesCopy, hexlify } from \"../../utils/index.js\";\nimport { Coder } from \"./abstract-coder.js\";\n/**\n * @_ignore\n */\nexport class DynamicBytesCoder extends Coder {\n constructor(type, localName) {\n super(type, type, localName, true);\n }\n defaultValue() {\n return \"0x\";\n }\n encode(writer, value) {\n value = getBytesCopy(value);\n let length = writer.writeValue(value.length);\n length += writer.writeBytes(value);\n return length;\n }\n decode(reader) {\n return reader.readBytes(reader.readIndex(), true);\n }\n}\n/**\n * @_ignore\n */\nexport class BytesCoder extends DynamicBytesCoder {\n constructor(localName) {\n super(\"bytes\", localName);\n }\n decode(reader) {\n return hexlify(super.decode(reader));\n }\n}\n//# sourceMappingURL=bytes.js.map","import { defineProperties, getBytesCopy, hexlify } from \"../../utils/index.js\";\nimport { Typed } from \"../typed.js\";\nimport { Coder } from \"./abstract-coder.js\";\n/**\n * @_ignore\n */\nexport class FixedBytesCoder extends Coder {\n size;\n constructor(size, localName) {\n let name = \"bytes\" + String(size);\n super(name, name, localName, false);\n defineProperties(this, { size }, { size: \"number\" });\n }\n defaultValue() {\n return (\"0x0000000000000000000000000000000000000000000000000000000000000000\").substring(0, 2 + this.size * 2);\n }\n encode(writer, _value) {\n let data = getBytesCopy(Typed.dereference(_value, this.type));\n if (data.length !== this.size) {\n this._throwError(\"incorrect data length\", _value);\n }\n return writer.writeBytes(data);\n }\n decode(reader) {\n return hexlify(reader.readBytes(this.size));\n }\n}\n//# sourceMappingURL=fixed-bytes.js.map","import { Coder } from \"./abstract-coder.js\";\nconst Empty = new Uint8Array([]);\n/**\n * @_ignore\n */\nexport class NullCoder extends Coder {\n constructor(localName) {\n super(\"null\", \"\", localName, false);\n }\n defaultValue() {\n return null;\n }\n encode(writer, value) {\n if (value != null) {\n this._throwError(\"not null\", value);\n }\n return writer.writeBytes(Empty);\n }\n decode(reader) {\n reader.readBytes(0);\n return null;\n }\n}\n//# sourceMappingURL=null.js.map","import { defineProperties, fromTwos, getBigInt, mask, toTwos } from \"../../utils/index.js\";\nimport { Typed } from \"../typed.js\";\nimport { Coder, WordSize } from \"./abstract-coder.js\";\nconst BN_0 = BigInt(0);\nconst BN_1 = BigInt(1);\nconst BN_MAX_UINT256 = BigInt(\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\");\n/**\n * @_ignore\n */\nexport class NumberCoder extends Coder {\n size;\n signed;\n constructor(size, signed, localName) {\n const name = ((signed ? \"int\" : \"uint\") + (size * 8));\n super(name, name, localName, false);\n defineProperties(this, { size, signed }, { size: \"number\", signed: \"boolean\" });\n }\n defaultValue() {\n return 0;\n }\n encode(writer, _value) {\n let value = getBigInt(Typed.dereference(_value, this.type));\n // Check bounds are safe for encoding\n let maxUintValue = mask(BN_MAX_UINT256, WordSize * 8);\n if (this.signed) {\n let bounds = mask(maxUintValue, (this.size * 8) - 1);\n if (value > bounds || value < -(bounds + BN_1)) {\n this._throwError(\"value out-of-bounds\", _value);\n }\n value = toTwos(value, 8 * WordSize);\n }\n else if (value < BN_0 || value > mask(maxUintValue, this.size * 8)) {\n this._throwError(\"value out-of-bounds\", _value);\n }\n return writer.writeValue(value);\n }\n decode(reader) {\n let value = mask(reader.readValue(), this.size * 8);\n if (this.signed) {\n value = fromTwos(value, this.size * 8);\n }\n return value;\n }\n}\n//# sourceMappingURL=number.js.map","import { toUtf8Bytes, toUtf8String } from \"../../utils/utf8.js\";\nimport { Typed } from \"../typed.js\";\nimport { DynamicBytesCoder } from \"./bytes.js\";\n/**\n * @_ignore\n */\nexport class StringCoder extends DynamicBytesCoder {\n constructor(localName) {\n super(\"string\", localName);\n }\n defaultValue() {\n return \"\";\n }\n encode(writer, _value) {\n return super.encode(writer, toUtf8Bytes(Typed.dereference(_value, \"string\")));\n }\n decode(reader) {\n return toUtf8String(super.decode(reader));\n }\n}\n//# sourceMappingURL=string.js.map","import { defineProperties } from \"../../utils/properties.js\";\nimport { Typed } from \"../typed.js\";\nimport { Coder } from \"./abstract-coder.js\";\nimport { pack, unpack } from \"./array.js\";\n/**\n * @_ignore\n */\nexport class TupleCoder extends Coder {\n coders;\n constructor(coders, localName) {\n let dynamic = false;\n const types = [];\n coders.forEach((coder) => {\n if (coder.dynamic) {\n dynamic = true;\n }\n types.push(coder.type);\n });\n const type = (\"tuple(\" + types.join(\",\") + \")\");\n super(\"tuple\", type, localName, dynamic);\n defineProperties(this, { coders: Object.freeze(coders.slice()) });\n }\n defaultValue() {\n const values = [];\n this.coders.forEach((coder) => {\n values.push(coder.defaultValue());\n });\n // We only output named properties for uniquely named coders\n const uniqueNames = this.coders.reduce((accum, coder) => {\n const name = coder.localName;\n if (name) {\n if (!accum[name]) {\n accum[name] = 0;\n }\n accum[name]++;\n }\n return accum;\n }, {});\n // Add named values\n this.coders.forEach((coder, index) => {\n let name = coder.localName;\n if (!name || uniqueNames[name] !== 1) {\n return;\n }\n if (name === \"length\") {\n name = \"_length\";\n }\n if (values[name] != null) {\n return;\n }\n values[name] = values[index];\n });\n return Object.freeze(values);\n }\n encode(writer, _value) {\n const value = Typed.dereference(_value, \"tuple\");\n return pack(writer, this.coders, value);\n }\n decode(reader) {\n return unpack(reader, this.coders);\n }\n}\n//# sourceMappingURL=tuple.js.map","import { getAddress } from \"../address/index.js\";\nimport { assertArgument, isHexString } from \"../utils/index.js\";\nfunction accessSetify(addr, storageKeys) {\n return {\n address: getAddress(addr),\n storageKeys: storageKeys.map((storageKey, index) => {\n assertArgument(isHexString(storageKey, 32), \"invalid slot\", `storageKeys[${index}]`, storageKey);\n return storageKey.toLowerCase();\n })\n };\n}\n/**\n * Returns a [[AccessList]] from any ethers-supported access-list structure.\n */\nexport function accessListify(value) {\n if (Array.isArray(value)) {\n return value.map((set, index) => {\n if (Array.isArray(set)) {\n assertArgument(set.length === 2, \"invalid slot set\", `value[${index}]`, set);\n return accessSetify(set[0], set[1]);\n }\n assertArgument(set != null && typeof (set) === \"object\", \"invalid address-slot set\", \"value\", value);\n return accessSetify(set.address, set.storageKeys);\n });\n }\n assertArgument(value != null && typeof (value) === \"object\", \"invalid access list\", \"value\", value);\n const result = Object.keys(value).map((addr) => {\n const storageKeys = value[addr].reduce((accum, storageKey) => {\n accum[storageKey] = true;\n return accum;\n }, {});\n return accessSetify(addr, Object.keys(storageKeys).sort());\n });\n result.sort((a, b) => (a.address.localeCompare(b.address)));\n return result;\n}\n//# sourceMappingURL=accesslist.js.map","import { keccak256 } from \"../crypto/index.js\";\nimport { toUtf8Bytes } from \"../utils/index.js\";\n/**\n * A simple hashing function which operates on UTF-8 strings to\n * compute an 32-byte identifier.\n *\n * This simply computes the [UTF-8 bytes](toUtf8Bytes) and computes\n * the [[keccak256]].\n *\n * @example:\n * id(\"hello world\")\n * //_result:\n */\nexport function id(value) {\n return keccak256(toUtf8Bytes(value));\n}\n//# sourceMappingURL=id.js.map","/**\n * A fragment is a single item from an ABI, which may represent any of:\n *\n * - [Functions](FunctionFragment)\n * - [Events](EventFragment)\n * - [Constructors](ConstructorFragment)\n * - Custom [Errors](ErrorFragment)\n * - [Fallback or Receive](FallbackFragment) functions\n *\n * @_subsection api/abi/abi-coder:Fragments [about-fragments]\n */\nimport { defineProperties, getBigInt, getNumber, assert, assertPrivate, assertArgument } from \"../utils/index.js\";\nimport { id } from \"../hash/index.js\";\n;\n// [ \"a\", \"b\" ] => { \"a\": 1, \"b\": 1 }\nfunction setify(items) {\n const result = new Set();\n items.forEach((k) => result.add(k));\n return Object.freeze(result);\n}\nconst _kwVisibDeploy = \"external public payable override\";\nconst KwVisibDeploy = setify(_kwVisibDeploy.split(\" \"));\n// Visibility Keywords\nconst _kwVisib = \"constant external internal payable private public pure view override\";\nconst KwVisib = setify(_kwVisib.split(\" \"));\nconst _kwTypes = \"constructor error event fallback function receive struct\";\nconst KwTypes = setify(_kwTypes.split(\" \"));\nconst _kwModifiers = \"calldata memory storage payable indexed\";\nconst KwModifiers = setify(_kwModifiers.split(\" \"));\nconst _kwOther = \"tuple returns\";\n// All Keywords\nconst _keywords = [_kwTypes, _kwModifiers, _kwOther, _kwVisib].join(\" \");\nconst Keywords = setify(_keywords.split(\" \"));\n// Single character tokens\nconst SimpleTokens = {\n \"(\": \"OPEN_PAREN\", \")\": \"CLOSE_PAREN\",\n \"[\": \"OPEN_BRACKET\", \"]\": \"CLOSE_BRACKET\",\n \",\": \"COMMA\", \"@\": \"AT\"\n};\n// Parser regexes to consume the next token\nconst regexWhitespacePrefix = new RegExp(\"^(\\\\s*)\");\nconst regexNumberPrefix = new RegExp(\"^([0-9]+)\");\nconst regexIdPrefix = new RegExp(\"^([a-zA-Z$_][a-zA-Z0-9$_]*)\");\n// Parser regexs to check validity\nconst regexId = new RegExp(\"^([a-zA-Z$_][a-zA-Z0-9$_]*)$\");\nconst regexType = new RegExp(\"^(address|bool|bytes([0-9]*)|string|u?int([0-9]*))$\");\nclass TokenString {\n #offset;\n #tokens;\n get offset() { return this.#offset; }\n get length() { return this.#tokens.length - this.#offset; }\n constructor(tokens) {\n this.#offset = 0;\n this.#tokens = tokens.slice();\n }\n clone() { return new TokenString(this.#tokens); }\n reset() { this.#offset = 0; }\n #subTokenString(from = 0, to = 0) {\n return new TokenString(this.#tokens.slice(from, to).map((t) => {\n return Object.freeze(Object.assign({}, t, {\n match: (t.match - from),\n linkBack: (t.linkBack - from),\n linkNext: (t.linkNext - from),\n }));\n }));\n }\n // Pops and returns the value of the next token, if it is a keyword in allowed; throws if out of tokens\n popKeyword(allowed) {\n const top = this.peek();\n if (top.type !== \"KEYWORD\" || !allowed.has(top.text)) {\n throw new Error(`expected keyword ${top.text}`);\n }\n return this.pop().text;\n }\n // Pops and returns the value of the next token if it is `type`; throws if out of tokens\n popType(type) {\n if (this.peek().type !== type) {\n const top = this.peek();\n throw new Error(`expected ${type}; got ${top.type} ${JSON.stringify(top.text)}`);\n }\n return this.pop().text;\n }\n // Pops and returns a \"(\" TOKENS \")\"\n popParen() {\n const top = this.peek();\n if (top.type !== \"OPEN_PAREN\") {\n throw new Error(\"bad start\");\n }\n const result = this.#subTokenString(this.#offset + 1, top.match + 1);\n this.#offset = top.match + 1;\n return result;\n }\n // Pops and returns the items within \"(\" ITEM1 \",\" ITEM2 \",\" ... \")\"\n popParams() {\n const top = this.peek();\n if (top.type !== \"OPEN_PAREN\") {\n throw new Error(\"bad start\");\n }\n const result = [];\n while (this.#offset < top.match - 1) {\n const link = this.peek().linkNext;\n result.push(this.#subTokenString(this.#offset + 1, link));\n this.#offset = link;\n }\n this.#offset = top.match + 1;\n return result;\n }\n // Returns the top Token, throwing if out of tokens\n peek() {\n if (this.#offset >= this.#tokens.length) {\n throw new Error(\"out-of-bounds\");\n }\n return this.#tokens[this.#offset];\n }\n // Returns the next value, if it is a keyword in `allowed`\n peekKeyword(allowed) {\n const top = this.peekType(\"KEYWORD\");\n return (top != null && allowed.has(top)) ? top : null;\n }\n // Returns the value of the next token if it is `type`\n peekType(type) {\n if (this.length === 0) {\n return null;\n }\n const top = this.peek();\n return (top.type === type) ? top.text : null;\n }\n // Returns the next token; throws if out of tokens\n pop() {\n const result = this.peek();\n this.#offset++;\n return result;\n }\n toString() {\n const tokens = [];\n for (let i = this.#offset; i < this.#tokens.length; i++) {\n const token = this.#tokens[i];\n tokens.push(`${token.type}:${token.text}`);\n }\n return `<TokenString ${tokens.join(\" \")}>`;\n }\n}\nfunction lex(text) {\n const tokens = [];\n const throwError = (message) => {\n const token = (offset < text.length) ? JSON.stringify(text[offset]) : \"$EOI\";\n throw new Error(`invalid token ${token} at ${offset}: ${message}`);\n };\n let brackets = [];\n let commas = [];\n let offset = 0;\n while (offset < text.length) {\n // Strip off any leading whitespace\n let cur = text.substring(offset);\n let match = cur.match(regexWhitespacePrefix);\n if (match) {\n offset += match[1].length;\n cur = text.substring(offset);\n }\n const token = { depth: brackets.length, linkBack: -1, linkNext: -1, match: -1, type: \"\", text: \"\", offset, value: -1 };\n tokens.push(token);\n let type = (SimpleTokens[cur[0]] || \"\");\n if (type) {\n token.type = type;\n token.text = cur[0];\n offset++;\n if (type === \"OPEN_PAREN\") {\n brackets.push(tokens.length - 1);\n commas.push(tokens.length - 1);\n }\n else if (type == \"CLOSE_PAREN\") {\n if (brackets.length === 0) {\n throwError(\"no matching open bracket\");\n }\n token.match = brackets.pop();\n (tokens[token.match]).match = tokens.length - 1;\n token.depth--;\n token.linkBack = commas.pop();\n (tokens[token.linkBack]).linkNext = tokens.length - 1;\n }\n else if (type === \"COMMA\") {\n token.linkBack = commas.pop();\n (tokens[token.linkBack]).linkNext = tokens.length - 1;\n commas.push(tokens.length - 1);\n }\n else if (type === \"OPEN_BRACKET\") {\n token.type = \"BRACKET\";\n }\n else if (type === \"CLOSE_BRACKET\") {\n // Remove the CLOSE_BRACKET\n let suffix = tokens.pop().text;\n if (tokens.length > 0 && tokens[tokens.length - 1].type === \"NUMBER\") {\n const value = tokens.pop().text;\n suffix = value + suffix;\n (tokens[tokens.length - 1]).value = getNumber(value);\n }\n if (tokens.length === 0 || tokens[tokens.length - 1].type !== \"BRACKET\") {\n throw new Error(\"missing opening bracket\");\n }\n (tokens[tokens.length - 1]).text += suffix;\n }\n continue;\n }\n match = cur.match(regexIdPrefix);\n if (match) {\n token.text = match[1];\n offset += token.text.length;\n if (Keywords.has(token.text)) {\n token.type = \"KEYWORD\";\n continue;\n }\n if (token.text.match(regexType)) {\n token.type = \"TYPE\";\n continue;\n }\n token.type = \"ID\";\n continue;\n }\n match = cur.match(regexNumberPrefix);\n if (match) {\n token.text = match[1];\n token.type = \"NUMBER\";\n offset += token.text.length;\n continue;\n }\n throw new Error(`unexpected token ${JSON.stringify(cur[0])} at position ${offset}`);\n }\n return new TokenString(tokens.map((t) => Object.freeze(t)));\n}\n// Check only one of `allowed` is in `set`\nfunction allowSingle(set, allowed) {\n let included = [];\n for (const key in allowed.keys()) {\n if (set.has(key)) {\n included.push(key);\n }\n }\n if (included.length > 1) {\n throw new Error(`conflicting types: ${included.join(\", \")}`);\n }\n}\n// Functions to process a Solidity Signature TokenString from left-to-right for...\n// ...the name with an optional type, returning the name\nfunction consumeName(type, tokens) {\n if (tokens.peekKeyword(KwTypes)) {\n const keyword = tokens.pop().text;\n if (keyword !== type) {\n throw new Error(`expected ${type}, got ${keyword}`);\n }\n }\n return tokens.popType(\"ID\");\n}\n// ...all keywords matching allowed, returning the keywords\nfunction consumeKeywords(tokens, allowed) {\n const keywords = new Set();\n while (true) {\n const keyword = tokens.peekType(\"KEYWORD\");\n if (keyword == null || (allowed && !allowed.has(keyword))) {\n break;\n }\n tokens.pop();\n if (keywords.has(keyword)) {\n throw new Error(`duplicate keywords: ${JSON.stringify(keyword)}`);\n }\n keywords.add(keyword);\n }\n return Object.freeze(keywords);\n}\n// ...all visibility keywords, returning the coalesced mutability\nfunction consumeMutability(tokens) {\n let modifiers = consumeKeywords(tokens, KwVisib);\n // Detect conflicting modifiers\n allowSingle(modifiers, setify(\"constant payable nonpayable\".split(\" \")));\n allowSingle(modifiers, setify(\"pure view payable nonpayable\".split(\" \")));\n // Process mutability states\n if (modifiers.has(\"view\")) {\n return \"view\";\n }\n if (modifiers.has(\"pure\")) {\n return \"pure\";\n }\n if (modifiers.has(\"payable\")) {\n return \"payable\";\n }\n if (modifiers.has(\"nonpayable\")) {\n return \"nonpayable\";\n }\n // Process legacy `constant` last\n if (modifiers.has(\"constant\")) {\n return \"view\";\n }\n return \"nonpayable\";\n}\n// ...a parameter list, returning the ParamType list\nfunction consumeParams(tokens, allowIndexed) {\n return tokens.popParams().map((t) => ParamType.from(t, allowIndexed));\n}\n// ...a gas limit, returning a BigNumber or null if none\nfunction consumeGas(tokens) {\n if (tokens.peekType(\"AT\")) {\n tokens.pop();\n if (tokens.peekType(\"NUMBER\")) {\n return getBigInt(tokens.pop().text);\n }\n throw new Error(\"invalid gas\");\n }\n return null;\n}\nfunction consumeEoi(tokens) {\n if (tokens.length) {\n throw new Error(`unexpected tokens at offset ${tokens.offset}: ${tokens.toString()}`);\n }\n}\nconst regexArrayType = new RegExp(/^(.*)\\[([0-9]*)\\]$/);\nfunction verifyBasicType(type) {\n const match = type.match(regexType);\n assertArgument(match, \"invalid type\", \"type\", type);\n if (type === \"uint\") {\n return \"uint256\";\n }\n if (type === \"int\") {\n return \"int256\";\n }\n if (match[2]) {\n // bytesXX\n const length = parseInt(match[2]);\n assertArgument(length !== 0 && length <= 32, \"invalid bytes length\", \"type\", type);\n }\n else if (match[3]) {\n // intXX or uintXX\n const size = parseInt(match[3]);\n assertArgument(size !== 0 && size <= 256 && (size % 8) === 0, \"invalid numeric width\", \"type\", type);\n }\n return type;\n}\n// Make the Fragment constructors effectively private\nconst _guard = {};\nconst internal = Symbol.for(\"_ethers_internal\");\nconst ParamTypeInternal = \"_ParamTypeInternal\";\nconst ErrorFragmentInternal = \"_ErrorInternal\";\nconst EventFragmentInternal = \"_EventInternal\";\nconst ConstructorFragmentInternal = \"_ConstructorInternal\";\nconst FallbackFragmentInternal = \"_FallbackInternal\";\nconst FunctionFragmentInternal = \"_FunctionInternal\";\nconst StructFragmentInternal = \"_StructInternal\";\n/**\n * Each input and output of a [[Fragment]] is an Array of **ParamType**.\n */\nexport class ParamType {\n /**\n * The local name of the parameter (or ``\"\"`` if unbound)\n */\n name;\n /**\n * The fully qualified type (e.g. ``\"address\"``, ``\"tuple(address)\"``,\n * ``\"uint256[3][]\"``)\n */\n type;\n /**\n * The base type (e.g. ``\"address\"``, ``\"tuple\"``, ``\"array\"``)\n */\n baseType;\n /**\n * True if the parameters is indexed.\n *\n * For non-indexable types this is ``null``.\n */\n indexed;\n /**\n * The components for the tuple.\n *\n * For non-tuple types this is ``null``.\n */\n components;\n /**\n * The array length, or ``-1`` for dynamic-lengthed arrays.\n *\n * For non-array types this is ``null``.\n */\n arrayLength;\n /**\n * The type of each child in the array.\n *\n * For non-array types this is ``null``.\n */\n arrayChildren;\n /**\n * @private\n */\n constructor(guard, name, type, baseType, indexed, components, arrayLength, arrayChildren) {\n assertPrivate(guard, _guard, \"ParamType\");\n Object.defineProperty(this, internal, { value: ParamTypeInternal });\n if (components) {\n components = Object.freeze(components.slice());\n }\n if (baseType === \"array\") {\n if (arrayLength == null || arrayChildren == null) {\n throw new Error(\"\");\n }\n }\n else if (arrayLength != null || arrayChildren != null) {\n throw new Error(\"\");\n }\n if (baseType === \"tuple\") {\n if (components == null) {\n throw new Error(\"\");\n }\n }\n else if (components != null) {\n throw new Error(\"\");\n }\n defineProperties(this, {\n name, type, baseType, indexed, components, arrayLength, arrayChildren\n });\n }\n /**\n * Return a string representation of this type.\n *\n * For example,\n *\n * ``sighash\" => \"(uint256,address)\"``\n *\n * ``\"minimal\" => \"tuple(uint256,address) indexed\"``\n *\n * ``\"full\" => \"tuple(uint256 foo, address bar) indexed baz\"``\n */\n format(format) {\n if (format == null) {\n format = \"sighash\";\n }\n if (format === \"json\") {\n const name = this.name || \"\";\n if (this.isArray()) {\n const result = JSON.parse(this.arrayChildren.format(\"json\"));\n result.name = name;\n result.type += `[${(this.arrayLength < 0 ? \"\" : String(this.arrayLength))}]`;\n return JSON.stringify(result);\n }\n const result = {\n type: ((this.baseType === \"tuple\") ? \"tuple\" : this.type),\n name\n };\n if (typeof (this.indexed) === \"boolean\") {\n result.indexed = this.indexed;\n }\n if (this.isTuple()) {\n result.components = this.components.map((c) => JSON.parse(c.format(format)));\n }\n return JSON.stringify(result);\n }\n let result = \"\";\n // Array\n if (this.isArray()) {\n result += this.arrayChildren.format(format);\n result += `[${(this.arrayLength < 0 ? \"\" : String(this.arrayLength))}]`;\n }\n else {\n if (this.isTuple()) {\n result += \"(\" + this.components.map((comp) => comp.format(format)).join((format === \"full\") ? \", \" : \",\") + \")\";\n }\n else {\n result += this.type;\n }\n }\n if (format !== \"sighash\") {\n if (this.indexed === true) {\n result += \" indexed\";\n }\n if (format === \"full\" && this.name) {\n result += \" \" + this.name;\n }\n }\n return result;\n }\n /**\n * Returns true if %%this%% is an Array type.\n *\n * This provides a type gaurd ensuring that [[arrayChildren]]\n * and [[arrayLength]] are non-null.\n */\n isArray() {\n return (this.baseType === \"array\");\n }\n /**\n * Returns true if %%this%% is a Tuple type.\n *\n * This provides a type gaurd ensuring that [[components]]\n * is non-null.\n */\n isTuple() {\n return (this.baseType === \"tuple\");\n }\n /**\n * Returns true if %%this%% is an Indexable type.\n *\n * This provides a type gaurd ensuring that [[indexed]]\n * is non-null.\n */\n isIndexable() {\n return (this.indexed != null);\n }\n /**\n * Walks the **ParamType** with %%value%%, calling %%process%%\n * on each type, destructing the %%value%% recursively.\n */\n walk(value, process) {\n if (this.isArray()) {\n if (!Array.isArray(value)) {\n throw new Error(\"invalid array value\");\n }\n if (this.arrayLength !== -1 && value.length !== this.arrayLength) {\n throw new Error(\"array is wrong length\");\n }\n const _this = this;\n return value.map((v) => (_this.arrayChildren.walk(v, process)));\n }\n if (this.isTuple()) {\n if (!Array.isArray(value)) {\n throw new Error(\"invalid tuple value\");\n }\n if (value.length !== this.components.length) {\n throw new Error(\"array is wrong length\");\n }\n const _this = this;\n return value.map((v, i) => (_this.components[i].walk(v, process)));\n }\n return process(this.type, value);\n }\n #walkAsync(promises, value, process, setValue) {\n if (this.isArray()) {\n if (!Array.isArray(value)) {\n throw new Error(\"invalid array value\");\n }\n if (this.arrayLength !== -1 && value.length !== this.arrayLength) {\n throw new Error(\"array is wrong length\");\n }\n const childType = this.arrayChildren;\n const result = value.slice();\n result.forEach((value, index) => {\n childType.#walkAsync(promises, value, process, (value) => {\n result[index] = value;\n });\n });\n setValue(result);\n return;\n }\n if (this.isTuple()) {\n const components = this.components;\n // Convert the object into an array\n let result;\n if (Array.isArray(value)) {\n result = value.slice();\n }\n else {\n if (value == null || typeof (value) !== \"object\") {\n throw new Error(\"invalid tuple value\");\n }\n result = components.map((param) => {\n if (!param.name) {\n throw new Error(\"cannot use object value with unnamed components\");\n }\n if (!(param.name in value)) {\n throw new Error(`missing value for component ${param.name}`);\n }\n return value[param.name];\n });\n }\n if (result.length !== this.components.length) {\n throw new Error(\"array is wrong length\");\n }\n result.forEach((value, index) => {\n components[index].#walkAsync(promises, value, process, (value) => {\n result[index] = value;\n });\n });\n setValue(result);\n return;\n }\n const result = process(this.type, value);\n if (result.then) {\n promises.push((async function () { setValue(await result); })());\n }\n else {\n setValue(result);\n }\n }\n /**\n * Walks the **ParamType** with %%value%%, asynchronously calling\n * %%process%% on each type, destructing the %%value%% recursively.\n *\n * This can be used to resolve ENS names by walking and resolving each\n * ``\"address\"`` type.\n */\n async walkAsync(value, process) {\n const promises = [];\n const result = [value];\n this.#walkAsync(promises, value, process, (value) => {\n result[0] = value;\n });\n if (promises.length) {\n await Promise.all(promises);\n }\n return result[0];\n }\n /**\n * Creates a new **ParamType** for %%obj%%.\n *\n * If %%allowIndexed%% then the ``indexed`` keyword is permitted,\n * otherwise the ``indexed`` keyword will throw an error.\n */\n static from(obj, allowIndexed) {\n if (ParamType.isParamType(obj)) {\n return obj;\n }\n if (typeof (obj) === \"string\") {\n try {\n return ParamType.from(lex(obj), allowIndexed);\n }\n catch (error) {\n assertArgument(false, \"invalid param type\", \"obj\", obj);\n }\n }\n else if (obj instanceof TokenString) {\n let type = \"\", baseType = \"\";\n let comps = null;\n if (consumeKeywords(obj, setify([\"tuple\"])).has(\"tuple\") || obj.peekType(\"OPEN_PAREN\")) {\n // Tuple\n baseType = \"tuple\";\n comps = obj.popParams().map((t) => ParamType.from(t));\n type = `tuple(${comps.map((c) => c.format()).join(\",\")})`;\n }\n else {\n // Normal\n type = verifyBasicType(obj.popType(\"TYPE\"));\n baseType = type;\n }\n // Check for Array\n let arrayChildren = null;\n let arrayLength = null;\n while (obj.length && obj.peekType(\"BRACKET\")) {\n const bracket = obj.pop(); //arrays[i];\n arrayChildren = new ParamType(_guard, \"\", type, baseType, null, comps, arrayLength, arrayChildren);\n arrayLength = bracket.value;\n type += bracket.text;\n baseType = \"array\";\n comps = null;\n }\n let indexed = null;\n const keywords = consumeKeywords(obj, KwModifiers);\n if (keywords.has(\"indexed\")) {\n if (!allowIndexed) {\n throw new Error(\"\");\n }\n indexed = true;\n }\n const name = (obj.peekType(\"ID\") ? obj.pop().text : \"\");\n if (obj.length) {\n throw new Error(\"leftover tokens\");\n }\n return new ParamType(_guard, name, type, baseType, indexed, comps, arrayLength, arrayChildren);\n }\n const name = obj.name;\n assertArgument(!name || (typeof (name) === \"string\" && name.match(regexId)), \"invalid name\", \"obj.name\", name);\n let indexed = obj.indexed;\n if (indexed != null) {\n assertArgument(allowIndexed, \"parameter cannot be indexed\", \"obj.indexed\", obj.indexed);\n indexed = !!indexed;\n }\n let type = obj.type;\n let arrayMatch = type.match(regexArrayType);\n if (arrayMatch) {\n const arrayLength = parseInt(arrayMatch[2] || \"-1\");\n const arrayChildren = ParamType.from({\n type: arrayMatch[1],\n components: obj.components\n });\n return new ParamType(_guard, name || \"\", type, \"array\", indexed, null, arrayLength, arrayChildren);\n }\n if (type === \"tuple\" || type.startsWith(\"tuple(\" /* fix: ) */) || type.startsWith(\"(\" /* fix: ) */)) {\n const comps = (obj.components != null) ? obj.components.map((c) => ParamType.from(c)) : null;\n const tuple = new ParamType(_guard, name || \"\", type, \"tuple\", indexed, comps, null, null);\n // @TODO: use lexer to validate and normalize type\n return tuple;\n }\n type = verifyBasicType(obj.type);\n return new ParamType(_guard, name || \"\", type, type, indexed, null, null, null);\n }\n /**\n * Returns true if %%value%% is a **ParamType**.\n */\n static isParamType(value) {\n return (value && value[internal] === ParamTypeInternal);\n }\n}\n/**\n * An abstract class to represent An individual fragment from a parse ABI.\n */\nexport class Fragment {\n /**\n * The type of the fragment.\n */\n type;\n /**\n * The inputs for the fragment.\n */\n inputs;\n /**\n * @private\n */\n constructor(guard, type, inputs) {\n assertPrivate(guard, _guard, \"Fragment\");\n inputs = Object.freeze(inputs.slice());\n defineProperties(this, { type, inputs });\n }\n /**\n * Creates a new **Fragment** for %%obj%%, wich can be any supported\n * ABI frgament type.\n */\n static from(obj) {\n if (typeof (obj) === \"string\") {\n // Try parsing JSON...\n try {\n Fragment.from(JSON.parse(obj));\n }\n catch (e) { }\n // ...otherwise, use the human-readable lexer\n return Fragment.from(lex(obj));\n }\n if (obj instanceof TokenString) {\n // Human-readable ABI (already lexed)\n const type = obj.peekKeyword(KwTypes);\n switch (type) {\n case \"constructor\": return ConstructorFragment.from(obj);\n case \"error\": return ErrorFragment.from(obj);\n case \"event\": return EventFragment.from(obj);\n case \"fallback\":\n case \"receive\":\n return FallbackFragment.from(obj);\n case \"function\": return FunctionFragment.from(obj);\n case \"struct\": return StructFragment.from(obj);\n }\n }\n else if (typeof (obj) === \"object\") {\n // JSON ABI\n switch (obj.type) {\n case \"constructor\": return ConstructorFragment.from(obj);\n case \"error\": return ErrorFragment.from(obj);\n case \"event\": return EventFragment.from(obj);\n case \"fallback\":\n case \"receive\":\n return FallbackFragment.from(obj);\n case \"function\": return FunctionFragment.from(obj);\n case \"struct\": return StructFragment.from(obj);\n }\n assert(false, `unsupported type: ${obj.type}`, \"UNSUPPORTED_OPERATION\", {\n operation: \"Fragment.from\"\n });\n }\n assertArgument(false, \"unsupported frgament object\", \"obj\", obj);\n }\n /**\n * Returns true if %%value%% is a [[ConstructorFragment]].\n */\n static isConstructor(value) {\n return ConstructorFragment.isFragment(value);\n }\n /**\n * Returns true if %%value%% is an [[ErrorFragment]].\n */\n static isError(value) {\n return ErrorFragment.isFragment(value);\n }\n /**\n * Returns true if %%value%% is an [[EventFragment]].\n */\n static isEvent(value) {\n return EventFragment.isFragment(value);\n }\n /**\n * Returns true if %%value%% is a [[FunctionFragment]].\n */\n static isFunction(value) {\n return FunctionFragment.isFragment(value);\n }\n /**\n * Returns true if %%value%% is a [[StructFragment]].\n */\n static isStruct(value) {\n return StructFragment.isFragment(value);\n }\n}\n/**\n * An abstract class to represent An individual fragment\n * which has a name from a parse ABI.\n */\nexport class NamedFragment extends Fragment {\n /**\n * The name of the fragment.\n */\n name;\n /**\n * @private\n */\n constructor(guard, type, name, inputs) {\n super(guard, type, inputs);\n assertArgument(typeof (name) === \"string\" && name.match(regexId), \"invalid identifier\", \"name\", name);\n inputs = Object.freeze(inputs.slice());\n defineProperties(this, { name });\n }\n}\nfunction joinParams(format, params) {\n return \"(\" + params.map((p) => p.format(format)).join((format === \"full\") ? \", \" : \",\") + \")\";\n}\n/**\n * A Fragment which represents a //Custom Error//.\n */\nexport class ErrorFragment extends NamedFragment {\n /**\n * @private\n */\n constructor(guard, name, inputs) {\n super(guard, \"error\", name, inputs);\n Object.defineProperty(this, internal, { value: ErrorFragmentInternal });\n }\n /**\n * The Custom Error selector.\n */\n get selector() {\n return id(this.format(\"sighash\")).substring(0, 10);\n }\n /**\n * Returns a string representation of this fragment as %%format%%.\n */\n format(format) {\n if (format == null) {\n format = \"sighash\";\n }\n if (format === \"json\") {\n return JSON.stringify({\n type: \"error\",\n name: this.name,\n inputs: this.inputs.map((input) => JSON.parse(input.format(format))),\n });\n }\n const result = [];\n if (format !== \"sighash\") {\n result.push(\"error\");\n }\n result.push(this.name + joinParams(format, this.inputs));\n return result.join(\" \");\n }\n /**\n * Returns a new **ErrorFragment** for %%obj%%.\n */\n static from(obj) {\n if (ErrorFragment.isFragment(obj)) {\n return obj;\n }\n if (typeof (obj) === \"string\") {\n return ErrorFragment.from(lex(obj));\n }\n else if (obj instanceof TokenString) {\n const name = consumeName(\"error\", obj);\n const inputs = consumeParams(obj);\n consumeEoi(obj);\n return new ErrorFragment(_guard, name, inputs);\n }\n return new ErrorFragment(_guard, obj.name, obj.inputs ? obj.inputs.map(ParamType.from) : []);\n }\n /**\n * Returns ``true`` and provides a type guard if %%value%% is an\n * **ErrorFragment**.\n */\n static isFragment(value) {\n return (value && value[internal] === ErrorFragmentInternal);\n }\n}\n/**\n * A Fragment which represents an Event.\n */\nexport class EventFragment extends NamedFragment {\n /**\n * Whether this event is anonymous.\n */\n anonymous;\n /**\n * @private\n */\n constructor(guard, name, inputs, anonymous) {\n super(guard, \"event\", name, inputs);\n Object.defineProperty(this, internal, { value: EventFragmentInternal });\n defineProperties(this, { anonymous });\n }\n /**\n * The Event topic hash.\n */\n get topicHash() {\n return id(this.format(\"sighash\"));\n }\n /**\n * Returns a string representation of this event as %%format%%.\n */\n format(format) {\n if (format == null) {\n format = \"sighash\";\n }\n if (format === \"json\") {\n return JSON.stringify({\n type: \"event\",\n anonymous: this.anonymous,\n name: this.name,\n inputs: this.inputs.map((i) => JSON.parse(i.format(format)))\n });\n }\n const result = [];\n if (format !== \"sighash\") {\n result.push(\"event\");\n }\n result.push(this.name + joinParams(format, this.inputs));\n if (format !== \"sighash\" && this.anonymous) {\n result.push(\"anonymous\");\n }\n return result.join(\" \");\n }\n /**\n * Return the topic hash for an event with %%name%% and %%params%%.\n */\n static getTopicHash(name, params) {\n params = (params || []).map((p) => ParamType.from(p));\n const fragment = new EventFragment(_guard, name, params, false);\n return fragment.topicHash;\n }\n /**\n * Returns a new **EventFragment** for %%obj%%.\n */\n static from(obj) {\n if (EventFragment.isFragment(obj)) {\n return obj;\n }\n if (typeof (obj) === \"string\") {\n try {\n return EventFragment.from(lex(obj));\n }\n catch (error) {\n assertArgument(false, \"invalid event fragment\", \"obj\", obj);\n }\n }\n else if (obj instanceof TokenString) {\n const name = consumeName(\"event\", obj);\n const inputs = consumeParams(obj, true);\n const anonymous = !!consumeKeywords(obj, setify([\"anonymous\"])).has(\"anonymous\");\n consumeEoi(obj);\n return new EventFragment(_guard, name, inputs, anonymous);\n }\n return new EventFragment(_guard, obj.name, obj.inputs ? obj.inputs.map((p) => ParamType.from(p, true)) : [], !!obj.anonymous);\n }\n /**\n * Returns ``true`` and provides a type guard if %%value%% is an\n * **EventFragment**.\n */\n static isFragment(value) {\n return (value && value[internal] === EventFragmentInternal);\n }\n}\n/**\n * A Fragment which represents a constructor.\n */\nexport class ConstructorFragment extends Fragment {\n /**\n * Whether the constructor can receive an endowment.\n */\n payable;\n /**\n * The recommended gas limit for deployment or ``null``.\n */\n gas;\n /**\n * @private\n */\n constructor(guard, type, inputs, payable, gas) {\n super(guard, type, inputs);\n Object.defineProperty(this, internal, { value: ConstructorFragmentInternal });\n defineProperties(this, { payable, gas });\n }\n /**\n * Returns a string representation of this constructor as %%format%%.\n */\n format(format) {\n assert(format != null && format !== \"sighash\", \"cannot format a constructor for sighash\", \"UNSUPPORTED_OPERATION\", { operation: \"format(sighash)\" });\n if (format === \"json\") {\n return JSON.stringify({\n type: \"constructor\",\n stateMutability: (this.payable ? \"payable\" : \"undefined\"),\n payable: this.payable,\n gas: ((this.gas != null) ? this.gas : undefined),\n inputs: this.inputs.map((i) => JSON.parse(i.format(format)))\n });\n }\n const result = [`constructor${joinParams(format, this.inputs)}`];\n if (this.payable) {\n result.push(\"payable\");\n }\n if (this.gas != null) {\n result.push(`@${this.gas.toString()}`);\n }\n return result.join(\" \");\n }\n /**\n * Returns a new **ConstructorFragment** for %%obj%%.\n */\n static from(obj) {\n if (ConstructorFragment.isFragment(obj)) {\n return obj;\n }\n if (typeof (obj) === \"string\") {\n try {\n return ConstructorFragment.from(lex(obj));\n }\n catch (error) {\n assertArgument(false, \"invalid constuctor fragment\", \"obj\", obj);\n }\n }\n else if (obj instanceof TokenString) {\n consumeKeywords(obj, setify([\"constructor\"]));\n const inputs = consumeParams(obj);\n const payable = !!consumeKeywords(obj, KwVisibDeploy).has(\"payable\");\n const gas = consumeGas(obj);\n consumeEoi(obj);\n return new ConstructorFragment(_guard, \"constructor\", inputs, payable, gas);\n }\n return new ConstructorFragment(_guard, \"constructor\", obj.inputs ? obj.inputs.map(ParamType.from) : [], !!obj.payable, (obj.gas != null) ? obj.gas : null);\n }\n /**\n * Returns ``true`` and provides a type guard if %%value%% is a\n * **ConstructorFragment**.\n */\n static isFragment(value) {\n return (value && value[internal] === ConstructorFragmentInternal);\n }\n}\n/**\n * A Fragment which represents a method.\n */\nexport class FallbackFragment extends Fragment {\n /**\n * If the function can be sent value during invocation.\n */\n payable;\n constructor(guard, inputs, payable) {\n super(guard, \"fallback\", inputs);\n Object.defineProperty(this, internal, { value: FallbackFragmentInternal });\n defineProperties(this, { payable });\n }\n /**\n * Returns a string representation of this fallback as %%format%%.\n */\n format(format) {\n const type = ((this.inputs.length === 0) ? \"receive\" : \"fallback\");\n if (format === \"json\") {\n const stateMutability = (this.payable ? \"payable\" : \"nonpayable\");\n return JSON.stringify({ type, stateMutability });\n }\n return `${type}()${this.payable ? \" payable\" : \"\"}`;\n }\n /**\n * Returns a new **FallbackFragment** for %%obj%%.\n */\n static from(obj) {\n if (FallbackFragment.isFragment(obj)) {\n return obj;\n }\n if (typeof (obj) === \"string\") {\n try {\n return FallbackFragment.from(lex(obj));\n }\n catch (error) {\n assertArgument(false, \"invalid fallback fragment\", \"obj\", obj);\n }\n }\n else if (obj instanceof TokenString) {\n const errorObj = obj.toString();\n const topIsValid = obj.peekKeyword(setify([\"fallback\", \"receive\"]));\n assertArgument(topIsValid, \"type must be fallback or receive\", \"obj\", errorObj);\n const type = obj.popKeyword(setify([\"fallback\", \"receive\"]));\n // receive()\n if (type === \"receive\") {\n const inputs = consumeParams(obj);\n assertArgument(inputs.length === 0, `receive cannot have arguments`, \"obj.inputs\", inputs);\n consumeKeywords(obj, setify([\"payable\"]));\n consumeEoi(obj);\n return new FallbackFragment(_guard, [], true);\n }\n // fallback() [payable]\n // fallback(bytes) [payable] returns (bytes)\n let inputs = consumeParams(obj);\n if (inputs.length) {\n assertArgument(inputs.length === 1 && inputs[0].type === \"bytes\", \"invalid fallback inputs\", \"obj.inputs\", inputs.map((i) => i.format(\"minimal\")).join(\", \"));\n }\n else {\n inputs = [ParamType.from(\"bytes\")];\n }\n const mutability = consumeMutability(obj);\n assertArgument(mutability === \"nonpayable\" || mutability === \"payable\", \"fallback cannot be constants\", \"obj.stateMutability\", mutability);\n if (consumeKeywords(obj, setify([\"returns\"])).has(\"returns\")) {\n const outputs = consumeParams(obj);\n assertArgument(outputs.length === 1 && outputs[0].type === \"bytes\", \"invalid fallback outputs\", \"obj.outputs\", outputs.map((i) => i.format(\"minimal\")).join(\", \"));\n }\n consumeEoi(obj);\n return new FallbackFragment(_guard, inputs, mutability === \"payable\");\n }\n if (obj.type === \"receive\") {\n return new FallbackFragment(_guard, [], true);\n }\n if (obj.type === \"fallback\") {\n const inputs = [ParamType.from(\"bytes\")];\n const payable = (obj.stateMutability === \"payable\");\n return new FallbackFragment(_guard, inputs, payable);\n }\n assertArgument(false, \"invalid fallback description\", \"obj\", obj);\n }\n /**\n * Returns ``true`` and provides a type guard if %%value%% is a\n * **FallbackFragment**.\n */\n static isFragment(value) {\n return (value && value[internal] === FallbackFragmentInternal);\n }\n}\n/**\n * A Fragment which represents a method.\n */\nexport class FunctionFragment extends NamedFragment {\n /**\n * If the function is constant (e.g. ``pure`` or ``view`` functions).\n */\n constant;\n /**\n * The returned types for the result of calling this function.\n */\n outputs;\n /**\n * The state mutability (e.g. ``payable``, ``nonpayable``, ``view``\n * or ``pure``)\n */\n stateMutability;\n /**\n * If the function can be sent value during invocation.\n */\n payable;\n /**\n * The recommended gas limit to send when calling this function.\n */\n gas;\n /**\n * @private\n */\n constructor(guard, name, stateMutability, inputs, outputs, gas) {\n super(guard, \"function\", name, inputs);\n Object.defineProperty(this, internal, { value: FunctionFragmentInternal });\n outputs = Object.freeze(outputs.slice());\n const constant = (stateMutability === \"view\" || stateMutability === \"pure\");\n const payable = (stateMutability === \"payable\");\n defineProperties(this, { constant, gas, outputs, payable, stateMutability });\n }\n /**\n * The Function selector.\n */\n get selector() {\n return id(this.format(\"sighash\")).substring(0, 10);\n }\n /**\n * Returns a string representation of this function as %%format%%.\n */\n format(format) {\n if (format == null) {\n format = \"sighash\";\n }\n if (format === \"json\") {\n return JSON.stringify({\n type: \"function\",\n name: this.name,\n constant: this.constant,\n stateMutability: ((this.stateMutability !== \"nonpayable\") ? this.stateMutability : undefined),\n payable: this.payable,\n gas: ((this.gas != null) ? this.gas : undefined),\n inputs: this.inputs.map((i) => JSON.parse(i.format(format))),\n outputs: this.outputs.map((o) => JSON.parse(o.format(format))),\n });\n }\n const result = [];\n if (format !== \"sighash\") {\n result.push(\"function\");\n }\n result.push(this.name + joinParams(format, this.inputs));\n if (format !== \"sighash\") {\n if (this.stateMutability !== \"nonpayable\") {\n result.push(this.stateMutability);\n }\n if (this.outputs && this.outputs.length) {\n result.push(\"returns\");\n result.push(joinParams(format, this.outputs));\n }\n if (this.gas != null) {\n result.push(`@${this.gas.toString()}`);\n }\n }\n return result.join(\" \");\n }\n /**\n * Return the selector for a function with %%name%% and %%params%%.\n */\n static getSelector(name, params) {\n params = (params || []).map((p) => ParamType.from(p));\n const fragment = new FunctionFragment(_guard, name, \"view\", params, [], null);\n return fragment.selector;\n }\n /**\n * Returns a new **FunctionFragment** for %%obj%%.\n */\n static from(obj) {\n if (FunctionFragment.isFragment(obj)) {\n return obj;\n }\n if (typeof (obj) === \"string\") {\n try {\n return FunctionFragment.from(lex(obj));\n }\n catch (error) {\n assertArgument(false, \"invalid function fragment\", \"obj\", obj);\n }\n }\n else if (obj instanceof TokenString) {\n const name = consumeName(\"function\", obj);\n const inputs = consumeParams(obj);\n const mutability = consumeMutability(obj);\n let outputs = [];\n if (consumeKeywords(obj, setify([\"returns\"])).has(\"returns\")) {\n outputs = consumeParams(obj);\n }\n const gas = consumeGas(obj);\n consumeEoi(obj);\n return new FunctionFragment(_guard, name, mutability, inputs, outputs, gas);\n }\n let stateMutability = obj.stateMutability;\n // Use legacy Solidity ABI logic if stateMutability is missing\n if (stateMutability == null) {\n stateMutability = \"payable\";\n if (typeof (obj.constant) === \"boolean\") {\n stateMutability = \"view\";\n if (!obj.constant) {\n stateMutability = \"payable\";\n if (typeof (obj.payable) === \"boolean\" && !obj.payable) {\n stateMutability = \"nonpayable\";\n }\n }\n }\n else if (typeof (obj.payable) === \"boolean\" && !obj.payable) {\n stateMutability = \"nonpayable\";\n }\n }\n // @TODO: verifyState for stateMutability (e.g. throw if\n // payable: false but stateMutability is \"nonpayable\")\n return new FunctionFragment(_guard, obj.name, stateMutability, obj.inputs ? obj.inputs.map(ParamType.from) : [], obj.outputs ? obj.outputs.map(ParamType.from) : [], (obj.gas != null) ? obj.gas : null);\n }\n /**\n * Returns ``true`` and provides a type guard if %%value%% is a\n * **FunctionFragment**.\n */\n static isFragment(value) {\n return (value && value[internal] === FunctionFragmentInternal);\n }\n}\n/**\n * A Fragment which represents a structure.\n */\nexport class StructFragment extends NamedFragment {\n /**\n * @private\n */\n constructor(guard, name, inputs) {\n super(guard, \"struct\", name, inputs);\n Object.defineProperty(this, internal, { value: StructFragmentInternal });\n }\n /**\n * Returns a string representation of this struct as %%format%%.\n */\n format() {\n throw new Error(\"@TODO\");\n }\n /**\n * Returns a new **StructFragment** for %%obj%%.\n */\n static from(obj) {\n if (typeof (obj) === \"string\") {\n try {\n return StructFragment.from(lex(obj));\n }\n catch (error) {\n assertArgument(false, \"invalid struct fragment\", \"obj\", obj);\n }\n }\n else if (obj instanceof TokenString) {\n const name = consumeName(\"struct\", obj);\n const inputs = consumeParams(obj);\n consumeEoi(obj);\n return new StructFragment(_guard, name, inputs);\n }\n return new StructFragment(_guard, obj.name, obj.inputs ? obj.inputs.map(ParamType.from) : []);\n }\n // @TODO: fix this return type\n /**\n * Returns ``true`` and provides a type guard if %%value%% is a\n * **StructFragment**.\n */\n static isFragment(value) {\n return (value && value[internal] === StructFragmentInternal);\n }\n}\n//# sourceMappingURL=fragments.js.map","/**\n * When sending values to or receiving values from a [[Contract]], the\n * data is generally encoded using the [ABI standard](link-solc-abi).\n *\n * The AbiCoder provides a utility to encode values to ABI data and\n * decode values from ABI data.\n *\n * Most of the time, developers should favour the [[Contract]] class,\n * which further abstracts a lot of the finer details of ABI data.\n *\n * @_section api/abi/abi-coder:ABI Encoding\n */\n// See: https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI\nimport { assertArgumentCount, assertArgument } from \"../utils/index.js\";\nimport { Reader, Writer } from \"./coders/abstract-coder.js\";\nimport { AddressCoder } from \"./coders/address.js\";\nimport { ArrayCoder } from \"./coders/array.js\";\nimport { BooleanCoder } from \"./coders/boolean.js\";\nimport { BytesCoder } from \"./coders/bytes.js\";\nimport { FixedBytesCoder } from \"./coders/fixed-bytes.js\";\nimport { NullCoder } from \"./coders/null.js\";\nimport { NumberCoder } from \"./coders/number.js\";\nimport { StringCoder } from \"./coders/string.js\";\nimport { TupleCoder } from \"./coders/tuple.js\";\nimport { ParamType } from \"./fragments.js\";\nimport { getAddress } from \"../address/index.js\";\nimport { getBytes, hexlify, makeError } from \"../utils/index.js\";\n// https://docs.soliditylang.org/en/v0.8.17/control-structures.html\nconst PanicReasons = new Map();\nPanicReasons.set(0x00, \"GENERIC_PANIC\");\nPanicReasons.set(0x01, \"ASSERT_FALSE\");\nPanicReasons.set(0x11, \"OVERFLOW\");\nPanicReasons.set(0x12, \"DIVIDE_BY_ZERO\");\nPanicReasons.set(0x21, \"ENUM_RANGE_ERROR\");\nPanicReasons.set(0x22, \"BAD_STORAGE_DATA\");\nPanicReasons.set(0x31, \"STACK_UNDERFLOW\");\nPanicReasons.set(0x32, \"ARRAY_RANGE_ERROR\");\nPanicReasons.set(0x41, \"OUT_OF_MEMORY\");\nPanicReasons.set(0x51, \"UNINITIALIZED_FUNCTION_CALL\");\nconst paramTypeBytes = new RegExp(/^bytes([0-9]*)$/);\nconst paramTypeNumber = new RegExp(/^(u?int)([0-9]*)$/);\nlet defaultCoder = null;\nlet defaultMaxInflation = 1024;\nfunction getBuiltinCallException(action, tx, data, abiCoder) {\n let message = \"missing revert data\";\n let reason = null;\n const invocation = null;\n let revert = null;\n if (data) {\n message = \"execution reverted\";\n const bytes = getBytes(data);\n data = hexlify(data);\n if (bytes.length === 0) {\n message += \" (no data present; likely require(false) occurred\";\n reason = \"require(false)\";\n }\n else if (bytes.length % 32 !== 4) {\n message += \" (could not decode reason; invalid data length)\";\n }\n else if (hexlify(bytes.slice(0, 4)) === \"0x08c379a0\") {\n // Error(string)\n try {\n reason = abiCoder.decode([\"string\"], bytes.slice(4))[0];\n revert = {\n signature: \"Error(string)\",\n name: \"Error\",\n args: [reason]\n };\n message += `: ${JSON.stringify(reason)}`;\n }\n catch (error) {\n message += \" (could not decode reason; invalid string data)\";\n }\n }\n else if (hexlify(bytes.slice(0, 4)) === \"0x4e487b71\") {\n // Panic(uint256)\n try {\n const code = Number(abiCoder.decode([\"uint256\"], bytes.slice(4))[0]);\n revert = {\n signature: \"Panic(uint256)\",\n name: \"Panic\",\n args: [code]\n };\n reason = `Panic due to ${PanicReasons.get(code) || \"UNKNOWN\"}(${code})`;\n message += `: ${reason}`;\n }\n catch (error) {\n message += \" (could not decode panic code)\";\n }\n }\n else {\n message += \" (unknown custom error)\";\n }\n }\n const transaction = {\n to: (tx.to ? getAddress(tx.to) : null),\n data: (tx.data || \"0x\")\n };\n if (tx.from) {\n transaction.from = getAddress(tx.from);\n }\n return makeError(message, \"CALL_EXCEPTION\", {\n action, data, reason, transaction, invocation, revert\n });\n}\n/**\n * The **AbiCoder** is a low-level class responsible for encoding JavaScript\n * values into binary data and decoding binary data into JavaScript values.\n */\nexport class AbiCoder {\n #getCoder(param) {\n if (param.isArray()) {\n return new ArrayCoder(this.#getCoder(param.arrayChildren), param.arrayLength, param.name);\n }\n if (param.isTuple()) {\n return new TupleCoder(param.components.map((c) => this.#getCoder(c)), param.name);\n }\n switch (param.baseType) {\n case \"address\":\n return new AddressCoder(param.name);\n case \"bool\":\n return new BooleanCoder(param.name);\n case \"string\":\n return new StringCoder(param.name);\n case \"bytes\":\n return new BytesCoder(param.name);\n case \"\":\n return new NullCoder(param.name);\n }\n // u?int[0-9]*\n let match = param.type.match(paramTypeNumber);\n if (match) {\n let size = parseInt(match[2] || \"256\");\n assertArgument(size !== 0 && size <= 256 && (size % 8) === 0, \"invalid \" + match[1] + \" bit length\", \"param\", param);\n return new NumberCoder(size / 8, (match[1] === \"int\"), param.name);\n }\n // bytes[0-9]+\n match = param.type.match(paramTypeBytes);\n if (match) {\n let size = parseInt(match[1]);\n assertArgument(size !== 0 && size <= 32, \"invalid bytes length\", \"param\", param);\n return new FixedBytesCoder(size, param.name);\n }\n assertArgument(false, \"invalid type\", \"type\", param.type);\n }\n /**\n * Get the default values for the given %%types%%.\n *\n * For example, a ``uint`` is by default ``0`` and ``bool``\n * is by default ``false``.\n */\n getDefaultValue(types) {\n const coders = types.map((type) => this.#getCoder(ParamType.from(type)));\n const coder = new TupleCoder(coders, \"_\");\n return coder.defaultValue();\n }\n /**\n * Encode the %%values%% as the %%types%% into ABI data.\n *\n * @returns DataHexstring\n */\n encode(types, values) {\n assertArgumentCount(values.length, types.length, \"types/values length mismatch\");\n const coders = types.map((type) => this.#getCoder(ParamType.from(type)));\n const coder = (new TupleCoder(coders, \"_\"));\n const writer = new Writer();\n coder.encode(writer, values);\n return writer.data;\n }\n /**\n * Decode the ABI %%data%% as the %%types%% into values.\n *\n * If %%loose%% decoding is enabled, then strict padding is\n * not enforced. Some older versions of Solidity incorrectly\n * padded event data emitted from ``external`` functions.\n */\n decode(types, data, loose) {\n const coders = types.map((type) => this.#getCoder(ParamType.from(type)));\n const coder = new TupleCoder(coders, \"_\");\n return coder.decode(new Reader(data, loose, defaultMaxInflation));\n }\n static _setDefaultMaxInflation(value) {\n assertArgument(typeof (value) === \"number\" && Number.isInteger(value), \"invalid defaultMaxInflation factor\", \"value\", value);\n defaultMaxInflation = value;\n }\n /**\n * Returns the shared singleton instance of a default [[AbiCoder]].\n *\n * On the first call, the instance is created internally.\n */\n static defaultAbiCoder() {\n if (defaultCoder == null) {\n defaultCoder = new AbiCoder();\n }\n return defaultCoder;\n }\n /**\n * Returns an ethers-compatible [[CallExceptionError]] Error for the given\n * result %%data%% for the [[CallExceptionAction]] %%action%% against\n * the Transaction %%tx%%.\n */\n static getBuiltinCallException(action, tx, data) {\n return getBuiltinCallException(action, tx, data, AbiCoder.defaultAbiCoder());\n }\n}\n//# sourceMappingURL=abi-coder.js.map","/**\n * The Interface class is a low-level class that accepts an\n * ABI and provides all the necessary functionality to encode\n * and decode paramaters to and results from methods, events\n * and errors.\n *\n * It also provides several convenience methods to automatically\n * search and find matching transactions and events to parse them.\n *\n * @_subsection api/abi:Interfaces [interfaces]\n */\nimport { keccak256 } from \"../crypto/index.js\";\nimport { id } from \"../hash/index.js\";\nimport { concat, dataSlice, getBigInt, getBytes, getBytesCopy, hexlify, zeroPadBytes, zeroPadValue, isHexString, defineProperties, assertArgument, toBeHex, assert } from \"../utils/index.js\";\nimport { AbiCoder } from \"./abi-coder.js\";\nimport { checkResultErrors, Result } from \"./coders/abstract-coder.js\";\nimport { ConstructorFragment, ErrorFragment, EventFragment, Fragment, FunctionFragment, ParamType } from \"./fragments.js\";\nimport { Typed } from \"./typed.js\";\nexport { checkResultErrors, Result };\n/**\n * When using the [[Interface-parseLog]] to automatically match a Log to its event\n * for parsing, a **LogDescription** is returned.\n */\nexport class LogDescription {\n /**\n * The matching fragment for the ``topic0``.\n */\n fragment;\n /**\n * The name of the Event.\n */\n name;\n /**\n * The full Event signature.\n */\n signature;\n /**\n * The topic hash for the Event.\n */\n topic;\n /**\n * The arguments passed into the Event with ``emit``.\n */\n args;\n /**\n * @_ignore:\n */\n constructor(fragment, topic, args) {\n const name = fragment.name, signature = fragment.format();\n defineProperties(this, {\n fragment, name, signature, topic, args\n });\n }\n}\n/**\n * When using the [[Interface-parseTransaction]] to automatically match\n * a transaction data to its function for parsing,\n * a **TransactionDescription** is returned.\n */\nexport class TransactionDescription {\n /**\n * The matching fragment from the transaction ``data``.\n */\n fragment;\n /**\n * The name of the Function from the transaction ``data``.\n */\n name;\n /**\n * The arguments passed to the Function from the transaction ``data``.\n */\n args;\n /**\n * The full Function signature from the transaction ``data``.\n */\n signature;\n /**\n * The selector for the Function from the transaction ``data``.\n */\n selector;\n /**\n * The ``value`` (in wei) from the transaction.\n */\n value;\n /**\n * @_ignore:\n */\n constructor(fragment, selector, args, value) {\n const name = fragment.name, signature = fragment.format();\n defineProperties(this, {\n fragment, name, args, signature, selector, value\n });\n }\n}\n/**\n * When using the [[Interface-parseError]] to automatically match an\n * error for a call result for parsing, an **ErrorDescription** is returned.\n */\nexport class ErrorDescription {\n /**\n * The matching fragment.\n */\n fragment;\n /**\n * The name of the Error.\n */\n name;\n /**\n * The arguments passed to the Error with ``revert``.\n */\n args;\n /**\n * The full Error signature.\n */\n signature;\n /**\n * The selector for the Error.\n */\n selector;\n /**\n * @_ignore:\n */\n constructor(fragment, selector, args) {\n const name = fragment.name, signature = fragment.format();\n defineProperties(this, {\n fragment, name, args, signature, selector\n });\n }\n}\n/**\n * An **Indexed** is used as a value when a value that does not\n * fit within a topic (i.e. not a fixed-length, 32-byte type). It\n * is the ``keccak256`` of the value, and used for types such as\n * arrays, tuples, bytes and strings.\n */\nexport class Indexed {\n /**\n * The ``keccak256`` of the value logged.\n */\n hash;\n /**\n * @_ignore:\n */\n _isIndexed;\n /**\n * Returns ``true`` if %%value%% is an **Indexed**.\n *\n * This provides a Type Guard for property access.\n */\n static isIndexed(value) {\n return !!(value && value._isIndexed);\n }\n /**\n * @_ignore:\n */\n constructor(hash) {\n defineProperties(this, { hash, _isIndexed: true });\n }\n}\n// https://docs.soliditylang.org/en/v0.8.13/control-structures.html?highlight=panic#panic-via-assert-and-error-via-require\nconst PanicReasons = {\n \"0\": \"generic panic\",\n \"1\": \"assert(false)\",\n \"17\": \"arithmetic overflow\",\n \"18\": \"division or modulo by zero\",\n \"33\": \"enum overflow\",\n \"34\": \"invalid encoded storage byte array accessed\",\n \"49\": \"out-of-bounds array access; popping on an empty array\",\n \"50\": \"out-of-bounds access of an array or bytesN\",\n \"65\": \"out of memory\",\n \"81\": \"uninitialized function\",\n};\nconst BuiltinErrors = {\n \"0x08c379a0\": {\n signature: \"Error(string)\",\n name: \"Error\",\n inputs: [\"string\"],\n reason: (message) => {\n return `reverted with reason string ${JSON.stringify(message)}`;\n }\n },\n \"0x4e487b71\": {\n signature: \"Panic(uint256)\",\n name: \"Panic\",\n inputs: [\"uint256\"],\n reason: (code) => {\n let reason = \"unknown panic code\";\n if (code >= 0 && code <= 0xff && PanicReasons[code.toString()]) {\n reason = PanicReasons[code.toString()];\n }\n return `reverted with panic code 0x${code.toString(16)} (${reason})`;\n }\n }\n};\n/**\n * An Interface abstracts many of the low-level details for\n * encoding and decoding the data on the blockchain.\n *\n * An ABI provides information on how to encode data to send to\n * a Contract, how to decode the results and events and how to\n * interpret revert errors.\n *\n * The ABI can be specified by [any supported format](InterfaceAbi).\n */\nexport class Interface {\n /**\n * All the Contract ABI members (i.e. methods, events, errors, etc).\n */\n fragments;\n /**\n * The Contract constructor.\n */\n deploy;\n /**\n * The Fallback method, if any.\n */\n fallback;\n /**\n * If receiving ether is supported.\n */\n receive;\n #errors;\n #events;\n #functions;\n // #structs: Map<string, StructFragment>;\n #abiCoder;\n /**\n * Create a new Interface for the %%fragments%%.\n */\n constructor(fragments) {\n let abi = [];\n if (typeof (fragments) === \"string\") {\n abi = JSON.parse(fragments);\n }\n else {\n abi = fragments;\n }\n this.#functions = new Map();\n this.#errors = new Map();\n this.#events = new Map();\n // this.#structs = new Map();\n const frags = [];\n for (const a of abi) {\n try {\n frags.push(Fragment.from(a));\n }\n catch (error) {\n console.log(`[Warning] Invalid Fragment ${JSON.stringify(a)}:`, error.message);\n }\n }\n defineProperties(this, {\n fragments: Object.freeze(frags)\n });\n let fallback = null;\n let receive = false;\n this.#abiCoder = this.getAbiCoder();\n // Add all fragments by their signature\n this.fragments.forEach((fragment, index) => {\n let bucket;\n switch (fragment.type) {\n case \"constructor\":\n if (this.deploy) {\n console.log(\"duplicate definition - constructor\");\n return;\n }\n //checkNames(fragment, \"input\", fragment.inputs);\n defineProperties(this, { deploy: fragment });\n return;\n case \"fallback\":\n if (fragment.inputs.length === 0) {\n receive = true;\n }\n else {\n assertArgument(!fallback || fragment.payable !== fallback.payable, \"conflicting fallback fragments\", `fragments[${index}]`, fragment);\n fallback = fragment;\n receive = fallback.payable;\n }\n return;\n case \"function\":\n //checkNames(fragment, \"input\", fragment.inputs);\n //checkNames(fragment, \"output\", (<FunctionFragment>fragment).outputs);\n bucket = this.#functions;\n break;\n case \"event\":\n //checkNames(fragment, \"input\", fragment.inputs);\n bucket = this.#events;\n break;\n case \"error\":\n bucket = this.#errors;\n break;\n default:\n return;\n }\n // Two identical entries; ignore it\n const signature = fragment.format();\n if (bucket.has(signature)) {\n return;\n }\n bucket.set(signature, fragment);\n });\n // If we do not have a constructor add a default\n if (!this.deploy) {\n defineProperties(this, {\n deploy: ConstructorFragment.from(\"constructor()\")\n });\n }\n defineProperties(this, { fallback, receive });\n }\n /**\n * Returns the entire Human-Readable ABI, as an array of\n * signatures, optionally as %%minimal%% strings, which\n * removes parameter names and unneceesary spaces.\n */\n format(minimal) {\n const format = (minimal ? \"minimal\" : \"full\");\n const abi = this.fragments.map((f) => f.format(format));\n return abi;\n }\n /**\n * Return the JSON-encoded ABI. This is the format Solidiy\n * returns.\n */\n formatJson() {\n const abi = this.fragments.map((f) => f.format(\"json\"));\n // We need to re-bundle the JSON fragments a bit\n return JSON.stringify(abi.map((j) => JSON.parse(j)));\n }\n /**\n * The ABI coder that will be used to encode and decode binary\n * data.\n */\n getAbiCoder() {\n return AbiCoder.defaultAbiCoder();\n }\n // Find a function definition by any means necessary (unless it is ambiguous)\n #getFunction(key, values, forceUnique) {\n // Selector\n if (isHexString(key)) {\n const selector = key.toLowerCase();\n for (const fragment of this.#functions.values()) {\n if (selector === fragment.selector) {\n return fragment;\n }\n }\n return null;\n }\n // It is a bare name, look up the function (will return null if ambiguous)\n if (key.indexOf(\"(\") === -1) {\n const matching = [];\n for (const [name, fragment] of this.#functions) {\n if (name.split(\"(\" /* fix:) */)[0] === key) {\n matching.push(fragment);\n }\n }\n if (values) {\n const lastValue = (values.length > 0) ? values[values.length - 1] : null;\n let valueLength = values.length;\n let allowOptions = true;\n if (Typed.isTyped(lastValue) && lastValue.type === \"overrides\") {\n allowOptions = false;\n valueLength--;\n }\n // Remove all matches that don't have a compatible length. The args\n // may contain an overrides, so the match may have n or n - 1 parameters\n for (let i = matching.length - 1; i >= 0; i--) {\n const inputs = matching[i].inputs.length;\n if (inputs !== valueLength && (!allowOptions || inputs !== valueLength - 1)) {\n matching.splice(i, 1);\n }\n }\n // Remove all matches that don't match the Typed signature\n for (let i = matching.length - 1; i >= 0; i--) {\n const inputs = matching[i].inputs;\n for (let j = 0; j < values.length; j++) {\n // Not a typed value\n if (!Typed.isTyped(values[j])) {\n continue;\n }\n // We are past the inputs\n if (j >= inputs.length) {\n if (values[j].type === \"overrides\") {\n continue;\n }\n matching.splice(i, 1);\n break;\n }\n // Make sure the value type matches the input type\n if (values[j].type !== inputs[j].baseType) {\n matching.splice(i, 1);\n break;\n }\n }\n }\n }\n // We found a single matching signature with an overrides, but the\n // last value is something that cannot possibly be an options\n if (matching.length === 1 && values && values.length !== matching[0].inputs.length) {\n const lastArg = values[values.length - 1];\n if (lastArg == null || Array.isArray(lastArg) || typeof (lastArg) !== \"object\") {\n matching.splice(0, 1);\n }\n }\n if (matching.length === 0) {\n return null;\n }\n if (matching.length > 1 && forceUnique) {\n const matchStr = matching.map((m) => JSON.stringify(m.format())).join(\", \");\n assertArgument(false, `ambiguous function description (i.e. matches ${matchStr})`, \"key\", key);\n }\n return matching[0];\n }\n // Normalize the signature and lookup the function\n const result = this.#functions.get(FunctionFragment.from(key).format());\n if (result) {\n return result;\n }\n return null;\n }\n /**\n * Get the function name for %%key%%, which may be a function selector,\n * function name or function signature that belongs to the ABI.\n */\n getFunctionName(key) {\n const fragment = this.#getFunction(key, null, false);\n assertArgument(fragment, \"no matching function\", \"key\", key);\n return fragment.name;\n }\n /**\n * Returns true if %%key%% (a function selector, function name or\n * function signature) is present in the ABI.\n *\n * In the case of a function name, the name may be ambiguous, so\n * accessing the [[FunctionFragment]] may require refinement.\n */\n hasFunction(key) {\n return !!this.#getFunction(key, null, false);\n }\n /**\n * Get the [[FunctionFragment]] for %%key%%, which may be a function\n * selector, function name or function signature that belongs to the ABI.\n *\n * If %%values%% is provided, it will use the Typed API to handle\n * ambiguous cases where multiple functions match by name.\n *\n * If the %%key%% and %%values%% do not refine to a single function in\n * the ABI, this will throw.\n */\n getFunction(key, values) {\n return this.#getFunction(key, values || null, true);\n }\n /**\n * Iterate over all functions, calling %%callback%%, sorted by their name.\n */\n forEachFunction(callback) {\n const names = Array.from(this.#functions.keys());\n names.sort((a, b) => a.localeCompare(b));\n for (let i = 0; i < names.length; i++) {\n const name = names[i];\n callback((this.#functions.get(name)), i);\n }\n }\n // Find an event definition by any means necessary (unless it is ambiguous)\n #getEvent(key, values, forceUnique) {\n // EventTopic\n if (isHexString(key)) {\n const eventTopic = key.toLowerCase();\n for (const fragment of this.#events.values()) {\n if (eventTopic === fragment.topicHash) {\n return fragment;\n }\n }\n return null;\n }\n // It is a bare name, look up the function (will return null if ambiguous)\n if (key.indexOf(\"(\") === -1) {\n const matching = [];\n for (const [name, fragment] of this.#events) {\n if (name.split(\"(\" /* fix:) */)[0] === key) {\n matching.push(fragment);\n }\n }\n if (values) {\n // Remove all matches that don't have a compatible length.\n for (let i = matching.length - 1; i >= 0; i--) {\n if (matching[i].inputs.length < values.length) {\n matching.splice(i, 1);\n }\n }\n // Remove all matches that don't match the Typed signature\n for (let i = matching.length - 1; i >= 0; i--) {\n const inputs = matching[i].inputs;\n for (let j = 0; j < values.length; j++) {\n // Not a typed value\n if (!Typed.isTyped(values[j])) {\n continue;\n }\n // Make sure the value type matches the input type\n if (values[j].type !== inputs[j].baseType) {\n matching.splice(i, 1);\n break;\n }\n }\n }\n }\n if (matching.length === 0) {\n return null;\n }\n if (matching.length > 1 && forceUnique) {\n const matchStr = matching.map((m) => JSON.stringify(m.format())).join(\", \");\n assertArgument(false, `ambiguous event description (i.e. matches ${matchStr})`, \"key\", key);\n }\n return matching[0];\n }\n // Normalize the signature and lookup the function\n const result = this.#events.get(EventFragment.from(key).format());\n if (result) {\n return result;\n }\n return null;\n }\n /**\n * Get the event name for %%key%%, which may be a topic hash,\n * event name or event signature that belongs to the ABI.\n */\n getEventName(key) {\n const fragment = this.#getEvent(key, null, false);\n assertArgument(fragment, \"no matching event\", \"key\", key);\n return fragment.name;\n }\n /**\n * Returns true if %%key%% (an event topic hash, event name or\n * event signature) is present in the ABI.\n *\n * In the case of an event name, the name may be ambiguous, so\n * accessing the [[EventFragment]] may require refinement.\n */\n hasEvent(key) {\n return !!this.#getEvent(key, null, false);\n }\n /**\n * Get the [[EventFragment]] for %%key%%, which may be a topic hash,\n * event name or event signature that belongs to the ABI.\n *\n * If %%values%% is provided, it will use the Typed API to handle\n * ambiguous cases where multiple events match by name.\n *\n * If the %%key%% and %%values%% do not refine to a single event in\n * the ABI, this will throw.\n */\n getEvent(key, values) {\n return this.#getEvent(key, values || null, true);\n }\n /**\n * Iterate over all events, calling %%callback%%, sorted by their name.\n */\n forEachEvent(callback) {\n const names = Array.from(this.#events.keys());\n names.sort((a, b) => a.localeCompare(b));\n for (let i = 0; i < names.length; i++) {\n const name = names[i];\n callback((this.#events.get(name)), i);\n }\n }\n /**\n * Get the [[ErrorFragment]] for %%key%%, which may be an error\n * selector, error name or error signature that belongs to the ABI.\n *\n * If %%values%% is provided, it will use the Typed API to handle\n * ambiguous cases where multiple errors match by name.\n *\n * If the %%key%% and %%values%% do not refine to a single error in\n * the ABI, this will throw.\n */\n getError(key, values) {\n if (isHexString(key)) {\n const selector = key.toLowerCase();\n if (BuiltinErrors[selector]) {\n return ErrorFragment.from(BuiltinErrors[selector].signature);\n }\n for (const fragment of this.#errors.values()) {\n if (selector === fragment.selector) {\n return fragment;\n }\n }\n return null;\n }\n // It is a bare name, look up the function (will return null if ambiguous)\n if (key.indexOf(\"(\") === -1) {\n const matching = [];\n for (const [name, fragment] of this.#errors) {\n if (name.split(\"(\" /* fix:) */)[0] === key) {\n matching.push(fragment);\n }\n }\n if (matching.length === 0) {\n if (key === \"Error\") {\n return ErrorFragment.from(\"error Error(string)\");\n }\n if (key === \"Panic\") {\n return ErrorFragment.from(\"error Panic(uint256)\");\n }\n return null;\n }\n else if (matching.length > 1) {\n const matchStr = matching.map((m) => JSON.stringify(m.format())).join(\", \");\n assertArgument(false, `ambiguous error description (i.e. ${matchStr})`, \"name\", key);\n }\n return matching[0];\n }\n // Normalize the signature and lookup the function\n key = ErrorFragment.from(key).format();\n if (key === \"Error(string)\") {\n return ErrorFragment.from(\"error Error(string)\");\n }\n if (key === \"Panic(uint256)\") {\n return ErrorFragment.from(\"error Panic(uint256)\");\n }\n const result = this.#errors.get(key);\n if (result) {\n return result;\n }\n return null;\n }\n /**\n * Iterate over all errors, calling %%callback%%, sorted by their name.\n */\n forEachError(callback) {\n const names = Array.from(this.#errors.keys());\n names.sort((a, b) => a.localeCompare(b));\n for (let i = 0; i < names.length; i++) {\n const name = names[i];\n callback((this.#errors.get(name)), i);\n }\n }\n // Get the 4-byte selector used by Solidity to identify a function\n /*\ngetSelector(fragment: ErrorFragment | FunctionFragment): string {\n if (typeof(fragment) === \"string\") {\n const matches: Array<Fragment> = [ ];\n\n try { matches.push(this.getFunction(fragment)); } catch (error) { }\n try { matches.push(this.getError(<string>fragment)); } catch (_) { }\n\n if (matches.length === 0) {\n logger.throwArgumentError(\"unknown fragment\", \"key\", fragment);\n } else if (matches.length > 1) {\n logger.throwArgumentError(\"ambiguous fragment matches function and error\", \"key\", fragment);\n }\n\n fragment = matches[0];\n }\n\n return dataSlice(id(fragment.format()), 0, 4);\n}\n */\n // Get the 32-byte topic hash used by Solidity to identify an event\n /*\n getEventTopic(fragment: EventFragment): string {\n //if (typeof(fragment) === \"string\") { fragment = this.getEvent(eventFragment); }\n return id(fragment.format());\n }\n */\n _decodeParams(params, data) {\n return this.#abiCoder.decode(params, data);\n }\n _encodeParams(params, values) {\n return this.#abiCoder.encode(params, values);\n }\n /**\n * Encodes a ``tx.data`` object for deploying the Contract with\n * the %%values%% as the constructor arguments.\n */\n encodeDeploy(values) {\n return this._encodeParams(this.deploy.inputs, values || []);\n }\n /**\n * Decodes the result %%data%% (e.g. from an ``eth_call``) for the\n * specified error (see [[getError]] for valid values for\n * %%key%%).\n *\n * Most developers should prefer the [[parseCallResult]] method instead,\n * which will automatically detect a ``CALL_EXCEPTION`` and throw the\n * corresponding error.\n */\n decodeErrorResult(fragment, data) {\n if (typeof (fragment) === \"string\") {\n const f = this.getError(fragment);\n assertArgument(f, \"unknown error\", \"fragment\", fragment);\n fragment = f;\n }\n assertArgument(dataSlice(data, 0, 4) === fragment.selector, `data signature does not match error ${fragment.name}.`, \"data\", data);\n return this._decodeParams(fragment.inputs, dataSlice(data, 4));\n }\n /**\n * Encodes the transaction revert data for a call result that\n * reverted from the the Contract with the sepcified %%error%%\n * (see [[getError]] for valid values for %%fragment%%) with the %%values%%.\n *\n * This is generally not used by most developers, unless trying to mock\n * a result from a Contract.\n */\n encodeErrorResult(fragment, values) {\n if (typeof (fragment) === \"string\") {\n const f = this.getError(fragment);\n assertArgument(f, \"unknown error\", \"fragment\", fragment);\n fragment = f;\n }\n return concat([\n fragment.selector,\n this._encodeParams(fragment.inputs, values || [])\n ]);\n }\n /**\n * Decodes the %%data%% from a transaction ``tx.data`` for\n * the function specified (see [[getFunction]] for valid values\n * for %%fragment%%).\n *\n * Most developers should prefer the [[parseTransaction]] method\n * instead, which will automatically detect the fragment.\n */\n decodeFunctionData(fragment, data) {\n if (typeof (fragment) === \"string\") {\n const f = this.getFunction(fragment);\n assertArgument(f, \"unknown function\", \"fragment\", fragment);\n fragment = f;\n }\n assertArgument(dataSlice(data, 0, 4) === fragment.selector, `data signature does not match function ${fragment.name}.`, \"data\", data);\n return this._decodeParams(fragment.inputs, dataSlice(data, 4));\n }\n /**\n * Encodes the ``tx.data`` for a transaction that calls the function\n * specified (see [[getFunction]] for valid values for %%fragment%%) with\n * the %%values%%.\n */\n encodeFunctionData(fragment, values) {\n if (typeof (fragment) === \"string\") {\n const f = this.getFunction(fragment);\n assertArgument(f, \"unknown function\", \"fragment\", fragment);\n fragment = f;\n }\n return concat([\n fragment.selector,\n this._encodeParams(fragment.inputs, values || [])\n ]);\n }\n /**\n * Decodes the result %%data%% (e.g. from an ``eth_call``) for the\n * specified function (see [[getFunction]] for valid values for\n * %%key%%).\n *\n * Most developers should prefer the [[parseCallResult]] method instead,\n * which will automatically detect a ``CALL_EXCEPTION`` and throw the\n * corresponding error.\n */\n decodeFunctionResult(fragment, data) {\n if (typeof (fragment) === \"string\") {\n const f = this.getFunction(fragment);\n assertArgument(f, \"unknown function\", \"fragment\", fragment);\n fragment = f;\n }\n let message = \"invalid length for result data\";\n const bytes = getBytesCopy(data);\n if ((bytes.length % 32) === 0) {\n try {\n return this.#abiCoder.decode(fragment.outputs, bytes);\n }\n catch (error) {\n message = \"could not decode result data\";\n }\n }\n // Call returned data with no error, but the data is junk\n assert(false, message, \"BAD_DATA\", {\n value: hexlify(bytes),\n info: { method: fragment.name, signature: fragment.format() }\n });\n }\n makeError(_data, tx) {\n const data = getBytes(_data, \"data\");\n const error = AbiCoder.getBuiltinCallException(\"call\", tx, data);\n // Not a built-in error; try finding a custom error\n const customPrefix = \"execution reverted (unknown custom error)\";\n if (error.message.startsWith(customPrefix)) {\n const selector = hexlify(data.slice(0, 4));\n const ef = this.getError(selector);\n if (ef) {\n try {\n const args = this.#abiCoder.decode(ef.inputs, data.slice(4));\n error.revert = {\n name: ef.name, signature: ef.format(), args\n };\n error.reason = error.revert.signature;\n error.message = `execution reverted: ${error.reason}`;\n }\n catch (e) {\n error.message = `execution reverted (coult not decode custom error)`;\n }\n }\n }\n // Add the invocation, if available\n const parsed = this.parseTransaction(tx);\n if (parsed) {\n error.invocation = {\n method: parsed.name,\n signature: parsed.signature,\n args: parsed.args\n };\n }\n return error;\n }\n /**\n * Encodes the result data (e.g. from an ``eth_call``) for the\n * specified function (see [[getFunction]] for valid values\n * for %%fragment%%) with %%values%%.\n *\n * This is generally not used by most developers, unless trying to mock\n * a result from a Contract.\n */\n encodeFunctionResult(fragment, values) {\n if (typeof (fragment) === \"string\") {\n const f = this.getFunction(fragment);\n assertArgument(f, \"unknown function\", \"fragment\", fragment);\n fragment = f;\n }\n return hexlify(this.#abiCoder.encode(fragment.outputs, values || []));\n }\n /*\n spelunk(inputs: Array<ParamType>, values: ReadonlyArray<any>, processfunc: (type: string, value: any) => Promise<any>): Promise<Array<any>> {\n const promises: Array<Promise<>> = [ ];\n const process = function(type: ParamType, value: any): any {\n if (type.baseType === \"array\") {\n return descend(type.child\n }\n if (type. === \"address\") {\n }\n };\n \n const descend = function (inputs: Array<ParamType>, values: ReadonlyArray<any>) {\n if (inputs.length !== values.length) { throw new Error(\"length mismatch\"); }\n \n };\n \n const result: Array<any> = [ ];\n values.forEach((value, index) => {\n if (value == null) {\n topics.push(null);\n } else if (param.baseType === \"array\" || param.baseType === \"tuple\") {\n logger.throwArgumentError(\"filtering with tuples or arrays not supported\", (\"contract.\" + param.name), value);\n } else if (Array.isArray(value)) {\n topics.push(value.map((value) => encodeTopic(param, value)));\n } else {\n topics.push(encodeTopic(param, value));\n }\n });\n }\n */\n // Create the filter for the event with search criteria (e.g. for eth_filterLog)\n encodeFilterTopics(fragment, values) {\n if (typeof (fragment) === \"string\") {\n const f = this.getEvent(fragment);\n assertArgument(f, \"unknown event\", \"eventFragment\", fragment);\n fragment = f;\n }\n assert(values.length <= fragment.inputs.length, `too many arguments for ${fragment.format()}`, \"UNEXPECTED_ARGUMENT\", { count: values.length, expectedCount: fragment.inputs.length });\n const topics = [];\n if (!fragment.anonymous) {\n topics.push(fragment.topicHash);\n }\n // @TODO: Use the coders for this; to properly support tuples, etc.\n const encodeTopic = (param, value) => {\n if (param.type === \"string\") {\n return id(value);\n }\n else if (param.type === \"bytes\") {\n return keccak256(hexlify(value));\n }\n if (param.type === \"bool\" && typeof (value) === \"boolean\") {\n value = (value ? \"0x01\" : \"0x00\");\n }\n else if (param.type.match(/^u?int/)) {\n value = toBeHex(value); // @TODO: Should this toTwos??\n }\n else if (param.type.match(/^bytes/)) {\n value = zeroPadBytes(value, 32);\n }\n else if (param.type === \"address\") {\n // Check addresses are valid\n this.#abiCoder.encode([\"address\"], [value]);\n }\n return zeroPadValue(hexlify(value), 32);\n };\n values.forEach((value, index) => {\n const param = fragment.inputs[index];\n if (!param.indexed) {\n assertArgument(value == null, \"cannot filter non-indexed parameters; must be null\", (\"contract.\" + param.name), value);\n return;\n }\n if (value == null) {\n topics.push(null);\n }\n else if (param.baseType === \"array\" || param.baseType === \"tuple\") {\n assertArgument(false, \"filtering with tuples or arrays not supported\", (\"contract.\" + param.name), value);\n }\n else if (Array.isArray(value)) {\n topics.push(value.map((value) => encodeTopic(param, value)));\n }\n else {\n topics.push(encodeTopic(param, value));\n }\n });\n // Trim off trailing nulls\n while (topics.length && topics[topics.length - 1] === null) {\n topics.pop();\n }\n return topics;\n }\n encodeEventLog(fragment, values) {\n if (typeof (fragment) === \"string\") {\n const f = this.getEvent(fragment);\n assertArgument(f, \"unknown event\", \"eventFragment\", fragment);\n fragment = f;\n }\n const topics = [];\n const dataTypes = [];\n const dataValues = [];\n if (!fragment.anonymous) {\n topics.push(fragment.topicHash);\n }\n assertArgument(values.length === fragment.inputs.length, \"event arguments/values mismatch\", \"values\", values);\n fragment.inputs.forEach((param, index) => {\n const value = values[index];\n if (param.indexed) {\n if (param.type === \"string\") {\n topics.push(id(value));\n }\n else if (param.type === \"bytes\") {\n topics.push(keccak256(value));\n }\n else if (param.baseType === \"tuple\" || param.baseType === \"array\") {\n // @TODO\n throw new Error(\"not implemented\");\n }\n else {\n topics.push(this.#abiCoder.encode([param.type], [value]));\n }\n }\n else {\n dataTypes.push(param);\n dataValues.push(value);\n }\n });\n return {\n data: this.#abiCoder.encode(dataTypes, dataValues),\n topics: topics\n };\n }\n // Decode a filter for the event and the search criteria\n decodeEventLog(fragment, data, topics) {\n if (typeof (fragment) === \"string\") {\n const f = this.getEvent(fragment);\n assertArgument(f, \"unknown event\", \"eventFragment\", fragment);\n fragment = f;\n }\n if (topics != null && !fragment.anonymous) {\n const eventTopic = fragment.topicHash;\n assertArgument(isHexString(topics[0], 32) && topics[0].toLowerCase() === eventTopic, \"fragment/topic mismatch\", \"topics[0]\", topics[0]);\n topics = topics.slice(1);\n }\n const indexed = [];\n const nonIndexed = [];\n const dynamic = [];\n fragment.inputs.forEach((param, index) => {\n if (param.indexed) {\n if (param.type === \"string\" || param.type === \"bytes\" || param.baseType === \"tuple\" || param.baseType === \"array\") {\n indexed.push(ParamType.from({ type: \"bytes32\", name: param.name }));\n dynamic.push(true);\n }\n else {\n indexed.push(param);\n dynamic.push(false);\n }\n }\n else {\n nonIndexed.push(param);\n dynamic.push(false);\n }\n });\n const resultIndexed = (topics != null) ? this.#abiCoder.decode(indexed, concat(topics)) : null;\n const resultNonIndexed = this.#abiCoder.decode(nonIndexed, data, true);\n //const result: (Array<any> & { [ key: string ]: any }) = [ ];\n const values = [];\n const keys = [];\n let nonIndexedIndex = 0, indexedIndex = 0;\n fragment.inputs.forEach((param, index) => {\n let value = null;\n if (param.indexed) {\n if (resultIndexed == null) {\n value = new Indexed(null);\n }\n else if (dynamic[index]) {\n value = new Indexed(resultIndexed[indexedIndex++]);\n }\n else {\n try {\n value = resultIndexed[indexedIndex++];\n }\n catch (error) {\n value = error;\n }\n }\n }\n else {\n try {\n value = resultNonIndexed[nonIndexedIndex++];\n }\n catch (error) {\n value = error;\n }\n }\n values.push(value);\n keys.push(param.name || null);\n });\n return Result.fromItems(values, keys);\n }\n /**\n * Parses a transaction, finding the matching function and extracts\n * the parameter values along with other useful function details.\n *\n * If the matching function cannot be found, return null.\n */\n parseTransaction(tx) {\n const data = getBytes(tx.data, \"tx.data\");\n const value = getBigInt((tx.value != null) ? tx.value : 0, \"tx.value\");\n const fragment = this.getFunction(hexlify(data.slice(0, 4)));\n if (!fragment) {\n return null;\n }\n const args = this.#abiCoder.decode(fragment.inputs, data.slice(4));\n return new TransactionDescription(fragment, fragment.selector, args, value);\n }\n parseCallResult(data) {\n throw new Error(\"@TODO\");\n }\n /**\n * Parses a receipt log, finding the matching event and extracts\n * the parameter values along with other useful event details.\n *\n * If the matching event cannot be found, returns null.\n */\n parseLog(log) {\n const fragment = this.getEvent(log.topics[0]);\n if (!fragment || fragment.anonymous) {\n return null;\n }\n // @TODO: If anonymous, and the only method, and the input count matches, should we parse?\n // Probably not, because just because it is the only event in the ABI does\n // not mean we have the full ABI; maybe just a fragment?\n return new LogDescription(fragment, fragment.topicHash, this.decodeEventLog(fragment, log.data, log.topics));\n }\n /**\n * Parses a revert data, finding the matching error and extracts\n * the parameter values along with other useful error details.\n *\n * If the matching error cannot be found, returns null.\n */\n parseError(data) {\n const hexData = hexlify(data);\n const fragment = this.getError(dataSlice(hexData, 0, 4));\n if (!fragment) {\n return null;\n }\n const args = this.#abiCoder.decode(fragment.inputs, dataSlice(hexData, 4));\n return new ErrorDescription(fragment, fragment.selector, args);\n }\n /**\n * Creates a new [[Interface]] from the ABI %%value%%.\n *\n * The %%value%% may be provided as an existing [[Interface]] object,\n * a JSON-encoded ABI or any Human-Readable ABI format.\n */\n static from(value) {\n // Already an Interface, which is immutable\n if (value instanceof Interface) {\n return value;\n }\n // JSON\n if (typeof (value) === \"string\") {\n return new Interface(JSON.parse(value));\n }\n // An Interface; possibly from another v6 instance\n if (typeof (value.formatJson) === \"function\") {\n return new Interface(value.formatJson());\n }\n // A legacy Interface; from an older version\n if (typeof (value.format) === \"function\") {\n return new Interface(value.format(\"json\"));\n }\n // Array of fragments\n return new Interface(value);\n }\n}\n//# sourceMappingURL=interface.js.map","//import { resolveAddress } from \"@ethersproject/address\";\nimport { defineProperties, getBigInt, getNumber, hexlify, isBytesLike, resolveProperties, assert, assertArgument, isError, makeError } from \"../utils/index.js\";\nimport { accessListify } from \"../transaction/index.js\";\nconst BN_0 = BigInt(0);\n// -----------------------\nfunction getValue(value) {\n if (value == null) {\n return null;\n }\n return value;\n}\nfunction toJson(value) {\n if (value == null) {\n return null;\n }\n return value.toString();\n}\n// @TODO? <T extends FeeData = { }> implements Required<T>\n/**\n * A **FeeData** wraps all the fee-related values associated with\n * the network.\n */\nexport class FeeData {\n /**\n * The gas price for legacy networks.\n */\n gasPrice;\n /**\n * The maximum fee to pay per gas.\n *\n * The base fee per gas is defined by the network and based on\n * congestion, increasing the cost during times of heavy load\n * and lowering when less busy.\n *\n * The actual fee per gas will be the base fee for the block\n * and the priority fee, up to the max fee per gas.\n *\n * This will be ``null`` on legacy networks (i.e. [pre-EIP-1559](link-eip-1559))\n */\n maxFeePerGas;\n /**\n * The additional amout to pay per gas to encourage a validator\n * to include the transaction.\n *\n * The purpose of this is to compensate the validator for the\n * adjusted risk for including a given transaction.\n *\n * This will be ``null`` on legacy networks (i.e. [pre-EIP-1559](link-eip-1559))\n */\n maxPriorityFeePerGas;\n /**\n * Creates a new FeeData for %%gasPrice%%, %%maxFeePerGas%% and\n * %%maxPriorityFeePerGas%%.\n */\n constructor(gasPrice, maxFeePerGas, maxPriorityFeePerGas) {\n defineProperties(this, {\n gasPrice: getValue(gasPrice),\n maxFeePerGas: getValue(maxFeePerGas),\n maxPriorityFeePerGas: getValue(maxPriorityFeePerGas)\n });\n }\n /**\n * Returns a JSON-friendly value.\n */\n toJSON() {\n const { gasPrice, maxFeePerGas, maxPriorityFeePerGas } = this;\n return {\n _type: \"FeeData\",\n gasPrice: toJson(gasPrice),\n maxFeePerGas: toJson(maxFeePerGas),\n maxPriorityFeePerGas: toJson(maxPriorityFeePerGas),\n };\n }\n}\n;\n/**\n * Returns a copy of %%req%% with all properties coerced to their strict\n * types.\n */\nexport function copyRequest(req) {\n const result = {};\n // These could be addresses, ENS names or Addressables\n if (req.to) {\n result.to = req.to;\n }\n if (req.from) {\n result.from = req.from;\n }\n if (req.data) {\n result.data = hexlify(req.data);\n }\n const bigIntKeys = \"chainId,gasLimit,gasPrice,maxFeePerBlobGas,maxFeePerGas,maxPriorityFeePerGas,value\".split(/,/);\n for (const key of bigIntKeys) {\n if (!(key in req) || req[key] == null) {\n continue;\n }\n result[key] = getBigInt(req[key], `request.${key}`);\n }\n const numberKeys = \"type,nonce\".split(/,/);\n for (const key of numberKeys) {\n if (!(key in req) || req[key] == null) {\n continue;\n }\n result[key] = getNumber(req[key], `request.${key}`);\n }\n if (req.accessList) {\n result.accessList = accessListify(req.accessList);\n }\n if (req.authorizationList) {\n result.authorizationList = req.authorizationList.slice();\n }\n if (\"blockTag\" in req) {\n result.blockTag = req.blockTag;\n }\n if (\"enableCcipRead\" in req) {\n result.enableCcipRead = !!req.enableCcipRead;\n }\n if (\"customData\" in req) {\n result.customData = req.customData;\n }\n if (\"blobVersionedHashes\" in req && req.blobVersionedHashes) {\n result.blobVersionedHashes = req.blobVersionedHashes.slice();\n }\n if (\"kzg\" in req) {\n result.kzg = req.kzg;\n }\n if (\"blobWrapperVersion\" in req) {\n result.blobWrapperVersion = req.blobWrapperVersion;\n }\n if (\"blobs\" in req && req.blobs) {\n result.blobs = req.blobs.map((b) => {\n if (isBytesLike(b)) {\n return hexlify(b);\n }\n return Object.assign({}, b);\n });\n }\n return result;\n}\n/**\n * A **Block** represents the data associated with a full block on\n * Ethereum.\n */\nexport class Block {\n /**\n * The provider connected to the block used to fetch additional details\n * if necessary.\n */\n provider;\n /**\n * The block number, sometimes called the block height. This is a\n * sequential number that is one higher than the parent block.\n */\n number;\n /**\n * The block hash.\n *\n * This hash includes all properties, so can be safely used to identify\n * an exact set of block properties.\n */\n hash;\n /**\n * The timestamp for this block, which is the number of seconds since\n * epoch that this block was included.\n */\n timestamp;\n /**\n * The block hash of the parent block.\n */\n parentHash;\n /**\n * The hash tree root of the parent beacon block for the given\n * execution block. See [[link-eip-4788]].\n */\n parentBeaconBlockRoot;\n /**\n * The nonce.\n *\n * On legacy networks, this is the random number inserted which\n * permitted the difficulty target to be reached.\n */\n nonce;\n /**\n * The difficulty target.\n *\n * On legacy networks, this is the proof-of-work target required\n * for a block to meet the protocol rules to be included.\n *\n * On modern networks, this is a random number arrived at using\n * randao. @TODO: Find links?\n */\n difficulty;\n /**\n * The total gas limit for this block.\n */\n gasLimit;\n /**\n * The total gas used in this block.\n */\n gasUsed;\n /**\n * The root hash for the global state after applying changes\n * in this block.\n */\n stateRoot;\n /**\n * The hash of the transaction receipts trie.\n */\n receiptsRoot;\n /**\n * The total amount of blob gas consumed by the transactions\n * within the block. See [[link-eip-4844]].\n */\n blobGasUsed;\n /**\n * The running total of blob gas consumed in excess of the\n * target, prior to the block. See [[link-eip-4844]].\n */\n excessBlobGas;\n /**\n * The miner coinbase address, wihch receives any subsidies for\n * including this block.\n */\n miner;\n /**\n * The latest RANDAO mix of the post beacon state of\n * the previous block.\n */\n prevRandao;\n /**\n * Any extra data the validator wished to include.\n */\n extraData;\n /**\n * The base fee per gas that all transactions in this block were\n * charged.\n *\n * This adjusts after each block, depending on how congested the network\n * is.\n */\n baseFeePerGas;\n #transactions;\n /**\n * Create a new **Block** object.\n *\n * This should generally not be necessary as the unless implementing a\n * low-level library.\n */\n constructor(block, provider) {\n this.#transactions = block.transactions.map((tx) => {\n if (typeof (tx) !== \"string\") {\n return new TransactionResponse(tx, provider);\n }\n return tx;\n });\n defineProperties(this, {\n provider,\n hash: getValue(block.hash),\n number: block.number,\n timestamp: block.timestamp,\n parentHash: block.parentHash,\n parentBeaconBlockRoot: block.parentBeaconBlockRoot,\n nonce: block.nonce,\n difficulty: block.difficulty,\n gasLimit: block.gasLimit,\n gasUsed: block.gasUsed,\n blobGasUsed: block.blobGasUsed,\n excessBlobGas: block.excessBlobGas,\n miner: block.miner,\n prevRandao: getValue(block.prevRandao),\n extraData: block.extraData,\n baseFeePerGas: getValue(block.baseFeePerGas),\n stateRoot: block.stateRoot,\n receiptsRoot: block.receiptsRoot,\n });\n }\n /**\n * Returns the list of transaction hashes, in the order\n * they were executed within the block.\n */\n get transactions() {\n return this.#transactions.map((tx) => {\n if (typeof (tx) === \"string\") {\n return tx;\n }\n return tx.hash;\n });\n }\n /**\n * Returns the complete transactions, in the order they\n * were executed within the block.\n *\n * This is only available for blocks which prefetched\n * transactions, by passing ``true`` to %%prefetchTxs%%\n * into [[Provider-getBlock]].\n */\n get prefetchedTransactions() {\n const txs = this.#transactions.slice();\n // Doesn't matter...\n if (txs.length === 0) {\n return [];\n }\n // Make sure we prefetched the transactions\n assert(typeof (txs[0]) === \"object\", \"transactions were not prefetched with block request\", \"UNSUPPORTED_OPERATION\", {\n operation: \"transactionResponses()\"\n });\n return txs;\n }\n /**\n * Returns a JSON-friendly value.\n */\n toJSON() {\n const { baseFeePerGas, difficulty, extraData, gasLimit, gasUsed, hash, miner, prevRandao, nonce, number, parentHash, parentBeaconBlockRoot, stateRoot, receiptsRoot, timestamp, transactions } = this;\n return {\n _type: \"Block\",\n baseFeePerGas: toJson(baseFeePerGas),\n difficulty: toJson(difficulty),\n extraData,\n gasLimit: toJson(gasLimit),\n gasUsed: toJson(gasUsed),\n blobGasUsed: toJson(this.blobGasUsed),\n excessBlobGas: toJson(this.excessBlobGas),\n hash, miner, prevRandao, nonce, number, parentHash, timestamp,\n parentBeaconBlockRoot, stateRoot, receiptsRoot,\n transactions,\n };\n }\n [Symbol.iterator]() {\n let index = 0;\n const txs = this.transactions;\n return {\n next: () => {\n if (index < this.length) {\n return {\n value: txs[index++], done: false\n };\n }\n return { value: undefined, done: true };\n }\n };\n }\n /**\n * The number of transactions in this block.\n */\n get length() { return this.#transactions.length; }\n /**\n * The [[link-js-date]] this block was included at.\n */\n get date() {\n if (this.timestamp == null) {\n return null;\n }\n return new Date(this.timestamp * 1000);\n }\n /**\n * Get the transaction at %%indexe%% within this block.\n */\n async getTransaction(indexOrHash) {\n // Find the internal value by its index or hash\n let tx = undefined;\n if (typeof (indexOrHash) === \"number\") {\n tx = this.#transactions[indexOrHash];\n }\n else {\n const hash = indexOrHash.toLowerCase();\n for (const v of this.#transactions) {\n if (typeof (v) === \"string\") {\n if (v !== hash) {\n continue;\n }\n tx = v;\n break;\n }\n else {\n if (v.hash !== hash) {\n continue;\n }\n tx = v;\n break;\n }\n }\n }\n if (tx == null) {\n throw new Error(\"no such tx\");\n }\n if (typeof (tx) === \"string\") {\n return (await this.provider.getTransaction(tx));\n }\n else {\n return tx;\n }\n }\n /**\n * If a **Block** was fetched with a request to include the transactions\n * this will allow synchronous access to those transactions.\n *\n * If the transactions were not prefetched, this will throw.\n */\n getPrefetchedTransaction(indexOrHash) {\n const txs = this.prefetchedTransactions;\n if (typeof (indexOrHash) === \"number\") {\n return txs[indexOrHash];\n }\n indexOrHash = indexOrHash.toLowerCase();\n for (const tx of txs) {\n if (tx.hash === indexOrHash) {\n return tx;\n }\n }\n assertArgument(false, \"no matching transaction\", \"indexOrHash\", indexOrHash);\n }\n /**\n * Returns true if this block been mined. This provides a type guard\n * for all properties on a [[MinedBlock]].\n */\n isMined() { return !!this.hash; }\n /**\n * Returns true if this block is an [[link-eip-2930]] block.\n */\n isLondon() {\n return !!this.baseFeePerGas;\n }\n /**\n * @_ignore:\n */\n orphanedEvent() {\n if (!this.isMined()) {\n throw new Error(\"\");\n }\n return createOrphanedBlockFilter(this);\n }\n}\n//////////////////////\n// Log\n/**\n * A **Log** in Ethereum represents an event that has been included in a\n * transaction using the ``LOG*`` opcodes, which are most commonly used by\n * Solidity's emit for announcing events.\n */\nexport class Log {\n /**\n * The provider connected to the log used to fetch additional details\n * if necessary.\n */\n provider;\n /**\n * The transaction hash of the transaction this log occurred in. Use the\n * [[Log-getTransaction]] to get the [[TransactionResponse]].\n */\n transactionHash;\n /**\n * The block hash of the block this log occurred in. Use the\n * [[Log-getBlock]] to get the [[Block]].\n */\n blockHash;\n /**\n * The block number of the block this log occurred in. It is preferred\n * to use the [[Block-hash]] when fetching the related [[Block]],\n * since in the case of an orphaned block, the block at that height may\n * have changed.\n */\n blockNumber;\n /**\n * If the **Log** represents a block that was removed due to an orphaned\n * block, this will be true.\n *\n * This can only happen within an orphan event listener.\n */\n removed;\n /**\n * The address of the contract that emitted this log.\n */\n address;\n /**\n * The data included in this log when it was emitted.\n */\n data;\n /**\n * The indexed topics included in this log when it was emitted.\n *\n * All topics are included in the bloom filters, so they can be\n * efficiently filtered using the [[Provider-getLogs]] method.\n */\n topics;\n /**\n * The index within the block this log occurred at. This is generally\n * not useful to developers, but can be used with the various roots\n * to proof inclusion within a block.\n */\n index;\n /**\n * The index within the transaction of this log.\n */\n transactionIndex;\n /**\n * @_ignore:\n */\n constructor(log, provider) {\n this.provider = provider;\n const topics = Object.freeze(log.topics.slice());\n defineProperties(this, {\n transactionHash: log.transactionHash,\n blockHash: log.blockHash,\n blockNumber: log.blockNumber,\n removed: log.removed,\n address: log.address,\n data: log.data,\n topics,\n index: log.index,\n transactionIndex: log.transactionIndex,\n });\n }\n /**\n * Returns a JSON-compatible object.\n */\n toJSON() {\n const { address, blockHash, blockNumber, data, index, removed, topics, transactionHash, transactionIndex } = this;\n return {\n _type: \"log\",\n address, blockHash, blockNumber, data, index,\n removed, topics, transactionHash, transactionIndex\n };\n }\n /**\n * Returns the block that this log occurred in.\n */\n async getBlock() {\n const block = await this.provider.getBlock(this.blockHash);\n assert(!!block, \"failed to find transaction\", \"UNKNOWN_ERROR\", {});\n return block;\n }\n /**\n * Returns the transaction that this log occurred in.\n */\n async getTransaction() {\n const tx = await this.provider.getTransaction(this.transactionHash);\n assert(!!tx, \"failed to find transaction\", \"UNKNOWN_ERROR\", {});\n return tx;\n }\n /**\n * Returns the transaction receipt fot the transaction that this\n * log occurred in.\n */\n async getTransactionReceipt() {\n const receipt = await this.provider.getTransactionReceipt(this.transactionHash);\n assert(!!receipt, \"failed to find transaction receipt\", \"UNKNOWN_ERROR\", {});\n return receipt;\n }\n /**\n * @_ignore:\n */\n removedEvent() {\n return createRemovedLogFilter(this);\n }\n}\n//////////////////////\n// Transaction Receipt\n/*\nexport interface LegacyTransactionReceipt {\n byzantium: false;\n status: null;\n root: string;\n}\n\nexport interface ByzantiumTransactionReceipt {\n byzantium: true;\n status: number;\n root: null;\n}\n*/\n/**\n * A **TransactionReceipt** includes additional information about a\n * transaction that is only available after it has been mined.\n */\nexport class TransactionReceipt {\n /**\n * The provider connected to the log used to fetch additional details\n * if necessary.\n */\n provider;\n /**\n * The address the transaction was sent to.\n */\n to;\n /**\n * The sender of the transaction.\n */\n from;\n /**\n * The address of the contract if the transaction was directly\n * responsible for deploying one.\n *\n * This is non-null **only** if the ``to`` is empty and the ``data``\n * was successfully executed as initcode.\n */\n contractAddress;\n /**\n * The transaction hash.\n */\n hash;\n /**\n * The index of this transaction within the block transactions.\n */\n index;\n /**\n * The block hash of the [[Block]] this transaction was included in.\n */\n blockHash;\n /**\n * The block number of the [[Block]] this transaction was included in.\n */\n blockNumber;\n /**\n * The bloom filter bytes that represent all logs that occurred within\n * this transaction. This is generally not useful for most developers,\n * but can be used to validate the included logs.\n */\n logsBloom;\n /**\n * The actual amount of gas used by this transaction.\n *\n * When creating a transaction, the amount of gas that will be used can\n * only be approximated, but the sender must pay the gas fee for the\n * entire gas limit. After the transaction, the difference is refunded.\n */\n gasUsed;\n /**\n * The gas used for BLObs. See [[link-eip-4844]].\n */\n blobGasUsed;\n /**\n * The amount of gas used by all transactions within the block for this\n * and all transactions with a lower ``index``.\n *\n * This is generally not useful for developers but can be used to\n * validate certain aspects of execution.\n */\n cumulativeGasUsed;\n /**\n * The actual gas price used during execution.\n *\n * Due to the complexity of [[link-eip-1559]] this value can only\n * be caluclated after the transaction has been mined, snce the base\n * fee is protocol-enforced.\n */\n gasPrice;\n /**\n * The price paid per BLOB in gas. See [[link-eip-4844]].\n */\n blobGasPrice;\n /**\n * The [[link-eip-2718]] transaction type.\n */\n type;\n //readonly byzantium!: boolean;\n /**\n * The status of this transaction, indicating success (i.e. ``1``) or\n * a revert (i.e. ``0``).\n *\n * This is available in post-byzantium blocks, but some backends may\n * backfill this value.\n */\n status;\n /**\n * The root hash of this transaction.\n *\n * This is no present and was only included in pre-byzantium blocks, but\n * could be used to validate certain parts of the receipt.\n */\n root;\n #logs;\n /**\n * @_ignore:\n */\n constructor(tx, provider) {\n this.#logs = Object.freeze(tx.logs.map((log) => {\n return new Log(log, provider);\n }));\n let gasPrice = BN_0;\n if (tx.effectiveGasPrice != null) {\n gasPrice = tx.effectiveGasPrice;\n }\n else if (tx.gasPrice != null) {\n gasPrice = tx.gasPrice;\n }\n defineProperties(this, {\n provider,\n to: tx.to,\n from: tx.from,\n contractAddress: tx.contractAddress,\n hash: tx.hash,\n index: tx.index,\n blockHash: tx.blockHash,\n blockNumber: tx.blockNumber,\n logsBloom: tx.logsBloom,\n gasUsed: tx.gasUsed,\n cumulativeGasUsed: tx.cumulativeGasUsed,\n blobGasUsed: tx.blobGasUsed,\n gasPrice,\n blobGasPrice: tx.blobGasPrice,\n type: tx.type,\n //byzantium: tx.byzantium,\n status: tx.status,\n root: tx.root\n });\n }\n /**\n * The logs for this transaction.\n */\n get logs() { return this.#logs; }\n /**\n * Returns a JSON-compatible representation.\n */\n toJSON() {\n const { to, from, contractAddress, hash, index, blockHash, blockNumber, logsBloom, logs, //byzantium, \n status, root } = this;\n return {\n _type: \"TransactionReceipt\",\n blockHash, blockNumber,\n //byzantium, \n contractAddress,\n cumulativeGasUsed: toJson(this.cumulativeGasUsed),\n from,\n gasPrice: toJson(this.gasPrice),\n blobGasUsed: toJson(this.blobGasUsed),\n blobGasPrice: toJson(this.blobGasPrice),\n gasUsed: toJson(this.gasUsed),\n hash, index, logs, logsBloom, root, status, to\n };\n }\n /**\n * @_ignore:\n */\n get length() { return this.logs.length; }\n [Symbol.iterator]() {\n let index = 0;\n return {\n next: () => {\n if (index < this.length) {\n return { value: this.logs[index++], done: false };\n }\n return { value: undefined, done: true };\n }\n };\n }\n /**\n * The total fee for this transaction, in wei.\n */\n get fee() {\n return this.gasUsed * this.gasPrice;\n }\n /**\n * Resolves to the block this transaction occurred in.\n */\n async getBlock() {\n const block = await this.provider.getBlock(this.blockHash);\n if (block == null) {\n throw new Error(\"TODO\");\n }\n return block;\n }\n /**\n * Resolves to the transaction this transaction occurred in.\n */\n async getTransaction() {\n const tx = await this.provider.getTransaction(this.hash);\n if (tx == null) {\n throw new Error(\"TODO\");\n }\n return tx;\n }\n /**\n * Resolves to the return value of the execution of this transaction.\n *\n * Support for this feature is limited, as it requires an archive node\n * with the ``debug_`` or ``trace_`` API enabled.\n */\n async getResult() {\n return (await this.provider.getTransactionResult(this.hash));\n }\n /**\n * Resolves to the number of confirmations this transaction has.\n */\n async confirmations() {\n return (await this.provider.getBlockNumber()) - this.blockNumber + 1;\n }\n /**\n * @_ignore:\n */\n removedEvent() {\n return createRemovedTransactionFilter(this);\n }\n /**\n * @_ignore:\n */\n reorderedEvent(other) {\n assert(!other || other.isMined(), \"unmined 'other' transction cannot be orphaned\", \"UNSUPPORTED_OPERATION\", { operation: \"reorderedEvent(other)\" });\n return createReorderedTransactionFilter(this, other);\n }\n}\n/**\n * A **TransactionResponse** includes all properties about a transaction\n * that was sent to the network, which may or may not be included in a\n * block.\n *\n * The [[TransactionResponse-isMined]] can be used to check if the\n * transaction has been mined as well as type guard that the otherwise\n * possibly ``null`` properties are defined.\n */\nexport class TransactionResponse {\n /**\n * The provider this is connected to, which will influence how its\n * methods will resolve its async inspection methods.\n */\n provider;\n /**\n * The block number of the block that this transaction was included in.\n *\n * This is ``null`` for pending transactions.\n */\n blockNumber;\n /**\n * The blockHash of the block that this transaction was included in.\n *\n * This is ``null`` for pending transactions.\n */\n blockHash;\n /**\n * The index within the block that this transaction resides at.\n */\n index;\n /**\n * The transaction hash.\n */\n hash;\n /**\n * The [[link-eip-2718]] transaction envelope type. This is\n * ``0`` for legacy transactions types.\n */\n type;\n /**\n * The receiver of this transaction.\n *\n * If ``null``, then the transaction is an initcode transaction.\n * This means the result of executing the [[data]] will be deployed\n * as a new contract on chain (assuming it does not revert) and the\n * address may be computed using [[getCreateAddress]].\n */\n to;\n /**\n * The sender of this transaction. It is implicitly computed\n * from the transaction pre-image hash (as the digest) and the\n * [[signature]] using ecrecover.\n */\n from;\n /**\n * The nonce, which is used to prevent replay attacks and offer\n * a method to ensure transactions from a given sender are explicitly\n * ordered.\n *\n * When sending a transaction, this must be equal to the number of\n * transactions ever sent by [[from]].\n */\n nonce;\n /**\n * The maximum units of gas this transaction can consume. If execution\n * exceeds this, the entries transaction is reverted and the sender\n * is charged for the full amount, despite not state changes being made.\n */\n gasLimit;\n /**\n * The gas price can have various values, depending on the network.\n *\n * In modern networks, for transactions that are included this is\n * the //effective gas price// (the fee per gas that was actually\n * charged), while for transactions that have not been included yet\n * is the [[maxFeePerGas]].\n *\n * For legacy transactions, or transactions on legacy networks, this\n * is the fee that will be charged per unit of gas the transaction\n * consumes.\n */\n gasPrice;\n /**\n * The maximum priority fee (per unit of gas) to allow a\n * validator to charge the sender. This is inclusive of the\n * [[maxFeeFeePerGas]].\n */\n maxPriorityFeePerGas;\n /**\n * The maximum fee (per unit of gas) to allow this transaction\n * to charge the sender.\n */\n maxFeePerGas;\n /**\n * The [[link-eip-4844]] max fee per BLOb gas.\n */\n maxFeePerBlobGas;\n /**\n * The data.\n */\n data;\n /**\n * The value, in wei. Use [[formatEther]] to format this value\n * as ether.\n */\n value;\n /**\n * The chain ID.\n */\n chainId;\n /**\n * The signature.\n */\n signature;\n /**\n * The [[link-eip-2930]] access list for transaction types that\n * support it, otherwise ``null``.\n */\n accessList;\n /**\n * The [[link-eip-4844]] BLOb versioned hashes.\n */\n blobVersionedHashes;\n /**\n * The [[link-eip-7702]] authorizations (if any).\n */\n authorizationList;\n #startBlock;\n /**\n * @_ignore:\n */\n constructor(tx, provider) {\n this.provider = provider;\n this.blockNumber = (tx.blockNumber != null) ? tx.blockNumber : null;\n this.blockHash = (tx.blockHash != null) ? tx.blockHash : null;\n this.hash = tx.hash;\n this.index = tx.index;\n this.type = tx.type;\n this.from = tx.from;\n this.to = tx.to || null;\n this.gasLimit = tx.gasLimit;\n this.nonce = tx.nonce;\n this.data = tx.data;\n this.value = tx.value;\n this.gasPrice = tx.gasPrice;\n this.maxPriorityFeePerGas = (tx.maxPriorityFeePerGas != null) ? tx.maxPriorityFeePerGas : null;\n this.maxFeePerGas = (tx.maxFeePerGas != null) ? tx.maxFeePerGas : null;\n this.maxFeePerBlobGas = (tx.maxFeePerBlobGas != null) ? tx.maxFeePerBlobGas : null;\n this.chainId = tx.chainId;\n this.signature = tx.signature;\n this.accessList = (tx.accessList != null) ? tx.accessList : null;\n this.blobVersionedHashes = (tx.blobVersionedHashes != null) ? tx.blobVersionedHashes : null;\n this.authorizationList = (tx.authorizationList != null) ? tx.authorizationList : null;\n this.#startBlock = -1;\n }\n /**\n * Returns a JSON-compatible representation of this transaction.\n */\n toJSON() {\n const { blockNumber, blockHash, index, hash, type, to, from, nonce, data, signature, accessList, blobVersionedHashes } = this;\n return {\n _type: \"TransactionResponse\",\n accessList, blockNumber, blockHash,\n blobVersionedHashes,\n chainId: toJson(this.chainId),\n data, from,\n gasLimit: toJson(this.gasLimit),\n gasPrice: toJson(this.gasPrice),\n hash,\n maxFeePerGas: toJson(this.maxFeePerGas),\n maxPriorityFeePerGas: toJson(this.maxPriorityFeePerGas),\n maxFeePerBlobGas: toJson(this.maxFeePerBlobGas),\n nonce, signature, to, index, type,\n value: toJson(this.value),\n };\n }\n /**\n * Resolves to the Block that this transaction was included in.\n *\n * This will return null if the transaction has not been included yet.\n */\n async getBlock() {\n let blockNumber = this.blockNumber;\n if (blockNumber == null) {\n const tx = await this.getTransaction();\n if (tx) {\n blockNumber = tx.blockNumber;\n }\n }\n if (blockNumber == null) {\n return null;\n }\n const block = this.provider.getBlock(blockNumber);\n if (block == null) {\n throw new Error(\"TODO\");\n }\n return block;\n }\n /**\n * Resolves to this transaction being re-requested from the\n * provider. This can be used if you have an unmined transaction\n * and wish to get an up-to-date populated instance.\n */\n async getTransaction() {\n return this.provider.getTransaction(this.hash);\n }\n /**\n * Resolve to the number of confirmations this transaction has.\n */\n async confirmations() {\n if (this.blockNumber == null) {\n const { tx, blockNumber } = await resolveProperties({\n tx: this.getTransaction(),\n blockNumber: this.provider.getBlockNumber()\n });\n // Not mined yet...\n if (tx == null || tx.blockNumber == null) {\n return 0;\n }\n return blockNumber - tx.blockNumber + 1;\n }\n const blockNumber = await this.provider.getBlockNumber();\n return blockNumber - this.blockNumber + 1;\n }\n /**\n * Resolves once this transaction has been mined and has\n * %%confirms%% blocks including it (default: ``1``) with an\n * optional %%timeout%%.\n *\n * This can resolve to ``null`` only if %%confirms%% is ``0``\n * and the transaction has not been mined, otherwise this will\n * wait until enough confirmations have completed.\n */\n async wait(_confirms, _timeout) {\n const confirms = (_confirms == null) ? 1 : _confirms;\n const timeout = (_timeout == null) ? 0 : _timeout;\n let startBlock = this.#startBlock;\n let nextScan = -1;\n let stopScanning = (startBlock === -1) ? true : false;\n const checkReplacement = async () => {\n // Get the current transaction count for this sender\n if (stopScanning) {\n return null;\n }\n const { blockNumber, nonce } = await resolveProperties({\n blockNumber: this.provider.getBlockNumber(),\n nonce: this.provider.getTransactionCount(this.from)\n });\n // No transaction or our nonce has not been mined yet; but we\n // can start scanning later when we do start\n if (nonce < this.nonce) {\n startBlock = blockNumber;\n return;\n }\n // We were mined; no replacement\n if (stopScanning) {\n return null;\n }\n const mined = await this.getTransaction();\n if (mined && mined.blockNumber != null) {\n return;\n }\n // We were replaced; start scanning for that transaction\n // Starting to scan; look back a few extra blocks for safety\n if (nextScan === -1) {\n nextScan = startBlock - 3;\n if (nextScan < this.#startBlock) {\n nextScan = this.#startBlock;\n }\n }\n while (nextScan <= blockNumber) {\n // Get the next block to scan\n if (stopScanning) {\n return null;\n }\n const block = await this.provider.getBlock(nextScan, true);\n // This should not happen; but we'll try again shortly\n if (block == null) {\n return;\n }\n // We were mined; no replacement\n for (const hash of block) {\n if (hash === this.hash) {\n return;\n }\n }\n // Search for the transaction that replaced us\n for (let i = 0; i < block.length; i++) {\n const tx = await block.getTransaction(i);\n if (tx.from === this.from && tx.nonce === this.nonce) {\n // Get the receipt\n if (stopScanning) {\n return null;\n }\n const receipt = await this.provider.getTransactionReceipt(tx.hash);\n // This should not happen; but we'll try again shortly\n if (receipt == null) {\n return;\n }\n // We will retry this on the next block (this case could be optimized)\n if ((blockNumber - receipt.blockNumber + 1) < confirms) {\n return;\n }\n // The reason we were replaced\n let reason = \"replaced\";\n if (tx.data === this.data && tx.to === this.to && tx.value === this.value) {\n reason = \"repriced\";\n }\n else if (tx.data === \"0x\" && tx.from === tx.to && tx.value === BN_0) {\n reason = \"cancelled\";\n }\n assert(false, \"transaction was replaced\", \"TRANSACTION_REPLACED\", {\n cancelled: (reason === \"replaced\" || reason === \"cancelled\"),\n reason,\n replacement: tx.replaceableTransaction(startBlock),\n hash: tx.hash,\n receipt\n });\n }\n }\n nextScan++;\n }\n return;\n };\n const checkReceipt = (receipt) => {\n if (receipt == null || receipt.status !== 0) {\n return receipt;\n }\n assert(false, \"transaction execution reverted\", \"CALL_EXCEPTION\", {\n action: \"sendTransaction\",\n data: null, reason: null, invocation: null, revert: null,\n transaction: {\n to: receipt.to,\n from: receipt.from,\n data: \"\" // @TODO: in v7, split out sendTransaction properties\n }, receipt\n });\n };\n const receipt = await this.provider.getTransactionReceipt(this.hash);\n if (confirms === 0) {\n return checkReceipt(receipt);\n }\n if (receipt) {\n if (confirms === 1 || (await receipt.confirmations()) >= confirms) {\n return checkReceipt(receipt);\n }\n }\n else {\n // Check for a replacement; throws if a replacement was found\n await checkReplacement();\n // Allow null only when the confirms is 0\n if (confirms === 0) {\n return null;\n }\n }\n const waiter = new Promise((resolve, reject) => {\n // List of things to cancel when we have a result (one way or the other)\n const cancellers = [];\n const cancel = () => { cancellers.forEach((c) => c()); };\n // On cancel, stop scanning for replacements\n cancellers.push(() => { stopScanning = true; });\n // Set up any timeout requested\n if (timeout > 0) {\n const timer = setTimeout(() => {\n cancel();\n reject(makeError(\"wait for transaction timeout\", \"TIMEOUT\"));\n }, timeout);\n cancellers.push(() => { clearTimeout(timer); });\n }\n const txListener = async (receipt) => {\n // Done; return it!\n if ((await receipt.confirmations()) >= confirms) {\n cancel();\n try {\n resolve(checkReceipt(receipt));\n }\n catch (error) {\n reject(error);\n }\n }\n };\n cancellers.push(() => { this.provider.off(this.hash, txListener); });\n this.provider.on(this.hash, txListener);\n // We support replacement detection; start checking\n if (startBlock >= 0) {\n const replaceListener = async () => {\n try {\n // Check for a replacement; this throws only if one is found\n await checkReplacement();\n }\n catch (error) {\n // We were replaced (with enough confirms); re-throw the error\n if (isError(error, \"TRANSACTION_REPLACED\")) {\n cancel();\n reject(error);\n return;\n }\n }\n // Rescheudle a check on the next block\n if (!stopScanning) {\n this.provider.once(\"block\", replaceListener);\n }\n };\n cancellers.push(() => { this.provider.off(\"block\", replaceListener); });\n this.provider.once(\"block\", replaceListener);\n }\n });\n return await waiter;\n }\n /**\n * Returns ``true`` if this transaction has been included.\n *\n * This is effective only as of the time the TransactionResponse\n * was instantiated. To get up-to-date information, use\n * [[getTransaction]].\n *\n * This provides a Type Guard that this transaction will have\n * non-null property values for properties that are null for\n * unmined transactions.\n */\n isMined() {\n return (this.blockHash != null);\n }\n /**\n * Returns true if the transaction is a legacy (i.e. ``type == 0``)\n * transaction.\n *\n * This provides a Type Guard that this transaction will have\n * the ``null``-ness for hardfork-specific properties set correctly.\n */\n isLegacy() {\n return (this.type === 0);\n }\n /**\n * Returns true if the transaction is a Berlin (i.e. ``type == 1``)\n * transaction. See [[link-eip-2070]].\n *\n * This provides a Type Guard that this transaction will have\n * the ``null``-ness for hardfork-specific properties set correctly.\n */\n isBerlin() {\n return (this.type === 1);\n }\n /**\n * Returns true if the transaction is a London (i.e. ``type == 2``)\n * transaction. See [[link-eip-1559]].\n *\n * This provides a Type Guard that this transaction will have\n * the ``null``-ness for hardfork-specific properties set correctly.\n */\n isLondon() {\n return (this.type === 2);\n }\n /**\n * Returns true if hte transaction is a Cancun (i.e. ``type == 3``)\n * transaction. See [[link-eip-4844]].\n */\n isCancun() {\n return (this.type === 3);\n }\n /**\n * Returns a filter which can be used to listen for orphan events\n * that evict this transaction.\n */\n removedEvent() {\n assert(this.isMined(), \"unmined transaction canot be orphaned\", \"UNSUPPORTED_OPERATION\", { operation: \"removeEvent()\" });\n return createRemovedTransactionFilter(this);\n }\n /**\n * Returns a filter which can be used to listen for orphan events\n * that re-order this event against %%other%%.\n */\n reorderedEvent(other) {\n assert(this.isMined(), \"unmined transaction canot be orphaned\", \"UNSUPPORTED_OPERATION\", { operation: \"removeEvent()\" });\n assert(!other || other.isMined(), \"unmined 'other' transaction canot be orphaned\", \"UNSUPPORTED_OPERATION\", { operation: \"removeEvent()\" });\n return createReorderedTransactionFilter(this, other);\n }\n /**\n * Returns a new TransactionResponse instance which has the ability to\n * detect (and throw an error) if the transaction is replaced, which\n * will begin scanning at %%startBlock%%.\n *\n * This should generally not be used by developers and is intended\n * primarily for internal use. Setting an incorrect %%startBlock%% can\n * have devastating performance consequences if used incorrectly.\n */\n replaceableTransaction(startBlock) {\n assertArgument(Number.isInteger(startBlock) && startBlock >= 0, \"invalid startBlock\", \"startBlock\", startBlock);\n const tx = new TransactionResponse(this, this.provider);\n tx.#startBlock = startBlock;\n return tx;\n }\n}\nfunction createOrphanedBlockFilter(block) {\n return { orphan: \"drop-block\", hash: block.hash, number: block.number };\n}\nfunction createReorderedTransactionFilter(tx, other) {\n return { orphan: \"reorder-transaction\", tx, other };\n}\nfunction createRemovedTransactionFilter(tx) {\n return { orphan: \"drop-transaction\", tx };\n}\nfunction createRemovedLogFilter(log) {\n return { orphan: \"drop-log\", log: {\n transactionHash: log.transactionHash,\n blockHash: log.blockHash,\n blockNumber: log.blockNumber,\n address: log.address,\n data: log.data,\n topics: Object.freeze(log.topics.slice()),\n index: log.index\n } };\n}\n//# sourceMappingURL=provider.js.map","// import from provider.ts instead of index.ts to prevent circular dep\n// from EtherscanProvider\nimport { Log, TransactionReceipt, TransactionResponse } from \"../providers/provider.js\";\nimport { defineProperties, EventPayload } from \"../utils/index.js\";\n/**\n * An **EventLog** contains additional properties parsed from the [[Log]].\n */\nexport class EventLog extends Log {\n /**\n * The Contract Interface.\n */\n interface;\n /**\n * The matching event.\n */\n fragment;\n /**\n * The parsed arguments passed to the event by ``emit``.\n */\n args;\n /**\n * @_ignore:\n */\n constructor(log, iface, fragment) {\n super(log, log.provider);\n const args = iface.decodeEventLog(fragment, log.data, log.topics);\n defineProperties(this, { args, fragment, interface: iface });\n }\n /**\n * The name of the event.\n */\n get eventName() { return this.fragment.name; }\n /**\n * The signature of the event.\n */\n get eventSignature() { return this.fragment.format(); }\n}\n/**\n * An **EventLog** contains additional properties parsed from the [[Log]].\n */\nexport class UndecodedEventLog extends Log {\n /**\n * The error encounted when trying to decode the log.\n */\n error;\n /**\n * @_ignore:\n */\n constructor(log, error) {\n super(log, log.provider);\n defineProperties(this, { error });\n }\n}\n/**\n * A **ContractTransactionReceipt** includes the parsed logs from a\n * [[TransactionReceipt]].\n */\nexport class ContractTransactionReceipt extends TransactionReceipt {\n #iface;\n /**\n * @_ignore:\n */\n constructor(iface, provider, tx) {\n super(tx, provider);\n this.#iface = iface;\n }\n /**\n * The parsed logs for any [[Log]] which has a matching event in the\n * Contract ABI.\n */\n get logs() {\n return super.logs.map((log) => {\n const fragment = log.topics.length ? this.#iface.getEvent(log.topics[0]) : null;\n if (fragment) {\n try {\n return new EventLog(log, this.#iface, fragment);\n }\n catch (error) {\n return new UndecodedEventLog(log, error);\n }\n }\n return log;\n });\n }\n}\n/**\n * A **ContractTransactionResponse** will return a\n * [[ContractTransactionReceipt]] when waited on.\n */\nexport class ContractTransactionResponse extends TransactionResponse {\n #iface;\n /**\n * @_ignore:\n */\n constructor(iface, provider, tx) {\n super(tx, provider);\n this.#iface = iface;\n }\n /**\n * Resolves once this transaction has been mined and has\n * %%confirms%% blocks including it (default: ``1``) with an\n * optional %%timeout%%.\n *\n * This can resolve to ``null`` only if %%confirms%% is ``0``\n * and the transaction has not been mined, otherwise this will\n * wait until enough confirmations have completed.\n */\n async wait(confirms, timeout) {\n const receipt = await super.wait(confirms, timeout);\n if (receipt == null) {\n return null;\n }\n return new ContractTransactionReceipt(this.#iface, this.provider, receipt);\n }\n}\n/**\n * A **ContractUnknownEventPayload** is included as the last parameter to\n * Contract Events when the event does not match any events in the ABI.\n */\nexport class ContractUnknownEventPayload extends EventPayload {\n /**\n * The log with no matching events.\n */\n log;\n /**\n * @_event:\n */\n constructor(contract, listener, filter, log) {\n super(contract, listener, filter);\n defineProperties(this, { log });\n }\n /**\n * Resolves to the block the event occured in.\n */\n async getBlock() {\n return await this.log.getBlock();\n }\n /**\n * Resolves to the transaction the event occured in.\n */\n async getTransaction() {\n return await this.log.getTransaction();\n }\n /**\n * Resolves to the transaction receipt the event occured in.\n */\n async getTransactionReceipt() {\n return await this.log.getTransactionReceipt();\n }\n}\n/**\n * A **ContractEventPayload** is included as the last parameter to\n * Contract Events when the event is known.\n */\nexport class ContractEventPayload extends ContractUnknownEventPayload {\n /**\n * @_ignore:\n */\n constructor(contract, listener, filter, fragment, _log) {\n super(contract, listener, filter, new EventLog(_log, contract.interface, fragment));\n const args = contract.interface.decodeEventLog(fragment, this.log.data, this.log.topics);\n defineProperties(this, { args, fragment });\n }\n /**\n * The event name.\n */\n get eventName() {\n return this.fragment.name;\n }\n /**\n * The event signature.\n */\n get eventSignature() {\n return this.fragment.format();\n }\n}\n//# sourceMappingURL=wrappers.js.map","import { Interface, Typed } from \"../abi/index.js\";\nimport { isAddressable, resolveAddress } from \"../address/index.js\";\n// import from provider.ts instead of index.ts to prevent circular dep\n// from EtherscanProvider\nimport { copyRequest, Log } from \"../providers/provider.js\";\nimport { defineProperties, getBigInt, isCallException, isHexString, resolveProperties, isError, makeError, assert, assertArgument } from \"../utils/index.js\";\nimport { ContractEventPayload, ContractUnknownEventPayload, ContractTransactionResponse, EventLog, UndecodedEventLog } from \"./wrappers.js\";\nconst BN_0 = BigInt(0);\nfunction canCall(value) {\n return (value && typeof (value.call) === \"function\");\n}\nfunction canEstimate(value) {\n return (value && typeof (value.estimateGas) === \"function\");\n}\nfunction canResolve(value) {\n return (value && typeof (value.resolveName) === \"function\");\n}\nfunction canSend(value) {\n return (value && typeof (value.sendTransaction) === \"function\");\n}\nfunction getResolver(value) {\n if (value != null) {\n if (canResolve(value)) {\n return value;\n }\n if (value.provider) {\n return value.provider;\n }\n }\n return undefined;\n}\nclass PreparedTopicFilter {\n #filter;\n fragment;\n constructor(contract, fragment, args) {\n defineProperties(this, { fragment });\n if (fragment.inputs.length < args.length) {\n throw new Error(\"too many arguments\");\n }\n // Recursively descend into args and resolve any addresses\n const runner = getRunner(contract.runner, \"resolveName\");\n const resolver = canResolve(runner) ? runner : null;\n this.#filter = (async function () {\n const resolvedArgs = await Promise.all(fragment.inputs.map((param, index) => {\n const arg = args[index];\n if (arg == null) {\n return null;\n }\n return param.walkAsync(args[index], (type, value) => {\n if (type === \"address\") {\n if (Array.isArray(value)) {\n return Promise.all(value.map((v) => resolveAddress(v, resolver)));\n }\n return resolveAddress(value, resolver);\n }\n return value;\n });\n }));\n return contract.interface.encodeFilterTopics(fragment, resolvedArgs);\n })();\n }\n getTopicFilter() {\n return this.#filter;\n }\n}\n// A = Arguments passed in as a tuple\n// R = The result type of the call (i.e. if only one return type,\n// the qualified type, otherwise Result)\n// D = The type the default call will return (i.e. R for view/pure,\n// TransactionResponse otherwise)\n//export interface ContractMethod<A extends Array<any> = Array<any>, R = any, D extends R | ContractTransactionResponse = ContractTransactionResponse> {\nfunction getRunner(value, feature) {\n if (value == null) {\n return null;\n }\n if (typeof (value[feature]) === \"function\") {\n return value;\n }\n if (value.provider && typeof (value.provider[feature]) === \"function\") {\n return value.provider;\n }\n return null;\n}\nfunction getProvider(value) {\n if (value == null) {\n return null;\n }\n return value.provider || null;\n}\n/**\n * @_ignore:\n */\nexport async function copyOverrides(arg, allowed) {\n // Make sure the overrides passed in are a valid overrides object\n const _overrides = Typed.dereference(arg, \"overrides\");\n assertArgument(typeof (_overrides) === \"object\", \"invalid overrides parameter\", \"overrides\", arg);\n // Create a shallow copy (we'll deep-ify anything needed during normalizing)\n const overrides = copyRequest(_overrides);\n assertArgument(overrides.to == null || (allowed || []).indexOf(\"to\") >= 0, \"cannot override to\", \"overrides.to\", overrides.to);\n assertArgument(overrides.data == null || (allowed || []).indexOf(\"data\") >= 0, \"cannot override data\", \"overrides.data\", overrides.data);\n // Resolve any from\n if (overrides.from) {\n overrides.from = overrides.from;\n }\n return overrides;\n}\n/**\n * @_ignore:\n */\nexport async function resolveArgs(_runner, inputs, args) {\n // Recursively descend into args and resolve any addresses\n const runner = getRunner(_runner, \"resolveName\");\n const resolver = canResolve(runner) ? runner : null;\n return await Promise.all(inputs.map((param, index) => {\n return param.walkAsync(args[index], (type, value) => {\n value = Typed.dereference(value, type);\n if (type === \"address\") {\n return resolveAddress(value, resolver);\n }\n return value;\n });\n }));\n}\nfunction buildWrappedFallback(contract) {\n const populateTransaction = async function (overrides) {\n // If an overrides was passed in, copy it and normalize the values\n const tx = (await copyOverrides(overrides, [\"data\"]));\n tx.to = await contract.getAddress();\n if (tx.from) {\n tx.from = await resolveAddress(tx.from, getResolver(contract.runner));\n }\n const iface = contract.interface;\n const noValue = (getBigInt((tx.value || BN_0), \"overrides.value\") === BN_0);\n const noData = ((tx.data || \"0x\") === \"0x\");\n if (iface.fallback && !iface.fallback.payable && iface.receive && !noData && !noValue) {\n assertArgument(false, \"cannot send data to receive or send value to non-payable fallback\", \"overrides\", overrides);\n }\n assertArgument(iface.fallback || noData, \"cannot send data to receive-only contract\", \"overrides.data\", tx.data);\n // Only allow payable contracts to set non-zero value\n const payable = iface.receive || (iface.fallback && iface.fallback.payable);\n assertArgument(payable || noValue, \"cannot send value to non-payable fallback\", \"overrides.value\", tx.value);\n // Only allow fallback contracts to set non-empty data\n assertArgument(iface.fallback || noData, \"cannot send data to receive-only contract\", \"overrides.data\", tx.data);\n return tx;\n };\n const staticCall = async function (overrides) {\n const runner = getRunner(contract.runner, \"call\");\n assert(canCall(runner), \"contract runner does not support calling\", \"UNSUPPORTED_OPERATION\", { operation: \"call\" });\n const tx = await populateTransaction(overrides);\n try {\n return await runner.call(tx);\n }\n catch (error) {\n if (isCallException(error) && error.data) {\n throw contract.interface.makeError(error.data, tx);\n }\n throw error;\n }\n };\n const send = async function (overrides) {\n const runner = contract.runner;\n assert(canSend(runner), \"contract runner does not support sending transactions\", \"UNSUPPORTED_OPERATION\", { operation: \"sendTransaction\" });\n const tx = await runner.sendTransaction(await populateTransaction(overrides));\n const provider = getProvider(contract.runner);\n // @TODO: the provider can be null; make a custom dummy provider that will throw a\n // meaningful error\n return new ContractTransactionResponse(contract.interface, provider, tx);\n };\n const estimateGas = async function (overrides) {\n const runner = getRunner(contract.runner, \"estimateGas\");\n assert(canEstimate(runner), \"contract runner does not support gas estimation\", \"UNSUPPORTED_OPERATION\", { operation: \"estimateGas\" });\n return await runner.estimateGas(await populateTransaction(overrides));\n };\n const method = async (overrides) => {\n return await send(overrides);\n };\n defineProperties(method, {\n _contract: contract,\n estimateGas,\n populateTransaction,\n send, staticCall\n });\n return method;\n}\nfunction buildWrappedMethod(contract, key) {\n const getFragment = function (...args) {\n const fragment = contract.interface.getFunction(key, args);\n assert(fragment, \"no matching fragment\", \"UNSUPPORTED_OPERATION\", {\n operation: \"fragment\",\n info: { key, args }\n });\n return fragment;\n };\n const populateTransaction = async function (...args) {\n const fragment = getFragment(...args);\n // If an overrides was passed in, copy it and normalize the values\n let overrides = {};\n if (fragment.inputs.length + 1 === args.length) {\n overrides = await copyOverrides(args.pop());\n if (overrides.from) {\n overrides.from = await resolveAddress(overrides.from, getResolver(contract.runner));\n }\n }\n if (fragment.inputs.length !== args.length) {\n throw new Error(\"internal error: fragment inputs doesn't match arguments; should not happen\");\n }\n const resolvedArgs = await resolveArgs(contract.runner, fragment.inputs, args);\n return Object.assign({}, overrides, await resolveProperties({\n to: contract.getAddress(),\n data: contract.interface.encodeFunctionData(fragment, resolvedArgs)\n }));\n };\n const staticCall = async function (...args) {\n const result = await staticCallResult(...args);\n if (result.length === 1) {\n return result[0];\n }\n return result;\n };\n const send = async function (...args) {\n const runner = contract.runner;\n assert(canSend(runner), \"contract runner does not support sending transactions\", \"UNSUPPORTED_OPERATION\", { operation: \"sendTransaction\" });\n const tx = await runner.sendTransaction(await populateTransaction(...args));\n const provider = getProvider(contract.runner);\n // @TODO: the provider can be null; make a custom dummy provider that will throw a\n // meaningful error\n return new ContractTransactionResponse(contract.interface, provider, tx);\n };\n const estimateGas = async function (...args) {\n const runner = getRunner(contract.runner, \"estimateGas\");\n assert(canEstimate(runner), \"contract runner does not support gas estimation\", \"UNSUPPORTED_OPERATION\", { operation: \"estimateGas\" });\n return await runner.estimateGas(await populateTransaction(...args));\n };\n const staticCallResult = async function (...args) {\n const runner = getRunner(contract.runner, \"call\");\n assert(canCall(runner), \"contract runner does not support calling\", \"UNSUPPORTED_OPERATION\", { operation: \"call\" });\n const tx = await populateTransaction(...args);\n let result = \"0x\";\n try {\n result = await runner.call(tx);\n }\n catch (error) {\n if (isCallException(error) && error.data) {\n throw contract.interface.makeError(error.data, tx);\n }\n throw error;\n }\n const fragment = getFragment(...args);\n return contract.interface.decodeFunctionResult(fragment, result);\n };\n const method = async (...args) => {\n const fragment = getFragment(...args);\n if (fragment.constant) {\n return await staticCall(...args);\n }\n return await send(...args);\n };\n defineProperties(method, {\n name: contract.interface.getFunctionName(key),\n _contract: contract, _key: key,\n getFragment,\n estimateGas,\n populateTransaction,\n send, staticCall, staticCallResult,\n });\n // Only works on non-ambiguous keys (refined fragment is always non-ambiguous)\n Object.defineProperty(method, \"fragment\", {\n configurable: false,\n enumerable: true,\n get: () => {\n const fragment = contract.interface.getFunction(key);\n assert(fragment, \"no matching fragment\", \"UNSUPPORTED_OPERATION\", {\n operation: \"fragment\",\n info: { key }\n });\n return fragment;\n }\n });\n return method;\n}\nfunction buildWrappedEvent(contract, key) {\n const getFragment = function (...args) {\n const fragment = contract.interface.getEvent(key, args);\n assert(fragment, \"no matching fragment\", \"UNSUPPORTED_OPERATION\", {\n operation: \"fragment\",\n info: { key, args }\n });\n return fragment;\n };\n const method = function (...args) {\n return new PreparedTopicFilter(contract, getFragment(...args), args);\n };\n defineProperties(method, {\n name: contract.interface.getEventName(key),\n _contract: contract, _key: key,\n getFragment\n });\n // Only works on non-ambiguous keys (refined fragment is always non-ambiguous)\n Object.defineProperty(method, \"fragment\", {\n configurable: false,\n enumerable: true,\n get: () => {\n const fragment = contract.interface.getEvent(key);\n assert(fragment, \"no matching fragment\", \"UNSUPPORTED_OPERATION\", {\n operation: \"fragment\",\n info: { key }\n });\n return fragment;\n }\n });\n return method;\n}\n// The combination of TypeScrype, Private Fields and Proxies makes\n// the world go boom; so we hide variables with some trickery keeping\n// a symbol attached to each BaseContract which its sub-class (even\n// via a Proxy) can reach and use to look up its internal values.\nconst internal = Symbol.for(\"_ethersInternal_contract\");\nconst internalValues = new WeakMap();\nfunction setInternal(contract, values) {\n internalValues.set(contract[internal], values);\n}\nfunction getInternal(contract) {\n return internalValues.get(contract[internal]);\n}\nfunction isDeferred(value) {\n return (value && typeof (value) === \"object\" && (\"getTopicFilter\" in value) &&\n (typeof (value.getTopicFilter) === \"function\") && value.fragment);\n}\nasync function getSubInfo(contract, event) {\n let topics;\n let fragment = null;\n // Convert named events to topicHash and get the fragment for\n // events which need deconstructing.\n if (Array.isArray(event)) {\n const topicHashify = function (name) {\n if (isHexString(name, 32)) {\n return name;\n }\n const fragment = contract.interface.getEvent(name);\n assertArgument(fragment, \"unknown fragment\", \"name\", name);\n return fragment.topicHash;\n };\n // Array of Topics and Names; e.g. `[ \"0x1234...89ab\", \"Transfer(address)\" ]`\n topics = event.map((e) => {\n if (e == null) {\n return null;\n }\n if (Array.isArray(e)) {\n return e.map(topicHashify);\n }\n return topicHashify(e);\n });\n }\n else if (event === \"*\") {\n topics = [null];\n }\n else if (typeof (event) === \"string\") {\n if (isHexString(event, 32)) {\n // Topic Hash\n topics = [event];\n }\n else {\n // Name or Signature; e.g. `\"Transfer\", `\"Transfer(address)\"`\n fragment = contract.interface.getEvent(event);\n assertArgument(fragment, \"unknown fragment\", \"event\", event);\n topics = [fragment.topicHash];\n }\n }\n else if (isDeferred(event)) {\n // Deferred Topic Filter; e.g. `contract.filter.Transfer(from)`\n topics = await event.getTopicFilter();\n }\n else if (\"fragment\" in event) {\n // ContractEvent; e.g. `contract.filter.Transfer`\n fragment = event.fragment;\n topics = [fragment.topicHash];\n }\n else {\n assertArgument(false, \"unknown event name\", \"event\", event);\n }\n // Normalize topics and sort TopicSets\n topics = topics.map((t) => {\n if (t == null) {\n return null;\n }\n if (Array.isArray(t)) {\n const items = Array.from(new Set(t.map((t) => t.toLowerCase())).values());\n if (items.length === 1) {\n return items[0];\n }\n items.sort();\n return items;\n }\n return t.toLowerCase();\n });\n const tag = topics.map((t) => {\n if (t == null) {\n return \"null\";\n }\n if (Array.isArray(t)) {\n return t.join(\"|\");\n }\n return t;\n }).join(\"&\");\n return { fragment, tag, topics };\n}\nasync function hasSub(contract, event) {\n const { subs } = getInternal(contract);\n return subs.get((await getSubInfo(contract, event)).tag) || null;\n}\nasync function getSub(contract, operation, event) {\n // Make sure our runner can actually subscribe to events\n const provider = getProvider(contract.runner);\n assert(provider, \"contract runner does not support subscribing\", \"UNSUPPORTED_OPERATION\", { operation });\n const { fragment, tag, topics } = await getSubInfo(contract, event);\n const { addr, subs } = getInternal(contract);\n let sub = subs.get(tag);\n if (!sub) {\n const address = (addr ? addr : contract);\n const filter = { address, topics };\n const listener = (log) => {\n let foundFragment = fragment;\n if (foundFragment == null) {\n try {\n foundFragment = contract.interface.getEvent(log.topics[0]);\n }\n catch (error) { }\n }\n // If fragment is null, we do not deconstruct the args to emit\n if (foundFragment) {\n const _foundFragment = foundFragment;\n const args = fragment ? contract.interface.decodeEventLog(fragment, log.data, log.topics) : [];\n emit(contract, event, args, (listener) => {\n return new ContractEventPayload(contract, listener, event, _foundFragment, log);\n });\n }\n else {\n emit(contract, event, [], (listener) => {\n return new ContractUnknownEventPayload(contract, listener, event, log);\n });\n }\n };\n let starting = [];\n const start = () => {\n if (starting.length) {\n return;\n }\n starting.push(provider.on(filter, listener));\n };\n const stop = async () => {\n if (starting.length == 0) {\n return;\n }\n let started = starting;\n starting = [];\n await Promise.all(started);\n provider.off(filter, listener);\n };\n sub = { tag, listeners: [], start, stop };\n subs.set(tag, sub);\n }\n return sub;\n}\n// We use this to ensure one emit resolves before firing the next to\n// ensure correct ordering (note this cannot throw and just adds the\n// notice to the event queu using setTimeout).\nlet lastEmit = Promise.resolve();\nasync function _emit(contract, event, args, payloadFunc) {\n await lastEmit;\n const sub = await hasSub(contract, event);\n if (!sub) {\n return false;\n }\n const count = sub.listeners.length;\n sub.listeners = sub.listeners.filter(({ listener, once }) => {\n const passArgs = Array.from(args);\n if (payloadFunc) {\n passArgs.push(payloadFunc(once ? null : listener));\n }\n try {\n listener.call(contract, ...passArgs);\n }\n catch (error) { }\n return !once;\n });\n if (sub.listeners.length === 0) {\n sub.stop();\n getInternal(contract).subs.delete(sub.tag);\n }\n return (count > 0);\n}\nasync function emit(contract, event, args, payloadFunc) {\n try {\n await lastEmit;\n }\n catch (error) { }\n const resultPromise = _emit(contract, event, args, payloadFunc);\n lastEmit = resultPromise;\n return await resultPromise;\n}\nconst passProperties = [\"then\"];\nexport class BaseContract {\n /**\n * The target to connect to.\n *\n * This can be an address, ENS name or any [[Addressable]], such as\n * another contract. To get the resolved address, use the ``getAddress``\n * method.\n */\n target;\n /**\n * The contract Interface.\n */\n interface;\n /**\n * The connected runner. This is generally a [[Provider]] or a\n * [[Signer]], which dictates what operations are supported.\n *\n * For example, a **Contract** connected to a [[Provider]] may\n * only execute read-only operations.\n */\n runner;\n /**\n * All the Events available on this contract.\n */\n filters;\n /**\n * @_ignore:\n */\n [internal];\n /**\n * The fallback or receive function if any.\n */\n fallback;\n /**\n * Creates a new contract connected to %%target%% with the %%abi%% and\n * optionally connected to a %%runner%% to perform operations on behalf\n * of.\n */\n constructor(target, abi, runner, _deployTx) {\n assertArgument(typeof (target) === \"string\" || isAddressable(target), \"invalid value for Contract target\", \"target\", target);\n if (runner == null) {\n runner = null;\n }\n const iface = Interface.from(abi);\n defineProperties(this, { target, runner, interface: iface });\n Object.defineProperty(this, internal, { value: {} });\n let addrPromise;\n let addr = null;\n let deployTx = null;\n if (_deployTx) {\n const provider = getProvider(runner);\n // @TODO: the provider can be null; make a custom dummy provider that will throw a\n // meaningful error\n deployTx = new ContractTransactionResponse(this.interface, provider, _deployTx);\n }\n let subs = new Map();\n // Resolve the target as the address\n if (typeof (target) === \"string\") {\n if (isHexString(target)) {\n addr = target;\n addrPromise = Promise.resolve(target);\n }\n else {\n const resolver = getRunner(runner, \"resolveName\");\n if (!canResolve(resolver)) {\n throw makeError(\"contract runner does not support name resolution\", \"UNSUPPORTED_OPERATION\", {\n operation: \"resolveName\"\n });\n }\n addrPromise = resolver.resolveName(target).then((addr) => {\n if (addr == null) {\n throw makeError(\"an ENS name used for a contract target must be correctly configured\", \"UNCONFIGURED_NAME\", {\n value: target\n });\n }\n getInternal(this).addr = addr;\n return addr;\n });\n }\n }\n else {\n addrPromise = target.getAddress().then((addr) => {\n if (addr == null) {\n throw new Error(\"TODO\");\n }\n getInternal(this).addr = addr;\n return addr;\n });\n }\n // Set our private values\n setInternal(this, { addrPromise, addr, deployTx, subs });\n // Add the event filters\n const filters = new Proxy({}, {\n get: (target, prop, receiver) => {\n // Pass important checks (like `then` for Promise) through\n if (typeof (prop) === \"symbol\" || passProperties.indexOf(prop) >= 0) {\n return Reflect.get(target, prop, receiver);\n }\n try {\n return this.getEvent(prop);\n }\n catch (error) {\n if (!isError(error, \"INVALID_ARGUMENT\") || error.argument !== \"key\") {\n throw error;\n }\n }\n return undefined;\n },\n has: (target, prop) => {\n // Pass important checks (like `then` for Promise) through\n if (passProperties.indexOf(prop) >= 0) {\n return Reflect.has(target, prop);\n }\n return Reflect.has(target, prop) || this.interface.hasEvent(String(prop));\n }\n });\n defineProperties(this, { filters });\n defineProperties(this, {\n fallback: ((iface.receive || iface.fallback) ? (buildWrappedFallback(this)) : null)\n });\n // Return a Proxy that will respond to functions\n return new Proxy(this, {\n get: (target, prop, receiver) => {\n if (typeof (prop) === \"symbol\" || prop in target || passProperties.indexOf(prop) >= 0) {\n return Reflect.get(target, prop, receiver);\n }\n // Undefined properties should return undefined\n try {\n return target.getFunction(prop);\n }\n catch (error) {\n if (!isError(error, \"INVALID_ARGUMENT\") || error.argument !== \"key\") {\n throw error;\n }\n }\n return undefined;\n },\n has: (target, prop) => {\n if (typeof (prop) === \"symbol\" || prop in target || passProperties.indexOf(prop) >= 0) {\n return Reflect.has(target, prop);\n }\n return target.interface.hasFunction(prop);\n }\n });\n }\n /**\n * Return a new Contract instance with the same target and ABI, but\n * a different %%runner%%.\n */\n connect(runner) {\n return new BaseContract(this.target, this.interface, runner);\n }\n /**\n * Return a new Contract instance with the same ABI and runner, but\n * a different %%target%%.\n */\n attach(target) {\n return new BaseContract(target, this.interface, this.runner);\n }\n /**\n * Return the resolved address of this Contract.\n */\n async getAddress() { return await getInternal(this).addrPromise; }\n /**\n * Return the deployed bytecode or null if no bytecode is found.\n */\n async getDeployedCode() {\n const provider = getProvider(this.runner);\n assert(provider, \"runner does not support .provider\", \"UNSUPPORTED_OPERATION\", { operation: \"getDeployedCode\" });\n const code = await provider.getCode(await this.getAddress());\n if (code === \"0x\") {\n return null;\n }\n return code;\n }\n /**\n * Resolve to this Contract once the bytecode has been deployed, or\n * resolve immediately if already deployed.\n */\n async waitForDeployment() {\n // We have the deployment transaction; just use that (throws if deployment fails)\n const deployTx = this.deploymentTransaction();\n if (deployTx) {\n await deployTx.wait();\n return this;\n }\n // Check for code\n const code = await this.getDeployedCode();\n if (code != null) {\n return this;\n }\n // Make sure we can subscribe to a provider event\n const provider = getProvider(this.runner);\n assert(provider != null, \"contract runner does not support .provider\", \"UNSUPPORTED_OPERATION\", { operation: \"waitForDeployment\" });\n return new Promise((resolve, reject) => {\n const checkCode = async () => {\n try {\n const code = await this.getDeployedCode();\n if (code != null) {\n return resolve(this);\n }\n provider.once(\"block\", checkCode);\n }\n catch (error) {\n reject(error);\n }\n };\n checkCode();\n });\n }\n /**\n * Return the transaction used to deploy this contract.\n *\n * This is only available if this instance was returned from a\n * [[ContractFactory]].\n */\n deploymentTransaction() {\n return getInternal(this).deployTx;\n }\n /**\n * Return the function for a given name. This is useful when a contract\n * method name conflicts with a JavaScript name such as ``prototype`` or\n * when using a Contract programmatically.\n */\n getFunction(key) {\n if (typeof (key) !== \"string\") {\n key = key.format();\n }\n const func = buildWrappedMethod(this, key);\n return func;\n }\n /**\n * Return the event for a given name. This is useful when a contract\n * event name conflicts with a JavaScript name such as ``prototype`` or\n * when using a Contract programmatically.\n */\n getEvent(key) {\n if (typeof (key) !== \"string\") {\n key = key.format();\n }\n return buildWrappedEvent(this, key);\n }\n /**\n * @_ignore:\n */\n async queryTransaction(hash) {\n throw new Error(\"@TODO\");\n }\n /*\n // @TODO: this is a non-backwards compatible change, but will be added\n // in v7 and in a potential SmartContract class in an upcoming\n // v6 release\n async getTransactionReceipt(hash: string): Promise<null | ContractTransactionReceipt> {\n const provider = getProvider(this.runner);\n assert(provider, \"contract runner does not have a provider\",\n \"UNSUPPORTED_OPERATION\", { operation: \"queryTransaction\" });\n\n const receipt = await provider.getTransactionReceipt(hash);\n if (receipt == null) { return null; }\n\n return new ContractTransactionReceipt(this.interface, provider, receipt);\n }\n */\n /**\n * Provide historic access to event data for %%event%% in the range\n * %%fromBlock%% (default: ``0``) to %%toBlock%% (default: ``\"latest\"``)\n * inclusive.\n */\n async queryFilter(event, fromBlock, toBlock) {\n if (fromBlock == null) {\n fromBlock = 0;\n }\n if (toBlock == null) {\n toBlock = \"latest\";\n }\n const { addr, addrPromise } = getInternal(this);\n const address = (addr ? addr : (await addrPromise));\n const { fragment, topics } = await getSubInfo(this, event);\n const filter = { address, topics, fromBlock, toBlock };\n const provider = getProvider(this.runner);\n assert(provider, \"contract runner does not have a provider\", \"UNSUPPORTED_OPERATION\", { operation: \"queryFilter\" });\n return (await provider.getLogs(filter)).map((log) => {\n let foundFragment = fragment;\n if (foundFragment == null) {\n try {\n foundFragment = this.interface.getEvent(log.topics[0]);\n }\n catch (error) { }\n }\n if (foundFragment) {\n try {\n return new EventLog(log, this.interface, foundFragment);\n }\n catch (error) {\n return new UndecodedEventLog(log, error);\n }\n }\n return new Log(log, provider);\n });\n }\n /**\n * Add an event %%listener%% for the %%event%%.\n */\n async on(event, listener) {\n const sub = await getSub(this, \"on\", event);\n sub.listeners.push({ listener, once: false });\n sub.start();\n return this;\n }\n /**\n * Add an event %%listener%% for the %%event%%, but remove the listener\n * after it is fired once.\n */\n async once(event, listener) {\n const sub = await getSub(this, \"once\", event);\n sub.listeners.push({ listener, once: true });\n sub.start();\n return this;\n }\n /**\n * Emit an %%event%% calling all listeners with %%args%%.\n *\n * Resolves to ``true`` if any listeners were called.\n */\n async emit(event, ...args) {\n return await emit(this, event, args, null);\n }\n /**\n * Resolves to the number of listeners of %%event%% or the total number\n * of listeners if unspecified.\n */\n async listenerCount(event) {\n if (event) {\n const sub = await hasSub(this, event);\n if (!sub) {\n return 0;\n }\n return sub.listeners.length;\n }\n const { subs } = getInternal(this);\n let total = 0;\n for (const { listeners } of subs.values()) {\n total += listeners.length;\n }\n return total;\n }\n /**\n * Resolves to the listeners subscribed to %%event%% or all listeners\n * if unspecified.\n */\n async listeners(event) {\n if (event) {\n const sub = await hasSub(this, event);\n if (!sub) {\n return [];\n }\n return sub.listeners.map(({ listener }) => listener);\n }\n const { subs } = getInternal(this);\n let result = [];\n for (const { listeners } of subs.values()) {\n result = result.concat(listeners.map(({ listener }) => listener));\n }\n return result;\n }\n /**\n * Remove the %%listener%% from the listeners for %%event%% or remove\n * all listeners if unspecified.\n */\n async off(event, listener) {\n const sub = await hasSub(this, event);\n if (!sub) {\n return this;\n }\n if (listener) {\n const index = sub.listeners.map(({ listener }) => listener).indexOf(listener);\n if (index >= 0) {\n sub.listeners.splice(index, 1);\n }\n }\n if (listener == null || sub.listeners.length === 0) {\n sub.stop();\n getInternal(this).subs.delete(sub.tag);\n }\n return this;\n }\n /**\n * Remove all the listeners for %%event%% or remove all listeners if\n * unspecified.\n */\n async removeAllListeners(event) {\n if (event) {\n const sub = await hasSub(this, event);\n if (!sub) {\n return this;\n }\n sub.stop();\n getInternal(this).subs.delete(sub.tag);\n }\n else {\n const { subs } = getInternal(this);\n for (const { tag, stop } of subs.values()) {\n stop();\n subs.delete(tag);\n }\n }\n return this;\n }\n /**\n * Alias for [on].\n */\n async addListener(event, listener) {\n return await this.on(event, listener);\n }\n /**\n * Alias for [off].\n */\n async removeListener(event, listener) {\n return await this.off(event, listener);\n }\n /**\n * Create a new Class for the %%abi%%.\n */\n static buildClass(abi) {\n class CustomContract extends BaseContract {\n constructor(address, runner = null) {\n super(address, abi, runner);\n }\n }\n return CustomContract;\n }\n ;\n /**\n * Create a new BaseContract with a specified Interface.\n */\n static from(target, abi, runner) {\n if (runner == null) {\n runner = null;\n }\n const contract = new this(target, abi, runner);\n return contract;\n }\n}\nfunction _ContractBase() {\n return BaseContract;\n}\n/**\n * A [[BaseContract]] with no type guards on its methods or events.\n */\nexport class Contract extends _ContractBase() {\n}\n//# sourceMappingURL=contract.js.map","/**\n * Holosphere Contracts Module\n * Smart contract integration for fractal fund distribution\n *\n * @module contracts\n */\n\n// Core classes\nexport { ChainManager } from './chain-manager.js';\nexport { ContractDeployer, ABIs } from './deployer.js';\nexport { HolonContracts } from './holon-contracts.js';\nexport { ContractOperations } from './operations.js';\nexport { EventListener, SANKEY_EVENTS } from './event-listener.js';\nexport { ContractQueries } from './queries.js';\n\n// Network utilities\nexport {\n NETWORKS,\n getNetwork,\n getNetworksByType,\n listNetworks,\n isNetworkSupported,\n getTxUrl,\n getAddressUrl\n} from './networks.js';\n\n// Re-export ABIs for direct access\nimport SplitterABI from './abis/Splitter.json' with { type: 'json' };\nimport ManagedABI from './abis/Managed.json' with { type: 'json' };\nimport ZonedABI from './abis/Zoned.json' with { type: 'json' };\nimport AppreciativeABI from './abis/Appreciative.json' with { type: 'json' };\nimport BundleABI from './abis/Bundle.json' with { type: 'json' };\nimport HolonsABI from './abis/Holons.json' with { type: 'json' };\nimport TestTokenABI from './abis/TestToken.json' with { type: 'json' };\n\nexport const ContractABIs = {\n Splitter: SplitterABI,\n Managed: ManagedABI,\n Zoned: ZonedABI,\n Appreciative: AppreciativeABI,\n Bundle: BundleABI,\n Holons: HolonsABI,\n TestToken: TestTokenABI\n};\n\n// Import for default export\nimport { ChainManager } from './chain-manager.js';\nimport { ContractDeployer } from './deployer.js';\nimport { HolonContracts } from './holon-contracts.js';\nimport { ContractOperations } from './operations.js';\nimport { EventListener, SANKEY_EVENTS } from './event-listener.js';\nimport { ContractQueries } from './queries.js';\nimport { NETWORKS } from './networks.js';\n\n/**\n * Create a complete contracts module instance\n * @param {Object} [config] - Configuration options\n * @returns {Promise<Object>} Contracts module with all components\n */\nexport async function createContractsModule(config = {}) {\n const chainManager = new ChainManager(config);\n const deployer = new ContractDeployer(chainManager);\n const holonContracts = new HolonContracts(chainManager, deployer);\n\n return {\n chainManager,\n deployer,\n holonContracts\n };\n}\n\nexport default {\n ChainManager,\n ContractDeployer,\n HolonContracts,\n ContractOperations,\n EventListener,\n ContractQueries,\n SANKEY_EVENTS,\n NETWORKS,\n ABIs: ContractABIs,\n createContractsModule\n};\n","/**\n * Contract Query Utilities\n *\n * Utility kit for directly querying contract state:\n * zones, splits, appreciation, members, balances, etc.\n */\n\nimport { ethers } from 'ethers';\nimport { ContractABIs } from './index.js';\n\n/**\n * Helper to format wei to ETH\n */\nfunction formatEth(wei) {\n return ethers.formatEther(wei);\n}\n\n/**\n * Helper to format wei to ETH as number\n */\nfunction formatEthNumber(wei) {\n return Number(ethers.formatEther(wei));\n}\n\n/**\n * ContractQueries - Query utilities for all contract types\n */\nexport class ContractQueries {\n /**\n * @param {ethers.Provider} provider - ethers.js provider\n */\n constructor(provider) {\n this.provider = provider;\n }\n\n /**\n * Get a contract instance with the appropriate ABI\n * @param {string} address - Contract address\n * @param {string} flavor - Contract flavor (Splitter, Managed, Zoned, Appreciative, Bundle)\n * @returns {ethers.Contract}\n */\n getContract(address, flavor) {\n const abi = ContractABIs[flavor];\n if (!abi) {\n throw new Error(`Unknown contract flavor: ${flavor}`);\n }\n return new ethers.Contract(address, abi, this.provider);\n }\n\n /**\n * Auto-detect contract flavor by calling flavor()\n * @param {string} address - Contract address\n * @returns {Promise<string>} Contract flavor\n */\n async detectFlavor(address) {\n // Try with a minimal ABI that has flavor()\n const minAbi = [\n 'function flavor() view returns (string)',\n 'function version() view returns (string)'\n ];\n const contract = new ethers.Contract(address, minAbi, this.provider);\n try {\n return await contract.flavor();\n } catch {\n return 'Unknown';\n }\n }\n\n // ==================== COMMON QUERIES ====================\n\n /**\n * Get basic contract info\n */\n async getContractInfo(address, flavor) {\n const contract = this.getContract(address, flavor);\n const [name, contractFlavor, version, creator, size] = await Promise.all([\n contract.name().catch(() => ''),\n contract.flavor().catch(() => flavor),\n contract.version().catch(() => ''),\n contract.creator().catch(() => ethers.ZeroAddress),\n contract.getSize().catch(() => 0n)\n ]);\n\n return {\n address,\n name,\n flavor: contractFlavor,\n version,\n creator,\n memberCount: Number(size)\n };\n }\n\n /**\n * Get all members (userIds)\n */\n async getMembers(address, flavor) {\n const contract = this.getContract(address, flavor);\n const size = await contract.getSize();\n const members = [];\n for (let i = 0; i < size; i++) {\n const userId = await contract.userIds(i);\n members.push(userId);\n }\n return members;\n }\n\n /**\n * Get user's ETH balance\n */\n async getUserEthBalance(address, flavor, userId) {\n const contract = this.getContract(address, flavor);\n const balance = await contract.etherBalance(userId);\n return {\n wei: balance.toString(),\n eth: formatEthNumber(balance)\n };\n }\n\n /**\n * Get user's token balance\n */\n async getUserTokenBalance(address, flavor, userId, tokenAddress) {\n const contract = this.getContract(address, flavor);\n const balance = await contract.tokenBalance(userId, tokenAddress);\n return {\n wei: balance.toString(),\n formatted: formatEthNumber(balance)\n };\n }\n\n /**\n * Get total deposited for a token\n */\n async getTotalDeposited(address, flavor, tokenAddress) {\n const contract = this.getContract(address, flavor);\n // For ETH, use address(0)\n const token = tokenAddress || ethers.ZeroAddress;\n const total = await contract.totalDeposited(token);\n return {\n wei: total.toString(),\n formatted: formatEthNumber(total)\n };\n }\n\n /**\n * Check if user has claimed\n */\n async hasClaimed(address, flavor, userId) {\n const contract = this.getContract(address, flavor);\n return contract.hasClaimed(userId);\n }\n\n // ==================== SPLITTER QUERIES ====================\n\n /**\n * Get Splitter's internal/external split configuration\n */\n async getSplitterSplit(address) {\n const contract = this.getContract(address, 'Splitter');\n const [internal, external] = await Promise.all([\n contract.internalContractSplitPercentage(),\n contract.externalContractSplitPercentage()\n ]);\n return {\n internalPercentage: Number(internal),\n externalPercentage: Number(external),\n internalPercent: Number(internal) / 100,\n externalPercent: Number(external) / 100\n };\n }\n\n /**\n * Get Splitter's child contracts\n */\n async getSplitterChildren(address) {\n const contract = this.getContract(address, 'Splitter');\n const [keys, addresses] = await contract.getContractAddresses();\n const children = [];\n for (let i = 0; i < keys.length; i++) {\n children.push({\n key: keys[i],\n address: addresses[i]\n });\n }\n return children;\n }\n\n /**\n * Get user's percentage split in Splitter\n */\n async getSplitterUserPercentage(address, userId) {\n const contract = this.getContract(address, 'Splitter');\n const pct = await contract.percentages(userId);\n return {\n basisPoints: Number(pct),\n percent: Number(pct) / 100\n };\n }\n\n /**\n * Get all member percentages in Splitter\n */\n async getSplitterAllPercentages(address) {\n const members = await this.getMembers(address, 'Splitter');\n const contract = this.getContract(address, 'Splitter');\n const results = [];\n for (const userId of members) {\n const pct = await contract.percentages(userId);\n results.push({\n userId,\n basisPoints: Number(pct),\n percent: Number(pct) / 100\n });\n }\n return results;\n }\n\n // ==================== ZONED QUERIES ====================\n\n /**\n * Get Zoned contract configuration\n */\n async getZonedConfig(address) {\n const contract = this.getContract(address, 'Zoned');\n const [nzones, a, b, c] = await Promise.all([\n contract.nzones(),\n contract.a(),\n contract.b(),\n contract.c()\n ]);\n return {\n numberOfZones: Number(nzones),\n rewardFunction: {\n a: Number(a),\n b: Number(b),\n c: Number(c)\n }\n };\n }\n\n /**\n * Get user's zone assignment\n */\n async getUserZone(address, userId) {\n const contract = this.getContract(address, 'Zoned');\n const zone = await contract.zone(userId);\n return Number(zone);\n }\n\n /**\n * Get all members in a specific zone\n */\n async getZoneMembers(address, zoneNumber) {\n const contract = this.getContract(address, 'Zoned');\n return contract.getZoneMembers(zoneNumber);\n }\n\n /**\n * Get complete zone breakdown\n */\n async getZonedBreakdown(address) {\n const config = await this.getZonedConfig(address);\n const contract = this.getContract(address, 'Zoned');\n const zones = [];\n\n for (let z = 1; z <= config.numberOfZones; z++) {\n const members = await contract.getZoneMembers(z);\n zones.push({\n zone: z,\n members,\n memberCount: members.length\n });\n }\n\n // Also get calculated rewards\n const rewards = await contract.calculateRewards();\n const rewardsByZone = rewards.map((r, i) => ({\n zone: i + 1,\n weight: Number(r)\n }));\n\n return {\n config,\n zones,\n rewardWeights: rewardsByZone\n };\n }\n\n // ==================== MANAGED QUERIES ====================\n\n /**\n * Get Managed contract appreciation info\n */\n async getManagedAppreciation(address, userId) {\n const contract = this.getContract(address, 'Managed');\n const appreciation = await contract.appreciation(userId);\n const totalAppreciation = await contract.totalappreciation();\n return {\n userAppreciation: Number(appreciation),\n totalAppreciation: Number(totalAppreciation),\n sharePercent: Number(totalAppreciation) > 0\n ? (Number(appreciation) / Number(totalAppreciation)) * 100\n : 0\n };\n }\n\n /**\n * Get all member appreciation in Managed contract\n */\n async getManagedAllAppreciation(address) {\n const members = await this.getMembers(address, 'Managed');\n const contract = this.getContract(address, 'Managed');\n const totalAppreciation = await contract.totalappreciation();\n const maxAppreciation = await contract.maxAppreciation().catch(() => 0n);\n\n const results = [];\n for (const userId of members) {\n const appreciation = await contract.appreciation(userId);\n results.push({\n userId,\n appreciation: Number(appreciation),\n sharePercent: Number(totalAppreciation) > 0\n ? (Number(appreciation) / Number(totalAppreciation)) * 100\n : 0\n });\n }\n\n return {\n members: results,\n totalAppreciation: Number(totalAppreciation),\n maxAppreciation: Number(maxAppreciation)\n };\n }\n\n // ==================== APPRECIATIVE QUERIES ====================\n\n /**\n * Get Appreciative contract peer appreciation\n */\n async getAppreciativePeer(address, userId) {\n const contract = this.getContract(address, 'Appreciative');\n const [appreciation, remaining, totalAppreciation] = await Promise.all([\n contract.appreciation(userId),\n contract.remainingappreciation(userId),\n contract.totalappreciation()\n ]);\n return {\n received: Number(appreciation),\n remainingToGive: Number(remaining),\n totalPool: Number(totalAppreciation),\n sharePercent: Number(totalAppreciation) > 0\n ? (Number(appreciation) / Number(totalAppreciation)) * 100\n : 0\n };\n }\n\n /**\n * Get all peer appreciation in Appreciative contract\n */\n async getAppreciativeAll(address) {\n const members = await this.getMembers(address, 'Appreciative');\n const contract = this.getContract(address, 'Appreciative');\n const totalAppreciation = await contract.totalappreciation();\n\n const results = [];\n for (const userId of members) {\n const [appreciation, remaining] = await Promise.all([\n contract.appreciation(userId),\n contract.remainingappreciation(userId)\n ]);\n results.push({\n userId,\n received: Number(appreciation),\n remainingToGive: Number(remaining),\n sharePercent: Number(totalAppreciation) > 0\n ? (Number(appreciation) / Number(totalAppreciation)) * 100\n : 0\n });\n }\n\n return {\n members: results,\n totalAppreciation: Number(totalAppreciation)\n };\n }\n\n // ==================== BUNDLE QUERIES ====================\n\n /**\n * Get Bundle contract configuration\n */\n async getBundleConfig(address) {\n const contract = this.getContract(address, 'Bundle');\n const [steepness, nzones, interiorPct, exteriorPct, electionActive] = await Promise.all([\n contract.steepness(),\n contract.nzones(),\n contract.interiorPercentage(),\n contract.exteriorPercentage(),\n contract.electionActive()\n ]);\n\n return {\n steepness: Number(steepness),\n numberOfZones: Number(nzones),\n interiorPercentage: Number(interiorPct) / 100, // Basis points to percent\n exteriorPercentage: Number(exteriorPct) / 100,\n electionActive\n };\n }\n\n /**\n * Get Bundle interior/exterior split\n */\n async getBundleSplit(address) {\n const contract = this.getContract(address, 'Bundle');\n const [interior, exterior] = await Promise.all([\n contract.interiorPercentage(),\n contract.exteriorPercentage()\n ]);\n return {\n interiorBasisPoints: Number(interior),\n exteriorBasisPoints: Number(exterior),\n interiorPercent: Number(interior) / 100,\n exteriorPercent: Number(exterior) / 100\n };\n }\n\n /**\n * Get Bundle zone weights\n */\n async getBundleZoneWeights(address) {\n const contract = this.getContract(address, 'Bundle');\n const weights = await contract.getZoneWeights();\n return weights.map((w, i) => ({\n zone: i + 1,\n weight: Number(w)\n }));\n }\n\n /**\n * Get Bundle user's zone and interior share\n */\n async getBundleUserInfo(address, userId) {\n const contract = this.getContract(address, 'Bundle');\n const [zone, interiorShare, isInterior, isExterior, isMember] = await Promise.all([\n contract.zone(userId),\n contract.interiorShare(userId),\n contract.isInteriorMember(userId),\n contract.isExteriorMember(userId),\n contract.isBundleMember(userId)\n ]);\n return {\n zone: Number(zone),\n interiorShareBasisPoints: Number(interiorShare),\n interiorSharePercent: Number(interiorShare) / 100,\n isInteriorMember: isInterior,\n isExteriorMember: isExterior,\n isMember\n };\n }\n\n /**\n * Get Bundle interior members\n */\n async getBundleInteriorMembers(address) {\n const contract = this.getContract(address, 'Bundle');\n return contract.getInteriorMembers();\n }\n\n /**\n * Get Bundle zone breakdown (exterior)\n */\n async getBundleZoneBreakdown(address) {\n const config = await this.getBundleConfig(address);\n const contract = this.getContract(address, 'Bundle');\n const zones = [];\n\n for (let z = 1; z <= config.numberOfZones; z++) {\n const members = await contract.getZoneMembers(z);\n zones.push({\n zone: z,\n members,\n memberCount: members.length\n });\n }\n\n return {\n config,\n zones,\n zoneWeights: await this.getBundleZoneWeights(address)\n };\n }\n\n /**\n * Get Bundle election info\n */\n async getBundleElection(address) {\n const contract = this.getContract(address, 'Bundle');\n const [electionActive, candidates] = await Promise.all([\n contract.electionActive(),\n contract.getCandidates()\n ]);\n\n if (!electionActive) {\n return { active: false, candidates: [] };\n }\n\n const candidateInfo = [];\n for (const candidate of candidates) {\n const votes = await contract.votes(candidate);\n candidateInfo.push({\n userId: candidate,\n votes: Number(votes)\n });\n }\n\n return {\n active: true,\n candidates: candidateInfo.sort((a, b) => b.votes - a.votes)\n };\n }\n\n // ==================== FULL SNAPSHOT ====================\n\n /**\n * Get complete contract state snapshot\n */\n async getFullSnapshot(address) {\n const flavor = await this.detectFlavor(address);\n const info = await this.getContractInfo(address, flavor);\n const members = await this.getMembers(address, flavor);\n\n const snapshot = {\n ...info,\n members,\n memberDetails: []\n };\n\n // Get member-specific details\n for (const userId of members) {\n const balance = await this.getUserEthBalance(address, flavor, userId);\n const claimed = await this.hasClaimed(address, flavor, userId);\n\n const memberDetail = {\n userId,\n ethBalance: balance,\n hasClaimed: claimed\n };\n\n // Flavor-specific details\n if (flavor === 'Splitter') {\n const pct = await this.getSplitterUserPercentage(address, userId);\n memberDetail.percentage = pct;\n } else if (flavor === 'Zoned') {\n memberDetail.zone = await this.getUserZone(address, userId);\n } else if (flavor === 'Managed') {\n memberDetail.appreciation = await this.getManagedAppreciation(address, userId);\n } else if (flavor === 'Appreciative') {\n memberDetail.appreciation = await this.getAppreciativePeer(address, userId);\n } else if (flavor === 'Bundle') {\n memberDetail.bundleInfo = await this.getBundleUserInfo(address, userId);\n }\n\n snapshot.memberDetails.push(memberDetail);\n }\n\n // Add flavor-specific configuration\n if (flavor === 'Splitter') {\n snapshot.split = await this.getSplitterSplit(address);\n snapshot.children = await this.getSplitterChildren(address);\n } else if (flavor === 'Zoned') {\n snapshot.zoneConfig = await this.getZonedBreakdown(address);\n } else if (flavor === 'Managed') {\n snapshot.appreciationSummary = await this.getManagedAllAppreciation(address);\n } else if (flavor === 'Appreciative') {\n snapshot.appreciationSummary = await this.getAppreciativeAll(address);\n } else if (flavor === 'Bundle') {\n snapshot.bundleConfig = await this.getBundleConfig(address);\n snapshot.bundleSplit = await this.getBundleSplit(address);\n snapshot.bundleZones = await this.getBundleZoneBreakdown(address);\n snapshot.election = await this.getBundleElection(address);\n }\n\n return snapshot;\n }\n}\n\nexport default ContractQueries;\n","/**\n * AI Methods Mixin\n * All AI-powered operations for HoloSphere\n */\n\n/**\n * Mixin that adds AI methods to a HoloSphere class\n * @param {Class} Base - Base class to extend\n * @returns {Class} Extended class with AI methods\n */\nexport function withAIMethods(Base) {\n return class extends Base {\n _requireAI() {\n if (!this._ai) {\n throw new Error('AI services not initialized. Provide openaiKey in config.');\n }\n }\n\n // --- Core LLM Methods ---\n\n async summarize(text, options = {}) {\n this._requireAI();\n return this._ai.llm.summarize(text, options);\n }\n\n async analyze(text, aspect, options = {}) {\n this._requireAI();\n return this._ai.llm.analyze(text, aspect, options);\n }\n\n async extractKeywords(text, options = {}) {\n this._requireAI();\n return this._ai.llm.extractKeywords(text, options);\n }\n\n async categorize(text, categories, options = {}) {\n this._requireAI();\n return this._ai.llm.categorize(text, categories, options);\n }\n\n async translate(text, targetLanguage, options = {}) {\n this._requireAI();\n return this._ai.llm.translate(text, targetLanguage, options);\n }\n\n async generateQuestions(text, options = {}) {\n this._requireAI();\n return this._ai.llm.generateQuestions(text, options);\n }\n\n // --- Schema Extraction ---\n\n async extractToSchema(text, lensName, options = {}) {\n this._requireAI();\n const schemaObj = await this.getSchema(lensName);\n if (!schemaObj) {\n throw new Error(`No schema found for lens: ${lensName}`);\n }\n return this._ai.schemaExtractor.extractToSchema(text, schemaObj, options);\n }\n\n // --- Fuzzy JSON Operations ---\n\n async jsonAdd(obj1, obj2, options = {}) {\n this._requireAI();\n return this._ai.jsonOps.add(obj1, obj2, options);\n }\n\n async jsonSubtract(obj1, obj2, options = {}) {\n this._requireAI();\n return this._ai.jsonOps.subtract(obj1, obj2, options);\n }\n\n async jsonUnion(obj1, obj2, options = {}) {\n this._requireAI();\n return this._ai.jsonOps.union(obj1, obj2, options);\n }\n\n async jsonDifference(obj1, obj2, options = {}) {\n this._requireAI();\n return this._ai.jsonOps.difference(obj1, obj2, options);\n }\n\n async jsonConcatenate(obj1, obj2, options = {}) {\n this._requireAI();\n return this._ai.jsonOps.concatenate(obj1, obj2, options);\n }\n\n // --- Embeddings & Semantic Search ---\n\n async embed(text) {\n this._requireAI();\n return this._ai.embeddings.embed(text);\n }\n\n async semanticSearch(query, holonId, lensName, options = {}) {\n this._requireAI();\n return this._ai.embeddings.semanticSearch(query, holonId, lensName, options);\n }\n\n async storeWithEmbedding(holonId, lensName, data, textField = 'description') {\n this._requireAI();\n return this._ai.embeddings.storeWithEmbedding(holonId, lensName, data, textField);\n }\n\n // --- Multi-Perspective Council ---\n\n async askCouncil(question, options = {}) {\n this._requireAI();\n return this._ai.council.ask(question, options);\n }\n\n async askCouncilCustom(question, perspectives, options = {}) {\n this._requireAI();\n return this._ai.council.askCustom(question, perspectives, options);\n }\n\n // --- Text-to-Speech ---\n\n async textToSpeech(text, voice = 'nova', options = {}) {\n this._requireAI();\n return this._ai.tts.speak(text, voice, options);\n }\n\n async textToSpeechBase64(text, voice = 'nova', options = {}) {\n this._requireAI();\n return this._ai.tts.speakBase64(text, voice, options);\n }\n\n // --- Natural Language Queries ---\n\n async nlQuery(query, holonId = null, lensName = null, options = {}) {\n this._requireAI();\n return this._ai.nlQuery.execute(query, holonId, lensName, options);\n }\n\n async parseNLQuery(query) {\n this._requireAI();\n return this._ai.nlQuery.parse(query);\n }\n\n // --- Auto-Classification ---\n\n async classifyToLens(content, options = {}) {\n this._requireAI();\n return this._ai.classifier.classifyToLens(content, options);\n }\n\n async autoStore(holonId, content, options = {}) {\n this._requireAI();\n return this._ai.classifier.autoStore(holonId, content, options);\n }\n\n registerLensForClassification(lensName, description, keywords = []) {\n this._requireAI();\n this._ai.classifier.registerLens(lensName, description, keywords);\n }\n\n // --- Spatial Analysis ---\n\n async analyzeRegion(holonId, lensName = null, aspect = null, options = {}) {\n this._requireAI();\n return this._ai.spatial.analyzeRegion(holonId, lensName, aspect, options);\n }\n\n async compareRegions(holon1, holon2, lensName = null) {\n this._requireAI();\n return this._ai.spatial.compareRegions(holon1, holon2, lensName);\n }\n\n async spatialTrends(holonId, lensName, timeRange = null) {\n this._requireAI();\n return this._ai.spatial.spatialTrends(holonId, lensName, timeRange);\n }\n\n // --- Smart Aggregation ---\n\n async smartUpcast(holonId, lensName, options = {}) {\n this._requireAI();\n return this._ai.aggregation.smartUpcast(holonId, lensName, options);\n }\n\n async generateHolonSummary(holonId) {\n this._requireAI();\n return this._ai.aggregation.generateHolonSummary(holonId);\n }\n\n // --- Federation Advisor ---\n\n async suggestFederations(holonId, options = {}) {\n this._requireAI();\n return this._ai.federationAdvisor.suggestFederations(holonId, options);\n }\n\n async analyzeFederationHealth(holonId) {\n this._requireAI();\n return this._ai.federationAdvisor.analyzeFederationHealth(holonId);\n }\n\n async optimizeFederation(holonId) {\n this._requireAI();\n return this._ai.federationAdvisor.optimizeFederation(holonId);\n }\n\n // --- Relationship Discovery ---\n\n async discoverRelationships(holonId, lensName = null) {\n this._requireAI();\n return this._ai.relationships.discoverRelationships(holonId, lensName);\n }\n\n async findSimilar(item, holonId, lensName = null, options = {}) {\n this._requireAI();\n return this._ai.relationships.findSimilar(item, holonId, lensName, options);\n }\n\n async buildRelationshipGraph(holonId, lensName) {\n this._requireAI();\n return this._ai.relationships.buildGraph(holonId, lensName);\n }\n\n async suggestConnections(item, holonId, lensName) {\n this._requireAI();\n return this._ai.relationships.suggestConnections(item, holonId, lensName);\n }\n\n // --- Task Breakdown ---\n\n async breakdown(item, holonId, lensName, options = {}) {\n this._requireAI();\n return this._ai.taskBreakdown.breakdown(item, holonId, lensName, options);\n }\n\n async suggestBreakdownStrategy(item) {\n this._requireAI();\n return this._ai.taskBreakdown.suggestStrategy(item);\n }\n\n flattenBreakdown(breakdownResult) {\n this._requireAI();\n return this._ai.taskBreakdown.flatten(breakdownResult);\n }\n\n getBreakdownDependencyOrder(breakdownResult) {\n this._requireAI();\n return this._ai.taskBreakdown.getDependencyOrder(breakdownResult);\n }\n\n async getBreakdownProgress(holonId, lensName, itemId) {\n this._requireAI();\n return this._ai.taskBreakdown.getProgress(holonId, lensName, itemId);\n }\n\n // --- H3 Geospatial AI ---\n\n async suggestH3Resolution(item, options = {}) {\n this._requireAI();\n return this._ai.h3ai.suggestResolution(item, options);\n }\n\n async analyzeH3Distribution(holonId, lensName, options = {}) {\n this._requireAI();\n return this._ai.h3ai.analyzeDistribution(holonId, lensName, options);\n }\n\n async findH3NeighborRelevance(holonId, lensName, options = {}) {\n this._requireAI();\n return this._ai.h3ai.findNeighborRelevance(holonId, lensName, options);\n }\n\n async suggestGeographicScope(item, holonId, lensName, options = {}) {\n this._requireAI();\n return this._ai.h3ai.suggestGeographicScope(item, holonId, lensName, options);\n }\n\n async analyzeH3Coverage(holonId, lensName, options = {}) {\n this._requireAI();\n return this._ai.h3ai.analyzeCoverage(holonId, lensName, options);\n }\n\n async crossH3ResolutionInsights(holonId, lensName, options = {}) {\n this._requireAI();\n return this._ai.h3ai.crossResolutionInsights(holonId, lensName, options);\n }\n\n async suggestH3Migration(item, holonId, lensName, options = {}) {\n this._requireAI();\n return this._ai.h3ai.suggestMigration(item, holonId, lensName, options);\n }\n\n async generateH3Report(holonId, options = {}) {\n this._requireAI();\n return this._ai.h3ai.generateGeographicReport(holonId, options);\n }\n\n async findH3Clusters(holonId, lensName, options = {}) {\n this._requireAI();\n return this._ai.h3ai.findGeographicClusters(holonId, lensName, options);\n }\n\n async analyzeH3Impact(item, holonId, lensName, options = {}) {\n this._requireAI();\n return this._ai.h3ai.analyzeGeographicImpact(item, holonId, lensName, options);\n }\n };\n}\n\nexport default withAIMethods;\n","/**\n * Contract Methods Mixin\n * All blockchain contract operations for HoloSphere\n */\n\nimport { ChainManager } from '../contracts/chain-manager.js';\nimport { ContractDeployer } from '../contracts/deployer.js';\nimport { HolonContracts } from '../contracts/holon-contracts.js';\nimport * as networks from '../contracts/networks.js';\n\n/**\n * Mixin that adds contract methods to a HoloSphere class\n * @param {Class} Base - Base class to extend\n * @returns {Class} Extended class with contract methods\n */\nexport function withContractMethods(Base) {\n return class extends Base {\n hasContracts() {\n return this._contracts !== null;\n }\n\n _requireContracts() {\n if (!this._contracts) {\n throw new Error('Contracts not initialized. Call initContracts() first.');\n }\n return this._contracts;\n }\n\n async initContracts(config) {\n const chainManager = new ChainManager(config);\n const connectionInfo = await chainManager.connect(\n config.network,\n config.privateKey,\n config.rpcUrl\n );\n\n const deployer = new ContractDeployer(chainManager);\n const holonContracts = new HolonContracts(chainManager, deployer);\n\n this._contracts = {\n chainManager,\n deployer,\n holonContracts,\n network: config.network\n };\n\n return {\n ...connectionInfo,\n address: config.privateKey ? await chainManager.getAddress() : null\n };\n }\n\n async initContractsBrowser(network) {\n const chainManager = new ChainManager();\n const connectionInfo = await chainManager.connectBrowser(network);\n\n const deployer = new ContractDeployer(chainManager);\n const holonContracts = new HolonContracts(chainManager, deployer);\n\n this._contracts = {\n chainManager,\n deployer,\n holonContracts,\n network: chainManager.networkName\n };\n\n return connectionInfo;\n }\n\n async deployContracts(options = {}) {\n const { deployer } = this._requireContracts();\n return deployer.deployAll(options);\n }\n\n loadDeployedContracts(addresses) {\n const { deployer } = this._requireContracts();\n deployer.loadDeployedAddresses(addresses);\n }\n\n getDeployedContracts() {\n const { deployer } = this._requireContracts();\n return deployer.getDeployedAddresses();\n }\n\n async deployHolonContract(holonId, type = 'Splitter', options = {}) {\n const { holonContracts } = this._requireContracts();\n return holonContracts.deploy(holonId, type, options);\n }\n\n async linkHolonContract(holonId, contractAddress, type = 'Splitter') {\n const { holonContracts } = this._requireContracts();\n return holonContracts.link(holonId, contractAddress, type);\n }\n\n async unlinkHolonContract(holonId) {\n const { holonContracts } = this._requireContracts();\n return holonContracts.unlink(holonId);\n }\n\n getHolonContract(holonId) {\n if (!this._contracts) return null;\n return this._contracts.holonContracts.getContract(holonId);\n }\n\n getHolonContractAddress(holonId) {\n if (!this._contracts) return null;\n return this._contracts.holonContracts.getAddress(holonId);\n }\n\n hasHolonContract(holonId) {\n if (!this._contracts) return false;\n return this._contracts.holonContracts.hasContract(holonId);\n }\n\n listHolonContracts() {\n if (!this._contracts) return [];\n return this._contracts.holonContracts.listAll();\n }\n\n getHolonOperations(holonId) {\n const { holonContracts } = this._requireContracts();\n return holonContracts.requireOperations(holonId);\n }\n\n // ========== MEMBER MANAGEMENT ==========\n\n async contractAddMember(holonId, userId) {\n return this.getHolonOperations(holonId).addMember(userId);\n }\n\n async contractAddMembers(holonId, userIds) {\n return this.getHolonOperations(holonId).addMembers(userIds);\n }\n\n async contractIsMember(holonId, userId) {\n return this.getHolonOperations(holonId).isMember(userId);\n }\n\n // ========== FUND DISTRIBUTION ==========\n\n async contractReward(holonId, tokenAddress, amount) {\n return this.getHolonOperations(holonId).reward(tokenAddress, amount);\n }\n\n async contractRewardEth(holonId, amount) {\n return this.getHolonOperations(holonId).rewardEth(amount);\n }\n\n async contractSendEth(holonId, amount) {\n return this.getHolonOperations(holonId).sendEth(amount);\n }\n\n async contractClaim(holonId, userId, beneficiaryAddress) {\n return this.getHolonOperations(holonId).claim(userId, beneficiaryAddress);\n }\n\n async contractGetEthBalance(holonId, userId) {\n return this.getHolonOperations(holonId).getEthBalance(userId);\n }\n\n async contractGetTokenBalance(holonId, userId, tokenAddress) {\n return this.getHolonOperations(holonId).getTokenBalance(userId, tokenAddress);\n }\n\n // ========== SPLITTER OPERATIONS ==========\n\n async contractSetSplit(holonId, internalPct, externalPct) {\n return this.getHolonOperations(holonId).setContractSplit(internalPct, externalPct);\n }\n\n async contractGetSplit(holonId) {\n return this.getHolonOperations(holonId).getContractSplit();\n }\n\n async contractCreateManaged(holonId, creatorUserId, name) {\n return this.getHolonOperations(holonId).createManagedContract(creatorUserId, name);\n }\n\n async contractCreateZoned(holonId, creatorUserId, name, nZones = 6) {\n return this.getHolonOperations(holonId).createZonedContract(creatorUserId, name, nZones);\n }\n\n async contractGetChildContracts(holonId) {\n return this.getHolonOperations(holonId).getChildContracts();\n }\n\n // ========== MANAGED OPERATIONS ==========\n\n async contractSetAppreciation(holonId, userIds, amounts) {\n return this.getHolonOperations(holonId).setAppreciation(userIds, amounts);\n }\n\n async contractGetAppreciation(holonId, userId) {\n return this.getHolonOperations(holonId).getAppreciation(userId);\n }\n\n async contractGetTotalAppreciation(holonId) {\n return this.getHolonOperations(holonId).getTotalAppreciation();\n }\n\n // ========== ZONED OPERATIONS ==========\n\n async contractAddToZone(holonId, senderUserId, userId, zone) {\n return this.getHolonOperations(holonId).addToZone(senderUserId, userId, zone);\n }\n\n async contractRemoveFromZone(holonId, senderUserId, userId) {\n return this.getHolonOperations(holonId).removeFromZone(senderUserId, userId);\n }\n\n async contractGetZone(holonId, userId) {\n return this.getHolonOperations(holonId).getZone(userId);\n }\n\n async contractSetZoneParams(holonId, senderUserId, a, b, c) {\n return this.getHolonOperations(holonId).setZoneParameters(senderUserId, a, b, c);\n }\n\n // ========== APPRECIATIVE OPERATIONS ==========\n\n async contractAppreciate(holonId, fromUserId, toUserId, amount) {\n return this.getHolonOperations(holonId).appreciate(fromUserId, toUserId, amount);\n }\n\n async contractGetAppreciationGiven(holonId, userId) {\n return this.getHolonOperations(holonId).getAppreciationGiven(userId);\n }\n\n async contractGetAppreciationReceived(holonId, userId) {\n return this.getHolonOperations(holonId).getAppreciationReceived(userId);\n }\n\n // ========== BUNDLE OPERATIONS ==========\n\n async contractSetSteepness(holonId, steepness) {\n return this.getHolonOperations(holonId).setSteepness(steepness);\n }\n\n async contractGetSteepness(holonId) {\n return this.getHolonOperations(holonId).getSteepness();\n }\n\n async contractSetInteriorSplit(holonId, userIds, percentages) {\n return this.getHolonOperations(holonId).setInteriorSplit(userIds, percentages);\n }\n\n // ========== GOVERNANCE ==========\n\n async contractStartElection(holonId) {\n return this.getHolonOperations(holonId).startElection();\n }\n\n async contractNominate(holonId) {\n return this.getHolonOperations(holonId).nominateSelf();\n }\n\n async contractVote(holonId, nomineeAddress) {\n return this.getHolonOperations(holonId).vote(nomineeAddress);\n }\n\n async contractFinalizeElection(holonId) {\n return this.getHolonOperations(holonId).finalizeElection();\n }\n\n // ========== READ-ONLY QUERIES ==========\n\n async contractGetName(holonId) {\n return this.getHolonOperations(holonId).getName();\n }\n\n async contractGetOwner(holonId) {\n return this.getHolonOperations(holonId).getOwner();\n }\n\n async contractGetBotAddress(holonId) {\n return this.getHolonOperations(holonId).getBotAddress();\n }\n\n async contractGetTotalDeposited(holonId, tokenAddress) {\n return this.getHolonOperations(holonId).getTotalDeposited(tokenAddress);\n }\n\n getNetworkUtils() {\n return networks;\n }\n\n getChainManager() {\n return this._contracts?.chainManager || null;\n }\n };\n}\n\nexport default withContractMethods;\n","/**\n * Nostr-based Federation Discovery Protocol\n * Optional feature for automated federation handshake via Nostr events\n */\n\nimport { issueCapability } from '../crypto/secp256k1.js';\nimport { addFederatedPartner, storeInboundCapability } from './registry.js';\n\n// Custom event kinds for federation protocol\nconst FEDERATION_REQUEST_KIND = 30078;\nconst FEDERATION_ACCEPT_KIND = 30079;\nconst FEDERATION_DECLINE_KIND = 30080;\n\n/**\n * Send a federation request to another holosphere via Nostr\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @param {string} targetPubKey - Target holosphere's public key\n * @param {Object} options - Request options\n * @param {Object} options.scope - Requested scope { holonId, lensName }\n * @param {string[]} options.permissions - Requested permissions\n * @param {string} options.message - Optional message to include\n * @param {number} options.expiresIn - Token expiration in ms (default: 30 days)\n * @returns {Promise<Object>} Published event info\n */\nexport async function sendFederationRequest(client, appname, targetPubKey, options = {}) {\n const {\n scope = { holonId: '*', lensName: '*' },\n permissions = ['read'],\n message = 'Federation request',\n expiresIn = 30 * 24 * 60 * 60 * 1000, // 30 days\n } = options;\n\n // Issue capability we're offering them (access to our data)\n const offeredCapability = await issueCapability(\n permissions,\n scope,\n targetPubKey,\n { issuerKey: client.privateKey, expiresIn }\n );\n\n const event = {\n kind: FEDERATION_REQUEST_KIND,\n created_at: Math.floor(Date.now() / 1000),\n tags: [\n ['d', `federation-request-${targetPubKey.slice(0, 16)}`],\n ['p', targetPubKey],\n ['holosphere', appname],\n ['scope', JSON.stringify(scope)],\n ['permissions', permissions.join(',')],\n ],\n content: JSON.stringify({\n message,\n offeredCapability,\n requestedScope: scope,\n requestedPermissions: permissions,\n }),\n };\n\n const result = await client.publish(event);\n return {\n eventId: result.id || null,\n targetPubKey,\n scope,\n permissions,\n offeredCapability,\n ...result,\n };\n}\n\n/**\n * Subscribe to incoming federation requests\n * @param {Object} client - NostrClient instance\n * @param {Function} callback - Called with each request\n * @returns {Promise<Object>} Subscription with unsubscribe method\n */\nexport async function subscribeFederationRequests(client, callback) {\n const filter = {\n kinds: [FEDERATION_REQUEST_KIND],\n '#p': [client.publicKey],\n };\n\n return client.subscribe(filter, (event) => {\n try {\n const content = JSON.parse(event.content);\n const scopeTag = event.tags.find(t => t[0] === 'scope');\n const permissionsTag = event.tags.find(t => t[0] === 'permissions');\n const holosphereTag = event.tags.find(t => t[0] === 'holosphere');\n\n const request = {\n eventId: event.id,\n requesterPubKey: event.pubkey,\n appname: holosphereTag?.[1],\n scope: scopeTag ? JSON.parse(scopeTag[1]) : { holonId: '*', lensName: '*' },\n permissions: permissionsTag ? permissionsTag[1].split(',') : ['read'],\n message: content.message,\n offeredCapability: content.offeredCapability,\n timestamp: event.created_at,\n };\n\n callback(request);\n } catch (error) {\n console.error('Failed to parse federation request:', error);\n }\n });\n}\n\n/**\n * Accept a federation request\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @param {Object} request - Request object from subscription\n * @param {Object} options - Acceptance options\n * @param {Object} options.scope - Scope we're granting (defaults to requested)\n * @param {string[]} options.permissions - Permissions we're granting\n * @param {string} options.alias - Alias for this partner\n * @param {number} options.expiresIn - Token expiration in ms\n * @returns {Promise<Object>} Published acceptance event info\n */\nexport async function acceptFederationRequest(client, appname, request, options = {}) {\n const {\n scope = request.scope,\n permissions = request.permissions,\n alias = null,\n expiresIn = 30 * 24 * 60 * 60 * 1000,\n } = options;\n\n // Issue our capability to them\n const grantedCapability = await issueCapability(\n permissions,\n scope,\n request.requesterPubKey,\n { issuerKey: client.privateKey, expiresIn }\n );\n\n // Store their offered capability in our registry\n await addFederatedPartner(client, appname, request.requesterPubKey, {\n alias,\n addedVia: 'nostr_discovery',\n inboundCapabilities: [{\n token: request.offeredCapability,\n scope: request.scope,\n permissions: request.permissions,\n expires: Date.now() + expiresIn,\n }],\n });\n\n // Publish acceptance event\n const event = {\n kind: FEDERATION_ACCEPT_KIND,\n created_at: Math.floor(Date.now() / 1000),\n tags: [\n ['d', `federation-accept-${request.requesterPubKey.slice(0, 16)}`],\n ['p', request.requesterPubKey],\n ['e', request.eventId], // Reference to original request\n ['holosphere', appname],\n ['scope', JSON.stringify(scope)],\n ['permissions', permissions.join(',')],\n ],\n content: JSON.stringify({\n acceptedScope: scope,\n grantedCapability,\n }),\n };\n\n const result = await client.publish(event);\n return {\n eventId: result.id || null,\n requesterPubKey: request.requesterPubKey,\n grantedCapability,\n acceptedScope: scope,\n ...result,\n };\n}\n\n/**\n * Decline a federation request\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @param {Object} request - Request object from subscription\n * @param {string} reason - Optional decline reason\n * @returns {Promise<Object>} Published decline event info\n */\nexport async function declineFederationRequest(client, appname, request, reason = '') {\n const event = {\n kind: FEDERATION_DECLINE_KIND,\n created_at: Math.floor(Date.now() / 1000),\n tags: [\n ['d', `federation-decline-${request.requesterPubKey.slice(0, 16)}`],\n ['p', request.requesterPubKey],\n ['e', request.eventId],\n ['holosphere', appname],\n ],\n content: JSON.stringify({ reason }),\n };\n\n const result = await client.publish(event);\n return {\n eventId: result.id || null,\n requesterPubKey: request.requesterPubKey,\n reason,\n ...result,\n };\n}\n\n/**\n * Subscribe to federation acceptances (responses to our requests)\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @param {Function} callback - Called with each acceptance\n * @returns {Promise<Object>} Subscription with unsubscribe method\n */\nexport async function subscribeFederationAcceptances(client, appname, callback) {\n const filter = {\n kinds: [FEDERATION_ACCEPT_KIND],\n '#p': [client.publicKey],\n };\n\n return client.subscribe(filter, async (event) => {\n try {\n const content = JSON.parse(event.content);\n const scopeTag = event.tags.find(t => t[0] === 'scope');\n const permissionsTag = event.tags.find(t => t[0] === 'permissions');\n\n // Store their granted capability in our registry\n await storeInboundCapability(client, appname, event.pubkey, {\n token: content.grantedCapability,\n scope: scopeTag ? JSON.parse(scopeTag[1]) : content.acceptedScope,\n permissions: permissionsTag ? permissionsTag[1].split(',') : ['read'],\n expires: Date.now() + 30 * 24 * 60 * 60 * 1000, // Assume 30 day expiry\n });\n\n callback({\n accepterPubKey: event.pubkey,\n originalRequestId: event.tags.find(t => t[0] === 'e')?.[1],\n acceptedScope: content.acceptedScope,\n grantedCapability: content.grantedCapability,\n timestamp: event.created_at,\n });\n } catch (error) {\n console.error('Failed to parse federation acceptance:', error);\n }\n });\n}\n\n/**\n * Subscribe to federation declines\n * @param {Object} client - NostrClient instance\n * @param {Function} callback - Called with each decline\n * @returns {Promise<Object>} Subscription with unsubscribe method\n */\nexport async function subscribeFederationDeclines(client, callback) {\n const filter = {\n kinds: [FEDERATION_DECLINE_KIND],\n '#p': [client.publicKey],\n };\n\n return client.subscribe(filter, (event) => {\n try {\n const content = JSON.parse(event.content);\n\n callback({\n declinerPubKey: event.pubkey,\n originalRequestId: event.tags.find(t => t[0] === 'e')?.[1],\n reason: content.reason || '',\n timestamp: event.created_at,\n });\n } catch (error) {\n console.error('Failed to parse federation decline:', error);\n }\n });\n}\n\n/**\n * Query for pending federation requests (requests we've sent that haven't been answered)\n * @param {Object} client - NostrClient instance\n * @param {Object} options - Query options\n * @param {number} options.since - Only get requests since this timestamp (seconds)\n * @returns {Promise<Object[]>} Array of pending requests\n */\nexport async function getPendingFederationRequests(client, options = {}) {\n const since = options.since || Math.floor((Date.now() - 30 * 24 * 60 * 60 * 1000) / 1000);\n\n // Get our requests\n const requestFilter = {\n kinds: [FEDERATION_REQUEST_KIND],\n authors: [client.publicKey],\n since,\n };\n const requests = await client.query(requestFilter);\n\n // Get all acceptances and declines to our requests\n const responseFilter = {\n kinds: [FEDERATION_ACCEPT_KIND, FEDERATION_DECLINE_KIND],\n '#p': [client.publicKey],\n since,\n };\n const responses = await client.query(responseFilter);\n\n // Find request event IDs that have been responded to\n const respondedRequestIds = new Set();\n for (const response of responses) {\n const eTag = response.tags.find(t => t[0] === 'e');\n if (eTag) {\n respondedRequestIds.add(eTag[1]);\n }\n }\n\n // Filter to only pending requests\n const pending = [];\n for (const request of requests) {\n if (!respondedRequestIds.has(request.id)) {\n try {\n const content = JSON.parse(request.content);\n const pTag = request.tags.find(t => t[0] === 'p');\n const scopeTag = request.tags.find(t => t[0] === 'scope');\n const permissionsTag = request.tags.find(t => t[0] === 'permissions');\n\n pending.push({\n eventId: request.id,\n targetPubKey: pTag?.[1],\n scope: scopeTag ? JSON.parse(scopeTag[1]) : { holonId: '*', lensName: '*' },\n permissions: permissionsTag ? permissionsTag[1].split(',') : ['read'],\n message: content.message,\n timestamp: request.created_at,\n });\n } catch (error) {\n console.error('Failed to parse pending request:', error);\n }\n }\n }\n\n return pending;\n}\n","/**\n * HoloSphere Error Classes\n */\n\nexport class AuthorizationError extends Error {\n constructor(message, requiredPermission = null) {\n super(message);\n this.name = 'AuthorizationError';\n this.requiredPermission = requiredPermission;\n }\n}\n\nexport class ValidationError extends Error {\n constructor(message) {\n super(message);\n this.name = 'ValidationError';\n }\n}\n\nexport default {\n AuthorizationError,\n ValidationError\n};\n","/**\n * Federation Methods Mixin\n * Cross-Holosphere federation and Nostr discovery operations\n */\n\nimport * as registry from '../federation/registry.js';\nimport * as discovery from '../federation/discovery.js';\nimport * as federation from '../federation/hologram.js';\nimport * as storage from '../storage/unified-storage.js';\nimport * as nostrAsync from '../storage/nostr-async.js';\nimport * as crypto from '../crypto/secp256k1.js';\nimport { ValidationError, AuthorizationError } from './errors.js';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { bytesToHex } from '@noble/hashes/utils';\n\n/**\n * Mixin that adds federation methods to a HoloSphere class\n * @param {Class} Base - Base class to extend\n * @returns {Class} Extended class with federation methods\n */\nexport function withFederationMethods(Base) {\n return class extends Base {\n // === Cross-Holosphere Federation ===\n\n async addFederatedHolosphere(pubKey, options = {}) {\n if (!pubKey || typeof pubKey !== 'string') {\n throw new ValidationError('pubKey must be a valid public key string');\n }\n return registry.addFederatedPartner(\n this.client,\n this.config.appName,\n pubKey,\n options\n );\n }\n\n async removeFederatedHolosphere(pubKey) {\n return registry.removeFederatedPartner(\n this.client,\n this.config.appName,\n pubKey\n );\n }\n\n async getFederatedHolospheres() {\n return registry.getFederatedAuthors(\n this.client,\n this.config.appName\n );\n }\n\n async getFederationRegistry() {\n return registry.getFederationRegistry(\n this.client,\n this.config.appName\n );\n }\n\n async storeInboundCapability(partnerPubKey, capabilityInfo) {\n return registry.storeInboundCapability(\n this.client,\n this.config.appName,\n partnerPubKey,\n capabilityInfo\n );\n }\n\n async readFromFederatedSource(sourcePubKey, holonId, lensName, dataId = null) {\n const capabilityEntry = await registry.getCapabilityForAuthor(\n this.client,\n this.config.appName,\n sourcePubKey,\n { holonId, lensName, dataId }\n );\n\n if (!capabilityEntry) {\n throw new AuthorizationError('No valid capability for federated source', 'read');\n }\n\n const isValid = await this.verifyCapability(\n capabilityEntry.token,\n 'read',\n { holonId, lensName, dataId }\n );\n\n if (!isValid) {\n throw new AuthorizationError('Capability verification failed', 'read');\n }\n\n if (dataId) {\n const path = storage.buildPath(this.config.appName, holonId, lensName, dataId);\n return nostrAsync.nostrGet(this.client, path, 30000, {\n authors: [sourcePubKey],\n includeAuthor: true,\n });\n } else {\n const path = storage.buildPath(this.config.appName, holonId, lensName);\n return nostrAsync.nostrGetAll(this.client, path, 30000, {\n authors: [sourcePubKey],\n includeAuthor: true,\n });\n }\n }\n\n async createCrossHolosphereHologram(sourcePubKey, sourceHolon, lensName, dataId, targetHolon, options = {}) {\n const { embedCapability = true } = options;\n\n const capabilityEntry = await registry.getCapabilityForAuthor(\n this.client,\n this.config.appName,\n sourcePubKey,\n { holonId: sourceHolon, lensName, dataId }\n );\n\n if (!capabilityEntry) {\n throw new AuthorizationError('No valid capability for cross-holosphere hologram', 'read');\n }\n\n const hologram = federation.createHologram(\n sourceHolon,\n targetHolon,\n lensName,\n dataId,\n this.config.appName,\n {\n authorPubKey: sourcePubKey,\n capability: embedCapability ? capabilityEntry.token : null,\n }\n );\n\n const targetPath = storage.buildPath(this.config.appName, targetHolon, lensName, dataId);\n await storage.write(this.client, targetPath, hologram);\n\n return hologram;\n }\n\n async issueCapabilityForFederation(targetPubKey, scope, permissions, options = {}) {\n const { expiresIn = 3600000, trackInRegistry = true } = options;\n\n const token = await crypto.issueCapability(\n permissions,\n scope,\n targetPubKey,\n {\n expiresIn,\n issuerKey: this.client.privateKey,\n }\n );\n\n if (trackInRegistry) {\n const partner = await registry.getFederatedPartner(\n this.client,\n this.config.appName,\n targetPubKey\n );\n\n if (!partner) {\n await registry.addFederatedPartner(\n this.client,\n this.config.appName,\n targetPubKey,\n { addedVia: 'capability_issued' }\n );\n }\n\n await registry.storeOutboundCapability(\n this.client,\n this.config.appName,\n targetPubKey,\n {\n tokenHash: await this._hashToken(token),\n scope,\n permissions,\n expires: Date.now() + expiresIn,\n }\n );\n }\n\n return token;\n }\n\n async _hashToken(token) {\n const encoder = new TextEncoder();\n return bytesToHex(sha256(encoder.encode(token)));\n }\n\n // === Nostr Discovery Protocol ===\n\n async sendFederationRequest(targetPubKey, options = {}) {\n return discovery.sendFederationRequest(\n this.client,\n this.config.appName,\n targetPubKey,\n options\n );\n }\n\n async subscribeFederationRequests(callback) {\n return discovery.subscribeFederationRequests(this.client, callback);\n }\n\n async acceptFederationRequest(request, options = {}) {\n return discovery.acceptFederationRequest(\n this.client,\n this.config.appName,\n request,\n options\n );\n }\n\n async declineFederationRequest(request, reason = '') {\n return discovery.declineFederationRequest(\n this.client,\n this.config.appName,\n request,\n reason\n );\n }\n\n async subscribeFederationAcceptances(callback) {\n return discovery.subscribeFederationAcceptances(\n this.client,\n this.config.appName,\n callback\n );\n }\n\n async subscribeFederationDeclines(callback) {\n return discovery.subscribeFederationDeclines(this.client, callback);\n }\n\n async getPendingFederationRequests(options = {}) {\n return discovery.getPendingFederationRequests(this.client, options);\n }\n };\n}\n\nexport default withFederationMethods;\n","/**\n * HoloSphere AI Module\n * Comprehensive AI functionality using OpenAI chat completions\n */\n\n// Import all modules for local use and re-export\nimport { LLMService, default as LLM } from './llm-service.js';\nimport { SchemaExtractor } from './schema-extractor.js';\nimport { JSONOps } from './json-ops.js';\nimport { Embeddings } from './embeddings.js';\nimport { Council } from './council.js';\nimport { TTS, VOICES, MODELS } from './tts.js';\nimport { NLQuery } from './nl-query.js';\nimport { Classifier } from './classifier.js';\nimport { SpatialAnalysis } from './spatial.js';\nimport { SmartAggregation } from './aggregation.js';\nimport { FederationAdvisor } from './federation-ai.js';\nimport { RelationshipDiscovery } from './relationships.js';\nimport { TaskBreakdown } from './breakdown.js';\nimport { H3AI } from './h3-ai.js';\n\n// Re-export all modules\nexport {\n LLMService,\n LLM,\n SchemaExtractor,\n JSONOps,\n Embeddings,\n Council,\n TTS,\n VOICES,\n MODELS,\n NLQuery,\n Classifier,\n SpatialAnalysis,\n SmartAggregation,\n FederationAdvisor,\n RelationshipDiscovery,\n TaskBreakdown,\n H3AI,\n};\n\n/**\n * Create all AI services with shared LLM instance\n * @param {string} apiKey - OpenAI API key\n * @param {Object} holosphere - HoloSphere instance (optional)\n * @param {Object} options - Configuration options\n * @param {Object} openaiClient - Optional pre-created OpenAI client\n * @returns {Object} AI services\n */\nexport function createAIServices(apiKey, holosphere = null, options = {}, openaiClient = null) {\n // Create shared LLM service\n const llm = new LLMService(apiKey, options.llm);\n\n // Use provided OpenAI client or create a placeholder\n // Note: For embeddings/TTS, caller should provide openaiClient or use individual services\n const openai = openaiClient;\n\n // Create all services\n const embeddings = new Embeddings(openai, holosphere);\n const schemaExtractor = new SchemaExtractor(llm);\n const jsonOps = new JSONOps(llm);\n const council = new Council(llm);\n const tts = new TTS(openai);\n const nlQuery = new NLQuery(llm, holosphere);\n const classifier = new Classifier(llm, holosphere);\n const spatial = new SpatialAnalysis(llm, holosphere);\n const aggregation = new SmartAggregation(llm, holosphere);\n const federationAdvisor = new FederationAdvisor(llm, holosphere, embeddings);\n const relationships = new RelationshipDiscovery(llm, holosphere, embeddings);\n const taskBreakdown = new TaskBreakdown(llm, holosphere);\n const h3ai = new H3AI(llm, holosphere);\n\n return {\n llm,\n openai,\n embeddings,\n schemaExtractor,\n jsonOps,\n council,\n tts,\n nlQuery,\n classifier,\n spatial,\n aggregation,\n federationAdvisor,\n relationships,\n taskBreakdown,\n h3ai,\n };\n}\n\n// Default export\nexport default {\n LLMService,\n SchemaExtractor,\n JSONOps,\n Embeddings,\n Council,\n TTS,\n VOICES,\n MODELS,\n NLQuery,\n Classifier,\n SpatialAnalysis,\n SmartAggregation,\n FederationAdvisor,\n RelationshipDiscovery,\n TaskBreakdown,\n H3AI,\n createAIServices,\n};\n","/**\n * HoloSphere - Holonic Geospatial Communication Infrastructure\n * Public API\n */\n\nimport { HoloSphere as HoloSphereCore } from './core/holosphere.js';\nimport * as spatial from './spatial/h3-operations.js';\nimport * as storage from './storage/unified-storage.js';\nimport * as nostrStorage from './storage/nostr-wrapper.js';\nimport * as nostrAsync from './storage/nostr-async.js';\nimport * as globalTables from './storage/global-tables.js';\nimport * as schema from './schema/validator.js';\nimport { ValidationError } from './schema/validator.js';\nimport * as federation from './federation/hologram.js';\nimport * as handshake from './federation/handshake.js';\nimport * as crypto from './crypto/secp256k1.js';\nimport * as nostrUtils from './crypto/nostr-utils.js';\nimport * as social from './content/social-protocols.js';\nimport * as subscriptions from './subscriptions/manager.js';\nimport * as hierarchical from './hierarchical/upcast.js';\n\n// AI Module imports\nimport { LLMService } from './ai/llm-service.js';\nimport { SchemaExtractor } from './ai/schema-extractor.js';\nimport { JSONOps } from './ai/json-ops.js';\nimport { Embeddings } from './ai/embeddings.js';\nimport { Council } from './ai/council.js';\nimport { TTS, VOICES, MODELS } from './ai/tts.js';\nimport { NLQuery } from './ai/nl-query.js';\nimport { Classifier } from './ai/classifier.js';\nimport { SpatialAnalysis } from './ai/spatial.js';\nimport { SmartAggregation } from './ai/aggregation.js';\nimport { FederationAdvisor } from './ai/federation-ai.js';\nimport { RelationshipDiscovery } from './ai/relationships.js';\nimport { TaskBreakdown } from './ai/breakdown.js';\nimport { H3AI } from './ai/h3-ai.js';\n\n// Contracts Module imports\nimport { ChainManager } from './contracts/chain-manager.js';\nimport { ContractDeployer, ABIs as ContractABIs } from './contracts/deployer.js';\nimport { HolonContracts } from './contracts/holon-contracts.js';\nimport { ContractOperations } from './contracts/operations.js';\nimport { EventListener, SANKEY_EVENTS } from './contracts/event-listener.js';\nimport { ContractQueries } from './contracts/queries.js';\nimport * as networks from './contracts/networks.js';\n\n// Mixin imports\nimport { withAIMethods } from './lib/ai-methods.js';\nimport { withContractMethods } from './lib/contract-methods.js';\nimport { withFederationMethods } from './lib/federation-methods.js';\nimport { AuthorizationError } from './lib/errors.js';\n\n/**\n * Base HoloSphere class with core data operations\n */\nclass HoloSphereBase extends HoloSphereCore {\n constructor(config) {\n super(config);\n this.schemas = new Map();\n this._cache = new Map();\n this.subscriptionRegistry = new subscriptions.SubscriptionRegistry();\n\n // Initialize AI services if openaiKey is provided or OPENAI_API_KEY env var is set\n this._ai = null;\n const openaiKey = config.openaiKey || this._getEnv('OPENAI_API_KEY');\n if (openaiKey) {\n const aiOptions = {\n ...config.aiOptions,\n model: config.aiOptions?.model || this._getEnv('HOLOSPHERE_AI_MODEL'),\n temperature: config.aiOptions?.temperature ?? this._parseFloat(this._getEnv('HOLOSPHERE_AI_TEMPERATURE')),\n };\n this._initializeAI(openaiKey, aiOptions);\n }\n\n // Contracts module (lazy initialized)\n this._contracts = null;\n }\n\n _getEnv(name) {\n if (typeof process !== 'undefined' && process.env) {\n return process.env[name];\n }\n return undefined;\n }\n\n _parseFloat(value) {\n if (value === undefined || value === null) return undefined;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n }\n\n _initializeAI(apiKey, options = {}) {\n const llmOptions = {\n ...options.llm,\n model: options.model || options.llm?.model,\n temperature: options.temperature ?? options.llm?.temperature,\n };\n\n this._ai = {\n llm: new LLMService(apiKey, llmOptions),\n };\n\n const OpenAI = require('openai').default;\n const openai = new OpenAI({ apiKey });\n this._ai.openai = openai;\n\n this._ai.embeddings = new Embeddings(openai, this);\n this._ai.schemaExtractor = new SchemaExtractor(this._ai.llm);\n this._ai.jsonOps = new JSONOps(this._ai.llm);\n this._ai.council = new Council(this._ai.llm);\n this._ai.tts = new TTS(openai);\n this._ai.nlQuery = new NLQuery(this._ai.llm, this);\n this._ai.classifier = new Classifier(this._ai.llm, this);\n this._ai.spatial = new SpatialAnalysis(this._ai.llm, this);\n this._ai.aggregation = new SmartAggregation(this._ai.llm, this);\n this._ai.federationAdvisor = new FederationAdvisor(this._ai.llm, this, this._ai.embeddings);\n this._ai.relationships = new RelationshipDiscovery(this._ai.llm, this, this._ai.embeddings);\n this._ai.taskBreakdown = new TaskBreakdown(this._ai.llm, this);\n this._ai.h3ai = new H3AI(this._ai.llm, this);\n }\n\n hasAI() {\n return this._ai !== null;\n }\n\n getAIServices() {\n return this._ai;\n }\n\n // === Spatial Operations ===\n async toHolon(lat, lng, resolution) {\n return spatial.toHolon(lat, lng, resolution);\n }\n\n async getParents(holonId, maxResolution) {\n return spatial.getParents(holonId, maxResolution);\n }\n\n async getChildren(holonId) {\n return spatial.getChildren(holonId);\n }\n\n isValidH3(holonId) {\n return spatial.isValidH3(holonId);\n }\n\n // === Data Operations ===\n\n async write(holonId, lensName, data, options = {}) {\n if (!holonId || typeof holonId !== 'string') {\n throw new ValidationError('ValidationError: holonId must be a non-empty string');\n }\n if (!lensName || typeof lensName !== 'string') {\n throw new ValidationError('ValidationError: lensName must be a non-empty string');\n }\n if (!data || typeof data !== 'object') {\n throw new ValidationError('ValidationError: data must be an object');\n }\n\n const capToken = options.capabilityToken || options.capability;\n if (capToken) {\n const authorized = await this.verifyCapability(capToken, 'write', { holonId, lensName });\n if (!authorized) {\n throw new AuthorizationError('AuthorizationError: Invalid capability token for write operation', 'write');\n }\n }\n\n if (!data.id) {\n data.id = `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n const path = storage.buildPath(this.config.appName, holonId, lensName, data.id);\n const existingData = await storage.read(this.client, path);\n\n // Handle hologram writes\n if (existingData && existingData.hologram === true && existingData.target) {\n const hologramStructureFields = ['hologram', 'soul', 'target', 'id', '_meta'];\n const localOverrideFields = Object.keys(existingData).filter(k => !hologramStructureFields.includes(k));\n\n const localData = { ...existingData };\n const sourceUpdates = {};\n\n for (const [key, value] of Object.entries(data)) {\n if (hologramStructureFields.includes(key) || key === '_hologram') continue;\n if (localOverrideFields.includes(key)) {\n localData[key] = value;\n } else {\n sourceUpdates[key] = value;\n }\n }\n\n if (Object.keys(sourceUpdates).length > 0 && options.validate !== false && this.schemas.has(lensName)) {\n const sourcePath = storage.buildPath(\n existingData.target.appname || this.config.appName,\n existingData.target.holonId,\n existingData.target.lensName,\n existingData.target.dataId\n );\n const currentSourceData = await storage.read(this.client, sourcePath);\n const mergedSourceData = { ...currentSourceData, ...sourceUpdates };\n\n const schemaObj = this.schemas.get(lensName);\n const strict = options.strict !== undefined ? options.strict : schemaObj.strict;\n\n if (schemaObj.schema && typeof schemaObj.schema === 'object' && !schemaObj.schema.$ref) {\n schema.validate(mergedSourceData, schemaObj.schema, lensName, strict);\n }\n }\n\n const startTime = Date.now();\n await storage.write(this.client, path, localData);\n\n if (Object.keys(sourceUpdates).length > 0) {\n const sourcePath = storage.buildPath(\n existingData.target.appname || this.config.appName,\n existingData.target.holonId,\n existingData.target.lensName,\n existingData.target.dataId\n );\n await storage.update(this.client, sourcePath, sourceUpdates);\n await federation.refreshActiveHolograms(\n this.client,\n existingData.target.appname || this.config.appName,\n existingData.target.holonId,\n existingData.target.lensName,\n existingData.target.dataId\n );\n }\n\n const endTime = Date.now();\n this._metrics.writes++;\n if (!this._metrics.totalWriteTime) this._metrics.totalWriteTime = 0;\n this._metrics.totalWriteTime += (endTime - startTime);\n\n return true;\n }\n\n // Regular write\n if (!data._meta) data._meta = {};\n data._meta.createdAt = data._meta.createdAt || Date.now();\n data._meta.updatedAt = Date.now();\n\n if (options.validate !== false && this.schemas.has(lensName)) {\n const schemaObj = this.schemas.get(lensName);\n const strict = options.strict !== undefined ? options.strict : schemaObj.strict;\n if (schemaObj.schema && typeof schemaObj.schema === 'object' && !schemaObj.schema.$ref) {\n schema.validate(data, schemaObj.schema, lensName, strict);\n }\n }\n\n const startTime = Date.now();\n await storage.write(this.client, path, data);\n const endTime = Date.now();\n\n this._metrics.writes++;\n if (!this._metrics.totalWriteTime) this._metrics.totalWriteTime = 0;\n this._metrics.totalWriteTime += (endTime - startTime);\n\n const { autoPropagate = true } = options;\n if (autoPropagate && !data.hologram) {\n await this.propagate(holonId, lensName, data, options.propagationOptions || {});\n }\n\n return true;\n }\n\n async _resolveHolograms(data, visited = new Set()) {\n if (!data) return data;\n\n if (Array.isArray(data)) {\n const resolved = [];\n for (const item of data) {\n const resolvedItem = await this._resolveHolograms(item, new Set());\n if (resolvedItem !== null) {\n resolved.push(resolvedItem);\n }\n }\n return resolved;\n }\n\n if (data && typeof data === 'object') {\n if (data.hologram === true && data.target) {\n const sourcePath = storage.buildPath(\n data.target.appname || this.config.appName,\n data.target.holonId,\n data.target.lensName,\n data.target.dataId\n );\n\n // Circular reference detection\n if (visited.has(sourcePath)) {\n console.warn(`Circular hologram reference detected: ${sourcePath}`);\n return null;\n }\n visited.add(sourcePath);\n\n let resolveOptions = {};\n if (data.target.authorPubKey) {\n resolveOptions.authors = [data.target.authorPubKey];\n resolveOptions.includeAuthor = true;\n }\n\n const sourceData = await storage.read(this.client, sourcePath, resolveOptions);\n if (sourceData) {\n // If source is also a hologram, recursively resolve it\n let resolvedSource = sourceData;\n if (sourceData.hologram === true && sourceData.target) {\n resolvedSource = await this._resolveHolograms(sourceData, visited);\n if (resolvedSource === null) {\n return null; // Circular reference or unresolvable\n }\n }\n\n // Get local override fields from the hologram (excluding hologram structure fields)\n const hologramStructureFields = ['hologram', 'soul', 'target', '_meta', 'id', 'capability', 'crossHolosphere'];\n const localOverrides = {};\n for (const [k, v] of Object.entries(data)) {\n if (!hologramStructureFields.includes(k)) {\n localOverrides[k] = v;\n }\n }\n\n const merged = {\n ...resolvedSource,\n ...localOverrides,\n _hologram: {\n isHologram: true,\n soul: data.soul,\n sourceHolon: data.target.holonId,\n source: data.target,\n localOverrides: Object.keys(localOverrides),\n crossHolosphere: data.crossHolosphere || false,\n }\n };\n\n // Preserve source _meta but add hologram source info\n if (resolvedSource._meta) {\n merged._meta = { ...resolvedSource._meta, source: data.target.holonId };\n } else {\n merged._meta = { source: data.target.holonId };\n }\n\n return merged;\n }\n return null; // Source not found\n }\n }\n return data;\n }\n\n async read(holonId, lensName, dataId = null, options = {}) {\n if (!holonId || typeof holonId !== 'string') {\n throw new ValidationError('ValidationError: holonId must be a non-empty string');\n }\n if (!lensName || typeof lensName !== 'string') {\n throw new ValidationError('ValidationError: lensName must be a non-empty string');\n }\n\n const capToken = options.capabilityToken || options.capability;\n if (capToken) {\n const authorized = await this.verifyCapability(capToken, 'read', { holonId, lensName, dataId });\n if (!authorized) {\n throw new AuthorizationError('AuthorizationError: Invalid capability token for read operation', 'read');\n }\n }\n\n const startTime = Date.now();\n let result;\n\n if (dataId) {\n const path = storage.buildPath(this.config.appName, holonId, lensName, dataId);\n result = await storage.read(this.client, path);\n } else {\n const path = storage.buildPath(this.config.appName, holonId, lensName);\n result = await storage.readAll(this.client, path);\n }\n\n const { resolveHolograms = true } = options;\n if (resolveHolograms) {\n result = await this._resolveHolograms(result);\n }\n\n const endTime = Date.now();\n this._metrics.reads++;\n if (!this._metrics.totalReadTime) this._metrics.totalReadTime = 0;\n this._metrics.totalReadTime += (endTime - startTime);\n\n return result;\n }\n\n async update(holonId, lensName, dataId, updates, options = {}) {\n if (!holonId || typeof holonId !== 'string') {\n throw new ValidationError('ValidationError: holonId must be a non-empty string');\n }\n if (!lensName || typeof lensName !== 'string') {\n throw new ValidationError('ValidationError: lensName must be a non-empty string');\n }\n if (!dataId || typeof dataId !== 'string') {\n throw new ValidationError('ValidationError: dataId must be a non-empty string');\n }\n if (!updates || typeof updates !== 'object') {\n throw new ValidationError('ValidationError: updates must be an object');\n }\n\n const capToken = options.capabilityToken || options.capability;\n if (capToken) {\n const authorized = await this.verifyCapability(capToken, 'write', { holonId, lensName, dataId });\n if (!authorized) {\n throw new AuthorizationError('AuthorizationError: Invalid capability token for update operation', 'write');\n }\n }\n\n const path = storage.buildPath(this.config.appName, holonId, lensName, dataId);\n const existingData = await storage.read(this.client, path);\n\n if (!existingData) {\n return false;\n }\n\n // Handle hologram updates\n if (existingData.hologram === true && existingData.target) {\n return this.write(holonId, lensName, { ...existingData, ...updates, id: dataId }, options);\n }\n\n const mergedData = { ...existingData, ...updates };\n mergedData._meta = mergedData._meta || {};\n mergedData._meta.updatedAt = Date.now();\n\n if (options.validate !== false && this.schemas.has(lensName)) {\n const schemaObj = this.schemas.get(lensName);\n const strict = options.strict !== undefined ? options.strict : schemaObj.strict;\n if (schemaObj.schema && typeof schemaObj.schema === 'object' && !schemaObj.schema.$ref) {\n schema.validate(mergedData, schemaObj.schema, lensName, strict);\n }\n }\n\n const startTime = Date.now();\n await storage.write(this.client, path, mergedData);\n const endTime = Date.now();\n\n this._metrics.writes++;\n if (!this._metrics.totalWriteTime) this._metrics.totalWriteTime = 0;\n this._metrics.totalWriteTime += (endTime - startTime);\n\n if (existingData._meta && existingData._meta.activeHolograms) {\n await federation.refreshActiveHolograms(this.client, this.config.appName, holonId, lensName, dataId);\n }\n\n return true;\n }\n\n async delete(holonId, lensName, dataId, options = {}) {\n if (!holonId || typeof holonId !== 'string') {\n throw new ValidationError('ValidationError: holonId must be a non-empty string');\n }\n if (!lensName || typeof lensName !== 'string') {\n throw new ValidationError('ValidationError: lensName must be a non-empty string');\n }\n if (!dataId || typeof dataId !== 'string') {\n throw new ValidationError('ValidationError: dataId must be a non-empty string');\n }\n\n const path = storage.buildPath(this.config.appName, holonId, lensName, dataId);\n const existingData = await storage.read(this.client, path);\n\n // Return false if data doesn't exist\n if (!existingData) {\n return false;\n }\n\n // Check authorization: owner can delete, others need capability token\n const dataOwner = existingData.owner || existingData._creator;\n const isOwner = !dataOwner || dataOwner === this.client.publicKey;\n\n const capToken = options.capabilityToken || options.capability;\n if (!isOwner) {\n // Non-owner must provide a valid capability token\n if (!capToken) {\n throw new AuthorizationError('AuthorizationError: Capability token required for delete operation', 'delete');\n }\n const authorized = await this.verifyCapability(capToken, 'delete', { holonId, lensName, dataId });\n if (!authorized) {\n throw new AuthorizationError('AuthorizationError: Invalid capability token for delete operation', 'delete');\n }\n } else if (capToken) {\n // Owner provided a token - validate it anyway\n const authorized = await this.verifyCapability(capToken, 'delete', { holonId, lensName, dataId });\n if (!authorized) {\n throw new AuthorizationError('AuthorizationError: Invalid capability token for delete operation', 'delete');\n }\n }\n\n if (existingData.hologram === true) {\n return this.deleteHologram(holonId, lensName, dataId, options);\n }\n\n await storage.deleteData(this.client, path);\n this._metrics.deletes++;\n return true;\n }\n\n // === Global Tables ===\n async writeGlobal(table, data) {\n return globalTables.writeGlobal(this.client, this.config.appName, table, data);\n }\n\n async readGlobal(table, key = null) {\n return globalTables.readGlobal(this.client, this.config.appName, table, key);\n }\n\n async updateGlobal(table, key, updates) {\n return globalTables.updateGlobal(this.client, this.config.appName, table, key, updates);\n }\n\n async deleteGlobal(table, key) {\n return globalTables.deleteGlobal(this.client, this.config.appName, table, key);\n }\n\n async getAllGlobal(table) {\n return globalTables.getAllGlobal(this.client, this.config.appName, table);\n }\n\n async deleteAllGlobal(table) {\n return globalTables.deleteAllGlobal(this.client, this.config.appName, table);\n }\n\n // === Batch Operations ===\n async getAll(holonId, lensName) {\n return this.read(holonId, lensName, null);\n }\n\n async deleteAll(holonId, lensName) {\n const path = storage.buildPath(this.config.appName, holonId, lensName);\n return storage.deleteAll(this.client, path);\n }\n\n // === Schema Operations ===\n async setSchema(lensName, schemaInput, strict = false) {\n if (!lensName || typeof lensName !== 'string') {\n throw new ValidationError('ValidationError: lensName must be a non-empty string');\n }\n\n // Handle null/undefined\n if (schemaInput == null) {\n throw new ValidationError('ValidationError: schema cannot be null or undefined');\n }\n\n let schemaObj;\n\n // Handle URI string - store as $ref\n if (typeof schemaInput === 'string') {\n schemaObj = { $ref: schemaInput };\n } else if (typeof schemaInput === 'object') {\n // Validate it looks like a JSON Schema (must have type or $ref or properties or items)\n const isValidSchema = schemaInput.$ref ||\n schemaInput.type ||\n schemaInput.properties ||\n schemaInput.items ||\n schemaInput.allOf ||\n schemaInput.anyOf ||\n schemaInput.oneOf ||\n schemaInput.$schema;\n\n if (!isValidSchema) {\n throw new ValidationError('ValidationError: Invalid JSON Schema format');\n }\n schemaObj = schemaInput;\n } else {\n throw new ValidationError('ValidationError: schema must be an object or URI string');\n }\n\n this.schemas.set(lensName, { schema: schemaObj, strict, timestamp: Date.now() });\n }\n\n async getSchema(lensName) {\n const schemaObj = this.schemas.get(lensName);\n return schemaObj ? schemaObj.schema : null;\n }\n\n async clearSchema(lensName) {\n this.schemas.delete(lensName);\n // Returns undefined for contract compliance\n }\n\n // === Federation Operations ===\n async federate(sourceHolon, targetHolon, lensName, options = {}) {\n const { direction = 'outbound', mode = 'reference', filter = null } = options;\n\n // Validation\n if (sourceHolon === targetHolon) {\n throw new Error('Cannot federate a holon with itself');\n }\n if (!['inbound', 'outbound', 'bidirectional'].includes(direction)) {\n throw new Error(`Invalid direction: ${direction}. Must be 'inbound', 'outbound', or 'bidirectional'`);\n }\n\n // Store federation config\n await federation.setupFederation(\n this.client,\n this.config.appName,\n sourceHolon,\n targetHolon,\n lensName,\n options\n );\n\n // Actually propagate existing data based on direction\n if (direction === 'outbound' || direction === 'bidirectional') {\n await this._propagateExistingData(sourceHolon, targetHolon, lensName, { mode, filter });\n }\n if (direction === 'inbound' || direction === 'bidirectional') {\n await this._propagateExistingData(targetHolon, sourceHolon, lensName, { mode, filter });\n }\n\n this._metrics.federations = (this._metrics.federations || 0) + 1;\n return true;\n }\n\n async _propagateExistingData(fromHolon, toHolon, lensName, options = {}) {\n const { mode = 'reference', filter = null } = options;\n const existingData = await this.read(fromHolon, lensName, null, { resolveHolograms: false });\n if (!existingData) return;\n\n const items = Array.isArray(existingData) ? existingData : [existingData];\n for (const item of items) {\n // Skip holograms to avoid circular propagation\n if (item.hologram === true) continue;\n // Apply filter if provided\n if (filter && !filter(item)) continue;\n await federation.propagateData(\n this.client,\n this.config.appName,\n item,\n fromHolon,\n toHolon,\n lensName,\n mode\n );\n }\n }\n\n async getFederatedData(holonId, lensName, options = {}) {\n const { resolveHolograms = true } = options;\n const path = storage.buildPath(this.config.appName, holonId, lensName);\n const data = await storage.readAll(this.client, path);\n\n if (!data || !resolveHolograms) return data;\n\n // Resolve holograms using existing method\n return this._resolveHolograms(data);\n }\n\n async unfederate(sourceHolon, targetHolon, lensName) {\n // Remove federation config for this relationship - idempotent\n const configPath = storage.buildPath(this.config.appName, sourceHolon, lensName, '_federation');\n try {\n await storage.deleteData(this.client, configPath);\n } catch (e) {\n // Ignore errors - already unfederated or doesn't exist\n }\n return true;\n }\n\n async updateHologramOverrides(holonId, lensName, dataId, overrides) {\n return federation.updateHologramOverrides(\n this.client,\n this.config.appName,\n holonId,\n lensName,\n dataId,\n overrides\n );\n }\n\n createHologram(sourceHolon, lensName, data, targetHolon = null) {\n return federation.createHologram(\n sourceHolon,\n targetHolon || sourceHolon,\n lensName,\n data.id,\n this.config.appName\n );\n }\n\n async getActiveHolograms(holonId, lensName, dataId) {\n // Read the source data and return its activeHolograms list\n const path = storage.buildPath(this.config.appName, holonId, lensName, dataId);\n const sourceData = await storage.read(this.client, path);\n if (!sourceData || !sourceData._meta || !sourceData._meta.activeHolograms) {\n return [];\n }\n return sourceData._meta.activeHolograms;\n }\n\n async removeActiveHologram(sourceHolon, lensName, dataId, targetHolon) {\n return federation.removeActiveHologram(\n this.client,\n this.config.appName,\n sourceHolon,\n lensName,\n dataId,\n targetHolon\n );\n }\n\n async deleteHologram(holonId, lensName, dataId, options = {}) {\n return federation.deleteHologram(\n this.client,\n this.config.appName,\n holonId,\n lensName,\n dataId,\n options\n );\n }\n\n async propagateData(data, sourceHolon, targetHolon, lensName, options = {}) {\n // Extract mode from options, default to 'reference' for hologram creation\n const mode = options.mode || 'reference';\n return federation.propagateData(\n this.client,\n this.config.appName,\n data,\n sourceHolon,\n targetHolon,\n lensName,\n mode\n );\n }\n\n async resolveHologram(hologram, options = {}) {\n return federation.resolveHologram(this.client, hologram, new Set(), [], { ...options, appname: this.config.appName });\n }\n\n isHologram(data) {\n return federation.isHologram(data);\n }\n\n isResolvedHologram(data) {\n return federation.isResolvedHologram(data);\n }\n\n getHologramSource(data) {\n return federation.getHologramSource(data);\n }\n\n async cleanupCircularHolograms(holonId, lensName, options = {}) {\n return federation.cleanupCircularHolograms(\n this.client,\n this.config.appName,\n holonId,\n lensName,\n options\n );\n }\n\n async cleanupCircularHologramsByIds(holonId, lensName, dataIds, options = {}) {\n return federation.cleanupCircularHologramsByIds(\n this.client,\n this.config.appName,\n holonId,\n lensName,\n dataIds,\n options\n );\n }\n\n async propagate(holonId, lensName, data, options = {}) {\n const federationData = await this.getFederation(holonId);\n // getFederation returns an object with federated array, not an array directly\n const targets = federationData?.federated || federationData?.outbound || [];\n if (!targets || targets.length === 0) return;\n\n const { useHolograms = true, resolveExisting = true } = options;\n const results = [];\n\n for (const targetHolonId of targets) {\n const result = await this.propagateData(\n data,\n holonId,\n targetHolonId,\n lensName,\n { useHolograms, resolveExisting }\n );\n results.push({ parent: targetHolonId, ...result });\n }\n\n return results;\n }\n\n async getFederation(holonId) {\n if (!holonId) {\n throw new Error('getFederation: Missing holon ID');\n }\n const data = await this.readGlobal('federation', holonId);\n if (!data) return null;\n\n if (!Array.isArray(data.inbound)) data.inbound = [];\n if (!Array.isArray(data.outbound)) data.outbound = [];\n if (!data.lensConfig || typeof data.lensConfig !== 'object') data.lensConfig = {};\n if (!data.partnerNames || typeof data.partnerNames !== 'object') data.partnerNames = {};\n\n if (!Array.isArray(data.federated)) {\n const allFederated = new Set([...data.inbound, ...data.outbound]);\n data.federated = Array.from(allFederated);\n }\n\n return data;\n }\n\n async federateHolon(sourceHolon, targetHolon, options = {}) {\n const { lensConfig = { inbound: [], outbound: [] }, partnerName = null } = options;\n\n if (sourceHolon === targetHolon) {\n throw new Error('Cannot federate a holon with itself');\n }\n\n let federationData = await this.readGlobal('federation', sourceHolon) || {\n id: sourceHolon,\n name: sourceHolon,\n federated: [],\n inbound: [],\n outbound: [],\n lensConfig: {},\n partnerNames: {},\n timestamp: Date.now()\n };\n\n if (!Array.isArray(federationData.federated)) federationData.federated = [];\n if (!Array.isArray(federationData.inbound)) federationData.inbound = [];\n if (!Array.isArray(federationData.outbound)) federationData.outbound = [];\n if (!federationData.lensConfig || typeof federationData.lensConfig !== 'object') federationData.lensConfig = {};\n if (!federationData.partnerNames || typeof federationData.partnerNames !== 'object') federationData.partnerNames = {};\n\n if (!federationData.federated.includes(targetHolon)) {\n federationData.federated.push(targetHolon);\n }\n\n // Store the partner's name if provided\n if (partnerName) {\n federationData.partnerNames[targetHolon] = partnerName;\n }\n\n if (lensConfig.outbound && lensConfig.outbound.length > 0) {\n if (!federationData.outbound.includes(targetHolon)) {\n federationData.outbound.push(targetHolon);\n }\n } else {\n federationData.outbound = federationData.outbound.filter(id => id !== targetHolon);\n }\n\n if (lensConfig.inbound && lensConfig.inbound.length > 0) {\n if (!federationData.inbound.includes(targetHolon)) {\n federationData.inbound.push(targetHolon);\n }\n } else {\n federationData.inbound = federationData.inbound.filter(id => id !== targetHolon);\n }\n\n federationData.lensConfig[targetHolon] = {\n inbound: lensConfig.inbound || [],\n outbound: lensConfig.outbound || [],\n timestamp: Date.now()\n };\n\n const success = await this.writeGlobal('federation', federationData);\n this.clearCache('federation');\n\n if (success) {\n for (const lens of (lensConfig.inbound || [])) {\n await this.federate(targetHolon, sourceHolon, lens, { direction: 'outbound', mode: 'reference' });\n }\n for (const lens of (lensConfig.outbound || [])) {\n await this.federate(sourceHolon, targetHolon, lens, { direction: 'outbound', mode: 'reference' });\n }\n }\n\n return success;\n }\n\n async unfederateHolon(sourceHolon, targetHolon) {\n const federationData = await this.readGlobal('federation', sourceHolon);\n if (!federationData) return false;\n\n const lensConfig = federationData.lensConfig?.[targetHolon];\n\n federationData.federated = (federationData.federated || []).filter(id => id !== targetHolon);\n federationData.inbound = (federationData.inbound || []).filter(id => id !== targetHolon);\n federationData.outbound = (federationData.outbound || []).filter(id => id !== targetHolon);\n\n if (federationData.lensConfig) {\n delete federationData.lensConfig[targetHolon];\n }\n\n const success = await this.writeGlobal('federation', federationData);\n this.clearCache('federation');\n\n if (success && lensConfig) {\n for (const lens of (lensConfig.inbound || [])) {\n await this.unfederate(targetHolon, sourceHolon, lens);\n }\n for (const lens of (lensConfig.outbound || [])) {\n await this.unfederate(sourceHolon, targetHolon, lens);\n }\n }\n\n return success;\n }\n\n async getFederatedConfig(sourceHolon, targetHolon) {\n const federationData = await this.readGlobal('federation', sourceHolon);\n if (!federationData || !federationData.lensConfig) return null;\n return federationData.lensConfig[targetHolon] || null;\n }\n\n // === Hierarchical Operations ===\n async upcast(holonId, lensName, dataId, options = {}) {\n return hierarchical.upcast(this, holonId, lensName, dataId, options);\n }\n\n // === Subscriptions ===\n subscribe(holonId, lensName, callback, options = {}) {\n if (typeof callback !== 'function') {\n throw new TypeError('callback must be a function');\n }\n const path = storage.buildPath(this.config.appName, holonId, lensName);\n const subscriptionOptions = { realtimeOnly: true, ...options };\n const subscriptionId = `${holonId}-${lensName}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n let innerSubscription = null;\n let unsubscribeCalled = false;\n\n subscriptions.createSubscription(this.client, path, callback, subscriptionOptions)\n .then(subscription => {\n innerSubscription = subscription;\n if (unsubscribeCalled) {\n subscription.unsubscribe();\n } else {\n this.subscriptionRegistry.register(subscriptionId, subscription);\n }\n })\n .catch(err => {\n this._log('ERROR', 'Subscription setup failed', { path, error: err.message });\n });\n\n this._metrics.subscriptions = (this._metrics.subscriptions || 0) + 1;\n return {\n unsubscribe: () => {\n unsubscribeCalled = true;\n if (innerSubscription) {\n this.subscriptionRegistry.unregister(subscriptionId);\n }\n }\n };\n }\n\n async subscribeGlobal(table, key, callback, options = {}) {\n return globalTables.subscribeGlobal(\n this.client,\n this.config.appName,\n table,\n key,\n callback,\n options\n );\n }\n\n // === Crypto Operations ===\n async getPublicKey(privateKey) {\n return crypto.getPublicKey(privateKey);\n }\n\n async sign(content, privateKey) {\n return crypto.sign(content, privateKey);\n }\n\n async verify(content, signature, publicKey) {\n return crypto.verify(content, signature, publicKey);\n }\n\n async issueCapability(permissions, scope, recipient, options) {\n return crypto.issueCapability(permissions, scope, recipient, options);\n }\n\n async verifyCapability(token, requiredPermission, scope) {\n return crypto.verifyCapability(token, requiredPermission, scope);\n }\n\n // === Social Protocol Operations ===\n async publishNostr(event, holonId, lensName = 'social') {\n // Validate Nostr event format\n social.validateNostrEvent(event, true, true); // partial=true, throwOnError=true\n\n const enrichedEvent = {\n ...event,\n tags: [...(event.tags || []), ['h', holonId], ['l', lensName]],\n };\n const signedEvent = nostrUtils.signEvent(enrichedEvent, this.client.privateKey);\n\n // Add protocol field for querySocial filtering\n const eventWithProtocol = {\n ...signedEvent,\n protocol: 'nostr',\n };\n\n const path = storage.buildPath(this.config.appName, holonId, lensName, signedEvent.id);\n await storage.write(this.client, path, eventWithProtocol);\n return true;\n }\n\n async publishActivityPub(object, holonId, lensName = 'social') {\n // Validate ActivityPub object format\n social.validateActivityPubObject(object, true); // throwOnError=true\n\n const activity = social.transformActivityPubObject({\n ...object,\n actor: object.actor || this.client.publicKey,\n });\n return this.write(holonId, lensName, activity);\n }\n\n async querySocial(holonId, options = {}) {\n const lensName = options.lens || 'social';\n const data = await this.read(holonId, lensName);\n\n if (!data) return [];\n const items = Array.isArray(data) ? data : [data];\n\n return items.filter(item => {\n // 'all' means don't filter by protocol\n if (options.protocol && options.protocol !== 'all' && item.protocol !== options.protocol) return false;\n if (options.type && item.type !== options.type) return false;\n if (options.since && item.created_at < options.since) return false;\n if (options.until && item.created_at > options.until) return false;\n return true;\n });\n }\n\n async verifyNostrEvent(event) {\n // Extract only standard Nostr event fields for verification\n // (nostr-tools can't serialize events with extra properties like 'protocol')\n const { id, pubkey, created_at, kind, tags, content, sig } = event;\n const standardEvent = { id, pubkey, created_at, kind, tags, content, sig };\n return nostrUtils.verifyEvent(standardEvent);\n }\n\n // === Metrics ===\n metrics() {\n const reads = this._metrics.reads || 0;\n const writes = this._metrics.writes || 0;\n const totalReadTime = this._metrics.totalReadTime || 0;\n const totalWriteTime = this._metrics.totalWriteTime || 0;\n\n return {\n reads,\n writes,\n deletes: this._metrics.deletes || 0,\n federations: this._metrics.federations || 0,\n subscriptions: this._metrics.subscriptions || 0,\n avgReadTime: reads > 0 ? totalReadTime / reads : 0,\n avgWriteTime: writes > 0 ? totalWriteTime / writes : 0,\n };\n }\n\n // === Aliases ===\n async put(holonId, lensName, data, options = {}) {\n return this.write(holonId, lensName, data, options);\n }\n\n async get(holonId, lensName, dataId = null, options = {}) {\n return this.read(holonId, lensName, dataId, options);\n }\n\n async remove(holonId, lensName, dataId, options = {}) {\n return this.delete(holonId, lensName, dataId, options);\n }\n\n async putGlobal(table, data) {\n return this.writeGlobal(table, data);\n }\n\n async getGlobal(table, key = null) {\n return this.readGlobal(table, key);\n }\n\n async removeGlobal(table, key) {\n return this.deleteGlobal(table, key);\n }\n\n async defineSchema(lensName, schemaObj, strict = false) {\n return this.setSchema(lensName, schemaObj, strict);\n }\n\n async fetchSchema(lensName) {\n return this.getSchema(lensName);\n }\n\n async removeSchema(lensName) {\n return this.clearSchema(lensName);\n }\n\n async store(holonId, lensName, data, options = {}) {\n return this.write(holonId, lensName, data, options);\n }\n\n async fetch(holonId, lensName, dataId = null, options = {}) {\n return this.read(holonId, lensName, dataId, options);\n }\n\n async save(holonId, lensName, data, options = {}) {\n return this.write(holonId, lensName, data, options);\n }\n\n async load(holonId, lensName, dataId = null, options = {}) {\n return this.read(holonId, lensName, dataId, options);\n }\n\n // === Cache ===\n clearCache(pattern = null) {\n if (pattern) {\n for (const key of this._cache.keys()) {\n if (key.includes(pattern)) {\n this._cache.delete(key);\n }\n }\n } else {\n this._cache.clear();\n }\n }\n}\n\n/**\n * Main HoloSphere class - composed from base + all mixins\n */\nexport const HoloSphere = withContractMethods(\n withFederationMethods(\n withAIMethods(HoloSphereBase)\n )\n);\n\n// Export error classes\nexport { AuthorizationError };\nexport { ValidationError };\n\n// Re-export AI module classes\nexport {\n LLMService,\n SchemaExtractor,\n JSONOps,\n Embeddings,\n Council,\n TTS,\n VOICES,\n MODELS,\n NLQuery,\n Classifier,\n SpatialAnalysis,\n SmartAggregation,\n FederationAdvisor,\n RelationshipDiscovery,\n TaskBreakdown,\n H3AI,\n};\n\n// Re-export types and utilities\nexport { spatial, storage, schema, federation, handshake, crypto, nostrUtils, social, subscriptions, hierarchical };\n\n// Re-export specific utilities used in tests\nexport { matchScope } from './crypto/secp256k1.js';\nexport { createHologram } from './federation/hologram.js';\n\n// Export AI factory function\nexport { createAIServices } from './ai/index.js';\n\n// Export Contracts module classes for standalone use\nexport {\n ChainManager,\n ContractDeployer,\n HolonContracts,\n ContractOperations,\n ContractABIs,\n EventListener,\n ContractQueries,\n SANKEY_EVENTS\n};\n\n// Export network utilities\nexport {\n NETWORKS,\n getNetwork,\n getNetworksByType,\n listNetworks,\n isNetworkSupported,\n getTxUrl,\n getAddressUrl\n} from './contracts/networks.js';\n\n// Export contracts namespace\nexport { networks };\n\n// Default export for backward compatibility\nexport default HoloSphere;\n"],"names":["b","pendingQueries","getPublicKey","bytes","crypto","kind","type","module","name","str","buildPath","encodePathComponent","write","read","readAll","output","update","deleteData","deleteAll","subscribe","writeGlobal","readGlobal","deleteGlobal","deleteAllGlobal","id","aggregate","n","validate","wrapper.buildPath","wrapper.buildGlobalPath","wrapper.write","wrapper.read","wrapper.readAll","wrapper.update","wrapper.deleteData","wrapper.writeGlobal","wrapper.readGlobal","wrapper.readAllGlobal","wrapper.deleteGlobal","wrapper.deleteAllGlobal","wrapper.parse","gunWrapper.buildPath","gunFederation.federate","gunFederation.unfederate","gunFederation.getFederation","gunFederation.resetFederation","gunFederation.propagate","gunFederation.getFederated","gunFederation.subscribeFederation","gunFederation.federateMessage","gunFederation.getFederatedMessages","gunFederation.updateFederatedMessages","limit","nostrWrapper.buildPath","gunWrapper.write","nostrWrapper.write","gunWrapper.read","nostrWrapper.read","gunWrapper.readAll","nostrWrapper.readAll","gunWrapper.update","nostrWrapper.update","gunWrapper.deleteData","nostrWrapper.deleteData","gunWrapper.deleteAll","nostrWrapper.deleteAll","gunWrapper.subscribe","nostrWrapper.subscribe","validator","ValidationError","createView","rotr","bytesToHex","hexToBytes","utf8ToBytes","toBytes","concatBytes","randomBytes","isLE","_32n","Hash","sha256","sha256n","generateNonce","hash","hologram","nostrGetPublicKey","nostrVerifyEvent","sendFederationRequest","acceptFederationRequest","is_array","stringify","fetch","FormData","File","ReadableStream","shims.kind","shims.setShims","auto.getRuntime","__classPrivateFieldSet","__classPrivateFieldGet","getBytes","parseResponse","opts","Page","shimsKind","retryMessage","init","modifiedArg","MessagesAPI.Messages","Completions","Messages","CompletionsAPI.Completions","Chat","Core.multipartFormRequestOptions","TranscriptionsAPI.Transcriptions","TranslationsAPI.Translations","SpeechAPI.Speech","_EventStream_handleError","chunk","Core.isObj","_AssistantStream_addEvent","_AssistantStream_endRequest","_AssistantStream_handleMessage","_AssistantStream_handleRunStep","_AssistantStream_handleEvent","_AssistantStream_accumulateRunStep","_AssistantStream_accumulateMessage","_AssistantStream_accumulateContent","_AssistantStream_handleRun","isAutoParsableTool","hasAutoParseableInput","parseToolCall","inputTool","emit","content","_AbstractChatCompletionRunner_getFinalContent","_AbstractChatCompletionRunner_getFinalMessage","_AbstractChatCompletionRunner_getFinalFunctionCall","_AbstractChatCompletionRunner_getFinalFunctionCallResult","_AbstractChatCompletionRunner_calculateTotalUsage","_AbstractChatCompletionRunner_validateParams","_AbstractChatCompletionRunner_stringifyFunctionCallResult","escape","e","_ChatCompletionStream_beginRequest","_ChatCompletionStream_getChoiceEventState","_ChatCompletionStream_addChunk","_ChatCompletionStream_emitToolCallDoneEvent","_ChatCompletionStream_emitContentDoneEvents","_ChatCompletionStream_endRequest","_ChatCompletionStream_getAutoParseableResponseFormat","_ChatCompletionStream_accumulateChatCompletion","_a","refusal","rest","index","SessionsAPI.Sessions","TranscriptionSessionsAPI.TranscriptionSessions","StepsAPI.Steps","Runs","RunsAPI.Runs","RealtimeAPI.Realtime","ChatAPI.Chat","AssistantsAPI.Assistants","ThreadsAPI.Threads","ContentAPI.Content","Files","FilesAPI.Files","Core.debug","response","Core.toFloat32Array","OutputItemsAPI.OutputItems","GradersAPI.Graders","Graders","PermissionsAPI.Permissions","Checkpoints","CheckpointsAPI.Checkpoints","MethodsAPI.Methods","JobsAPI.Jobs","AlphaAPI.Alpha","GraderModelsAPI.GraderModels","_ResponseStream_beginRequest","_ResponseStream_addEvent","event","_ResponseStream_endRequest","_ResponseStream_accumulateResponse","InputItemsAPI.InputItems","PartsAPI.Parts","FileBatchesAPI.FileBatches","Core.APIClient","Core.readEnv","Errors.OpenAIError","Core.isRunningInBrowser","API.Completions","API.Chat","API.Embeddings","API.Files","API.Images","API.Audio","API.Moderations","API.Models","API.FineTuning","API.Graders","API.VectorStores","API.Beta","API.Batches","API.Uploads","API.Responses","API.Evals","API.Containers","qs.stringify","Errors.APIError","Errors.APIConnectionError","Errors.APIConnectionTimeoutError","Errors.APIUserAbortError","Errors.NotFoundError","Errors.ConflictError","Errors.RateLimitError","Errors.BadRequestError","Errors.AuthenticationError","Errors.InternalServerError","Errors.PermissionDeniedError","Errors.UnprocessableEntityError","Uploads.toFile","Uploads.fileFromPath","Embeddings","UploadsAPIUploads","names","description","summary","abi","bytecode","internal","types","BN_0","BN_1","mask","_guard","passProperties","args","getValue","defaults","throwError","keywords","result","process","value","indexed","inputs","PanicReasons","number","blockNumber","receipt","fragment","t","listener","addr","target","code","ethers.formatEther","ethers.Contract","version","ethers.ZeroAddress","registry.addFederatedPartner","registry.removeFederatedPartner","registry.getFederatedAuthors","registry.getFederationRegistry","registry.storeInboundCapability","registry.getCapabilityForAuthor","storage.buildPath","nostrAsync.nostrGet","nostrAsync.nostrGetAll","federation.createHologram","storage.write","crypto.issueCapability","registry.getFederatedPartner","registry.storeOutboundCapability","discovery.sendFederationRequest","discovery.subscribeFederationRequests","discovery.acceptFederationRequest","discovery.declineFederationRequest","discovery.subscribeFederationAcceptances","discovery.subscribeFederationDeclines","discovery.getPendingFederationRequests","HoloSphereCore","subscriptions.SubscriptionRegistry","OpenAI","spatial.toHolon","spatial.getParents","spatial.getChildren","spatial.isValidH3","storage.read","schema.validate","startTime","storage.update","federation.refreshActiveHolograms","endTime","storage.readAll","storage.deleteData","globalTables.writeGlobal","globalTables.readGlobal","globalTables.updateGlobal","globalTables.deleteGlobal","globalTables.getAllGlobal","globalTables.deleteAllGlobal","storage.deleteAll","federation.setupFederation","toHolon","federation.propagateData","federation.updateHologramOverrides","federation.removeActiveHologram","federation.deleteHologram","federation.resolveHologram","federation.isHologram","federation.isResolvedHologram","federation.getHologramSource","federation.cleanupCircularHolograms","federation.cleanupCircularHologramsByIds","hierarchical.upcast","subscriptions.createSubscription","globalTables.subscribeGlobal","crypto.getPublicKey","crypto.sign","crypto.verify","crypto.verifyCapability","social.validateNostrEvent","nostrUtils.signEvent","social.validateActivityPubObject","social.transformActivityPubObject","nostrUtils.verifyEvent","HoloSphere"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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Q,GAAG;AAAE,WAAO,EAAE,GAAG,EAAE;AAAA,EAAG;AAAA;AAAA;AAAA;AAAA,EAIrC,OAAO,QAAQ,GAAG;AAAE,WAAO,EAAE,GAAG,EAAE;AAAA,EAAG;AAAA;AAAA;AAAA;AAAA,EAIrC,OAAO,QAAQ,GAAG;AAAE,WAAO,EAAE,GAAG,EAAE;AAAA,EAAG;AAAA;AAAA;AAAA;AAAA,EAIrC,OAAO,QAAQ,GAAG;AAAE,WAAO,EAAE,GAAG,EAAE;AAAA,EAAG;AAAA;AAAA;AAAA;AAAA,EAIrC,OAAO,QAAQ,GAAG;AAAE,WAAO,EAAE,GAAG,EAAE;AAAA,EAAG;AAAA;AAAA;AAAA;AAAA,EAIrC,OAAO,QAAQ,GAAG;AAAE,WAAO,EAAE,GAAG,EAAE;AAAA,EAAG;AAAA;AAAA;AAAA;AAAA,EAIrC,OAAO,QAAQ,GAAG;AAAE,WAAO,EAAE,GAAG,EAAE;AAAA,EAAG;AAAA;AAAA;AAAA;AAAA,EAIrC,OAAO,QAAQ,GAAG;AAAE,WAAO,EAAE,GAAG,EAAE;AAAA,EAAG;AAAA;AAAA;AAAA;AAAA,EAIrC,OAAO,QAAQ,GAAG;AAAE,WAAO,EAAE,GAAG,EAAE;AAAA,EAAG;AAAA;AAAA;AAAA;AAAA,EAIrC,OAAO,QAAQ,GAAG;AAAE,WAAO,EAAE,GAAG,EAAE;AAAA,EAAG;AAAA;AAAA;AAAA;AAAA,EAIrC,OAAO,QAAQ,GAAG;AAAE,WAAO,EAAE,GAAG,EAAE;AAAA,EAAG;AAAA;AAAA;AAAA;AAAA,EAIrC,OAAO,QAAQ,GAAG;AAAE,WAAO,EAAE,GAAG,EAAE;AAAA,EAAG;AAAA;AAAA;AAAA;AAAA,EAIrC,OAAO,QAAQ,GAAG;AAAE,WAAO,EAAE,GAAG,EAAE;AAAA,EAAG;AAAA;AAAA;AAAA;AAAA,EAIrC,OAAO,QAAQ,GAAG;AAAE,WAAO,EAAE,GAAG,EAAE;AAAA,EAAG;AAAA;AAAA;AAAA;AAAA,EAIrC,OAAO,QAAQ,GAAG;AAAE,WAAO,EAAE,GAAG,EAAE;AAAA,EAAG;AAAA;AAAA;AAAA;AAAA,EAIrC,OAAO,QAAQ,GAAG;AAAE,WAAO,EAAE,GAAG,EAAE;AAAA,EAAG;AAAA;AAAA;AAAA;AAAA,EAIrC,OAAO,QAAQ,GAAG;AAAE,WAAO,IAAI,MAAM,QAAQ,WAAW,CAAC;AAAA,EAAG;AAAA;AAAA;AAAA;AAAA,EAI5D,OAAO,KAAK,GAAG;AAAE,WAAO,IAAI,MAAM,QAAQ,QAAQ,CAAC,CAAC,CAAC;AAAA,EAAG;AAAA;AAAA;AAAA;AAAA,EAIxD,OAAO,MAAM,GAAG;AAAE,WAAO,IAAI,MAAM,QAAQ,SAAS,CAAC;AAAA,EAAG;AAAA;AAAA;AAAA;AAAA,EAIxD,OAAO,OAAO,GAAG;AAAE,WAAO,IAAI,MAAM,QAAQ,UAAU,CAAC;AAAA,EAAG;AAAA;AAAA;AAAA;AAAA,EAI1D,OAAO,MAAM,GAAG,SAAS;AACrB,UAAM,IAAI,MAAM,qBAAqB;AAAA,EAEzC;AAAA;AAAA;AAAA;AAAA,EAIA,OAAO,MAAM,GAAGE,OAAM;AAClB,UAAM,IAAI,MAAM,qBAAqB;AAAA,EAEzC;AAAA;AAAA;AAAA;AAAA,EAIA,OAAO,UAAU,GAAG;AAChB,WAAO,IAAI,MAAM,QAAQ,aAAa,OAAO,OAAO,CAAA,GAAI,CAAC,CAAC;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAIA,OAAO,QAAQ,OAAO;AAClB,WAAQ,SACD,OAAQ,UAAW,YACnB,kBAAkB,SAClB,MAAM,iBAAiB;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,YAAY,OAAOF,OAAM;AAC5B,QAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,UAAI,MAAM,SAASA,OAAM;AACrB,cAAM,IAAI,MAAM,0BAA0BA,KAAI,SAAS,MAAM,IAAI,EAAE;AAAA,MACvE;AACA,aAAO,MAAM;AAAA,IACjB;AACA,WAAO;AAAA,EACX;AACJ;ACjlBO,MAAM,qBAAqB,MAAM;AAAA,EACpC,YAAY,WAAW;AACnB,UAAM,WAAW,WAAW,WAAW,KAAK;AAAA,EAChD;AAAA,EACA,eAAe;AACX,WAAO;AAAA,EACX;AAAA,EACA,OAAO,QAAQ,QAAQ;AACnB,QAAI,QAAQ,MAAM,YAAY,QAAQ,QAAQ;AAC9C,QAAI;AACA,cAAQ,WAAW,KAAK;AAAA,IAC5B,SACO,OAAO;AACV,aAAO,KAAK,YAAY,MAAM,SAAS,MAAM;AAAA,IACjD;AACA,WAAO,OAAO,WAAW,KAAK;AAAA,EAClC;AAAA,EACA,OAAO,QAAQ;AACX,WAAO,WAAW,QAAQ,OAAO,UAAS,GAAI,EAAE,CAAC;AAAA,EACrD;AACJ;ACrBO,MAAM,uBAAuB,MAAM;AAAA,EACtC;AAAA,EACA,YAAY,OAAO;AACf,UAAM,MAAM,MAAM,MAAM,MAAM,KAAK,MAAM,OAAO;AAChD,SAAK,QAAQ;AAAA,EACjB;AAAA,EACA,eAAe;AACX,WAAO,KAAK,MAAM,aAAY;AAAA,EAClC;AAAA,EACA,OAAO,QAAQ,OAAO;AAClB,WAAO,KAAK,MAAM,OAAO,QAAQ,KAAK;AAAA,EAC1C;AAAA,EACA,OAAO,QAAQ;AACX,WAAO,KAAK,MAAM,OAAO,MAAM;AAAA,EACnC;AACJ;ACdO,SAAS,KAAK,QAAQ,QAAQ,QAAQ;AACzC,MAAI,cAAc,CAAA;AAClB,MAAI,MAAM,QAAQ,MAAM,GAAG;AACvB,kBAAc;AAAA,EAClB,WACS,UAAU,OAAQ,WAAY,UAAU;AAC7C,QAAI,SAAS,CAAA;AACb,kBAAc,OAAO,IAAI,CAAC,UAAU;AAChC,YAAME,QAAO,MAAM;AACnB,aAAOA,OAAM,yDAAyD,oBAAoB,EAAE,UAAU,UAAU,MAAM,EAAE,MAAK,GAAI,OAAO,OAAM,CAAE;AAChJ,aAAO,CAAC,OAAOA,KAAI,GAAG,2DAA2D,oBAAoB,EAAE,UAAU,UAAU,MAAM,EAAE,MAAK,GAAI,OAAO,OAAM,CAAE;AAC3J,aAAOA,KAAI,IAAI;AACf,aAAO,OAAOA,KAAI;AAAA,IACtB,CAAC;AAAA,EACL,OACK;AACD,mBAAe,OAAO,uBAAuB,SAAS,MAAM;AAAA,EAChE;AACA,iBAAe,OAAO,WAAW,YAAY,QAAQ,+BAA+B,SAAS,MAAM;AACnG,MAAI,eAAe,IAAI,OAAM;AAC7B,MAAI,gBAAgB,IAAI,OAAM;AAC9B,MAAI,cAAc,CAAA;AAClB,SAAO,QAAQ,CAAC,OAAO,UAAU;AAC7B,QAAI,QAAQ,YAAY,KAAK;AAC7B,QAAI,MAAM,SAAS;AAEf,UAAI,gBAAgB,cAAc;AAElC,YAAM,OAAO,eAAe,KAAK;AAEjC,UAAI,aAAa,aAAa,oBAAmB;AACjD,kBAAY,KAAK,CAAC,eAAe;AAC7B,mBAAW,aAAa,aAAa;AAAA,MACzC,CAAC;AAAA,IACL,OACK;AACD,YAAM,OAAO,cAAc,KAAK;AAAA,IACpC;AAAA,EACJ,CAAC;AAED,cAAY,QAAQ,CAAC,SAAS;AAAE,SAAK,aAAa,MAAM;AAAA,EAAG,CAAC;AAC5D,MAAI,SAAS,OAAO,aAAa,YAAY;AAC7C,YAAU,OAAO,aAAa,aAAa;AAC3C,SAAO;AACX;AAIO,SAAS,OAAO,QAAQ,QAAQ;AACnC,MAAI,SAAS,CAAA;AACb,MAAI,OAAO,CAAA;AAEX,MAAI,aAAa,OAAO,UAAU,CAAC;AACnC,SAAO,QAAQ,CAAC,UAAU;AACtB,QAAI,QAAQ;AACZ,QAAI,MAAM,SAAS;AACf,UAAI,SAAS,OAAO,UAAS;AAC7B,UAAI,eAAe,WAAW,UAAU,MAAM;AAC9C,UAAI;AACA,gBAAQ,MAAM,OAAO,YAAY;AAAA,MACrC,SACO,OAAO;AAEV,YAAI,QAAQ,OAAO,gBAAgB,GAAG;AAClC,gBAAM;AAAA,QACV;AACA,gBAAQ;AACR,cAAM,WAAW,MAAM;AACvB,cAAM,OAAO,MAAM;AACnB,cAAM,OAAO,MAAM;AAAA,MACvB;AAAA,IACJ,OACK;AACD,UAAI;AACA,gBAAQ,MAAM,OAAO,MAAM;AAAA,MAC/B,SACO,OAAO;AAEV,YAAI,QAAQ,OAAO,gBAAgB,GAAG;AAClC,gBAAM;AAAA,QACV;AACA,gBAAQ;AACR,cAAM,WAAW,MAAM;AACvB,cAAM,OAAO,MAAM;AACnB,cAAM,OAAO,MAAM;AAAA,MACvB;AAAA,IACJ;AACA,QAAI,SAAS,QAAW;AACpB,YAAM,IAAI,MAAM,aAAa;AAAA,IACjC;AACA,WAAO,KAAK,KAAK;AACjB,SAAK,KAAK,MAAM,aAAa,IAAI;AAAA,EACrC,CAAC;AACD,SAAO,OAAO,UAAU,QAAQ,IAAI;AACxC;AAIO,MAAM,mBAAmB,MAAM;AAAA,EAClC;AAAA,EACA;AAAA,EACA,YAAY,OAAO,QAAQ,WAAW;AAClC,UAAMF,QAAQ,MAAM,OAAO,OAAO,UAAU,IAAI,SAAS,MAAM;AAC/D,UAAM,UAAW,WAAW,MAAM,MAAM;AACxC,UAAM,SAASA,OAAM,WAAW,OAAO;AACvC,qBAAiB,MAAM,EAAE,OAAO,OAAM,CAAE;AAAA,EAC5C;AAAA,EACA,eAAe;AAEX,UAAM,eAAe,KAAK,MAAM,aAAY;AAC5C,UAAM,SAAS,CAAA;AACf,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAClC,aAAO,KAAK,YAAY;AAAA,IAC5B;AACA,WAAO;AAAA,EACX;AAAA,EACA,OAAO,QAAQ,QAAQ;AACnB,UAAM,QAAQ,MAAM,YAAY,QAAQ,OAAO;AAC/C,QAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACvB,WAAK,YAAY,wBAAwB,KAAK;AAAA,IAClD;AACA,QAAI,QAAQ,KAAK;AACjB,QAAI,UAAU,IAAI;AACd,cAAQ,MAAM;AACd,aAAO,WAAW,MAAM,MAAM;AAAA,IAClC;AACA,wBAAoB,MAAM,QAAQ,OAAO,iBAAiB,KAAK,YAAa,MAAM,KAAK,YAAa,GAAG;AACvG,QAAI,SAAS,CAAA;AACb,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,aAAO,KAAK,KAAK,KAAK;AAAA,IAC1B;AACA,WAAO,KAAK,QAAQ,QAAQ,KAAK;AAAA,EACrC;AAAA,EACA,OAAO,QAAQ;AACX,QAAI,QAAQ,KAAK;AACjB,QAAI,UAAU,IAAI;AACd,cAAQ,OAAO,UAAS;AAMxB,aAAO,QAAQ,YAAY,OAAO,YAAY,4BAA4B,kBAAkB,EAAE,QAAQ,OAAO,OAAO,QAAQ,QAAQ,UAAU,QAAQ,OAAO,YAAY;AAAA,IAC7K;AACA,QAAI,SAAS,CAAA;AACb,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC5B,aAAO,KAAK,IAAI,eAAe,KAAK,KAAK,CAAC;AAAA,IAC9C;AACA,WAAO,OAAO,QAAQ,MAAM;AAAA,EAChC;AACJ;ACxJO,MAAM,qBAAqB,MAAM;AAAA,EACpC,YAAY,WAAW;AACnB,UAAM,QAAQ,QAAQ,WAAW,KAAK;AAAA,EAC1C;AAAA,EACA,eAAe;AACX,WAAO;AAAA,EACX;AAAA,EACA,OAAO,QAAQ,QAAQ;AACnB,UAAM,QAAQ,MAAM,YAAY,QAAQ,MAAM;AAC9C,WAAO,OAAO,WAAW,QAAQ,IAAI,CAAC;AAAA,EAC1C;AAAA,EACA,OAAO,QAAQ;AACX,WAAO,CAAC,CAAC,OAAO,UAAS;AAAA,EAC7B;AACJ;ACdO,MAAM,0BAA0B,MAAM;AAAA,EACzC,YAAYA,OAAM,WAAW;AACzB,UAAMA,OAAMA,OAAM,WAAW,IAAI;AAAA,EACrC;AAAA,EACA,eAAe;AACX,WAAO;AAAA,EACX;AAAA,EACA,OAAO,QAAQ,OAAO;AAClB,YAAQ,aAAa,KAAK;AAC1B,QAAI,SAAS,OAAO,WAAW,MAAM,MAAM;AAC3C,cAAU,OAAO,WAAW,KAAK;AACjC,WAAO;AAAA,EACX;AAAA,EACA,OAAO,QAAQ;AACX,WAAO,OAAO,UAAU,OAAO,UAAS,GAAI,IAAI;AAAA,EACpD;AACJ;AAIO,MAAM,mBAAmB,kBAAkB;AAAA,EAC9C,YAAY,WAAW;AACnB,UAAM,SAAS,SAAS;AAAA,EAC5B;AAAA,EACA,OAAO,QAAQ;AACX,WAAO,QAAQ,MAAM,OAAO,MAAM,CAAC;AAAA,EACvC;AACJ;AC1BO,MAAM,wBAAwB,MAAM;AAAA,EACvC;AAAA,EACA,YAAY,MAAM,WAAW;AACzB,QAAIE,QAAO,UAAU,OAAO,IAAI;AAChC,UAAMA,OAAMA,OAAM,WAAW,KAAK;AAClC,qBAAiB,MAAM,EAAE,KAAI,GAAI,EAAE,MAAM,UAAU;AAAA,EACvD;AAAA,EACA,eAAe;AACX,WAAQ,qEAAsE,UAAU,GAAG,IAAI,KAAK,OAAO,CAAC;AAAA,EAChH;AAAA,EACA,OAAO,QAAQ,QAAQ;AACnB,QAAI,OAAO,aAAa,MAAM,YAAY,QAAQ,KAAK,IAAI,CAAC;AAC5D,QAAI,KAAK,WAAW,KAAK,MAAM;AAC3B,WAAK,YAAY,yBAAyB,MAAM;AAAA,IACpD;AACA,WAAO,OAAO,WAAW,IAAI;AAAA,EACjC;AAAA,EACA,OAAO,QAAQ;AACX,WAAO,QAAQ,OAAO,UAAU,KAAK,IAAI,CAAC;AAAA,EAC9C;AACJ;ACzBA,MAAM,QAAQ,IAAI,WAAW,EAAE;AAIxB,MAAM,kBAAkB,MAAM;AAAA,EACjC,YAAY,WAAW;AACnB,UAAM,QAAQ,IAAI,WAAW,KAAK;AAAA,EACtC;AAAA,EACA,eAAe;AACX,WAAO;AAAA,EACX;AAAA,EACA,OAAO,QAAQ,OAAO;AAClB,QAAI,SAAS,MAAM;AACf,WAAK,YAAY,YAAY,KAAK;AAAA,IACtC;AACA,WAAO,OAAO,WAAW,KAAK;AAAA,EAClC;AAAA,EACA,OAAO,QAAQ;AACX,WAAO,UAAU,CAAC;AAClB,WAAO;AAAA,EACX;AACJ;ACnBA,MAAMmO,SAAO,OAAO,CAAC;AACrB,MAAM,OAAO,OAAO,CAAC;AACrB,MAAM,iBAAiB,OAAO,oEAAoE;AAI3F,MAAM,oBAAoB,MAAM;AAAA,EACnC;AAAA,EACA;AAAA,EACA,YAAY,MAAM,QAAQ,WAAW;AACjC,UAAMnO,SAAS,SAAS,QAAQ,UAAW,OAAO;AAClD,UAAMA,OAAMA,OAAM,WAAW,KAAK;AAClC,qBAAiB,MAAM,EAAE,MAAM,OAAM,GAAI,EAAE,MAAM,UAAU,QAAQ,WAAW;AAAA,EAClF;AAAA,EACA,eAAe;AACX,WAAO;AAAA,EACX;AAAA,EACA,OAAO,QAAQ,QAAQ;AACnB,QAAI,QAAQ,UAAU,MAAM,YAAY,QAAQ,KAAK,IAAI,CAAC;AAE1D,QAAI,eAAe,KAAK,gBAAgB,WAAW,CAAC;AACpD,QAAI,KAAK,QAAQ;AACb,UAAI,SAAS,KAAK,cAAe,KAAK,OAAO,IAAK,CAAC;AACnD,UAAI,QAAQ,UAAU,QAAQ,EAAE,SAAS,OAAO;AAC5C,aAAK,YAAY,uBAAuB,MAAM;AAAA,MAClD;AACA,cAAQ,OAAO,OAAO,IAAI,QAAQ;AAAA,IACtC,WACS,QAAQmO,UAAQ,QAAQ,KAAK,cAAc,KAAK,OAAO,CAAC,GAAG;AAChE,WAAK,YAAY,uBAAuB,MAAM;AAAA,IAClD;AACA,WAAO,OAAO,WAAW,KAAK;AAAA,EAClC;AAAA,EACA,OAAO,QAAQ;AACX,QAAI,QAAQ,KAAK,OAAO,UAAS,GAAI,KAAK,OAAO,CAAC;AAClD,QAAI,KAAK,QAAQ;AACb,cAAQ,SAAS,OAAO,KAAK,OAAO,CAAC;AAAA,IACzC;AACA,WAAO;AAAA,EACX;AACJ;ACrCO,MAAM,oBAAoB,kBAAkB;AAAA,EAC/C,YAAY,WAAW;AACnB,UAAM,UAAU,SAAS;AAAA,EAC7B;AAAA,EACA,eAAe;AACX,WAAO;AAAA,EACX;AAAA,EACA,OAAO,QAAQ,QAAQ;AACnB,WAAO,MAAM,OAAO,QAAQ,YAAY,MAAM,YAAY,QAAQ,QAAQ,CAAC,CAAC;AAAA,EAChF;AAAA,EACA,OAAO,QAAQ;AACX,WAAO,aAAa,MAAM,OAAO,MAAM,CAAC;AAAA,EAC5C;AACJ;ACZO,MAAM,mBAAmB,MAAM;AAAA,EAClC;AAAA,EACA,YAAY,QAAQ,WAAW;AAC3B,QAAI,UAAU;AACd,UAAMD,SAAQ,CAAA;AACd,WAAO,QAAQ,CAAC,UAAU;AACtB,UAAI,MAAM,SAAS;AACf,kBAAU;AAAA,MACd;AACA,MAAAA,OAAM,KAAK,MAAM,IAAI;AAAA,IACzB,CAAC;AACD,UAAMpO,QAAQ,WAAWoO,OAAM,KAAK,GAAG,IAAI;AAC3C,UAAM,SAASpO,OAAM,WAAW,OAAO;AACvC,qBAAiB,MAAM,EAAE,QAAQ,OAAO,OAAO,OAAO,MAAK,CAAE,GAAG;AAAA,EACpE;AAAA,EACA,eAAe;AACX,UAAM,SAAS,CAAA;AACf,SAAK,OAAO,QAAQ,CAAC,UAAU;AAC3B,aAAO,KAAK,MAAM,cAAc;AAAA,IACpC,CAAC;AAED,UAAM,cAAc,KAAK,OAAO,OAAO,CAAC,OAAO,UAAU;AACrD,YAAME,QAAO,MAAM;AACnB,UAAIA,OAAM;AACN,YAAI,CAAC,MAAMA,KAAI,GAAG;AACd,gBAAMA,KAAI,IAAI;AAAA,QAClB;AACA,cAAMA,KAAI;AAAA,MACd;AACA,aAAO;AAAA,IACX,GAAG,CAAA,CAAE;AAEL,SAAK,OAAO,QAAQ,CAAC,OAAO,UAAU;AAClC,UAAIA,QAAO,MAAM;AACjB,UAAI,CAACA,SAAQ,YAAYA,KAAI,MAAM,GAAG;AAClC;AAAA,MACJ;AACA,UAAIA,UAAS,UAAU;AACnB,QAAAA,QAAO;AAAA,MACX;AACA,UAAI,OAAOA,KAAI,KAAK,MAAM;AACtB;AAAA,MACJ;AACA,aAAOA,KAAI,IAAI,OAAO,KAAK;AAAA,IAC/B,CAAC;AACD,WAAO,OAAO,OAAO,MAAM;AAAA,EAC/B;AAAA,EACA,OAAO,QAAQ,QAAQ;AACnB,UAAM,QAAQ,MAAM,YAAY,QAAQ,OAAO;AAC/C,WAAO,KAAK,QAAQ,KAAK,QAAQ,KAAK;AAAA,EAC1C;AAAA,EACA,OAAO,QAAQ;AACX,WAAO,OAAO,QAAQ,KAAK,MAAM;AAAA,EACrC;AACJ;AC3DA,SAAS,aAAa,MAAM,aAAa;AACrC,SAAO;AAAA,IACH,SAAS,WAAW,IAAI;AAAA,IACxB,aAAa,YAAY,IAAI,CAAC,YAAY,UAAU;AAChD,qBAAe,YAAY,YAAY,EAAE,GAAG,gBAAgB,eAAe,KAAK,KAAK,UAAU;AAC/F,aAAO,WAAW,YAAW;AAAA,IACjC,CAAC;AAAA,EACT;AACA;AAIO,SAAS,cAAc,OAAO;AACjC,MAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,WAAO,MAAM,IAAI,CAAC,KAAK,UAAU;AAC7B,UAAI,MAAM,QAAQ,GAAG,GAAG;AACpB,uBAAe,IAAI,WAAW,GAAG,oBAAoB,SAAS,KAAK,KAAK,GAAG;AAC3E,eAAO,aAAa,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AAAA,MACtC;AACA,qBAAe,OAAO,QAAQ,OAAQ,QAAS,UAAU,4BAA4B,SAAS,KAAK;AACnG,aAAO,aAAa,IAAI,SAAS,IAAI,WAAW;AAAA,IACpD,CAAC;AAAA,EACL;AACA,iBAAe,SAAS,QAAQ,OAAQ,UAAW,UAAU,uBAAuB,SAAS,KAAK;AAClG,QAAM,SAAS,OAAO,KAAK,KAAK,EAAE,IAAI,CAAC,SAAS;AAC5C,UAAM,cAAc,MAAM,IAAI,EAAE,OAAO,CAAC,OAAO,eAAe;AAC1D,YAAM,UAAU,IAAI;AACpB,aAAO;AAAA,IACX,GAAG,CAAA,CAAE;AACL,WAAO,aAAa,MAAM,OAAO,KAAK,WAAW,EAAE,MAAM;AAAA,EAC7D,CAAC;AACD,SAAO,KAAK,CAAC,GAAGR,OAAO,EAAE,QAAQ,cAAcA,GAAE,OAAO,CAAE;AAC1D,SAAO;AACX;ACtBO,SAAS,GAAG,OAAO;AACtB,SAAO,UAAU,YAAY,KAAK,CAAC;AACvC;ACAA,SAAS,OAAO,OAAO;AACnB,QAAM,SAAS,oBAAI,IAAG;AACtB,QAAM,QAAQ,CAAC,MAAM,OAAO,IAAI,CAAC,CAAC;AAClC,SAAO,OAAO,OAAO,MAAM;AAC/B;AACA,MAAM,iBAAiB;AACvB,MAAM,gBAAgB,OAAO,eAAe,MAAM,GAAG,CAAC;AAEtD,MAAM,WAAW;AACjB,MAAM,UAAU,OAAO,SAAS,MAAM,GAAG,CAAC;AAC1C,MAAM,WAAW;AACjB,MAAM,UAAU,OAAO,SAAS,MAAM,GAAG,CAAC;AAC1C,MAAM,eAAe;AACrB,MAAM,cAAc,OAAO,aAAa,MAAM,GAAG,CAAC;AAClD,MAAM,WAAW;AAEjB,MAAM,YAAY,CAAC,UAAU,cAAc,UAAU,QAAQ,EAAE,KAAK,GAAG;AACvE,MAAM,WAAW,OAAO,UAAU,MAAM,GAAG,CAAC;AAE5C,MAAM,eAAe;AAAA,EACjB,KAAK;AAAA,EAAc,KAAK;AAAA,EACxB,KAAK;AAAA,EAAgB,KAAK;AAAA,EAC1B,KAAK;AAAA,EAAS,KAAK;AACvB;AAEA,MAAM,wBAAwB,IAAI,OAAO,SAAS;AAClD,MAAM,oBAAoB,IAAI,OAAO,WAAW;AAChD,MAAM,gBAAgB,IAAI,OAAO,6BAA6B;AAE9D,MAAM,UAAU,IAAI,OAAO,8BAA8B;AACzD,MAAM,YAAY,IAAI,OAAO,qDAAqD;AAClF,MAAM,YAAY;AAAA,EACd;AAAA,EACA;AAAA,EACA,IAAI,SAAS;AAAE,WAAO,KAAK;AAAA,EAAS;AAAA,EACpC,IAAI,SAAS;AAAE,WAAO,KAAK,QAAQ,SAAS,KAAK;AAAA,EAAS;AAAA,EAC1D,YAAY,QAAQ;AAChB,SAAK,UAAU;AACf,SAAK,UAAU,OAAO,MAAK;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAE,WAAO,IAAI,YAAY,KAAK,OAAO;AAAA,EAAG;AAAA,EAChD,QAAQ;AAAE,SAAK,UAAU;AAAA,EAAG;AAAA,EAC5B,gBAAgB,OAAO,GAAG,KAAK,GAAG;AAC9B,WAAO,IAAI,YAAY,KAAK,QAAQ,MAAM,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM;AAC3D,aAAO,OAAO,OAAO,OAAO,OAAO,CAAA,GAAI,GAAG;AAAA,QACtC,OAAQ,EAAE,QAAQ;AAAA,QAClB,UAAW,EAAE,WAAW;AAAA,QACxB,UAAW,EAAE,WAAW;AAAA,MACxC,CAAa,CAAC;AAAA,IACN,CAAC,CAAC;AAAA,EACN;AAAA;AAAA,EAEA,WAAW,SAAS;AAChB,UAAM,MAAM,KAAK,KAAI;AACrB,QAAI,IAAI,SAAS,aAAa,CAAC,QAAQ,IAAI,IAAI,IAAI,GAAG;AAClD,YAAM,IAAI,MAAM,oBAAoB,IAAI,IAAI,EAAE;AAAA,IAClD;AACA,WAAO,KAAK,IAAG,EAAG;AAAA,EACtB;AAAA;AAAA,EAEA,QAAQM,OAAM;AACV,QAAI,KAAK,OAAO,SAASA,OAAM;AAC3B,YAAM,MAAM,KAAK,KAAI;AACrB,YAAM,IAAI,MAAM,YAAYA,KAAI,SAAS,IAAI,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,EAAE;AAAA,IACnF;AACA,WAAO,KAAK,IAAG,EAAG;AAAA,EACtB;AAAA;AAAA,EAEA,WAAW;AACP,UAAM,MAAM,KAAK,KAAI;AACrB,QAAI,IAAI,SAAS,cAAc;AAC3B,YAAM,IAAI,MAAM,WAAW;AAAA,IAC/B;AACA,UAAM,SAAS,KAAK,gBAAgB,KAAK,UAAU,GAAG,IAAI,QAAQ,CAAC;AACnE,SAAK,UAAU,IAAI,QAAQ;AAC3B,WAAO;AAAA,EACX;AAAA;AAAA,EAEA,YAAY;AACR,UAAM,MAAM,KAAK,KAAI;AACrB,QAAI,IAAI,SAAS,cAAc;AAC3B,YAAM,IAAI,MAAM,WAAW;AAAA,IAC/B;AACA,UAAM,SAAS,CAAA;AACf,WAAO,KAAK,UAAU,IAAI,QAAQ,GAAG;AACjC,YAAM,OAAO,KAAK,KAAI,EAAG;AACzB,aAAO,KAAK,KAAK,gBAAgB,KAAK,UAAU,GAAG,IAAI,CAAC;AACxD,WAAK,UAAU;AAAA,IACnB;AACA,SAAK,UAAU,IAAI,QAAQ;AAC3B,WAAO;AAAA,EACX;AAAA;AAAA,EAEA,OAAO;AACH,QAAI,KAAK,WAAW,KAAK,QAAQ,QAAQ;AACrC,YAAM,IAAI,MAAM,eAAe;AAAA,IACnC;AACA,WAAO,KAAK,QAAQ,KAAK,OAAO;AAAA,EACpC;AAAA;AAAA,EAEA,YAAY,SAAS;AACjB,UAAM,MAAM,KAAK,SAAS,SAAS;AACnC,WAAQ,OAAO,QAAQ,QAAQ,IAAI,GAAG,IAAK,MAAM;AAAA,EACrD;AAAA;AAAA,EAEA,SAASA,OAAM;AACX,QAAI,KAAK,WAAW,GAAG;AACnB,aAAO;AAAA,IACX;AACA,UAAM,MAAM,KAAK,KAAI;AACrB,WAAQ,IAAI,SAASA,QAAQ,IAAI,OAAO;AAAA,EAC5C;AAAA;AAAA,EAEA,MAAM;AACF,UAAM,SAAS,KAAK,KAAI;AACxB,SAAK;AACL,WAAO;AAAA,EACX;AAAA,EACA,WAAW;AACP,UAAM,SAAS,CAAA;AACf,aAAS,IAAI,KAAK,SAAS,IAAI,KAAK,QAAQ,QAAQ,KAAK;AACrD,YAAM,QAAQ,KAAK,QAAQ,CAAC;AAC5B,aAAO,KAAK,GAAG,MAAM,IAAI,IAAI,MAAM,IAAI,EAAE;AAAA,IAC7C;AACA,WAAO,gBAAgB,OAAO,KAAK,GAAG,CAAC;AAAA,EAC3C;AACJ;AACA,SAAS,IAAI,MAAM;AACf,QAAM,SAAS,CAAA;AACf,QAAM6O,cAAa,CAAC,YAAY;AAC5B,UAAM,QAAS,SAAS,KAAK,SAAU,KAAK,UAAU,KAAK,MAAM,CAAC,IAAI;AACtE,UAAM,IAAI,MAAM,iBAAiB,KAAK,OAAO,MAAM,KAAK,OAAO,EAAE;AAAA,EACrE;AACA,MAAI,WAAW,CAAA;AACf,MAAI,SAAS,CAAA;AACb,MAAI,SAAS;AACb,SAAO,SAAS,KAAK,QAAQ;AAEzB,QAAI,MAAM,KAAK,UAAU,MAAM;AAC/B,QAAI,QAAQ,IAAI,MAAM,qBAAqB;AAC3C,QAAI,OAAO;AACP,gBAAU,MAAM,CAAC,EAAE;AACnB,YAAM,KAAK,UAAU,MAAM;AAAA,IAC/B;AACA,UAAM,QAAQ,EAAE,OAAO,SAAS,QAAQ,UAAU,IAAI,UAAU,IAAI,OAAO,IAAI,MAAM,IAAI,MAAM,IAAI,QAAQ,OAAO,GAAE;AACpH,WAAO,KAAK,KAAK;AACjB,QAAI7O,QAAQ,aAAa,IAAI,CAAC,CAAC,KAAK;AACpC,QAAIA,OAAM;AACN,YAAM,OAAOA;AACb,YAAM,OAAO,IAAI,CAAC;AAClB;AACA,UAAIA,UAAS,cAAc;AACvB,iBAAS,KAAK,OAAO,SAAS,CAAC;AAC/B,eAAO,KAAK,OAAO,SAAS,CAAC;AAAA,MACjC,WACSA,SAAQ,eAAe;AAC5B,YAAI,SAAS,WAAW,GAAG;AACvB,UAAA6O,YAAW,0BAA0B;AAAA,QACzC;AACA,cAAM,QAAQ,SAAS,IAAG;AAC1B,QAAC,OAAO,MAAM,KAAK,EAAG,QAAQ,OAAO,SAAS;AAC9C,cAAM;AACN,cAAM,WAAW,OAAO,IAAG;AAC3B,QAAC,OAAO,MAAM,QAAQ,EAAG,WAAW,OAAO,SAAS;AAAA,MACxD,WACS7O,UAAS,SAAS;AACvB,cAAM,WAAW,OAAO,IAAG;AAC3B,QAAC,OAAO,MAAM,QAAQ,EAAG,WAAW,OAAO,SAAS;AACpD,eAAO,KAAK,OAAO,SAAS,CAAC;AAAA,MACjC,WACSA,UAAS,gBAAgB;AAC9B,cAAM,OAAO;AAAA,MACjB,WACSA,UAAS,iBAAiB;AAE/B,YAAI,SAAS,OAAO,IAAG,EAAG;AAC1B,YAAI,OAAO,SAAS,KAAK,OAAO,OAAO,SAAS,CAAC,EAAE,SAAS,UAAU;AAClE,gBAAM,QAAQ,OAAO,IAAG,EAAG;AAC3B,mBAAS,QAAQ;AACjB,UAAC,OAAO,OAAO,SAAS,CAAC,EAAG,QAAQ,UAAU,KAAK;AAAA,QACvD;AACA,YAAI,OAAO,WAAW,KAAK,OAAO,OAAO,SAAS,CAAC,EAAE,SAAS,WAAW;AACrE,gBAAM,IAAI,MAAM,yBAAyB;AAAA,QAC7C;AACA,QAAC,OAAO,OAAO,SAAS,CAAC,EAAG,QAAQ;AAAA,MACxC;AACA;AAAA,IACJ;AACA,YAAQ,IAAI,MAAM,aAAa;AAC/B,QAAI,OAAO;AACP,YAAM,OAAO,MAAM,CAAC;AACpB,gBAAU,MAAM,KAAK;AACrB,UAAI,SAAS,IAAI,MAAM,IAAI,GAAG;AAC1B,cAAM,OAAO;AACb;AAAA,MACJ;AACA,UAAI,MAAM,KAAK,MAAM,SAAS,GAAG;AAC7B,cAAM,OAAO;AACb;AAAA,MACJ;AACA,YAAM,OAAO;AACb;AAAA,IACJ;AACA,YAAQ,IAAI,MAAM,iBAAiB;AACnC,QAAI,OAAO;AACP,YAAM,OAAO,MAAM,CAAC;AACpB,YAAM,OAAO;AACb,gBAAU,MAAM,KAAK;AACrB;AAAA,IACJ;AACA,UAAM,IAAI,MAAM,oBAAoB,KAAK,UAAU,IAAI,CAAC,CAAC,CAAC,gBAAgB,MAAM,EAAE;AAAA,EACtF;AACA,SAAO,IAAI,YAAY,OAAO,IAAI,CAAC,MAAM,OAAO,OAAO,CAAC,CAAC,CAAC;AAC9D;AAEA,SAAS,YAAY,KAAK,SAAS;AAC/B,MAAI,WAAW,CAAA;AACf,aAAW,OAAO,QAAQ,QAAQ;AAC9B,QAAI,IAAI,IAAI,GAAG,GAAG;AACd,eAAS,KAAK,GAAG;AAAA,IACrB;AAAA,EACJ;AACA,MAAI,SAAS,SAAS,GAAG;AACrB,UAAM,IAAI,MAAM,sBAAsB,SAAS,KAAK,IAAI,CAAC,EAAE;AAAA,EAC/D;AACJ;AAGA,SAAS,YAAYA,OAAM,QAAQ;AAC/B,MAAI,OAAO,YAAY,OAAO,GAAG;AAC7B,UAAM,UAAU,OAAO,IAAG,EAAG;AAC7B,QAAI,YAAYA,OAAM;AAClB,YAAM,IAAI,MAAM,YAAYA,KAAI,SAAS,OAAO,EAAE;AAAA,IACtD;AAAA,EACJ;AACA,SAAO,OAAO,QAAQ,IAAI;AAC9B;AAEA,SAAS,gBAAgB,QAAQ,SAAS;AACtC,QAAM8O,YAAW,oBAAI,IAAG;AACxB,SAAO,MAAM;AACT,UAAM,UAAU,OAAO,SAAS,SAAS;AACzC,QAAI,WAAW,QAAS,WAAW,CAAC,QAAQ,IAAI,OAAO,GAAI;AACvD;AAAA,IACJ;AACA,WAAO,IAAG;AACV,QAAIA,UAAS,IAAI,OAAO,GAAG;AACvB,YAAM,IAAI,MAAM,uBAAuB,KAAK,UAAU,OAAO,CAAC,EAAE;AAAA,IACpE;AACA,IAAAA,UAAS,IAAI,OAAO;AAAA,EACxB;AACA,SAAO,OAAO,OAAOA,SAAQ;AACjC;AAEA,SAAS,kBAAkB,QAAQ;AAC/B,MAAI,YAAY,gBAAgB,QAAQ,OAAO;AAE/C,cAAY,WAAW,OAAO,8BAA8B,MAAM,GAAG,CAAC,CAAC;AACvE,cAAY,WAAW,OAAO,+BAA+B,MAAM,GAAG,CAAC,CAAC;AAExE,MAAI,UAAU,IAAI,MAAM,GAAG;AACvB,WAAO;AAAA,EACX;AACA,MAAI,UAAU,IAAI,MAAM,GAAG;AACvB,WAAO;AAAA,EACX;AACA,MAAI,UAAU,IAAI,SAAS,GAAG;AAC1B,WAAO;AAAA,EACX;AACA,MAAI,UAAU,IAAI,YAAY,GAAG;AAC7B,WAAO;AAAA,EACX;AAEA,MAAI,UAAU,IAAI,UAAU,GAAG;AAC3B,WAAO;AAAA,EACX;AACA,SAAO;AACX;AAEA,SAAS,cAAc,QAAQ,cAAc;AACzC,SAAO,OAAO,UAAS,EAAG,IAAI,CAAC,MAAM,UAAU,KAAK,GAAG,YAAY,CAAC;AACxE;AAEA,SAAS,WAAW,QAAQ;AACxB,MAAI,OAAO,SAAS,IAAI,GAAG;AACvB,WAAO,IAAG;AACV,QAAI,OAAO,SAAS,QAAQ,GAAG;AAC3B,aAAO,UAAU,OAAO,IAAG,EAAG,IAAI;AAAA,IACtC;AACA,UAAM,IAAI,MAAM,aAAa;AAAA,EACjC;AACA,SAAO;AACX;AACA,SAAS,WAAW,QAAQ;AACxB,MAAI,OAAO,QAAQ;AACf,UAAM,IAAI,MAAM,+BAA+B,OAAO,MAAM,KAAK,OAAO,SAAQ,CAAE,EAAE;AAAA,EACxF;AACJ;AACA,MAAM,iBAAiB,IAAI,OAAO,oBAAoB;AACtD,SAAS,gBAAgB9O,OAAM;AAC3B,QAAM,QAAQA,MAAK,MAAM,SAAS;AAClC,iBAAe,OAAO,gBAAgB,QAAQA,KAAI;AAClD,MAAIA,UAAS,QAAQ;AACjB,WAAO;AAAA,EACX;AACA,MAAIA,UAAS,OAAO;AAChB,WAAO;AAAA,EACX;AACA,MAAI,MAAM,CAAC,GAAG;AAEV,UAAM,SAAS,SAAS,MAAM,CAAC,CAAC;AAChC,mBAAe,WAAW,KAAK,UAAU,IAAI,wBAAwB,QAAQA,KAAI;AAAA,EACrF,WACS,MAAM,CAAC,GAAG;AAEf,UAAM,OAAO,SAAS,MAAM,CAAC,CAAC;AAC9B,mBAAe,SAAS,KAAK,QAAQ,OAAQ,OAAO,MAAO,GAAG,yBAAyB,QAAQA,KAAI;AAAA,EACvG;AACA,SAAOA;AACX;AAEA,MAAM,SAAS,CAAA;AACf,MAAMmO,aAAW,OAAO,IAAI,kBAAkB;AAC9C,MAAM,oBAAoB;AAC1B,MAAM,wBAAwB;AAC9B,MAAM,wBAAwB;AAC9B,MAAM,8BAA8B;AACpC,MAAM,2BAA2B;AACjC,MAAM,2BAA2B;AACjC,MAAM,yBAAyB;AAIxB,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA,EAInB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA;AAAA;AAAA;AAAA,EAIA,YAAY,OAAOjO,OAAMF,OAAM,UAAU,SAAS,YAAY,aAAa,eAAe;AACtF,kBAAc,OAAO,QAAQ,WAAW;AACxC,WAAO,eAAe,MAAMmO,YAAU,EAAE,OAAO,mBAAmB;AAClE,QAAI,YAAY;AACZ,mBAAa,OAAO,OAAO,WAAW,MAAK,CAAE;AAAA,IACjD;AACA,QAAI,aAAa,SAAS;AACtB,UAAI,eAAe,QAAQ,iBAAiB,MAAM;AAC9C,cAAM,IAAI,MAAM,EAAE;AAAA,MACtB;AAAA,IACJ,WACS,eAAe,QAAQ,iBAAiB,MAAM;AACnD,YAAM,IAAI,MAAM,EAAE;AAAA,IACtB;AACA,QAAI,aAAa,SAAS;AACtB,UAAI,cAAc,MAAM;AACpB,cAAM,IAAI,MAAM,EAAE;AAAA,MACtB;AAAA,IACJ,WACS,cAAc,MAAM;AACzB,YAAM,IAAI,MAAM,EAAE;AAAA,IACtB;AACA,qBAAiB,MAAM;AAAA,MACnB,MAAAjO;AAAA,MAAM,MAAAF;AAAA,MAAM;AAAA,MAAU;AAAA,MAAS;AAAA,MAAY;AAAA,MAAa;AAAA,IACpE,CAAS;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAO,QAAQ;AACX,QAAI,UAAU,MAAM;AAChB,eAAS;AAAA,IACb;AACA,QAAI,WAAW,QAAQ;AACnB,YAAME,QAAO,KAAK,QAAQ;AAC1B,UAAI,KAAK,WAAW;AAChB,cAAM6O,UAAS,KAAK,MAAM,KAAK,cAAc,OAAO,MAAM,CAAC;AAC3D,QAAAA,QAAO,OAAO7O;AACd,QAAA6O,QAAO,QAAQ,IAAK,KAAK,cAAc,IAAI,KAAK,OAAO,KAAK,WAAW,CAAC;AACxE,eAAO,KAAK,UAAUA,OAAM;AAAA,MAChC;AACA,YAAMA,UAAS;AAAA,QACX,MAAQ,KAAK,aAAa,UAAW,UAAU,KAAK;AAAA,QACpD,MAAA7O;AAAA,MAChB;AACY,UAAI,OAAQ,KAAK,YAAa,WAAW;AACrC,QAAA6O,QAAO,UAAU,KAAK;AAAA,MAC1B;AACA,UAAI,KAAK,WAAW;AAChB,QAAAA,QAAO,aAAa,KAAK,WAAW,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,OAAO,MAAM,CAAC,CAAC;AAAA,MAC/E;AACA,aAAO,KAAK,UAAUA,OAAM;AAAA,IAChC;AACA,QAAI,SAAS;AAEb,QAAI,KAAK,WAAW;AAChB,gBAAU,KAAK,cAAc,OAAO,MAAM;AAC1C,gBAAU,IAAK,KAAK,cAAc,IAAI,KAAK,OAAO,KAAK,WAAW,CAAC;AAAA,IACvE,OACK;AACD,UAAI,KAAK,WAAW;AAChB,kBAAU,MAAM,KAAK,WAAW,IAAI,CAAC,SAAS,KAAK,OAAO,MAAM,CAAC,EAAE,KAAM,WAAW,SAAU,OAAO,GAAG,IAAI;AAAA,MAChH,OACK;AACD,kBAAU,KAAK;AAAA,MACnB;AAAA,IACJ;AACA,QAAI,WAAW,WAAW;AACtB,UAAI,KAAK,YAAY,MAAM;AACvB,kBAAU;AAAA,MACd;AACA,UAAI,WAAW,UAAU,KAAK,MAAM;AAChC,kBAAU,MAAM,KAAK;AAAA,MACzB;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU;AACN,WAAQ,KAAK,aAAa;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU;AACN,WAAQ,KAAK,aAAa;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc;AACV,WAAQ,KAAK,WAAW;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,OAAOC,UAAS;AACjB,QAAI,KAAK,WAAW;AAChB,UAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACvB,cAAM,IAAI,MAAM,qBAAqB;AAAA,MACzC;AACA,UAAI,KAAK,gBAAgB,MAAM,MAAM,WAAW,KAAK,aAAa;AAC9D,cAAM,IAAI,MAAM,uBAAuB;AAAA,MAC3C;AACA,YAAM,QAAQ;AACd,aAAO,MAAM,IAAI,CAAC,MAAO,MAAM,cAAc,KAAK,GAAGA,QAAO,CAAE;AAAA,IAClE;AACA,QAAI,KAAK,WAAW;AAChB,UAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACvB,cAAM,IAAI,MAAM,qBAAqB;AAAA,MACzC;AACA,UAAI,MAAM,WAAW,KAAK,WAAW,QAAQ;AACzC,cAAM,IAAI,MAAM,uBAAuB;AAAA,MAC3C;AACA,YAAM,QAAQ;AACd,aAAO,MAAM,IAAI,CAAC,GAAG,MAAO,MAAM,WAAW,CAAC,EAAE,KAAK,GAAGA,QAAO,CAAE;AAAA,IACrE;AACA,WAAOA,SAAQ,KAAK,MAAM,KAAK;AAAA,EACnC;AAAA,EACA,WAAW,UAAU,OAAOA,UAAS,UAAU;AAC3C,QAAI,KAAK,WAAW;AAChB,UAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACvB,cAAM,IAAI,MAAM,qBAAqB;AAAA,MACzC;AACA,UAAI,KAAK,gBAAgB,MAAM,MAAM,WAAW,KAAK,aAAa;AAC9D,cAAM,IAAI,MAAM,uBAAuB;AAAA,MAC3C;AACA,YAAM,YAAY,KAAK;AACvB,YAAMD,UAAS,MAAM,MAAK;AAC1B,MAAAA,QAAO,QAAQ,CAACE,QAAO,UAAU;AAC7B,kBAAU,WAAW,UAAUA,QAAOD,UAAS,CAACC,WAAU;AACtD,UAAAF,QAAO,KAAK,IAAIE;AAAA,QACpB,CAAC;AAAA,MACL,CAAC;AACD,eAASF,OAAM;AACf;AAAA,IACJ;AACA,QAAI,KAAK,WAAW;AAChB,YAAM,aAAa,KAAK;AAExB,UAAIA;AACJ,UAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,QAAAA,UAAS,MAAM,MAAK;AAAA,MACxB,OACK;AACD,YAAI,SAAS,QAAQ,OAAQ,UAAW,UAAU;AAC9C,gBAAM,IAAI,MAAM,qBAAqB;AAAA,QACzC;AACA,QAAAA,UAAS,WAAW,IAAI,CAAC,UAAU;AAC/B,cAAI,CAAC,MAAM,MAAM;AACb,kBAAM,IAAI,MAAM,iDAAiD;AAAA,UACrE;AACA,cAAI,EAAE,MAAM,QAAQ,QAAQ;AACxB,kBAAM,IAAI,MAAM,+BAA+B,MAAM,IAAI,EAAE;AAAA,UAC/D;AACA,iBAAO,MAAM,MAAM,IAAI;AAAA,QAC3B,CAAC;AAAA,MACL;AACA,UAAIA,QAAO,WAAW,KAAK,WAAW,QAAQ;AAC1C,cAAM,IAAI,MAAM,uBAAuB;AAAA,MAC3C;AACA,MAAAA,QAAO,QAAQ,CAACE,QAAO,UAAU;AAC7B,mBAAW,KAAK,EAAE,WAAW,UAAUA,QAAOD,UAAS,CAACC,WAAU;AAC9D,UAAAF,QAAO,KAAK,IAAIE;AAAA,QACpB,CAAC;AAAA,MACL,CAAC;AACD,eAASF,OAAM;AACf;AAAA,IACJ;AACA,UAAM,SAASC,SAAQ,KAAK,MAAM,KAAK;AACvC,QAAI,OAAO,MAAM;AACb,eAAS,KAAM,iBAAkB;AAAE,iBAAS,MAAM,MAAM;AAAA,MAAG,GAAI;AAAA,IACnE,OACK;AACD,eAAS,MAAM;AAAA,IACnB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,UAAU,OAAOA,UAAS;AAC5B,UAAM,WAAW,CAAA;AACjB,UAAM,SAAS,CAAC,KAAK;AACrB,SAAK,WAAW,UAAU,OAAOA,UAAS,CAACC,WAAU;AACjD,aAAO,CAAC,IAAIA;AAAA,IAChB,CAAC;AACD,QAAI,SAAS,QAAQ;AACjB,YAAM,QAAQ,IAAI,QAAQ;AAAA,IAC9B;AACA,WAAO,OAAO,CAAC;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,KAAK,KAAK,cAAc;AAC3B,QAAI,UAAU,YAAY,GAAG,GAAG;AAC5B,aAAO;AAAA,IACX;AACA,QAAI,OAAQ,QAAS,UAAU;AAC3B,UAAI;AACA,eAAO,UAAU,KAAK,IAAI,GAAG,GAAG,YAAY;AAAA,MAChD,SACO,OAAO;AACV,uBAAe,OAAO,sBAAsB,OAAO,GAAG;AAAA,MAC1D;AAAA,IACJ,WACS,eAAe,aAAa;AACjC,UAAIjP,QAAO,IAAI,WAAW;AAC1B,UAAI,QAAQ;AACZ,UAAI,gBAAgB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,OAAO,KAAK,IAAI,SAAS,YAAY,GAAG;AAEpF,mBAAW;AACX,gBAAQ,IAAI,UAAS,EAAG,IAAI,CAAC,MAAM,UAAU,KAAK,CAAC,CAAC;AACpD,QAAAA,QAAO,SAAS,MAAM,IAAI,CAAC,MAAM,EAAE,OAAM,CAAE,EAAE,KAAK,GAAG,CAAC;AAAA,MAC1D,OACK;AAED,QAAAA,QAAO,gBAAgB,IAAI,QAAQ,MAAM,CAAC;AAC1C,mBAAWA;AAAA,MACf;AAEA,UAAI,gBAAgB;AACpB,UAAI,cAAc;AAClB,aAAO,IAAI,UAAU,IAAI,SAAS,SAAS,GAAG;AAC1C,cAAM,UAAU,IAAI;AACpB,wBAAgB,IAAI,UAAU,QAAQ,IAAIA,OAAM,UAAU,MAAM,OAAO,aAAa,aAAa;AACjG,sBAAc,QAAQ;AACtB,QAAAA,SAAQ,QAAQ;AAChB,mBAAW;AACX,gBAAQ;AAAA,MACZ;AACA,UAAIkP,WAAU;AACd,YAAMJ,YAAW,gBAAgB,KAAK,WAAW;AACjD,UAAIA,UAAS,IAAI,SAAS,GAAG;AACzB,YAAI,CAAC,cAAc;AACf,gBAAM,IAAI,MAAM,EAAE;AAAA,QACtB;AACA,QAAAI,WAAU;AAAA,MACd;AACA,YAAMhP,QAAQ,IAAI,SAAS,IAAI,IAAI,IAAI,IAAG,EAAG,OAAO;AACpD,UAAI,IAAI,QAAQ;AACZ,cAAM,IAAI,MAAM,iBAAiB;AAAA,MACrC;AACA,aAAO,IAAI,UAAU,QAAQA,OAAMF,OAAM,UAAUkP,UAAS,OAAO,aAAa,aAAa;AAAA,IACjG;AACA,UAAMhP,QAAO,IAAI;AACjB,mBAAe,CAACA,SAAS,OAAQA,UAAU,YAAYA,MAAK,MAAM,OAAO,GAAI,gBAAgB,YAAYA,KAAI;AAC7G,QAAI,UAAU,IAAI;AAClB,QAAI,WAAW,MAAM;AACjB,qBAAe,cAAc,+BAA+B,eAAe,IAAI,OAAO;AACtF,gBAAU,CAAC,CAAC;AAAA,IAChB;AACA,QAAIF,QAAO,IAAI;AACf,QAAI,aAAaA,MAAK,MAAM,cAAc;AAC1C,QAAI,YAAY;AACZ,YAAM,cAAc,SAAS,WAAW,CAAC,KAAK,IAAI;AAClD,YAAM,gBAAgB,UAAU,KAAK;AAAA,QACjC,MAAM,WAAW,CAAC;AAAA,QAClB,YAAY,IAAI;AAAA,MAChC,CAAa;AACD,aAAO,IAAI,UAAU,QAAQE,SAAQ,IAAIF,OAAM,SAAS,SAAS,MAAM,aAAa,aAAa;AAAA,IACrG;AACA,QAAIA,UAAS,WAAWA,MAAK;AAAA,MAAW;AAAA;AAAA,IAAQ,KAAkBA,MAAK;AAAA,MAAW;AAAA;AAAA,OAAmB;AACjG,YAAM,QAAS,IAAI,cAAc,OAAQ,IAAI,WAAW,IAAI,CAAC,MAAM,UAAU,KAAK,CAAC,CAAC,IAAI;AACxF,YAAM,QAAQ,IAAI,UAAU,QAAQE,SAAQ,IAAIF,OAAM,SAAS,SAAS,OAAO,MAAM,IAAI;AAEzF,aAAO;AAAA,IACX;AACA,IAAAA,QAAO,gBAAgB,IAAI,IAAI;AAC/B,WAAO,IAAI,UAAU,QAAQE,SAAQ,IAAIF,OAAMA,OAAM,SAAS,MAAM,MAAM,IAAI;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA,EAIA,OAAO,YAAY,OAAO;AACtB,WAAQ,SAAS,MAAMmO,UAAQ,MAAM;AAAA,EACzC;AACJ;AAIO,MAAM,SAAS;AAAA;AAAA;AAAA;AAAA,EAIlB;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA,YAAY,OAAOnO,OAAM,QAAQ;AAC7B,kBAAc,OAAO,QAAQ,UAAU;AACvC,aAAS,OAAO,OAAO,OAAO,MAAK,CAAE;AACrC,qBAAiB,MAAM,EAAE,MAAAA,OAAM,OAAM,CAAE;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,KAAK,KAAK;AACb,QAAI,OAAQ,QAAS,UAAU;AAE3B,UAAI;AACA,iBAAS,KAAK,KAAK,MAAM,GAAG,CAAC;AAAA,MACjC,SACO,GAAG;AAAA,MAAE;AAEZ,aAAO,SAAS,KAAK,IAAI,GAAG,CAAC;AAAA,IACjC;AACA,QAAI,eAAe,aAAa;AAE5B,YAAMA,QAAO,IAAI,YAAY,OAAO;AACpC,cAAQA,OAAI;AAAA,QACR,KAAK;AAAe,iBAAO,oBAAoB,KAAK,GAAG;AAAA,QACvD,KAAK;AAAS,iBAAO,cAAc,KAAK,GAAG;AAAA,QAC3C,KAAK;AAAS,iBAAO,cAAc,KAAK,GAAG;AAAA,QAC3C,KAAK;AAAA,QACL,KAAK;AACD,iBAAO,iBAAiB,KAAK,GAAG;AAAA,QACpC,KAAK;AAAY,iBAAO,iBAAiB,KAAK,GAAG;AAAA,QACjD,KAAK;AAAU,iBAAO,eAAe,KAAK,GAAG;AAAA,MAC7D;AAAA,IACQ,WACS,OAAQ,QAAS,UAAU;AAEhC,cAAQ,IAAI,MAAI;AAAA,QACZ,KAAK;AAAe,iBAAO,oBAAoB,KAAK,GAAG;AAAA,QACvD,KAAK;AAAS,iBAAO,cAAc,KAAK,GAAG;AAAA,QAC3C,KAAK;AAAS,iBAAO,cAAc,KAAK,GAAG;AAAA,QAC3C,KAAK;AAAA,QACL,KAAK;AACD,iBAAO,iBAAiB,KAAK,GAAG;AAAA,QACpC,KAAK;AAAY,iBAAO,iBAAiB,KAAK,GAAG;AAAA,QACjD,KAAK;AAAU,iBAAO,eAAe,KAAK,GAAG;AAAA,MAC7D;AACY,aAAO,OAAO,qBAAqB,IAAI,IAAI,IAAI,yBAAyB;AAAA,QACpE,WAAW;AAAA,MAC3B,CAAa;AAAA,IACL;AACA,mBAAe,OAAO,+BAA+B,OAAO,GAAG;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA,EAIA,OAAO,cAAc,OAAO;AACxB,WAAO,oBAAoB,WAAW,KAAK;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAIA,OAAO,QAAQ,OAAO;AAClB,WAAO,cAAc,WAAW,KAAK;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAIA,OAAO,QAAQ,OAAO;AAClB,WAAO,cAAc,WAAW,KAAK;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAIA,OAAO,WAAW,OAAO;AACrB,WAAO,iBAAiB,WAAW,KAAK;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAIA,OAAO,SAAS,OAAO;AACnB,WAAO,eAAe,WAAW,KAAK;AAAA,EAC1C;AACJ;AAKO,MAAM,sBAAsB,SAAS;AAAA;AAAA;AAAA;AAAA,EAIxC;AAAA;AAAA;AAAA;AAAA,EAIA,YAAY,OAAOA,OAAME,OAAM,QAAQ;AACnC,UAAM,OAAOF,OAAM,MAAM;AACzB,mBAAe,OAAQE,UAAU,YAAYA,MAAK,MAAM,OAAO,GAAG,sBAAsB,QAAQA,KAAI;AACpG,aAAS,OAAO,OAAO,OAAO,MAAK,CAAE;AACrC,qBAAiB,MAAM,EAAE,MAAAA,OAAM;AAAA,EACnC;AACJ;AACA,SAAS,WAAW,QAAQ,QAAQ;AAChC,SAAO,MAAM,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,MAAM,CAAC,EAAE,KAAM,WAAW,SAAU,OAAO,GAAG,IAAI;AAC9F;AAIO,MAAM,sBAAsB,cAAc;AAAA;AAAA;AAAA;AAAA,EAI7C,YAAY,OAAOA,OAAM,QAAQ;AAC7B,UAAM,OAAO,SAASA,OAAM,MAAM;AAClC,WAAO,eAAe,MAAMiO,YAAU,EAAE,OAAO,uBAAuB;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,WAAW;AACX,WAAO,GAAG,KAAK,OAAO,SAAS,CAAC,EAAE,UAAU,GAAG,EAAE;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAIA,OAAO,QAAQ;AACX,QAAI,UAAU,MAAM;AAChB,eAAS;AAAA,IACb;AACA,QAAI,WAAW,QAAQ;AACnB,aAAO,KAAK,UAAU;AAAA,QAClB,MAAM;AAAA,QACN,MAAM,KAAK;AAAA,QACX,QAAQ,KAAK,OAAO,IAAI,CAAC,UAAU,KAAK,MAAM,MAAM,OAAO,MAAM,CAAC,CAAC;AAAA,MACnF,CAAa;AAAA,IACL;AACA,UAAM,SAAS,CAAA;AACf,QAAI,WAAW,WAAW;AACtB,aAAO,KAAK,OAAO;AAAA,IACvB;AACA,WAAO,KAAK,KAAK,OAAO,WAAW,QAAQ,KAAK,MAAM,CAAC;AACvD,WAAO,OAAO,KAAK,GAAG;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAIA,OAAO,KAAK,KAAK;AACb,QAAI,cAAc,WAAW,GAAG,GAAG;AAC/B,aAAO;AAAA,IACX;AACA,QAAI,OAAQ,QAAS,UAAU;AAC3B,aAAO,cAAc,KAAK,IAAI,GAAG,CAAC;AAAA,IACtC,WACS,eAAe,aAAa;AACjC,YAAMjO,QAAO,YAAY,SAAS,GAAG;AACrC,YAAM,SAAS,cAAc,GAAG;AAChC,iBAAW,GAAG;AACd,aAAO,IAAI,cAAc,QAAQA,OAAM,MAAM;AAAA,IACjD;AACA,WAAO,IAAI,cAAc,QAAQ,IAAI,MAAM,IAAI,SAAS,IAAI,OAAO,IAAI,UAAU,IAAI,IAAI,CAAA,CAAE;AAAA,EAC/F;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,WAAW,OAAO;AACrB,WAAQ,SAAS,MAAMiO,UAAQ,MAAM;AAAA,EACzC;AACJ;AAIO,MAAM,sBAAsB,cAAc;AAAA;AAAA;AAAA;AAAA,EAI7C;AAAA;AAAA;AAAA;AAAA,EAIA,YAAY,OAAOjO,OAAM,QAAQ,WAAW;AACxC,UAAM,OAAO,SAASA,OAAM,MAAM;AAClC,WAAO,eAAe,MAAMiO,YAAU,EAAE,OAAO,uBAAuB;AACtE,qBAAiB,MAAM,EAAE,WAAW;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,YAAY;AACZ,WAAO,GAAG,KAAK,OAAO,SAAS,CAAC;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAIA,OAAO,QAAQ;AACX,QAAI,UAAU,MAAM;AAChB,eAAS;AAAA,IACb;AACA,QAAI,WAAW,QAAQ;AACnB,aAAO,KAAK,UAAU;AAAA,QAClB,MAAM;AAAA,QACN,WAAW,KAAK;AAAA,QAChB,MAAM,KAAK;AAAA,QACX,QAAQ,KAAK,OAAO,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,OAAO,MAAM,CAAC,CAAC;AAAA,MAC3E,CAAa;AAAA,IACL;AACA,UAAM,SAAS,CAAA;AACf,QAAI,WAAW,WAAW;AACtB,aAAO,KAAK,OAAO;AAAA,IACvB;AACA,WAAO,KAAK,KAAK,OAAO,WAAW,QAAQ,KAAK,MAAM,CAAC;AACvD,QAAI,WAAW,aAAa,KAAK,WAAW;AACxC,aAAO,KAAK,WAAW;AAAA,IAC3B;AACA,WAAO,OAAO,KAAK,GAAG;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAIA,OAAO,aAAajO,OAAM,QAAQ;AAC9B,cAAU,UAAU,CAAA,GAAI,IAAI,CAAC,MAAM,UAAU,KAAK,CAAC,CAAC;AACpD,UAAM,WAAW,IAAI,cAAc,QAAQA,OAAM,QAAQ,KAAK;AAC9D,WAAO,SAAS;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAIA,OAAO,KAAK,KAAK;AACb,QAAI,cAAc,WAAW,GAAG,GAAG;AAC/B,aAAO;AAAA,IACX;AACA,QAAI,OAAQ,QAAS,UAAU;AAC3B,UAAI;AACA,eAAO,cAAc,KAAK,IAAI,GAAG,CAAC;AAAA,MACtC,SACO,OAAO;AACV,uBAAe,OAAO,0BAA0B,OAAO,GAAG;AAAA,MAC9D;AAAA,IACJ,WACS,eAAe,aAAa;AACjC,YAAMA,QAAO,YAAY,SAAS,GAAG;AACrC,YAAM,SAAS,cAAc,KAAK,IAAI;AACtC,YAAM,YAAY,CAAC,CAAC,gBAAgB,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,WAAW;AAC/E,iBAAW,GAAG;AACd,aAAO,IAAI,cAAc,QAAQA,OAAM,QAAQ,SAAS;AAAA,IAC5D;AACA,WAAO,IAAI,cAAc,QAAQ,IAAI,MAAM,IAAI,SAAS,IAAI,OAAO,IAAI,CAAC,MAAM,UAAU,KAAK,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,SAAS;AAAA,EAChI;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,WAAW,OAAO;AACrB,WAAQ,SAAS,MAAMiO,UAAQ,MAAM;AAAA,EACzC;AACJ;AAIO,MAAM,4BAA4B,SAAS;AAAA;AAAA;AAAA;AAAA,EAI9C;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA,YAAY,OAAOnO,OAAM,QAAQ,SAAS,KAAK;AAC3C,UAAM,OAAOA,OAAM,MAAM;AACzB,WAAO,eAAe,MAAMmO,YAAU,EAAE,OAAO,6BAA6B;AAC5E,qBAAiB,MAAM,EAAE,SAAS,IAAG,CAAE;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAIA,OAAO,QAAQ;AACX,WAAO,UAAU,QAAQ,WAAW,WAAW,2CAA2C,yBAAyB,EAAE,WAAW,mBAAmB;AACnJ,QAAI,WAAW,QAAQ;AACnB,aAAO,KAAK,UAAU;AAAA,QAClB,MAAM;AAAA,QACN,iBAAkB,KAAK,UAAU,YAAY;AAAA,QAC7C,SAAS,KAAK;AAAA,QACd,KAAO,KAAK,OAAO,OAAQ,KAAK,MAAM;AAAA,QACtC,QAAQ,KAAK,OAAO,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,OAAO,MAAM,CAAC,CAAC;AAAA,MAC3E,CAAa;AAAA,IACL;AACA,UAAM,SAAS,CAAC,cAAc,WAAW,QAAQ,KAAK,MAAM,CAAC,EAAE;AAC/D,QAAI,KAAK,SAAS;AACd,aAAO,KAAK,SAAS;AAAA,IACzB;AACA,QAAI,KAAK,OAAO,MAAM;AAClB,aAAO,KAAK,IAAI,KAAK,IAAI,SAAQ,CAAE,EAAE;AAAA,IACzC;AACA,WAAO,OAAO,KAAK,GAAG;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAIA,OAAO,KAAK,KAAK;AACb,QAAI,oBAAoB,WAAW,GAAG,GAAG;AACrC,aAAO;AAAA,IACX;AACA,QAAI,OAAQ,QAAS,UAAU;AAC3B,UAAI;AACA,eAAO,oBAAoB,KAAK,IAAI,GAAG,CAAC;AAAA,MAC5C,SACO,OAAO;AACV,uBAAe,OAAO,+BAA+B,OAAO,GAAG;AAAA,MACnE;AAAA,IACJ,WACS,eAAe,aAAa;AACjC,sBAAgB,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;AAC5C,YAAM,SAAS,cAAc,GAAG;AAChC,YAAM,UAAU,CAAC,CAAC,gBAAgB,KAAK,aAAa,EAAE,IAAI,SAAS;AACnE,YAAM,MAAM,WAAW,GAAG;AAC1B,iBAAW,GAAG;AACd,aAAO,IAAI,oBAAoB,QAAQ,eAAe,QAAQ,SAAS,GAAG;AAAA,IAC9E;AACA,WAAO,IAAI,oBAAoB,QAAQ,eAAe,IAAI,SAAS,IAAI,OAAO,IAAI,UAAU,IAAI,IAAI,CAAA,GAAI,CAAC,CAAC,IAAI,SAAU,IAAI,OAAO,OAAQ,IAAI,MAAM,IAAI;AAAA,EAC7J;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,WAAW,OAAO;AACrB,WAAQ,SAAS,MAAMA,UAAQ,MAAM;AAAA,EACzC;AACJ;AAIO,MAAM,yBAAyB,SAAS;AAAA;AAAA;AAAA;AAAA,EAI3C;AAAA,EACA,YAAY,OAAO,QAAQ,SAAS;AAChC,UAAM,OAAO,YAAY,MAAM;AAC/B,WAAO,eAAe,MAAMA,YAAU,EAAE,OAAO,0BAA0B;AACzE,qBAAiB,MAAM,EAAE,SAAS;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAIA,OAAO,QAAQ;AACX,UAAMnO,QAAS,KAAK,OAAO,WAAW,IAAK,YAAY;AACvD,QAAI,WAAW,QAAQ;AACnB,YAAM,kBAAmB,KAAK,UAAU,YAAY;AACpD,aAAO,KAAK,UAAU,EAAE,MAAAA,OAAM,gBAAe,CAAE;AAAA,IACnD;AACA,WAAO,GAAGA,KAAI,KAAK,KAAK,UAAU,aAAa,EAAE;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAIA,OAAO,KAAK,KAAK;AACb,QAAI,iBAAiB,WAAW,GAAG,GAAG;AAClC,aAAO;AAAA,IACX;AACA,QAAI,OAAQ,QAAS,UAAU;AAC3B,UAAI;AACA,eAAO,iBAAiB,KAAK,IAAI,GAAG,CAAC;AAAA,MACzC,SACO,OAAO;AACV,uBAAe,OAAO,6BAA6B,OAAO,GAAG;AAAA,MACjE;AAAA,IACJ,WACS,eAAe,aAAa;AACjC,YAAM,WAAW,IAAI,SAAQ;AAC7B,YAAM,aAAa,IAAI,YAAY,OAAO,CAAC,YAAY,SAAS,CAAC,CAAC;AAClE,qBAAe,YAAY,oCAAoC,OAAO,QAAQ;AAC9E,YAAMA,QAAO,IAAI,WAAW,OAAO,CAAC,YAAY,SAAS,CAAC,CAAC;AAE3D,UAAIA,UAAS,WAAW;AACpB,cAAMmP,UAAS,cAAc,GAAG;AAChC,uBAAeA,QAAO,WAAW,GAAG,iCAAiC,cAAcA,OAAM;AACzF,wBAAgB,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;AACxC,mBAAW,GAAG;AACd,eAAO,IAAI,iBAAiB,QAAQ,CAAA,GAAI,IAAI;AAAA,MAChD;AAGA,UAAI,SAAS,cAAc,GAAG;AAC9B,UAAI,OAAO,QAAQ;AACf,uBAAe,OAAO,WAAW,KAAK,OAAO,CAAC,EAAE,SAAS,SAAS,2BAA2B,cAAc,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,SAAS,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,MAChK,OACK;AACD,iBAAS,CAAC,UAAU,KAAK,OAAO,CAAC;AAAA,MACrC;AACA,YAAM,aAAa,kBAAkB,GAAG;AACxC,qBAAe,eAAe,gBAAgB,eAAe,WAAW,gCAAgC,uBAAuB,UAAU;AACzI,UAAI,gBAAgB,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,SAAS,GAAG;AAC1D,cAAM,UAAU,cAAc,GAAG;AACjC,uBAAe,QAAQ,WAAW,KAAK,QAAQ,CAAC,EAAE,SAAS,SAAS,4BAA4B,eAAe,QAAQ,IAAI,CAAC,MAAM,EAAE,OAAO,SAAS,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,MACrK;AACA,iBAAW,GAAG;AACd,aAAO,IAAI,iBAAiB,QAAQ,QAAQ,eAAe,SAAS;AAAA,IACxE;AACA,QAAI,IAAI,SAAS,WAAW;AACxB,aAAO,IAAI,iBAAiB,QAAQ,CAAA,GAAI,IAAI;AAAA,IAChD;AACA,QAAI,IAAI,SAAS,YAAY;AACzB,YAAM,SAAS,CAAC,UAAU,KAAK,OAAO,CAAC;AACvC,YAAM,UAAW,IAAI,oBAAoB;AACzC,aAAO,IAAI,iBAAiB,QAAQ,QAAQ,OAAO;AAAA,IACvD;AACA,mBAAe,OAAO,gCAAgC,OAAO,GAAG;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,WAAW,OAAO;AACrB,WAAQ,SAAS,MAAMhB,UAAQ,MAAM;AAAA,EACzC;AACJ;AAIO,MAAM,yBAAyB,cAAc;AAAA;AAAA;AAAA;AAAA,EAIhD;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA,YAAY,OAAOjO,OAAM,iBAAiB,QAAQ,SAAS,KAAK;AAC5D,UAAM,OAAO,YAAYA,OAAM,MAAM;AACrC,WAAO,eAAe,MAAMiO,YAAU,EAAE,OAAO,0BAA0B;AACzE,cAAU,OAAO,OAAO,QAAQ,MAAK,CAAE;AACvC,UAAM,WAAY,oBAAoB,UAAU,oBAAoB;AACpE,UAAM,UAAW,oBAAoB;AACrC,qBAAiB,MAAM,EAAE,UAAU,KAAK,SAAS,SAAS,iBAAiB;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,WAAW;AACX,WAAO,GAAG,KAAK,OAAO,SAAS,CAAC,EAAE,UAAU,GAAG,EAAE;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAIA,OAAO,QAAQ;AACX,QAAI,UAAU,MAAM;AAChB,eAAS;AAAA,IACb;AACA,QAAI,WAAW,QAAQ;AACnB,aAAO,KAAK,UAAU;AAAA,QAClB,MAAM;AAAA,QACN,MAAM,KAAK;AAAA,QACX,UAAU,KAAK;AAAA,QACf,iBAAmB,KAAK,oBAAoB,eAAgB,KAAK,kBAAkB;AAAA,QACnF,SAAS,KAAK;AAAA,QACd,KAAO,KAAK,OAAO,OAAQ,KAAK,MAAM;AAAA,QACtC,QAAQ,KAAK,OAAO,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,OAAO,MAAM,CAAC,CAAC;AAAA,QAC3D,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,OAAO,MAAM,CAAC,CAAC;AAAA,MAC7E,CAAa;AAAA,IACL;AACA,UAAM,SAAS,CAAA;AACf,QAAI,WAAW,WAAW;AACtB,aAAO,KAAK,UAAU;AAAA,IAC1B;AACA,WAAO,KAAK,KAAK,OAAO,WAAW,QAAQ,KAAK,MAAM,CAAC;AACvD,QAAI,WAAW,WAAW;AACtB,UAAI,KAAK,oBAAoB,cAAc;AACvC,eAAO,KAAK,KAAK,eAAe;AAAA,MACpC;AACA,UAAI,KAAK,WAAW,KAAK,QAAQ,QAAQ;AACrC,eAAO,KAAK,SAAS;AACrB,eAAO,KAAK,WAAW,QAAQ,KAAK,OAAO,CAAC;AAAA,MAChD;AACA,UAAI,KAAK,OAAO,MAAM;AAClB,eAAO,KAAK,IAAI,KAAK,IAAI,SAAQ,CAAE,EAAE;AAAA,MACzC;AAAA,IACJ;AACA,WAAO,OAAO,KAAK,GAAG;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAIA,OAAO,YAAYjO,OAAM,QAAQ;AAC7B,cAAU,UAAU,CAAA,GAAI,IAAI,CAAC,MAAM,UAAU,KAAK,CAAC,CAAC;AACpD,UAAM,WAAW,IAAI,iBAAiB,QAAQA,OAAM,QAAQ,QAAQ,CAAA,GAAI,IAAI;AAC5E,WAAO,SAAS;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAIA,OAAO,KAAK,KAAK;AACb,QAAI,iBAAiB,WAAW,GAAG,GAAG;AAClC,aAAO;AAAA,IACX;AACA,QAAI,OAAQ,QAAS,UAAU;AAC3B,UAAI;AACA,eAAO,iBAAiB,KAAK,IAAI,GAAG,CAAC;AAAA,MACzC,SACO,OAAO;AACV,uBAAe,OAAO,6BAA6B,OAAO,GAAG;AAAA,MACjE;AAAA,IACJ,WACS,eAAe,aAAa;AACjC,YAAMA,QAAO,YAAY,YAAY,GAAG;AACxC,YAAM,SAAS,cAAc,GAAG;AAChC,YAAM,aAAa,kBAAkB,GAAG;AACxC,UAAI,UAAU,CAAA;AACd,UAAI,gBAAgB,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,SAAS,GAAG;AAC1D,kBAAU,cAAc,GAAG;AAAA,MAC/B;AACA,YAAM,MAAM,WAAW,GAAG;AAC1B,iBAAW,GAAG;AACd,aAAO,IAAI,iBAAiB,QAAQA,OAAM,YAAY,QAAQ,SAAS,GAAG;AAAA,IAC9E;AACA,QAAI,kBAAkB,IAAI;AAE1B,QAAI,mBAAmB,MAAM;AACzB,wBAAkB;AAClB,UAAI,OAAQ,IAAI,aAAc,WAAW;AACrC,0BAAkB;AAClB,YAAI,CAAC,IAAI,UAAU;AACf,4BAAkB;AAClB,cAAI,OAAQ,IAAI,YAAa,aAAa,CAAC,IAAI,SAAS;AACpD,8BAAkB;AAAA,UACtB;AAAA,QACJ;AAAA,MACJ,WACS,OAAQ,IAAI,YAAa,aAAa,CAAC,IAAI,SAAS;AACzD,0BAAkB;AAAA,MACtB;AAAA,IACJ;AAGA,WAAO,IAAI,iBAAiB,QAAQ,IAAI,MAAM,iBAAiB,IAAI,SAAS,IAAI,OAAO,IAAI,UAAU,IAAI,IAAI,CAAA,GAAI,IAAI,UAAU,IAAI,QAAQ,IAAI,UAAU,IAAI,IAAI,CAAA,GAAK,IAAI,OAAO,OAAQ,IAAI,MAAM,IAAI;AAAA,EAC3M;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,WAAW,OAAO;AACrB,WAAQ,SAAS,MAAMiO,UAAQ,MAAM;AAAA,EACzC;AACJ;AAIO,MAAM,uBAAuB,cAAc;AAAA;AAAA;AAAA;AAAA,EAI9C,YAAY,OAAOjO,OAAM,QAAQ;AAC7B,UAAM,OAAO,UAAUA,OAAM,MAAM;AACnC,WAAO,eAAe,MAAMiO,YAAU,EAAE,OAAO,wBAAwB;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA,EAIA,SAAS;AACL,UAAM,IAAI,MAAM,OAAO;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAIA,OAAO,KAAK,KAAK;AACb,QAAI,OAAQ,QAAS,UAAU;AAC3B,UAAI;AACA,eAAO,eAAe,KAAK,IAAI,GAAG,CAAC;AAAA,MACvC,SACO,OAAO;AACV,uBAAe,OAAO,2BAA2B,OAAO,GAAG;AAAA,MAC/D;AAAA,IACJ,WACS,eAAe,aAAa;AACjC,YAAMjO,QAAO,YAAY,UAAU,GAAG;AACtC,YAAM,SAAS,cAAc,GAAG;AAChC,iBAAW,GAAG;AACd,aAAO,IAAI,eAAe,QAAQA,OAAM,MAAM;AAAA,IAClD;AACA,WAAO,IAAI,eAAe,QAAQ,IAAI,MAAM,IAAI,SAAS,IAAI,OAAO,IAAI,UAAU,IAAI,IAAI,CAAA,CAAE;AAAA,EAChG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,WAAW,OAAO;AACrB,WAAQ,SAAS,MAAMiO,UAAQ,MAAM;AAAA,EACzC;AACJ;ACzwCA,MAAMiB,iBAAe,oBAAI,IAAG;AAC5BA,eAAa,IAAI,GAAM,eAAe;AACtCA,eAAa,IAAI,GAAM,cAAc;AACrCA,eAAa,IAAI,IAAM,UAAU;AACjCA,eAAa,IAAI,IAAM,gBAAgB;AACvCA,eAAa,IAAI,IAAM,kBAAkB;AACzCA,eAAa,IAAI,IAAM,kBAAkB;AACzCA,eAAa,IAAI,IAAM,iBAAiB;AACxCA,eAAa,IAAI,IAAM,mBAAmB;AAC1CA,eAAa,IAAI,IAAM,eAAe;AACtCA,eAAa,IAAI,IAAM,6BAA6B;AACpD,MAAM,iBAAiB,IAAI,OAAO,iBAAiB;AACnD,MAAM,kBAAkB,IAAI,OAAO,mBAAmB;AACtD,IAAI,eAAe;AACnB,IAAI,sBAAsB;AAC1B,SAAS,wBAAwB,QAAQ,IAAI,MAAM,UAAU;AACzD,MAAI,UAAU;AACd,MAAI,SAAS;AACb,QAAM,aAAa;AACnB,MAAI,SAAS;AACb,MAAI,MAAM;AACN,cAAU;AACV,UAAMvP,SAAQ,SAAS,IAAI;AAC3B,WAAO,QAAQ,IAAI;AACnB,QAAIA,OAAM,WAAW,GAAG;AACpB,iBAAW;AACX,eAAS;AAAA,IACb,WACSA,OAAM,SAAS,OAAO,GAAG;AAC9B,iBAAW;AAAA,IACf,WACS,QAAQA,OAAM,MAAM,GAAG,CAAC,CAAC,MAAM,cAAc;AAElD,UAAI;AACA,iBAAS,SAAS,OAAO,CAAC,QAAQ,GAAGA,OAAM,MAAM,CAAC,CAAC,EAAE,CAAC;AACtD,iBAAS;AAAA,UACL,WAAW;AAAA,UACX,MAAM;AAAA,UACN,MAAM,CAAC,MAAM;AAAA,QACjC;AACgB,mBAAW,KAAK,KAAK,UAAU,MAAM,CAAC;AAAA,MAC1C,SACO,OAAO;AACV,mBAAW;AAAA,MACf;AAAA,IACJ,WACS,QAAQA,OAAM,MAAM,GAAG,CAAC,CAAC,MAAM,cAAc;AAElD,UAAI;AACA,cAAM,OAAO,OAAO,SAAS,OAAO,CAAC,SAAS,GAAGA,OAAM,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;AACnE,iBAAS;AAAA,UACL,WAAW;AAAA,UACX,MAAM;AAAA,UACN,MAAM,CAAC,IAAI;AAAA,QAC/B;AACgB,iBAAS,gBAAgBuP,eAAa,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI;AACpE,mBAAW,KAAK,MAAM;AAAA,MAC1B,SACO,OAAO;AACV,mBAAW;AAAA,MACf;AAAA,IACJ,OACK;AACD,iBAAW;AAAA,IACf;AAAA,EACJ;AACA,QAAM,cAAc;AAAA,IAChB,IAAK,GAAG,KAAK,WAAW,GAAG,EAAE,IAAI;AAAA,IACjC,MAAO,GAAG,QAAQ;AAAA,EAC1B;AACI,MAAI,GAAG,MAAM;AACT,gBAAY,OAAO,WAAW,GAAG,IAAI;AAAA,EACzC;AACA,SAAO,UAAU,SAAS,kBAAkB;AAAA,IACxC;AAAA,IAAQ;AAAA,IAAM;AAAA,IAAQ;AAAA,IAAa;AAAA,IAAY;AAAA,EACvD,CAAK;AACL;AAKO,MAAM,SAAS;AAAA,EAClB,UAAU,OAAO;AACb,QAAI,MAAM,WAAW;AACjB,aAAO,IAAI,WAAW,KAAK,UAAU,MAAM,aAAa,GAAG,MAAM,aAAa,MAAM,IAAI;AAAA,IAC5F;AACA,QAAI,MAAM,WAAW;AACjB,aAAO,IAAI,WAAW,MAAM,WAAW,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,GAAG,MAAM,IAAI;AAAA,IACpF;AACA,YAAQ,MAAM,UAAQ;AAAA,MAClB,KAAK;AACD,eAAO,IAAI,aAAa,MAAM,IAAI;AAAA,MACtC,KAAK;AACD,eAAO,IAAI,aAAa,MAAM,IAAI;AAAA,MACtC,KAAK;AACD,eAAO,IAAI,YAAY,MAAM,IAAI;AAAA,MACrC,KAAK;AACD,eAAO,IAAI,WAAW,MAAM,IAAI;AAAA,MACpC,KAAK;AACD,eAAO,IAAI,UAAU,MAAM,IAAI;AAAA,IAC/C;AAEQ,QAAI,QAAQ,MAAM,KAAK,MAAM,eAAe;AAC5C,QAAI,OAAO;AACP,UAAI,OAAO,SAAS,MAAM,CAAC,KAAK,KAAK;AACrC,qBAAe,SAAS,KAAK,QAAQ,OAAQ,OAAO,MAAO,GAAG,aAAa,MAAM,CAAC,IAAI,eAAe,SAAS,KAAK;AACnH,aAAO,IAAI,YAAY,OAAO,GAAI,MAAM,CAAC,MAAM,OAAQ,MAAM,IAAI;AAAA,IACrE;AAEA,YAAQ,MAAM,KAAK,MAAM,cAAc;AACvC,QAAI,OAAO;AACP,UAAI,OAAO,SAAS,MAAM,CAAC,CAAC;AAC5B,qBAAe,SAAS,KAAK,QAAQ,IAAI,wBAAwB,SAAS,KAAK;AAC/E,aAAO,IAAI,gBAAgB,MAAM,MAAM,IAAI;AAAA,IAC/C;AACA,mBAAe,OAAO,gBAAgB,QAAQ,MAAM,IAAI;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBAAgBhB,QAAO;AACnB,UAAM,SAASA,OAAM,IAAI,CAACpO,UAAS,KAAK,UAAU,UAAU,KAAKA,KAAI,CAAC,CAAC;AACvE,UAAM,QAAQ,IAAI,WAAW,QAAQ,GAAG;AACxC,WAAO,MAAM,aAAY;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAOoO,QAAO,QAAQ;AAClB,wBAAoB,OAAO,QAAQA,OAAM,QAAQ,8BAA8B;AAC/E,UAAM,SAASA,OAAM,IAAI,CAACpO,UAAS,KAAK,UAAU,UAAU,KAAKA,KAAI,CAAC,CAAC;AACvE,UAAM,QAAS,IAAI,WAAW,QAAQ,GAAG;AACzC,UAAM,SAAS,IAAI,OAAM;AACzB,UAAM,OAAO,QAAQ,MAAM;AAC3B,WAAO,OAAO;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAOoO,QAAO,MAAM,OAAO;AACvB,UAAM,SAASA,OAAM,IAAI,CAACpO,UAAS,KAAK,UAAU,UAAU,KAAKA,KAAI,CAAC,CAAC;AACvE,UAAM,QAAQ,IAAI,WAAW,QAAQ,GAAG;AACxC,WAAO,MAAM,OAAO,IAAI,OAAO,MAAM,OAAO,mBAAmB,CAAC;AAAA,EACpE;AAAA,EACA,OAAO,wBAAwB,OAAO;AAClC,mBAAe,OAAQ,UAAW,YAAY,OAAO,UAAU,KAAK,GAAG,sCAAsC,SAAS,KAAK;AAC3H,0BAAsB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,kBAAkB;AACrB,QAAI,gBAAgB,MAAM;AACtB,qBAAe,IAAI,SAAQ;AAAA,IAC/B;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,wBAAwB,QAAQ,IAAI,MAAM;AAC7C,WAAO,wBAAwB,QAAQ,IAAI,MAAM,SAAS,iBAAiB;AAAA,EAC/E;AACJ;ACrLO,MAAM,eAAe;AAAA;AAAA;AAAA;AAAA,EAIxB;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA,YAAY,UAAU,OAAO,MAAM;AAC/B,UAAME,QAAO,SAAS,MAAM,YAAY,SAAS,OAAM;AACvD,qBAAiB,MAAM;AAAA,MACnB;AAAA,MAAU,MAAAA;AAAA,MAAM;AAAA,MAAW;AAAA,MAAO;AAAA,IAC9C,CAAS;AAAA,EACL;AACJ;AAMO,MAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA,EAIhC;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA,YAAY,UAAU,UAAU,MAAM,OAAO;AACzC,UAAMA,QAAO,SAAS,MAAM,YAAY,SAAS,OAAM;AACvD,qBAAiB,MAAM;AAAA,MACnB;AAAA,MAAU,MAAAA;AAAA,MAAM;AAAA,MAAM;AAAA,MAAW;AAAA,MAAU;AAAA,IACvD,CAAS;AAAA,EACL;AACJ;AAKO,MAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA,EAI1B;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA,YAAY,UAAU,UAAU,MAAM;AAClC,UAAMA,QAAO,SAAS,MAAM,YAAY,SAAS,OAAM;AACvD,qBAAiB,MAAM;AAAA,MACnB;AAAA,MAAU,MAAAA;AAAA,MAAM;AAAA,MAAM;AAAA,MAAW;AAAA,IAC7C,CAAS;AAAA,EACL;AACJ;AAOO,MAAM,QAAQ;AAAA;AAAA;AAAA;AAAA,EAIjB;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,UAAU,OAAO;AACpB,WAAO,CAAC,EAAE,SAAS,MAAM;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAIA,YAAY4E,OAAM;AACd,qBAAiB,MAAM,EAAE,MAAAA,OAAM,YAAY,KAAI,CAAE;AAAA,EACrD;AACJ;AAEA,MAAM,eAAe;AAAA,EACjB,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACV;AACA,MAAM,gBAAgB;AAAA,EAClB,cAAc;AAAA,IACV,WAAW;AAAA,IACX,MAAM;AAAA,IACN,QAAQ,CAAC,QAAQ;AAAA,IACjB,QAAQ,CAAC,YAAY;AACjB,aAAO,+BAA+B,KAAK,UAAU,OAAO,CAAC;AAAA,IACjE;AAAA,EACR;AAAA,EACI,cAAc;AAAA,IACV,WAAW;AAAA,IACX,MAAM;AAAA,IACN,QAAQ,CAAC,SAAS;AAAA,IAClB,QAAQ,CAAC,SAAS;AACd,UAAI,SAAS;AACb,UAAI,QAAQ,KAAK,QAAQ,OAAQ,aAAa,KAAK,SAAQ,CAAE,GAAG;AAC5D,iBAAS,aAAa,KAAK,UAAU;AAAA,MACzC;AACA,aAAO,8BAA8B,KAAK,SAAS,EAAE,CAAC,KAAK,MAAM;AAAA,IACrE;AAAA,EACR;AACA;AAWO,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA,EAInB;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA;AAAA;AAAA,EAIA,YAAY,WAAW;AACnB,QAAImJ,OAAM,CAAA;AACV,QAAI,OAAQ,cAAe,UAAU;AACjC,MAAAA,OAAM,KAAK,MAAM,SAAS;AAAA,IAC9B,OACK;AACD,MAAAA,OAAM;AAAA,IACV;AACA,SAAK,aAAa,oBAAI,IAAG;AACzB,SAAK,UAAU,oBAAI,IAAG;AACtB,SAAK,UAAU,oBAAI,IAAG;AAEtB,UAAM,QAAQ,CAAA;AACd,eAAW,KAAKA,MAAK;AACjB,UAAI;AACA,cAAM,KAAK,SAAS,KAAK,CAAC,CAAC;AAAA,MAC/B,SACO,OAAO;AACV,gBAAQ,IAAI,8BAA8B,KAAK,UAAU,CAAC,CAAC,KAAK,MAAM,OAAO;AAAA,MACjF;AAAA,IACJ;AACA,qBAAiB,MAAM;AAAA,MACnB,WAAW,OAAO,OAAO,KAAK;AAAA,IAC1C,CAAS;AACD,QAAI,WAAW;AACf,QAAI,UAAU;AACd,SAAK,YAAY,KAAK,YAAW;AAEjC,SAAK,UAAU,QAAQ,CAAC,UAAU,UAAU;AACxC,UAAI;AACJ,cAAQ,SAAS,MAAI;AAAA,QACjB,KAAK;AACD,cAAI,KAAK,QAAQ;AACb,oBAAQ,IAAI,oCAAoC;AAChD;AAAA,UACJ;AAEA,2BAAiB,MAAM,EAAE,QAAQ,SAAQ,CAAE;AAC3C;AAAA,QACJ,KAAK;AACD,cAAI,SAAS,OAAO,WAAW,GAAG;AAC9B,sBAAU;AAAA,UACd,OACK;AACD,2BAAe,CAAC,YAAY,SAAS,YAAY,SAAS,SAAS,kCAAkC,aAAa,KAAK,KAAK,QAAQ;AACpI,uBAAW;AACX,sBAAU,SAAS;AAAA,UACvB;AACA;AAAA,QACJ,KAAK;AAGD,mBAAS,KAAK;AACd;AAAA,QACJ,KAAK;AAED,mBAAS,KAAK;AACd;AAAA,QACJ,KAAK;AACD,mBAAS,KAAK;AACd;AAAA,QACJ;AACI;AAAA,MACpB;AAEY,YAAM,YAAY,SAAS,OAAM;AACjC,UAAI,OAAO,IAAI,SAAS,GAAG;AACvB;AAAA,MACJ;AACA,aAAO,IAAI,WAAW,QAAQ;AAAA,IAClC,CAAC;AAED,QAAI,CAAC,KAAK,QAAQ;AACd,uBAAiB,MAAM;AAAA,QACnB,QAAQ,oBAAoB,KAAK,eAAe;AAAA,MAChE,CAAa;AAAA,IACL;AACA,qBAAiB,MAAM,EAAE,UAAU,QAAO,CAAE;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,SAAS;AACZ,UAAM,SAAU,UAAU,YAAY;AACtC,UAAMA,OAAM,KAAK,UAAU,IAAI,CAAC,MAAM,EAAE,OAAO,MAAM,CAAC;AACtD,WAAOA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa;AACT,UAAMA,OAAM,KAAK,UAAU,IAAI,CAAC,MAAM,EAAE,OAAO,MAAM,CAAC;AAEtD,WAAO,KAAK,UAAUA,KAAI,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc;AACV,WAAO,SAAS,gBAAe;AAAA,EACnC;AAAA;AAAA,EAEA,aAAa,KAAK,QAAQ,aAAa;AAEnC,QAAI,YAAY,GAAG,GAAG;AAClB,YAAM,WAAW,IAAI,YAAW;AAChC,iBAAW,YAAY,KAAK,WAAW,OAAM,GAAI;AAC7C,YAAI,aAAa,SAAS,UAAU;AAChC,iBAAO;AAAA,QACX;AAAA,MACJ;AACA,aAAO;AAAA,IACX;AAEA,QAAI,IAAI,QAAQ,GAAG,MAAM,IAAI;AACzB,YAAM,WAAW,CAAA;AACjB,iBAAW,CAAC/N,OAAM,QAAQ,KAAK,KAAK,YAAY;AAC5C,YAAIA,MAAK;AAAA,UAAM;AAAA;AAAA,QAAG,EAAc,CAAC,MAAM,KAAK;AACxC,mBAAS,KAAK,QAAQ;AAAA,QAC1B;AAAA,MACJ;AACA,UAAI,QAAQ;AACR,cAAM,YAAa,OAAO,SAAS,IAAK,OAAO,OAAO,SAAS,CAAC,IAAI;AACpE,YAAI,cAAc,OAAO;AACzB,YAAI,eAAe;AACnB,YAAI,MAAM,QAAQ,SAAS,KAAK,UAAU,SAAS,aAAa;AAC5D,yBAAe;AACf;AAAA,QACJ;AAGA,iBAAS,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AAC3C,gBAAM,SAAS,SAAS,CAAC,EAAE,OAAO;AAClC,cAAI,WAAW,gBAAgB,CAAC,gBAAgB,WAAW,cAAc,IAAI;AACzE,qBAAS,OAAO,GAAG,CAAC;AAAA,UACxB;AAAA,QACJ;AAEA,iBAAS,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AAC3C,gBAAM,SAAS,SAAS,CAAC,EAAE;AAC3B,mBAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AAEpC,gBAAI,CAAC,MAAM,QAAQ,OAAO,CAAC,CAAC,GAAG;AAC3B;AAAA,YACJ;AAEA,gBAAI,KAAK,OAAO,QAAQ;AACpB,kBAAI,OAAO,CAAC,EAAE,SAAS,aAAa;AAChC;AAAA,cACJ;AACA,uBAAS,OAAO,GAAG,CAAC;AACpB;AAAA,YACJ;AAEA,gBAAI,OAAO,CAAC,EAAE,SAAS,OAAO,CAAC,EAAE,UAAU;AACvC,uBAAS,OAAO,GAAG,CAAC;AACpB;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAGA,UAAI,SAAS,WAAW,KAAK,UAAU,OAAO,WAAW,SAAS,CAAC,EAAE,OAAO,QAAQ;AAChF,cAAM,UAAU,OAAO,OAAO,SAAS,CAAC;AACxC,YAAI,WAAW,QAAQ,MAAM,QAAQ,OAAO,KAAK,OAAQ,YAAa,UAAU;AAC5E,mBAAS,OAAO,GAAG,CAAC;AAAA,QACxB;AAAA,MACJ;AACA,UAAI,SAAS,WAAW,GAAG;AACvB,eAAO;AAAA,MACX;AACA,UAAI,SAAS,SAAS,KAAK,aAAa;AACpC,cAAM,WAAW,SAAS,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,OAAM,CAAE,CAAC,EAAE,KAAK,IAAI;AAC1E,uBAAe,OAAO,gDAAgD,QAAQ,KAAK,OAAO,GAAG;AAAA,MACjG;AACA,aAAO,SAAS,CAAC;AAAA,IACrB;AAEA,UAAM,SAAS,KAAK,WAAW,IAAI,iBAAiB,KAAK,GAAG,EAAE,QAAQ;AACtE,QAAI,QAAQ;AACR,aAAO;AAAA,IACX;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,KAAK;AACjB,UAAM,WAAW,KAAK,aAAa,KAAK,MAAM,KAAK;AACnD,mBAAe,UAAU,wBAAwB,OAAO,GAAG;AAC3D,WAAO,SAAS;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YAAY,KAAK;AACb,WAAO,CAAC,CAAC,KAAK,aAAa,KAAK,MAAM,KAAK;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,YAAY,KAAK,QAAQ;AACrB,WAAO,KAAK,aAAa,KAAK,UAAU,MAAM,IAAI;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAIA,gBAAgB,UAAU;AACtB,UAAM4N,SAAQ,MAAM,KAAK,KAAK,WAAW,MAAM;AAC/C,IAAAA,OAAM,KAAK,CAAC,GAAGpO,OAAM,EAAE,cAAcA,EAAC,CAAC;AACvC,aAAS,IAAI,GAAG,IAAIoO,OAAM,QAAQ,KAAK;AACnC,YAAM5N,QAAO4N,OAAM,CAAC;AACpB,eAAU,KAAK,WAAW,IAAI5N,KAAI,GAAI,CAAC;AAAA,IAC3C;AAAA,EACJ;AAAA;AAAA,EAEA,UAAU,KAAK,QAAQ,aAAa;AAEhC,QAAI,YAAY,GAAG,GAAG;AAClB,YAAM,aAAa,IAAI,YAAW;AAClC,iBAAW,YAAY,KAAK,QAAQ,OAAM,GAAI;AAC1C,YAAI,eAAe,SAAS,WAAW;AACnC,iBAAO;AAAA,QACX;AAAA,MACJ;AACA,aAAO;AAAA,IACX;AAEA,QAAI,IAAI,QAAQ,GAAG,MAAM,IAAI;AACzB,YAAM,WAAW,CAAA;AACjB,iBAAW,CAACA,OAAM,QAAQ,KAAK,KAAK,SAAS;AACzC,YAAIA,MAAK;AAAA,UAAM;AAAA;AAAA,QAAG,EAAc,CAAC,MAAM,KAAK;AACxC,mBAAS,KAAK,QAAQ;AAAA,QAC1B;AAAA,MACJ;AACA,UAAI,QAAQ;AAER,iBAAS,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AAC3C,cAAI,SAAS,CAAC,EAAE,OAAO,SAAS,OAAO,QAAQ;AAC3C,qBAAS,OAAO,GAAG,CAAC;AAAA,UACxB;AAAA,QACJ;AAEA,iBAAS,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AAC3C,gBAAM,SAAS,SAAS,CAAC,EAAE;AAC3B,mBAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AAEpC,gBAAI,CAAC,MAAM,QAAQ,OAAO,CAAC,CAAC,GAAG;AAC3B;AAAA,YACJ;AAEA,gBAAI,OAAO,CAAC,EAAE,SAAS,OAAO,CAAC,EAAE,UAAU;AACvC,uBAAS,OAAO,GAAG,CAAC;AACpB;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AACA,UAAI,SAAS,WAAW,GAAG;AACvB,eAAO;AAAA,MACX;AACA,UAAI,SAAS,SAAS,KAAK,aAAa;AACpC,cAAM,WAAW,SAAS,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,OAAM,CAAE,CAAC,EAAE,KAAK,IAAI;AAC1E,uBAAe,OAAO,6CAA6C,QAAQ,KAAK,OAAO,GAAG;AAAA,MAC9F;AACA,aAAO,SAAS,CAAC;AAAA,IACrB;AAEA,UAAM,SAAS,KAAK,QAAQ,IAAI,cAAc,KAAK,GAAG,EAAE,QAAQ;AAChE,QAAI,QAAQ;AACR,aAAO;AAAA,IACX;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,KAAK;AACd,UAAM,WAAW,KAAK,UAAU,KAAK,MAAM,KAAK;AAChD,mBAAe,UAAU,qBAAqB,OAAO,GAAG;AACxD,WAAO,SAAS;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAS,KAAK;AACV,WAAO,CAAC,CAAC,KAAK,UAAU,KAAK,MAAM,KAAK;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,SAAS,KAAK,QAAQ;AAClB,WAAO,KAAK,UAAU,KAAK,UAAU,MAAM,IAAI;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAIA,aAAa,UAAU;AACnB,UAAM4N,SAAQ,MAAM,KAAK,KAAK,QAAQ,MAAM;AAC5C,IAAAA,OAAM,KAAK,CAAC,GAAGpO,OAAM,EAAE,cAAcA,EAAC,CAAC;AACvC,aAAS,IAAI,GAAG,IAAIoO,OAAM,QAAQ,KAAK;AACnC,YAAM5N,QAAO4N,OAAM,CAAC;AACpB,eAAU,KAAK,QAAQ,IAAI5N,KAAI,GAAI,CAAC;AAAA,IACxC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,SAAS,KAAK,QAAQ;AAClB,QAAI,YAAY,GAAG,GAAG;AAClB,YAAM,WAAW,IAAI,YAAW;AAChC,UAAI,cAAc,QAAQ,GAAG;AACzB,eAAO,cAAc,KAAK,cAAc,QAAQ,EAAE,SAAS;AAAA,MAC/D;AACA,iBAAW,YAAY,KAAK,QAAQ,OAAM,GAAI;AAC1C,YAAI,aAAa,SAAS,UAAU;AAChC,iBAAO;AAAA,QACX;AAAA,MACJ;AACA,aAAO;AAAA,IACX;AAEA,QAAI,IAAI,QAAQ,GAAG,MAAM,IAAI;AACzB,YAAM,WAAW,CAAA;AACjB,iBAAW,CAACA,OAAM,QAAQ,KAAK,KAAK,SAAS;AACzC,YAAIA,MAAK;AAAA,UAAM;AAAA;AAAA,QAAG,EAAc,CAAC,MAAM,KAAK;AACxC,mBAAS,KAAK,QAAQ;AAAA,QAC1B;AAAA,MACJ;AACA,UAAI,SAAS,WAAW,GAAG;AACvB,YAAI,QAAQ,SAAS;AACjB,iBAAO,cAAc,KAAK,qBAAqB;AAAA,QACnD;AACA,YAAI,QAAQ,SAAS;AACjB,iBAAO,cAAc,KAAK,sBAAsB;AAAA,QACpD;AACA,eAAO;AAAA,MACX,WACS,SAAS,SAAS,GAAG;AAC1B,cAAM,WAAW,SAAS,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,OAAM,CAAE,CAAC,EAAE,KAAK,IAAI;AAC1E,uBAAe,OAAO,qCAAqC,QAAQ,KAAK,QAAQ,GAAG;AAAA,MACvF;AACA,aAAO,SAAS,CAAC;AAAA,IACrB;AAEA,UAAM,cAAc,KAAK,GAAG,EAAE,OAAM;AACpC,QAAI,QAAQ,iBAAiB;AACzB,aAAO,cAAc,KAAK,qBAAqB;AAAA,IACnD;AACA,QAAI,QAAQ,kBAAkB;AAC1B,aAAO,cAAc,KAAK,sBAAsB;AAAA,IACpD;AACA,UAAM,SAAS,KAAK,QAAQ,IAAI,GAAG;AACnC,QAAI,QAAQ;AACR,aAAO;AAAA,IACX;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAIA,aAAa,UAAU;AACnB,UAAM4N,SAAQ,MAAM,KAAK,KAAK,QAAQ,MAAM;AAC5C,IAAAA,OAAM,KAAK,CAAC,GAAGpO,OAAM,EAAE,cAAcA,EAAC,CAAC;AACvC,aAAS,IAAI,GAAG,IAAIoO,OAAM,QAAQ,KAAK;AACnC,YAAM5N,QAAO4N,OAAM,CAAC;AACpB,eAAU,KAAK,QAAQ,IAAI5N,KAAI,GAAI,CAAC;AAAA,IACxC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6BA,cAAc,QAAQ,MAAM;AACxB,WAAO,KAAK,UAAU,OAAO,QAAQ,IAAI;AAAA,EAC7C;AAAA,EACA,cAAc,QAAQ,QAAQ;AAC1B,WAAO,KAAK,UAAU,OAAO,QAAQ,MAAM;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,QAAQ;AACjB,WAAO,KAAK,cAAc,KAAK,OAAO,QAAQ,UAAU,EAAE;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,kBAAkB,UAAU,MAAM;AAC9B,QAAI,OAAQ,aAAc,UAAU;AAChC,YAAM,IAAI,KAAK,SAAS,QAAQ;AAChC,qBAAe,GAAG,iBAAiB,YAAY,QAAQ;AACvD,iBAAW;AAAA,IACf;AACA,mBAAe,UAAU,MAAM,GAAG,CAAC,MAAM,SAAS,UAAU,uCAAuC,SAAS,IAAI,KAAK,QAAQ,IAAI;AACjI,WAAO,KAAK,cAAc,SAAS,QAAQ,UAAU,MAAM,CAAC,CAAC;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,kBAAkB,UAAU,QAAQ;AAChC,QAAI,OAAQ,aAAc,UAAU;AAChC,YAAM,IAAI,KAAK,SAAS,QAAQ;AAChC,qBAAe,GAAG,iBAAiB,YAAY,QAAQ;AACvD,iBAAW;AAAA,IACf;AACA,WAAO,OAAO;AAAA,MACV,SAAS;AAAA,MACT,KAAK,cAAc,SAAS,QAAQ,UAAU,CAAA,CAAE;AAAA,IAC5D,CAAS;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,mBAAmB,UAAU,MAAM;AAC/B,QAAI,OAAQ,aAAc,UAAU;AAChC,YAAM,IAAI,KAAK,YAAY,QAAQ;AACnC,qBAAe,GAAG,oBAAoB,YAAY,QAAQ;AAC1D,iBAAW;AAAA,IACf;AACA,mBAAe,UAAU,MAAM,GAAG,CAAC,MAAM,SAAS,UAAU,0CAA0C,SAAS,IAAI,KAAK,QAAQ,IAAI;AACpI,WAAO,KAAK,cAAc,SAAS,QAAQ,UAAU,MAAM,CAAC,CAAC;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,mBAAmB,UAAU,QAAQ;AACjC,QAAI,OAAQ,aAAc,UAAU;AAChC,YAAM,IAAI,KAAK,YAAY,QAAQ;AACnC,qBAAe,GAAG,oBAAoB,YAAY,QAAQ;AAC1D,iBAAW;AAAA,IACf;AACA,WAAO,OAAO;AAAA,MACV,SAAS;AAAA,MACT,KAAK,cAAc,SAAS,QAAQ,UAAU,CAAA,CAAE;AAAA,IAC5D,CAAS;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,qBAAqB,UAAU,MAAM;AACjC,QAAI,OAAQ,aAAc,UAAU;AAChC,YAAM,IAAI,KAAK,YAAY,QAAQ;AACnC,qBAAe,GAAG,oBAAoB,YAAY,QAAQ;AAC1D,iBAAW;AAAA,IACf;AACA,QAAI,UAAU;AACd,UAAML,SAAQ,aAAa,IAAI;AAC/B,QAAKA,OAAM,SAAS,OAAQ,GAAG;AAC3B,UAAI;AACA,eAAO,KAAK,UAAU,OAAO,SAAS,SAASA,MAAK;AAAA,MACxD,SACO,OAAO;AACV,kBAAU;AAAA,MACd;AAAA,IACJ;AAEA,WAAO,OAAO,SAAS,YAAY;AAAA,MAC/B,OAAO,QAAQA,MAAK;AAAA,MACpB,MAAM,EAAE,QAAQ,SAAS,MAAM,WAAW,SAAS,OAAM,EAAE;AAAA,IACvE,CAAS;AAAA,EACL;AAAA,EACA,UAAU,OAAO,IAAI;AACjB,UAAM,OAAO,SAAS,OAAO,MAAM;AACnC,UAAM,QAAQ,SAAS,wBAAwB,QAAQ,IAAI,IAAI;AAE/D,UAAM,eAAe;AACrB,QAAI,MAAM,QAAQ,WAAW,YAAY,GAAG;AACxC,YAAM,WAAW,QAAQ,KAAK,MAAM,GAAG,CAAC,CAAC;AACzC,YAAM,KAAK,KAAK,SAAS,QAAQ;AACjC,UAAI,IAAI;AACJ,YAAI;AACA,gBAAM,OAAO,KAAK,UAAU,OAAO,GAAG,QAAQ,KAAK,MAAM,CAAC,CAAC;AAC3D,gBAAM,SAAS;AAAA,YACX,MAAM,GAAG;AAAA,YAAM,WAAW,GAAG,OAAM;AAAA,YAAI;AAAA,UAC/D;AACoB,gBAAM,SAAS,MAAM,OAAO;AAC5B,gBAAM,UAAU,uBAAuB,MAAM,MAAM;AAAA,QACvD,SACO,GAAG;AACN,gBAAM,UAAU;AAAA,QACpB;AAAA,MACJ;AAAA,IACJ;AAEA,UAAM,SAAS,KAAK,iBAAiB,EAAE;AACvC,QAAI,QAAQ;AACR,YAAM,aAAa;AAAA,QACf,QAAQ,OAAO;AAAA,QACf,WAAW,OAAO;AAAA,QAClB,MAAM,OAAO;AAAA,MAC7B;AAAA,IACQ;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,qBAAqB,UAAU,QAAQ;AACnC,QAAI,OAAQ,aAAc,UAAU;AAChC,YAAM,IAAI,KAAK,YAAY,QAAQ;AACnC,qBAAe,GAAG,oBAAoB,YAAY,QAAQ;AAC1D,iBAAW;AAAA,IACf;AACA,WAAO,QAAQ,KAAK,UAAU,OAAO,SAAS,SAAS,UAAU,CAAA,CAAE,CAAC;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgCA,mBAAmB,UAAU,QAAQ;AACjC,QAAI,OAAQ,aAAc,UAAU;AAChC,YAAM,IAAI,KAAK,SAAS,QAAQ;AAChC,qBAAe,GAAG,iBAAiB,iBAAiB,QAAQ;AAC5D,iBAAW;AAAA,IACf;AACA,WAAO,OAAO,UAAU,SAAS,OAAO,QAAQ,0BAA0B,SAAS,OAAM,CAAE,IAAI,uBAAuB,EAAE,OAAO,OAAO,QAAQ,eAAe,SAAS,OAAO,QAAQ;AACrL,UAAM,SAAS,CAAA;AACf,QAAI,CAAC,SAAS,WAAW;AACrB,aAAO,KAAK,SAAS,SAAS;AAAA,IAClC;AAEA,UAAM,cAAc,CAAC,OAAO,UAAU;AAClC,UAAI,MAAM,SAAS,UAAU;AACzB,eAAO,GAAG,KAAK;AAAA,MACnB,WACS,MAAM,SAAS,SAAS;AAC7B,eAAO,UAAU,QAAQ,KAAK,CAAC;AAAA,MACnC;AACA,UAAI,MAAM,SAAS,UAAU,OAAQ,UAAW,WAAW;AACvD,gBAAS,QAAQ,SAAS;AAAA,MAC9B,WACS,MAAM,KAAK,MAAM,QAAQ,GAAG;AACjC,gBAAQ,QAAQ,KAAK;AAAA,MACzB,WACS,MAAM,KAAK,MAAM,QAAQ,GAAG;AACjC,gBAAQ,aAAa,OAAO,EAAE;AAAA,MAClC,WACS,MAAM,SAAS,WAAW;AAE/B,aAAK,UAAU,OAAO,CAAC,SAAS,GAAG,CAAC,KAAK,CAAC;AAAA,MAC9C;AACA,aAAO,aAAa,QAAQ,KAAK,GAAG,EAAE;AAAA,IAC1C;AACA,WAAO,QAAQ,CAAC,OAAO,UAAU;AAC7B,YAAM,QAAQ,SAAS,OAAO,KAAK;AACnC,UAAI,CAAC,MAAM,SAAS;AAChB,uBAAe,SAAS,MAAM,sDAAuD,cAAc,MAAM,MAAO,KAAK;AACrH;AAAA,MACJ;AACA,UAAI,SAAS,MAAM;AACf,eAAO,KAAK,IAAI;AAAA,MACpB,WACS,MAAM,aAAa,WAAW,MAAM,aAAa,SAAS;AAC/D,uBAAe,OAAO,iDAAkD,cAAc,MAAM,MAAO,KAAK;AAAA,MAC5G,WACS,MAAM,QAAQ,KAAK,GAAG;AAC3B,eAAO,KAAK,MAAM,IAAI,CAACoP,WAAU,YAAY,OAAOA,MAAK,CAAC,CAAC;AAAA,MAC/D,OACK;AACD,eAAO,KAAK,YAAY,OAAO,KAAK,CAAC;AAAA,MACzC;AAAA,IACJ,CAAC;AAED,WAAO,OAAO,UAAU,OAAO,OAAO,SAAS,CAAC,MAAM,MAAM;AACxD,aAAO,IAAG;AAAA,IACd;AACA,WAAO;AAAA,EACX;AAAA,EACA,eAAe,UAAU,QAAQ;AAC7B,QAAI,OAAQ,aAAc,UAAU;AAChC,YAAM,IAAI,KAAK,SAAS,QAAQ;AAChC,qBAAe,GAAG,iBAAiB,iBAAiB,QAAQ;AAC5D,iBAAW;AAAA,IACf;AACA,UAAM,SAAS,CAAA;AACf,UAAM,YAAY,CAAA;AAClB,UAAM,aAAa,CAAA;AACnB,QAAI,CAAC,SAAS,WAAW;AACrB,aAAO,KAAK,SAAS,SAAS;AAAA,IAClC;AACA,mBAAe,OAAO,WAAW,SAAS,OAAO,QAAQ,mCAAmC,UAAU,MAAM;AAC5G,aAAS,OAAO,QAAQ,CAAC,OAAO,UAAU;AACtC,YAAM,QAAQ,OAAO,KAAK;AAC1B,UAAI,MAAM,SAAS;AACf,YAAI,MAAM,SAAS,UAAU;AACzB,iBAAO,KAAK,GAAG,KAAK,CAAC;AAAA,QACzB,WACS,MAAM,SAAS,SAAS;AAC7B,iBAAO,KAAK,UAAU,KAAK,CAAC;AAAA,QAChC,WACS,MAAM,aAAa,WAAW,MAAM,aAAa,SAAS;AAE/D,gBAAM,IAAI,MAAM,iBAAiB;AAAA,QACrC,OACK;AACD,iBAAO,KAAK,KAAK,UAAU,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;AAAA,QAC5D;AAAA,MACJ,OACK;AACD,kBAAU,KAAK,KAAK;AACpB,mBAAW,KAAK,KAAK;AAAA,MACzB;AAAA,IACJ,CAAC;AACD,WAAO;AAAA,MACH,MAAM,KAAK,UAAU,OAAO,WAAW,UAAU;AAAA,MACjD;AAAA,IACZ;AAAA,EACI;AAAA;AAAA,EAEA,eAAe,UAAU,MAAM,QAAQ;AACnC,QAAI,OAAQ,aAAc,UAAU;AAChC,YAAM,IAAI,KAAK,SAAS,QAAQ;AAChC,qBAAe,GAAG,iBAAiB,iBAAiB,QAAQ;AAC5D,iBAAW;AAAA,IACf;AACA,QAAI,UAAU,QAAQ,CAAC,SAAS,WAAW;AACvC,YAAM,aAAa,SAAS;AAC5B,qBAAe,YAAY,OAAO,CAAC,GAAG,EAAE,KAAK,OAAO,CAAC,EAAE,YAAW,MAAO,YAAY,2BAA2B,aAAa,OAAO,CAAC,CAAC;AACtI,eAAS,OAAO,MAAM,CAAC;AAAA,IAC3B;AACA,UAAM,UAAU,CAAA;AAChB,UAAM,aAAa,CAAA;AACnB,UAAM,UAAU,CAAA;AAChB,aAAS,OAAO,QAAQ,CAAC,OAAO,UAAU;AACtC,UAAI,MAAM,SAAS;AACf,YAAI,MAAM,SAAS,YAAY,MAAM,SAAS,WAAW,MAAM,aAAa,WAAW,MAAM,aAAa,SAAS;AAC/G,kBAAQ,KAAK,UAAU,KAAK,EAAE,MAAM,WAAW,MAAM,MAAM,KAAI,CAAE,CAAC;AAClE,kBAAQ,KAAK,IAAI;AAAA,QACrB,OACK;AACD,kBAAQ,KAAK,KAAK;AAClB,kBAAQ,KAAK,KAAK;AAAA,QACtB;AAAA,MACJ,OACK;AACD,mBAAW,KAAK,KAAK;AACrB,gBAAQ,KAAK,KAAK;AAAA,MACtB;AAAA,IACJ,CAAC;AACD,UAAM,gBAAiB,UAAU,OAAQ,KAAK,UAAU,OAAO,SAAS,OAAO,MAAM,CAAC,IAAI;AAC1F,UAAM,mBAAmB,KAAK,UAAU,OAAO,YAAY,MAAM,IAAI;AAErE,UAAM,SAAS,CAAA;AACf,UAAM,OAAO,CAAA;AACb,QAAI,kBAAkB,GAAG,eAAe;AACxC,aAAS,OAAO,QAAQ,CAAC,OAAO,UAAU;AACtC,UAAI,QAAQ;AACZ,UAAI,MAAM,SAAS;AACf,YAAI,iBAAiB,MAAM;AACvB,kBAAQ,IAAI,QAAQ,IAAI;AAAA,QAC5B,WACS,QAAQ,KAAK,GAAG;AACrB,kBAAQ,IAAI,QAAQ,cAAc,cAAc,CAAC;AAAA,QACrD,OACK;AACD,cAAI;AACA,oBAAQ,cAAc,cAAc;AAAA,UACxC,SACO,OAAO;AACV,oBAAQ;AAAA,UACZ;AAAA,QACJ;AAAA,MACJ,OACK;AACD,YAAI;AACA,kBAAQ,iBAAiB,iBAAiB;AAAA,QAC9C,SACO,OAAO;AACV,kBAAQ;AAAA,QACZ;AAAA,MACJ;AACA,aAAO,KAAK,KAAK;AACjB,WAAK,KAAK,MAAM,QAAQ,IAAI;AAAA,IAChC,CAAC;AACD,WAAO,OAAO,UAAU,QAAQ,IAAI;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAiB,IAAI;AACjB,UAAM,OAAO,SAAS,GAAG,MAAM,SAAS;AACxC,UAAM,QAAQ,UAAW,GAAG,SAAS,OAAQ,GAAG,QAAQ,GAAG,UAAU;AACrE,UAAM,WAAW,KAAK,YAAY,QAAQ,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC;AAC3D,QAAI,CAAC,UAAU;AACX,aAAO;AAAA,IACX;AACA,UAAM,OAAO,KAAK,UAAU,OAAO,SAAS,QAAQ,KAAK,MAAM,CAAC,CAAC;AACjE,WAAO,IAAI,uBAAuB,UAAU,SAAS,UAAU,MAAM,KAAK;AAAA,EAC9E;AAAA,EACA,gBAAgB,MAAM;AAClB,UAAM,IAAI,MAAM,OAAO;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,KAAK;AACV,UAAM,WAAW,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC;AAC5C,QAAI,CAAC,YAAY,SAAS,WAAW;AACjC,aAAO;AAAA,IACX;AAIA,WAAO,IAAI,eAAe,UAAU,SAAS,WAAW,KAAK,eAAe,UAAU,IAAI,MAAM,IAAI,MAAM,CAAC;AAAA,EAC/G;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,MAAM;AACb,UAAM,UAAU,QAAQ,IAAI;AAC5B,UAAM,WAAW,KAAK,SAAS,UAAU,SAAS,GAAG,CAAC,CAAC;AACvD,QAAI,CAAC,UAAU;AACX,aAAO;AAAA,IACX;AACA,UAAM,OAAO,KAAK,UAAU,OAAO,SAAS,QAAQ,UAAU,SAAS,CAAC,CAAC;AACzE,WAAO,IAAI,iBAAiB,UAAU,SAAS,UAAU,IAAI;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,KAAK,OAAO;AAEf,QAAI,iBAAiB,WAAW;AAC5B,aAAO;AAAA,IACX;AAEA,QAAI,OAAQ,UAAW,UAAU;AAC7B,aAAO,IAAI,UAAU,KAAK,MAAM,KAAK,CAAC;AAAA,IAC1C;AAEA,QAAI,OAAQ,MAAM,eAAgB,YAAY;AAC1C,aAAO,IAAI,UAAU,MAAM,YAAY;AAAA,IAC3C;AAEA,QAAI,OAAQ,MAAM,WAAY,YAAY;AACtC,aAAO,IAAI,UAAU,MAAM,OAAO,MAAM,CAAC;AAAA,IAC7C;AAEA,WAAO,IAAI,UAAU,KAAK;AAAA,EAC9B;AACJ;ACxkCA,MAAMZ,SAAO,OAAO,CAAC;AAErB,SAAS,SAAS,OAAO;AACrB,MAAI,SAAS,MAAM;AACf,WAAO;AAAA,EACX;AACA,SAAO;AACX;AACA,SAAS,OAAO,OAAO;AACnB,MAAI,SAAS,MAAM;AACf,WAAO;AAAA,EACX;AACA,SAAO,MAAM,SAAQ;AACzB;AAMO,MAAM,QAAQ;AAAA;AAAA;AAAA;AAAA,EAIjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,UAAU,cAAc,sBAAsB;AACtD,qBAAiB,MAAM;AAAA,MACnB,UAAU,SAAS,QAAQ;AAAA,MAC3B,cAAc,SAAS,YAAY;AAAA,MACnC,sBAAsB,SAAS,oBAAoB;AAAA,IAC/D,CAAS;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAIA,SAAS;AACL,UAAM,EAAE,UAAU,cAAc,qBAAoB,IAAK;AACzD,WAAO;AAAA,MACH,OAAO;AAAA,MACP,UAAU,OAAO,QAAQ;AAAA,MACzB,cAAc,OAAO,YAAY;AAAA,MACjC,sBAAsB,OAAO,oBAAoB;AAAA,IAC7D;AAAA,EACI;AACJ;AAMO,SAAS,YAAY,KAAK;AAC7B,QAAM,SAAS,CAAA;AAEf,MAAI,IAAI,IAAI;AACR,WAAO,KAAK,IAAI;AAAA,EACpB;AACA,MAAI,IAAI,MAAM;AACV,WAAO,OAAO,IAAI;AAAA,EACtB;AACA,MAAI,IAAI,MAAM;AACV,WAAO,OAAO,QAAQ,IAAI,IAAI;AAAA,EAClC;AACA,QAAM,aAAa,qFAAqF,MAAM,GAAG;AACjH,aAAW,OAAO,YAAY;AAC1B,QAAI,EAAE,OAAO,QAAQ,IAAI,GAAG,KAAK,MAAM;AACnC;AAAA,IACJ;AACA,WAAO,GAAG,IAAI,UAAU,IAAI,GAAG,GAAG,WAAW,GAAG,EAAE;AAAA,EACtD;AACA,QAAM,aAAa,aAAa,MAAM,GAAG;AACzC,aAAW,OAAO,YAAY;AAC1B,QAAI,EAAE,OAAO,QAAQ,IAAI,GAAG,KAAK,MAAM;AACnC;AAAA,IACJ;AACA,WAAO,GAAG,IAAI,UAAU,IAAI,GAAG,GAAG,WAAW,GAAG,EAAE;AAAA,EACtD;AACA,MAAI,IAAI,YAAY;AAChB,WAAO,aAAa,cAAc,IAAI,UAAU;AAAA,EACpD;AACA,MAAI,IAAI,mBAAmB;AACvB,WAAO,oBAAoB,IAAI,kBAAkB,MAAK;AAAA,EAC1D;AACA,MAAI,cAAc,KAAK;AACnB,WAAO,WAAW,IAAI;AAAA,EAC1B;AACA,MAAI,oBAAoB,KAAK;AACzB,WAAO,iBAAiB,CAAC,CAAC,IAAI;AAAA,EAClC;AACA,MAAI,gBAAgB,KAAK;AACrB,WAAO,aAAa,IAAI;AAAA,EAC5B;AACA,MAAI,yBAAyB,OAAO,IAAI,qBAAqB;AACzD,WAAO,sBAAsB,IAAI,oBAAoB,MAAK;AAAA,EAC9D;AACA,MAAI,SAAS,KAAK;AACd,WAAO,MAAM,IAAI;AAAA,EACrB;AACA,MAAI,wBAAwB,KAAK;AAC7B,WAAO,qBAAqB,IAAI;AAAA,EACpC;AACA,MAAI,WAAW,OAAO,IAAI,OAAO;AAC7B,WAAO,QAAQ,IAAI,MAAM,IAAI,CAAC3O,OAAM;AAChC,UAAI,YAAYA,EAAC,GAAG;AAChB,eAAO,QAAQA,EAAC;AAAA,MACpB;AACA,aAAO,OAAO,OAAO,CAAA,GAAIA,EAAC;AAAA,IAC9B,CAAC;AAAA,EACL;AACA,SAAO;AACX;AAKO,MAAM,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,EAKf;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,OAAO,UAAU;AACzB,SAAK,gBAAgB,MAAM,aAAa,IAAI,CAAC,OAAO;AAChD,UAAI,OAAQ,OAAQ,UAAU;AAC1B,eAAO,IAAI,oBAAoB,IAAI,QAAQ;AAAA,MAC/C;AACA,aAAO;AAAA,IACX,CAAC;AACD,qBAAiB,MAAM;AAAA,MACnB;AAAA,MACA,MAAM,SAAS,MAAM,IAAI;AAAA,MACzB,QAAQ,MAAM;AAAA,MACd,WAAW,MAAM;AAAA,MACjB,YAAY,MAAM;AAAA,MAClB,uBAAuB,MAAM;AAAA,MAC7B,OAAO,MAAM;AAAA,MACb,YAAY,MAAM;AAAA,MAClB,UAAU,MAAM;AAAA,MAChB,SAAS,MAAM;AAAA,MACf,aAAa,MAAM;AAAA,MACnB,eAAe,MAAM;AAAA,MACrB,OAAO,MAAM;AAAA,MACb,YAAY,SAAS,MAAM,UAAU;AAAA,MACrC,WAAW,MAAM;AAAA,MACjB,eAAe,SAAS,MAAM,aAAa;AAAA,MAC3C,WAAW,MAAM;AAAA,MACjB,cAAc,MAAM;AAAA,IAChC,CAAS;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,eAAe;AACf,WAAO,KAAK,cAAc,IAAI,CAAC,OAAO;AAClC,UAAI,OAAQ,OAAQ,UAAU;AAC1B,eAAO;AAAA,MACX;AACA,aAAO,GAAG;AAAA,IACd,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAI,yBAAyB;AACzB,UAAM,MAAM,KAAK,cAAc,MAAK;AAEpC,QAAI,IAAI,WAAW,GAAG;AAClB,aAAO,CAAA;AAAA,IACX;AAEA,WAAO,OAAQ,IAAI,CAAC,MAAO,UAAU,uDAAuD,yBAAyB;AAAA,MACjH,WAAW;AAAA,IACvB,CAAS;AACD,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAIA,SAAS;AACL,UAAM,EAAE,eAAe,YAAY,WAAW,UAAU,SAAS,MAAAoF,OAAM,OAAO,YAAY,OAAO,QAAAuK,SAAQ,YAAY,uBAAuB,WAAW,cAAc,WAAW,aAAY,IAAK;AACjM,WAAO;AAAA,MACH,OAAO;AAAA,MACP,eAAe,OAAO,aAAa;AAAA,MACnC,YAAY,OAAO,UAAU;AAAA,MAC7B;AAAA,MACA,UAAU,OAAO,QAAQ;AAAA,MACzB,SAAS,OAAO,OAAO;AAAA,MACvB,aAAa,OAAO,KAAK,WAAW;AAAA,MACpC,eAAe,OAAO,KAAK,aAAa;AAAA,MACxC,MAAAvK;AAAA,MAAM;AAAA,MAAO;AAAA,MAAY;AAAA,MAAO,QAAAuK;AAAA,MAAQ;AAAA,MAAY;AAAA,MACpD;AAAA,MAAuB;AAAA,MAAW;AAAA,MAClC;AAAA,IACZ;AAAA,EACI;AAAA,EACA,CAAC,OAAO,QAAQ,IAAI;AAChB,QAAI,QAAQ;AACZ,UAAM,MAAM,KAAK;AACjB,WAAO;AAAA,MACH,MAAM,MAAM;AACR,YAAI,QAAQ,KAAK,QAAQ;AACrB,iBAAO;AAAA,YACH,OAAO,IAAI,OAAO;AAAA,YAAG,MAAM;AAAA,UACnD;AAAA,QACgB;AACA,eAAO,EAAE,OAAO,QAAW,MAAM,KAAI;AAAA,MACzC;AAAA,IACZ;AAAA,EACI;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,SAAS;AAAE,WAAO,KAAK,cAAc;AAAA,EAAQ;AAAA;AAAA;AAAA;AAAA,EAIjD,IAAI,OAAO;AACP,QAAI,KAAK,aAAa,MAAM;AACxB,aAAO;AAAA,IACX;AACA,WAAO,IAAI,KAAK,KAAK,YAAY,GAAI;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,eAAe,aAAa;AAE9B,QAAI,KAAK;AACT,QAAI,OAAQ,gBAAiB,UAAU;AACnC,WAAK,KAAK,cAAc,WAAW;AAAA,IACvC,OACK;AACD,YAAMvK,QAAO,YAAY,YAAW;AACpC,iBAAW,KAAK,KAAK,eAAe;AAChC,YAAI,OAAQ,MAAO,UAAU;AACzB,cAAI,MAAMA,OAAM;AACZ;AAAA,UACJ;AACA,eAAK;AACL;AAAA,QACJ,OACK;AACD,cAAI,EAAE,SAASA,OAAM;AACjB;AAAA,UACJ;AACA,eAAK;AACL;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AACA,QAAI,MAAM,MAAM;AACZ,YAAM,IAAI,MAAM,YAAY;AAAA,IAChC;AACA,QAAI,OAAQ,OAAQ,UAAU;AAC1B,aAAQ,MAAM,KAAK,SAAS,eAAe,EAAE;AAAA,IACjD,OACK;AACD,aAAO;AAAA,IACX;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,yBAAyB,aAAa;AAClC,UAAM,MAAM,KAAK;AACjB,QAAI,OAAQ,gBAAiB,UAAU;AACnC,aAAO,IAAI,WAAW;AAAA,IAC1B;AACA,kBAAc,YAAY,YAAW;AACrC,eAAW,MAAM,KAAK;AAClB,UAAI,GAAG,SAAS,aAAa;AACzB,eAAO;AAAA,MACX;AAAA,IACJ;AACA,mBAAe,OAAO,2BAA2B,eAAe,WAAW;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AAAE,WAAO,CAAC,CAAC,KAAK;AAAA,EAAM;AAAA;AAAA;AAAA;AAAA,EAIhC,WAAW;AACP,WAAO,CAAC,CAAC,KAAK;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAIA,gBAAgB;AACZ,QAAI,CAAC,KAAK,WAAW;AACjB,YAAM,IAAI,MAAM,EAAE;AAAA,IACtB;AACA,WAAO,0BAA0B,IAAI;AAAA,EACzC;AACJ;AAQO,MAAM,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,EAKb;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA,YAAY,KAAK,UAAU;AACvB,SAAK,WAAW;AAChB,UAAM,SAAS,OAAO,OAAO,IAAI,OAAO,OAAO;AAC/C,qBAAiB,MAAM;AAAA,MACnB,iBAAiB,IAAI;AAAA,MACrB,WAAW,IAAI;AAAA,MACf,aAAa,IAAI;AAAA,MACjB,SAAS,IAAI;AAAA,MACb,SAAS,IAAI;AAAA,MACb,MAAM,IAAI;AAAA,MACV;AAAA,MACA,OAAO,IAAI;AAAA,MACX,kBAAkB,IAAI;AAAA,IAClC,CAAS;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAIA,SAAS;AACL,UAAM,EAAE,SAAS,WAAW,aAAa,MAAM,OAAO,SAAS,QAAQ,iBAAiB,iBAAgB,IAAK;AAC7G,WAAO;AAAA,MACH,OAAO;AAAA,MACP;AAAA,MAAS;AAAA,MAAW;AAAA,MAAa;AAAA,MAAM;AAAA,MACvC;AAAA,MAAS;AAAA,MAAQ;AAAA,MAAiB;AAAA,IAC9C;AAAA,EACI;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,WAAW;AACb,UAAM,QAAQ,MAAM,KAAK,SAAS,SAAS,KAAK,SAAS;AACzD,WAAO,CAAC,CAAC,OAAO,8BAA8B,iBAAiB,CAAA,CAAE;AACjE,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,iBAAiB;AACnB,UAAM,KAAK,MAAM,KAAK,SAAS,eAAe,KAAK,eAAe;AAClE,WAAO,CAAC,CAAC,IAAI,8BAA8B,iBAAiB,CAAA,CAAE;AAC9D,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBAAwB;AAC1B,UAAM,UAAU,MAAM,KAAK,SAAS,sBAAsB,KAAK,eAAe;AAC9E,WAAO,CAAC,CAAC,SAAS,sCAAsC,iBAAiB,CAAA,CAAE;AAC3E,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAIA,eAAe;AACX,WAAO,uBAAuB,IAAI;AAAA,EACtC;AACJ;AAoBO,MAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA,EAK5B;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA,EAIA,YAAY,IAAI,UAAU;AACtB,SAAK,QAAQ,OAAO,OAAO,GAAG,KAAK,IAAI,CAAC,QAAQ;AAC5C,aAAO,IAAI,IAAI,KAAK,QAAQ;AAAA,IAChC,CAAC,CAAC;AACF,QAAI,WAAWuJ;AACf,QAAI,GAAG,qBAAqB,MAAM;AAC9B,iBAAW,GAAG;AAAA,IAClB,WACS,GAAG,YAAY,MAAM;AAC1B,iBAAW,GAAG;AAAA,IAClB;AACA,qBAAiB,MAAM;AAAA,MACnB;AAAA,MACA,IAAI,GAAG;AAAA,MACP,MAAM,GAAG;AAAA,MACT,iBAAiB,GAAG;AAAA,MACpB,MAAM,GAAG;AAAA,MACT,OAAO,GAAG;AAAA,MACV,WAAW,GAAG;AAAA,MACd,aAAa,GAAG;AAAA,MAChB,WAAW,GAAG;AAAA,MACd,SAAS,GAAG;AAAA,MACZ,mBAAmB,GAAG;AAAA,MACtB,aAAa,GAAG;AAAA,MAChB;AAAA,MACA,cAAc,GAAG;AAAA,MACjB,MAAM,GAAG;AAAA;AAAA,MAET,QAAQ,GAAG;AAAA,MACX,MAAM,GAAG;AAAA,IACrB,CAAS;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,OAAO;AAAE,WAAO,KAAK;AAAA,EAAO;AAAA;AAAA;AAAA;AAAA,EAIhC,SAAS;AACL,UAAM;AAAA,MAAE;AAAA,MAAI;AAAA,MAAM;AAAA,MAAiB,MAAAvJ;AAAA,MAAM;AAAA,MAAO;AAAA,MAAW;AAAA,MAAa;AAAA,MAAW;AAAA;AAAA,MACnF;AAAA,MAAQ;AAAA,IAAI,IAAK;AACjB,WAAO;AAAA,MACH,OAAO;AAAA,MACP;AAAA,MAAW;AAAA;AAAA,MAEX;AAAA,MACA,mBAAmB,OAAO,KAAK,iBAAiB;AAAA,MAChD;AAAA,MACA,UAAU,OAAO,KAAK,QAAQ;AAAA,MAC9B,aAAa,OAAO,KAAK,WAAW;AAAA,MACpC,cAAc,OAAO,KAAK,YAAY;AAAA,MACtC,SAAS,OAAO,KAAK,OAAO;AAAA,MAC5B,MAAAA;AAAA,MAAM;AAAA,MAAO;AAAA,MAAM;AAAA,MAAW;AAAA,MAAM;AAAA,MAAQ;AAAA,IACxD;AAAA,EACI;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,SAAS;AAAE,WAAO,KAAK,KAAK;AAAA,EAAQ;AAAA,EACxC,CAAC,OAAO,QAAQ,IAAI;AAChB,QAAI,QAAQ;AACZ,WAAO;AAAA,MACH,MAAM,MAAM;AACR,YAAI,QAAQ,KAAK,QAAQ;AACrB,iBAAO,EAAE,OAAO,KAAK,KAAK,OAAO,GAAG,MAAM,MAAK;AAAA,QACnD;AACA,eAAO,EAAE,OAAO,QAAW,MAAM,KAAI;AAAA,MACzC;AAAA,IACZ;AAAA,EACI;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,MAAM;AACN,WAAO,KAAK,UAAU,KAAK;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,WAAW;AACb,UAAM,QAAQ,MAAM,KAAK,SAAS,SAAS,KAAK,SAAS;AACzD,QAAI,SAAS,MAAM;AACf,YAAM,IAAI,MAAM,MAAM;AAAA,IAC1B;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,iBAAiB;AACnB,UAAM,KAAK,MAAM,KAAK,SAAS,eAAe,KAAK,IAAI;AACvD,QAAI,MAAM,MAAM;AACZ,YAAM,IAAI,MAAM,MAAM;AAAA,IAC1B;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAY;AACd,WAAQ,MAAM,KAAK,SAAS,qBAAqB,KAAK,IAAI;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,gBAAgB;AAClB,WAAQ,MAAM,KAAK,SAAS,eAAc,IAAM,KAAK,cAAc;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA,EAIA,eAAe;AACX,WAAO,+BAA+B,IAAI;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAIA,eAAe,OAAO;AAClB,WAAO,CAAC,SAAS,MAAM,QAAO,GAAI,iDAAiD,yBAAyB,EAAE,WAAW,yBAAyB;AAClJ,WAAO,iCAAiC,MAAM,KAAK;AAAA,EACvD;AACJ;AAUO,MAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA,EAK7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA,EAIA,YAAY,IAAI,UAAU;AACtB,SAAK,WAAW;AAChB,SAAK,cAAe,GAAG,eAAe,OAAQ,GAAG,cAAc;AAC/D,SAAK,YAAa,GAAG,aAAa,OAAQ,GAAG,YAAY;AACzD,SAAK,OAAO,GAAG;AACf,SAAK,QAAQ,GAAG;AAChB,SAAK,OAAO,GAAG;AACf,SAAK,OAAO,GAAG;AACf,SAAK,KAAK,GAAG,MAAM;AACnB,SAAK,WAAW,GAAG;AACnB,SAAK,QAAQ,GAAG;AAChB,SAAK,OAAO,GAAG;AACf,SAAK,QAAQ,GAAG;AAChB,SAAK,WAAW,GAAG;AACnB,SAAK,uBAAwB,GAAG,wBAAwB,OAAQ,GAAG,uBAAuB;AAC1F,SAAK,eAAgB,GAAG,gBAAgB,OAAQ,GAAG,eAAe;AAClE,SAAK,mBAAoB,GAAG,oBAAoB,OAAQ,GAAG,mBAAmB;AAC9E,SAAK,UAAU,GAAG;AAClB,SAAK,YAAY,GAAG;AACpB,SAAK,aAAc,GAAG,cAAc,OAAQ,GAAG,aAAa;AAC5D,SAAK,sBAAuB,GAAG,uBAAuB,OAAQ,GAAG,sBAAsB;AACvF,SAAK,oBAAqB,GAAG,qBAAqB,OAAQ,GAAG,oBAAoB;AACjF,SAAK,cAAc;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAIA,SAAS;AACL,UAAM,EAAE,aAAa,WAAW,OAAO,MAAAA,OAAM,MAAA9E,OAAM,IAAI,MAAM,OAAO,MAAM,WAAW,YAAY,oBAAmB,IAAK;AACzH,WAAO;AAAA,MACH,OAAO;AAAA,MACP;AAAA,MAAY;AAAA,MAAa;AAAA,MACzB;AAAA,MACA,SAAS,OAAO,KAAK,OAAO;AAAA,MAC5B;AAAA,MAAM;AAAA,MACN,UAAU,OAAO,KAAK,QAAQ;AAAA,MAC9B,UAAU,OAAO,KAAK,QAAQ;AAAA,MAC9B,MAAA8E;AAAA,MACA,cAAc,OAAO,KAAK,YAAY;AAAA,MACtC,sBAAsB,OAAO,KAAK,oBAAoB;AAAA,MACtD,kBAAkB,OAAO,KAAK,gBAAgB;AAAA,MAC9C;AAAA,MAAO;AAAA,MAAW;AAAA,MAAI;AAAA,MAAO,MAAA9E;AAAA,MAC7B,OAAO,OAAO,KAAK,KAAK;AAAA,IACpC;AAAA,EACI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WAAW;AACb,QAAI,cAAc,KAAK;AACvB,QAAI,eAAe,MAAM;AACrB,YAAM,KAAK,MAAM,KAAK,eAAc;AACpC,UAAI,IAAI;AACJ,sBAAc,GAAG;AAAA,MACrB;AAAA,IACJ;AACA,QAAI,eAAe,MAAM;AACrB,aAAO;AAAA,IACX;AACA,UAAM,QAAQ,KAAK,SAAS,SAAS,WAAW;AAChD,QAAI,SAAS,MAAM;AACf,YAAM,IAAI,MAAM,MAAM;AAAA,IAC1B;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,iBAAiB;AACnB,WAAO,KAAK,SAAS,eAAe,KAAK,IAAI;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,gBAAgB;AAClB,QAAI,KAAK,eAAe,MAAM;AAC1B,YAAM,EAAE,IAAI,aAAAsP,aAAW,IAAK,MAAM,kBAAkB;AAAA,QAChD,IAAI,KAAK,eAAc;AAAA,QACvB,aAAa,KAAK,SAAS,eAAc;AAAA,MACzD,CAAa;AAED,UAAI,MAAM,QAAQ,GAAG,eAAe,MAAM;AACtC,eAAO;AAAA,MACX;AACA,aAAOA,eAAc,GAAG,cAAc;AAAA,IAC1C;AACA,UAAM,cAAc,MAAM,KAAK,SAAS,eAAc;AACtD,WAAO,cAAc,KAAK,cAAc;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,KAAK,WAAW,UAAU;AAC5B,UAAM,WAAY,aAAa,OAAQ,IAAI;AAC3C,UAAM,UAAW,YAAY,OAAQ,IAAI;AACzC,QAAI,aAAa,KAAK;AACtB,QAAI,WAAW;AACf,QAAI,eAAgB,eAAe,KAAM,OAAO;AAChD,UAAM,mBAAmB,YAAY;AAEjC,UAAI,cAAc;AACd,eAAO;AAAA,MACX;AACA,YAAM,EAAE,aAAa,MAAK,IAAK,MAAM,kBAAkB;AAAA,QACnD,aAAa,KAAK,SAAS,eAAc;AAAA,QACzC,OAAO,KAAK,SAAS,oBAAoB,KAAK,IAAI;AAAA,MAClE,CAAa;AAGD,UAAI,QAAQ,KAAK,OAAO;AACpB,qBAAa;AACb;AAAA,MACJ;AAEA,UAAI,cAAc;AACd,eAAO;AAAA,MACX;AACA,YAAM,QAAQ,MAAM,KAAK,eAAc;AACvC,UAAI,SAAS,MAAM,eAAe,MAAM;AACpC;AAAA,MACJ;AAGA,UAAI,aAAa,IAAI;AACjB,mBAAW,aAAa;AACxB,YAAI,WAAW,KAAK,aAAa;AAC7B,qBAAW,KAAK;AAAA,QACpB;AAAA,MACJ;AACA,aAAO,YAAY,aAAa;AAE5B,YAAI,cAAc;AACd,iBAAO;AAAA,QACX;AACA,cAAM,QAAQ,MAAM,KAAK,SAAS,SAAS,UAAU,IAAI;AAEzD,YAAI,SAAS,MAAM;AACf;AAAA,QACJ;AAEA,mBAAWxK,SAAQ,OAAO;AACtB,cAAIA,UAAS,KAAK,MAAM;AACpB;AAAA,UACJ;AAAA,QACJ;AAEA,iBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,gBAAM,KAAK,MAAM,MAAM,eAAe,CAAC;AACvC,cAAI,GAAG,SAAS,KAAK,QAAQ,GAAG,UAAU,KAAK,OAAO;AAElD,gBAAI,cAAc;AACd,qBAAO;AAAA,YACX;AACA,kBAAMyK,WAAU,MAAM,KAAK,SAAS,sBAAsB,GAAG,IAAI;AAEjE,gBAAIA,YAAW,MAAM;AACjB;AAAA,YACJ;AAEA,gBAAK,cAAcA,SAAQ,cAAc,IAAK,UAAU;AACpD;AAAA,YACJ;AAEA,gBAAI,SAAS;AACb,gBAAI,GAAG,SAAS,KAAK,QAAQ,GAAG,OAAO,KAAK,MAAM,GAAG,UAAU,KAAK,OAAO;AACvE,uBAAS;AAAA,YACb,WACS,GAAG,SAAS,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,UAAUlB,QAAM;AACjE,uBAAS;AAAA,YACb;AACA,mBAAO,OAAO,4BAA4B,wBAAwB;AAAA,cAC9D,WAAY,WAAW,cAAc,WAAW;AAAA,cAChD;AAAA,cACA,aAAa,GAAG,uBAAuB,UAAU;AAAA,cACjD,MAAM,GAAG;AAAA,cACT,SAAAkB;AAAA,YAC5B,CAAyB;AAAA,UACL;AAAA,QACJ;AACA;AAAA,MACJ;AACA;AAAA,IACJ;AACA,UAAM,eAAe,CAACA,aAAY;AAC9B,UAAIA,YAAW,QAAQA,SAAQ,WAAW,GAAG;AACzC,eAAOA;AAAA,MACX;AACA,aAAO,OAAO,kCAAkC,kBAAkB;AAAA,QAC9D,QAAQ;AAAA,QACR,MAAM;AAAA,QAAM,QAAQ;AAAA,QAAM,YAAY;AAAA,QAAM,QAAQ;AAAA,QACpD,aAAa;AAAA,UACT,IAAIA,SAAQ;AAAA,UACZ,MAAMA,SAAQ;AAAA,UACd,MAAM;AAAA;AAAA,QAC1B;AAAA,QAAmB,SAAAA;AAAA,MACnB,CAAa;AAAA,IACL;AACA,UAAM,UAAU,MAAM,KAAK,SAAS,sBAAsB,KAAK,IAAI;AACnE,QAAI,aAAa,GAAG;AAChB,aAAO,aAAa,OAAO;AAAA,IAC/B;AACA,QAAI,SAAS;AACT,UAAI,aAAa,KAAM,MAAM,QAAQ,cAAa,KAAO,UAAU;AAC/D,eAAO,aAAa,OAAO;AAAA,MAC/B;AAAA,IACJ,OACK;AAED,YAAM,iBAAgB;AAEtB,UAAI,aAAa,GAAG;AAChB,eAAO;AAAA,MACX;AAAA,IACJ;AACA,UAAM,SAAS,IAAI,QAAQ,CAAC,SAAS,WAAW;AAE5C,YAAM,aAAa,CAAA;AACnB,YAAM,SAAS,MAAM;AAAE,mBAAW,QAAQ,CAAC,MAAM,GAAG;AAAA,MAAG;AAEvD,iBAAW,KAAK,MAAM;AAAE,uBAAe;AAAA,MAAM,CAAC;AAE9C,UAAI,UAAU,GAAG;AACb,cAAM,QAAQ,WAAW,MAAM;AAC3B,iBAAM;AACN,iBAAO,UAAU,gCAAgC,SAAS,CAAC;AAAA,QAC/D,GAAG,OAAO;AACV,mBAAW,KAAK,MAAM;AAAE,uBAAa,KAAK;AAAA,QAAG,CAAC;AAAA,MAClD;AACA,YAAM,aAAa,OAAOA,aAAY;AAElC,YAAK,MAAMA,SAAQ,cAAa,KAAO,UAAU;AAC7C,iBAAM;AACN,cAAI;AACA,oBAAQ,aAAaA,QAAO,CAAC;AAAA,UACjC,SACO,OAAO;AACV,mBAAO,KAAK;AAAA,UAChB;AAAA,QACJ;AAAA,MACJ;AACA,iBAAW,KAAK,MAAM;AAAE,aAAK,SAAS,IAAI,KAAK,MAAM,UAAU;AAAA,MAAG,CAAC;AACnE,WAAK,SAAS,GAAG,KAAK,MAAM,UAAU;AAEtC,UAAI,cAAc,GAAG;AACjB,cAAM,kBAAkB,YAAY;AAChC,cAAI;AAEA,kBAAM,iBAAgB;AAAA,UAC1B,SACO,OAAO;AAEV,gBAAI,QAAQ,OAAO,sBAAsB,GAAG;AACxC,qBAAM;AACN,qBAAO,KAAK;AACZ;AAAA,YACJ;AAAA,UACJ;AAEA,cAAI,CAAC,cAAc;AACf,iBAAK,SAAS,KAAK,SAAS,eAAe;AAAA,UAC/C;AAAA,QACJ;AACA,mBAAW,KAAK,MAAM;AAAE,eAAK,SAAS,IAAI,SAAS,eAAe;AAAA,QAAG,CAAC;AACtE,aAAK,SAAS,KAAK,SAAS,eAAe;AAAA,MAC/C;AAAA,IACJ,CAAC;AACD,WAAO,MAAM;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,UAAU;AACN,WAAQ,KAAK,aAAa;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW;AACP,WAAQ,KAAK,SAAS;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW;AACP,WAAQ,KAAK,SAAS;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW;AACP,WAAQ,KAAK,SAAS;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW;AACP,WAAQ,KAAK,SAAS;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe;AACX,WAAO,KAAK,WAAW,yCAAyC,yBAAyB,EAAE,WAAW,iBAAiB;AACvH,WAAO,+BAA+B,IAAI;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,OAAO;AAClB,WAAO,KAAK,WAAW,yCAAyC,yBAAyB,EAAE,WAAW,iBAAiB;AACvH,WAAO,CAAC,SAAS,MAAM,QAAO,GAAI,iDAAiD,yBAAyB,EAAE,WAAW,iBAAiB;AAC1I,WAAO,iCAAiC,MAAM,KAAK;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,uBAAuB,YAAY;AAC/B,mBAAe,OAAO,UAAU,UAAU,KAAK,cAAc,GAAG,sBAAsB,cAAc,UAAU;AAC9G,UAAM,KAAK,IAAI,oBAAoB,MAAM,KAAK,QAAQ;AACtD,OAAG,cAAc;AACjB,WAAO;AAAA,EACX;AACJ;AACA,SAAS,0BAA0B,OAAO;AACtC,SAAO,EAAE,QAAQ,cAAc,MAAM,MAAM,MAAM,QAAQ,MAAM,OAAM;AACzE;AACA,SAAS,iCAAiC,IAAI,OAAO;AACjD,SAAO,EAAE,QAAQ,uBAAuB,IAAI,MAAK;AACrD;AACA,SAAS,+BAA+B,IAAI;AACxC,SAAO,EAAE,QAAQ,oBAAoB,GAAE;AAC3C;AACA,SAAS,uBAAuB,KAAK;AACjC,SAAO,EAAE,QAAQ,YAAY,KAAK;AAAA,IAC1B,iBAAiB,IAAI;AAAA,IACrB,WAAW,IAAI;AAAA,IACf,aAAa,IAAI;AAAA,IACjB,SAAS,IAAI;AAAA,IACb,MAAM,IAAI;AAAA,IACV,QAAQ,OAAO,OAAO,IAAI,OAAO,MAAK,CAAE;AAAA,IACxC,OAAO,IAAI;AAAA,EACvB,EAAS;AACT;AC1xCO,MAAM,iBAAiB,IAAI;AAAA;AAAA;AAAA;AAAA,EAI9B;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA,YAAY,KAAK,OAAO,UAAU;AAC9B,UAAM,KAAK,IAAI,QAAQ;AACvB,UAAM,OAAO,MAAM,eAAe,UAAU,IAAI,MAAM,IAAI,MAAM;AAChE,qBAAiB,MAAM,EAAE,MAAM,UAAU,WAAW,OAAO;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,YAAY;AAAE,WAAO,KAAK,SAAS;AAAA,EAAM;AAAA;AAAA;AAAA;AAAA,EAI7C,IAAI,iBAAiB;AAAE,WAAO,KAAK,SAAS,OAAM;AAAA,EAAI;AAC1D;AAIO,MAAM,0BAA0B,IAAI;AAAA;AAAA;AAAA;AAAA,EAIvC;AAAA;AAAA;AAAA;AAAA,EAIA,YAAY,KAAK,OAAO;AACpB,UAAM,KAAK,IAAI,QAAQ;AACvB,qBAAiB,MAAM,EAAE,OAAO;AAAA,EACpC;AACJ;AAKO,MAAM,mCAAmC,mBAAmB;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAIA,YAAY,OAAO,UAAU,IAAI;AAC7B,UAAM,IAAI,QAAQ;AAClB,SAAK,SAAS;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAO;AACP,WAAO,MAAM,KAAK,IAAI,CAAC,QAAQ;AAC3B,YAAM,WAAW,IAAI,OAAO,SAAS,KAAK,OAAO,SAAS,IAAI,OAAO,CAAC,CAAC,IAAI;AAC3E,UAAI,UAAU;AACV,YAAI;AACA,iBAAO,IAAI,SAAS,KAAK,KAAK,QAAQ,QAAQ;AAAA,QAClD,SACO,OAAO;AACV,iBAAO,IAAI,kBAAkB,KAAK,KAAK;AAAA,QAC3C;AAAA,MACJ;AACA,aAAO;AAAA,IACX,CAAC;AAAA,EACL;AACJ;AAKO,MAAM,oCAAoC,oBAAoB;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAIA,YAAY,OAAO,UAAU,IAAI;AAC7B,UAAM,IAAI,QAAQ;AAClB,SAAK,SAAS;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,KAAK,UAAU,SAAS;AAC1B,UAAM,UAAU,MAAM,MAAM,KAAK,UAAU,OAAO;AAClD,QAAI,WAAW,MAAM;AACjB,aAAO;AAAA,IACX;AACA,WAAO,IAAI,2BAA2B,KAAK,QAAQ,KAAK,UAAU,OAAO;AAAA,EAC7E;AACJ;AAKO,MAAM,oCAAoC,aAAa;AAAA;AAAA;AAAA;AAAA,EAI1D;AAAA;AAAA;AAAA;AAAA,EAIA,YAAY,UAAU,UAAU,QAAQ,KAAK;AACzC,UAAM,UAAU,UAAU,MAAM;AAChC,qBAAiB,MAAM,EAAE,KAAK;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,WAAW;AACb,WAAO,MAAM,KAAK,IAAI,SAAQ;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,iBAAiB;AACnB,WAAO,MAAM,KAAK,IAAI,eAAc;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,wBAAwB;AAC1B,WAAO,MAAM,KAAK,IAAI,sBAAqB;AAAA,EAC/C;AACJ;AAKO,MAAM,6BAA6B,4BAA4B;AAAA;AAAA;AAAA;AAAA,EAIlE,YAAY,UAAU,UAAU,QAAQ,UAAU,MAAM;AACpD,UAAM,UAAU,UAAU,QAAQ,IAAI,SAAS,MAAM,SAAS,WAAW,QAAQ,CAAC;AAClF,UAAM,OAAO,SAAS,UAAU,eAAe,UAAU,KAAK,IAAI,MAAM,KAAK,IAAI,MAAM;AACvF,qBAAiB,MAAM,EAAE,MAAM,SAAQ,CAAE;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,YAAY;AACZ,WAAO,KAAK,SAAS;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,iBAAiB;AACjB,WAAO,KAAK,SAAS,OAAM;AAAA,EAC/B;AACJ;ACxKA,MAAM,OAAO,OAAO,CAAC;AACrB,SAAS,QAAQ,OAAO;AACpB,SAAQ,SAAS,OAAQ,MAAM,SAAU;AAC7C;AACA,SAAS,YAAY,OAAO;AACxB,SAAQ,SAAS,OAAQ,MAAM,gBAAiB;AACpD;AACA,SAAS,WAAW,OAAO;AACvB,SAAQ,SAAS,OAAQ,MAAM,gBAAiB;AACpD;AACA,SAAS,QAAQ,OAAO;AACpB,SAAQ,SAAS,OAAQ,MAAM,oBAAqB;AACxD;AACA,SAAS,YAAY,OAAO;AACxB,MAAI,SAAS,MAAM;AACf,QAAI,WAAW,KAAK,GAAG;AACnB,aAAO;AAAA,IACX;AACA,QAAI,MAAM,UAAU;AAChB,aAAO,MAAM;AAAA,IACjB;AAAA,EACJ;AACA,SAAO;AACX;AACA,MAAM,oBAAoB;AAAA,EACtB;AAAA,EACA;AAAA,EACA,YAAY,UAAU,UAAU,MAAM;AAClC,qBAAiB,MAAM,EAAE,UAAU;AACnC,QAAI,SAAS,OAAO,SAAS,KAAK,QAAQ;AACtC,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACxC;AAEA,UAAM,SAAS,UAAU,SAAS,QAAQ,aAAa;AACvD,UAAM,WAAW,WAAW,MAAM,IAAI,SAAS;AAC/C,SAAK,UAAW,iBAAkB;AAC9B,YAAM,eAAe,MAAM,QAAQ,IAAI,SAAS,OAAO,IAAI,CAAC,OAAO,UAAU;AACzE,cAAM,MAAM,KAAK,KAAK;AACtB,YAAI,OAAO,MAAM;AACb,iBAAO;AAAA,QACX;AACA,eAAO,MAAM,UAAU,KAAK,KAAK,GAAG,CAACvP,OAAM,UAAU;AACjD,cAAIA,UAAS,WAAW;AACpB,gBAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,qBAAO,QAAQ,IAAI,MAAM,IAAI,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC,CAAC;AAAA,YACpE;AACA,mBAAO,eAAe,OAAO,QAAQ;AAAA,UACzC;AACA,iBAAO;AAAA,QACX,CAAC;AAAA,MACL,CAAC,CAAC;AACF,aAAO,SAAS,UAAU,mBAAmB,UAAU,YAAY;AAAA,IACvE,EAAC;AAAA,EACL;AAAA,EACA,iBAAiB;AACb,WAAO,KAAK;AAAA,EAChB;AACJ;AAOA,SAAS,UAAU,OAAO,SAAS;AAC/B,MAAI,SAAS,MAAM;AACf,WAAO;AAAA,EACX;AACA,MAAI,OAAQ,MAAM,OAAO,MAAO,YAAY;AACxC,WAAO;AAAA,EACX;AACA,MAAI,MAAM,YAAY,OAAQ,MAAM,SAAS,OAAO,MAAO,YAAY;AACnE,WAAO,MAAM;AAAA,EACjB;AACA,SAAO;AACX;AACA,SAAS,YAAY,OAAO;AACxB,MAAI,SAAS,MAAM;AACf,WAAO;AAAA,EACX;AACA,SAAO,MAAM,YAAY;AAC7B;AAIO,eAAe,cAAc,KAAK,SAAS;AAE9C,QAAM,aAAa,MAAM,YAAY,KAAK,WAAW;AACrD,iBAAe,OAAQ,eAAgB,UAAU,+BAA+B,aAAa,GAAG;AAEhG,QAAM,YAAY,YAAY,UAAU;AACxC,iBAAe,UAAU,MAAM,SAAS,WAAW,CAAA,GAAI,QAAQ,IAAI,KAAK,GAAG,sBAAsB,gBAAgB,UAAU,EAAE;AAC7H,iBAAe,UAAU,QAAQ,SAAS,WAAW,CAAA,GAAI,QAAQ,MAAM,KAAK,GAAG,wBAAwB,kBAAkB,UAAU,IAAI;AAEvI,MAAI,UAAU,MAAM;AAChB,cAAU,OAAO,UAAU;AAAA,EAC/B;AACA,SAAO;AACX;AAIO,eAAe,YAAY,SAAS,QAAQ,MAAM;AAErD,QAAM,SAAS,UAAU,SAAS,aAAa;AAC/C,QAAM,WAAW,WAAW,MAAM,IAAI,SAAS;AAC/C,SAAO,MAAM,QAAQ,IAAI,OAAO,IAAI,CAAC,OAAO,UAAU;AAClD,WAAO,MAAM,UAAU,KAAK,KAAK,GAAG,CAACA,OAAM,UAAU;AACjD,cAAQ,MAAM,YAAY,OAAOA,KAAI;AACrC,UAAIA,UAAS,WAAW;AACpB,eAAO,eAAe,OAAO,QAAQ;AAAA,MACzC;AACA,aAAO;AAAA,IACX,CAAC;AAAA,EACL,CAAC,CAAC;AACN;AACA,SAAS,qBAAqB,UAAU;AACpC,QAAM,sBAAsB,eAAgB,WAAW;AAEnD,UAAM,KAAM,MAAM,cAAc,WAAW,CAAC,MAAM,CAAC;AACnD,OAAG,KAAK,MAAM,SAAS,WAAU;AACjC,QAAI,GAAG,MAAM;AACT,SAAG,OAAO,MAAM,eAAe,GAAG,MAAM,YAAY,SAAS,MAAM,CAAC;AAAA,IACxE;AACA,UAAM,QAAQ,SAAS;AACvB,UAAM,UAAW,UAAW,GAAG,SAAS,MAAO,iBAAiB,MAAM;AACtE,UAAM,UAAW,GAAG,QAAQ,UAAU;AACtC,QAAI,MAAM,YAAY,CAAC,MAAM,SAAS,WAAW,MAAM,WAAW,CAAC,UAAU,CAAC,SAAS;AACnF,qBAAe,OAAO,qEAAqE,aAAa,SAAS;AAAA,IACrH;AACA,mBAAe,MAAM,YAAY,QAAQ,6CAA6C,kBAAkB,GAAG,IAAI;AAE/G,UAAM,UAAU,MAAM,WAAY,MAAM,YAAY,MAAM,SAAS;AACnE,mBAAe,WAAW,SAAS,6CAA6C,mBAAmB,GAAG,KAAK;AAE3G,mBAAe,MAAM,YAAY,QAAQ,6CAA6C,kBAAkB,GAAG,IAAI;AAC/G,WAAO;AAAA,EACX;AACA,QAAM,aAAa,eAAgB,WAAW;AAC1C,UAAM,SAAS,UAAU,SAAS,QAAQ,MAAM;AAChD,WAAO,QAAQ,MAAM,GAAG,4CAA4C,yBAAyB,EAAE,WAAW,QAAQ;AAClH,UAAM,KAAK,MAAM,oBAAoB,SAAS;AAC9C,QAAI;AACA,aAAO,MAAM,OAAO,KAAK,EAAE;AAAA,IAC/B,SACO,OAAO;AACV,UAAI,gBAAgB,KAAK,KAAK,MAAM,MAAM;AACtC,cAAM,SAAS,UAAU,UAAU,MAAM,MAAM,EAAE;AAAA,MACrD;AACA,YAAM;AAAA,IACV;AAAA,EACJ;AACA,QAAM,OAAO,eAAgB,WAAW;AACpC,UAAM,SAAS,SAAS;AACxB,WAAO,QAAQ,MAAM,GAAG,yDAAyD,yBAAyB,EAAE,WAAW,mBAAmB;AAC1I,UAAM,KAAK,MAAM,OAAO,gBAAgB,MAAM,oBAAoB,SAAS,CAAC;AAC5E,UAAM,WAAW,YAAY,SAAS,MAAM;AAG5C,WAAO,IAAI,4BAA4B,SAAS,WAAW,UAAU,EAAE;AAAA,EAC3E;AACA,QAAM,cAAc,eAAgB,WAAW;AAC3C,UAAM,SAAS,UAAU,SAAS,QAAQ,aAAa;AACvD,WAAO,YAAY,MAAM,GAAG,mDAAmD,yBAAyB,EAAE,WAAW,eAAe;AACpI,WAAO,MAAM,OAAO,YAAY,MAAM,oBAAoB,SAAS,CAAC;AAAA,EACxE;AACA,QAAM,SAAS,OAAO,cAAc;AAChC,WAAO,MAAM,KAAK,SAAS;AAAA,EAC/B;AACA,mBAAiB,QAAQ;AAAA,IACrB,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IAAM;AAAA,EACd,CAAK;AACD,SAAO;AACX;AACA,SAAS,mBAAmB,UAAU,KAAK;AACvC,QAAM,cAAc,YAAa,MAAM;AACnC,UAAM,WAAW,SAAS,UAAU,YAAY,KAAK,IAAI;AACzD,WAAO,UAAU,wBAAwB,yBAAyB;AAAA,MAC9D,WAAW;AAAA,MACX,MAAM,EAAE,KAAK,KAAI;AAAA,IAC7B,CAAS;AACD,WAAO;AAAA,EACX;AACA,QAAM,sBAAsB,kBAAmB,MAAM;AACjD,UAAM,WAAW,YAAY,GAAG,IAAI;AAEpC,QAAI,YAAY,CAAA;AAChB,QAAI,SAAS,OAAO,SAAS,MAAM,KAAK,QAAQ;AAC5C,kBAAY,MAAM,cAAc,KAAK,IAAG,CAAE;AAC1C,UAAI,UAAU,MAAM;AAChB,kBAAU,OAAO,MAAM,eAAe,UAAU,MAAM,YAAY,SAAS,MAAM,CAAC;AAAA,MACtF;AAAA,IACJ;AACA,QAAI,SAAS,OAAO,WAAW,KAAK,QAAQ;AACxC,YAAM,IAAI,MAAM,4EAA4E;AAAA,IAChG;AACA,UAAM,eAAe,MAAM,YAAY,SAAS,QAAQ,SAAS,QAAQ,IAAI;AAC7E,WAAO,OAAO,OAAO,CAAA,GAAI,WAAW,MAAM,kBAAkB;AAAA,MACxD,IAAI,SAAS,WAAU;AAAA,MACvB,MAAM,SAAS,UAAU,mBAAmB,UAAU,YAAY;AAAA,IAC9E,CAAS,CAAC;AAAA,EACN;AACA,QAAM,aAAa,kBAAmB,MAAM;AACxC,UAAM,SAAS,MAAM,iBAAiB,GAAG,IAAI;AAC7C,QAAI,OAAO,WAAW,GAAG;AACrB,aAAO,OAAO,CAAC;AAAA,IACnB;AACA,WAAO;AAAA,EACX;AACA,QAAM,OAAO,kBAAmB,MAAM;AAClC,UAAM,SAAS,SAAS;AACxB,WAAO,QAAQ,MAAM,GAAG,yDAAyD,yBAAyB,EAAE,WAAW,mBAAmB;AAC1I,UAAM,KAAK,MAAM,OAAO,gBAAgB,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAC1E,UAAM,WAAW,YAAY,SAAS,MAAM;AAG5C,WAAO,IAAI,4BAA4B,SAAS,WAAW,UAAU,EAAE;AAAA,EAC3E;AACA,QAAM,cAAc,kBAAmB,MAAM;AACzC,UAAM,SAAS,UAAU,SAAS,QAAQ,aAAa;AACvD,WAAO,YAAY,MAAM,GAAG,mDAAmD,yBAAyB,EAAE,WAAW,eAAe;AACpI,WAAO,MAAM,OAAO,YAAY,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAAA,EACtE;AACA,QAAM,mBAAmB,kBAAmB,MAAM;AAC9C,UAAM,SAAS,UAAU,SAAS,QAAQ,MAAM;AAChD,WAAO,QAAQ,MAAM,GAAG,4CAA4C,yBAAyB,EAAE,WAAW,QAAQ;AAClH,UAAM,KAAK,MAAM,oBAAoB,GAAG,IAAI;AAC5C,QAAI,SAAS;AACb,QAAI;AACA,eAAS,MAAM,OAAO,KAAK,EAAE;AAAA,IACjC,SACO,OAAO;AACV,UAAI,gBAAgB,KAAK,KAAK,MAAM,MAAM;AACtC,cAAM,SAAS,UAAU,UAAU,MAAM,MAAM,EAAE;AAAA,MACrD;AACA,YAAM;AAAA,IACV;AACA,UAAM,WAAW,YAAY,GAAG,IAAI;AACpC,WAAO,SAAS,UAAU,qBAAqB,UAAU,MAAM;AAAA,EACnE;AACA,QAAM,SAAS,UAAU,SAAS;AAC9B,UAAM,WAAW,YAAY,GAAG,IAAI;AACpC,QAAI,SAAS,UAAU;AACnB,aAAO,MAAM,WAAW,GAAG,IAAI;AAAA,IACnC;AACA,WAAO,MAAM,KAAK,GAAG,IAAI;AAAA,EAC7B;AACA,mBAAiB,QAAQ;AAAA,IACrB,MAAM,SAAS,UAAU,gBAAgB,GAAG;AAAA,IAC5C,WAAW;AAAA,IAAU,MAAM;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAAM;AAAA,IAAY;AAAA,EAC1B,CAAK;AAED,SAAO,eAAe,QAAQ,YAAY;AAAA,IACtC,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,KAAK,MAAM;AACP,YAAM,WAAW,SAAS,UAAU,YAAY,GAAG;AACnD,aAAO,UAAU,wBAAwB,yBAAyB;AAAA,QAC9D,WAAW;AAAA,QACX,MAAM,EAAE,IAAG;AAAA,MAC3B,CAAa;AACD,aAAO;AAAA,IACX;AAAA,EACR,CAAK;AACD,SAAO;AACX;AACA,SAAS,kBAAkB,UAAU,KAAK;AACtC,QAAM,cAAc,YAAa,MAAM;AACnC,UAAM,WAAW,SAAS,UAAU,SAAS,KAAK,IAAI;AACtD,WAAO,UAAU,wBAAwB,yBAAyB;AAAA,MAC9D,WAAW;AAAA,MACX,MAAM,EAAE,KAAK,KAAI;AAAA,IAC7B,CAAS;AACD,WAAO;AAAA,EACX;AACA,QAAM,SAAS,YAAa,MAAM;AAC9B,WAAO,IAAI,oBAAoB,UAAU,YAAY,GAAG,IAAI,GAAG,IAAI;AAAA,EACvE;AACA,mBAAiB,QAAQ;AAAA,IACrB,MAAM,SAAS,UAAU,aAAa,GAAG;AAAA,IACzC,WAAW;AAAA,IAAU,MAAM;AAAA,IAC3B;AAAA,EACR,CAAK;AAED,SAAO,eAAe,QAAQ,YAAY;AAAA,IACtC,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,KAAK,MAAM;AACP,YAAM,WAAW,SAAS,UAAU,SAAS,GAAG;AAChD,aAAO,UAAU,wBAAwB,yBAAyB;AAAA,QAC9D,WAAW;AAAA,QACX,MAAM,EAAE,IAAG;AAAA,MAC3B,CAAa;AACD,aAAO;AAAA,IACX;AAAA,EACR,CAAK;AACD,SAAO;AACX;AAKA,MAAM,WAAW,OAAO,IAAI,0BAA0B;AACtD,MAAM,iBAAiB,oBAAI,QAAO;AAClC,SAAS,YAAY,UAAU,QAAQ;AACnC,iBAAe,IAAI,SAAS,QAAQ,GAAG,MAAM;AACjD;AACA,SAAS,YAAY,UAAU;AAC3B,SAAO,eAAe,IAAI,SAAS,QAAQ,CAAC;AAChD;AACA,SAAS,WAAW,OAAO;AACvB,SAAQ,SAAS,OAAQ,UAAW,YAAa,oBAAoB,SAChE,OAAQ,MAAM,mBAAoB,cAAe,MAAM;AAChE;AACA,eAAe,WAAW,UAAU,OAAO;AACvC,MAAI;AACJ,MAAI,WAAW;AAGf,MAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,UAAM,eAAe,SAAUE,OAAM;AACjC,UAAI,YAAYA,OAAM,EAAE,GAAG;AACvB,eAAOA;AAAA,MACX;AACA,YAAMsP,YAAW,SAAS,UAAU,SAAStP,KAAI;AACjD,qBAAesP,WAAU,oBAAoB,QAAQtP,KAAI;AACzD,aAAOsP,UAAS;AAAA,IACpB;AAEA,aAAS,MAAM,IAAI,CAAC,MAAM;AACtB,UAAI,KAAK,MAAM;AACX,eAAO;AAAA,MACX;AACA,UAAI,MAAM,QAAQ,CAAC,GAAG;AAClB,eAAO,EAAE,IAAI,YAAY;AAAA,MAC7B;AACA,aAAO,aAAa,CAAC;AAAA,IACzB,CAAC;AAAA,EACL,WACS,UAAU,KAAK;AACpB,aAAS,CAAC,IAAI;AAAA,EAClB,WACS,OAAQ,UAAW,UAAU;AAClC,QAAI,YAAY,OAAO,EAAE,GAAG;AAExB,eAAS,CAAC,KAAK;AAAA,IACnB,OACK;AAED,iBAAW,SAAS,UAAU,SAAS,KAAK;AAC5C,qBAAe,UAAU,oBAAoB,SAAS,KAAK;AAC3D,eAAS,CAAC,SAAS,SAAS;AAAA,IAChC;AAAA,EACJ,WACS,WAAW,KAAK,GAAG;AAExB,aAAS,MAAM,MAAM,eAAc;AAAA,EACvC,WACS,cAAc,OAAO;AAE1B,eAAW,MAAM;AACjB,aAAS,CAAC,SAAS,SAAS;AAAA,EAChC,OACK;AACD,mBAAe,OAAO,sBAAsB,SAAS,KAAK;AAAA,EAC9D;AAEA,WAAS,OAAO,IAAI,CAAC,MAAM;AACvB,QAAI,KAAK,MAAM;AACX,aAAO;AAAA,IACX;AACA,QAAI,MAAM,QAAQ,CAAC,GAAG;AAClB,YAAM,QAAQ,MAAM,KAAK,IAAI,IAAI,EAAE,IAAI,CAACC,OAAMA,GAAE,YAAW,CAAE,CAAC,EAAE,OAAM,CAAE;AACxE,UAAI,MAAM,WAAW,GAAG;AACpB,eAAO,MAAM,CAAC;AAAA,MAClB;AACA,YAAM,KAAI;AACV,aAAO;AAAA,IACX;AACA,WAAO,EAAE,YAAW;AAAA,EACxB,CAAC;AACD,QAAM,MAAM,OAAO,IAAI,CAAC,MAAM;AAC1B,QAAI,KAAK,MAAM;AACX,aAAO;AAAA,IACX;AACA,QAAI,MAAM,QAAQ,CAAC,GAAG;AAClB,aAAO,EAAE,KAAK,GAAG;AAAA,IACrB;AACA,WAAO;AAAA,EACX,CAAC,EAAE,KAAK,GAAG;AACX,SAAO,EAAE,UAAU,KAAK,OAAM;AAClC;AACA,eAAe,OAAO,UAAU,OAAO;AACnC,QAAM,EAAE,KAAI,IAAK,YAAY,QAAQ;AACrC,SAAO,KAAK,KAAK,MAAM,WAAW,UAAU,KAAK,GAAG,GAAG,KAAK;AAChE;AACA,eAAe,OAAO,UAAU,WAAW,OAAO;AAE9C,QAAM,WAAW,YAAY,SAAS,MAAM;AAC5C,SAAO,UAAU,gDAAgD,yBAAyB,EAAE,UAAS,CAAE;AACvG,QAAM,EAAE,UAAU,KAAK,OAAM,IAAK,MAAM,WAAW,UAAU,KAAK;AAClE,QAAM,EAAE,MAAM,SAAS,YAAY,QAAQ;AAC3C,MAAI,MAAM,KAAK,IAAI,GAAG;AACtB,MAAI,CAAC,KAAK;AACN,UAAM,UAAW,OAAO,OAAO;AAC/B,UAAM,SAAS,EAAE,SAAS,OAAM;AAChC,UAAM,WAAW,CAAC,QAAQ;AACtB,UAAI,gBAAgB;AACpB,UAAI,iBAAiB,MAAM;AACvB,YAAI;AACA,0BAAgB,SAAS,UAAU,SAAS,IAAI,OAAO,CAAC,CAAC;AAAA,QAC7D,SACO,OAAO;AAAA,QAAE;AAAA,MACpB;AAEA,UAAI,eAAe;AACf,cAAM,iBAAiB;AACvB,cAAM,OAAO,WAAW,SAAS,UAAU,eAAe,UAAU,IAAI,MAAM,IAAI,MAAM,IAAI,CAAA;AAC5F,aAAK,UAAU,OAAO,MAAM,CAACC,cAAa;AACtC,iBAAO,IAAI,qBAAqB,UAAUA,WAAU,OAAO,gBAAgB,GAAG;AAAA,QAClF,CAAC;AAAA,MACL,OACK;AACD,aAAK,UAAU,OAAO,CAAA,GAAI,CAACA,cAAa;AACpC,iBAAO,IAAI,4BAA4B,UAAUA,WAAU,OAAO,GAAG;AAAA,QACzE,CAAC;AAAA,MACL;AAAA,IACJ;AACA,QAAI,WAAW,CAAA;AACf,UAAM,QAAQ,MAAM;AAChB,UAAI,SAAS,QAAQ;AACjB;AAAA,MACJ;AACA,eAAS,KAAK,SAAS,GAAG,QAAQ,QAAQ,CAAC;AAAA,IAC/C;AACA,UAAM,OAAO,YAAY;AACrB,UAAI,SAAS,UAAU,GAAG;AACtB;AAAA,MACJ;AACA,UAAI,UAAU;AACd,iBAAW,CAAA;AACX,YAAM,QAAQ,IAAI,OAAO;AACzB,eAAS,IAAI,QAAQ,QAAQ;AAAA,IACjC;AACA,UAAM,EAAE,KAAK,WAAW,CAAA,GAAI,OAAO,KAAI;AACvC,SAAK,IAAI,KAAK,GAAG;AAAA,EACrB;AACA,SAAO;AACX;AAIA,IAAI,WAAW,QAAQ,QAAO;AAC9B,eAAe,MAAM,UAAU,OAAO,MAAM,aAAa;AACrD,QAAM;AACN,QAAM,MAAM,MAAM,OAAO,UAAU,KAAK;AACxC,MAAI,CAAC,KAAK;AACN,WAAO;AAAA,EACX;AACA,QAAM,QAAQ,IAAI,UAAU;AAC5B,MAAI,YAAY,IAAI,UAAU,OAAO,CAAC,EAAE,UAAU,WAAW;AACzD,UAAM,WAAW,MAAM,KAAK,IAAI;AAChC,QAAI,aAAa;AACb,eAAS,KAAK,YAAY,OAAO,OAAO,QAAQ,CAAC;AAAA,IACrD;AACA,QAAI;AACA,eAAS,KAAK,UAAU,GAAG,QAAQ;AAAA,IACvC,SACO,OAAO;AAAA,IAAE;AAChB,WAAO,CAAC;AAAA,EACZ,CAAC;AACD,MAAI,IAAI,UAAU,WAAW,GAAG;AAC5B,QAAI,KAAI;AACR,gBAAY,QAAQ,EAAE,KAAK,OAAO,IAAI,GAAG;AAAA,EAC7C;AACA,SAAQ,QAAQ;AACpB;AACA,eAAe,KAAK,UAAU,OAAO,MAAM,aAAa;AACpD,MAAI;AACA,UAAM;AAAA,EACV,SACO,OAAO;AAAA,EAAE;AAChB,QAAM,gBAAgB,MAAM,UAAU,OAAO,MAAM,WAAW;AAC9D,aAAW;AACX,SAAO,MAAM;AACjB;AACA,MAAM,iBAAiB,CAAC,MAAM;AACvB,MAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQtB;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA,CAAC,QAAQ;AAAA;AAAA;AAAA;AAAA,EAIT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,QAAQzB,MAAK,QAAQ,WAAW;AACxC,mBAAe,OAAQ,WAAY,YAAY,cAAc,MAAM,GAAG,qCAAqC,UAAU,MAAM;AAC3H,QAAI,UAAU,MAAM;AAChB,eAAS;AAAA,IACb;AACA,UAAM,QAAQ,UAAU,KAAKA,IAAG;AAChC,qBAAiB,MAAM,EAAE,QAAQ,QAAQ,WAAW,OAAO;AAC3D,WAAO,eAAe,MAAM,UAAU,EAAE,OAAO,CAAA,GAAI;AACnD,QAAI;AACJ,QAAI,OAAO;AACX,QAAI,WAAW;AACf,QAAI,WAAW;AACX,YAAM,WAAW,YAAY,MAAM;AAGnC,iBAAW,IAAI,4BAA4B,KAAK,WAAW,UAAU,SAAS;AAAA,IAClF;AACA,QAAI,OAAO,oBAAI,IAAG;AAElB,QAAI,OAAQ,WAAY,UAAU;AAC9B,UAAI,YAAY,MAAM,GAAG;AACrB,eAAO;AACP,sBAAc,QAAQ,QAAQ,MAAM;AAAA,MACxC,OACK;AACD,cAAM,WAAW,UAAU,QAAQ,aAAa;AAChD,YAAI,CAAC,WAAW,QAAQ,GAAG;AACvB,gBAAM,UAAU,oDAAoD,yBAAyB;AAAA,YACzF,WAAW;AAAA,UACnC,CAAqB;AAAA,QACL;AACA,sBAAc,SAAS,YAAY,MAAM,EAAE,KAAK,CAAC0B,UAAS;AACtD,cAAIA,SAAQ,MAAM;AACd,kBAAM,UAAU,uEAAuE,qBAAqB;AAAA,cACxG,OAAO;AAAA,YACnC,CAAyB;AAAA,UACL;AACA,sBAAY,IAAI,EAAE,OAAOA;AACzB,iBAAOA;AAAA,QACX,CAAC;AAAA,MACL;AAAA,IACJ,OACK;AACD,oBAAc,OAAO,WAAU,EAAG,KAAK,CAACA,UAAS;AAC7C,YAAIA,SAAQ,MAAM;AACd,gBAAM,IAAI,MAAM,MAAM;AAAA,QAC1B;AACA,oBAAY,IAAI,EAAE,OAAOA;AACzB,eAAOA;AAAA,MACX,CAAC;AAAA,IACL;AAEA,gBAAY,MAAM,EAAE,aAAa,MAAM,UAAU,MAAM;AAEvD,UAAM,UAAU,IAAI,MAAM,IAAI;AAAA,MAC1B,KAAK,CAACC,SAAQ,MAAM,aAAa;AAE7B,YAAI,OAAQ,SAAU,YAAY,eAAe,QAAQ,IAAI,KAAK,GAAG;AACjE,iBAAO,QAAQ,IAAIA,SAAQ,MAAM,QAAQ;AAAA,QAC7C;AACA,YAAI;AACA,iBAAO,KAAK,SAAS,IAAI;AAAA,QAC7B,SACO,OAAO;AACV,cAAI,CAAC,QAAQ,OAAO,kBAAkB,KAAK,MAAM,aAAa,OAAO;AACjE,kBAAM;AAAA,UACV;AAAA,QACJ;AACA,eAAO;AAAA,MACX;AAAA,MACA,KAAK,CAACA,SAAQ,SAAS;AAEnB,YAAI,eAAe,QAAQ,IAAI,KAAK,GAAG;AACnC,iBAAO,QAAQ,IAAIA,SAAQ,IAAI;AAAA,QACnC;AACA,eAAO,QAAQ,IAAIA,SAAQ,IAAI,KAAK,KAAK,UAAU,SAAS,OAAO,IAAI,CAAC;AAAA,MAC5E;AAAA,IACZ,CAAS;AACD,qBAAiB,MAAM,EAAE,SAAS;AAClC,qBAAiB,MAAM;AAAA,MACnB,UAAY,MAAM,WAAW,MAAM,WAAa,qBAAqB,IAAI,IAAK;AAAA,IAC1F,CAAS;AAED,WAAO,IAAI,MAAM,MAAM;AAAA,MACnB,KAAK,CAACA,SAAQ,MAAM,aAAa;AAC7B,YAAI,OAAQ,SAAU,YAAY,QAAQA,WAAU,eAAe,QAAQ,IAAI,KAAK,GAAG;AACnF,iBAAO,QAAQ,IAAIA,SAAQ,MAAM,QAAQ;AAAA,QAC7C;AAEA,YAAI;AACA,iBAAOA,QAAO,YAAY,IAAI;AAAA,QAClC,SACO,OAAO;AACV,cAAI,CAAC,QAAQ,OAAO,kBAAkB,KAAK,MAAM,aAAa,OAAO;AACjE,kBAAM;AAAA,UACV;AAAA,QACJ;AACA,eAAO;AAAA,MACX;AAAA,MACA,KAAK,CAACA,SAAQ,SAAS;AACnB,YAAI,OAAQ,SAAU,YAAY,QAAQA,WAAU,eAAe,QAAQ,IAAI,KAAK,GAAG;AACnF,iBAAO,QAAQ,IAAIA,SAAQ,IAAI;AAAA,QACnC;AACA,eAAOA,QAAO,UAAU,YAAY,IAAI;AAAA,MAC5C;AAAA,IACZ,CAAS;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,QAAQ;AACZ,WAAO,IAAI,aAAa,KAAK,QAAQ,KAAK,WAAW,MAAM;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,QAAQ;AACX,WAAO,IAAI,aAAa,QAAQ,KAAK,WAAW,KAAK,MAAM;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,aAAa;AAAE,WAAO,MAAM,YAAY,IAAI,EAAE;AAAA,EAAa;AAAA;AAAA;AAAA;AAAA,EAIjE,MAAM,kBAAkB;AACpB,UAAM,WAAW,YAAY,KAAK,MAAM;AACxC,WAAO,UAAU,qCAAqC,yBAAyB,EAAE,WAAW,mBAAmB;AAC/G,UAAM,OAAO,MAAM,SAAS,QAAQ,MAAM,KAAK,YAAY;AAC3D,QAAI,SAAS,MAAM;AACf,aAAO;AAAA,IACX;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB;AAEtB,UAAM,WAAW,KAAK,sBAAqB;AAC3C,QAAI,UAAU;AACV,YAAM,SAAS,KAAI;AACnB,aAAO;AAAA,IACX;AAEA,UAAM,OAAO,MAAM,KAAK,gBAAe;AACvC,QAAI,QAAQ,MAAM;AACd,aAAO;AAAA,IACX;AAEA,UAAM,WAAW,YAAY,KAAK,MAAM;AACxC,WAAO,YAAY,MAAM,8CAA8C,yBAAyB,EAAE,WAAW,qBAAqB;AAClI,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACpC,YAAM,YAAY,YAAY;AAC1B,YAAI;AACA,gBAAMC,QAAO,MAAM,KAAK,gBAAe;AACvC,cAAIA,SAAQ,MAAM;AACd,mBAAO,QAAQ,IAAI;AAAA,UACvB;AACA,mBAAS,KAAK,SAAS,SAAS;AAAA,QACpC,SACO,OAAO;AACV,iBAAO,KAAK;AAAA,QAChB;AAAA,MACJ;AACA,gBAAS;AAAA,IACb,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,wBAAwB;AACpB,WAAO,YAAY,IAAI,EAAE;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,KAAK;AACb,QAAI,OAAQ,QAAS,UAAU;AAC3B,YAAM,IAAI,OAAM;AAAA,IACpB;AACA,UAAM,OAAO,mBAAmB,MAAM,GAAG;AACzC,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,KAAK;AACV,QAAI,OAAQ,QAAS,UAAU;AAC3B,YAAM,IAAI,OAAM;AAAA,IACpB;AACA,WAAO,kBAAkB,MAAM,GAAG;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,iBAAiB/K,OAAM;AACzB,UAAM,IAAI,MAAM,OAAO;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,MAAM,YAAY,OAAO,WAAW,SAAS;AACzC,QAAI,aAAa,MAAM;AACnB,kBAAY;AAAA,IAChB;AACA,QAAI,WAAW,MAAM;AACjB,gBAAU;AAAA,IACd;AACA,UAAM,EAAE,MAAM,gBAAgB,YAAY,IAAI;AAC9C,UAAM,UAAW,OAAO,OAAQ,MAAM;AACtC,UAAM,EAAE,UAAU,OAAM,IAAK,MAAM,WAAW,MAAM,KAAK;AACzD,UAAM,SAAS,EAAE,SAAS,QAAQ,WAAW,QAAO;AACpD,UAAM,WAAW,YAAY,KAAK,MAAM;AACxC,WAAO,UAAU,4CAA4C,yBAAyB,EAAE,WAAW,eAAe;AAClH,YAAQ,MAAM,SAAS,QAAQ,MAAM,GAAG,IAAI,CAAC,QAAQ;AACjD,UAAI,gBAAgB;AACpB,UAAI,iBAAiB,MAAM;AACvB,YAAI;AACA,0BAAgB,KAAK,UAAU,SAAS,IAAI,OAAO,CAAC,CAAC;AAAA,QACzD,SACO,OAAO;AAAA,QAAE;AAAA,MACpB;AACA,UAAI,eAAe;AACf,YAAI;AACA,iBAAO,IAAI,SAAS,KAAK,KAAK,WAAW,aAAa;AAAA,QAC1D,SACO,OAAO;AACV,iBAAO,IAAI,kBAAkB,KAAK,KAAK;AAAA,QAC3C;AAAA,MACJ;AACA,aAAO,IAAI,IAAI,KAAK,QAAQ;AAAA,IAChC,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,GAAG,OAAO,UAAU;AACtB,UAAM,MAAM,MAAM,OAAO,MAAM,MAAM,KAAK;AAC1C,QAAI,UAAU,KAAK,EAAE,UAAU,MAAM,OAAO;AAC5C,QAAI,MAAK;AACT,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,OAAO,UAAU;AACxB,UAAM,MAAM,MAAM,OAAO,MAAM,QAAQ,KAAK;AAC5C,QAAI,UAAU,KAAK,EAAE,UAAU,MAAM,MAAM;AAC3C,QAAI,MAAK;AACT,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAK,UAAU,MAAM;AACvB,WAAO,MAAM,KAAK,MAAM,OAAO,MAAM,IAAI;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,OAAO;AACvB,QAAI,OAAO;AACP,YAAM,MAAM,MAAM,OAAO,MAAM,KAAK;AACpC,UAAI,CAAC,KAAK;AACN,eAAO;AAAA,MACX;AACA,aAAO,IAAI,UAAU;AAAA,IACzB;AACA,UAAM,EAAE,KAAI,IAAK,YAAY,IAAI;AACjC,QAAI,QAAQ;AACZ,eAAW,EAAE,UAAS,KAAM,KAAK,OAAM,GAAI;AACvC,eAAS,UAAU;AAAA,IACvB;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,OAAO;AACnB,QAAI,OAAO;AACP,YAAM,MAAM,MAAM,OAAO,MAAM,KAAK;AACpC,UAAI,CAAC,KAAK;AACN,eAAO,CAAA;AAAA,MACX;AACA,aAAO,IAAI,UAAU,IAAI,CAAC,EAAE,SAAQ,MAAO,QAAQ;AAAA,IACvD;AACA,UAAM,EAAE,KAAI,IAAK,YAAY,IAAI;AACjC,QAAI,SAAS,CAAA;AACb,eAAW,EAAE,UAAS,KAAM,KAAK,OAAM,GAAI;AACvC,eAAS,OAAO,OAAO,UAAU,IAAI,CAAC,EAAE,eAAe,QAAQ,CAAC;AAAA,IACpE;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAI,OAAO,UAAU;AACvB,UAAM,MAAM,MAAM,OAAO,MAAM,KAAK;AACpC,QAAI,CAAC,KAAK;AACN,aAAO;AAAA,IACX;AACA,QAAI,UAAU;AACV,YAAM,QAAQ,IAAI,UAAU,IAAI,CAAC,EAAE,UAAA4K,UAAQ,MAAOA,SAAQ,EAAE,QAAQ,QAAQ;AAC5E,UAAI,SAAS,GAAG;AACZ,YAAI,UAAU,OAAO,OAAO,CAAC;AAAA,MACjC;AAAA,IACJ;AACA,QAAI,YAAY,QAAQ,IAAI,UAAU,WAAW,GAAG;AAChD,UAAI,KAAI;AACR,kBAAY,IAAI,EAAE,KAAK,OAAO,IAAI,GAAG;AAAA,IACzC;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,OAAO;AAC5B,QAAI,OAAO;AACP,YAAM,MAAM,MAAM,OAAO,MAAM,KAAK;AACpC,UAAI,CAAC,KAAK;AACN,eAAO;AAAA,MACX;AACA,UAAI,KAAI;AACR,kBAAY,IAAI,EAAE,KAAK,OAAO,IAAI,GAAG;AAAA,IACzC,OACK;AACD,YAAM,EAAE,KAAI,IAAK,YAAY,IAAI;AACjC,iBAAW,EAAE,KAAK,KAAI,KAAM,KAAK,OAAM,GAAI;AACvC,aAAI;AACJ,aAAK,OAAO,GAAG;AAAA,MACnB;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,YAAY,OAAO,UAAU;AAC/B,WAAO,MAAM,KAAK,GAAG,OAAO,QAAQ;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,eAAe,OAAO,UAAU;AAClC,WAAO,MAAM,KAAK,IAAI,OAAO,QAAQ;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAIA,OAAO,WAAWzB,MAAK;AAAA,IACnB,MAAM,uBAAuB,aAAa;AAAA,MACtC,YAAY,SAAS,SAAS,MAAM;AAChC,cAAM,SAASA,MAAK,MAAM;AAAA,MAC9B;AAAA,IACZ;AACQ,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,KAAK,QAAQA,MAAK,QAAQ;AAC7B,QAAI,UAAU,MAAM;AAChB,eAAS;AAAA,IACb;AACA,UAAM,WAAW,IAAI,KAAK,QAAQA,MAAK,MAAM;AAC7C,WAAO;AAAA,EACX;AACJ;AACA,SAAS,gBAAgB;AACrB,SAAO;AACX;AAIO,MAAM,iBAAiB,cAAa,EAAG;AAC9C;ACp5BO,MAAM,eAAe;AAAA,EAC1B,UAAU;AAAA,EACV,SAAS;AAAA,EACT,OAAO;AAAA,EACP,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,WAAW;AACb;ACvBA,SAAS,gBAAgB,KAAK;AAC5B,SAAO,OAAO6B,YAAmB,GAAG,CAAC;AACvC;AAKO,MAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA,EAI3B,YAAY,UAAU;AACpB,SAAK,WAAW;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YAAY,SAAS,QAAQ;AAC3B,UAAM7B,OAAM,aAAa,MAAM;AAC/B,QAAI,CAACA,MAAK;AACR,YAAM,IAAI,MAAM,4BAA4B,MAAM,EAAE;AAAA,IACtD;AACA,WAAO,IAAI8B,SAAgB,SAAS9B,MAAK,KAAK,QAAQ;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,aAAa,SAAS;AAE1B,UAAM,SAAS;AAAA,MACb;AAAA,MACA;AAAA,IACN;AACI,UAAM,WAAW,IAAI8B,SAAgB,SAAS,QAAQ,KAAK,QAAQ;AACnE,QAAI;AACF,aAAO,MAAM,SAAS,OAAM;AAAA,IAC9B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAgB,SAAS,QAAQ;AACrC,UAAM,WAAW,KAAK,YAAY,SAAS,MAAM;AACjD,UAAM,CAAC7P,OAAM,gBAAgB8P,UAAS,SAAS,IAAI,IAAI,MAAM,QAAQ,IAAI;AAAA,MACvE,SAAS,KAAI,EAAG,MAAM,MAAM,EAAE;AAAA,MAC9B,SAAS,OAAM,EAAG,MAAM,MAAM,MAAM;AAAA,MACpC,SAAS,QAAO,EAAG,MAAM,MAAM,EAAE;AAAA,MACjC,SAAS,QAAO,EAAG,MAAM,MAAMC,WAAkB;AAAA,MACjD,SAAS,QAAO,EAAG,MAAM,MAAM,EAAE;AAAA,IACvC,CAAK;AAED,WAAO;AAAA,MACL;AAAA,MACA,MAAA/P;AAAA,MACA,QAAQ;AAAA,MACR,SAAA8P;AAAA,MACA;AAAA,MACA,aAAa,OAAO,IAAI;AAAA,IAC9B;AAAA,EACE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,SAAS,QAAQ;AAChC,UAAM,WAAW,KAAK,YAAY,SAAS,MAAM;AACjD,UAAM,OAAO,MAAM,SAAS,QAAO;AACnC,UAAM,UAAU,CAAA;AAChB,aAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,YAAM,SAAS,MAAM,SAAS,QAAQ,CAAC;AACvC,cAAQ,KAAK,MAAM;AAAA,IACrB;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,SAAS,QAAQ,QAAQ;AAC/C,UAAM,WAAW,KAAK,YAAY,SAAS,MAAM;AACjD,UAAM,UAAU,MAAM,SAAS,aAAa,MAAM;AAClD,WAAO;AAAA,MACL,KAAK,QAAQ,SAAQ;AAAA,MACrB,KAAK,gBAAgB,OAAO;AAAA,IAClC;AAAA,EACE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,SAAS,QAAQ,QAAQ,cAAc;AAC/D,UAAM,WAAW,KAAK,YAAY,SAAS,MAAM;AACjD,UAAM,UAAU,MAAM,SAAS,aAAa,QAAQ,YAAY;AAChE,WAAO;AAAA,MACL,KAAK,QAAQ,SAAQ;AAAA,MACrB,WAAW,gBAAgB,OAAO;AAAA,IACxC;AAAA,EACE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,SAAS,QAAQ,cAAc;AACrD,UAAM,WAAW,KAAK,YAAY,SAAS,MAAM;AAEjD,UAAM,QAAQ,gBAAgBC;AAC9B,UAAM,QAAQ,MAAM,SAAS,eAAe,KAAK;AACjD,WAAO;AAAA,MACL,KAAK,MAAM,SAAQ;AAAA,MACnB,WAAW,gBAAgB,KAAK;AAAA,IACtC;AAAA,EACE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,SAAS,QAAQ,QAAQ;AACxC,UAAM,WAAW,KAAK,YAAY,SAAS,MAAM;AACjD,WAAO,SAAS,WAAW,MAAM;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,iBAAiB,SAAS;AAC9B,UAAM,WAAW,KAAK,YAAY,SAAS,UAAU;AACrD,UAAM,CAAC9B,WAAU,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC7C,SAAS,gCAA+B;AAAA,MACxC,SAAS,gCAA+B;AAAA,IAC9C,CAAK;AACD,WAAO;AAAA,MACL,oBAAoB,OAAOA,SAAQ;AAAA,MACnC,oBAAoB,OAAO,QAAQ;AAAA,MACnC,iBAAiB,OAAOA,SAAQ,IAAI;AAAA,MACpC,iBAAiB,OAAO,QAAQ,IAAI;AAAA,IAC1C;AAAA,EACE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,SAAS;AACjC,UAAM,WAAW,KAAK,YAAY,SAAS,UAAU;AACrD,UAAM,CAAC,MAAM,SAAS,IAAI,MAAM,SAAS,qBAAoB;AAC7D,UAAM,WAAW,CAAA;AACjB,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,eAAS,KAAK;AAAA,QACZ,KAAK,KAAK,CAAC;AAAA,QACX,SAAS,UAAU,CAAC;AAAA,MAC5B,CAAO;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,0BAA0B,SAAS,QAAQ;AAC/C,UAAM,WAAW,KAAK,YAAY,SAAS,UAAU;AACrD,UAAM,MAAM,MAAM,SAAS,YAAY,MAAM;AAC7C,WAAO;AAAA,MACL,aAAa,OAAO,GAAG;AAAA,MACvB,SAAS,OAAO,GAAG,IAAI;AAAA,IAC7B;AAAA,EACE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,0BAA0B,SAAS;AACvC,UAAM,UAAU,MAAM,KAAK,WAAW,SAAS,UAAU;AACzD,UAAM,WAAW,KAAK,YAAY,SAAS,UAAU;AACrD,UAAM,UAAU,CAAA;AAChB,eAAW,UAAU,SAAS;AAC5B,YAAM,MAAM,MAAM,SAAS,YAAY,MAAM;AAC7C,cAAQ,KAAK;AAAA,QACX;AAAA,QACA,aAAa,OAAO,GAAG;AAAA,QACvB,SAAS,OAAO,GAAG,IAAI;AAAA,MAC/B,CAAO;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,eAAe,SAAS;AAC5B,UAAM,WAAW,KAAK,YAAY,SAAS,OAAO;AAClD,UAAM,CAAC,QAAQ,GAAGzO,IAAG,CAAC,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC1C,SAAS,OAAM;AAAA,MACf,SAAS,EAAC;AAAA,MACV,SAAS,EAAC;AAAA,MACV,SAAS,EAAC;AAAA,IAChB,CAAK;AACD,WAAO;AAAA,MACL,eAAe,OAAO,MAAM;AAAA,MAC5B,gBAAgB;AAAA,QACd,GAAG,OAAO,CAAC;AAAA,QACX,GAAG,OAAOA,EAAC;AAAA,QACX,GAAG,OAAO,CAAC;AAAA,MACnB;AAAA,IACA;AAAA,EACE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,SAAS,QAAQ;AACjC,UAAM,WAAW,KAAK,YAAY,SAAS,OAAO;AAClD,UAAM,OAAO,MAAM,SAAS,KAAK,MAAM;AACvC,WAAO,OAAO,IAAI;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,SAAS,YAAY;AACxC,UAAM,WAAW,KAAK,YAAY,SAAS,OAAO;AAClD,WAAO,SAAS,eAAe,UAAU;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,SAAS;AAC/B,UAAM,SAAS,MAAM,KAAK,eAAe,OAAO;AAChD,UAAM,WAAW,KAAK,YAAY,SAAS,OAAO;AAClD,UAAM,QAAQ,CAAA;AAEd,aAAS,IAAI,GAAG,KAAK,OAAO,eAAe,KAAK;AAC9C,YAAM,UAAU,MAAM,SAAS,eAAe,CAAC;AAC/C,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN;AAAA,QACA,aAAa,QAAQ;AAAA,MAC7B,CAAO;AAAA,IACH;AAGA,UAAM,UAAU,MAAM,SAAS,iBAAgB;AAC/C,UAAM,gBAAgB,QAAQ,IAAI,CAAC,GAAG,OAAO;AAAA,MAC3C,MAAM,IAAI;AAAA,MACV,QAAQ,OAAO,CAAC;AAAA,IACtB,EAAM;AAEF,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,eAAe;AAAA,IACrB;AAAA,EACE;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,uBAAuB,SAAS,QAAQ;AAC5C,UAAM,WAAW,KAAK,YAAY,SAAS,SAAS;AACpD,UAAM,eAAe,MAAM,SAAS,aAAa,MAAM;AACvD,UAAM,oBAAoB,MAAM,SAAS,kBAAiB;AAC1D,WAAO;AAAA,MACL,kBAAkB,OAAO,YAAY;AAAA,MACrC,mBAAmB,OAAO,iBAAiB;AAAA,MAC3C,cAAc,OAAO,iBAAiB,IAAI,IACrC,OAAO,YAAY,IAAI,OAAO,iBAAiB,IAAK,MACrD;AAAA,IACV;AAAA,EACE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,0BAA0B,SAAS;AACvC,UAAM,UAAU,MAAM,KAAK,WAAW,SAAS,SAAS;AACxD,UAAM,WAAW,KAAK,YAAY,SAAS,SAAS;AACpD,UAAM,oBAAoB,MAAM,SAAS,kBAAiB;AAC1D,UAAM,kBAAkB,MAAM,SAAS,gBAAe,EAAG,MAAM,MAAM,EAAE;AAEvE,UAAM,UAAU,CAAA;AAChB,eAAW,UAAU,SAAS;AAC5B,YAAM,eAAe,MAAM,SAAS,aAAa,MAAM;AACvD,cAAQ,KAAK;AAAA,QACX;AAAA,QACA,cAAc,OAAO,YAAY;AAAA,QACjC,cAAc,OAAO,iBAAiB,IAAI,IACrC,OAAO,YAAY,IAAI,OAAO,iBAAiB,IAAK,MACrD;AAAA,MACZ,CAAO;AAAA,IACH;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB,OAAO,iBAAiB;AAAA,MAC3C,iBAAiB,OAAO,eAAe;AAAA,IAC7C;AAAA,EACE;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,oBAAoB,SAAS,QAAQ;AACzC,UAAM,WAAW,KAAK,YAAY,SAAS,cAAc;AACzD,UAAM,CAAC,cAAc,WAAW,iBAAiB,IAAI,MAAM,QAAQ,IAAI;AAAA,MACrE,SAAS,aAAa,MAAM;AAAA,MAC5B,SAAS,sBAAsB,MAAM;AAAA,MACrC,SAAS,kBAAiB;AAAA,IAChC,CAAK;AACD,WAAO;AAAA,MACL,UAAU,OAAO,YAAY;AAAA,MAC7B,iBAAiB,OAAO,SAAS;AAAA,MACjC,WAAW,OAAO,iBAAiB;AAAA,MACnC,cAAc,OAAO,iBAAiB,IAAI,IACrC,OAAO,YAAY,IAAI,OAAO,iBAAiB,IAAK,MACrD;AAAA,IACV;AAAA,EACE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,SAAS;AAChC,UAAM,UAAU,MAAM,KAAK,WAAW,SAAS,cAAc;AAC7D,UAAM,WAAW,KAAK,YAAY,SAAS,cAAc;AACzD,UAAM,oBAAoB,MAAM,SAAS,kBAAiB;AAE1D,UAAM,UAAU,CAAA;AAChB,eAAW,UAAU,SAAS;AAC5B,YAAM,CAAC,cAAc,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,QAClD,SAAS,aAAa,MAAM;AAAA,QAC5B,SAAS,sBAAsB,MAAM;AAAA,MAC7C,CAAO;AACD,cAAQ,KAAK;AAAA,QACX;AAAA,QACA,UAAU,OAAO,YAAY;AAAA,QAC7B,iBAAiB,OAAO,SAAS;AAAA,QACjC,cAAc,OAAO,iBAAiB,IAAI,IACrC,OAAO,YAAY,IAAI,OAAO,iBAAiB,IAAK,MACrD;AAAA,MACZ,CAAO;AAAA,IACH;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,mBAAmB,OAAO,iBAAiB;AAAA,IACjD;AAAA,EACE;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAgB,SAAS;AAC7B,UAAM,WAAW,KAAK,YAAY,SAAS,QAAQ;AACnD,UAAM,CAAC,WAAW,QAAQ,aAAa,aAAa,cAAc,IAAI,MAAM,QAAQ,IAAI;AAAA,MACtF,SAAS,UAAS;AAAA,MAClB,SAAS,OAAM;AAAA,MACf,SAAS,mBAAkB;AAAA,MAC3B,SAAS,mBAAkB;AAAA,MAC3B,SAAS,eAAc;AAAA,IAC7B,CAAK;AAED,WAAO;AAAA,MACL,WAAW,OAAO,SAAS;AAAA,MAC3B,eAAe,OAAO,MAAM;AAAA,MAC5B,oBAAoB,OAAO,WAAW,IAAI;AAAA;AAAA,MAC1C,oBAAoB,OAAO,WAAW,IAAI;AAAA,MAC1C;AAAA,IACN;AAAA,EACE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,SAAS;AAC5B,UAAM,WAAW,KAAK,YAAY,SAAS,QAAQ;AACnD,UAAM,CAAC,UAAU,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC7C,SAAS,mBAAkB;AAAA,MAC3B,SAAS,mBAAkB;AAAA,IACjC,CAAK;AACD,WAAO;AAAA,MACL,qBAAqB,OAAO,QAAQ;AAAA,MACpC,qBAAqB,OAAO,QAAQ;AAAA,MACpC,iBAAiB,OAAO,QAAQ,IAAI;AAAA,MACpC,iBAAiB,OAAO,QAAQ,IAAI;AAAA,IAC1C;AAAA,EACE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAqB,SAAS;AAClC,UAAM,WAAW,KAAK,YAAY,SAAS,QAAQ;AACnD,UAAM,UAAU,MAAM,SAAS,eAAc;AAC7C,WAAO,QAAQ,IAAI,CAAC,GAAG,OAAO;AAAA,MAC5B,MAAM,IAAI;AAAA,MACV,QAAQ,OAAO,CAAC;AAAA,IACtB,EAAM;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,SAAS,QAAQ;AACvC,UAAM,WAAW,KAAK,YAAY,SAAS,QAAQ;AACnD,UAAM,CAAC,MAAM,eAAe,YAAY,YAAY,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,MAChF,SAAS,KAAK,MAAM;AAAA,MACpB,SAAS,cAAc,MAAM;AAAA,MAC7B,SAAS,iBAAiB,MAAM;AAAA,MAChC,SAAS,iBAAiB,MAAM;AAAA,MAChC,SAAS,eAAe,MAAM;AAAA,IACpC,CAAK;AACD,WAAO;AAAA,MACL,MAAM,OAAO,IAAI;AAAA,MACjB,0BAA0B,OAAO,aAAa;AAAA,MAC9C,sBAAsB,OAAO,aAAa,IAAI;AAAA,MAC9C,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB;AAAA,IACN;AAAA,EACE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,yBAAyB,SAAS;AACtC,UAAM,WAAW,KAAK,YAAY,SAAS,QAAQ;AACnD,WAAO,SAAS,mBAAkB;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBAAuB,SAAS;AACpC,UAAM,SAAS,MAAM,KAAK,gBAAgB,OAAO;AACjD,UAAM,WAAW,KAAK,YAAY,SAAS,QAAQ;AACnD,UAAM,QAAQ,CAAA;AAEd,aAAS,IAAI,GAAG,KAAK,OAAO,eAAe,KAAK;AAC9C,YAAM,UAAU,MAAM,SAAS,eAAe,CAAC;AAC/C,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN;AAAA,QACA,aAAa,QAAQ;AAAA,MAC7B,CAAO;AAAA,IACH;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,aAAa,MAAM,KAAK,qBAAqB,OAAO;AAAA,IAC1D;AAAA,EACE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,SAAS;AAC/B,UAAM,WAAW,KAAK,YAAY,SAAS,QAAQ;AACnD,UAAM,CAAC,gBAAgB,UAAU,IAAI,MAAM,QAAQ,IAAI;AAAA,MACrD,SAAS,eAAc;AAAA,MACvB,SAAS,cAAa;AAAA,IAC5B,CAAK;AAED,QAAI,CAAC,gBAAgB;AACnB,aAAO,EAAE,QAAQ,OAAO,YAAY,CAAA,EAAE;AAAA,IACxC;AAEA,UAAM,gBAAgB,CAAA;AACtB,eAAW,aAAa,YAAY;AAClC,YAAM,QAAQ,MAAM,SAAS,MAAM,SAAS;AAC5C,oBAAc,KAAK;AAAA,QACjB,QAAQ;AAAA,QACR,OAAO,OAAO,KAAK;AAAA,MAC3B,CAAO;AAAA,IACH;AAEA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,YAAY,cAAc,KAAK,CAAC,GAAGA,OAAMA,GAAE,QAAQ,EAAE,KAAK;AAAA,IAChE;AAAA,EACE;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAgB,SAAS;AAC7B,UAAM,SAAS,MAAM,KAAK,aAAa,OAAO;AAC9C,UAAM,OAAO,MAAM,KAAK,gBAAgB,SAAS,MAAM;AACvD,UAAM,UAAU,MAAM,KAAK,WAAW,SAAS,MAAM;AAErD,UAAM,WAAW;AAAA,MACf,GAAG;AAAA,MACH;AAAA,MACA,eAAe,CAAA;AAAA,IACrB;AAGI,eAAW,UAAU,SAAS;AAC5B,YAAM,UAAU,MAAM,KAAK,kBAAkB,SAAS,QAAQ,MAAM;AACpE,YAAM,UAAU,MAAM,KAAK,WAAW,SAAS,QAAQ,MAAM;AAE7D,YAAM,eAAe;AAAA,QACnB;AAAA,QACA,YAAY;AAAA,QACZ,YAAY;AAAA,MACpB;AAGM,UAAI,WAAW,YAAY;AACzB,cAAM,MAAM,MAAM,KAAK,0BAA0B,SAAS,MAAM;AAChE,qBAAa,aAAa;AAAA,MAC5B,WAAW,WAAW,SAAS;AAC7B,qBAAa,OAAO,MAAM,KAAK,YAAY,SAAS,MAAM;AAAA,MAC5D,WAAW,WAAW,WAAW;AAC/B,qBAAa,eAAe,MAAM,KAAK,uBAAuB,SAAS,MAAM;AAAA,MAC/E,WAAW,WAAW,gBAAgB;AACpC,qBAAa,eAAe,MAAM,KAAK,oBAAoB,SAAS,MAAM;AAAA,MAC5E,WAAW,WAAW,UAAU;AAC9B,qBAAa,aAAa,MAAM,KAAK,kBAAkB,SAAS,MAAM;AAAA,MACxE;AAEA,eAAS,cAAc,KAAK,YAAY;AAAA,IAC1C;AAGA,QAAI,WAAW,YAAY;AACzB,eAAS,QAAQ,MAAM,KAAK,iBAAiB,OAAO;AACpD,eAAS,WAAW,MAAM,KAAK,oBAAoB,OAAO;AAAA,IAC5D,WAAW,WAAW,SAAS;AAC7B,eAAS,aAAa,MAAM,KAAK,kBAAkB,OAAO;AAAA,IAC5D,WAAW,WAAW,WAAW;AAC/B,eAAS,sBAAsB,MAAM,KAAK,0BAA0B,OAAO;AAAA,IAC7E,WAAW,WAAW,gBAAgB;AACpC,eAAS,sBAAsB,MAAM,KAAK,mBAAmB,OAAO;AAAA,IACtE,WAAW,WAAW,UAAU;AAC9B,eAAS,eAAe,MAAM,KAAK,gBAAgB,OAAO;AAC1D,eAAS,cAAc,MAAM,KAAK,eAAe,OAAO;AACxD,eAAS,cAAc,MAAM,KAAK,uBAAuB,OAAO;AAChE,eAAS,WAAW,MAAM,KAAK,kBAAkB,OAAO;AAAA,IAC1D;AAEA,WAAO;AAAA,EACT;AACF;AChkBO,SAAS,cAAc,MAAM;AAClC,SAAO,cAAc,KAAK;AAAA,IACxB,aAAa;AACX,UAAI,CAAC,KAAK,KAAK;AACb,cAAM,IAAI,MAAM,2DAA2D;AAAA,MAC7E;AAAA,IACF;AAAA;AAAA,IAIA,MAAM,UAAU,MAAM,UAAU,IAAI;AAClC,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,IAAI,UAAU,MAAM,OAAO;AAAA,IAC7C;AAAA,IAEA,MAAM,QAAQ,MAAM,QAAQ,UAAU,CAAA,GAAI;AACxC,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,IAAI,QAAQ,MAAM,QAAQ,OAAO;AAAA,IACnD;AAAA,IAEA,MAAM,gBAAgB,MAAM,UAAU,IAAI;AACxC,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,IAAI,gBAAgB,MAAM,OAAO;AAAA,IACnD;AAAA,IAEA,MAAM,WAAW,MAAM,YAAY,UAAU,CAAA,GAAI;AAC/C,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,IAAI,WAAW,MAAM,YAAY,OAAO;AAAA,IAC1D;AAAA,IAEA,MAAM,UAAU,MAAM,gBAAgB,UAAU,CAAA,GAAI;AAClD,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,IAAI,UAAU,MAAM,gBAAgB,OAAO;AAAA,IAC7D;AAAA,IAEA,MAAM,kBAAkB,MAAM,UAAU,IAAI;AAC1C,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,IAAI,kBAAkB,MAAM,OAAO;AAAA,IACrD;AAAA;AAAA,IAIA,MAAM,gBAAgB,MAAM,UAAU,UAAU,CAAA,GAAI;AAClD,WAAK,WAAU;AACf,YAAM,YAAY,MAAM,KAAK,UAAU,QAAQ;AAC/C,UAAI,CAAC,WAAW;AACd,cAAM,IAAI,MAAM,6BAA6B,QAAQ,EAAE;AAAA,MACzD;AACA,aAAO,KAAK,IAAI,gBAAgB,gBAAgB,MAAM,WAAW,OAAO;AAAA,IAC1E;AAAA;AAAA,IAIA,MAAM,QAAQ,MAAM,MAAM,UAAU,CAAA,GAAI;AACtC,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,QAAQ,IAAI,MAAM,MAAM,OAAO;AAAA,IACjD;AAAA,IAEA,MAAM,aAAa,MAAM,MAAM,UAAU,CAAA,GAAI;AAC3C,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,QAAQ,SAAS,MAAM,MAAM,OAAO;AAAA,IACtD;AAAA,IAEA,MAAM,UAAU,MAAM,MAAM,UAAU,CAAA,GAAI;AACxC,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,QAAQ,MAAM,MAAM,MAAM,OAAO;AAAA,IACnD;AAAA,IAEA,MAAM,eAAe,MAAM,MAAM,UAAU,CAAA,GAAI;AAC7C,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,QAAQ,WAAW,MAAM,MAAM,OAAO;AAAA,IACxD;AAAA,IAEA,MAAM,gBAAgB,MAAM,MAAM,UAAU,CAAA,GAAI;AAC9C,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,QAAQ,YAAY,MAAM,MAAM,OAAO;AAAA,IACzD;AAAA;AAAA,IAIA,MAAM,MAAM,MAAM;AAChB,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,WAAW,MAAM,IAAI;AAAA,IACvC;AAAA,IAEA,MAAM,eAAe,OAAO,SAAS,UAAU,UAAU,CAAA,GAAI;AAC3D,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,WAAW,eAAe,OAAO,SAAS,UAAU,OAAO;AAAA,IAC7E;AAAA,IAEA,MAAM,mBAAmB,SAAS,UAAU,MAAM,YAAY,eAAe;AAC3E,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,WAAW,mBAAmB,SAAS,UAAU,MAAM,SAAS;AAAA,IAClF;AAAA;AAAA,IAIA,MAAM,WAAW,UAAU,UAAU,IAAI;AACvC,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,QAAQ,IAAI,UAAU,OAAO;AAAA,IAC/C;AAAA,IAEA,MAAM,iBAAiB,UAAU,cAAc,UAAU,CAAA,GAAI;AAC3D,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,QAAQ,UAAU,UAAU,cAAc,OAAO;AAAA,IACnE;AAAA;AAAA,IAIA,MAAM,aAAa,MAAM,QAAQ,QAAQ,UAAU,CAAA,GAAI;AACrD,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,IAAI,MAAM,MAAM,OAAO,OAAO;AAAA,IAChD;AAAA,IAEA,MAAM,mBAAmB,MAAM,QAAQ,QAAQ,UAAU,CAAA,GAAI;AAC3D,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,IAAI,YAAY,MAAM,OAAO,OAAO;AAAA,IACtD;AAAA;AAAA,IAIA,MAAM,QAAQ,OAAO,UAAU,MAAM,WAAW,MAAM,UAAU,IAAI;AAClE,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,QAAQ,QAAQ,OAAO,SAAS,UAAU,OAAO;AAAA,IACnE;AAAA,IAEA,MAAM,aAAa,OAAO;AACxB,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,QAAQ,MAAM,KAAK;AAAA,IACrC;AAAA;AAAA,IAIA,MAAM,eAAe,SAAS,UAAU,IAAI;AAC1C,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,WAAW,eAAe,SAAS,OAAO;AAAA,IAC5D;AAAA,IAEA,MAAM,UAAU,SAAS,SAAS,UAAU,CAAA,GAAI;AAC9C,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,WAAW,UAAU,SAAS,SAAS,OAAO;AAAA,IAChE;AAAA,IAEA,8BAA8B,UAAUqO,cAAae,YAAW,CAAA,GAAI;AAClE,WAAK,WAAU;AACf,WAAK,IAAI,WAAW,aAAa,UAAUf,cAAae,SAAQ;AAAA,IAClE;AAAA;AAAA,IAIA,MAAM,cAAc,SAAS,WAAW,MAAM,SAAS,MAAM,UAAU,IAAI;AACzE,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,QAAQ,cAAc,SAAS,UAAU,QAAQ,OAAO;AAAA,IAC1E;AAAA,IAEA,MAAM,eAAe,QAAQ,QAAQ,WAAW,MAAM;AACpD,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,QAAQ,eAAe,QAAQ,QAAQ,QAAQ;AAAA,IACjE;AAAA,IAEA,MAAM,cAAc,SAAS,UAAU,YAAY,MAAM;AACvD,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,QAAQ,cAAc,SAAS,UAAU,SAAS;AAAA,IACpE;AAAA;AAAA,IAIA,MAAM,YAAY,SAAS,UAAU,UAAU,CAAA,GAAI;AACjD,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,YAAY,YAAY,SAAS,UAAU,OAAO;AAAA,IACpE;AAAA,IAEA,MAAM,qBAAqB,SAAS;AAClC,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,YAAY,qBAAqB,OAAO;AAAA,IAC1D;AAAA;AAAA,IAIA,MAAM,mBAAmB,SAAS,UAAU,IAAI;AAC9C,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,kBAAkB,mBAAmB,SAAS,OAAO;AAAA,IACvE;AAAA,IAEA,MAAM,wBAAwB,SAAS;AACrC,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,kBAAkB,wBAAwB,OAAO;AAAA,IACnE;AAAA,IAEA,MAAM,mBAAmB,SAAS;AAChC,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,kBAAkB,mBAAmB,OAAO;AAAA,IAC9D;AAAA;AAAA,IAIA,MAAM,sBAAsB,SAAS,WAAW,MAAM;AACpD,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,cAAc,sBAAsB,SAAS,QAAQ;AAAA,IACvE;AAAA,IAEA,MAAM,YAAY,MAAM,SAAS,WAAW,MAAM,UAAU,IAAI;AAC9D,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,cAAc,YAAY,MAAM,SAAS,UAAU,OAAO;AAAA,IAC5E;AAAA,IAEA,MAAM,uBAAuB,SAAS,UAAU;AAC9C,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,cAAc,WAAW,SAAS,QAAQ;AAAA,IAC5D;AAAA,IAEA,MAAM,mBAAmB,MAAM,SAAS,UAAU;AAChD,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,cAAc,mBAAmB,MAAM,SAAS,QAAQ;AAAA,IAC1E;AAAA;AAAA,IAIA,MAAM,UAAU,MAAM,SAAS,UAAU,UAAU,CAAA,GAAI;AACrD,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,cAAc,UAAU,MAAM,SAAS,UAAU,OAAO;AAAA,IAC1E;AAAA,IAEA,MAAM,yBAAyB,MAAM;AACnC,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,cAAc,gBAAgB,IAAI;AAAA,IACpD;AAAA,IAEA,iBAAiB,iBAAiB;AAChC,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,cAAc,QAAQ,eAAe;AAAA,IACvD;AAAA,IAEA,4BAA4B,iBAAiB;AAC3C,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,cAAc,mBAAmB,eAAe;AAAA,IAClE;AAAA,IAEA,MAAM,qBAAqB,SAAS,UAAU,QAAQ;AACpD,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,cAAc,YAAY,SAAS,UAAU,MAAM;AAAA,IACrE;AAAA;AAAA,IAIA,MAAM,oBAAoB,MAAM,UAAU,IAAI;AAC5C,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,KAAK,kBAAkB,MAAM,OAAO;AAAA,IACtD;AAAA,IAEA,MAAM,sBAAsB,SAAS,UAAU,UAAU,CAAA,GAAI;AAC3D,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,KAAK,oBAAoB,SAAS,UAAU,OAAO;AAAA,IACrE;AAAA,IAEA,MAAM,wBAAwB,SAAS,UAAU,UAAU,CAAA,GAAI;AAC7D,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,KAAK,sBAAsB,SAAS,UAAU,OAAO;AAAA,IACvE;AAAA,IAEA,MAAM,uBAAuB,MAAM,SAAS,UAAU,UAAU,CAAA,GAAI;AAClE,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,KAAK,uBAAuB,MAAM,SAAS,UAAU,OAAO;AAAA,IAC9E;AAAA,IAEA,MAAM,kBAAkB,SAAS,UAAU,UAAU,CAAA,GAAI;AACvD,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,KAAK,gBAAgB,SAAS,UAAU,OAAO;AAAA,IACjE;AAAA,IAEA,MAAM,0BAA0B,SAAS,UAAU,UAAU,CAAA,GAAI;AAC/D,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,KAAK,wBAAwB,SAAS,UAAU,OAAO;AAAA,IACzE;AAAA,IAEA,MAAM,mBAAmB,MAAM,SAAS,UAAU,UAAU,CAAA,GAAI;AAC9D,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,KAAK,iBAAiB,MAAM,SAAS,UAAU,OAAO;AAAA,IACxE;AAAA,IAEA,MAAM,iBAAiB,SAAS,UAAU,IAAI;AAC5C,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,KAAK,yBAAyB,SAAS,OAAO;AAAA,IAChE;AAAA,IAEA,MAAM,eAAe,SAAS,UAAU,UAAU,CAAA,GAAI;AACpD,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,KAAK,uBAAuB,SAAS,UAAU,OAAO;AAAA,IACxE;AAAA,IAEA,MAAM,gBAAgB,MAAM,SAAS,UAAU,UAAU,CAAA,GAAI;AAC3D,WAAK,WAAU;AACf,aAAO,KAAK,IAAI,KAAK,wBAAwB,MAAM,SAAS,UAAU,OAAO;AAAA,IAC/E;AAAA,EACJ;AACA;AClSO,SAAS,oBAAoB,MAAM;AACxC,SAAO,cAAc,KAAK;AAAA,IACxB,eAAe;AACb,aAAO,KAAK,eAAe;AAAA,IAC7B;AAAA,IAEA,oBAAoB;AAClB,UAAI,CAAC,KAAK,YAAY;AACpB,cAAM,IAAI,MAAM,wDAAwD;AAAA,MAC1E;AACA,aAAO,KAAK;AAAA,IACd;AAAA,IAEA,MAAM,cAAc,QAAQ;AAC1B,YAAM,eAAe,IAAI,aAAa,MAAM;AAC5C,YAAM,iBAAiB,MAAM,aAAa;AAAA,QACxC,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,MACf;AAEM,YAAM,WAAW,IAAI,iBAAiB,YAAY;AAClD,YAAM,iBAAiB,IAAI,eAAe,cAAc,QAAQ;AAEhE,WAAK,aAAa;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,OAAO;AAAA,MACxB;AAEM,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS,OAAO,aAAa,MAAM,aAAa,WAAU,IAAK;AAAA,MACvE;AAAA,IACI;AAAA,IAEA,MAAM,qBAAqB,SAAS;AAClC,YAAM,eAAe,IAAI,aAAY;AACrC,YAAM,iBAAiB,MAAM,aAAa,eAAe,OAAO;AAEhE,YAAM,WAAW,IAAI,iBAAiB,YAAY;AAClD,YAAM,iBAAiB,IAAI,eAAe,cAAc,QAAQ;AAEhE,WAAK,aAAa;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,aAAa;AAAA,MAC9B;AAEM,aAAO;AAAA,IACT;AAAA,IAEA,MAAM,gBAAgB,UAAU,IAAI;AAClC,YAAM,EAAE,SAAQ,IAAK,KAAK,kBAAiB;AAC3C,aAAO,SAAS,UAAU,OAAO;AAAA,IACnC;AAAA,IAEA,sBAAsB,WAAW;AAC/B,YAAM,EAAE,SAAQ,IAAK,KAAK,kBAAiB;AAC3C,eAAS,sBAAsB,SAAS;AAAA,IAC1C;AAAA,IAEA,uBAAuB;AACrB,YAAM,EAAE,SAAQ,IAAK,KAAK,kBAAiB;AAC3C,aAAO,SAAS,qBAAoB;AAAA,IACtC;AAAA,IAEA,MAAM,oBAAoB,SAAS9O,QAAO,YAAY,UAAU,CAAA,GAAI;AAClE,YAAM,EAAE,eAAc,IAAK,KAAK,kBAAiB;AACjD,aAAO,eAAe,OAAO,SAASA,OAAM,OAAO;AAAA,IACrD;AAAA,IAEA,MAAM,kBAAkB,SAAS,iBAAiBA,QAAO,YAAY;AACnE,YAAM,EAAE,eAAc,IAAK,KAAK,kBAAiB;AACjD,aAAO,eAAe,KAAK,SAAS,iBAAiBA,KAAI;AAAA,IAC3D;AAAA,IAEA,MAAM,oBAAoB,SAAS;AACjC,YAAM,EAAE,eAAc,IAAK,KAAK,kBAAiB;AACjD,aAAO,eAAe,OAAO,OAAO;AAAA,IACtC;AAAA,IAEA,iBAAiB,SAAS;AACxB,UAAI,CAAC,KAAK,WAAY,QAAO;AAC7B,aAAO,KAAK,WAAW,eAAe,YAAY,OAAO;AAAA,IAC3D;AAAA,IAEA,wBAAwB,SAAS;AAC/B,UAAI,CAAC,KAAK,WAAY,QAAO;AAC7B,aAAO,KAAK,WAAW,eAAe,WAAW,OAAO;AAAA,IAC1D;AAAA,IAEA,iBAAiB,SAAS;AACxB,UAAI,CAAC,KAAK,WAAY,QAAO;AAC7B,aAAO,KAAK,WAAW,eAAe,YAAY,OAAO;AAAA,IAC3D;AAAA,IAEA,qBAAqB;AACnB,UAAI,CAAC,KAAK,WAAY,QAAO,CAAA;AAC7B,aAAO,KAAK,WAAW,eAAe,QAAO;AAAA,IAC/C;AAAA,IAEA,mBAAmB,SAAS;AAC1B,YAAM,EAAE,eAAc,IAAK,KAAK,kBAAiB;AACjD,aAAO,eAAe,kBAAkB,OAAO;AAAA,IACjD;AAAA;AAAA,IAIA,MAAM,kBAAkB,SAAS,QAAQ;AACvC,aAAO,KAAK,mBAAmB,OAAO,EAAE,UAAU,MAAM;AAAA,IAC1D;AAAA,IAEA,MAAM,mBAAmB,SAAS,SAAS;AACzC,aAAO,KAAK,mBAAmB,OAAO,EAAE,WAAW,OAAO;AAAA,IAC5D;AAAA,IAEA,MAAM,iBAAiB,SAAS,QAAQ;AACtC,aAAO,KAAK,mBAAmB,OAAO,EAAE,SAAS,MAAM;AAAA,IACzD;AAAA;AAAA,IAIA,MAAM,eAAe,SAAS,cAAc,QAAQ;AAClD,aAAO,KAAK,mBAAmB,OAAO,EAAE,OAAO,cAAc,MAAM;AAAA,IACrE;AAAA,IAEA,MAAM,kBAAkB,SAAS,QAAQ;AACvC,aAAO,KAAK,mBAAmB,OAAO,EAAE,UAAU,MAAM;AAAA,IAC1D;AAAA,IAEA,MAAM,gBAAgB,SAAS,QAAQ;AACrC,aAAO,KAAK,mBAAmB,OAAO,EAAE,QAAQ,MAAM;AAAA,IACxD;AAAA,IAEA,MAAM,cAAc,SAAS,QAAQ,oBAAoB;AACvD,aAAO,KAAK,mBAAmB,OAAO,EAAE,MAAM,QAAQ,kBAAkB;AAAA,IAC1E;AAAA,IAEA,MAAM,sBAAsB,SAAS,QAAQ;AAC3C,aAAO,KAAK,mBAAmB,OAAO,EAAE,cAAc,MAAM;AAAA,IAC9D;AAAA,IAEA,MAAM,wBAAwB,SAAS,QAAQ,cAAc;AAC3D,aAAO,KAAK,mBAAmB,OAAO,EAAE,gBAAgB,QAAQ,YAAY;AAAA,IAC9E;AAAA;AAAA,IAIA,MAAM,iBAAiB,SAAS,aAAa,aAAa;AACxD,aAAO,KAAK,mBAAmB,OAAO,EAAE,iBAAiB,aAAa,WAAW;AAAA,IACnF;AAAA,IAEA,MAAM,iBAAiB,SAAS;AAC9B,aAAO,KAAK,mBAAmB,OAAO,EAAE,iBAAgB;AAAA,IAC1D;AAAA,IAEA,MAAM,sBAAsB,SAAS,eAAeE,OAAM;AACxD,aAAO,KAAK,mBAAmB,OAAO,EAAE,sBAAsB,eAAeA,KAAI;AAAA,IACnF;AAAA,IAEA,MAAM,oBAAoB,SAAS,eAAeA,OAAM,SAAS,GAAG;AAClE,aAAO,KAAK,mBAAmB,OAAO,EAAE,oBAAoB,eAAeA,OAAM,MAAM;AAAA,IACzF;AAAA,IAEA,MAAM,0BAA0B,SAAS;AACvC,aAAO,KAAK,mBAAmB,OAAO,EAAE,kBAAiB;AAAA,IAC3D;AAAA;AAAA,IAIA,MAAM,wBAAwB,SAAS,SAAS,SAAS;AACvD,aAAO,KAAK,mBAAmB,OAAO,EAAE,gBAAgB,SAAS,OAAO;AAAA,IAC1E;AAAA,IAEA,MAAM,wBAAwB,SAAS,QAAQ;AAC7C,aAAO,KAAK,mBAAmB,OAAO,EAAE,gBAAgB,MAAM;AAAA,IAChE;AAAA,IAEA,MAAM,6BAA6B,SAAS;AAC1C,aAAO,KAAK,mBAAmB,OAAO,EAAE,qBAAoB;AAAA,IAC9D;AAAA;AAAA,IAIA,MAAM,kBAAkB,SAAS,cAAc,QAAQ,MAAM;AAC3D,aAAO,KAAK,mBAAmB,OAAO,EAAE,UAAU,cAAc,QAAQ,IAAI;AAAA,IAC9E;AAAA,IAEA,MAAM,uBAAuB,SAAS,cAAc,QAAQ;AAC1D,aAAO,KAAK,mBAAmB,OAAO,EAAE,eAAe,cAAc,MAAM;AAAA,IAC7E;AAAA,IAEA,MAAM,gBAAgB,SAAS,QAAQ;AACrC,aAAO,KAAK,mBAAmB,OAAO,EAAE,QAAQ,MAAM;AAAA,IACxD;AAAA,IAEA,MAAM,sBAAsB,SAAS,cAAc,GAAGR,IAAG,GAAG;AAC1D,aAAO,KAAK,mBAAmB,OAAO,EAAE,kBAAkB,cAAc,GAAGA,IAAG,CAAC;AAAA,IACjF;AAAA;AAAA,IAIA,MAAM,mBAAmB,SAAS,YAAY,UAAU,QAAQ;AAC9D,aAAO,KAAK,mBAAmB,OAAO,EAAE,WAAW,YAAY,UAAU,MAAM;AAAA,IACjF;AAAA,IAEA,MAAM,6BAA6B,SAAS,QAAQ;AAClD,aAAO,KAAK,mBAAmB,OAAO,EAAE,qBAAqB,MAAM;AAAA,IACrE;AAAA,IAEA,MAAM,gCAAgC,SAAS,QAAQ;AACrD,aAAO,KAAK,mBAAmB,OAAO,EAAE,wBAAwB,MAAM;AAAA,IACxE;AAAA;AAAA,IAIA,MAAM,qBAAqB,SAAS,WAAW;AAC7C,aAAO,KAAK,mBAAmB,OAAO,EAAE,aAAa,SAAS;AAAA,IAChE;AAAA,IAEA,MAAM,qBAAqB,SAAS;AAClC,aAAO,KAAK,mBAAmB,OAAO,EAAE,aAAY;AAAA,IACtD;AAAA,IAEA,MAAM,yBAAyB,SAAS,SAAS,aAAa;AAC5D,aAAO,KAAK,mBAAmB,OAAO,EAAE,iBAAiB,SAAS,WAAW;AAAA,IAC/E;AAAA;AAAA,IAIA,MAAM,sBAAsB,SAAS;AACnC,aAAO,KAAK,mBAAmB,OAAO,EAAE,cAAa;AAAA,IACvD;AAAA,IAEA,MAAM,iBAAiB,SAAS;AAC9B,aAAO,KAAK,mBAAmB,OAAO,EAAE,aAAY;AAAA,IACtD;AAAA,IAEA,MAAM,aAAa,SAAS,gBAAgB;AAC1C,aAAO,KAAK,mBAAmB,OAAO,EAAE,KAAK,cAAc;AAAA,IAC7D;AAAA,IAEA,MAAM,yBAAyB,SAAS;AACtC,aAAO,KAAK,mBAAmB,OAAO,EAAE,iBAAgB;AAAA,IAC1D;AAAA;AAAA,IAIA,MAAM,gBAAgB,SAAS;AAC7B,aAAO,KAAK,mBAAmB,OAAO,EAAE,QAAO;AAAA,IACjD;AAAA,IAEA,MAAM,iBAAiB,SAAS;AAC9B,aAAO,KAAK,mBAAmB,OAAO,EAAE,SAAQ;AAAA,IAClD;AAAA,IAEA,MAAM,sBAAsB,SAAS;AACnC,aAAO,KAAK,mBAAmB,OAAO,EAAE,cAAa;AAAA,IACvD;AAAA,IAEA,MAAM,0BAA0B,SAAS,cAAc;AACrD,aAAO,KAAK,mBAAmB,OAAO,EAAE,kBAAkB,YAAY;AAAA,IACxE;AAAA,IAEA,kBAAkB;AAChB,aAAO;AAAA,IACT;AAAA,IAEA,kBAAkB;AAChB,aAAO,KAAK,YAAY,gBAAgB;AAAA,IAC1C;AAAA,EACJ;AACA;ACzRA,MAAM,0BAA0B;AAChC,MAAM,yBAAyB;AAC/B,MAAM,0BAA0B;AAczB,eAAe,sBAAsB,QAAQ,SAAS,cAAc,UAAU,CAAA,GAAI;AACvF,QAAM;AAAA,IACJ,QAAQ,EAAE,SAAS,KAAK,UAAU,IAAG;AAAA,IACrC,cAAc,CAAC,MAAM;AAAA,IACrB,UAAU;AAAA,IACV,YAAY,KAAK,KAAK,KAAK,KAAK;AAAA;AAAA,EACpC,IAAM;AAGJ,QAAM,oBAAoB,MAAM;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,WAAW,OAAO,YAAY,UAAS;AAAA,EAC7C;AAEE,QAAM,QAAQ;AAAA,IACZ,MAAM;AAAA,IACN,YAAY,KAAK,MAAM,KAAK,IAAG,IAAK,GAAI;AAAA,IACxC,MAAM;AAAA,MACJ,CAAC,KAAK,sBAAsB,aAAa,MAAM,GAAG,EAAE,CAAC,EAAE;AAAA,MACvD,CAAC,KAAK,YAAY;AAAA,MAClB,CAAC,cAAc,OAAO;AAAA,MACtB,CAAC,SAAS,KAAK,UAAU,KAAK,CAAC;AAAA,MAC/B,CAAC,eAAe,YAAY,KAAK,GAAG,CAAC;AAAA,IAC3C;AAAA,IACI,SAAS,KAAK,UAAU;AAAA,MACtB;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,MAChB,sBAAsB;AAAA,IAC5B,CAAK;AAAA,EACL;AAEE,QAAM,SAAS,MAAM,OAAO,QAAQ,KAAK;AACzC,SAAO;AAAA,IACL,SAAS,OAAO,MAAM;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACP;AACA;AAQO,eAAe,4BAA4B,QAAQ,UAAU;AAClE,QAAM,SAAS;AAAA,IACb,OAAO,CAAC,uBAAuB;AAAA,IAC/B,MAAM,CAAC,OAAO,SAAS;AAAA,EAC3B;AAEE,SAAO,OAAO,UAAU,QAAQ,CAAC,UAAU;AACzC,QAAI;AACF,YAAM,UAAU,KAAK,MAAM,MAAM,OAAO;AACxC,YAAM,WAAW,MAAM,KAAK,KAAK,OAAK,EAAE,CAAC,MAAM,OAAO;AACtD,YAAM,iBAAiB,MAAM,KAAK,KAAK,OAAK,EAAE,CAAC,MAAM,aAAa;AAClE,YAAM,gBAAgB,MAAM,KAAK,KAAK,OAAK,EAAE,CAAC,MAAM,YAAY;AAEhE,YAAM,UAAU;AAAA,QACd,SAAS,MAAM;AAAA,QACf,iBAAiB,MAAM;AAAA,QACvB,SAAS,gBAAgB,CAAC;AAAA,QAC1B,OAAO,WAAW,KAAK,MAAM,SAAS,CAAC,CAAC,IAAI,EAAE,SAAS,KAAK,UAAU,IAAG;AAAA,QACzE,aAAa,iBAAiB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM;AAAA,QACpE,SAAS,QAAQ;AAAA,QACjB,mBAAmB,QAAQ;AAAA,QAC3B,WAAW,MAAM;AAAA,MACzB;AAEM,eAAS,OAAO;AAAA,IAClB,SAAS,OAAO;AACd,cAAQ,MAAM,uCAAuC,KAAK;AAAA,IAC5D;AAAA,EACF,CAAC;AACH;AAcO,eAAe,wBAAwB,QAAQ,SAAS,SAAS,UAAU,CAAA,GAAI;AACpF,QAAM;AAAA,IACJ,QAAQ,QAAQ;AAAA,IAChB,cAAc,QAAQ;AAAA,IACtB,QAAQ;AAAA,IACR,YAAY,KAAK,KAAK,KAAK,KAAK;AAAA,EACpC,IAAM;AAGJ,QAAM,oBAAoB,MAAM;AAAA,IAC9B;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,EAAE,WAAW,OAAO,YAAY,UAAS;AAAA,EAC7C;AAGE,QAAM,oBAAoB,QAAQ,SAAS,QAAQ,iBAAiB;AAAA,IAClE;AAAA,IACA,UAAU;AAAA,IACV,qBAAqB,CAAC;AAAA,MACpB,OAAO,QAAQ;AAAA,MACf,OAAO,QAAQ;AAAA,MACf,aAAa,QAAQ;AAAA,MACrB,SAAS,KAAK,IAAG,IAAK;AAAA,IAC5B,CAAK;AAAA,EACL,CAAG;AAGD,QAAM,QAAQ;AAAA,IACZ,MAAM;AAAA,IACN,YAAY,KAAK,MAAM,KAAK,IAAG,IAAK,GAAI;AAAA,IACxC,MAAM;AAAA,MACJ,CAAC,KAAK,qBAAqB,QAAQ,gBAAgB,MAAM,GAAG,EAAE,CAAC,EAAE;AAAA,MACjE,CAAC,KAAK,QAAQ,eAAe;AAAA,MAC7B,CAAC,KAAK,QAAQ,OAAO;AAAA;AAAA,MACrB,CAAC,cAAc,OAAO;AAAA,MACtB,CAAC,SAAS,KAAK,UAAU,KAAK,CAAC;AAAA,MAC/B,CAAC,eAAe,YAAY,KAAK,GAAG,CAAC;AAAA,IAC3C;AAAA,IACI,SAAS,KAAK,UAAU;AAAA,MACtB,eAAe;AAAA,MACf;AAAA,IACN,CAAK;AAAA,EACL;AAEE,QAAM,SAAS,MAAM,OAAO,QAAQ,KAAK;AACzC,SAAO;AAAA,IACL,SAAS,OAAO,MAAM;AAAA,IACtB,iBAAiB,QAAQ;AAAA,IACzB;AAAA,IACA,eAAe;AAAA,IACf,GAAG;AAAA,EACP;AACA;AAUO,eAAe,yBAAyB,QAAQ,SAAS,SAAS,SAAS,IAAI;AACpF,QAAM,QAAQ;AAAA,IACZ,MAAM;AAAA,IACN,YAAY,KAAK,MAAM,KAAK,IAAG,IAAK,GAAI;AAAA,IACxC,MAAM;AAAA,MACJ,CAAC,KAAK,sBAAsB,QAAQ,gBAAgB,MAAM,GAAG,EAAE,CAAC,EAAE;AAAA,MAClE,CAAC,KAAK,QAAQ,eAAe;AAAA,MAC7B,CAAC,KAAK,QAAQ,OAAO;AAAA,MACrB,CAAC,cAAc,OAAO;AAAA,IAC5B;AAAA,IACI,SAAS,KAAK,UAAU,EAAE,OAAM,CAAE;AAAA,EACtC;AAEE,QAAM,SAAS,MAAM,OAAO,QAAQ,KAAK;AACzC,SAAO;AAAA,IACL,SAAS,OAAO,MAAM;AAAA,IACtB,iBAAiB,QAAQ;AAAA,IACzB;AAAA,IACA,GAAG;AAAA,EACP;AACA;AASO,eAAe,+BAA+B,QAAQ,SAAS,UAAU;AAC9E,QAAM,SAAS;AAAA,IACb,OAAO,CAAC,sBAAsB;AAAA,IAC9B,MAAM,CAAC,OAAO,SAAS;AAAA,EAC3B;AAEE,SAAO,OAAO,UAAU,QAAQ,OAAO,UAAU;AAC/C,QAAI;AACF,YAAM,UAAU,KAAK,MAAM,MAAM,OAAO;AACxC,YAAM,WAAW,MAAM,KAAK,KAAK,OAAK,EAAE,CAAC,MAAM,OAAO;AACtD,YAAM,iBAAiB,MAAM,KAAK,KAAK,OAAK,EAAE,CAAC,MAAM,aAAa;AAGlE,YAAM,uBAAuB,QAAQ,SAAS,MAAM,QAAQ;AAAA,QAC1D,OAAO,QAAQ;AAAA,QACf,OAAO,WAAW,KAAK,MAAM,SAAS,CAAC,CAAC,IAAI,QAAQ;AAAA,QACpD,aAAa,iBAAiB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM;AAAA,QACpE,SAAS,KAAK,IAAG,IAAK,KAAK,KAAK,KAAK,KAAK;AAAA;AAAA,MAClD,CAAO;AAED,eAAS;AAAA,QACP,gBAAgB,MAAM;AAAA,QACtB,mBAAmB,MAAM,KAAK,KAAK,OAAK,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC;AAAA,QACzD,eAAe,QAAQ;AAAA,QACvB,mBAAmB,QAAQ;AAAA,QAC3B,WAAW,MAAM;AAAA,MACzB,CAAO;AAAA,IACH,SAAS,OAAO;AACd,cAAQ,MAAM,0CAA0C,KAAK;AAAA,IAC/D;AAAA,EACF,CAAC;AACH;AAQO,eAAe,4BAA4B,QAAQ,UAAU;AAClE,QAAM,SAAS;AAAA,IACb,OAAO,CAAC,uBAAuB;AAAA,IAC/B,MAAM,CAAC,OAAO,SAAS;AAAA,EAC3B;AAEE,SAAO,OAAO,UAAU,QAAQ,CAAC,UAAU;AACzC,QAAI;AACF,YAAM,UAAU,KAAK,MAAM,MAAM,OAAO;AAExC,eAAS;AAAA,QACP,gBAAgB,MAAM;AAAA,QACtB,mBAAmB,MAAM,KAAK,KAAK,OAAK,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC;AAAA,QACzD,QAAQ,QAAQ,UAAU;AAAA,QAC1B,WAAW,MAAM;AAAA,MACzB,CAAO;AAAA,IACH,SAAS,OAAO;AACd,cAAQ,MAAM,uCAAuC,KAAK;AAAA,IAC5D;AAAA,EACF,CAAC;AACH;AASO,eAAe,6BAA6B,QAAQ,UAAU,IAAI;AACvE,QAAM,QAAQ,QAAQ,SAAS,KAAK,OAAO,KAAK,IAAG,IAAK,KAAK,KAAK,KAAK,KAAK,OAAQ,GAAI;AAGxF,QAAM,gBAAgB;AAAA,IACpB,OAAO,CAAC,uBAAuB;AAAA,IAC/B,SAAS,CAAC,OAAO,SAAS;AAAA,IAC1B;AAAA,EACJ;AACE,QAAM,WAAW,MAAM,OAAO,MAAM,aAAa;AAGjD,QAAM,iBAAiB;AAAA,IACrB,OAAO,CAAC,wBAAwB,uBAAuB;AAAA,IACvD,MAAM,CAAC,OAAO,SAAS;AAAA,IACvB;AAAA,EACJ;AACE,QAAM,YAAY,MAAM,OAAO,MAAM,cAAc;AAGnD,QAAM,sBAAsB,oBAAI,IAAG;AACnC,aAAW,YAAY,WAAW;AAChC,UAAM,OAAO,SAAS,KAAK,KAAK,OAAK,EAAE,CAAC,MAAM,GAAG;AACjD,QAAI,MAAM;AACR,0BAAoB,IAAI,KAAK,CAAC,CAAC;AAAA,IACjC;AAAA,EACF;AAGA,QAAM,UAAU,CAAA;AAChB,aAAW,WAAW,UAAU;AAC9B,QAAI,CAAC,oBAAoB,IAAI,QAAQ,EAAE,GAAG;AACxC,UAAI;AACF,cAAM,UAAU,KAAK,MAAM,QAAQ,OAAO;AAC1C,cAAM,OAAO,QAAQ,KAAK,KAAK,OAAK,EAAE,CAAC,MAAM,GAAG;AAChD,cAAM,WAAW,QAAQ,KAAK,KAAK,OAAK,EAAE,CAAC,MAAM,OAAO;AACxD,cAAM,iBAAiB,QAAQ,KAAK,KAAK,OAAK,EAAE,CAAC,MAAM,aAAa;AAEpE,gBAAQ,KAAK;AAAA,UACX,SAAS,QAAQ;AAAA,UACjB,cAAc,OAAO,CAAC;AAAA,UACtB,OAAO,WAAW,KAAK,MAAM,SAAS,CAAC,CAAC,IAAI,EAAE,SAAS,KAAK,UAAU,IAAG;AAAA,UACzE,aAAa,iBAAiB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM;AAAA,UACpE,SAAS,QAAQ;AAAA,UACjB,WAAW,QAAQ;AAAA,QAC7B,CAAS;AAAA,MACH,SAAS,OAAO;AACd,gBAAQ,MAAM,oCAAoC,KAAK;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;ACzUO,MAAM,2BAA2B,MAAM;AAAA,EAC5C,YAAY,SAAS,qBAAqB,MAAM;AAC9C,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,qBAAqB;AAAA,EAC5B;AACF;AAEO,MAAMqE,yBAAwB,MAAM;AAAA,EACzC,YAAY,SAAS;AACnB,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;ACGO,SAAS,sBAAsB,MAAM;AAC1C,SAAO,cAAc,KAAK;AAAA;AAAA,IAGxB,MAAM,uBAAuB,QAAQ,UAAU,IAAI;AACjD,UAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,cAAM,IAAIA,iBAAgB,0CAA0C;AAAA,MACtE;AACA,aAAOmM;AAAAA,QACL,KAAK;AAAA,QACL,KAAK,OAAO;AAAA,QACZ;AAAA,QACA;AAAA,MACR;AAAA,IACI;AAAA,IAEA,MAAM,0BAA0B,QAAQ;AACtC,aAAOC;AAAAA,QACL,KAAK;AAAA,QACL,KAAK,OAAO;AAAA,QACZ;AAAA,MACR;AAAA,IACI;AAAA,IAEA,MAAM,0BAA0B;AAC9B,aAAOC;AAAAA,QACL,KAAK;AAAA,QACL,KAAK,OAAO;AAAA,MACpB;AAAA,IACI;AAAA,IAEA,MAAM,wBAAwB;AAC5B,aAAOC;AAAAA,QACL,KAAK;AAAA,QACL,KAAK,OAAO;AAAA,MACpB;AAAA,IACI;AAAA,IAEA,MAAM,uBAAuB,eAAe,gBAAgB;AAC1D,aAAOC;AAAAA,QACL,KAAK;AAAA,QACL,KAAK,OAAO;AAAA,QACZ;AAAA,QACA;AAAA,MACR;AAAA,IACI;AAAA,IAEA,MAAM,wBAAwB,cAAc,SAAS,UAAU,SAAS,MAAM;AAC5E,YAAM,kBAAkB,MAAMC;AAAAA,QAC5B,KAAK;AAAA,QACL,KAAK,OAAO;AAAA,QACZ;AAAA,QACA,EAAE,SAAS,UAAU,OAAM;AAAA,MACnC;AAEM,UAAI,CAAC,iBAAiB;AACpB,cAAM,IAAI,mBAAmB,4CAA4C,MAAM;AAAA,MACjF;AAEA,YAAM,UAAU,MAAM,KAAK;AAAA,QACzB,gBAAgB;AAAA,QAChB;AAAA,QACA,EAAE,SAAS,UAAU,OAAM;AAAA,MACnC;AAEM,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,mBAAmB,kCAAkC,MAAM;AAAA,MACvE;AAEA,UAAI,QAAQ;AACV,cAAM,OAAOC,UAAkB,KAAK,OAAO,SAAS,SAAS,UAAU,MAAM;AAC7E,eAAOC,SAAoB,KAAK,QAAQ,MAAM,KAAO;AAAA,UACnD,SAAS,CAAC,YAAY;AAAA,UACtB,eAAe;AAAA,QACzB,CAAS;AAAA,MACH,OAAO;AACL,cAAM,OAAOD,UAAkB,KAAK,OAAO,SAAS,SAAS,QAAQ;AACrE,eAAOE,YAAuB,KAAK,QAAQ,MAAM,KAAO;AAAA,UACtD,SAAS,CAAC,YAAY;AAAA,UACtB,eAAe;AAAA,QACzB,CAAS;AAAA,MACH;AAAA,IACF;AAAA,IAEA,MAAM,8BAA8B,cAAc,aAAa,UAAU,QAAQ,aAAa,UAAU,IAAI;AAC1G,YAAM,EAAE,kBAAkB,KAAI,IAAK;AAEnC,YAAM,kBAAkB,MAAMH;AAAAA,QAC5B,KAAK;AAAA,QACL,KAAK,OAAO;AAAA,QACZ;AAAA,QACA,EAAE,SAAS,aAAa,UAAU,OAAM;AAAA,MAChD;AAEM,UAAI,CAAC,iBAAiB;AACpB,cAAM,IAAI,mBAAmB,qDAAqD,MAAM;AAAA,MAC1F;AAEA,YAAMxL,aAAW4L;AAAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK,OAAO;AAAA,QACZ;AAAA,UACE,cAAc;AAAA,UACd,YAAY,kBAAkB,gBAAgB,QAAQ;AAAA,QAChE;AAAA,MACA;AAEM,YAAM,aAAaH,UAAkB,KAAK,OAAO,SAAS,aAAa,UAAU,MAAM;AACvF,YAAMI,MAAc,KAAK,QAAQ,YAAY7L,UAAQ;AAErD,aAAOA;AAAAA,IACT;AAAA,IAEA,MAAM,6BAA6B,cAAc,OAAO,aAAa,UAAU,CAAA,GAAI;AACjF,YAAM,EAAE,YAAY,MAAS,kBAAkB,KAAI,IAAK;AAExD,YAAM,QAAQ,MAAM8L;AAAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACE;AAAA,UACA,WAAW,KAAK,OAAO;AAAA,QACjC;AAAA,MACA;AAEM,UAAI,iBAAiB;AACnB,cAAM,UAAU,MAAMC;AAAAA,UACpB,KAAK;AAAA,UACL,KAAK,OAAO;AAAA,UACZ;AAAA,QACV;AAEQ,YAAI,CAAC,SAAS;AACZ,gBAAMZ;AAAAA,YACJ,KAAK;AAAA,YACL,KAAK,OAAO;AAAA,YACZ;AAAA,YACA,EAAE,UAAU,oBAAmB;AAAA,UAC3C;AAAA,QACQ;AAEA,cAAMa;AAAAA,UACJ,KAAK;AAAA,UACL,KAAK,OAAO;AAAA,UACZ;AAAA,UACA;AAAA,YACE,WAAW,MAAM,KAAK,WAAW,KAAK;AAAA,YACtC;AAAA,YACA;AAAA,YACA,SAAS,KAAK,IAAG,IAAK;AAAA,UAClC;AAAA,QACA;AAAA,MACM;AAEA,aAAO;AAAA,IACT;AAAA,IAEA,MAAM,WAAW,OAAO;AACtB,YAAM,UAAU,IAAI,YAAW;AAC/B,aAAO7M,aAAW,OAAO,QAAQ,OAAO,KAAK,CAAC,CAAC;AAAA,IACjD;AAAA;AAAA,IAIA,MAAM,sBAAsB,cAAc,UAAU,IAAI;AACtD,aAAO8M;AAAAA,QACL,KAAK;AAAA,QACL,KAAK,OAAO;AAAA,QACZ;AAAA,QACA;AAAA,MACR;AAAA,IACI;AAAA,IAEA,MAAM,4BAA4B,UAAU;AAC1C,aAAOC,4BAAsC,KAAK,QAAQ,QAAQ;AAAA,IACpE;AAAA,IAEA,MAAM,wBAAwB,SAAS,UAAU,IAAI;AACnD,aAAOC;AAAAA,QACL,KAAK;AAAA,QACL,KAAK,OAAO;AAAA,QACZ;AAAA,QACA;AAAA,MACR;AAAA,IACI;AAAA,IAEA,MAAM,yBAAyB,SAAS,SAAS,IAAI;AACnD,aAAOC;AAAAA,QACL,KAAK;AAAA,QACL,KAAK,OAAO;AAAA,QACZ;AAAA,QACA;AAAA,MACR;AAAA,IACI;AAAA,IAEA,MAAM,+BAA+B,UAAU;AAC7C,aAAOC;AAAAA,QACL,KAAK;AAAA,QACL,KAAK,OAAO;AAAA,QACZ;AAAA,MACR;AAAA,IACI;AAAA,IAEA,MAAM,4BAA4B,UAAU;AAC1C,aAAOC,4BAAsC,KAAK,QAAQ,QAAQ;AAAA,IACpE;AAAA,IAEA,MAAM,6BAA6B,UAAU,IAAI;AAC/C,aAAOC,6BAAuC,KAAK,QAAQ,OAAO;AAAA,IACpE;AAAA,EACJ;AACA;ACzLO,SAAS,iBAAiB,QAAQ,aAAa,MAAM,UAAU,CAAA,GAAI,eAAe,MAAM;AAE7F,QAAM,MAAM,IAAI,WAAW,QAAQ,QAAQ,GAAG;AAI9C,QAAM,SAAS;AAGf,QAAM,aAAa,IAAI1D,YAAW,QAAQ,UAAU;AACpD,QAAM,kBAAkB,IAAI,gBAAgB,GAAG;AAC/C,QAAM,UAAU,IAAI,QAAQ,GAAG;AAC/B,QAAM,UAAU,IAAI,QAAQ,GAAG;AAC/B,QAAM,MAAM,IAAI,IAAI,MAAM;AAC1B,QAAM,UAAU,IAAI,QAAQ,KAAK,UAAU;AAC3C,QAAM,aAAa,IAAI,WAAW,KAAK,UAAU;AACjD,QAAM,UAAU,IAAI,gBAAgB,KAAK,UAAU;AACnD,QAAM,cAAc,IAAI,iBAAiB,KAAK,UAAU;AACxD,QAAM,oBAAoB,IAAI,kBAAkB,KAAK,YAAY,UAAU;AAC3E,QAAM,gBAAgB,IAAI,sBAAsB,KAAK,YAAY,UAAU;AAC3E,QAAM,gBAAgB,IAAI,cAAc,KAAK,UAAU;AACvD,QAAM,OAAO,IAAI,KAAK,KAAK,UAAU;AAErC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA;ACnCA,MAAM,uBAAuB2D,aAAe;AAAA,EAC1C,YAAY,QAAQ;AAClB,UAAM,MAAM;AACZ,SAAK,UAAU,oBAAI,IAAG;AACtB,SAAK,SAAS,oBAAI,IAAG;AACrB,SAAK,uBAAuB,IAAIC,qBAAkC;AAGlE,SAAK,MAAM;AACX,UAAM,YAAY,OAAO,aAAa,KAAK,QAAQ,gBAAgB;AACnE,QAAI,WAAW;AACb,YAAM,YAAY;AAAA,QAChB,GAAG,OAAO;AAAA,QACV,OAAO,OAAO,WAAW,SAAS,KAAK,QAAQ,qBAAqB;AAAA,QACpE,aAAa,OAAO,WAAW,eAAe,KAAK,YAAY,KAAK,QAAQ,2BAA2B,CAAC;AAAA,MAChH;AACM,WAAK,cAAc,WAAW,SAAS;AAAA,IACzC;AAGA,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,QAAQtR,OAAM;AACZ,QAAI,OAAO,YAAY,eAAe,QAAQ,KAAK;AACjD,aAAO,QAAQ,IAAIA,KAAI;AAAA,IACzB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,OAAO;AACjB,QAAI,UAAU,UAAa,UAAU,KAAM,QAAO;AAClD,UAAM,SAAS,WAAW,KAAK;AAC/B,WAAO,MAAM,MAAM,IAAI,SAAY;AAAA,EACrC;AAAA,EAEA,cAAc,QAAQ,UAAU,IAAI;AAClC,UAAM,aAAa;AAAA,MACjB,GAAG,QAAQ;AAAA,MACX,OAAO,QAAQ,SAAS,QAAQ,KAAK;AAAA,MACrC,aAAa,QAAQ,eAAe,QAAQ,KAAK;AAAA,IACvD;AAEI,SAAK,MAAM;AAAA,MACT,KAAK,IAAI,WAAW,QAAQ,UAAU;AAAA,IAC5C;AAEI,UAAMuR,UAAS,QAAQ,QAAQ,EAAE;AACjC,UAAM,SAAS,IAAIA,QAAO,EAAE,OAAM,CAAE;AACpC,SAAK,IAAI,SAAS;AAElB,SAAK,IAAI,aAAa,IAAI7D,YAAW,QAAQ,IAAI;AACjD,SAAK,IAAI,kBAAkB,IAAI,gBAAgB,KAAK,IAAI,GAAG;AAC3D,SAAK,IAAI,UAAU,IAAI,QAAQ,KAAK,IAAI,GAAG;AAC3C,SAAK,IAAI,UAAU,IAAI,QAAQ,KAAK,IAAI,GAAG;AAC3C,SAAK,IAAI,MAAM,IAAI,IAAI,MAAM;AAC7B,SAAK,IAAI,UAAU,IAAI,QAAQ,KAAK,IAAI,KAAK,IAAI;AACjD,SAAK,IAAI,aAAa,IAAI,WAAW,KAAK,IAAI,KAAK,IAAI;AACvD,SAAK,IAAI,UAAU,IAAI,gBAAgB,KAAK,IAAI,KAAK,IAAI;AACzD,SAAK,IAAI,cAAc,IAAI,iBAAiB,KAAK,IAAI,KAAK,IAAI;AAC9D,SAAK,IAAI,oBAAoB,IAAI,kBAAkB,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,UAAU;AAC1F,SAAK,IAAI,gBAAgB,IAAI,sBAAsB,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,UAAU;AAC1F,SAAK,IAAI,gBAAgB,IAAI,cAAc,KAAK,IAAI,KAAK,IAAI;AAC7D,SAAK,IAAI,OAAO,IAAI,KAAK,KAAK,IAAI,KAAK,IAAI;AAAA,EAC7C;AAAA,EAEA,QAAQ;AACN,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,gBAAgB;AACd,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,MAAM,QAAQ,KAAK,KAAK,YAAY;AAClC,WAAO8D,QAAgB,KAAK,KAAK,UAAU;AAAA,EAC7C;AAAA,EAEA,MAAM,WAAW,SAAS,eAAe;AACvC,WAAOC,WAAmB,SAAS,aAAa;AAAA,EAClD;AAAA,EAEA,MAAM,YAAY,SAAS;AACzB,WAAOC,YAAoB,OAAO;AAAA,EACpC;AAAA,EAEA,UAAU,SAAS;AACjB,WAAOC,UAAkB,OAAO;AAAA,EAClC;AAAA;AAAA,EAIA,MAAM,MAAM,SAAS,UAAU,MAAM,UAAU,CAAA,GAAI;AACjD,QAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,YAAM,IAAI9N,kBAAgB,qDAAqD;AAAA,IACjF;AACA,QAAI,CAAC,YAAY,OAAO,aAAa,UAAU;AAC7C,YAAM,IAAIA,kBAAgB,sDAAsD;AAAA,IAClF;AACA,QAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,YAAM,IAAIA,kBAAgB,yCAAyC;AAAA,IACrE;AAEA,UAAM,WAAW,QAAQ,mBAAmB,QAAQ;AACpD,QAAI,UAAU;AACZ,YAAM,aAAa,MAAM,KAAK,iBAAiB,UAAU,SAAS,EAAE,SAAS,UAAU;AACvF,UAAI,CAAC,YAAY;AACf,cAAM,IAAI,mBAAmB,oEAAoE,OAAO;AAAA,MAC1G;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,IAAI;AACZ,WAAK,KAAK,GAAG,KAAK,IAAG,CAAE,IAAI,KAAK,OAAM,EAAG,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AAAA,IACpE;AAEA,UAAM,OAAOyM,UAAkB,KAAK,OAAO,SAAS,SAAS,UAAU,KAAK,EAAE;AAC9E,UAAM,eAAe,MAAMsB,KAAa,KAAK,QAAQ,IAAI;AAGzD,QAAI,gBAAgB,aAAa,aAAa,QAAQ,aAAa,QAAQ;AACzE,YAAM,0BAA0B,CAAC,YAAY,QAAQ,UAAU,MAAM,OAAO;AAC5E,YAAM,sBAAsB,OAAO,KAAK,YAAY,EAAE,OAAO,OAAK,CAAC,wBAAwB,SAAS,CAAC,CAAC;AAEtG,YAAM,YAAY,EAAE,GAAG,aAAY;AACnC,YAAM,gBAAgB,CAAA;AAEtB,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,YAAI,wBAAwB,SAAS,GAAG,KAAK,QAAQ,YAAa;AAClE,YAAI,oBAAoB,SAAS,GAAG,GAAG;AACrC,oBAAU,GAAG,IAAI;AAAA,QACnB,OAAO;AACL,wBAAc,GAAG,IAAI;AAAA,QACvB;AAAA,MACF;AAEA,UAAI,OAAO,KAAK,aAAa,EAAE,SAAS,KAAK,QAAQ,aAAa,SAAS,KAAK,QAAQ,IAAI,QAAQ,GAAG;AACrG,cAAM,aAAatB;AAAAA,UACjB,aAAa,OAAO,WAAW,KAAK,OAAO;AAAA,UAC3C,aAAa,OAAO;AAAA,UACpB,aAAa,OAAO;AAAA,UACpB,aAAa,OAAO;AAAA,QAC9B;AACQ,cAAM,oBAAoB,MAAMsB,KAAa,KAAK,QAAQ,UAAU;AACpE,cAAM,mBAAmB,EAAE,GAAG,mBAAmB,GAAG,cAAa;AAEjE,cAAM,YAAY,KAAK,QAAQ,IAAI,QAAQ;AAC3C,cAAM,SAAS,QAAQ,WAAW,SAAY,QAAQ,SAAS,UAAU;AAEzE,YAAI,UAAU,UAAU,OAAO,UAAU,WAAW,YAAY,CAAC,UAAU,OAAO,MAAM;AACtFC,mBAAgB,kBAAkB,UAAU,QAAQ,UAAU,MAAM;AAAA,QACtE;AAAA,MACF;AAEA,YAAMC,aAAY,KAAK,IAAG;AAC1B,YAAMpB,MAAc,KAAK,QAAQ,MAAM,SAAS;AAEhD,UAAI,OAAO,KAAK,aAAa,EAAE,SAAS,GAAG;AACzC,cAAM,aAAaJ;AAAAA,UACjB,aAAa,OAAO,WAAW,KAAK,OAAO;AAAA,UAC3C,aAAa,OAAO;AAAA,UACpB,aAAa,OAAO;AAAA,UACpB,aAAa,OAAO;AAAA,QAC9B;AACQ,cAAMyB,OAAe,KAAK,QAAQ,YAAY,aAAa;AAC3D,cAAMC;AAAAA,UACJ,KAAK;AAAA,UACL,aAAa,OAAO,WAAW,KAAK,OAAO;AAAA,UAC3C,aAAa,OAAO;AAAA,UACpB,aAAa,OAAO;AAAA,UACpB,aAAa,OAAO;AAAA,QAC9B;AAAA,MACM;AAEA,YAAMC,WAAU,KAAK,IAAG;AACxB,WAAK,SAAS;AACd,UAAI,CAAC,KAAK,SAAS,eAAgB,MAAK,SAAS,iBAAiB;AAClE,WAAK,SAAS,kBAAmBA,WAAUH;AAE3C,aAAO;AAAA,IACT;AAGA,QAAI,CAAC,KAAK,MAAO,MAAK,QAAQ,CAAA;AAC9B,SAAK,MAAM,YAAY,KAAK,MAAM,aAAa,KAAK,IAAG;AACvD,SAAK,MAAM,YAAY,KAAK,IAAG;AAE/B,QAAI,QAAQ,aAAa,SAAS,KAAK,QAAQ,IAAI,QAAQ,GAAG;AAC5D,YAAM,YAAY,KAAK,QAAQ,IAAI,QAAQ;AAC3C,YAAM,SAAS,QAAQ,WAAW,SAAY,QAAQ,SAAS,UAAU;AACzE,UAAI,UAAU,UAAU,OAAO,UAAU,WAAW,YAAY,CAAC,UAAU,OAAO,MAAM;AACtFD,iBAAgB,MAAM,UAAU,QAAQ,UAAU,MAAM;AAAA,MAC1D;AAAA,IACF;AAEA,UAAM,YAAY,KAAK,IAAG;AAC1B,UAAMnB,MAAc,KAAK,QAAQ,MAAM,IAAI;AAC3C,UAAM,UAAU,KAAK,IAAG;AAExB,SAAK,SAAS;AACd,QAAI,CAAC,KAAK,SAAS,eAAgB,MAAK,SAAS,iBAAiB;AAClE,SAAK,SAAS,kBAAmB,UAAU;AAE3C,UAAM,EAAE,gBAAgB,KAAI,IAAK;AACjC,QAAI,iBAAiB,CAAC,KAAK,UAAU;AACnC,YAAM,KAAK,UAAU,SAAS,UAAU,MAAM,QAAQ,sBAAsB,EAAE;AAAA,IAChF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,kBAAkB,MAAM,UAAU,oBAAI,IAAG,GAAI;AACjD,QAAI,CAAC,KAAM,QAAO;AAElB,QAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,YAAM,WAAW,CAAA;AACjB,iBAAW,QAAQ,MAAM;AACvB,cAAM,eAAe,MAAM,KAAK,kBAAkB,MAAM,oBAAI,KAAK;AACjE,YAAI,iBAAiB,MAAM;AACzB,mBAAS,KAAK,YAAY;AAAA,QAC5B;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,QAAI,QAAQ,OAAO,SAAS,UAAU;AACpC,UAAI,KAAK,aAAa,QAAQ,KAAK,QAAQ;AACzC,cAAM,aAAaJ;AAAAA,UACjB,KAAK,OAAO,WAAW,KAAK,OAAO;AAAA,UACnC,KAAK,OAAO;AAAA,UACZ,KAAK,OAAO;AAAA,UACZ,KAAK,OAAO;AAAA,QACtB;AAGQ,YAAI,QAAQ,IAAI,UAAU,GAAG;AAC3B,kBAAQ,KAAK,yCAAyC,UAAU,EAAE;AAClE,iBAAO;AAAA,QACT;AACA,gBAAQ,IAAI,UAAU;AAEtB,YAAI,iBAAiB,CAAA;AACrB,YAAI,KAAK,OAAO,cAAc;AAC5B,yBAAe,UAAU,CAAC,KAAK,OAAO,YAAY;AAClD,yBAAe,gBAAgB;AAAA,QACjC;AAEA,cAAM,aAAa,MAAMsB,KAAa,KAAK,QAAQ,YAAY,cAAc;AAC7E,YAAI,YAAY;AAEd,cAAI,iBAAiB;AACrB,cAAI,WAAW,aAAa,QAAQ,WAAW,QAAQ;AACrD,6BAAiB,MAAM,KAAK,kBAAkB,YAAY,OAAO;AACjE,gBAAI,mBAAmB,MAAM;AAC3B,qBAAO;AAAA,YACT;AAAA,UACF;AAGA,gBAAM,0BAA0B,CAAC,YAAY,QAAQ,UAAU,SAAS,MAAM,cAAc,iBAAiB;AAC7G,gBAAM,iBAAiB,CAAA;AACvB,qBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,GAAG;AACzC,gBAAI,CAAC,wBAAwB,SAAS,CAAC,GAAG;AACxC,6BAAe,CAAC,IAAI;AAAA,YACtB;AAAA,UACF;AAEA,gBAAM,SAAS;AAAA,YACb,GAAG;AAAA,YACH,GAAG;AAAA,YACH,WAAW;AAAA,cACT,YAAY;AAAA,cACZ,MAAM,KAAK;AAAA,cACX,aAAa,KAAK,OAAO;AAAA,cACzB,QAAQ,KAAK;AAAA,cACb,gBAAgB,OAAO,KAAK,cAAc;AAAA,cAC1C,iBAAiB,KAAK,mBAAmB;AAAA,YACvD;AAAA,UACA;AAGU,cAAI,eAAe,OAAO;AACxB,mBAAO,QAAQ,EAAE,GAAG,eAAe,OAAO,QAAQ,KAAK,OAAO,QAAO;AAAA,UACvE,OAAO;AACL,mBAAO,QAAQ,EAAE,QAAQ,KAAK,OAAO,QAAO;AAAA,UAC9C;AAEA,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,KAAK,SAAS,UAAU,SAAS,MAAM,UAAU,IAAI;AACzD,QAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,YAAM,IAAI/N,kBAAgB,qDAAqD;AAAA,IACjF;AACA,QAAI,CAAC,YAAY,OAAO,aAAa,UAAU;AAC7C,YAAM,IAAIA,kBAAgB,sDAAsD;AAAA,IAClF;AAEA,UAAM,WAAW,QAAQ,mBAAmB,QAAQ;AACpD,QAAI,UAAU;AACZ,YAAM,aAAa,MAAM,KAAK,iBAAiB,UAAU,QAAQ,EAAE,SAAS,UAAU,QAAQ;AAC9F,UAAI,CAAC,YAAY;AACf,cAAM,IAAI,mBAAmB,mEAAmE,MAAM;AAAA,MACxG;AAAA,IACF;AAEA,UAAM,YAAY,KAAK,IAAG;AAC1B,QAAI;AAEJ,QAAI,QAAQ;AACV,YAAM,OAAOyM,UAAkB,KAAK,OAAO,SAAS,SAAS,UAAU,MAAM;AAC7E,eAAS,MAAMsB,KAAa,KAAK,QAAQ,IAAI;AAAA,IAC/C,OAAO;AACL,YAAM,OAAOtB,UAAkB,KAAK,OAAO,SAAS,SAAS,QAAQ;AACrE,eAAS,MAAM4B,QAAgB,KAAK,QAAQ,IAAI;AAAA,IAClD;AAEA,UAAM,EAAE,mBAAmB,KAAI,IAAK;AACpC,QAAI,kBAAkB;AACpB,eAAS,MAAM,KAAK,kBAAkB,MAAM;AAAA,IAC9C;AAEA,UAAM,UAAU,KAAK,IAAG;AACxB,SAAK,SAAS;AACd,QAAI,CAAC,KAAK,SAAS,cAAe,MAAK,SAAS,gBAAgB;AAChE,SAAK,SAAS,iBAAkB,UAAU;AAE1C,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,SAAS,UAAU,QAAQ,SAAS,UAAU,IAAI;AAC7D,QAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,YAAM,IAAIrO,kBAAgB,qDAAqD;AAAA,IACjF;AACA,QAAI,CAAC,YAAY,OAAO,aAAa,UAAU;AAC7C,YAAM,IAAIA,kBAAgB,sDAAsD;AAAA,IAClF;AACA,QAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,YAAM,IAAIA,kBAAgB,oDAAoD;AAAA,IAChF;AACA,QAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,YAAM,IAAIA,kBAAgB,4CAA4C;AAAA,IACxE;AAEA,UAAM,WAAW,QAAQ,mBAAmB,QAAQ;AACpD,QAAI,UAAU;AACZ,YAAM,aAAa,MAAM,KAAK,iBAAiB,UAAU,SAAS,EAAE,SAAS,UAAU,QAAQ;AAC/F,UAAI,CAAC,YAAY;AACf,cAAM,IAAI,mBAAmB,qEAAqE,OAAO;AAAA,MAC3G;AAAA,IACF;AAEA,UAAM,OAAOyM,UAAkB,KAAK,OAAO,SAAS,SAAS,UAAU,MAAM;AAC7E,UAAM,eAAe,MAAMsB,KAAa,KAAK,QAAQ,IAAI;AAEzD,QAAI,CAAC,cAAc;AACjB,aAAO;AAAA,IACT;AAGA,QAAI,aAAa,aAAa,QAAQ,aAAa,QAAQ;AACzD,aAAO,KAAK,MAAM,SAAS,UAAU,EAAE,GAAG,cAAc,GAAG,SAAS,IAAI,OAAM,GAAI,OAAO;AAAA,IAC3F;AAEA,UAAM,aAAa,EAAE,GAAG,cAAc,GAAG,QAAO;AAChD,eAAW,QAAQ,WAAW,SAAS,CAAA;AACvC,eAAW,MAAM,YAAY,KAAK,IAAG;AAErC,QAAI,QAAQ,aAAa,SAAS,KAAK,QAAQ,IAAI,QAAQ,GAAG;AAC5D,YAAM,YAAY,KAAK,QAAQ,IAAI,QAAQ;AAC3C,YAAM,SAAS,QAAQ,WAAW,SAAY,QAAQ,SAAS,UAAU;AACzE,UAAI,UAAU,UAAU,OAAO,UAAU,WAAW,YAAY,CAAC,UAAU,OAAO,MAAM;AACtFC,iBAAgB,YAAY,UAAU,QAAQ,UAAU,MAAM;AAAA,MAChE;AAAA,IACF;AAEA,UAAM,YAAY,KAAK,IAAG;AAC1B,UAAMnB,MAAc,KAAK,QAAQ,MAAM,UAAU;AACjD,UAAM,UAAU,KAAK,IAAG;AAExB,SAAK,SAAS;AACd,QAAI,CAAC,KAAK,SAAS,eAAgB,MAAK,SAAS,iBAAiB;AAClE,SAAK,SAAS,kBAAmB,UAAU;AAE3C,QAAI,aAAa,SAAS,aAAa,MAAM,iBAAiB;AAC5D,YAAMsB,uBAAkC,KAAK,QAAQ,KAAK,OAAO,SAAS,SAAS,UAAU,MAAM;AAAA,IACrG;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,SAAS,UAAU,QAAQ,UAAU,CAAA,GAAI;AACpD,QAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,YAAM,IAAInO,kBAAgB,qDAAqD;AAAA,IACjF;AACA,QAAI,CAAC,YAAY,OAAO,aAAa,UAAU;AAC7C,YAAM,IAAIA,kBAAgB,sDAAsD;AAAA,IAClF;AACA,QAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,YAAM,IAAIA,kBAAgB,oDAAoD;AAAA,IAChF;AAEA,UAAM,OAAOyM,UAAkB,KAAK,OAAO,SAAS,SAAS,UAAU,MAAM;AAC7E,UAAM,eAAe,MAAMsB,KAAa,KAAK,QAAQ,IAAI;AAGzD,QAAI,CAAC,cAAc;AACjB,aAAO;AAAA,IACT;AAGA,UAAM,YAAY,aAAa,SAAS,aAAa;AACrD,UAAM,UAAU,CAAC,aAAa,cAAc,KAAK,OAAO;AAExD,UAAM,WAAW,QAAQ,mBAAmB,QAAQ;AACpD,QAAI,CAAC,SAAS;AAEZ,UAAI,CAAC,UAAU;AACb,cAAM,IAAI,mBAAmB,sEAAsE,QAAQ;AAAA,MAC7G;AACA,YAAM,aAAa,MAAM,KAAK,iBAAiB,UAAU,UAAU,EAAE,SAAS,UAAU,QAAQ;AAChG,UAAI,CAAC,YAAY;AACf,cAAM,IAAI,mBAAmB,qEAAqE,QAAQ;AAAA,MAC5G;AAAA,IACF,WAAW,UAAU;AAEnB,YAAM,aAAa,MAAM,KAAK,iBAAiB,UAAU,UAAU,EAAE,SAAS,UAAU,QAAQ;AAChG,UAAI,CAAC,YAAY;AACf,cAAM,IAAI,mBAAmB,qEAAqE,QAAQ;AAAA,MAC5G;AAAA,IACF;AAEA,QAAI,aAAa,aAAa,MAAM;AAClC,aAAO,KAAK,eAAe,SAAS,UAAU,QAAQ,OAAO;AAAA,IAC/D;AAEA,UAAMO,WAAmB,KAAK,QAAQ,IAAI;AAC1C,SAAK,SAAS;AACd,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,YAAY,OAAO,MAAM;AAC7B,WAAOC,YAAyB,KAAK,QAAQ,KAAK,OAAO,SAAS,OAAO,IAAI;AAAA,EAC/E;AAAA,EAEA,MAAM,WAAW,OAAO,MAAM,MAAM;AAClC,WAAOC,WAAwB,KAAK,QAAQ,KAAK,OAAO,SAAS,OAAO,GAAG;AAAA,EAC7E;AAAA,EAEA,MAAM,aAAa,OAAO,KAAK,SAAS;AACtC,WAAOC,aAA0B,KAAK,QAAQ,KAAK,OAAO,SAAS,OAAO,KAAK,OAAO;AAAA,EACxF;AAAA,EAEA,MAAM,aAAa,OAAO,KAAK;AAC7B,WAAOC,aAA0B,KAAK,QAAQ,KAAK,OAAO,SAAS,OAAO,GAAG;AAAA,EAC/E;AAAA,EAEA,MAAM,aAAa,OAAO;AACxB,WAAOC,aAA0B,KAAK,QAAQ,KAAK,OAAO,SAAS,KAAK;AAAA,EAC1E;AAAA,EAEA,MAAM,gBAAgB,OAAO;AAC3B,WAAOC,gBAA6B,KAAK,QAAQ,KAAK,OAAO,SAAS,KAAK;AAAA,EAC7E;AAAA;AAAA,EAGA,MAAM,OAAO,SAAS,UAAU;AAC9B,WAAO,KAAK,KAAK,SAAS,UAAU,IAAI;AAAA,EAC1C;AAAA,EAEA,MAAM,UAAU,SAAS,UAAU;AACjC,UAAM,OAAOnC,UAAkB,KAAK,OAAO,SAAS,SAAS,QAAQ;AACrE,WAAOoC,UAAkB,KAAK,QAAQ,IAAI;AAAA,EAC5C;AAAA;AAAA,EAGA,MAAM,UAAU,UAAU,aAAa,SAAS,OAAO;AACrD,QAAI,CAAC,YAAY,OAAO,aAAa,UAAU;AAC7C,YAAM,IAAI7O,kBAAgB,sDAAsD;AAAA,IAClF;AAGA,QAAI,eAAe,MAAM;AACvB,YAAM,IAAIA,kBAAgB,qDAAqD;AAAA,IACjF;AAEA,QAAI;AAGJ,QAAI,OAAO,gBAAgB,UAAU;AACnC,kBAAY,EAAE,MAAM,YAAW;AAAA,IACjC,WAAW,OAAO,gBAAgB,UAAU;AAE1C,YAAM,gBAAgB,YAAY,QAChC,YAAY,QACZ,YAAY,cACZ,YAAY,SACZ,YAAY,SACZ,YAAY,SACZ,YAAY,SACZ,YAAY;AAEd,UAAI,CAAC,eAAe;AAClB,cAAM,IAAIA,kBAAgB,6CAA6C;AAAA,MACzE;AACA,kBAAY;AAAA,IACd,OAAO;AACL,YAAM,IAAIA,kBAAgB,yDAAyD;AAAA,IACrF;AAEA,SAAK,QAAQ,IAAI,UAAU,EAAE,QAAQ,WAAW,QAAQ,WAAW,KAAK,IAAG,EAAE,CAAE;AAAA,EACjF;AAAA,EAEA,MAAM,UAAU,UAAU;AACxB,UAAM,YAAY,KAAK,QAAQ,IAAI,QAAQ;AAC3C,WAAO,YAAY,UAAU,SAAS;AAAA,EACxC;AAAA,EAEA,MAAM,YAAY,UAAU;AAC1B,SAAK,QAAQ,OAAO,QAAQ;AAAA,EAE9B;AAAA;AAAA,EAGA,MAAM,SAAS,aAAa,aAAa,UAAU,UAAU,CAAA,GAAI;AAC/D,UAAM,EAAE,YAAY,YAAY,OAAO,aAAa,SAAS,KAAI,IAAK;AAGtE,QAAI,gBAAgB,aAAa;AAC/B,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACvD;AACA,QAAI,CAAC,CAAC,WAAW,YAAY,eAAe,EAAE,SAAS,SAAS,GAAG;AACjE,YAAM,IAAI,MAAM,sBAAsB,SAAS,qDAAqD;AAAA,IACtG;AAGA,UAAM8O;AAAAA,MACJ,KAAK;AAAA,MACL,KAAK,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACN;AAGI,QAAI,cAAc,cAAc,cAAc,iBAAiB;AAC7D,YAAM,KAAK,uBAAuB,aAAa,aAAa,UAAU,EAAE,MAAM,QAAQ;AAAA,IACxF;AACA,QAAI,cAAc,aAAa,cAAc,iBAAiB;AAC5D,YAAM,KAAK,uBAAuB,aAAa,aAAa,UAAU,EAAE,MAAM,QAAQ;AAAA,IACxF;AAEA,SAAK,SAAS,eAAe,KAAK,SAAS,eAAe,KAAK;AAC/D,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,uBAAuB,WAAWC,UAAS,UAAU,UAAU,CAAA,GAAI;AACvE,UAAM,EAAE,OAAO,aAAa,SAAS,KAAI,IAAK;AAC9C,UAAM,eAAe,MAAM,KAAK,KAAK,WAAW,UAAU,MAAM,EAAE,kBAAkB,OAAO;AAC3F,QAAI,CAAC,aAAc;AAEnB,UAAM,QAAQ,MAAM,QAAQ,YAAY,IAAI,eAAe,CAAC,YAAY;AACxE,eAAW,QAAQ,OAAO;AAExB,UAAI,KAAK,aAAa,KAAM;AAE5B,UAAI,UAAU,CAAC,OAAO,IAAI,EAAG;AAC7B,YAAMC;AAAAA,QACJ,KAAK;AAAA,QACL,KAAK,OAAO;AAAA,QACZ;AAAA,QACA;AAAA,QACAD;AAAA,QACA;AAAA,QACA;AAAA,MACR;AAAA,IACI;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,SAAS,UAAU,UAAU,CAAA,GAAI;AACtD,UAAM,EAAE,mBAAmB,KAAI,IAAK;AACpC,UAAM,OAAOtC,UAAkB,KAAK,OAAO,SAAS,SAAS,QAAQ;AACrE,UAAM,OAAO,MAAM4B,QAAgB,KAAK,QAAQ,IAAI;AAEpD,QAAI,CAAC,QAAQ,CAAC,iBAAkB,QAAO;AAGvC,WAAO,KAAK,kBAAkB,IAAI;AAAA,EACpC;AAAA,EAEA,MAAM,WAAW,aAAa,aAAa,UAAU;AAEnD,UAAM,aAAa5B,UAAkB,KAAK,OAAO,SAAS,aAAa,UAAU,aAAa;AAC9F,QAAI;AACF,YAAM6B,WAAmB,KAAK,QAAQ,UAAU;AAAA,IAClD,SAAS,GAAG;AAAA,IAEZ;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,wBAAwB,SAAS,UAAU,QAAQ,WAAW;AAClE,WAAOW;AAAAA,MACL,KAAK;AAAA,MACL,KAAK,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACN;AAAA,EACE;AAAA,EAEA,eAAe,aAAa,UAAU,MAAM,cAAc,MAAM;AAC9D,WAAOrC;AAAAA,MACL;AAAA,MACA,eAAe;AAAA,MACf;AAAA,MACA,KAAK;AAAA,MACL,KAAK,OAAO;AAAA,IAClB;AAAA,EACE;AAAA,EAEA,MAAM,mBAAmB,SAAS,UAAU,QAAQ;AAElD,UAAM,OAAOH,UAAkB,KAAK,OAAO,SAAS,SAAS,UAAU,MAAM;AAC7E,UAAM,aAAa,MAAMsB,KAAa,KAAK,QAAQ,IAAI;AACvD,QAAI,CAAC,cAAc,CAAC,WAAW,SAAS,CAAC,WAAW,MAAM,iBAAiB;AACzE,aAAO,CAAA;AAAA,IACT;AACA,WAAO,WAAW,MAAM;AAAA,EAC1B;AAAA,EAEA,MAAM,qBAAqB,aAAa,UAAU,QAAQ,aAAa;AACrE,WAAOmB;AAAAA,MACL,KAAK;AAAA,MACL,KAAK,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACN;AAAA,EACE;AAAA,EAEA,MAAM,eAAe,SAAS,UAAU,QAAQ,UAAU,CAAA,GAAI;AAC5D,WAAOC;AAAAA,MACL,KAAK;AAAA,MACL,KAAK,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACN;AAAA,EACE;AAAA,EAEA,MAAM,cAAc,MAAM,aAAa,aAAa,UAAU,UAAU,IAAI;AAE1E,UAAM,OAAO,QAAQ,QAAQ;AAC7B,WAAOH;AAAAA,MACL,KAAK;AAAA,MACL,KAAK,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACN;AAAA,EACE;AAAA,EAEA,MAAM,gBAAgBhO,YAAU,UAAU,IAAI;AAC5C,WAAOoO,gBAA2B,KAAK,QAAQpO,YAAU,oBAAI,IAAG,GAAI,CAAA,GAAI,EAAE,GAAG,SAAS,SAAS,KAAK,OAAO,QAAO,CAAE;AAAA,EACtH;AAAA,EAEA,WAAW,MAAM;AACf,WAAOqO,WAAsB,IAAI;AAAA,EACnC;AAAA,EAEA,mBAAmB,MAAM;AACvB,WAAOC,mBAA8B,IAAI;AAAA,EAC3C;AAAA,EAEA,kBAAkB,MAAM;AACtB,WAAOC,kBAA6B,IAAI;AAAA,EAC1C;AAAA,EAEA,MAAM,yBAAyB,SAAS,UAAU,UAAU,CAAA,GAAI;AAC9D,WAAOC;AAAAA,MACL,KAAK;AAAA,MACL,KAAK,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,IACN;AAAA,EACE;AAAA,EAEA,MAAM,8BAA8B,SAAS,UAAU,SAAS,UAAU,CAAA,GAAI;AAC5E,WAAOC;AAAAA,MACL,KAAK;AAAA,MACL,KAAK,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACN;AAAA,EACE;AAAA,EAEA,MAAM,UAAU,SAAS,UAAU,MAAM,UAAU,CAAA,GAAI;AACrD,UAAM,iBAAiB,MAAM,KAAK,cAAc,OAAO;AAEvD,UAAM,UAAU,gBAAgB,aAAa,gBAAgB,YAAY,CAAA;AACzE,QAAI,CAAC,WAAW,QAAQ,WAAW,EAAG;AAEtC,UAAM,EAAE,eAAe,MAAM,kBAAkB,KAAI,IAAK;AACxD,UAAM,UAAU,CAAA;AAEhB,eAAW,iBAAiB,SAAS;AACnC,YAAM,SAAS,MAAM,KAAK;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,EAAE,cAAc,gBAAe;AAAA,MACvC;AACM,cAAQ,KAAK,EAAE,QAAQ,eAAe,GAAG,OAAM,CAAE;AAAA,IACnD;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,cAAc,SAAS;AAC3B,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,iCAAiC;AAAA,IACnD;AACA,UAAM,OAAO,MAAM,KAAK,WAAW,cAAc,OAAO;AACxD,QAAI,CAAC,KAAM,QAAO;AAElB,QAAI,CAAC,MAAM,QAAQ,KAAK,OAAO,EAAG,MAAK,UAAU,CAAA;AACjD,QAAI,CAAC,MAAM,QAAQ,KAAK,QAAQ,EAAG,MAAK,WAAW,CAAA;AACnD,QAAI,CAAC,KAAK,cAAc,OAAO,KAAK,eAAe,SAAU,MAAK,aAAa,CAAA;AAC/E,QAAI,CAAC,KAAK,gBAAgB,OAAO,KAAK,iBAAiB,SAAU,MAAK,eAAe,CAAA;AAErF,QAAI,CAAC,MAAM,QAAQ,KAAK,SAAS,GAAG;AAClC,YAAM,eAAe,oBAAI,IAAI,CAAC,GAAG,KAAK,SAAS,GAAG,KAAK,QAAQ,CAAC;AAChE,WAAK,YAAY,MAAM,KAAK,YAAY;AAAA,IAC1C;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,cAAc,aAAa,aAAa,UAAU,CAAA,GAAI;AAC1D,UAAM,EAAE,aAAa,EAAE,SAAS,CAAA,GAAI,UAAU,CAAA,KAAM,cAAc,KAAI,IAAK;AAE3E,QAAI,gBAAgB,aAAa;AAC/B,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACvD;AAEA,QAAI,iBAAiB,MAAM,KAAK,WAAW,cAAc,WAAW,KAAK;AAAA,MACvE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,WAAW,CAAA;AAAA,MACX,SAAS,CAAA;AAAA,MACT,UAAU,CAAA;AAAA,MACV,YAAY,CAAA;AAAA,MACZ,cAAc,CAAA;AAAA,MACd,WAAW,KAAK,IAAG;AAAA,IACzB;AAEI,QAAI,CAAC,MAAM,QAAQ,eAAe,SAAS,EAAG,gBAAe,YAAY,CAAA;AACzE,QAAI,CAAC,MAAM,QAAQ,eAAe,OAAO,EAAG,gBAAe,UAAU,CAAA;AACrE,QAAI,CAAC,MAAM,QAAQ,eAAe,QAAQ,EAAG,gBAAe,WAAW,CAAA;AACvE,QAAI,CAAC,eAAe,cAAc,OAAO,eAAe,eAAe,SAAU,gBAAe,aAAa,CAAA;AAC7G,QAAI,CAAC,eAAe,gBAAgB,OAAO,eAAe,iBAAiB,SAAU,gBAAe,eAAe,CAAA;AAEnH,QAAI,CAAC,eAAe,UAAU,SAAS,WAAW,GAAG;AACnD,qBAAe,UAAU,KAAK,WAAW;AAAA,IAC3C;AAGA,QAAI,aAAa;AACf,qBAAe,aAAa,WAAW,IAAI;AAAA,IAC7C;AAEA,QAAI,WAAW,YAAY,WAAW,SAAS,SAAS,GAAG;AACzD,UAAI,CAAC,eAAe,SAAS,SAAS,WAAW,GAAG;AAClD,uBAAe,SAAS,KAAK,WAAW;AAAA,MAC1C;AAAA,IACF,OAAO;AACL,qBAAe,WAAW,eAAe,SAAS,OAAO,CAAAtS,QAAMA,QAAO,WAAW;AAAA,IACnF;AAEA,QAAI,WAAW,WAAW,WAAW,QAAQ,SAAS,GAAG;AACvD,UAAI,CAAC,eAAe,QAAQ,SAAS,WAAW,GAAG;AACjD,uBAAe,QAAQ,KAAK,WAAW;AAAA,MACzC;AAAA,IACF,OAAO;AACL,qBAAe,UAAU,eAAe,QAAQ,OAAO,CAAAA,QAAMA,QAAO,WAAW;AAAA,IACjF;AAEA,mBAAe,WAAW,WAAW,IAAI;AAAA,MACvC,SAAS,WAAW,WAAW,CAAA;AAAA,MAC/B,UAAU,WAAW,YAAY,CAAA;AAAA,MACjC,WAAW,KAAK,IAAG;AAAA,IACzB;AAEI,UAAM,UAAU,MAAM,KAAK,YAAY,cAAc,cAAc;AACnE,SAAK,WAAW,YAAY;AAE5B,QAAI,SAAS;AACX,iBAAW,QAAS,WAAW,WAAW,CAAA,GAAK;AAC7C,cAAM,KAAK,SAAS,aAAa,aAAa,MAAM,EAAE,WAAW,YAAY,MAAM,aAAa;AAAA,MAClG;AACA,iBAAW,QAAS,WAAW,YAAY,CAAA,GAAK;AAC9C,cAAM,KAAK,SAAS,aAAa,aAAa,MAAM,EAAE,WAAW,YAAY,MAAM,aAAa;AAAA,MAClG;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,gBAAgB,aAAa,aAAa;AAC9C,UAAM,iBAAiB,MAAM,KAAK,WAAW,cAAc,WAAW;AACtE,QAAI,CAAC,eAAgB,QAAO;AAE5B,UAAM,aAAa,eAAe,aAAa,WAAW;AAE1D,mBAAe,aAAa,eAAe,aAAa,CAAA,GAAI,OAAO,CAAAA,QAAMA,QAAO,WAAW;AAC3F,mBAAe,WAAW,eAAe,WAAW,CAAA,GAAI,OAAO,CAAAA,QAAMA,QAAO,WAAW;AACvF,mBAAe,YAAY,eAAe,YAAY,CAAA,GAAI,OAAO,CAAAA,QAAMA,QAAO,WAAW;AAEzF,QAAI,eAAe,YAAY;AAC7B,aAAO,eAAe,WAAW,WAAW;AAAA,IAC9C;AAEA,UAAM,UAAU,MAAM,KAAK,YAAY,cAAc,cAAc;AACnE,SAAK,WAAW,YAAY;AAE5B,QAAI,WAAW,YAAY;AACzB,iBAAW,QAAS,WAAW,WAAW,CAAA,GAAK;AAC7C,cAAM,KAAK,WAAW,aAAa,aAAa,IAAI;AAAA,MACtD;AACA,iBAAW,QAAS,WAAW,YAAY,CAAA,GAAK;AAC9C,cAAM,KAAK,WAAW,aAAa,aAAa,IAAI;AAAA,MACtD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,mBAAmB,aAAa,aAAa;AACjD,UAAM,iBAAiB,MAAM,KAAK,WAAW,cAAc,WAAW;AACtE,QAAI,CAAC,kBAAkB,CAAC,eAAe,WAAY,QAAO;AAC1D,WAAO,eAAe,WAAW,WAAW,KAAK;AAAA,EACnD;AAAA;AAAA,EAGA,MAAM,OAAO,SAAS,UAAU,QAAQ,UAAU,CAAA,GAAI;AACpD,WAAOuS,OAAoB,MAAM,SAAS,UAAU,QAAQ,OAAO;AAAA,EACrE;AAAA;AAAA,EAGA,UAAU,SAAS,UAAU,UAAU,UAAU,CAAA,GAAI;AACnD,QAAI,OAAO,aAAa,YAAY;AAClC,YAAM,IAAI,UAAU,6BAA6B;AAAA,IACnD;AACA,UAAM,OAAOjD,UAAkB,KAAK,OAAO,SAAS,SAAS,QAAQ;AACrE,UAAM,sBAAsB,EAAE,cAAc,MAAM,GAAG,QAAO;AAC5D,UAAM,iBAAiB,GAAG,OAAO,IAAI,QAAQ,IAAI,KAAK,IAAG,CAAE,IAAI,KAAK,OAAM,EAAG,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AACtG,QAAI,oBAAoB;AACxB,QAAI,oBAAoB;AAExBkD,uBAAiC,KAAK,QAAQ,MAAM,UAAU,mBAAmB,EAC9E,KAAK,kBAAgB;AACpB,0BAAoB;AACpB,UAAI,mBAAmB;AACrB,qBAAa,YAAW;AAAA,MAC1B,OAAO;AACL,aAAK,qBAAqB,SAAS,gBAAgB,YAAY;AAAA,MACjE;AAAA,IACF,CAAC,EACA,MAAM,SAAO;AACZ,WAAK,KAAK,SAAS,6BAA6B,EAAE,MAAM,OAAO,IAAI,SAAS;AAAA,IAC9E,CAAC;AAEH,SAAK,SAAS,iBAAiB,KAAK,SAAS,iBAAiB,KAAK;AACnE,WAAO;AAAA,MACL,aAAa,MAAM;AACjB,4BAAoB;AACpB,YAAI,mBAAmB;AACrB,eAAK,qBAAqB,WAAW,cAAc;AAAA,QACrD;AAAA,MACF;AAAA,IACN;AAAA,EACE;AAAA,EAEA,MAAM,gBAAgB,OAAO,KAAK,UAAU,UAAU,CAAA,GAAI;AACxD,WAAOC;AAAAA,MACL,KAAK;AAAA,MACL,KAAK,OAAO;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACN;AAAA,EACE;AAAA;AAAA,EAGA,MAAM,aAAa,YAAY;AAC7B,WAAOC,eAAoB,UAAU;AAAA,EACvC;AAAA,EAEA,MAAM,KAAK,SAAS,YAAY;AAC9B,WAAOC,KAAY,SAAS,UAAU;AAAA,EACxC;AAAA,EAEA,MAAM,OAAO,SAAS,WAAW,WAAW;AAC1C,WAAOC,OAAc,SAAS,WAAW,SAAS;AAAA,EACpD;AAAA,EAEA,MAAM,gBAAgB,aAAa,OAAO,WAAW,SAAS;AAC5D,WAAOjD,gBAAuB,aAAa,OAAO,WAAW,OAAO;AAAA,EACtE;AAAA,EAEA,MAAM,iBAAiB,OAAO,oBAAoB,OAAO;AACvD,WAAOkD,iBAAwB,OAAO,oBAAoB,KAAK;AAAA,EACjE;AAAA;AAAA,EAGA,MAAM,aAAa,OAAO,SAAS,WAAW,UAAU;AAEtDC,uBAA0B,OAAO,MAAM,IAAI;AAE3C,UAAM,gBAAgB;AAAA,MACpB,GAAG;AAAA,MACH,MAAM,CAAC,GAAI,MAAM,QAAQ,CAAA,GAAK,CAAC,KAAK,OAAO,GAAG,CAAC,KAAK,QAAQ,CAAC;AAAA,IACnE;AACI,UAAM,cAAcC,UAAqB,eAAe,KAAK,OAAO,UAAU;AAG9E,UAAM,oBAAoB;AAAA,MACxB,GAAG;AAAA,MACH,UAAU;AAAA,IAChB;AAEI,UAAM,OAAOzD,UAAkB,KAAK,OAAO,SAAS,SAAS,UAAU,YAAY,EAAE;AACrF,UAAMI,MAAc,KAAK,QAAQ,MAAM,iBAAiB;AACxD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,mBAAmB,QAAQ,SAAS,WAAW,UAAU;AAE7DsD,8BAAiC,QAAQ,IAAI;AAE7C,UAAM,WAAWC,2BAAkC;AAAA,MACjD,GAAG;AAAA,MACH,OAAO,OAAO,SAAS,KAAK,OAAO;AAAA,IACzC,CAAK;AACD,WAAO,KAAK,MAAM,SAAS,UAAU,QAAQ;AAAA,EAC/C;AAAA,EAEA,MAAM,YAAY,SAAS,UAAU,IAAI;AACvC,UAAM,WAAW,QAAQ,QAAQ;AACjC,UAAM,OAAO,MAAM,KAAK,KAAK,SAAS,QAAQ;AAE9C,QAAI,CAAC,KAAM,QAAO,CAAA;AAClB,UAAM,QAAQ,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AAEhD,WAAO,MAAM,OAAO,UAAQ;AAE1B,UAAI,QAAQ,YAAY,QAAQ,aAAa,SAAS,KAAK,aAAa,QAAQ,SAAU,QAAO;AACjG,UAAI,QAAQ,QAAQ,KAAK,SAAS,QAAQ,KAAM,QAAO;AACvD,UAAI,QAAQ,SAAS,KAAK,aAAa,QAAQ,MAAO,QAAO;AAC7D,UAAI,QAAQ,SAAS,KAAK,aAAa,QAAQ,MAAO,QAAO;AAC7D,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,iBAAiB,OAAO;AAG5B,UAAM,EAAE,IAAAjT,KAAI,QAAQ,YAAY,MAAAnB,OAAM,MAAM,SAAS,IAAG,IAAK;AAC7D,UAAM,gBAAgB,EAAE,IAAAmB,KAAI,QAAQ,YAAY,MAAAnB,OAAM,MAAM,SAAS,IAAG;AACxE,WAAOqU,YAAuB,aAAa;AAAA,EAC7C;AAAA;AAAA,EAGA,UAAU;AACR,UAAM,QAAQ,KAAK,SAAS,SAAS;AACrC,UAAM,SAAS,KAAK,SAAS,UAAU;AACvC,UAAM,gBAAgB,KAAK,SAAS,iBAAiB;AACrD,UAAM,iBAAiB,KAAK,SAAS,kBAAkB;AAEvD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,SAAS,KAAK,SAAS,WAAW;AAAA,MAClC,aAAa,KAAK,SAAS,eAAe;AAAA,MAC1C,eAAe,KAAK,SAAS,iBAAiB;AAAA,MAC9C,aAAa,QAAQ,IAAI,gBAAgB,QAAQ;AAAA,MACjD,cAAc,SAAS,IAAI,iBAAiB,SAAS;AAAA,IAC3D;AAAA,EACE;AAAA;AAAA,EAGA,MAAM,IAAI,SAAS,UAAU,MAAM,UAAU,CAAA,GAAI;AAC/C,WAAO,KAAK,MAAM,SAAS,UAAU,MAAM,OAAO;AAAA,EACpD;AAAA,EAEA,MAAM,IAAI,SAAS,UAAU,SAAS,MAAM,UAAU,IAAI;AACxD,WAAO,KAAK,KAAK,SAAS,UAAU,QAAQ,OAAO;AAAA,EACrD;AAAA,EAEA,MAAM,OAAO,SAAS,UAAU,QAAQ,UAAU,CAAA,GAAI;AACpD,WAAO,KAAK,OAAO,SAAS,UAAU,QAAQ,OAAO;AAAA,EACvD;AAAA,EAEA,MAAM,UAAU,OAAO,MAAM;AAC3B,WAAO,KAAK,YAAY,OAAO,IAAI;AAAA,EACrC;AAAA,EAEA,MAAM,UAAU,OAAO,MAAM,MAAM;AACjC,WAAO,KAAK,WAAW,OAAO,GAAG;AAAA,EACnC;AAAA,EAEA,MAAM,aAAa,OAAO,KAAK;AAC7B,WAAO,KAAK,aAAa,OAAO,GAAG;AAAA,EACrC;AAAA,EAEA,MAAM,aAAa,UAAU,WAAW,SAAS,OAAO;AACtD,WAAO,KAAK,UAAU,UAAU,WAAW,MAAM;AAAA,EACnD;AAAA,EAEA,MAAM,YAAY,UAAU;AAC1B,WAAO,KAAK,UAAU,QAAQ;AAAA,EAChC;AAAA,EAEA,MAAM,aAAa,UAAU;AAC3B,WAAO,KAAK,YAAY,QAAQ;AAAA,EAClC;AAAA,EAEA,MAAM,MAAM,SAAS,UAAU,MAAM,UAAU,CAAA,GAAI;AACjD,WAAO,KAAK,MAAM,SAAS,UAAU,MAAM,OAAO;AAAA,EACpD;AAAA,EAEA,MAAM,MAAM,SAAS,UAAU,SAAS,MAAM,UAAU,IAAI;AAC1D,WAAO,KAAK,KAAK,SAAS,UAAU,QAAQ,OAAO;AAAA,EACrD;AAAA,EAEA,MAAM,KAAK,SAAS,UAAU,MAAM,UAAU,CAAA,GAAI;AAChD,WAAO,KAAK,MAAM,SAAS,UAAU,MAAM,OAAO;AAAA,EACpD;AAAA,EAEA,MAAM,KAAK,SAAS,UAAU,SAAS,MAAM,UAAU,IAAI;AACzD,WAAO,KAAK,KAAK,SAAS,UAAU,QAAQ,OAAO;AAAA,EACrD;AAAA;AAAA,EAGA,WAAW,UAAU,MAAM;AACzB,QAAI,SAAS;AACX,iBAAW,OAAO,KAAK,OAAO,KAAI,GAAI;AACpC,YAAI,IAAI,SAAS,OAAO,GAAG;AACzB,eAAK,OAAO,OAAO,GAAG;AAAA,QACxB;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK,OAAO,MAAK;AAAA,IACnB;AAAA,EACF;AACF;AAKY,MAACC,cAAa;AAAA,EACxB;AAAA,IACE,cAAc,cAAc;AAAA,EAChC;AACA;","x_google_ignoreList":[20,21,22,23,24,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168]}
|